diff --git a/.gitignore b/.gitignore
index cc65711b..8cd79ba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -118,7 +118,6 @@
 /chrome/installer/mini_installer.xml
 /chrome/installer/mini_installer/mini_installer.aps
 /chrome/installer/mini_installer/support
-/chrome/installer/mini_installer_syzygy.xml
 /chrome/installer/mini_installer_tests_run.xml
 /chrome/installer_util_strings.xml
 /chrome/interactive_ui_tests_run.xml
diff --git a/BUILD.gn b/BUILD.gn
index 1fdb3ab..fccc380 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -569,7 +569,6 @@
       "//chrome/install_static:install_static_unittests",
       "//chrome/installer/gcapi",
       "//chrome/installer/setup:setup_unittests",
-      "//chrome/tools/build/win/syzygy:chrome_dll_syzygy",
       "//chrome_elf:chrome_elf_import_unittests",
       "//chrome_elf:chrome_elf_unittests",
       "//chrome_elf:dll_hash_main",
@@ -805,24 +804,6 @@
       "//url:url_unittests",
     ]
   }
-
-  group("All_syzygy") {
-    if (is_syzyasan) {
-      deps = [
-        "//chrome/installer/mini_installer:mini_installer",
-        "//chrome/installer/mini_installer:mini_installer_syzygy",
-      ]
-    }
-  }
-
-  if (is_syzyasan) {
-    group("chrome_official_syzyasan_builder") {
-      deps = [
-        ":All_syzygy",
-        ":chrome_official_builder_no_unittests",
-      ]
-    }
-  }
 }
 
 if (is_chromeos) {
@@ -1109,12 +1090,6 @@
         "//v8:v8_shell($v8_snapshot_toolchain)",
       ]
     }
-    if (is_win && symbol_level == 2 && target_cpu == "x86" && is_syzyasan) {
-      deps += [
-        "//chrome/tools/build/win/syzygy:chrome_dll_syzygy",
-        "//content/shell:content_shell_syzyasan",
-      ]
-    }
   }
 }
 
diff --git a/DEPS b/DEPS
index aba50b0..ae76a3d3 100644
--- a/DEPS
+++ b/DEPS
@@ -79,11 +79,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': 'c3bc425bd4d630f4c6b69f38473fc69b77a1d5b9',
+  'skia_revision': '04bea3bf76e2cf30c438c876b1c2d6847bcf797f',
   # 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': 'f126268aefd03c8e3e5c038f252eaf97404c4180',
+  'v8_revision': '336856688087b5b9c722526c5d9c730b6da6b295',
   # 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.
@@ -91,7 +91,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '96310cdad3174fe81c05d53de3d1186cbc82e768',
+  'angle_revision': 'a43994c9dd3a46220acfea855cad240960b9e98c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -99,11 +99,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '5cd502b4ba6b04f5b2e50c19e94c75f472b620c6',
+  'swiftshader_revision': 'f8cdc74c4b4afca9f1f807d9fda6ea8d530b358e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '3b76ebd5605488e0489938bd9326cf51c8be56c1',
+  'pdfium_revision': '8f4f0ede809a9bae283538f5c6930c5d7ba13585',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -408,7 +408,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '85a5ac7c6177ca59c1c906e9787360525dd4ffd8',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'f3f1110ffae1c9c6ca6764a55821012712670fa2',
       'condition': 'checkout_linux',
   },
 
@@ -1293,6 +1293,8 @@
     ],
   },
   # Pull the Syzygy binaries, used for optimization and instrumentation.
+  # Remove this as soon as the zap_timestamp.exe utility is no longer used.
+  # See https://crbug.com/821764#c3.
   {
     'name': 'syzygy-binaries',
     'pattern': '.',
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java
index 5a772c523..51c78ed 100644
--- a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java
+++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java
@@ -16,13 +16,14 @@
  */
 public class BoundaryInterfaceReflectionUtil {
     /**
-     * Utility method for fetching a method from the current classloader, with the same signature
+     * Utility method for fetching a method from {@param delegateLoader}, with the same signature
      * (package + class + method name + parameters) as a given method defined in another
      * classloader.
      */
-    public static Method dupeMethod(Method method)
+    public static Method dupeMethod(Method method, ClassLoader delegateLoader)
             throws ClassNotFoundException, NoSuchMethodException {
-        Class<?> declaringClass = Class.forName(method.getDeclaringClass().getName());
+        Class<?> declaringClass =
+                Class.forName(method.getDeclaringClass().getName(), true, delegateLoader);
         Class[] otherSideParameterClasses = method.getParameterTypes();
         Class[] parameterClasses = new Class[otherSideParameterClasses.length];
         for (int n = 0; n < parameterClasses.length; n++) {
@@ -30,7 +31,9 @@
             // Primitive classes are shared between the classloaders - so we can use the same
             // primitive class declarations on either side. Non-primitive classes must be looked up
             // by name.
-            parameterClasses[n] = clazz.isPrimitive() ? clazz : Class.forName(clazz.getName());
+            parameterClasses[n] = clazz.isPrimitive()
+                    ? clazz
+                    : Class.forName(clazz.getName(), true, delegateLoader);
         }
         return declaringClass.getDeclaredMethod(method.getName(), parameterClasses);
     }
@@ -53,11 +56,12 @@
      */
     @TargetApi(Build.VERSION_CODES.KITKAT)
     public static InvocationHandler createInvocationHandlerFor(final Object delegate) {
+        final ClassLoader delegateLoader = delegate.getClass().getClassLoader();
         return new InvocationHandler() {
             @Override
             public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                 try {
-                    return dupeMethod(method).invoke(delegate, objects);
+                    return dupeMethod(method, delegateLoader).invoke(delegate, objects);
                 } catch (InvocationTargetException e) {
                     // If something went wrong, ensure we throw the original exception.
                     throw e.getTargetException();
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 4ae182b..d88aed2b 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1208,6 +1208,7 @@
     "//ui/chromeos/resources",
     "//ui/chromeos/strings",
     "//ui/compositor",
+    "//ui/compositor_extra",
     "//ui/display",
     "//ui/display/manager",
     "//ui/display/types",
diff --git a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
index 0e17da0..ad87c46 100644
--- a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
+++ b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
@@ -321,7 +321,7 @@
         ui::VKEY_G, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_RETURN}},
 
       {// |categories|
-       {ShortcutCategory::kAccessibility},
+       {ShortcutCategory::kPageAndBrowser, ShortcutCategory::kAccessibility},
        IDS_KSV_DESCRIPTION_IDC_FOCUS_BOOKMARKS,
        IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
        // |accelerator_ids|
@@ -410,11 +410,14 @@
        {{ui::VKEY_P, ui::EF_CONTROL_DOWN}}},
 
       {// |categories|
-       {ShortcutCategory::kPageAndBrowser},
+       {ShortcutCategory::kPopular, ShortcutCategory::kPageAndBrowser},
        IDS_KSV_DESCRIPTION_IDC_RELOAD,
-       IDS_KSV_SHORTCUT_ONE_MODIFIER_ONE_KEY,
+       IDS_KSV_SHORTCUT_IDC_RELOAD,
        // |accelerator_ids|
-       {{ui::VKEY_R, ui::EF_CONTROL_DOWN}}},
+       {},
+       // |shortcut_key_codes|
+       {ui::VKEY_BROWSER_REFRESH, ui::VKEY_CONTROL, ui::VKEY_UNKNOWN,
+        ui::VKEY_R}},
 
       {// |categories|
        {ShortcutCategory::kPageAndBrowser},
@@ -510,7 +513,7 @@
        {{ui::VKEY_OEM_PLUS, ui::EF_CONTROL_DOWN}}},
 
       {// |categories|
-       {ShortcutCategory::kTextEditing},
+       {ShortcutCategory::kSystemAndDisplay, ShortcutCategory::kTextEditing},
        IDS_KSV_DESCRIPTION_NEXT_IME,
        IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
        // |accelerator_ids|
@@ -524,7 +527,7 @@
        {{ui::VKEY_M, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}},
 
       {// |categories|
-       {ShortcutCategory::kTextEditing},
+       {ShortcutCategory::kSystemAndDisplay, ShortcutCategory::kTextEditing},
        IDS_KSV_DESCRIPTION_PREVIOUS_IME,
        IDS_KSV_SHORTCUT_ONE_MODIFIER_ONE_KEY,
        // |accelerator_ids|
@@ -656,15 +659,6 @@
        {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN}},
 
       {// |categories|
-       {ShortcutCategory::kPopular, ShortcutCategory::kPageAndBrowser},
-       IDS_KSV_DESCRIPTION_IDC_RELOAD,
-       IDS_KSV_SHORTCUT_ONE_KEY,
-       // |accelerator_ids|
-       {},
-       // |shortcut_key_codes|
-       {ui::VKEY_BROWSER_REFRESH}},
-
-      {// |categories|
        {ShortcutCategory::kPopular},
        IDS_KSV_DESCRIPTION_KEYBOARD_SHORTCUT_HELPER,
        IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
@@ -1128,6 +1122,156 @@
        IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
        // |accelerator_ids|
        {{ui::VKEY_M, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kSystemAndDisplay},
+       IDS_KSV_DESCRIPTION_TOGGLE_APP_LIST,
+       IDS_KSV_SHORTCUT_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_LWIN}}},
+
+      {// |categories|
+       {ShortcutCategory::kTabAndWindow},
+       IDS_KSV_DESCRIPTION_TAKE_WINDOW_SCREENSHOT,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kSystemAndDisplay},
+       IDS_KSV_DESCRIPTION_SUSPEND,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kSystemAndDisplay},
+       IDS_KSV_DESCRIPTION_OPEN_GET_HELP,
+       IDS_KSV_SHORTCUT_ONE_MODIFIER_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_OEM_2, ui::EF_CONTROL_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kSystemAndDisplay},
+       IDS_KSV_DESCRIPTION_OPEN_FEEDBACK_PAGE,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_I, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kTabAndWindow},
+       IDS_KSV_DESCRIPTION_ROTATE_WINDOW,
+       IDS_KSV_SHORTCUT_THREE_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_BROWSER_REFRESH,
+         ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kSystemAndDisplay},
+       IDS_KSV_DESCRIPTION_SHOW_STYLUS_TOOLS,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_P, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kTabAndWindow},
+       IDS_KSV_DESCRIPTION_TOGGLE_MAXIMIZED,
+       IDS_KSV_SHORTCUT_ONE_MODIFIER_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_OEM_PLUS, ui::EF_ALT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kTabAndWindow},
+       IDS_KSV_DESCRIPTION_WINDOW_POSITION_CENTER,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_OEM_PLUS, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kTabAndWindow},
+       IDS_KSV_DESCRIPTION_OPEN_CROSH,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_T, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kAccessibility},
+       IDS_KSV_DESCRIPTION_TOGGLE_DICTATION,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kSystemAndDisplay},
+       IDS_KSV_DESCRIPTION_EXIT,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_Q, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kTabAndWindow},
+       IDS_KSV_DESCRIPTION_UNPIN,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kSystemAndDisplay},
+       IDS_KSV_DESCRIPTION_SHOW_IME_MENU_BUBBLE,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_K, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kPageAndBrowser},
+       IDS_KSV_DESCRIPTION_SHOW_IDC_FOCUS_MENU_BAR,
+       IDS_KSV_SHORTCUT_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_F10}}},
+
+      {// |categories|
+       {ShortcutCategory::kPageAndBrowser},
+       IDS_KSV_DESCRIPTION_SHOW_IDC_HOME,
+       IDS_KSV_SHORTCUT_ONE_MODIFIER_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_HOME, ui::EF_ALT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kPageAndBrowser},
+       IDS_KSV_DESCRIPTION_SHOW_IDC_CLEAR_BROWSING_DATA,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_BACK, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kPageAndBrowser},
+       IDS_KSV_DESCRIPTION_SHOW_IDC_SHOW_BOOKMARK_MANAGER,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_O, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kPageAndBrowser},
+       IDS_KSV_DESCRIPTION_IDC_DEV_TOOLS_INSPECT,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_C, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kAccessibility},
+       IDS_KSV_DESCRIPTION_IDC_FOCUS_INACTIVE_POPUP_FOR_ACCESSIBILITY,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
+
+      {// |categories|
+       {ShortcutCategory::kPageAndBrowser},
+       IDS_KSV_DESCRIPTION_IDC_SHOW_APP_MENU,
+       IDS_KSV_SHORTCUT_IDC_SHOW_APP_MENU,
+       // |accelerator_ids|
+       {},
+       // |shortcut_key_codes|
+       {ui::VKEY_LMENU, ui::VKEY_UNKNOWN, ui::VKEY_E, ui::VKEY_F}},
   });
 
   static bool is_initialized = false;
diff --git a/ash/components/shortcut_viewer_strings.grdp b/ash/components/shortcut_viewer_strings.grdp
index 15cd51d..58ec4f8 100644
--- a/ash/components/shortcut_viewer_strings.grdp
+++ b/ash/components/shortcut_viewer_strings.grdp
@@ -91,13 +91,16 @@
   <message name="IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY" desc="Human readable version of the keyboard shortcut. This is for all two modifiers shortcuts.">
     <ph name="modifier1">$1<ex>Ctrl</ex></ph><ph name="separator1">$2<ex>+</ex></ph><ph name="modifier2">$3<ex>Alt</ex></ph><ph name="separator2">$4<ex>+</ex></ph><ph name="key">$5<ex>v</ex></ph>
   </message>
+  <message name="IDS_KSV_SHORTCUT_THREE_MODIFIERS_ONE_KEY" desc="Human readable version of the keyboard shortcut. This is for all two modifiers shortcuts.">
+    <ph name="modifier1">$1<ex>Ctrl</ex></ph><ph name="separator1">$2<ex>+</ex></ph><ph name="modifier2">$3<ex>Alt</ex></ph><ph name="separator2">$4<ex>+</ex></ph><ph name="modifier3">$5<ex>Shift</ex></ph><ph name="separator3">$6<ex>+</ex></ph><ph name="key">$7<ex>v</ex></ph>
+  </message>
 
   <!-- Shortcuts descriptions -->
   <message name="IDS_KSV_DESCRIPTION_LOCK_SCREEN" desc="Description of the command in keyboard shortcut viewer.">
     Lock screen
   </message>
   <message name="IDS_KSV_DESCRIPTION_CHANGE_SCREEN_RESOLUTION" desc="Description of the command in keyboard shortcut viewer.">
-    Change screen resolution
+    Make items on your screen larger or smaller
   </message>
   <message name="IDS_KSV_SHORTCUT_CHANGE_SCREEN_RESOLUTION" desc="Human readable version of the keyboard shortcut.">
     <ph name="ctrl">$1<ex>Ctrl</ex></ph><ph name="separator1">$2<ex>+</ex></ph><ph name="shift">$3<ex>Shift</ex></ph><ph name="separator2">$4<ex>+</ex></ph><ph name="plus">$5<ex>v</ex></ph> or <ph name="minus">$6<ex>v</ex></ph>
@@ -115,7 +118,7 @@
     <ph name="shift">$1<ex>Shift</ex></ph><ph name="separator1">$2<ex>+</ex></ph><ph name="alt">$3<ex>Alt</ex></ph><ph name="separator2">$4<ex>+</ex></ph><ph name="l">$5<ex>v</ex></ph>, then <ph name="tab">$6<ex>v</ex></ph> or <ph name="right">$7<ex>v</ex></ph>
   </message>
   <message name="IDS_KSV_DESCRIPTION_PREVIOUS_IME" desc="Description of the command in keyboard shortcut viewer.">
-    Switch to the previous keyboard language you were using.
+    Switch to the previous language input method
   </message>
   <message name="IDS_KSV_DESCRIPTION_CYCLE_FORWARD_MRU" desc="Description of the command in keyboard shortcut viewer.">
     Switch quickly between windows
@@ -163,7 +166,7 @@
     Turn Caps Lock on and off
   </message>
   <message name="IDS_KSV_DESCRIPTION_NEXT_IME" desc="Description of the command in keyboard shortcut viewer.">
-    Switch between the keyboard languages you've set. Learn how to choose your keyboard language.
+    Switch to the next language input method
   </message>
   <message name="IDS_KSV_DESCRIPTION_NEW_WINDOW" desc="Description of the command in keyboard shortcut viewer.">
     Open new window
@@ -237,6 +240,9 @@
   <message name="IDS_KSV_DESCRIPTION_IDC_RELOAD" desc="Description of the command in keyboard shortcut viewer.">
     Reload your current page
   </message>
+  <message name="IDS_KSV_SHORTCUT_IDC_RELOAD" desc="Description of the command in keyboard shortcut viewer.">
+    <ph name="refresh">$1<ex>Refresh</ex></ph> or <ph name="ctrl">$2<ex>Ctrl</ex></ph><ph name="separator">$3<ex>+</ex></ph><ph name="r">$4<ex>r</ex></ph>
+  </message>
   <message name="IDS_KSV_DESCRIPTION_IDC_RELOAD_BYPASSING_CACHE" desc="Description of the command in keyboard shortcut viewer.">
     Reload your current page without using cached content
   </message>
@@ -277,10 +283,10 @@
     Show or hide the Developer Tools panel
   </message>
   <message name="IDS_KSV_DESCRIPTION_IDC_DEV_TOOLS_CONSOLE" desc="Description of the command in keyboard shortcut viewer.">
-    Show or hide the DOM Inspector
+    Show or hide the Developer Tools console
   </message>
   <message name="IDS_KSV_DESCRIPTION_IDC_FOCUS_BOOKMARKS" desc="Description of the command in keyboard shortcut viewer.">
-    Highlight the bookmarks bar (if shown)
+    Focus on or Highlight the bookmarks bar (if shown)
   </message>
   <message name="IDS_KSV_DESCRIPTION_IDC_FOCUS_SEARCH" desc="Description of the command in keyboard shortcut viewer.">
     Place focus in search address bar
@@ -531,5 +537,70 @@
   <message name="IDS_KSV_DESCRIPTION_MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS" desc="Description of the command in keyboard shortcut viewer.">
     Move active window between displays
   </message>
-
+  <message name="IDS_KSV_DESCRIPTION_TOGGLE_APP_LIST" desc="Description of the command in keyboard shortcut viewer.">
+    Open/close the launcher
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_TAKE_WINDOW_SCREENSHOT" desc="Description of the command in keyboard shortcut viewer.">
+    Take window screenshot
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_SUSPEND" desc="Description of the command in keyboard shortcut viewer.">
+    Put device in sleep mode (suspend)
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_OPEN_GET_HELP" desc="Description of the command in keyboard shortcut viewer.">
+    Open Help Center
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_OPEN_FEEDBACK_PAGE" desc="Description of the command in keyboard shortcut viewer.">
+    Submit feedback
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_ROTATE_WINDOW" desc="Description of the command in keyboard shortcut viewer.">
+    Rotate window
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_SHOW_STYLUS_TOOLS" desc="Description of the command in keyboard shortcut viewer.">
+    Show stylus tools
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_TOGGLE_MAXIMIZED" desc="Description of the command in keyboard shortcut viewer.">
+    Maximize window
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_WINDOW_POSITION_CENTER" desc="Description of the command in keyboard shortcut viewer.">
+    Move window to center
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_OPEN_CROSH" desc="Description of the command in keyboard shortcut viewer.">
+    Open Crosh window
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_TOGGLE_DICTATION" desc="Description of the command in keyboard shortcut viewer.">
+    Starts or stops dictation (type what you speak)
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_EXIT" desc="Description of the command in keyboard shortcut viewer.">
+    Sign out
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_UNPIN" desc="Description of the command in keyboard shortcut viewer.">
+    Unpin an app
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_SHOW_IME_MENU_BUBBLE" desc="Description of the command in keyboard shortcut viewer.">
+    Show the menu displaying a list of available IMEs
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_SHOW_IDC_FOCUS_MENU_BAR" desc="Description of the command in keyboard shortcut viewer.">
+    Place focus on menu bar
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_SHOW_IDC_HOME" desc="Description of the command in keyboard shortcut viewer.">
+    Open home page
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_SHOW_IDC_CLEAR_BROWSING_DATA" desc="Description of the command in keyboard shortcut viewer.">
+    Clear browsing data
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_SHOW_IDC_SHOW_BOOKMARK_MANAGER" desc="Description of the command in keyboard shortcut viewer.">
+    Show bookmark manager
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_IDC_DEV_TOOLS_INSPECT" desc="Description of the command in keyboard shortcut viewer.">
+    Show or hide the Developer Tools inspector
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_IDC_FOCUS_INACTIVE_POPUP_FOR_ACCESSIBILITY" desc="Description of the command in keyboard shortcut viewer.">
+    Focus inactive popup for accessibility
+  </message>
+  <message name="IDS_KSV_DESCRIPTION_IDC_SHOW_APP_MENU" desc="Description of the command in keyboard shortcut viewer.">
+    Show app menu
+  </message>
+  <message name="IDS_KSV_SHORTCUT_IDC_SHOW_APP_MENU" desc="Description of the command in keyboard shortcut viewer.">
+    <ph name="alt">$1<ex>Alt</ex></ph><ph name="separator">$2<ex>+</ex></ph><ph name="e">$3<ex>e</ex></ph> or <ph name="f">$4<ex>f</ex></ph>
+  </message>
 </grit-part>
diff --git a/ash/shell.cc b/ash/shell.cc
index c9a3e6b..67124fd 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -146,7 +146,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/sys_info.h"
 #include "base/trace_event/trace_event.h"
-#include "chromeos/chromeos_switches.h"
 #include "chromeos/system/devicemode.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
diff --git a/ash/shell.h b/ash/shell.h
index c0800a4..05ce83a0 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -19,6 +19,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "chromeos/chromeos_switches.h"
 #include "ui/app_list/app_list_constants.h"
 #include "ui/aura/window.h"
 #include "ui/display/screen.h"
@@ -317,9 +318,7 @@
     return app_list_controller_.get();
   }
   AshAssistantController* ash_assistant_controller() {
-    // TODO(dmblack): Add DCHECK(chromeos::switches::IsAssistantEnabled());
-    // Note that this requires removing an unused header in
-    // chrome/test/base/ui_test_utils.cc to avoid breaking the build.
+    DCHECK(chromeos::switches::IsAssistantEnabled());
     return ash_assistant_controller_.get();
   }
   AshDisplayController* ash_display_controller() {
diff --git a/ash/wm/lock_state_controller.cc b/ash/wm/lock_state_controller.cc
index 9a06fb59..b41f006e 100644
--- a/ash/wm/lock_state_controller.cc
+++ b/ash/wm/lock_state_controller.cc
@@ -52,8 +52,7 @@
 // For MSan the slowdown depends heavily on the value of msan_track_origins GYP
 // flag. The multiplier below corresponds to msan_track_origins=1.
 constexpr int kTimeoutMultiplier = 6;
-#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
-    defined(SYZYASAN)
+#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
 constexpr int kTimeoutMultiplier = 2;
 #else
 constexpr int kTimeoutMultiplier = 1;
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc
index 6e28039f..520ad2dd7 100644
--- a/ash/wm/overview/window_grid.cc
+++ b/ash/wm/overview/window_grid.cc
@@ -37,6 +37,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
+#include "ui/compositor_extra/shadow.h"
 #include "ui/gfx/animation/tween.h"
 #include "ui/gfx/color_analysis.h"
 #include "ui/gfx/color_utils.h"
@@ -46,7 +47,7 @@
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/coordinate_conversion.h"
-#include "ui/wm/core/shadow.h"
+#include "ui/wm/core/window_animations.h"
 
 namespace ash {
 namespace {
@@ -840,7 +841,7 @@
   widget_window->SetBounds(target_bounds - fade_out_direction);
   widget_window->SetName("OverviewModeSelector");
 
-  selector_shadow_ = std::make_unique<::wm::Shadow>();
+  selector_shadow_ = std::make_unique<ui::Shadow>();
   selector_shadow_->Init(kWindowSelectionShadowElevation);
   selector_shadow_->layer()->SetVisible(true);
   selection_widget_->GetLayer()->SetMasksToBounds(false);
diff --git a/ash/wm/overview/window_grid.h b/ash/wm/overview/window_grid.h
index 023cbd0f..4fa9309 100644
--- a/ash/wm/overview/window_grid.h
+++ b/ash/wm/overview/window_grid.h
@@ -19,12 +19,12 @@
 #include "ui/aura/window_observer.h"
 #include "ui/gfx/geometry/rect.h"
 
-namespace views {
-class Widget;
+namespace ui {
+class Shadow;
 }
 
-namespace wm {
-class Shadow;
+namespace views {
+class Widget;
 }
 
 namespace ash {
@@ -257,7 +257,7 @@
   std::unique_ptr<views::Widget> selection_widget_;
 
   // Shadow around the selector.
-  std::unique_ptr<::wm::Shadow> selector_shadow_;
+  std::unique_ptr<ui::Shadow> selector_shadow_;
 
   // Current selected window position.
   size_t selected_index_;
diff --git a/ash/wm/overview/window_selector_item.cc b/ash/wm/overview/window_selector_item.cc
index 5c755977..b69198f 100644
--- a/ash/wm/overview/window_selector_item.cc
+++ b/ash/wm/overview/window_selector_item.cc
@@ -37,6 +37,7 @@
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
+#include "ui/compositor_extra/shadow.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_utils.h"
@@ -53,7 +54,6 @@
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/window/non_client_view.h"
 #include "ui/wm/core/coordinate_conversion.h"
-#include "ui/wm/core/shadow.h"
 #include "ui/wm/core/shadow_types.h"
 
 namespace ash {
@@ -256,7 +256,7 @@
           listener()->HandleReleaseEvent(location);
           break;
         case ui::ET_GESTURE_TAP:
-          listener()->ActivateDraggedWindow(location);
+          listener()->ActivateDraggedWindow();
           break;
         case ui::ET_GESTURE_END:
           listener()->ResetDraggedWindowGesture();
@@ -963,54 +963,27 @@
 
 void WindowSelectorItem::HandlePressEvent(
     const gfx::Point& location_in_screen) {
-  // Check the y position instead of using GetBoundsInScreen().Contains() so
-  // that it includes the image, close button and invisible margins.
-  tap_down_event_on_title_ = base::nullopt;
-  if (IsNewOverviewUi() &&
-      location_in_screen.y() < background_view_->GetBoundsInScreen().bottom()) {
-    tap_down_event_on_title_ = base::make_optional(location_in_screen);
-    return;
-  }
-
   StartDrag();
   window_selector_->InitiateDrag(this, location_in_screen);
 }
 
 void WindowSelectorItem::HandleReleaseEvent(
     const gfx::Point& location_in_screen) {
-  if (tap_down_event_on_title_) {
-    SelectWindowIfBelowDistanceThreshold(location_in_screen);
-    return;
-  }
-
   EndDrag();
   window_selector_->CompleteDrag(this, location_in_screen);
 }
 
 void WindowSelectorItem::HandleDragEvent(const gfx::Point& location_in_screen) {
-  if (tap_down_event_on_title_)
-    return;
-
   window_selector_->Drag(this, location_in_screen);
 }
 
-void WindowSelectorItem::ActivateDraggedWindow(
-    const gfx::Point& location_in_screen) {
-  if (tap_down_event_on_title_) {
-    SelectWindowIfBelowDistanceThreshold(location_in_screen);
-    return;
-  }
-
+void WindowSelectorItem::ActivateDraggedWindow() {
   DCHECK_EQ(this, window_selector_->window_drag_controller()->item());
   window_selector_->ActivateDraggedWindow();
 }
 
 void WindowSelectorItem::ResetDraggedWindowGesture() {
   OnSelectorItemDragEnded();
-
-  if (tap_down_event_on_title_)
-    return;
-
   DCHECK_EQ(this, window_selector_->window_drag_controller()->item());
   window_selector_->ResetDraggedWindowGesture();
 }
@@ -1192,7 +1165,7 @@
     label_view_->SetFontList(gfx::FontList().Derive(
         kLabelFontDelta, gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM));
 
-    shadow_ = std::make_unique<::wm::Shadow>();
+    shadow_ = std::make_unique<ui::Shadow>();
     shadow_->Init(kShadowElevation);
     item_widget_->GetLayer()->Add(shadow_->layer());
   }
@@ -1329,16 +1302,6 @@
   widget_ptr->SetOpacity(0.f);
 }
 
-void WindowSelectorItem::SelectWindowIfBelowDistanceThreshold(
-    const gfx::Point& event_location) {
-  DCHECK(tap_down_event_on_title_.has_value());
-
-  const gfx::Vector2d distance =
-      event_location - tap_down_event_on_title_.value();
-  if (distance.Length() < OverviewWindowDragController::kMinimumDragOffset)
-    window_selector_->SelectWindow(this);
-}
-
 gfx::SlideAnimation* WindowSelectorItem::GetBackgroundViewAnimation() {
   return background_view_ ? background_view_->animation() : nullptr;
 }
diff --git a/ash/wm/overview/window_selector_item.h b/ash/wm/overview/window_selector_item.h
index ffdf9bf..9ce65d7 100644
--- a/ash/wm/overview/window_selector_item.h
+++ b/ash/wm/overview/window_selector_item.h
@@ -22,12 +22,12 @@
 class SlideAnimation;
 }
 
-namespace views {
-class ImageButton;
+namespace ui {
+class Shadow;
 }
 
-namespace wm {
-class Shadow;
+namespace views {
+class ImageButton;
 }
 
 namespace ash {
@@ -182,7 +182,7 @@
   void HandlePressEvent(const gfx::Point& location_in_screen);
   void HandleReleaseEvent(const gfx::Point& location_in_screen);
   void HandleDragEvent(const gfx::Point& location_in_screen);
-  void ActivateDraggedWindow(const gfx::Point& location_in_screen);
+  void ActivateDraggedWindow();
   void ResetDraggedWindowGesture();
 
   // Sets the bounds of the window shadow. If |bounds_in_screen| is nullopt,
@@ -308,11 +308,6 @@
   // when the item is selected.
   bool selected_;
 
-  // Has a value if last seen tap down event was on the title bar. Behavior of
-  // subsequent drags/tap up differ if the original event was on the overview
-  // title.
-  base::Optional<gfx::Point> tap_down_event_on_title_;
-
   // A widget that covers the |transform_window_|. The widget has
   // |caption_container_view_| as its contents view. The widget is backed by a
   // NOT_DRAWN layer since most of its surface is transparent.
@@ -371,9 +366,7 @@
   // The shadow around the overview window. Shadows the original window, not
   // |item_widget_|. Done here instead of on the original window because of the
   // rounded edges mask applied on entering overview window.
-  std::unique_ptr<::wm::Shadow> shadow_;
-
-  bool event_on_title_ = false;
+  std::unique_ptr<ui::Shadow> shadow_;
 
   DISALLOW_COPY_AND_ASSIGN(WindowSelectorItem);
 };
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index 055dfd7..f2f3aebd 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -4068,47 +4068,6 @@
   EXPECT_FALSE(wm::IsActiveWindow(window1.get()));
 }
 
-// Verify that events that originate on the overview title bar will not allow
-// the item to be dragged or enter splitview, but will still be able to select a
-// window.
-TEST_F(SplitViewWindowSelectorTest, EventsOnOverviewTitleBar) {
-  const gfx::Rect bounds(400, 400);
-  std::unique_ptr<aura::Window> window1(CreateWindow(bounds));
-
-  ToggleOverview();
-
-  const int grid_index = 0;
-  WindowSelectorItem* selector_item1 =
-      GetWindowItemForWindow(grid_index, window1.get());
-  const gfx::Rect original_bounds = selector_item1->target_bounds();
-
-  // Click on the title of the selector item.
-  const gfx::Point point_on_title =
-      GetLabelView(selector_item1)->GetBoundsInScreen().CenterPoint();
-  GetEventGenerator().MoveMouseTo(point_on_title);
-  GetEventGenerator().PressLeftButton();
-
-  // Verify that dragging the mouse does change the selector item bounds.
-  GetEventGenerator().MoveMouseTo(0, 0);
-  EXPECT_EQ(original_bounds, selector_item1->target_bounds());
-
-  // We dragged into the left snap region. Verify that after releasing the
-  // mouse, we do not enter split view mode, which would be the case if we did
-  // not click on the title.
-  GetEventGenerator().ReleaseLeftButton();
-  EXPECT_FALSE(split_view_controller()->IsSplitViewModeActive());
-
-  // Verify that clicking on the title still exits overview and activates the
-  // associated window of the clicked selector item.
-  ASSERT_TRUE(window_selector());
-  GetEventGenerator().MoveMouseTo(point_on_title);
-  GetEventGenerator().PressLeftButton();
-  GetEventGenerator().ReleaseLeftButton();
-
-  EXPECT_FALSE(window_selector());
-  EXPECT_TRUE(wm::IsActiveWindow(window1.get()));
-}
-
 // Test that when splitview mode is active, minimizing one of the snapped window
 // will insert the minimized window back to overview mode if overview mode is
 // active at the moment.
diff --git a/ash/wm/workspace/phantom_window_controller.cc b/ash/wm/workspace/phantom_window_controller.cc
index 2d2df259..2ccf65a 100644
--- a/ash/wm/workspace/phantom_window_controller.cc
+++ b/ash/wm/workspace/phantom_window_controller.cc
@@ -31,7 +31,7 @@
 // The elevation of the shadow for the phantom window should match that of an
 // active window.
 // The shadow ninebox requires a minimum size to work well. See
-// ui/wm/core/shadow.cc
+// ui/compositor_extra/shadow.cc
 constexpr int kMinWidthWithShadow = 2 * ::wm::kShadowElevationActiveWindow;
 constexpr int kMinHeightWithShadow = 4 * ::wm::kShadowElevationActiveWindow;
 
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 33c99aed..f2cf35f 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1274,6 +1274,13 @@
     # Needs to be a public config so that dependent targets link against it as
     # well when doing a component build.
     public_configs = [ ":android_system_libs" ]
+
+    if (can_unwind_with_cfi_table) {
+      sources += [
+        "trace_event/cfi_backtrace_android.cc",
+        "trace_event/cfi_backtrace_android.h",
+      ]
+    }
   }
 
   # Chromeos.
@@ -2462,6 +2469,20 @@
   }
 
   if (is_android) {
+    # Add unwind tables in base_unittests_apk test apk. The unwind tables are
+    # generated from debug info in the binary. Removing "default_symbols" and
+    # adding symbols config removes the "strip_debug" config that strips the
+    # debug info, on base unittests apk.
+    if (can_unwind_with_cfi_table) {
+      configs -= [ "//build/config/compiler:default_symbols" ]
+      if (symbol_level == 2) {
+        configs += [ "//build/config/compiler:symbols" ]
+      } else {
+        configs += [ "//build/config/compiler:minimal_symbols" ]
+      }
+      add_unwind_tables_in_apk = true
+      sources += [ "trace_event/cfi_backtrace_android_unittest.cc" ]
+    }
     sources -= [
       "process/process_unittest.cc",
       "process/process_util_unittest.cc",
diff --git a/base/allocator/README.md b/base/allocator/README.md
index d69c09c..62b9be6 100644
--- a/base/allocator/README.md
+++ b/base/allocator/README.md
@@ -19,30 +19,30 @@
 
 The default choices are as follows:
 
-**Windows**  
+**Windows**
 `use_allocator: winheap`, the default Windows heap.
 Additionally, `static_library` (i.e. non-component) builds have a shim
-layer wrapping malloc/new, which is controlled by `use_allocator_shim`.  
+layer wrapping malloc/new, which is controlled by `use_allocator_shim`.
 The shim layer provides extra security features, such as preventing large
 allocations that can hit signed vs. unsigned bugs in third_party code.
 
-**Linux Desktop / CrOS**  
+**Linux Desktop / CrOS**
 `use_allocator: tcmalloc`, a forked copy of tcmalloc which resides in
 `third_party/tcmalloc/chromium`. Setting `use_allocator: none` causes the build
 to fall back to the system (Glibc) symbols.
 
-**Android**  
+**Android**
 `use_allocator: none`, always use the allocator symbols coming from Android's
 libc (Bionic). As it is developed as part of the OS, it is considered to be
-optimized for small devices and more memory-efficient than other choices.  
+optimized for small devices and more memory-efficient than other choices.
 The actual implementation backing malloc symbols in Bionic is up to the board
 config and can vary (typically *dlmalloc* or *jemalloc* on most Nexus devices).
 
-**Mac/iOS**  
+**Mac/iOS**
 `use_allocator: none`, we always use the system's allocator implementation.
 
-In addition, when building for `asan` / `msan` / `syzyasan`, both the allocator
-and the shim layer are disabled.
+In addition, when building for `asan` / `msan` both the allocator and the shim
+layer are disabled.
 
 Layering and build deps
 -----------------------
@@ -59,7 +59,7 @@
 abstractions in `base` (see `/base/allocator/allocator_extension.h` and
 `/base/memory/`)
 
-**Why `base` depends on `allocator`?**  
+**Why `base` depends on `allocator`?**
 Because it needs to provide services that depend on the actual allocator
 implementation. In the past `base` used to pretend to be allocator-agnostic
 and get the dependencies injected by other layers. This ended up being an
@@ -90,7 +90,7 @@
 On most platforms, Chrome overrides the malloc / operator new symbols (and
 corresponding free / delete and other variants). This is to enforce security
 checks and lately to enable the
-[memory-infra heap profiler][url-memory-infra-heap-profiler].  
+[memory-infra heap profiler][url-memory-infra-heap-profiler].
 Historically each platform had its special logic for defining the allocator
 symbols in different places of the codebase. The unified allocator shim is
 a project aimed to unify the symbol definition and allocator routing logic in
@@ -102,7 +102,7 @@
  - Tracking bug: [https://crbug.com/550886][crbug.com/550886].
  - Build-time flag: `use_allocator_shim`.
 
-**Overview of the unified allocator shim**  
+**Overview of the unified allocator shim**
 The allocator shim consists of three stages:
 ```
 +-------------------------+    +-----------------------+    +----------------+
@@ -118,7 +118,7 @@
 +-------------------------+
 ```
 
-**1. malloc symbols definition**  
+**1. malloc symbols definition**
 This stage takes care of overriding the symbols `malloc`, `free`,
 `operator new`, `operator delete` and friends and routing those calls inside the
 allocator shim (next point).
@@ -158,7 +158,7 @@
 These symbols will be resolved against libc.so as usual.
 More details in [crrev.com/1719433002](https://crrev.com/1719433002).
 
-**2. Shim layer implementation**  
+**2. Shim layer implementation**
 This stage contains the actual shim implementation. This consists of:
 - A singly linked list of dispatchers (structs with function pointers to `malloc`-like functions). Dispatchers can be dynamically inserted at runtime
 (using the `InsertAllocatorDispatch` API). They can intercept and override
@@ -166,7 +166,7 @@
 - The security checks (suicide on malloc-failure via `std::new_handler`, etc).
 This happens inside `allocator_shim.cc`
 
-**3. Final allocator routing**  
+**3. Final allocator routing**
 The final element of the aforementioned dispatcher chain is statically defined
 at build time and ultimately routes the allocator calls to the actual allocator
 (as described in the *Background* section above). This is taken care of by the
@@ -175,7 +175,7 @@
 
 Appendixes
 ----------
-**How does the Windows shim layer replace the malloc symbols?**  
+**How does the Windows shim layer replace the malloc symbols?**
 The mechanism for hooking LIBCMT in Windows is rather tricky.  The core
 problem is that by default, the Windows library does not declare malloc and
 free as weak symbols.  Because of this, they cannot be overridden.  To work
diff --git a/base/debug/activity_tracker.cc b/base/debug/activity_tracker.cc
index 20c56480..99735f6d 100644
--- a/base/debug/activity_tracker.cc
+++ b/base/debug/activity_tracker.cc
@@ -25,6 +25,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/platform_thread.h"
+#include "build/build_config.h"
 
 namespace base {
 namespace debug {
@@ -260,8 +261,9 @@
   activity->activity_type = type;
   activity->data = data;
 
-#if defined(SYZYASAN)
-  // Create a stacktrace from the current location and get the addresses.
+#if (!defined(OS_NACL) && DCHECK_IS_ON()) || defined(ADDRESS_SANITIZER)
+  // Create a stacktrace from the current location and get the addresses for
+  // improved debuggability.
   StackTrace stack_trace;
   size_t stack_depth;
   const void* const* stack_addrs = stack_trace.Addresses(&stack_depth);
diff --git a/base/debug/asan_invalid_access.cc b/base/debug/asan_invalid_access.cc
index ba222ae..07c19db9 100644
--- a/base/debug/asan_invalid_access.cc
+++ b/base/debug/asan_invalid_access.cc
@@ -21,13 +21,7 @@
 
 namespace {
 
-#if defined(SYZYASAN) && defined(COMPILER_MSVC)
-// Disable warning C4530: "C++ exception handler used, but unwind semantics are
-// not enabled". We don't want to change the compilation flags just for this
-// test, and no exception should be triggered here, so this warning has no value
-// here.
-#pragma warning(push)
-#pragma warning(disable: 4530)
+#if defined(OS_WIN) && defined(ADDRESS_SANITIZER)
 // Corrupt a memory block and make sure that the corruption gets detected either
 // when we free it or when another crash happens (if |induce_crash| is set to
 // true).
@@ -35,27 +29,28 @@
   // NOTE(sebmarchand): We intentionally corrupt a memory block here in order to
   //     trigger an Address Sanitizer (ASAN) error report.
   static const int kArraySize = 5;
-  int* array = new int[kArraySize];
-  // Encapsulate the invalid memory access into a try-catch statement to prevent
-  // this function from being instrumented. This way the underflow won't be
-  // detected but the corruption will (as the allocator will still be hooked).
-  try {
-    // Declares the dummy value as volatile to make sure it doesn't get
-    // optimized away.
-    int volatile dummy = array[-1]--;
-    base::debug::Alias(const_cast<int*>(&dummy));
-  } catch (...) {
-  }
+  LONG* array = new LONG[kArraySize];
+
+  // Explicitly call out to a kernel32 function to perform the memory access.
+  // This way the underflow won't be detected but the corruption will (as the
+  // allocator will still be hooked).
+  auto InterlockedIncrementFn =
+      reinterpret_cast<LONG (*)(LONG volatile * addend)>(
+          GetProcAddress(GetModuleHandle(L"kernel32"), "InterlockedIncrement"));
+  CHECK(InterlockedIncrementFn);
+
+  LONG volatile dummy = InterlockedIncrementFn(array - 1);
+  base::debug::Alias(const_cast<LONG*>(&dummy));
+
   if (induce_crash)
     CHECK(false);
   delete[] array;
 }
-#pragma warning(pop)
-#endif  // SYZYASAN && COMPILER_MSVC
+#endif  // OS_WIN && ADDRESS_SANITIZER
 
 }  // namespace
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 // NOTE(sebmarchand): We intentionally perform some invalid heap access here in
 //     order to trigger an AddressSanitizer (ASan) error report.
 
@@ -91,9 +86,7 @@
   base::debug::Alias(&dummy);
 }
 
-#endif  // ADDRESS_SANITIZER || SYZYASAN
-
-#if defined(SYZYASAN) && defined(COMPILER_MSVC)
+#if defined(OS_WIN)
 void AsanCorruptHeapBlock() {
   CorruptMemoryBlock(false);
 }
@@ -101,7 +94,8 @@
 void AsanCorruptHeap() {
   CorruptMemoryBlock(true);
 }
-#endif  // SYZYASAN && COMPILER_MSVC
+#endif  // OS_WIN
+#endif  // ADDRESS_SANITIZER
 
 }  // namespace debug
 }  // namespace base
diff --git a/base/debug/asan_invalid_access.h b/base/debug/asan_invalid_access.h
index bc9390e..dc9a7ee64 100644
--- a/base/debug/asan_invalid_access.h
+++ b/base/debug/asan_invalid_access.h
@@ -10,11 +10,12 @@
 
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
+#include "build/build_config.h"
 
 namespace base {
 namespace debug {
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 
 // Generates an heap buffer overflow.
 BASE_EXPORT NOINLINE void AsanHeapOverflow();
@@ -25,12 +26,9 @@
 // Generates an use after free.
 BASE_EXPORT NOINLINE void AsanHeapUseAfterFree();
 
-#endif  // ADDRESS_SANITIZER || SYZYASAN
-
 // The "corrupt-block" and "corrupt-heap" classes of bugs is specific to
-// SyzyASan.
-#if defined(SYZYASAN) && defined(COMPILER_MSVC)
-
+// Windows.
+#if defined(OS_WIN)
 // Corrupts a memory block and makes sure that the corruption gets detected when
 // we try to free this block.
 BASE_EXPORT NOINLINE void AsanCorruptHeapBlock();
@@ -39,7 +37,8 @@
 // crash occur.
 BASE_EXPORT NOINLINE void AsanCorruptHeap();
 
-#endif  // SYZYASAN && COMPILER_MSVC
+#endif  // OS_WIN
+#endif  // ADDRESS_SANITIZER
 
 }  // namespace debug
 }  // namespace base
diff --git a/base/debug/profiler.cc b/base/debug/profiler.cc
index 7718162..1ee94833 100644
--- a/base/debug/profiler.cc
+++ b/base/debug/profiler.cc
@@ -87,10 +87,6 @@
 
 #if !defined(OS_WIN)
 
-bool IsBinaryInstrumented() {
-  return false;
-}
-
 ReturnAddressLocationResolver GetProfilerReturnAddrResolutionFunc() {
   return nullptr;
 }
@@ -109,36 +105,6 @@
 
 #else  // defined(OS_WIN)
 
-bool IsBinaryInstrumented() {
-  enum InstrumentationCheckState {
-    UNINITIALIZED,
-    INSTRUMENTED_IMAGE,
-    NON_INSTRUMENTED_IMAGE,
-  };
-
-  static InstrumentationCheckState state = UNINITIALIZED;
-
-  if (state == UNINITIALIZED) {
-    base::win::PEImage image(CURRENT_MODULE());
-
-    // Check to be sure our image is structured as we'd expect.
-    DCHECK(image.VerifyMagic());
-
-    // Syzygy-instrumented binaries contain a PE image section named ".thunks",
-    // and all Syzygy-modified binaries contain the ".syzygy" image section.
-    // This is a very fast check, as it only looks at the image header.
-    if ((image.GetImageSectionHeaderByName(".thunks") != NULL) &&
-        (image.GetImageSectionHeaderByName(".syzygy") != NULL)) {
-      state = INSTRUMENTED_IMAGE;
-    } else {
-      state = NON_INSTRUMENTED_IMAGE;
-    }
-  }
-  DCHECK(state != UNINITIALIZED);
-
-  return state == INSTRUMENTED_IMAGE;
-}
-
 namespace {
 
 struct FunctionSearchContext {
@@ -186,9 +152,6 @@
 
 template <typename FunctionType>
 FunctionType FindFunctionInImports(const char* function_name) {
-  if (!IsBinaryInstrumented())
-    return NULL;
-
   base::win::PEImage image(CURRENT_MODULE());
 
   FunctionSearchContext ctx = { function_name, NULL };
diff --git a/base/debug/profiler.h b/base/debug/profiler.h
index ea81b13..f706a1a 100644
--- a/base/debug/profiler.h
+++ b/base/debug/profiler.h
@@ -35,9 +35,6 @@
 // Reset profiling after a fork, which disables timers.
 BASE_EXPORT void RestartProfilingAfterFork();
 
-// Returns true iff this executable is instrumented with the Syzygy profiler.
-BASE_EXPORT bool IsBinaryInstrumented();
-
 // Returns true iff this executable supports profiling.
 BASE_EXPORT bool IsProfilingSupported();
 
diff --git a/base/json/string_escape_fuzzer.cc b/base/json/string_escape_fuzzer.cc
index bdd754b..e44bd4fe 100644
--- a/base/json/string_escape_fuzzer.cc
+++ b/base/json/string_escape_fuzzer.cc
@@ -4,6 +4,8 @@
 
 #include "base/json/string_escape.h"
 
+#include <memory>
+
 std::string escaped_string;
 
 // Entry point for LibFuzzer.
diff --git a/base/logging.cc b/base/logging.cc
index ea253b5..2dac3e2 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -386,7 +386,7 @@
 }  // namespace
 
 #if DCHECK_IS_CONFIGURABLE
-// In DCHECK-enabled SyzyASAN builds, allow the meaning of LOG_DCHECK to be
+// In DCHECK-enabled Chrome builds, allow the meaning of LOG_DCHECK to be
 // determined at run-time. We default it to INFO, to avoid it triggering
 // crashes before the run-time has explicitly chosen the behaviour.
 BASE_EXPORT logging::LogSeverity LOG_DCHECK = LOG_INFO;
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc
index 5069b852..b145a1d 100644
--- a/base/message_loop/message_pump_win.cc
+++ b/base/message_loop/message_pump_win.cc
@@ -9,6 +9,7 @@
 
 #include <limits>
 
+#include "base/debug/alias.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram_macros.h"
@@ -209,6 +210,9 @@
     if (delay < 0)  // Negative value means no timers waiting.
       delay = INFINITE;
 
+    // Tell the optimizer to retain these values to simplify analyzing hangs.
+    base::debug::Alias(&delay);
+    base::debug::Alias(&wait_flags);
     DWORD result = MsgWaitForMultipleObjectsEx(0, nullptr, delay, QS_ALLINPUT,
                                                wait_flags);
 
@@ -311,6 +315,8 @@
     if (delay_msec < USER_TIMER_MINIMUM)
       delay_msec = USER_TIMER_MINIMUM;
 
+    // Tell the optimizer to retain these values to simplify analyzing hangs.
+    base::debug::Alias(&delay_msec);
     // Create a WM_TIMER event that will wake us up to check for any pending
     // timers (in case we are running within a nested, external sub-pump).
     UINT_PTR ret = SetTimer(message_window_.hwnd(), 0, delay_msec, nullptr);
@@ -510,6 +516,8 @@
   if (timeout < 0)  // Negative value means no timers waiting.
     timeout = INFINITE;
 
+  // Tell the optimizer to retain these values to simplify analyzing hangs.
+  base::debug::Alias(&timeout);
   WaitForIOCompletion(timeout, nullptr);
 }
 
diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
index 8e1a5342..8a05fc7 100644
--- a/base/process/process_util_unittest.cc
+++ b/base/process/process_util_unittest.cc
@@ -369,7 +369,7 @@
 
 // This test intentionally crashes, so we don't need to run it under
 // AddressSanitizer.
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 #define MAYBE_GetTerminationStatusCrash DISABLED_GetTerminationStatusCrash
 #else
 #define MAYBE_GetTerminationStatusCrash GetTerminationStatusCrash
diff --git a/base/test/test_timeouts.cc b/base/test/test_timeouts.cc
index 0642942e..dd5acbca 100644
--- a/base/test/test_timeouts.cc
+++ b/base/test/test_timeouts.cc
@@ -43,8 +43,7 @@
   // ASan/Win has not been optimized yet, give it a higher
   // timeout multiplier. See http://crbug.com/412471
   constexpr int kTimeoutMultiplier = 3;
-#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
-    defined(SYZYASAN)
+#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
   constexpr int kTimeoutMultiplier = 2;
 #else
   constexpr int kTimeoutMultiplier = 1;
diff --git a/base/threading/platform_thread_win.cc b/base/threading/platform_thread_win.cc
index 2c7fe5e..daccc0e 100644
--- a/base/threading/platform_thread_win.cc
+++ b/base/threading/platform_thread_win.cc
@@ -188,9 +188,7 @@
 
   // The debugger needs to be around to catch the name in the exception.  If
   // there isn't a debugger, we are just needlessly throwing an exception.
-  // If this image file is instrumented, we raise the exception anyway
-  // to provide the profiler with human-readable thread names.
-  if (!::IsDebuggerPresent() && !base::debug::IsBinaryInstrumented())
+  if (!::IsDebuggerPresent())
     return;
 
   SetNameInternal(CurrentId(), name.c_str());
diff --git a/base/tools_sanity_unittest.cc b/base/tools_sanity_unittest.cc
index fbe1d2f..64b1758 100644
--- a/base/tools_sanity_unittest.cc
+++ b/base/tools_sanity_unittest.cc
@@ -26,20 +26,13 @@
 
 // Helper for memory accesses that can potentially corrupt memory or cause a
 // crash during a native run.
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 #if defined(OS_IOS)
 // EXPECT_DEATH is not supported on IOS.
 #define HARMFUL_ACCESS(action,error_regexp) do { action; } while (0)
-#elif defined(SYZYASAN)
-// We won't get a meaningful error message because we're not running under the
-// SyzyASan logger, but we can at least make sure that the error has been
-// generated in the SyzyASan runtime.
-#define HARMFUL_ACCESS(action,unused) \
-if (debug::IsBinaryInstrumented()) { EXPECT_DEATH(action, \
-                                                  "AsanRuntime::OnError"); }
 #else
 #define HARMFUL_ACCESS(action,error_regexp) EXPECT_DEATH(action,error_regexp)
-#endif  // !OS_IOS && !SYZYASAN
+#endif  // !OS_IOS
 #else
 #define HARMFUL_ACCESS(action, error_regexp)
 #define HARMFUL_ACCESS_IS_NOOP
@@ -108,16 +101,15 @@
   leak[4] = 1;  // Make sure the allocated memory is used.
 }
 
-#if (defined(ADDRESS_SANITIZER) && defined(OS_IOS)) || defined(SYZYASAN)
+#if (defined(ADDRESS_SANITIZER) && defined(OS_IOS))
 // Because iOS doesn't support death tests, each of the following tests will
-// crash the whole program under Asan. On Windows Asan is based on SyzyAsan; the
-// error report mechanism is different than with Asan so these tests will fail.
+// crash the whole program under Asan.
 #define MAYBE_AccessesToNewMemory DISABLED_AccessesToNewMemory
 #define MAYBE_AccessesToMallocMemory DISABLED_AccessesToMallocMemory
 #else
 #define MAYBE_AccessesToNewMemory AccessesToNewMemory
 #define MAYBE_AccessesToMallocMemory AccessesToMallocMemory
-#endif // (defined(ADDRESS_SANITIZER) && defined(OS_IOS)) || defined(SYZYASAN)
+#endif  // (defined(ADDRESS_SANITIZER) && defined(OS_IOS))
 
 // The following tests pass with Clang r170392, but not r172454, which
 // makes AddressSanitizer detect errors in them. We disable these tests under
@@ -125,14 +117,14 @@
 // tests should be put back under the (defined(OS_IOS) || defined(OS_WIN))
 // clause above.
 // See also http://crbug.com/172614.
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 #define MAYBE_SingleElementDeletedWithBraces \
     DISABLED_SingleElementDeletedWithBraces
 #define MAYBE_ArrayDeletedWithoutBraces DISABLED_ArrayDeletedWithoutBraces
 #else
 #define MAYBE_ArrayDeletedWithoutBraces ArrayDeletedWithoutBraces
 #define MAYBE_SingleElementDeletedWithBraces SingleElementDeletedWithBraces
-#endif  // defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#endif  // defined(ADDRESS_SANITIZER)
 
 TEST(ToolsSanityTest, MAYBE_AccessesToNewMemory) {
   char *foo = new char[10];
@@ -150,7 +142,7 @@
   HARMFUL_ACCESS(foo[5] = 0, "heap-use-after-free");
 }
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 
 static int* allocateArray() {
   // Clang warns about the mismatched new[]/delete if they occur in the same
@@ -182,7 +174,7 @@
 }
 #endif
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 
 TEST(ToolsSanityTest, DISABLED_AddressSanitizerNullDerefCrashTest) {
   // Intentionally crash to make sure AddressSanitizer is running.
@@ -228,7 +220,7 @@
   HARMFUL_ACCESS(debug::AsanHeapUseAfterFree(), "heap-use-after-free");
 }
 
-#if defined(SYZYASAN) && defined(COMPILER_MSVC)
+#if defined(OS_WIN)
 TEST(ToolsSanityTest, AsanCorruptHeapBlock) {
   HARMFUL_ACCESS(debug::AsanCorruptHeapBlock(), "");
 }
@@ -238,10 +230,10 @@
   // particular string to look for in the stack trace.
   EXPECT_DEATH(debug::AsanCorruptHeap(), "");
 }
-#endif  // SYZYASAN && COMPILER_MSVC
+#endif  // OS_WIN
 #endif  // !HARMFUL_ACCESS_IS_NOOP
 
-#endif  // ADDRESS_SANITIZER || SYZYASAN
+#endif  // ADDRESS_SANITIZER
 
 namespace {
 
diff --git a/base/trace_event/cfi_backtrace_android.cc b/base/trace_event/cfi_backtrace_android.cc
new file mode 100644
index 0000000..fa26c58
--- /dev/null
+++ b/base/trace_event/cfi_backtrace_android.cc
@@ -0,0 +1,277 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/trace_event/cfi_backtrace_android.h"
+
+#include <sys/mman.h>
+#include <sys/types.h>
+
+#include "base/android/apk_assets.h"
+#include "base/debug/stack_trace.h"
+
+#if !defined(ARCH_CPU_ARMEL)
+#error This file should not be built for this architecture.
+#endif
+
+/*
+Basics of unwinding:
+For each instruction in a function we need to know what is the offset of SP
+(Stack Pointer) to reach the previous function's stack frame. To know which
+function is being invoked, we need the return address of the next function. The
+CFI information for an instruction is made up of 2 offsets, CFA (Call Frame
+Address) offset and RA (Return Address) offset. The CFA offset is the change in
+SP made by the function till the current instruction. This depends on amount of
+memory allocated on stack by the function plus some registers that the function
+stores that needs to be restored at the end of function. So, at each instruction
+the CFA offset tells the offset from original SP before the function call. The
+RA offset tells us the offset from the previous SP into the current function
+where the return address is stored.
+
+The unwind table contains rows of 64 bits each.
+We have 2 types of rows, FUNCTION and CFI.
+Each function with CFI info has a single FUNCTION row, followed by one or more
+CFI rows. All the addresses of the CFI rows will be within the function.
+1. FUNCTION. Bits in order of high to low represent:
+    31 bits: specifies function address, without the last bit (always 0).
+     1 bit : always 1. Last bit of the address, specifies the row type is
+             FUNCTION.
+    32 bits: length of the current function.
+
+2. CFI. Bits in order of high to low represent:
+    31 bits: instruction address in the current function.
+     1 bit : always 0. Last bit of the address, specifies the row type is CFI.
+    30 bits: CFA offset / 4.
+     2 bits: RA offset / 4.
+If the RA offset of a row is 0, then use the offset of the previous rows in the
+same function.
+TODO(ssid): Make sure RA offset is always present.
+
+See extract_unwind_tables.py for details about how this data is extracted from
+breakpad symbol files.
+*/
+
+extern "C" {
+extern char __executable_start;
+extern char _etext;
+}
+
+namespace base {
+namespace trace_event {
+
+namespace {
+
+// The bit of the address that is used to specify the type of the row is
+// FUNCTION or CFI type.
+constexpr uint32_t kFunctionTypeMask = 0x1;
+
+// The mask on the CFI row data that is used to get the high 30 bits and
+// multiply it by 4 to get CFA offset. Since the last 2 bits are masked out, a
+// shift is not necessary.
+constexpr uint32_t kCFAMask = 0xfffffffc;
+
+// The mask on the CFI row data that is used to get the low 2 bits and multiply
+// it by 4 to get the RA offset.
+constexpr uint32_t kRAMask = 0x3;
+constexpr uint32_t kRAShift = 2;
+
+// The code in this file assumes we are running in 32-bit builds since all the
+// addresses in the unwind table are specified in 32 bits.
+static_assert(sizeof(uintptr_t) == 4,
+              "The unwind table format is only valid for 32 bit builds.");
+
+// The struct that corresponds to each row in the unwind table. The row can be
+// of any type, CFI or FUNCTION. The first 4 bytes in the row represents the
+// address and the next 4 bytes have data. The members of this struct is in
+// order of the input format. We cast the memory map of the unwind table as an
+// array of CFIUnwindInfo and use it to read data and search. So, the size of
+// this struct should be 8 bytes and the order of the members is fixed according
+// to the given format.
+struct CFIUnwindInfo {
+  // The address is either the start address of the function or the instruction
+  // address where the CFI information changes in a function. If the last bit of
+  // the address is 1 then it specifies that the row is of type FUNCTION and if
+  // the last bit is 0 then it specifies the row is of type CFI.
+  uintptr_t addr;
+
+  // If the row type is function, |data| is |function_length|. If the row type
+  // is CFI, |data| is |cfi_data|.
+  union {
+    // Represents the total length of the function that start with the |addr|.
+    uintptr_t function_length;
+    // Represents the CFA and RA offsets to get information about next stack
+    // frame.
+    uintptr_t cfi_data;
+  } data;
+
+  bool is_function_type() const { return !!(addr & kFunctionTypeMask); }
+
+  // Returns the address of the current row, CFI or FUNCTION type.
+  uintptr_t address() const {
+    return is_function_type() ? (addr & ~kFunctionTypeMask) : addr;
+  }
+
+  // Return the RA offset when the current row is CFI type.
+  uintptr_t ra_offset() const {
+    DCHECK(!is_function_type());
+    return (data.cfi_data & kRAMask) << kRAShift;
+  }
+
+  // Returns the CFA offset if the current row is CFI type.
+  uintptr_t cfa_offset() const {
+    DCHECK(!is_function_type());
+    return data.cfi_data & kCFAMask;
+  }
+
+  // Returns true if the instruction is within the function address range, given
+  // that the current row is FUNCTION type and the |instruction_addr| is offset
+  // address of instruction from the start of the binary.
+  bool is_instruction_in_function(uintptr_t instruction_addr) const {
+    DCHECK(is_function_type());
+    return (instruction_addr >= address()) &&
+           (instruction_addr <= address() + data.function_length);
+  }
+};
+
+static_assert(
+    sizeof(CFIUnwindInfo) == 8,
+    "The CFIUnwindInfo struct must be exactly 8 bytes for searching.");
+
+}  // namespace
+
+// static
+CFIBacktraceAndroid* CFIBacktraceAndroid::GetInstance() {
+  static CFIBacktraceAndroid* instance = new CFIBacktraceAndroid();
+  return instance;
+}
+
+CFIBacktraceAndroid::CFIBacktraceAndroid() {
+  Initialize();
+}
+
+CFIBacktraceAndroid::~CFIBacktraceAndroid() {}
+
+void CFIBacktraceAndroid::Initialize() {
+  // The address |_etext| gives the end of the .text section in the binary. This
+  // value is more accurate than parsing the memory map since the mapped
+  // regions are usualy larger than the .text section.
+  executable_end_addr_ = reinterpret_cast<uintptr_t>(&_etext);
+  // The address of |__executable_start| gives the start address of the
+  // executable. This value is used to find the offset address of the
+  // instruction in binary from PC.
+  executable_start_addr_ = reinterpret_cast<uintptr_t>(&__executable_start);
+
+  // This file name is defined by extract_unwind_tables.gni.
+  static constexpr char kCfiFileName[] = "assets/unwind_cfi";
+  MemoryMappedFile::Region cfi_region;
+  int fd = base::android::OpenApkAsset(kCfiFileName, &cfi_region);
+  if (fd < 0)
+    return;
+  cfi_mmap_ = std::make_unique<MemoryMappedFile>();
+  // The CFI region starts at |cfi_region.offset|.
+  if (!cfi_mmap_->Initialize(base::File(fd), cfi_region))
+    return;
+  // The CFI file should contain rows of 8 bytes each.
+  DCHECK_EQ(0u, cfi_region.size % sizeof(CFIUnwindInfo));
+  unwind_table_row_count_ = cfi_region.size / sizeof(CFIUnwindInfo);
+  can_unwind_stack_frames_ = true;
+}
+
+size_t CFIBacktraceAndroid::Unwind(const void** out_trace,
+                                   size_t max_depth) const {
+  // This function walks the stack using the call frame information to find the
+  // return addresses of all the functions that belong to current binary in call
+  // stack. For each function the CFI table defines the offset of the previous
+  // call frame and offset where the return address is stored.
+  if (!can_unwind_stack_frames())
+    return 0;
+
+  // Get the current register state. This register state can be taken at any
+  // point in the function and the unwind information would be for this point.
+  // Define local variables before trying to get the current PC and SP to make
+  // sure the register state obtained is consistent with each other.
+  uintptr_t pc = 0, sp = 0;
+  asm volatile("mov %0, pc" : "=r"(pc));
+  asm volatile("mov %0, sp" : "=r"(sp));
+
+  // We can only unwind as long as the pc is within the chrome.so.
+  size_t depth = 0;
+  while (pc > executable_start_addr_ && pc <= executable_end_addr_ &&
+         depth < max_depth) {
+    out_trace[depth++] = reinterpret_cast<void*>(pc);
+    // The offset of function from the start of the chrome.so binary:
+    uintptr_t func_addr = pc - executable_start_addr_;
+    CFIRow cfi{};
+    if (!FindCFIRowForPC(func_addr, &cfi))
+      break;
+
+    // The rules for unwinding using the CFI information are:
+    // SP_prev = SP_cur + cfa_offset and
+    // PC_prev = * (SP_prev - ra_offset).
+    sp = sp + cfi.cfa_offset;
+    memcpy(&pc, reinterpret_cast<uintptr_t*>(sp - cfi.ra_offset),
+           sizeof(uintptr_t));
+  }
+  return depth;
+}
+
+bool CFIBacktraceAndroid::FindCFIRowForPC(
+    uintptr_t func_addr,
+    CFIBacktraceAndroid::CFIRow* cfi) const {
+  // Consider the CFI mapped region as an array of CFIUnwindInfo since each row
+  // is 8 bytes long and it contains |cfi_region_size_| / 8 rows. We define
+  // start and end iterator on this array and use std::lower_bound() to binary
+  // search on this array. std::lower_bound() returns the row that corresponds
+  // to the first row that has address greater than the current value, since
+  // address is used in compartor.
+  const CFIUnwindInfo* start =
+      reinterpret_cast<const CFIUnwindInfo*>(cfi_mmap_->data());
+  const CFIUnwindInfo* end = start + unwind_table_row_count_;
+  const CFIUnwindInfo to_find = {func_addr, {0}};
+  const CFIUnwindInfo* found = std::lower_bound(
+      start, end, to_find,
+      [](const auto& a, const auto& b) { return a.addr < b.addr; });
+  *cfi = {0};
+
+  // The given address is less than the start address in the CFI table if
+  // lower_bound() returns start.
+  if (found == start)
+    return false;
+  // If the given address is equal to the found address, then use the found row.
+  // Otherwise the required row is always one less than the value returned by
+  // std::lower_bound().
+  if (found == end || found->address() != func_addr)
+    found--;
+
+  DCHECK_LE(found->address(), func_addr);
+  DCHECK(!found->is_function_type())
+      << "Current PC cannot be start of a function";
+
+  // The CFIUnwindInfo::data field hold the CFI information since the row
+  // found should not correspond to function start address. So, interpret the
+  // data in the found row as CFI data which contains the CFA and RA offsets.
+  *cfi = {found->cfa_offset(), found->ra_offset()};
+  DCHECK(cfi->cfa_offset);
+
+  // Find the function data for the current row by iterating till we reach the a
+  // row of type FUNCTION, to check if the unwind information is valid. Also
+  // find the RA offset if we do not have it in the CFI row found.
+  const CFIUnwindInfo* it = found;
+  for (; !it->is_function_type() && it >= start; it--) {
+    // If ra offset of the last specified row should be used, if unspecified.
+    // TODO(ssid): This should be fixed in the format and we should always
+    // output ra offset.
+    if (!cfi->ra_offset)
+      cfi->ra_offset = it->ra_offset();
+  }
+  // If the given function adddress does not belong to the function found, then
+  // the unwind info is invalid.
+  if (!it->is_instruction_in_function(func_addr))
+    return false;
+
+  DCHECK(cfi->ra_offset);
+  return true;
+}
+
+}  // namespace trace_event
+}  // namespace base
diff --git a/base/trace_event/cfi_backtrace_android.h b/base/trace_event/cfi_backtrace_android.h
new file mode 100644
index 0000000..bad7290
--- /dev/null
+++ b/base/trace_event/cfi_backtrace_android.h
@@ -0,0 +1,103 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TRACE_EVENT_CFI_BACKTRACE_ANDROID_H_
+#define BASE_TRACE_EVENT_CFI_BACKTRACE_ANDROID_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <memory>
+
+#include "base/base_export.h"
+#include "base/debug/debugging_buildflags.h"
+#include "base/files/memory_mapped_file.h"
+#include "base/gtest_prod_util.h"
+
+namespace base {
+namespace trace_event {
+
+// This class is used to unwind stack frames in the current thread. The unwind
+// information (dwarf debug info) is stripped from the chrome binary and we do
+// not build with exception tables (ARM EHABI) in release builds. So, we use a
+// custom unwind table which is generated and added to specific android builds,
+// when add_unwind_tables_in_apk build option is specified. This unwind table
+// contains information for unwinding stack frames when the functions calls are
+// from lib[mono]chrome.so. The file is added as an asset to the apk and the
+// table is used to unwind stack frames for profiling. This class implements
+// methods to read and parse the unwind table and unwind stack frames using this
+// data.
+class BASE_EXPORT CFIBacktraceAndroid {
+ public:
+  // Creates and initializes the unwinder on first call.
+  static CFIBacktraceAndroid* GetInstance();
+
+  // Returns true if stack unwinding is possible using CFI unwind tables in apk.
+  // There is no need to check this before each unwind call. Will always return
+  // the same value based on CFI tables being present in the binary.
+  bool can_unwind_stack_frames() const { return can_unwind_stack_frames_; }
+
+  // Returns the program counters by unwinding stack in the current thread in
+  // order of latest call frame first. Unwinding works only if
+  // can_unwind_stack_frames() returns true. This function does not allocate
+  // memory from heap. For each stack frame, this method searches through the
+  // unwind table mapped in memory to find the unwind information for function
+  // and walks the stack to find all the return address. This only works until
+  // the last function call from the chrome.so. We do not have unwind
+  // information to unwind beyond any frame outside of chrome.so. Calls to
+  // Unwind() are thread safe and lock free, once Initialize() returns success.
+  size_t Unwind(const void** out_trace, size_t max_depth) const;
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestFindCFIRow);
+  FRIEND_TEST_ALL_PREFIXES(CFIBacktraceAndroidTest, TestUnwinding);
+
+  // The CFI information that correspond to an instruction.
+  struct CFIRow {
+    bool operator==(const CFIBacktraceAndroid::CFIRow& o) const {
+      return cfa_offset == o.cfa_offset && ra_offset == o.ra_offset;
+    }
+
+    // The offset of the call frame address of previous function from the
+    // current stack pointer. Rule for unwinding SP: SP_prev = SP_cur +
+    // cfa_offset.
+    size_t cfa_offset = 0;
+    // The offset of location of return address from the previous call frame
+    // address. Rule for unwinding PC: PC_prev = * (SP_prev - ra_offset).
+    size_t ra_offset = 0;
+  };
+
+  CFIBacktraceAndroid();
+  ~CFIBacktraceAndroid();
+
+  // Initializes unwind tables using the CFI asset file in the apk if present.
+  // Also stores the limits of mapped region of the lib[mono]chrome.so binary,
+  // since the unwind is only feasible for addresses within the .so file. Once
+  // initialized, the memory map of the unwind table is never cleared since we
+  // cannot guarantee that all the threads are done using the memory map when
+  // heap profiling is turned off. But since we keep the memory map is clean,
+  // the system can choose to evict the unused pages when needed. This would
+  // still reduce the total amount of address space available in process.
+  void Initialize();
+
+  // Finds the CFI row for the given |func_addr| in terms of offset from
+  // the start of the current binary.
+  bool FindCFIRowForPC(uintptr_t func_addr, CFIRow* out) const;
+
+  // Details about the memory mapped region which contains the libchrome.so
+  // library file.
+  uintptr_t executable_start_addr_ = 0;
+  uintptr_t executable_end_addr_ = 0;
+
+  // The start address of the memory mapped unwind table asset file. Unique ptr
+  // because it is replaced in tests.
+  std::unique_ptr<MemoryMappedFile> cfi_mmap_;
+  size_t unwind_table_row_count_ = 0;
+  bool can_unwind_stack_frames_ = false;
+};
+
+}  // namespace trace_event
+}  // namespace base
+
+#endif  // BASE_TRACE_EVENT_CFI_BACKTRACE_ANDROID_H_
diff --git a/base/trace_event/cfi_backtrace_android_unittest.cc b/base/trace_event/cfi_backtrace_android_unittest.cc
new file mode 100644
index 0000000..0a25d37
--- /dev/null
+++ b/base/trace_event/cfi_backtrace_android_unittest.cc
@@ -0,0 +1,117 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/trace_event/cfi_backtrace_android.h"
+
+#include "base/files/file_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace trace_event {
+
+namespace {
+
+void* GetPC() {
+  return __builtin_return_address(0);
+}
+
+}  // namespace
+
+TEST(CFIBacktraceAndroidTest, TestUnwinding) {
+  auto* unwinder = CFIBacktraceAndroid::GetInstance();
+  EXPECT_TRUE(unwinder->can_unwind_stack_frames());
+  EXPECT_GT(unwinder->executable_start_addr_, 0u);
+  EXPECT_GT(unwinder->executable_end_addr_, unwinder->executable_start_addr_);
+  EXPECT_GT(unwinder->cfi_mmap_->length(), 0u);
+
+  const size_t kMaxFrames = 100;
+  const void* frames[kMaxFrames];
+  size_t unwind_count = unwinder->Unwind(frames, kMaxFrames);
+  // Expect at least 2 frames in the result.
+  ASSERT_GT(unwind_count, 2u);
+  EXPECT_LE(unwind_count, kMaxFrames);
+
+  const size_t kMaxCurrentFuncCodeSize = 50;
+  const uintptr_t current_pc = reinterpret_cast<uintptr_t>(GetPC());
+  const uintptr_t actual_frame = reinterpret_cast<uintptr_t>(frames[2]);
+  EXPECT_NEAR(current_pc, actual_frame, kMaxCurrentFuncCodeSize);
+
+  for (size_t i = 0; i < unwind_count; ++i) {
+    EXPECT_GT(reinterpret_cast<uintptr_t>(frames[i]),
+              unwinder->executable_start_addr_);
+    EXPECT_LT(reinterpret_cast<uintptr_t>(frames[i]),
+              unwinder->executable_end_addr_);
+  }
+}
+
+TEST(CFIBacktraceAndroidTest, TestFindCFIRow) {
+  auto* unwinder = CFIBacktraceAndroid::GetInstance();
+  size_t input[] = {// Function 1 - 0x1000
+                    0x1001, 0x500,
+                    0x1002, 0x111,
+                    0x1008, 0x220,
+                    0x1040, 0x330,
+                    0x1050, 0x332,
+                    0x1080, 0x330,
+
+                    // Function 2 - 0x2000
+                    0x2001, 0x22,
+                    0x2004, 0x13,
+                    0x2008, 0x23,
+
+                    // Function 3 - 0x2024
+                    0x2025, 0x100,
+                    0x2030, 0x33,
+                    0x2100, 0x40,
+
+                    // Function 4 - 0x2200
+                    0x2201, 0x10,
+                    0x2204, 0x2e};
+  FilePath temp_path;
+  CreateTemporaryFile(&temp_path);
+  EXPECT_EQ(
+      static_cast<int>(sizeof(input)),
+      WriteFile(temp_path, reinterpret_cast<char*>(input), sizeof(input)));
+
+  unwinder->cfi_mmap_.reset(new MemoryMappedFile());
+  ASSERT_TRUE(unwinder->cfi_mmap_->Initialize(temp_path));
+  unwinder->unwind_table_row_count_ = sizeof(input) / (2 * sizeof(size_t));
+
+  CFIBacktraceAndroid::CFIRow cfi_row = {0};
+  EXPECT_FALSE(unwinder->FindCFIRowForPC(0x00, &cfi_row));
+  EXPECT_FALSE(unwinder->FindCFIRowForPC(0x100, &cfi_row));
+  EXPECT_FALSE(unwinder->FindCFIRowForPC(0x1501, &cfi_row));
+  EXPECT_FALSE(unwinder->FindCFIRowForPC(0x3000, &cfi_row));
+  EXPECT_FALSE(unwinder->FindCFIRowForPC(0x2023, &cfi_row));
+  EXPECT_FALSE(unwinder->FindCFIRowForPC(0x2215, &cfi_row));
+
+  const CFIBacktraceAndroid::CFIRow kRow1 = {0x110, 0x4};
+  const CFIBacktraceAndroid::CFIRow kRow2 = {0x220, 0x4};
+  const CFIBacktraceAndroid::CFIRow kRow3 = {0x330, 0x8};
+  const CFIBacktraceAndroid::CFIRow kRow4 = {0x30, 0xc};
+  const CFIBacktraceAndroid::CFIRow kRow5 = {0x2c, 0x8};
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x1002, &cfi_row));
+  EXPECT_EQ(kRow1, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x1003, &cfi_row));
+  EXPECT_EQ(kRow1, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x1008, &cfi_row));
+  EXPECT_EQ(kRow2, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x1009, &cfi_row));
+  EXPECT_EQ(kRow2, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x1039, &cfi_row));
+  EXPECT_EQ(kRow2, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x1080, &cfi_row));
+  EXPECT_EQ(kRow3, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x1100, &cfi_row));
+  EXPECT_EQ(kRow3, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x2050, &cfi_row));
+  EXPECT_EQ(kRow4, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x2208, &cfi_row));
+  EXPECT_EQ(kRow5, cfi_row);
+  EXPECT_TRUE(unwinder->FindCFIRowForPC(0x2210, &cfi_row));
+  EXPECT_EQ(kRow5, cfi_row);
+}
+
+}  // namespace trace_event
+}  // namespace base
diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc
index 78d4b83..98b2101 100644
--- a/base/trace_event/malloc_dump_provider.cc
+++ b/base/trace_event/malloc_dump_provider.cc
@@ -154,11 +154,6 @@
 // Unfortunately, there is no safe way to collect information from secondary
 // heaps due to limitations and racy nature of this piece of WinAPI.
 void WinHeapMemoryDumpImpl(WinHeapInfo* crt_heap_info) {
-#if defined(SYZYASAN)
-  if (base::debug::IsBinaryInstrumented())
-    return;
-#endif
-
   // Iterate through whichever heap our CRT is using.
   HANDLE crt_heap = reinterpret_cast<HANDLE>(_get_heap_handle());
   ::HeapLock(crt_heap);
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn
index 2c8747f..717cc28f 100644
--- a/build/config/BUILD.gn
+++ b/build/config/BUILD.gn
@@ -127,12 +127,6 @@
   } else {
     defines += [ "CHROMIUM_BUILD" ]
   }
-  if (is_syzyasan) {
-    defines += [
-      "SYZYASAN",
-      "MEMORY_SANITIZER_INITIAL_SIZE",
-    ]
-  }
   if (!fieldtrial_testing_like_official_build && !is_chrome_branded) {
     defines += [ "FIELDTRIAL_TESTING_ENABLED" ]
   }
diff --git a/build/config/allocator.gni b/build/config/allocator.gni
index 03892a888..709f80f3 100644
--- a/build/config/allocator.gni
+++ b/build/config/allocator.gni
@@ -6,8 +6,7 @@
 
 # Temporarily disable tcmalloc on arm64 linux to get rid of compilation errors.
 if (is_android || is_mac || is_ios || is_asan || is_lsan || is_tsan ||
-    is_msan || is_win || is_syzyasan || is_fuchsia ||
-    (is_linux && target_cpu == "arm64")) {
+    is_msan || is_win || is_fuchsia || (is_linux && target_cpu == "arm64")) {
   _default_allocator = "none"
 } else {
   _default_allocator = "tcmalloc"
diff --git a/build/config/android/extract_unwind_tables.gni b/build/config/android/extract_unwind_tables.gni
index c3d5d2b..70f2d331 100644
--- a/build/config/android/extract_unwind_tables.gni
+++ b/build/config/android/extract_unwind_tables.gni
@@ -7,14 +7,20 @@
 template("unwind_table_asset") {
   _unwind_action = "${target_name}__extract"
   _asset_path = "${target_gen_dir}/${target_name}/unwind_cfi"
+
   action(_unwind_action) {
     if (defined(invoker.testonly)) {
       testonly = invoker.testonly
     }
+
     script = "//build/android/gyp/extract_unwind_tables.py"
     outputs = [
       _asset_path,
     ]
+    inputs = [
+      "$root_out_dir/lib.unstripped/$shlib_prefix${invoker.library_target}$shlib_extension",
+    ]
+
     args = [
       "--input_path",
       rebase_path(
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 23b7971..e018349 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -2096,9 +2096,6 @@
       # TODO(thakis): Consider making clang emit DW_AT_linkage_name in -g1 mode;
       #               failing that consider doing this on non-Android too.
       cflags += [ "-fdebug-info-for-profiling" ]
-      if (strip_debug_info) {
-        ldflags += [ "-Wl,--strip-debug" ]
-      }
     }
 
     # Note: -gsplit-dwarf implicitly turns on -g2 with clang, so don't pass it.
@@ -2125,6 +2122,18 @@
   } else {
     assert(false)
   }
+
+  # This config is removed by base unittests apk.
+  if (is_android && is_clang && strip_debug_info) {
+    configs += [ ":strip_debug" ]
+  }
+}
+
+config("strip_debug") {
+  if (!defined(ldflags)) {
+    ldflags = []
+  }
+  ldflags += [ "-Wl,--strip-debug" ]
 }
 
 if (is_ios || is_mac) {
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni
index 5fb5a3c..60f05de 100644
--- a/build/config/compiler/compiler.gni
+++ b/build/config/compiler/compiler.gni
@@ -141,6 +141,14 @@
 
 assert(!can_unwind_with_frame_pointers || enable_frame_pointers)
 
+# Unwinding with CFI table is only possible on static library builds and
+# requried only when frame pointers are not enabled.
+# Builds with use_thin_lto use link registers to store offsets, and this is
+# not supported yet.
+can_unwind_with_cfi_table =
+    is_android && !is_component_build && !can_unwind_with_frame_pointers &&
+    current_cpu == "arm" && !use_thin_lto
+
 declare_args() {
   # Whether or not the official builds should be built with full WPO. Enabled by
   # default for the PGO and the x64 builds.
diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni
index 73441af..c7c0904 100644
--- a/build/config/sanitizers/sanitizers.gni
+++ b/build/config/sanitizers/sanitizers.gni
@@ -46,11 +46,6 @@
   # standard system libraries. Set this flag to build the libraries from source.
   use_locally_built_instrumented_libraries = false
 
-  # Enable building with SyzyAsan which can find certain types of memory
-  # errors. Only works on Windows. See
-  # https://github.com/google/syzygy/wiki/SyzyASanHowTo
-  is_syzyasan = false
-
   # Compile with Control Flow Integrity to protect virtual calls and casts.
   # See http://clang.llvm.org/docs/ControlFlowIntegrity.html
   #
@@ -119,7 +114,6 @@
   is_cfi = false
   is_lsan = false
   is_msan = false
-  is_syzyasan = false
   is_tsan = false
   is_ubsan = false
   is_ubsan_null = false
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn
index 568b55d..ec4cf78c 100644
--- a/build/config/win/BUILD.gn
+++ b/build/config/win/BUILD.gn
@@ -115,31 +115,25 @@
     cflags += [ "/Brepro" ]
   }
 
+  # TODO(siggi): Is this of any use anymore?
   # /PROFILE ensures that the PDB file contains FIXUP information (growing the
-  # PDB file by about 5%) but does not otherwise alter the output binary. This
-  # information is used by the Syzygy optimization tool when decomposing the
-  # release image. It is enabled for syzyasan builds and opportunistically for
-  # other builds where it is not prohibited (not supported when incrementally
-  # linking, or using /debug:fastlink).
-  if (is_syzyasan) {
-    assert(!is_win_fastlink)
-    ldflags = [ "/PROFILE" ]
-  } else {
-    if (!is_debug && !is_component_build) {
-      if (is_win_fastlink && !use_lld) {
-        # /PROFILE implies the following linker flags. Therefore if we are
-        # skipping /PROFILE because it is incompatible with /DEBUG:FASTLINK
-        # we should explicitly add these flags in order to avoid unintended
-        # consequences such as larger binaries.
-        ldflags = [
-          "/OPT:REF",
-          "/OPT:ICF",
-          "/INCREMENTAL:NO",
-          "/FIXED:NO",
-        ]
-      } else {
-        ldflags = [ "/PROFILE" ]
-      }
+  # PDB file by about 5%) but does not otherwise alter the output binary. It is
+  # enabled opportunistically for builds where it is not prohibited (not
+  # supported when incrementally linking, or using /debug:fastlink).
+  if (!is_debug && !is_component_build) {
+    if (is_win_fastlink && !use_lld) {
+      # /PROFILE implies the following linker flags. Therefore if we are
+      # skipping /PROFILE because it is incompatible with /DEBUG:FASTLINK
+      # we should explicitly add these flags in order to avoid unintended
+      # consequences such as larger binaries.
+      ldflags = [
+        "/OPT:REF",
+        "/OPT:ICF",
+        "/INCREMENTAL:NO",
+        "/FIXED:NO",
+      ]
+    } else {
+      ldflags = [ "/PROFILE" ]
     }
   }
 
@@ -485,9 +479,9 @@
   incremental_linking_on_switch += [ "/OPT:NOREF" ]
 }
 
-# Disable incremental linking for syzyasan, enable for debug builds and all
-# component builds - any builds where performance is not job one.
-if ((is_debug || is_component_build) && !is_syzyasan) {
+# Enable incremental linking for debug builds and all component builds - any
+# builds where performance is not job one.
+if (is_debug || is_component_build) {
   default_incremental_linking_switch = incremental_linking_on_switch
 } else {
   default_incremental_linking_switch = incremental_linking_off_switch
diff --git a/build/win/syzygy/BUILD.gn b/build/win/syzygy/BUILD.gn
deleted file mode 100644
index 1d26b5a..0000000
--- a/build/win/syzygy/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-copy("copy_syzyasan_binaries") {
-  visibility = [
-    "//chrome/*",
-    "//content/*",
-  ]
-
-  source_dir = "//third_party/syzygy/binaries/exe"
-
-  sources = [
-    "$source_dir/agent_logger.exe",
-    "$source_dir/minidump_symbolizer.py",
-    "$source_dir/syzyasan_rtl.dll",
-    "$source_dir/syzyasan_rtl.dll.pdb",
-  ]
-
-  outputs = [
-    "$root_out_dir/syzygy/{{source_file_part}}",
-  ]
-}
diff --git a/build/win/syzygy/OWNERS b/build/win/syzygy/OWNERS
deleted file mode 100644
index 6d61b635..0000000
--- a/build/win/syzygy/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-chrisha@chromium.org
-sebmarchand@chromium.org
-siggi@chromium.org
diff --git a/build/win/syzygy/instrument.py b/build/win/syzygy/instrument.py
deleted file mode 100755
index e103fac..0000000
--- a/build/win/syzygy/instrument.py
+++ /dev/null
@@ -1,157 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A utility script to help building Syzygy-instrumented Chrome binaries."""
-
-import glob
-import logging
-import optparse
-import os
-import shutil
-import subprocess
-import sys
-
-
-# The default directory containing the Syzygy toolchain.
-_DEFAULT_SYZYGY_DIR = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '../../..',
-    'third_party/syzygy/binaries/exe/'))
-
-# Basenames of various tools.
-_INSTRUMENT_EXE = 'instrument.exe'
-_GENFILTER_EXE = 'genfilter.exe'
-
-_LOGGER = logging.getLogger()
-
-
-def _Shell(*cmd, **kw):
-  """Shells out to "cmd". Returns a tuple of cmd's stdout, stderr."""
-  _LOGGER.info('Running command "%s".', cmd)
-  prog = subprocess.Popen(cmd, **kw)
-
-  stdout, stderr = prog.communicate()
-  if prog.returncode != 0:
-    raise RuntimeError('Command "%s" returned %d.' % (cmd, prog.returncode))
-
-  return stdout, stderr
-
-
-def _CompileFilter(syzygy_dir, executable, symbol, filter_file,
-                   output_filter_file):
-  """Compiles the provided filter writing the compiled filter file to
-  output_filter_file.
-  """
-  cmd = [os.path.abspath(os.path.join(syzygy_dir, _GENFILTER_EXE)),
-         '--action=compile',
-         '--input-image=%s' % executable,
-         '--input-pdb=%s' % symbol,
-         '--output-file=%s' % output_filter_file,
-         '--overwrite',
-         os.path.abspath(filter_file)]
-
-  _Shell(*cmd)
-  if not os.path.exists(output_filter_file):
-    raise RuntimeError('Compiled filter file missing: %s' % output_filter_file)
-  return
-
-
-def _InstrumentBinary(syzygy_dir, mode, executable, symbol, dst_dir,
-                      filter_file, allocation_filter_file):
-  """Instruments the executable found in input_dir, and writes the resultant
-  instrumented executable and symbol files to dst_dir.
-  """
-  cmd = [os.path.abspath(os.path.join(syzygy_dir, _INSTRUMENT_EXE)),
-         '--overwrite',
-         '--mode=%s' % mode,
-         '--debug-friendly',
-         '--input-image=%s' % executable,
-         '--input-pdb=%s' % symbol,
-         '--output-image=%s' % os.path.abspath(
-             os.path.join(dst_dir, os.path.basename(executable))),
-         '--output-pdb=%s' % os.path.abspath(
-             os.path.join(dst_dir, os.path.basename(symbol)))]
-
-  if mode == "asan":
-    cmd.append('--no-augment-pdb')
-    # Disable some of the new SysyASAN features. We're seeing an increase in
-    # crash rates and are wondering if they are to blame.
-    cmd.append(
-        '--asan-rtl-options="--enable_feature_randomization '
-        '--prevent_duplicate_corruption_crashes"')
-
-  # If any filters were specified then pass them on to the instrumenter.
-  if filter_file:
-    cmd.append('--filter=%s' % os.path.abspath(filter_file))
-  if allocation_filter_file:
-    cmd.append('--allocation-filter-config-file=%s' %
-        os.path.abspath(allocation_filter_file))
-
-  return _Shell(*cmd)
-
-
-def main(options):
-  # Make sure the destination directory exists.
-  if not os.path.isdir(options.destination_dir):
-    _LOGGER.info('Creating destination directory "%s".',
-                 options.destination_dir)
-    os.makedirs(options.destination_dir)
-
-  # Compile the filter if one was provided.
-  if options.filter:
-    _CompileFilter(options.syzygy_dir,
-                   options.input_executable,
-                   options.input_symbol,
-                   options.filter,
-                   options.output_filter_file)
-
-  # Instruments the binaries into the destination directory.
-  _InstrumentBinary(options.syzygy_dir,
-                    options.mode,
-                    options.input_executable,
-                    options.input_symbol,
-                    options.destination_dir,
-                    options.output_filter_file,
-                    options.allocation_filter_file)
-
-
-def _ParseOptions():
-  option_parser = optparse.OptionParser()
-  option_parser.add_option('--input_executable',
-      help='The path to the input executable.')
-  option_parser.add_option('--input_symbol',
-      help='The path to the input symbol file.')
-  option_parser.add_option('--mode',
-      help='Specifies which instrumentation mode is to be used.')
-  option_parser.add_option('--syzygy-dir', default=_DEFAULT_SYZYGY_DIR,
-      help='Instrumenter executable to use, defaults to "%default".')
-  option_parser.add_option('-d', '--destination_dir',
-      help='Destination directory for instrumented files.')
-  option_parser.add_option('--filter',
-      help='An optional filter. This will be compiled and passed to the '
-           'instrumentation executable.')
-  option_parser.add_option('--output-filter-file',
-      help='The path where the compiled filter will be written. This is '
-           'required if --filter is specified.')
-  option_parser.add_option('--allocation-filter-file',
-      help='The path to the SyzyASAN allocation filter to use.')
-  options, args = option_parser.parse_args()
-
-  if not options.mode:
-    option_parser.error('You must provide an instrumentation mode.')
-  if not options.input_executable:
-    option_parser.error('You must provide an input executable.')
-  if not options.input_symbol:
-    option_parser.error('You must provide an input symbol file.')
-  if not options.destination_dir:
-    option_parser.error('You must provide a destination directory.')
-  if options.filter and not options.output_filter_file:
-    option_parser.error('You must provide a filter output file.')
-
-  return options
-
-
-if '__main__' == __name__:
-  logging.basicConfig(level=logging.INFO)
-  sys.exit(main(_ParseOptions()))
diff --git a/build/win/syzygy/reorder.py b/build/win/syzygy/reorder.py
deleted file mode 100755
index ba62cc77..0000000
--- a/build/win/syzygy/reorder.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A utility script to help building Syzygy-reordered Chrome binaries."""
-
-import logging
-import optparse
-import os
-import subprocess
-import sys
-
-
-# The default relink executable to use to reorder binaries.
-_DEFAULT_RELINKER = os.path.join(
-    os.path.join(os.path.dirname(__file__), '../../..'),
-    'third_party/syzygy/binaries/exe/relink.exe')
-
-_LOGGER = logging.getLogger()
-
-# We use the same seed for all random reorderings to get a deterministic build.
-_RANDOM_SEED = 1347344
-
-
-def _Shell(*cmd, **kw):
-  """Shells out to "cmd". Returns a tuple of cmd's stdout, stderr."""
-  _LOGGER.info('Running command "%s".', cmd)
-  prog = subprocess.Popen(cmd, **kw)
-
-  stdout, stderr = prog.communicate()
-  if prog.returncode != 0:
-    raise RuntimeError('Command "%s" returned %d.' % (cmd, prog.returncode))
-
-  return stdout, stderr
-
-
-def _ReorderBinary(relink_exe, executable, symbol, destination_dir):
-  """Reorders the executable found in input_dir, and writes the resultant
-  reordered executable and symbol files to destination_dir.
-
-  If a file named <executable>-order.json exists, imposes that order on the
-  output binaries, otherwise orders them randomly.
-  """
-  cmd = [relink_exe,
-         '--overwrite',
-         '--input-image=%s' % executable,
-         '--input-pdb=%s' % symbol,
-         '--output-image=%s' % os.path.abspath(
-             os.path.join(destination_dir, os.path.basename(executable))),
-         '--output-pdb=%s' % os.path.abspath(
-             os.path.join(destination_dir, os.path.basename(symbol))),]
-
-  # Check whether there's an order file available for the executable.
-  order_file = '%s-order.json' % executable
-  if os.path.exists(order_file):
-    # The ordering file exists, let's use that.
-    _LOGGER.info('Reordering "%s" according to "%s".',
-                 os.path.basename(executable),
-                 os.path.basename(order_file))
-    cmd.append('--order-file=%s' % order_file)
-  else:
-    # No ordering file, we randomize the output.
-    _LOGGER.info('Randomly reordering "%s"', executable)
-    cmd.append('--seed=%d' % _RANDOM_SEED)
-
-  return _Shell(*cmd)
-
-
-def main(options):
-  logging.basicConfig(level=logging.INFO)
-
-  # Make sure the destination directory exists.
-  if not os.path.isdir(options.destination_dir):
-    _LOGGER.info('Creating destination directory "%s".',
-                 options.destination_dir)
-    os.makedirs(options.destination_dir)
-
-  # Reorder the binaries into the destination directory.
-  _ReorderBinary(options.relinker,
-                 options.input_executable,
-                 options.input_symbol,
-                 options.destination_dir)
-
-
-def _ParseOptions():
-  option_parser = optparse.OptionParser()
-  option_parser.add_option('--input_executable',
-      help='The path to the input executable.')
-  option_parser.add_option('--input_symbol',
-      help='The path to the input symbol file.')
-  option_parser.add_option('--relinker', default=_DEFAULT_RELINKER,
-      help='Relinker exectuable to use, defaults to "%s"' % _DEFAULT_RELINKER)
-  option_parser.add_option('-d', '--destination_dir',
-      help='Destination directory for reordered files, defaults to '
-           'the subdirectory "reordered" in the output_dir.')
-  options, args = option_parser.parse_args()
-
-  if not options.input_executable:
-    option_parser.error('You must provide an input executable.')
-  if not options.input_symbol:
-    option_parser.error('You must provide an input symbol file.')
-
-  if not options.destination_dir:
-    options.destination_dir = os.path.join(options.output_dir, 'reordered')
-
-  return options
-
-
-if '__main__' == __name__:
-  sys.exit(main(_ParseOptions()))
diff --git a/build/win/syzygy/syzyasan-allocation-filter.txt b/build/win/syzygy/syzyasan-allocation-filter.txt
deleted file mode 100644
index 8dbf87b..0000000
--- a/build/win/syzygy/syzyasan-allocation-filter.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This file describes suspicious allocation sites that are to be treated
-// specially and served from the page heap. It is used at instrumentation time
-// to ensure allocations are runtime redirected from specified stack traces.
-//
-// See chrome_syzygy.gypi and instrument.py for more details.
-{
-  "hooks": {
-    "func": []
-  }
-}
diff --git a/build/win/syzygy/syzyasan-instrumentation-filter.txt b/build/win/syzygy/syzyasan-instrumentation-filter.txt
deleted file mode 100644
index 51af1bfc..0000000
--- a/build/win/syzygy/syzyasan-instrumentation-filter.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# This file describes filtering rules that will be applied when applying
-# Syzygy ASAN instrumentation to chrome.dll. It is intended to be used for
-# disabling instrumentation of functions with known and deferred bugs, allowing
-# functional instrumented builds of Chrome to be produced in the meantime.
-#
-# See chrome_syzygy.gypi and instrument.py for more details.
diff --git a/build/win/syzygy/syzygy.gni b/build/win/syzygy/syzygy.gni
deleted file mode 100644
index 1a45e86..0000000
--- a/build/win/syzygy/syzygy.gni
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-assert(is_win)
-
-# Where the output binaries will be placed.
-syzygy_dest_dir = "$root_out_dir/syzygy"
-
-# Instruments a binary with SyzyAsan.
-#
-#   binary_name (required)
-#     Name of the binary to be instrumented, with no extension or path. This
-#     binary_name is assumed to be in the output directory and must be
-#     generated by a dependency of this target.
-#
-#   dest_dir (required)
-#     The destination directory where the instrumented image should be
-#     written.
-#
-#   deps (required)
-#     Normal meaning.
-#
-#   public_deps
-#     Normal meaning.
-#
-#   data_deps
-#     Normal meaning.
-template("syzygy_asan") {
-  action(target_name) {
-    if (defined(invoker.visibility)) {
-      visibility = invoker.visibility
-    }
-    script = "//build/win/syzygy/instrument.py"
-
-    filter = "//build/win/syzygy/syzyasan-instrumentation-filter.txt"
-
-    binary_name = invoker.binary_name
-    dest_dir = invoker.dest_dir
-    input_image = "$root_out_dir/$binary_name"
-    input_pdb = "$root_out_dir/$binary_name.pdb"
-
-    inputs = [
-      filter,
-      input_image,
-
-      #input_pdb,
-    ]
-
-    output_filter = "$dest_dir/win-syzyasan-filter-$binary_name.txt.json"
-
-    outputs = [
-      "$dest_dir/$binary_name",
-      "$dest_dir/$binary_name.pdb",
-      output_filter,
-    ]
-
-    args = [
-      "--mode",
-      "asan",
-      "--input_executable",
-      rebase_path(input_image, root_build_dir),
-      "--input_symbol",
-      rebase_path(input_pdb, root_build_dir),
-      "--filter",
-      rebase_path(filter, root_build_dir),
-      "--output-filter-file",
-      rebase_path(output_filter, root_build_dir),
-      "--destination_dir",
-      rebase_path(dest_dir, root_build_dir),
-    ]
-
-    deps = [
-      "//build/win/syzygy:copy_syzyasan_binaries",
-    ]
-    if (defined(invoker.deps)) {
-      deps += invoker.deps
-    }
-    forward_variables_from(invoker,
-                           [
-                             "data_deps",
-                             "public_deps",
-                             "testonly",
-                           ])
-  }
-}
diff --git a/chrome/android/java/res/drawable/google_pay_with_divider.xml b/chrome/android/java/res/drawable/google_pay_with_divider.xml
new file mode 100644
index 0000000..e55173b
--- /dev/null
+++ b/chrome/android/java/res/drawable/google_pay_with_divider.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2018 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:targetApi="21"
+    android:viewportWidth="51"
+    android:viewportHeight="18"
+    android:width="51dp"
+    android:height="18dp">
+    <group
+        android:translateX="2"
+        android:translateY="2">
+        <path
+            android:pathData="M18.917431 7.8244571l0 4.6399999 -1.477064 0 0 -11.4587427 3.917431 0c0.944471 -0.0196613 1.857695 0.3374638 2.536697 0.992 0.686994 0.6158247 1.073338 1.497534 1.059633 2.4182857 0.01968 0.9258944 -0.367355 1.8141839 -1.059633 2.432 -0.685015 0.6509714 -1.530581 0.9761524 -2.536697 0.9755429l-2.440367 0 0 0.0009142zm0 -5.408l0 4 2.477064 0c0.5491 0.01622 1.079649 -0.198856 1.461468 -0.5924571 0.379503 -0.3676966 0.593614 -0.8727466 0.593614 -1.4002286 0 -0.527482 -0.214111 -1.0325319 -0.593614 -1.4002285 -0.377188 -0.4020603 -0.909383 -0.6234641 -1.461468 -0.608l-2.477064 0 0 0.0009142z"
+            android:fillColor="#5f6368" />
+        <path
+            android:pathData="M28.357798 4.3684571c1.091743 0 1.953517 0.2907429 2.585321 0.8722286 0.631804 0.5814857 0.947401 1.3787429 0.946789 2.3917714l0 4.8319999 -1.412844 0 0 -1.088 -0.06422 0c-0.611621 0.896 -1.425076 1.344 -2.440367 1.344 -0.866667 0 -1.591743 -0.256 -2.175229 -0.768 -0.567096 -0.475912 -0.888636 -1.181278 -0.87523 -1.92 0 -0.811276 0.307646 -1.456457 0.922936 -1.9355427 0.615291 -0.4790857 1.436697 -0.7192381 2.46422 -0.7204572 0.877065 0 1.599389 0.16 2.166973 0.48l0 -0.3364571c0.0034 -0.5035772 -0.220635 -0.9819784 -0.610092 -1.3028571 -0.3906 -0.3511973 -0.899646 -0.5428227 -1.425688 -0.5366858 -0.825077 0 -1.477982 0.3468191 -1.958716 1.0404572L25.180734 5.9044571c0.715596 -1.024 1.774618 -1.536 3.177064 -1.536zm-1.911009 5.6959999c-0.002 0.380106 0.180494 0.737732 0.489908 0.96 0.326677 0.256087 0.732147 0.391749 1.147707 0.384 0.623298 -0.001 1.220764 -0.248279 1.661468 -0.687543 0.489296 -0.458971 0.733944 -0.9974854 0.733944 -1.6155426C30.019266 8.7396571 29.377064 8.5568 28.553211 8.5568c-0.6 0 -1.100306 0.1441524 -1.500917 0.4324571 -0.404588 0.2925715 -0.605505 0.6482286 -0.605505 1.0751999z"
+            android:fillColor="#5f6368" />
+        <path
+            android:pathData="M33.73578 4.6244571l2.344036 5.6319999 0.03211 0 2.279816 -5.6319999 1.608257 0 -4.93211 11.2959999 -1.524771 0 1.830276 -3.952457 -3.24312 -7.3435429z"
+            android:fillColor="#5f6368" />
+        <path
+            android:pathData="M12.948624 6.8242286c0.000557 -0.4485925 -0.0375 -0.8964058 -0.113762 -1.3385143l-6.2293574 0 0 2.5353143 3.5678904 0C10.025863 8.8392705 9.5492873 9.5619224 8.8541284 10.021486l0 1.645714 2.1293576 0c1.246789 -1.1456 1.965138 -2.8397714 1.965138 -4.8429714z"
+            android:fillColor="#4285f4" />
+        <path
+            android:pathData="M6.6055046 13.257143c1.7825688 0 3.2834862 -0.583314 4.3779814 -1.589029L8.8541284 10.0224c-0.5926605 0.400457 -1.3559633 0.629029 -2.2486238 0.629029 -1.7229358 0 -3.1853211 -1.1574861 -3.7082569 -2.7172576l-2.19357797 0 0 1.696C1.8249118 11.853675 4.1084606 13.257029 6.6055046 13.257143Z"
+            android:fillColor="#34a853" />
+        <path
+            android:pathData="M2.8972477 7.9341714c-0.2764574 -0.8173308 -0.2764574 -1.7024406 0 -2.5197714l0 -1.696 -2.19357797 0c-0.93782491 1.8597741 -0.93782491 4.0519973 0 5.9117714l2.19357797 -1.696z"
+            android:fillColor="#fabb05" />
+        <path
+            android:pathData="M6.6055046 2.6971429C7.5475115 2.6818057 8.4577402 3.036504 9.1394495 3.6845714L11.024771 1.8057143C9.8292808 0.68669789 8.2455222 0.07233914 6.6055046 0.09142857 4.1084606 0.09154199 1.8249118 1.4948964 0.70366973 3.7184L2.8972477 5.4144C3.4201835 3.8546286 4.8825688 2.6971429 6.6055046 2.6971429Z"
+            android:fillColor="#e94235" />
+    </group>
+    <path
+        android:pathData="M50 16l0 -14 1 0 0 14z"
+        android:fillColor="#000000"
+        android:fillAlpha="0.3800002" />
+</vector>
diff --git a/chrome/android/java/res/drawable/toolbar_handle_dark.xml b/chrome/android/java/res/drawable/toolbar_handle_dark.xml
deleted file mode 100644
index 7dd86d8a..0000000
--- a/chrome/android/java/res/drawable/toolbar_handle_dark.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2017 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file. -->
-
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle" >
-    <solid android:color="@color/black_alpha_40" />
-    <size
-        android:width="@dimen/toolbar_handle_width"
-        android:height="@dimen/toolbar_handle_height" />
-    <corners android:radius="@dimen/toolbar_handle_corner_radius" />
-</shape>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/bottom_control_container.xml b/chrome/android/java/res/layout/bottom_control_container.xml
index 1bbd97ce..6800b69 100644
--- a/chrome/android/java/res/layout/bottom_control_container.xml
+++ b/chrome/android/java/res/layout/bottom_control_container.xml
@@ -21,7 +21,7 @@
         android:id="@+id/control_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:minHeight="@dimen/bottom_control_container_height" >
+        android:minHeight="@dimen/bottom_control_container_peek_height" >
 
         <view
             class="org.chromium.chrome.browser.toolbar.ToolbarControlContainer$ToolbarViewResourceFrameLayout"
@@ -42,7 +42,7 @@
                 class="org.chromium.chrome.browser.widget.bottomsheet.TouchRestrictingFrameLayout"
                 android:id="@+id/toolbar_holder"
                 android:layout_width="match_parent"
-                android:layout_height="@dimen/bottom_control_container_height"
+                android:layout_height="@dimen/bottom_control_container_peek_height"
                 android:layout_marginTop="@dimen/toolbar_shadow_height" >
 
                 <ViewStub
@@ -65,7 +65,7 @@
                 android:inflatedId="@+id/find_toolbar"
                 android:layout_marginTop="@dimen/toolbar_shadow_height"
                 android:layout_width="match_parent"
-                android:layout_height="@dimen/bottom_control_container_height"
+                android:layout_height="@dimen/bottom_control_container_peek_height"
                 android:layout="@layout/find_toolbar" />
 
         </view>
diff --git a/chrome/android/java/res/layout/bottom_sheet.xml b/chrome/android/java/res/layout/bottom_sheet.xml
index 6c7251a..b1eeff1a 100644
--- a/chrome/android/java/res/layout/bottom_sheet.xml
+++ b/chrome/android/java/res/layout/bottom_sheet.xml
@@ -20,7 +20,7 @@
         android:id="@+id/bottom_sheet_control_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:minHeight="@dimen/bottom_control_container_height" >
+        android:minHeight="@dimen/bottom_control_container_peek_height" >
 
         <ImageView
             android:id="@+id/bottom_sheet_toolbar_top_shadow"
@@ -35,24 +35,14 @@
             class="org.chromium.chrome.browser.widget.bottomsheet.TouchRestrictingFrameLayout"
             android:id="@+id/bottom_sheet_toolbar_container"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/bottom_control_container_height"
+            android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/toolbar_shadow_height" >
 
             <View
                 android:id="@+id/bottom_sheet_toolbar"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:background="@color/modern_primary_color" >
-            </View>
-
-            <ImageView
-                android:id="@+id/toolbar_handle"
-                android:src="@drawable/toolbar_handle_dark"
-                android:layout_width="@dimen/toolbar_handle_width"
-                android:layout_height="@dimen/toolbar_handle_height"
-                android:layout_gravity="center"
-                android:contentDescription="@null" />
-
+                android:background="@color/modern_primary_color" />
         </view>
 
     </FrameLayout>
diff --git a/chrome/android/java/res/layout/contextual_suggestions_layout.xml b/chrome/android/java/res/layout/contextual_suggestions_layout.xml
index 1d5c540..b0b7088e 100644
--- a/chrome/android/java/res/layout/contextual_suggestions_layout.xml
+++ b/chrome/android/java/res/layout/contextual_suggestions_layout.xml
@@ -8,5 +8,5 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:scrollbars="vertical"
-    android:paddingTop="@dimen/contextual_suggestions_expanded_toolbar_height"
+    android:paddingTop="@dimen/bottom_control_container_peek_height"
     android:background="@android:color/white" />
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml b/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml
index 8a12e6ae..dc470a5a 100644
--- a/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml
+++ b/chrome/android/java/res/layout/contextual_suggestions_toolbar.xml
@@ -6,40 +6,55 @@
 <org.chromium.chrome.browser.contextual_suggestions.ToolbarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
-    android:background="@android:color/white" >
+    android:layout_height="wrap_content"
+    android:orientation="vertical" >
 
-    <!-- Use 48dp width and 16dp end/start padding to produce a 16dp, centered icon. -->
-    <ImageView
-        android:layout_height="match_parent"
-        android:layout_width="48dp"
-        android:src="@drawable/ic_logo_googleg_24dp"
-        android:scaleType="centerInside"
-        android:paddingStart="16dp"
-        android:paddingEnd="16dp"
-        android:contentDescription="@null" />
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/bottom_control_container_peek_height"
+        android:orientation="horizontal"
+        android:gravity="center_vertical"
+        android:background="@android:color/white" >
 
-     <TextView
-         android:id="@+id/title"
-         android:layout_height="wrap_content"
-         android:layout_width="0dp"
-         android:layout_weight="1"
-         android:gravity="center"
-         android:singleLine="true"
-         android:ellipsize="end"
-         android:textAppearance="@style/BlackBodyDefault" />
+        <!-- Use 48dp width and 16dp end/start padding to produce a 16dp, centered icon. -->
+        <ImageView
+            android:layout_height="match_parent"
+            android:layout_width="48dp"
+            android:src="@drawable/ic_logo_googleg_24dp"
+            android:scaleType="centerInside"
+            android:paddingStart="16dp"
+            android:paddingEnd="16dp"
+            android:contentDescription="@null" />
 
-    <!-- Use 50dp width and 16dp end/start padding to produce an 18dp, centered icon. -->
-    <ImageView
-        android:id="@+id/close_button"
-        android:layout_height="match_parent"
-        android:layout_width="50dp"
-        android:src="@drawable/btn_close"
-        android:scaleType="centerInside"
-        android:paddingStart="16dp"
-        android:paddingEnd="16dp"
-        android:contentDescription="@string/close" />
+         <TextView
+             android:id="@+id/title"
+             android:layout_height="wrap_content"
+             android:layout_width="0dp"
+             android:layout_weight="1"
+             android:gravity="center"
+             android:singleLine="true"
+             android:ellipsize="end"
+             android:textAppearance="@style/BlackBodyDefault" />
+
+        <!-- Use 50dp width and 16dp end/start padding to produce an 18dp, centered icon. -->
+        <ImageView
+            android:id="@+id/close_button"
+            android:layout_height="match_parent"
+            android:layout_width="50dp"
+            android:src="@drawable/btn_close"
+            android:scaleType="centerInside"
+            android:paddingStart="16dp"
+            android:paddingEnd="16dp"
+            android:contentDescription="@string/close" />
+   </LinearLayout>
+
+   <ImageView
+        android:id="@+id/shadow"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/toolbar_shadow_height"
+        android:src="@drawable/modern_toolbar_shadow"
+        android:scaleType="fitXY"
+        android:contentDescription="@null"
+        android:visibility="gone" />
 
 </org.chromium.chrome.browser.contextual_suggestions.ToolbarView>
\ No newline at end of file
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index aa21577..01cb745 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -208,7 +208,7 @@
     <!-- Full Screen Dimensions -->
     <!-- Should match toolbar_height_no_shadow -->
     <dimen name="control_container_height">56dp</dimen>
-    <dimen name="bottom_control_container_height">40dp</dimen>
+    <dimen name="bottom_control_container_peek_height">40dp</dimen>
     <dimen name="custom_tabs_control_container_height">56dp</dimen>
     <dimen name="fullscreen_activity_control_container_height">0dp</dimen>
 
@@ -253,7 +253,6 @@
     <dimen name="toolbar_button_width">48dp</dimen>
     <dimen name="toolbar_handle_height">3dp</dimen>
     <dimen name="toolbar_handle_width">20dp</dimen>
-    <dimen name="toolbar_handle_corner_radius">1.5dp</dimen>
     <dimen name="toolbar_handle_margin_top">12dp</dimen>
 
     <dimen name="toolbar_edge_padding">8dp</dimen>
@@ -550,7 +549,4 @@
     <item type="dimen" name="dialog_fixed_width_minor">100%</item>
     <item type="dimen" name="dialog_fixed_height_major">100%</item>
     <item type="dimen" name="dialog_fixed_height_minor">100%</item>
-
-    <!-- Contextual suggestions dimensions -->
-    <dimen name="contextual_suggestions_expanded_toolbar_height">56dp</dimen>
 </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BasicNativePage.java b/chrome/android/java/src/org/chromium/chrome/browser/BasicNativePage.java
index db18cbc..61b810ff 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/BasicNativePage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/BasicNativePage.java
@@ -41,7 +41,7 @@
         int bottomMargin = 0;
         if (activity instanceof ChromeActivity
                 && ((ChromeActivity) activity).getBottomSheet() != null) {
-            bottomMargin = res.getDimensionPixelSize(R.dimen.bottom_control_container_height);
+            bottomMargin = res.getDimensionPixelSize(R.dimen.bottom_control_container_peek_height);
         } else {
             topMargin = res.getDimensionPixelSize(R.dimen.tab_strip_height)
                     + res.getDimensionPixelSize(R.dimen.toolbar_height_no_shadow);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index f66f59a..a95d5cdc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -1271,10 +1271,11 @@
                     getCompositorViewHolder().getLayoutManager(), mFadingBackgroundView,
                     mBottomSheet);
 
-            mFadingBackgroundView.addObserver(mBottomSheet);
-
-            mContextualSuggestionsCoordinator = new ContextualSuggestionsCoordinator(
-                    this, mBottomSheetController, getTabModelSelector());
+            if (ChromeFeatureList.isEnabled(
+                        ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_BOTTOM_SHEET)) {
+                mContextualSuggestionsCoordinator = new ContextualSuggestionsCoordinator(
+                        this, mBottomSheetController, getTabModelSelector());
+            }
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java
index a6dd8a6..7fa2a986 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java
@@ -5,6 +5,8 @@
 package org.chromium.chrome.browser.contextual_suggestions;
 
 import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.RecyclerView.OnScrollListener;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -63,6 +65,15 @@
 
         mModelChangeProcessor = new RecyclerViewModelChangeProcessor<>(adapter);
         mModel.mClusterListObservable.addObserver(mModelChangeProcessor);
+
+        // TODO(twellington): Should this be a proper model property, set by the mediator and bound
+        // to the RecyclerView?
+        mRecyclerView.addOnScrollListener(new OnScrollListener() {
+            @Override
+            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+                mModel.setToolbarShadowVisibility(mRecyclerView.canScrollVertically(-1));
+            }
+        });
     }
 
     /** @return The content {@link View}. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsBridge.java
index b0ccf7f..4793574d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsBridge.java
@@ -39,6 +39,17 @@
         mNativeContextualSuggestionsBridge = 0;
     }
 
+    /**
+     * Fetches suggestions for a given URL.
+     * @param url URL for which to fetch suggestions.
+     * @param callback Callback used to return suggestions for a given URL.
+     */
+    public void fetchSuggestions(
+            String url, Callback<List<ContextualSuggestionsCluster>> callback) {
+        assert mNativeContextualSuggestionsBridge != 0;
+        nativeFetchSuggestions(mNativeContextualSuggestionsBridge, url, callback);
+    }
+
     /** Fetches a thumbnail for the suggestion. */
     public void fetchSuggestionImage(SnippetArticle suggestion, Callback<Bitmap> callback) {
         assert mNativeContextualSuggestionsBridge != 0;
@@ -53,6 +64,12 @@
                 mNativeContextualSuggestionsBridge, suggestion.mIdWithinCategory, callback);
     }
 
+    /** Requests the backend to clear state related to this bridge. */
+    public void clearState() {
+        assert mNativeContextualSuggestionsBridge != 0;
+        nativeClearState(mNativeContextualSuggestionsBridge);
+    }
+
     /**
      * Reports an event happening in the context of the current URL.
      *
@@ -86,21 +103,14 @@
                         thumbnailDominantColor == 0 ? null : thumbnailDominantColor));
     }
 
-    @CalledByNative
-    private void onSuggestionsAvailable(List<ContextualSuggestionsCluster> clusters) {
-        // Pass this to UI (could be through observer).
-    }
-
-    @CalledByNative
-    private void onStateCleared() {
-        // Pass this to UI (could be through observer).
-    }
-
     private native long nativeInit(Profile profile);
     private native void nativeDestroy(long nativeContextualSuggestionsBridge);
+    private native void nativeFetchSuggestions(long nativeContextualSuggestionsBridge, String url,
+            Callback<List<ContextualSuggestionsCluster>> callback);
     private native void nativeFetchSuggestionImage(
             long nativeContextualSuggestionsBridge, String suggestionId, Callback<Bitmap> callback);
     private native void nativeFetchSuggestionFavicon(
             long nativeContextualSuggestionsBridge, String suggestionId, Callback<Bitmap> callback);
+    private native void nativeClearState(long nativeContextualSuggestionsBridge);
     private native void nativeReportEvent(long nativeContextualSuggestionsBridge, int eventId);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsCoordinator.java
index 1962861..ed51f6f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsCoordinator.java
@@ -49,8 +49,8 @@
         mProfile = Profile.getLastUsedProfile().getOriginalProfile();
 
         mModel = new ContextualSuggestionsModel();
-        mMediator = new ContextualSuggestionsMediator(
-                mActivity, mProfile, tabModelSelector, this, mModel);
+        mMediator = new ContextualSuggestionsMediator(mActivity, mProfile, tabModelSelector,
+                activity.getFullscreenManager(), this, mModel);
 
         SuggestionsSource suggestionsSource = mMediator.getSuggestionsSource();
         SuggestionsNavigationDelegate navigationDelegate = new SuggestionsNavigationDelegateImpl(
@@ -71,9 +71,10 @@
     }
 
     /**
-     * Displays contextual suggestions in the {@link BottomSheet}.
+     * Preload the contextual suggestions in the {@link BottomSheet}; content won't actually be
+     * shown until {@link #showSuggestions()} is called.
      */
-    void displaySuggestions() {
+    void preloadSuggestionsInSheet() {
         // TODO(twellington): Introduce another method that creates bottom sheet content with only
         // a toolbar view when suggestions are fist available, and use this method to construct the
         // content view when the sheet is opened.
@@ -84,7 +85,21 @@
                 mActivity.getWindowAndroid(), mActivity::closeContextMenu);
         mBottomSheetContent = new ContextualSuggestionsBottomSheetContent(
                 mContentCoordinator, mToolbarCoordinator);
-        mBottomSheetController.requestShowContent(mBottomSheetContent, true);
+        // TODO(twellington): Handle the case where preload returns false.
+        mBottomSheetController.requestContentPreload(mBottomSheetContent);
+    }
+
+    /**
+     * Show the contextual suggestions in the {@link BottomSheet}.
+     * {@link #preloadSuggestionsInSheet()} must be called prior to calling this method.
+     */
+    void showSuggestions() {
+        // #preloadSuggestionsInSheet will always be called before this method, regardless of
+        // whether content was actually put in the sheet (meaning mBottomSheetContent should never
+        // be null). If content is not successfully preloaded
+        // BottomSheetController#requestContentPreload will return false.
+        assert mBottomSheetContent != null;
+        mBottomSheetController.requestShowContent(mBottomSheetContent, false);
     }
 
     /** Removes contextual suggestions from the {@link BottomSheet}. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsMediator.java
index 2b00648..9c7ca7a1b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsMediator.java
@@ -10,11 +10,14 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
+import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager.FullscreenListener;
 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge;
 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.util.MathUtils;
 import org.chromium.ui.widget.Toast;
 
 import java.util.ArrayList;
@@ -32,6 +35,9 @@
     private final ContextualSuggestionsModel mModel;
     private final SnippetsBridge mBridge;
     private final FetchHelper mFetchHelper;
+    private final ChromeFullscreenManager mFullscreenManager;
+
+    private boolean mDidSuggestionsShowForTab;
 
     @Nullable
     private String mCurrentRequestUrl;
@@ -41,18 +47,45 @@
      * @param context The {@link Context} used to retrieve resources.
      * @param profile The regular {@link Profile}.
      * @param tabModelSelector The {@link TabModelSelector} for the containing activity.
+     * @param fullscreenManager The {@link ChromeFullscreenManager} to listen for browser controls
+     *                          events.
      * @param coordinator The {@link ContextualSuggestionsCoordinator} for the component.
      * @param model The {@link ContextualSuggestionsModel} for the component.
      */
     ContextualSuggestionsMediator(Context context, Profile profile,
-            TabModelSelector tabModelSelector, ContextualSuggestionsCoordinator coordinator,
-            ContextualSuggestionsModel model) {
+            TabModelSelector tabModelSelector, ChromeFullscreenManager fullscreenManager,
+            ContextualSuggestionsCoordinator coordinator, ContextualSuggestionsModel model) {
         mContext = context;
         mCoordinator = coordinator;
         mModel = model;
+        mFullscreenManager = fullscreenManager;
 
         mBridge = new SnippetsBridge(Profile.getLastUsedProfile());
         mFetchHelper = new FetchHelper(this, tabModelSelector);
+
+        fullscreenManager.addListener(new FullscreenListener() {
+            @Override
+            public void onContentOffsetChanged(float offset) {}
+
+            @Override
+            public void onControlsOffsetChanged(
+                    float topOffset, float bottomOffset, boolean needsAnimate) {
+                // When the controls scroll completely off-screen, the suggestions are "shown" but
+                // remain hidden since their offset from the bottom of the screen is determined by
+                // the top controls.
+                if (!mDidSuggestionsShowForTab && mModel.hasSuggestions()
+                        && areBrowserControlsHidden()) {
+                    mDidSuggestionsShowForTab = true;
+                    mCoordinator.showSuggestions();
+                }
+            }
+
+            @Override
+            public void onToggleOverlayVideoMode(boolean enabled) {}
+
+            @Override
+            public void onBottomControlsHeightChanged(int bottomControlsHeight) {}
+        });
     }
 
     /**
@@ -70,10 +103,17 @@
         mFetchHelper.destroy();
     }
 
+    /**
+     * @return Whether the browser controls are currently completely hidden.
+     */
+    private boolean areBrowserControlsHidden() {
+        return MathUtils.areFloatsEqual(-mFullscreenManager.getTopControlOffset(),
+                mFullscreenManager.getTopControlsHeight());
+    }
+
     @Override
     public void requestSuggestions(String url) {
         mCurrentRequestUrl = url;
-
         mBridge.fetchContextualSuggestions(url, (suggestions) -> {
             // Avoiding double fetches causing suggestions for incorrect context.
             if (!TextUtils.equals(url, mCurrentRequestUrl)) return;
@@ -83,7 +123,10 @@
                     .show();
 
             if (suggestions.size() > 0) {
-                displaySuggestions(generateClusterList(suggestions), suggestions.get(0).mTitle);
+                preloadSuggestions(generateClusterList(suggestions), suggestions.get(0).mTitle);
+                // If the controls are already off-screen, show the suggestions immediately so they
+                // are available on reverse scroll.
+                if (areBrowserControlsHidden()) mCoordinator.showSuggestions();
             }
         });
     }
@@ -95,6 +138,7 @@
 
     private void clearSuggestions() {
         // TODO(twellington): Does this signal need to go back to FetchHelper?
+        mDidSuggestionsShowForTab = false;
         mModel.setClusterList(new ClusterList(Collections.emptyList()));
         mModel.setCloseButtonOnClickListener(null);
         mModel.setTitle(null);
@@ -102,11 +146,11 @@
         mCurrentRequestUrl = "";
     }
 
-    private void displaySuggestions(ClusterList clusters, String title) {
+    private void preloadSuggestions(ClusterList clusters, String title) {
         mModel.setClusterList(clusters);
         mModel.setCloseButtonOnClickListener(view -> { clearSuggestions(); });
         mModel.setTitle(mContext.getString(R.string.contextual_suggestions_toolbar_title, title));
-        mCoordinator.displaySuggestions();
+        mCoordinator.preloadSuggestionsInSheet();
     }
 
     // TODO(twellington): Remove after clusters are returned from the backend.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java
index de74352..c6e4cea 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsModel.java
@@ -36,6 +36,7 @@
     ClusterListObservable mClusterListObservable = new ClusterListObservable();
     private OnClickListener mCloseButtonOnClickListener;
     private String mTitle;
+    private boolean mToolbarShadowVisibility;
 
     /** @param suggestions The current list of clusters. */
     void setClusterList(ClusterList clusterList) {
@@ -68,4 +69,22 @@
     String getTitle() {
         return mTitle;
     }
+
+    /**
+     * @return Whether there are any suggestions to be shown.
+     */
+    boolean hasSuggestions() {
+        return getClusterList().getItemCount() > 0;
+    }
+
+    /** @param visible Whether the toolbar shadow should be visible. */
+    void setToolbarShadowVisibility(boolean visible) {
+        mToolbarShadowVisibility = visible;
+        notifyPropertyChanged(new PropertyKey(PropertyKey.TOOLBAR_SHADOW_VISIBILITY));
+    }
+
+    /** @return Whether the toolbar shadow should be visible. */
+    boolean getToolbarShadowVisibility() {
+        return mToolbarShadowVisibility;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/PropertyKey.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/PropertyKey.java
index 0eb5226..1d91af3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/PropertyKey.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/PropertyKey.java
@@ -14,11 +14,12 @@
  */
 class PropertyKey {
     /** The unique identifiers for properties held in the model. */
-    @IntDef({CLOSE_BUTTON_ON_CLICK_LISTENER, TITLE})
+    @IntDef({CLOSE_BUTTON_ON_CLICK_LISTENER, TITLE, TOOLBAR_SHADOW_VISIBILITY})
     @Retention(RetentionPolicy.SOURCE)
     @interface Key {}
     static final int CLOSE_BUTTON_ON_CLICK_LISTENER = 0;
     static final int TITLE = 1;
+    static final int TOOLBAR_SHADOW_VISIBILITY = 2;
 
     @Key
     Integer mKey;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarModelChangeProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarModelChangeProcessor.java
index 64d17c15..939c070f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarModelChangeProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarModelChangeProcessor.java
@@ -30,6 +30,9 @@
                 case PropertyKey.TITLE:
                     view.setTitle(model.getTitle());
                     break;
+                case PropertyKey.TOOLBAR_SHADOW_VISIBILITY:
+                    view.setShadowVisibility(model.getToolbarShadowVisibility());
+                    break;
                 default:
                     assert false;
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarView.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarView.java
index 970e8fa..45e654a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ToolbarView.java
@@ -16,6 +16,7 @@
 public class ToolbarView extends LinearLayout {
     private View mCloseButton;
     private TextView mTitle;
+    private View mShadow;
 
     public ToolbarView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -27,6 +28,7 @@
 
         mCloseButton = findViewById(R.id.close_button);
         mTitle = (TextView) findViewById(R.id.title);
+        mShadow = findViewById(R.id.shadow);
     }
 
     void setCloseButtonOnClickListener(OnClickListener listener) {
@@ -36,4 +38,8 @@
     void setTitle(String title) {
         mTitle.setText(title);
     }
+
+    void setShadowVisibility(boolean visible) {
+        mShadow.setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java
index 151a58d..1df47e5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java
@@ -11,7 +11,9 @@
 import android.view.View;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ResourceId;
+import org.chromium.ui.UiUtils;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -80,6 +82,9 @@
 
     private final long mNativeAutofillSaveCardInfoBar;
     private final List<CardDetail> mCardDetails = new ArrayList<>();
+    private int mBrandIconId = -1;
+    private String mTitleText;
+    private String mDescriptionText;
     private final LinkedList<LegalMessageLine> mLegalMessageLines =
             new LinkedList<LegalMessageLine>();
 
@@ -141,6 +146,36 @@
     }
 
     /**
+     * Sets description line to the infobar.
+     *
+     * @param text description line text.
+     */
+    @CalledByNative
+    private void setDescriptionText(String text) {
+        mDescriptionText = text;
+    }
+
+    /**
+     * Sets title text to the infobar.
+     *
+     * @param text Title text.
+     */
+    @CalledByNative
+    private void setTitleText(String text) {
+        mTitleText = text;
+    }
+
+    /**
+     * Sets Branding icon id to the infobar.
+     *
+     * @param enumeratedIconId ID corresponding to the Google Pay branding.
+     */
+    @CalledByNative
+    private void setBrandIconId(int enumeratedIconId) {
+        mBrandIconId = ResourceId.mapToDrawableId(enumeratedIconId);
+    }
+
+    /**
      * Adds a line of legal message plain text to the infobar.
      *
      * @param text The legal message plain text.
@@ -162,13 +197,30 @@
         mLegalMessageLines.getLast().links.add(new LegalMessageLine.Link(start, end, url));
     }
 
+    /**
+     * Whether Google Pay branding enabled or not.
+     */
+    private boolean isGooglePayBrandingEnabled() {
+        return mBrandIconId != -1;
+    }
+
     @Override
     public void createContent(InfoBarLayout layout) {
         super.createContent(layout);
+        if (isGooglePayBrandingEnabled()) {
+            UiUtils.removeViewFromParent(layout.getMessageTextView());
+            layout.getMessageLayout().addIconTitle(mBrandIconId, mTitleText);
+        }
         InfoBarControlLayout control = layout.addControlLayout();
+        // Description text can be empty to simplify the prompt in future Finch
+        // experiments.
+        if (isGooglePayBrandingEnabled() && !mDescriptionText.isEmpty()) {
+            control.addDescription(mDescriptionText);
+        }
         for (int i = 0; i < mCardDetails.size(); i++) {
             CardDetail detail = mCardDetails.get(i);
-            control.addIcon(detail.issuerIconDrawableId, 0, detail.label, detail.subLabel);
+            control.addIcon(detail.issuerIconDrawableId, 0, detail.label, detail.subLabel,
+                    R.dimen.infobar_descriptive_text_size);
         }
 
         for (LegalMessageLine line : mLegalMessageLines) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java
index afc1b9d..8aeb526 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java
@@ -35,7 +35,7 @@
     @Override
     public void createContent(InfoBarLayout layout) {
         setButtons(layout, mPrimaryButtonText, mSecondaryButtonText);
-        if (mLinkText != null) layout.appendMessageLinkText(mLinkText);
+        if (mLinkText != null && !mLinkText.isEmpty()) layout.appendMessageLinkText(mLinkText);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java
index 5449510a..2132266ff 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java
@@ -11,6 +11,7 @@
 import android.support.v7.widget.SwitchCompat;
 import android.text.method.LinkMovementMethod;
 import android.util.AttributeSet;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -291,6 +292,34 @@
     }
 
     /**
+     * Adds an icon with a descriptive message to the Title.
+     *
+     * -----------------------------------------------------
+     * | ICON | TITLE MESSAGE                              |
+     * -----------------------------------------------------
+     * If an icon is not provided, the ImageView that would normally show it is hidden.
+     *
+     * @param iconResourceId   ID of the drawable to use for the icon.
+     * @param titleMessage     Message to display on Infobar title.
+     */
+    public View addIconTitle(int iconResourceId, CharSequence titleMessage) {
+        LinearLayout layout =
+                (LinearLayout) LayoutInflater.from(getContext())
+                        .inflate(R.layout.infobar_control_icon_with_description, this, false);
+        addView(layout, new ControlLayoutParams());
+
+        ImageView iconView = (ImageView) layout.findViewById(R.id.control_icon);
+        iconView.setImageResource(iconResourceId);
+
+        TextView titleView = (TextView) layout.findViewById(R.id.control_message);
+        titleView.setText(titleMessage);
+        titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                getContext().getResources().getDimension(R.dimen.infobar_text_size));
+
+        return layout;
+    }
+
+    /**
      * Adds an icon with a descriptive message to the layout.
      *
      * -----------------------------------------------------
@@ -305,6 +334,27 @@
      */
     public View addIcon(int iconResourceId, int iconColorId, CharSequence primaryMessage,
             CharSequence secondaryMessage) {
+        return addIcon(iconResourceId, iconColorId, primaryMessage, secondaryMessage,
+                R.dimen.infobar_text_size);
+    }
+
+    /**
+     * Adds an icon with a descriptive message to the layout.
+     *
+     * -----------------------------------------------------
+     * | ICON | PRIMARY MESSAGE SECONDARY MESSAGE          |
+     * -----------------------------------------------------
+     * If an icon is not provided, the ImageView that would normally show it is hidden.
+     *
+     * @param iconResourceId   ID of the drawable to use for the icon.
+     * @param iconColorId      ID of the tint color for the icon, or 0 for default.
+     * @param primaryMessage   Message to display for the toggle.
+     * @param secondaryMessage Additional descriptive text for the toggle.  May be null.
+     * @param resourceId       Size of resource id to be applied to primaryMessage
+     *                         and secondaryMessage.
+     */
+    public View addIcon(int iconResourceId, int iconColorId, CharSequence primaryMessage,
+            CharSequence secondaryMessage, int resourceId) {
         LinearLayout layout = (LinearLayout) LayoutInflater.from(getContext()).inflate(
                 R.layout.infobar_control_icon_with_description, this, false);
         addView(layout, new ControlLayoutParams());
@@ -318,6 +368,8 @@
         // The primary message text is always displayed.
         TextView primaryView = (TextView) layout.findViewById(R.id.control_message);
         primaryView.setText(primaryMessage);
+        primaryView.setTextSize(
+                TypedValue.COMPLEX_UNIT_PX, getContext().getResources().getDimension(resourceId));
 
         // The secondary message text is optional.
         TextView secondaryView =
@@ -326,6 +378,8 @@
             layout.removeView(secondaryView);
         } else {
             secondaryView.setText(secondaryMessage);
+            secondaryView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                    getContext().getResources().getDimension(resourceId));
         }
 
         return layout;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
index f6ebde3..4a9c484c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
@@ -549,6 +549,7 @@
             @Override
             public void onLargeIconAvailable(
                     Bitmap icon, int fallbackColor, boolean isFallbackColorDefault, int iconType) {
+                if (isNotificationHiddingOrHidden()) return;
                 if (icon == null) {
                     // If we do not have any favicon then make sure we show default sound icon. This
                     // icon is used by notification manager only if we do not show any icon.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java
index 12389e7..2baee986 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java
@@ -114,7 +114,7 @@
             ApiCompatibilityUtils.setPaddingRelative(recentTabsRoot,
                     ApiCompatibilityUtils.getPaddingStart(recentTabsRoot), 0,
                     ApiCompatibilityUtils.getPaddingEnd(recentTabsRoot),
-                    resources.getDimensionPixelSize(R.dimen.bottom_control_container_height));
+                    resources.getDimensionPixelSize(R.dimen.bottom_control_container_peek_height));
         }
 
         onUpdated();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
index f3536df..f9bbc4ed 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
@@ -711,6 +711,16 @@
     }
 
     /**
+     * Tries to acquire the storage access permssion if not yet.
+     *
+     * @param webContents Contents of the page to check.
+     * @param callback Callback to notify the result.
+     */
+    public void acquireFileAccessPermission(WebContents webContents, Callback<Boolean> callback) {
+        nativeAcquireFileAccessPermission(mNativeOfflinePageBridge, webContents, callback);
+    }
+
+    /**
      * Allows setting the offline bookmarks feature as enabled or disabled for testing. This is
      * required for tests that don't load the native binary otherwise UnsatisfiedLinkError sadness
      * will occur.
@@ -860,4 +870,6 @@
             long nativeOfflinePageBridge, WebContents webContents);
     private native void nativeGetLoadUrlParamsForOpeningMhtmlFileOrContent(
             long nativeOfflinePageBridge, String url, Callback<LoadUrlParams> callback);
+    private native void nativeAcquireFileAccessPermission(
+            long nativeOfflinePageBridge, WebContents webContents, Callback<Boolean> callback);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index 3dd4a1d8..595d3b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -367,37 +367,46 @@
             return false;
         }
 
-        OfflinePageItem offlinePage = offlinePageBridge.getOfflinePage(tab.getWebContents());
+        WebContents webContents = tab.getWebContents();
+        if (webContents == null) return false;
+
+        OfflinePageItem offlinePage = offlinePageBridge.getOfflinePage(webContents);
         String offlinePath = offlinePage.getFilePath();
 
         final String pageUrl = tab.getUrl();
 
         if (!isOfflinePageShareable(offlinePageBridge, offlinePage, pageUrl)) return false;
 
-        final String tabTitle = tab.getTitle();
-        final File offlinePageFile = new File(offlinePath);
-        AsyncTask<Void, Void, Uri> task = new AsyncTask<Void, Void, Uri>() {
-            @Override
-            protected Uri doInBackground(Void... v) {
-                // If we have a content or file URI, we will not have a filename, just return the
-                // URI.
-                if (offlinePath.isEmpty()) {
-                    Uri uri = Uri.parse(pageUrl);
-                    assert(isSchemeContentOrFile(uri));
-                    return uri;
+        // The file access permission is needed since we may need to publish the archive file
+        // if it resides in internal directory.
+        offlinePageBridge.acquireFileAccessPermission(webContents, (granted) -> {
+            if (!granted) return;
+
+            final String tabTitle = tab.getTitle();
+            final File offlinePageFile = new File(offlinePath);
+            AsyncTask<Void, Void, Uri> task = new AsyncTask<Void, Void, Uri>() {
+                @Override
+                protected Uri doInBackground(Void... v) {
+                    // If we have a content or file URI, we will not have a filename, just return
+                    // the URI.
+                    if (offlinePath.isEmpty()) {
+                        Uri uri = Uri.parse(pageUrl);
+                        assert(isSchemeContentOrFile(uri));
+                        return uri;
+                    }
+                    return ChromeFileProvider.generateUri(activity, offlinePageFile);
                 }
-                return ChromeFileProvider.generateUri(activity, offlinePageFile);
-            }
-            @Override
-            protected void onPostExecute(Uri uri) {
-                ShareParams shareParams = new ShareParams.Builder(activity, tabTitle, pageUrl)
-                                                  .setShareDirectly(false)
-                                                  .setOfflineUri(uri)
-                                                  .build();
-                shareCallback.onResult(shareParams);
-            }
-        };
-        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+                @Override
+                protected void onPostExecute(Uri uri) {
+                    ShareParams shareParams = new ShareParams.Builder(activity, tabTitle, pageUrl)
+                                                      .setShareDirectly(false)
+                                                      .setOfflineUri(uri)
+                                                      .build();
+                    shareCallback.onResult(shareParams);
+                }
+            };
+            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        });
 
         return true;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialogManager.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialogManager.java
index f55492f5..879120d4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialogManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialogManager.java
@@ -22,12 +22,34 @@
     void closeVrDialog();
 
     /**
-     * Set size of the Dialog in VR.
+     * Set size of the Dialog in VR. The width and height are used to make sure
+     * that events are sent to the correct location, and the dialog has the
+     * correct size.
+     *
+     * @param width the dialog's width in pixels
+     * @param height the dialog's height in pixels
      */
     void setDialogSize(int width, int height);
 
     /**
-     * Initialize the Dialog in VR.
+     * Set size of the Dialog in VR.
+     * @param x the dialog x offset in pixels.
+     * @param y the dialog y offset in pixels.
+     */
+    void setDialogLocation(int x, int y);
+
+    /**
+     * Initialize the Dialog in VR. The width and height are used to make sure
+     * that events are sent to the correct location, and the dialog has the
+     * correct size.
+     *
+     * @param width the dialog's width in pixels
+     * @param height the dialog's height in pixels
      */
     void initVrDialog(int width, int height);
+
+    /**
+     * Set dialog as floating. This means that Dialog can change its position
+     */
+    void setDialogFloating();
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
index 8082df2..166550f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
@@ -12,7 +12,7 @@
  * Abstracts away the VrShell class, which may or may not be present at runtime depending on
  * compile flags.
  */
-public interface VrShell extends VrDialogManager {
+public interface VrShell extends VrDialogManager, VrToastManager {
     /**
      * Performs native VrShell initialization.
      */
@@ -37,9 +37,7 @@
     /**
      * Sets whether we're presenting WebVR content or not.
      */
-    // TODO(bshe): Refactor needed. See https://crbug.com/735169.
-    // TODO(mthiesse, https://crbug.com/803236): Remove this showToast parameter.
-    void setWebVrModeEnabled(boolean enabled, boolean showToast);
+    void setWebVrModeEnabled(boolean enabled);
 
     /**
      * Returns true if we're presenting WebVR content.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
index 6b1df4d..a87727d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
@@ -1174,7 +1174,7 @@
         boolean webVrMode = mRequestedWebVr || tentativeWebVrMode || mAutopresentWebVr;
         mVrShell.initializeNative(mActivity.getActivityTab(), webVrMode, mAutopresentWebVr,
                 mActivity instanceof CustomTabActivity);
-        mVrShell.setWebVrModeEnabled(webVrMode, false);
+        mVrShell.setWebVrModeEnabled(webVrMode);
 
         // We're entering VR, but not in WebVr mode.
         mVrBrowserUsed = !webVrMode && !mAutopresentWebVr;
@@ -1206,7 +1206,7 @@
         maybeSetPresentResult(true, donSuceeded);
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.VR_BROWSING_NATIVE_ANDROID_UI)) {
             mUiWidgetFactoryBeforeEnterVr = UiWidgetFactory.getInstance();
-            UiWidgetFactory.setInstance(new VrUiWidgetFactory());
+            UiWidgetFactory.setInstance(new VrUiWidgetFactory(mVrShell));
         }
 
         for (VrModeObserver observer : sVrModeObservers) observer.onEnterVr();
@@ -1407,7 +1407,7 @@
         mRequestedWebVr = true;
         switch (enterVrInternal()) {
             case ENTER_VR_NOT_NECESSARY:
-                mVrShell.setWebVrModeEnabled(true, !mAutopresentWebVr && isVrBrowsingEnabled());
+                mVrShell.setWebVrModeEnabled(true);
                 maybeSetPresentResult(true, true);
                 break;
             case ENTER_VR_CANCELLED:
@@ -1484,7 +1484,7 @@
             }
         } else {
             mVrBrowserUsed = true;
-            mVrShell.setWebVrModeEnabled(false, false);
+            mVrShell.setWebVrModeEnabled(false);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
index 24bc904..8ed173f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -751,7 +751,24 @@
      */
     @Override
     public void setDialogSize(int width, int height) {
-        nativeSetAlertDialogSize(mNativeVrShell, width, height);
+        nativeSetDialogBufferSize(mNativeVrShell, width, height);
+        float scale = mContentVrWindowAndroid.getDisplay().getAndroidUIScaling();
+        nativeSetAlertDialogSize(mNativeVrShell, width * scale, height * scale);
+    }
+
+    /**
+     * Set size of the Dialog location in VR.
+     */
+    @Override
+    public void setDialogLocation(int x, int y) {
+        if (getWebVrModeEnabled()) return;
+        float scale = mContentVrWindowAndroid.getDisplay().getAndroidUIScaling();
+        nativeSetDialogLocation(mNativeVrShell, x * scale, y * scale);
+    }
+
+    @Override
+    public void setDialogFloating() {
+        nativeSetDialogFloating(mNativeVrShell);
     }
 
     /**
@@ -759,16 +776,33 @@
      */
     @Override
     public void initVrDialog(int width, int height) {
-        nativeSetAlertDialog(mNativeVrShell, width, height);
+        float scale = mContentVrWindowAndroid.getDisplay().getAndroidUIScaling();
+        nativeSetAlertDialog(mNativeVrShell, width * scale, height * scale);
         mAndroidDialogGestureTarget =
-                new AndroidUiGestureTarget(mVrUiViewContainer.getInputTarget(), 1.0f,
+                new AndroidUiGestureTarget(mVrUiViewContainer.getInputTarget(), 1.0f / scale,
                         getNativePageScrollRatio(), getTouchSlop());
         nativeSetDialogGestureTarget(mNativeVrShell, mAndroidDialogGestureTarget);
     }
 
+    /**
+     * Show a text only Toast.
+     */
     @Override
-    public void setWebVrModeEnabled(boolean enabled, boolean showToast) {
-        if (mNativeVrShell != 0) nativeSetWebVrMode(mNativeVrShell, enabled, showToast);
+    public void showToast(CharSequence text) {
+        nativeShowToast(mNativeVrShell, text.toString());
+    }
+
+    /**
+     * Cancel a Toast.
+     */
+    @Override
+    public void cancelToast() {
+        nativeCancelToast(mNativeVrShell);
+    }
+
+    @Override
+    public void setWebVrModeEnabled(boolean enabled) {
+        if (mNativeVrShell != 0) nativeSetWebVrMode(mNativeVrShell, enabled);
         if (!enabled) {
             mContentVrWindowAndroid.setVSyncPaused(false);
             mPendingVSyncPause = false;
@@ -1071,7 +1105,7 @@
     private native void nativeOnLoadProgressChanged(long nativeVrShell, double progress);
     private native void nativeBufferBoundsChanged(long nativeVrShell, int contentWidth,
             int contentHeight, int overlayWidth, int overlayHeight);
-    private native void nativeSetWebVrMode(long nativeVrShell, boolean enabled, boolean showToast);
+    private native void nativeSetWebVrMode(long nativeVrShell, boolean enabled);
     private native boolean nativeGetWebVrMode(long nativeVrShell);
     private native boolean nativeIsDisplayingUrlForTesting(long nativeVrShell);
     private native void nativeOnTabListCreated(long nativeVrShell, Tab[] mainTabs,
@@ -1080,8 +1114,13 @@
             String title);
     private native void nativeOnTabRemoved(long nativeVrShell, boolean incognito, int id);
     private native void nativeCloseAlertDialog(long nativeVrShell);
-    private native void nativeSetAlertDialog(long nativeVrShell, int width, int height);
-    private native void nativeSetAlertDialogSize(long nativeVrShell, int width, int height);
+    private native void nativeSetAlertDialog(long nativeVrShell, float width, float height);
+    private native void nativeSetDialogBufferSize(long nativeVrShell, float width, float height);
+    private native void nativeSetAlertDialogSize(long nativeVrShell, float width, float height);
+    private native void nativeSetDialogLocation(long nativeVrShell, float x, float y);
+    private native void nativeSetDialogFloating(long nativeVrShell);
+    private native void nativeShowToast(long nativeVrShell, String text);
+    private native void nativeCancelToast(long nativeVrShell);
     private native void nativeSetHistoryButtonsEnabled(
             long nativeVrShell, boolean canGoBack, boolean canGoForward);
     private native void nativeRequestToExitVr(long nativeVrShell, @UiUnsupportedMode int reason);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrToast.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrToast.java
index 3678df1..9296f4d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrToast.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrToast.java
@@ -5,23 +5,51 @@
 package org.chromium.chrome.browser.vr_shell;
 
 import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
 
 /**
  * This class implements a Toast which is similar to Android Toast in VR.
  */
 
 public class VrToast extends android.widget.Toast {
-    public VrToast(Context context) {
+    private VrToastManager mVrToastManager;
+
+    public VrToast(Context context, VrToastManager vrToastManager) {
         super(context);
+        mVrToastManager = vrToastManager;
     }
 
+    /**
+     * In VR, only the text of the first TextView in the Toast's view hierarchy is displayed. While
+     * this is not perfect, but all the Toasts in Android only has one TextView currently. So it
+     * works.
+     * TODO(bshe): we should either enforce one TextView for Toast or update this function to handle
+     * more general cases.
+     */
     @Override
     public void show() {
-        // TODO(bshe): implement this.
+        TextView textView = findTextViewRecursive(getView());
+        assert textView != null;
+        mVrToastManager.showToast(textView.getText());
     }
 
     @Override
     public void cancel() {
-        // TODO(bshe): implement this.
+        mVrToastManager.cancelToast();
+    }
+
+    private TextView findTextViewRecursive(View view) {
+        if (view instanceof TextView) return (TextView) view;
+        if (view instanceof ViewGroup) {
+            ViewGroup viewGroup = (ViewGroup) view;
+            for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                View child = viewGroup.getChildAt(i);
+                TextView textView = findTextViewRecursive(child);
+                if (textView != null) return textView;
+            }
+        }
+        return null;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrToastManager.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrToastManager.java
new file mode 100644
index 0000000..6343169
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrToastManager.java
@@ -0,0 +1,20 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.vr_shell;
+
+/**
+ * Interface that is needed to manage a VR toast.
+ */
+public interface VrToastManager {
+    /**
+     * Show a Toast (contains only text) in VR.
+     */
+    void showToast(CharSequence text);
+
+    /**
+     * Cancel a Toast (contains only text) in VR.
+     */
+    void cancelToast();
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrUiWidgetFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrUiWidgetFactory.java
index f0a424e..23be871 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrUiWidgetFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrUiWidgetFactory.java
@@ -14,7 +14,11 @@
  * The factory that creates VR compatible UI widgets.
  */
 public class VrUiWidgetFactory extends UiWidgetFactory {
-    public VrUiWidgetFactory() {}
+    private VrShell mVrShell;
+
+    public VrUiWidgetFactory(VrShell vrShell) {
+        mVrShell = vrShell;
+    }
 
     @Override
     public PopupWindow createPopupWindow(Context context) {
@@ -23,13 +27,13 @@
 
     @Override
     public android.widget.Toast createToast(Context context) {
-        return new VrToast(context);
+        return new VrToast(context, mVrShell);
     }
 
     @Override
     @SuppressLint("ShowToast")
     public android.widget.Toast makeToast(Context context, CharSequence text, int duration) {
-        android.widget.Toast toast = new VrToast(context);
+        android.widget.Toast toast = new VrToast(context, mVrShell);
         // It is tempting to use toast.setText directly instead of creating a tmpToast and
         // calling setView below. However, setText depends on android.widget.Toast.makeText
         // being called first to inflate a subtree which has a Textview. Calling setText without
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
index 60f0063..c0489751 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -44,7 +44,6 @@
 import org.chromium.chrome.browser.util.AccessibilityUtil;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.util.MathUtils;
-import org.chromium.chrome.browser.widget.FadingBackgroundView;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.SelectionPopupController;
 import org.chromium.content_public.browser.WebContents;
@@ -66,9 +65,8 @@
  * All the computation in this file is based off of the bottom of the screen instead of the top
  * for simplicity. This means that the bottom of the screen is 0 on the Y axis.
  */
-public class BottomSheet
-        extends FrameLayout implements BottomSheetSwipeDetector.SwipeableBottomSheet,
-                                       FadingBackgroundView.FadingViewObserver, NativePageHost {
+public class BottomSheet extends FrameLayout
+        implements BottomSheetSwipeDetector.SwipeableBottomSheet, NativePageHost {
     /** The different states that the bottom sheet can have. */
     @IntDef({SHEET_STATE_NONE, SHEET_STATE_HIDDEN, SHEET_STATE_PEEK, SHEET_STATE_HALF,
             SHEET_STATE_FULL, SHEET_STATE_SCROLLING})
@@ -521,7 +519,7 @@
                 (TouchRestrictingFrameLayout) findViewById(R.id.bottom_sheet_toolbar_container);
         mDefaultToolbarView = mToolbarHolder.findViewById(R.id.bottom_sheet_toolbar);
         mToolbarHeight = activity.getResources().getDimensionPixelSize(
-                R.dimen.bottom_control_container_height);
+                R.dimen.bottom_control_container_peek_height);
 
         mActivity = activity;
         mActionBarDelegate = new ViewShiftingActionBarDelegate(mActivity, this);
@@ -1400,15 +1398,6 @@
         return fullToHalfDiff < mMinHalfFullDistance;
     }
 
-    @Override
-    public void onFadingViewClick() {
-        if (!mIsSheetOpen) return;
-        setSheetState(SHEET_STATE_PEEK, true, StateChangeReason.TAP_SCRIM);
-    }
-
-    @Override
-    public void onFadingViewVisibilityChanged(boolean visible) {}
-
     /**
      * @return The default toolbar view.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java
index d24d143..b16fb34 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java
@@ -14,7 +14,9 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
 import org.chromium.chrome.browser.widget.FadingBackgroundView;
+import org.chromium.chrome.browser.widget.FadingBackgroundView.FadingViewObserver;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent;
+import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.StateChangeReason;
 import org.chromium.ui.UiUtils;
 
 import java.util.PriorityQueue;
@@ -57,6 +59,19 @@
         mBottomSheet = bottomSheet;
         mLayoutManager = layoutManager;
 
+        // Handle interactions with the scrim.
+        fadingBackgroundView.addObserver(new FadingViewObserver() {
+            @Override
+            public void onFadingViewClick() {
+                if (!mBottomSheet.isSheetOpen()) return;
+                mBottomSheet.setSheetState(
+                        BottomSheet.SHEET_STATE_PEEK, true, StateChangeReason.TAP_SCRIM);
+            }
+
+            @Override
+            public void onFadingViewVisibilityChanged(boolean visible) {}
+        });
+
         // Watch for navigation and tab switching that close the sheet.
         new TabModelSelectorTabObserver(tabModelSelector) {
             @Override
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 7c26ef3..cac445705 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -1305,21 +1305,22 @@
   "java/src/org/chromium/chrome/browser/util/ViewUtils.java",
   "java/src/org/chromium/chrome/browser/vr/CustomTabVrActivity.java",
   "java/src/org/chromium/chrome/browser/vr/VrMainActivity.java",
+  "java/src/org/chromium/chrome/browser/vr_shell/OnExitVrRequestListener.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrCancelAnimationActivity.java",
-  "java/src/org/chromium/chrome/browser/vr_shell/VrDialog.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrClassesWrapper.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrCompositorSurfaceManager.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionChecker.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrDaydreamApi.java",
+  "java/src/org/chromium/chrome/browser/vr_shell/VrDialog.java",
+  "java/src/org/chromium/chrome/browser/vr_shell/VrDialogManager.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrFeedbackStatus.java",
-  "java/src/org/chromium/chrome/browser/vr_shell/VrIntentUtils.java",
-  "java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java",
-  "java/src/org/chromium/chrome/browser/vr_shell/VrToast.java",
-  "java/src/org/chromium/chrome/browser/vr_shell/OnExitVrRequestListener.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrFirstRunActivity.java",
+  "java/src/org/chromium/chrome/browser/vr_shell/VrIntentUtils.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrModalPresenter.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrShell.java",
-  "java/src/org/chromium/chrome/browser/vr_shell/VrDialogManager.java",
+  "java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java",
+  "java/src/org/chromium/chrome/browser/vr_shell/VrToast.java",
+  "java/src/org/chromium/chrome/browser/vr_shell/VrToastManager.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrUiWidgetFactory.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrViewContainer.java",
   "java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java",
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index 2602ba8..bce85c5 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -26,7 +26,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/defaults.h"
-#include "chrome/child/child_profiling.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_constants.h"
@@ -536,9 +535,6 @@
   chrome::common::mac::EnableCFBundleBlocker();
 #endif
 
-#if !defined(CHROME_MULTIPLE_DLL_BROWSER)
-  ChildProfiling::ProcessStarted();
-#endif
   Profiling::ProcessStarted();
 
   base::trace_event::TraceLog::GetInstance()->SetArgumentFilterPredicate(
@@ -1038,7 +1034,6 @@
 }
 
 void ChromeMainDelegate::ZygoteForked() {
-  ChildProfiling::ProcessStarted();
   Profiling::ProcessStarted();
   if (Profiling::BeingProfiled()) {
     base::debug::RestartProfilingAfterFork();
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index c202f83a..f048d8a 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -232,9 +232,6 @@
       <message name="IDS_PERMISSIONS_BUBBLE_PROMPT" desc="The label that is used to introduce permission request details to the user in a popup.">
         <ph name="SITE_NAME">$1<ex>google.com</ex></ph> wants to
       </message>
-      <message name="IDS_PERMISSIONS_BUBBLE_ACCESSIBLE_TITLE" desc="The sentence read out by screen readers to describe the permission request popup.">
-        <ph name="SITE_NAME">$1<ex>google.com</ex></ph> has a permission request.
-      </message>
       <message name="IDS_PERMISSION_ALLOW" desc="Label on button to allow a permissions request.">
         Allow
       </message>
@@ -4710,6 +4707,20 @@
          Updated just now
       </message>
 
+      <!-- Page Capping InfoBar -->
+      <message name="IDS_PAGE_CAPPING_TITLE" desc="The text of the infobar notifying the user that data usage on the page is beyond a certain threshold.">
+         This page uses more than <ph name="megabytes">$1<ex>5</ex></ph>MB
+      </message>
+      <message name="IDS_PAGE_CAPPING_STOPPED_TITLE" desc="The text of the infobar indicating that the user has chosen to pause resource loading on the page. This infobar is shown in response to clicking on a link in a different infobar that informed the user the page used a lot of data.">
+         Stopped loading
+      </message>
+      <message name="IDS_PAGE_CAPPING_CONTINUE_MESSAGE" desc="A link on an infobar that allows the resource loading to continue on the page. Clicking the link resumes resource loading on the page. This infobar is shown in response to clicking on a link in a different infobar that informed the user the page used a lot of data.">
+         Continue
+      </message>
+      <message name="IDS_PAGE_CAPPING_STOP_MESSAGE" desc="A link on the of infobar notifying the user that data usage on the page is beyond a certain threshold. Clicking the link pauses the resource loading on the page.">
+         Stop loading
+      </message>
+
       <!-- WebRTC logs -->
       <message name="IDS_WEBRTC_LOGS_TITLE" desc="Title for the chrome://webrtc-logs page.">
         WebRTC logs
diff --git a/chrome/app/nibs/BUILD.gn b/chrome/app/nibs/BUILD.gn
index 7822667..bed6a19 100644
--- a/chrome/app/nibs/BUILD.gn
+++ b/chrome/app/nibs/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/mac/rules.gni")
+import("//ui/base/ui_features.gni")
 
 assert(is_mac)
 
@@ -12,16 +13,6 @@
   "BookmarkBubble.xib",
   "BookmarkEditor.xib",
   "BookmarkNameFolder.xib",
-  "CollectedCookies.xib",
-  "ContentBlockedCookies.xib",
-  "ContentBlockedDownloads.xib",
-  "ContentBlockedGeolocation.xib",
-  "ContentBlockedMIDISysEx.xib",
-  "ContentBlockedMedia.xib",
-  "ContentBlockedMixedScript.xib",
-  "ContentBlockedPopups.xib",
-  "ContentBlockedSimple.xib",
-  "ContentProtocolHandlers.xib",
   "CookieDetailsView.xib",
   "DownloadItem.xib",
   "DownloadShelf.xib",
@@ -39,6 +30,21 @@
   "Toolbar.xib",
 ]
 
+if (!mac_views_browser) {
+  translated_xibs += [
+    "CollectedCookies.xib",
+    "ContentBlockedCookies.xib",
+    "ContentBlockedDownloads.xib",
+    "ContentBlockedGeolocation.xib",
+    "ContentBlockedMIDISysEx.xib",
+    "ContentBlockedMedia.xib",
+    "ContentBlockedMixedScript.xib",
+    "ContentBlockedPopups.xib",
+    "ContentBlockedSimple.xib",
+    "ContentProtocolHandlers.xib",
+  ]
+}
+
 untranslated_xibs = [
   "BookmarkBarFolderWindow.xib",
   "FindBar.xib",
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index d929737..b85b5a8 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1256,6 +1256,19 @@
   </message>
 
   <if expr="chromeos">
+    <message name="IDS_SETTINGS_DOWNLOADS_SMB_SHARES" desc="In Downloads Settings, the title of the SMB Shares setting section.">
+      Network File Shares
+    </message>
+    <message name="IDS_SETTINGS_DOWNLOADS_SMB_SHARES_LEARN_MORE_LABEL" desc="Label for the link that teaches users how to setup SMB shares.">
+      Set up or manage Network File Shares.
+    </message>
+    <message name="IDS_SETTINGS_DOWNLOADS_SMB_SHARES_ADD_SHARE" desc="In SMB Shares settings subpage, text for the link to add a new SMB Share.">
+      Add File Share
+    </message>
+    <message name="IDS_SETTINGS_DOWNLOADS_ADD_SHARE_URL" desc="Title for the input that lets users specify the name of an SMB Url.">
+      File Share Url
+    </message>
+
     <!-- Date/Time Page -->
     <message name="IDS_SETTINGS_DATE_TIME" desc="Name of the settings page which displays date and time preferences.">
       Date and time
@@ -3184,6 +3197,12 @@
     <message name="IDS_SETTINGS_SYNC_SETTINGS_CANCEL_SYNC" desc="The label of button that allows user to cancel sync.">
       Cancel sync
     </message>
+    <message name="IDS_SETTINGS_SYNC_SIGN_IN_PROMPT" desc="The text displayed to prompt users to sign in to chrome.">
+      Sync and personalize Chrome across your device
+    </message>
+    <message name="IDS_SETTINGS_SYNC_SIGN_IN_PROMPT_SECONDARY" desc="The secondary text displayed to prompt users to sign in to chrome.">
+      Turns on the features listed here. Uses your browser activity, content on some sites you visit, and other browser interactions for personalization.
+    </message>
   </if>
   <message name="IDS_SETTINGS_SYNC_TIMEOUT" desc="Text explaining what to do if sync times out.">
     Check your internet connection. If the problem continues, try signing out and signing in again.
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 75d7d5c..1db2124e 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -359,8 +359,8 @@
     "data_use_measurement/data_use_web_contents_observer.h",
     "data_use_measurement/page_load_capping/chrome_page_load_capping_features.cc",
     "data_use_measurement/page_load_capping/chrome_page_load_capping_features.h",
-    "data_use_measurement/page_load_capping/page_load_observer.cc",
-    "data_use_measurement/page_load_capping/page_load_observer.h",
+    "data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.cc",
+    "data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h",
     "defaults.cc",
     "defaults.h",
     "dom_distiller/dom_distiller_service_factory.cc",
@@ -920,6 +920,8 @@
     "page_load_metrics/observers/offline_page_previews_page_load_metrics_observer.h",
     "page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc",
     "page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h",
+    "page_load_metrics/observers/page_capping_page_load_metrics_observer.cc",
+    "page_load_metrics/observers/page_capping_page_load_metrics_observer.h",
     "page_load_metrics/observers/prerender_page_load_metrics_observer.cc",
     "page_load_metrics/observers/prerender_page_load_metrics_observer.h",
     "page_load_metrics/observers/previews_ukm_observer.cc",
@@ -4748,6 +4750,8 @@
       "chromeos/login/test/js_checker.h",
       "chromeos/login/test/oobe_screen_waiter.cc",
       "chromeos/login/test/oobe_screen_waiter.h",
+      "chromeos/login/ui/fake_login_display_host.cc",
+      "chromeos/login/ui/fake_login_display_host.h",
       "chromeos/login/ui/mock_login_display.cc",
       "chromeos/login/ui/mock_login_display.h",
       "chromeos/login/ui/mock_login_display_host.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index f89c7d6..047d35a1 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2933,6 +2933,14 @@
      flag_descriptions::kEnableAutofillCreditCardUploadCvcPromptDescription,
      kOsDesktop,
      FEATURE_VALUE_TYPE(autofill::kAutofillUpstreamRequestCvcIfMissing)},
+    {"enable-autofill-credit-card-upload-google-pay-on-android-branding",
+     flag_descriptions::
+         kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingName,
+     flag_descriptions::
+         kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingDescription,
+     kOsAndroid,
+     FEATURE_VALUE_TYPE(
+         autofill::features::kAutofillUpstreamUseGooglePayOnAndroidBranding)},
     {"enable-autofill-credit-card-upload-send-detected-values",
      flag_descriptions::kEnableAutofillCreditCardUploadSendDetectedValuesName,
      flag_descriptions::
@@ -3756,6 +3764,10 @@
      flag_descriptions::kUsePdfCompositorServiceDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(printing::features::kUsePdfCompositorServiceForPrint)},
 
+    {"autofill-dynamic-forms", flag_descriptions::kAutofillDynamicFormsName,
+     flag_descriptions::kAutofillDynamicFormsDescription, kOsAll,
+     FEATURE_VALUE_TYPE(autofill::features::kAutofillDynamicForms)},
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.cc b/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.cc
index a65285f1..71e3d8f8 100644
--- a/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.cc
+++ b/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.cc
@@ -4,7 +4,9 @@
 
 #include "chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.h"
 
+#include "base/android/callback_android.h"
 #include "base/android/jni_string.h"
+#include "base/callback.h"
 #include "chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_android.h"
@@ -14,6 +16,7 @@
 using base::android::ConvertUTF16ToJavaString;
 using base::android::ConvertUTF8ToJavaString;
 using base::android::JavaParamRef;
+using base::android::ScopedJavaGlobalRef;
 using base::android::ScopedJavaLocalRef;
 using Cluster = ntp_snippets::ContextualContentSuggestionsService::Cluster;
 
@@ -21,18 +24,17 @@
 
 static jlong JNI_ContextualSuggestionsBridge_Init(
     JNIEnv* env,
-    const JavaParamRef<jobject>& j_bridge,
+    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_profile) {
   ContextualSuggestionsBridge* contextual_suggestions_bridge =
-      new ContextualSuggestionsBridge(env, j_bridge, j_profile);
+      new ContextualSuggestionsBridge(env, j_profile);
   return reinterpret_cast<intptr_t>(contextual_suggestions_bridge);
 }
 
 ContextualSuggestionsBridge::ContextualSuggestionsBridge(
     JNIEnv* env,
-    const JavaParamRef<jobject>& j_bridge,
     const JavaParamRef<jobject>& j_profile)
-    : bridge_(env, j_bridge), weak_ptr_factory_(this) {
+    : weak_ptr_factory_(this) {
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
   contextual_content_suggestions_service_ =
       ContextualContentSuggestionsServiceFactory::GetForProfile(profile);
@@ -45,6 +47,21 @@
   delete this;
 }
 
+void ContextualSuggestionsBridge::FetchSuggestions(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    const JavaParamRef<jstring>& j_url,
+    const JavaParamRef<jobject>& j_callback) {
+  if (contextual_content_suggestions_service_ == nullptr)
+    return;
+
+  GURL url(ConvertJavaStringToUTF8(env, j_url));
+  contextual_content_suggestions_service_->FetchContextualSuggestionClusters(
+      url, base::BindOnce(&ContextualSuggestionsBridge::OnSuggestionsAvailable,
+                          weak_ptr_factory_.GetWeakPtr(),
+                          ScopedJavaGlobalRef<jobject>(j_callback)));
+}
+
 void ContextualSuggestionsBridge::FetchSuggestionImage(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
@@ -57,11 +74,16 @@
     const JavaParamRef<jstring>& j_suggestion_id,
     const JavaParamRef<jobject>& j_callback) {}
 
+void ContextualSuggestionsBridge::ClearState(JNIEnv* env,
+                                             const JavaParamRef<jobject>& obj) {
+}
+
 void ContextualSuggestionsBridge::ReportEvent(JNIEnv* env,
                                               const JavaParamRef<jobject>& obj,
                                               jint j_event_id) {}
 
 void ContextualSuggestionsBridge::OnSuggestionsAvailable(
+    ScopedJavaGlobalRef<jobject> j_callback,
     std::vector<Cluster> clusters) {
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobject> j_clusters =
@@ -83,13 +105,7 @@
           suggestion.optional_image_dominant_color().value_or(0));
     }
   }
-  Java_ContextualSuggestionsBridge_onSuggestionsAvailable(env, bridge_,
-                                                          j_clusters);
-}
-
-void ContextualSuggestionsBridge::OnStateCleared() {
-  JNIEnv* env = AttachCurrentThread();
-  Java_ContextualSuggestionsBridge_onStateCleared(env, bridge_);
+  RunCallbackAndroid(j_callback, j_clusters);
 }
 
 }  // namespace contextual_suggestions
diff --git a/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.h b/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.h
index 75ab442..fd9a8057 100644
--- a/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.h
+++ b/chrome/browser/android/contextual_suggestions/contextual_suggestions_bridge.h
@@ -11,47 +11,58 @@
 
 namespace contextual_suggestions {
 
-class ContextualSuggestionsBridge
-    : public ntp_snippets::ContextualContentSuggestionsService::Delegate {
+// Class implementing native side of ContextualSuggestionsBrigde.java.
+class ContextualSuggestionsBridge {
  public:
   ContextualSuggestionsBridge(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& j_bridge,
       const base::android::JavaParamRef<jobject>& j_profile);
 
+  // Deletes the bridge.
   void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
 
+  // Fetches suggestions for a gives |j_url| and passes results to Java side
+  // using |j_callback|.
+  void FetchSuggestions(JNIEnv* env,
+                        const base::android::JavaParamRef<jobject>& obj,
+                        const base::android::JavaParamRef<jstring>& j_url,
+                        const base::android::JavaParamRef<jobject>& j_callback);
+
+  // Fetches an image corresponding to suggestion with |j_suggestion_id| and
+  // passes results to Java side using |j_callback|.
   void FetchSuggestionImage(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jstring>& j_suggestion_id,
       const base::android::JavaParamRef<jobject>& j_callback);
 
+  // Fetches a favicon corresponding to suggestion with |j_suggestion_id| and
+  // passes results to Java side using |j_callback|.
   void FetchSuggestionFavicon(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jstring>& j_suggestion_id,
       const base::android::JavaParamRef<jobject>& j_callback);
 
+  // Requests the backend to clear state related to this bridge.
+  void ClearState(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+
+  // Reports an event happening in UI (for the purpose of metrics collection).
   void ReportEvent(JNIEnv* env,
                    const base::android::JavaParamRef<jobject>& obj,
                    jint j_event_id);
 
-  // ContextualContentSuggestionsService::Delegate implementation:
-  void OnSuggestionsAvailable(
-      std::vector<ntp_snippets::ContextualContentSuggestionsService::Cluster>
-          clusters) override;
-  void OnStateCleared() override;
-
  private:
-  ~ContextualSuggestionsBridge() override;
+  ~ContextualSuggestionsBridge();
+
+  void OnSuggestionsAvailable(
+      base::android::ScopedJavaGlobalRef<jobject> j_callback,
+      std::vector<ntp_snippets::ContextualContentSuggestionsService::Cluster>
+          clusters);
 
   ntp_snippets::ContextualContentSuggestionsService*
       contextual_content_suggestions_service_;
 
-  // The Java SnippetsBridge.
-  base::android::ScopedJavaGlobalRef<jobject> bridge_;
-
   base::WeakPtrFactory<ContextualSuggestionsBridge> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ContextualSuggestionsBridge);
diff --git a/chrome/browser/android/recently_closed_tabs_bridge.cc b/chrome/browser/android/recently_closed_tabs_bridge.cc
index 3faeb8f9..611d4037 100644
--- a/chrome/browser/android/recently_closed_tabs_bridge.cc
+++ b/chrome/browser/android/recently_closed_tabs_bridge.cc
@@ -32,7 +32,7 @@
   const sessions::SerializedNavigationEntry& current_navigation =
       tab.navigations.at(tab.current_navigation_index);
   Java_RecentlyClosedBridge_pushTab(
-      env, jtabs_list, tab.id,
+      env, jtabs_list, tab.id.id(),
       ConvertUTF16ToJavaString(env, current_navigation.title()),
       ConvertUTF8ToJavaString(env, current_navigation.virtual_url().spec()));
 }
@@ -99,7 +99,8 @@
   // Find and remove the corresponding tab entry from TabRestoreService.
   // We take ownership of the returned tab.
   std::unique_ptr<sessions::TabRestoreService::Tab> tab_entry(
-      tab_restore_service_->RemoveTabEntryById(recent_tab_id));
+      tab_restore_service_->RemoveTabEntryById(
+          SessionID::FromSerializedValue(recent_tab_id)));
   if (!tab_entry)
     return false;
 
diff --git a/chrome/browser/android/resource_id.h b/chrome/browser/android/resource_id.h
index 9cb569a..6a41d7c 100644
--- a/chrome/browser/android/resource_id.h
+++ b/chrome/browser/android/resource_id.h
@@ -51,6 +51,8 @@
 DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_SAVE_PASSWORD,
                     R.drawable.infobar_savepassword)
 DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_WARNING, R.drawable.infobar_warning)
+DECLARE_RESOURCE_ID(IDR_AUTOFILL_GOOGLE_PAY_WITH_DIVIDER,
+                    R.drawable.google_pay_with_divider)
 
 // PageInfoUI images, used in ConnectionInfoPopup
 // Good:
diff --git a/chrome/browser/android/vr/mailbox_to_surface_bridge.cc b/chrome/browser/android/vr/mailbox_to_surface_bridge.cc
index ad5f5b59..0d05a51af 100644
--- a/chrome/browser/android/vr/mailbox_to_surface_bridge.cc
+++ b/chrome/browser/android/vr/mailbox_to_surface_bridge.cc
@@ -14,11 +14,12 @@
 #include "content/public/browser/android/compositor.h"
 #include "content/public/browser/browser_thread.h"
 #include "gpu/GLES2/gl2extchromium.h"
+#include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/common/mailbox.h"
 #include "gpu/command_buffer/common/mailbox_holder.h"
-#include "gpu/command_buffer/common/sync_token.h"
 #include "gpu/ipc/client/gpu_channel_host.h"
+#include "gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.h"
 #include "gpu/ipc/common/gpu_surface_tracker.h"
 #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
 #include "ui/gl/android/surface_texture.h"
@@ -152,12 +153,12 @@
   DVLOG(1) << __FUNCTION__;
 }
 
-bool MailboxToSurfaceBridge::IsReady() {
-  return context_provider_ && gl_;
+bool MailboxToSurfaceBridge::IsConnected() {
+  return context_provider_ && gl_ && context_support_;
 }
 
 bool MailboxToSurfaceBridge::IsGpuWorkaroundEnabled(int32_t workaround) {
-  DCHECK(IsReady());
+  DCHECK(IsConnected());
 
   return context_provider_->GetGpuFeatureInfo().IsWorkaroundEnabled(workaround);
 }
@@ -178,13 +179,19 @@
   }
 
   gl_ = context_provider_->ContextGL();
+  context_support_ = context_provider_->ContextSupport();
 
   if (!gl_) {
     DLOG(ERROR) << "Did not get a GL context";
     return;
   }
+  if (!context_support_) {
+    DLOG(ERROR) << "Did not get a ContextSupport";
+    return;
+  }
   InitializeRenderer();
 
+  DVLOG(1) << __FUNCTION__ << ": Context ready";
   if (on_initialized_) {
     base::ResetAndReturn(&on_initialized_).Run();
   }
@@ -256,7 +263,7 @@
 }
 
 void MailboxToSurfaceBridge::ResizeSurface(int width, int height) {
-  if (!IsReady()) {
+  if (!IsConnected()) {
     // We're not initialized yet, save the requested size for later.
     needs_resize_ = true;
     resize_width_ = width;
@@ -271,13 +278,14 @@
 
 bool MailboxToSurfaceBridge::CopyMailboxToSurfaceAndSwap(
     const gpu::MailboxHolder& mailbox) {
-  if (!IsReady()) {
+  if (!IsConnected()) {
     // We may not have a context yet, i.e. due to surface initialization
     // being incomplete. This is not an error, but we obviously can't draw
     // yet. TODO(klausw): change the caller to defer this until we are ready.
     return false;
   }
 
+  TRACE_EVENT0("gpu", __FUNCTION__);
   if (needs_resize_) {
     ResizeSurface(resize_width_, resize_height_);
     needs_resize_ = false;
@@ -290,6 +298,97 @@
   return true;
 }
 
+void MailboxToSurfaceBridge::GenSyncToken(gpu::SyncToken* out_sync_token) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+  gl_->GenSyncTokenCHROMIUM(out_sync_token->GetData());
+}
+
+void MailboxToSurfaceBridge::WaitForClientGpuFence(gfx::GpuFence* gpu_fence) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+  GLuint id = gl_->CreateClientGpuFenceCHROMIUM(gpu_fence->AsClientGpuFence());
+  gl_->WaitGpuFenceCHROMIUM(id);
+  gl_->DestroyGpuFenceCHROMIUM(id);
+}
+
+void MailboxToSurfaceBridge::CreateGpuFence(
+    const gpu::SyncToken& sync_token,
+    base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)> callback) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+  gl_->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
+  GLuint id = gl_->CreateGpuFenceCHROMIUM();
+  context_support_->GetGpuFence(id, std::move(callback));
+  gl_->DestroyGpuFenceCHROMIUM(id);
+}
+
+void MailboxToSurfaceBridge::GenerateMailbox(gpu::Mailbox& out_mailbox) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+  gl_->GenMailboxCHROMIUM(out_mailbox.name);
+}
+
+uint32_t MailboxToSurfaceBridge::CreateMailboxTexture(
+    const gpu::Mailbox& mailbox) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+
+  GLuint tex = 0;
+  gl_->GenTextures(1, &tex);
+  gl_->BindTexture(GL_TEXTURE_2D, tex);
+
+  gl_->ProduceTextureDirectCHROMIUM(tex, mailbox.name);
+
+  return tex;
+}
+
+void MailboxToSurfaceBridge::DestroyMailboxTexture(const gpu::Mailbox& mailbox,
+                                                   uint32_t texture_id) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+
+  // Associating with texture ID 0 unbinds the previous binding without
+  // creating a new one.
+  gl_->ProduceTextureDirectCHROMIUM(0, mailbox.name);
+  GLuint tex = texture_id;
+  gl_->DeleteTextures(1, &tex);
+}
+
+uint32_t MailboxToSurfaceBridge::BindSharedBufferImage(
+    const gfx::GpuMemoryBufferHandle& handle,
+    const gfx::Size& size,
+    gfx::BufferFormat format,
+    gfx::BufferUsage usage,
+    uint32_t texture_id) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+
+  auto buffer = gpu::GpuMemoryBufferImplAndroidHardwareBuffer::CreateFromHandle(
+      handle, size, format, usage,
+      gpu::GpuMemoryBufferImpl::DestructionCallback());
+
+  auto img = gl_->CreateImageCHROMIUM(buffer->AsClientBuffer(), size.width(),
+                                      size.height(), GL_RGBA);
+
+  gl_->BindTexture(GL_TEXTURE_2D, texture_id);
+  gl_->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, img);
+  gl_->BindTexture(GL_TEXTURE_2D, 0);
+
+  return img;
+}
+
+void MailboxToSurfaceBridge::UnbindSharedBuffer(GLuint image_id,
+                                                GLuint texture_id) {
+  TRACE_EVENT0("gpu", __FUNCTION__);
+  DCHECK(IsConnected());
+
+  gl_->BindTexture(GL_TEXTURE_2D, texture_id);
+  gl_->ReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id);
+  gl_->BindTexture(GL_TEXTURE_2D, 0);
+  gl_->DestroyImageCHROMIUM(image_id);
+}
+
 void MailboxToSurfaceBridge::DestroyContext() {
   gl_ = nullptr;
   context_provider_ = nullptr;
@@ -370,7 +469,7 @@
 }
 
 void MailboxToSurfaceBridge::DrawQuad(unsigned int texture_handle) {
-  DCHECK(IsReady());
+  DCHECK(IsConnected());
 
   // We're redrawing over the entire viewport, but it's generally more
   // efficient on mobile tiling GPUs to clear anyway as a hint that
diff --git a/chrome/browser/android/vr/mailbox_to_surface_bridge.h b/chrome/browser/android/vr/mailbox_to_surface_bridge.h
index b5e8bb0b..4b4a943 100644
--- a/chrome/browser/android/vr/mailbox_to_surface_bridge.h
+++ b/chrome/browser/android/vr/mailbox_to_surface_bridge.h
@@ -6,15 +6,26 @@
 #define CHROME_BROWSER_ANDROID_VR_MAILBOX_TO_SURFACE_BRIDGE_H_
 
 #include "base/callback.h"
+#include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "gpu/command_buffer/common/sync_token.h"
+#include "ui/gfx/buffer_format_util.h"
+#include "ui/gfx/gpu_fence.h"
 
 namespace gl {
 class ScopedJavaSurface;
 class SurfaceTexture;
 }  // namespace gl
 
+namespace gfx {
+struct GpuMemoryBufferHandle;
+}
+
 namespace gpu {
+class ContextSupport;
+struct Mailbox;
 struct MailboxHolder;
+struct SyncToken;
 namespace gles2 {
 class GLES2Interface;
 }
@@ -33,7 +44,7 @@
 
   // Returns true if the GPU process connection is established and ready to use.
   // Equivalent to waiting for on_initialized to be called.
-  bool IsReady();
+  bool IsConnected();
 
   // Checks if a workaround from "gpu/config/gpu_driver_bug_workaround_type.h"
   // is active. Requires initialization to be complete.
@@ -48,6 +59,40 @@
   // won't get a new frame on the SurfaceTexture.
   bool CopyMailboxToSurfaceAndSwap(const gpu::MailboxHolder& mailbox);
 
+  void GenSyncToken(gpu::SyncToken* out_sync_token);
+
+  // Copies a GpuFence from the local context to the GPU process,
+  // and issues a server wait for it.
+  void WaitForClientGpuFence(gfx::GpuFence*);
+
+  // Creates a GpuFence in the GPU process after the supplied sync_token
+  // completes, and copies it for use in the local context. This is
+  // asynchronous, the callback receives the GpuFence once it's available.
+  void CreateGpuFence(
+      const gpu::SyncToken& sync_token,
+      base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)> callback);
+
+  void GenerateMailbox(gpu::Mailbox& out_mailbox);
+
+  // Creates a texture and binds it to the mailbox. Returns its
+  // texture ID in the command buffer context. (Don't use that
+  // in the local GL context, it's not valid there.)
+  uint32_t CreateMailboxTexture(const gpu::Mailbox& mailbox);
+
+  // Unbinds the texture from the mailbox and destroys it.
+  void DestroyMailboxTexture(const gpu::Mailbox& mailbox, uint32_t texture_id);
+
+  // Creates a GLImage from the handle's GpuMemoryBuffer and binds it to
+  // the supplied texture_id in the GPU process. Returns the image ID in the
+  // command buffer context.
+  uint32_t BindSharedBufferImage(const gfx::GpuMemoryBufferHandle&,
+                                 const gfx::Size& size,
+                                 gfx::BufferFormat format,
+                                 gfx::BufferUsage usage,
+                                 uint32_t texture_id);
+
+  void UnbindSharedBuffer(uint32_t image_id, uint32_t texture_id);
+
  private:
   void OnContextAvailable(std::unique_ptr<gl::ScopedJavaSurface> surface,
                           scoped_refptr<viz::ContextProvider>);
@@ -57,6 +102,7 @@
 
   scoped_refptr<viz::ContextProvider> context_provider_;
   gpu::gles2::GLES2Interface* gl_ = nullptr;
+  gpu::ContextSupport* context_support_ = nullptr;
   int surface_handle_ = 0;
   base::OnceClosure on_initialized_;
 
@@ -68,6 +114,8 @@
 
   // Must be last.
   base::WeakPtrFactory<MailboxToSurfaceBridge> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(MailboxToSurfaceBridge);
 };
 
 }  // namespace vr
diff --git a/chrome/browser/android/vr/vr_gl_thread.cc b/chrome/browser/android/vr/vr_gl_thread.cc
index 09ba823..7d96a58 100644
--- a/chrome/browser/android/vr/vr_gl_thread.cc
+++ b/chrome/browser/android/vr/vr_gl_thread.cc
@@ -358,11 +358,11 @@
                                          weak_browser_ui_, state));
 }
 
-void VrGLThread::SetWebVrMode(bool enabled, bool show_toast) {
+void VrGLThread::SetWebVrMode(bool enabled) {
   DCHECK(OnMainThread());
-  task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&BrowserUiInterface::SetWebVrMode,
-                                weak_browser_ui_, enabled, show_toast));
+  task_runner()->PostTask(FROM_HERE,
+                          base::BindOnce(&BrowserUiInterface::SetWebVrMode,
+                                         weak_browser_ui_, enabled));
 }
 
 void VrGLThread::SetCapturingState(const CapturingStateModel& state) {
diff --git a/chrome/browser/android/vr/vr_gl_thread.h b/chrome/browser/android/vr/vr_gl_thread.h
index 3d148ff..f5d9c8b 100644
--- a/chrome/browser/android/vr/vr_gl_thread.h
+++ b/chrome/browser/android/vr/vr_gl_thread.h
@@ -97,7 +97,7 @@
   void ShowPageInfo() override;
 
   // BrowserUiInterface implementation (Browser calling to UI).
-  void SetWebVrMode(bool enabled, bool show_toast) override;
+  void SetWebVrMode(bool enabled) override;
   void SetFullscreen(bool enabled) override;
   void SetToolbarState(const ToolbarState& state) override;
   void SetIncognito(bool incognito) override;
diff --git a/chrome/browser/android/vr/vr_shell.cc b/chrome/browser/android/vr/vr_shell.cc
index 1472998a..03631539 100644
--- a/chrome/browser/android/vr/vr_shell.cc
+++ b/chrome/browser/android/vr/vr_shell.cc
@@ -490,8 +490,7 @@
 
 void VrShell::SetWebVrMode(JNIEnv* env,
                            const JavaParamRef<jobject>& obj,
-                           bool enabled,
-                           bool show_toast) {
+                           bool enabled) {
   webvr_mode_ = enabled;
   SessionMetricsHelper* metrics_helper =
       SessionMetricsHelper::FromWebContents(web_contents_);
@@ -503,7 +502,7 @@
   // We create and dispose a page info in order to get notifed of page
   // permissions.
   CreatePageInfo();
-  ui_->SetWebVrMode(enabled, show_toast);
+  ui_->SetWebVrMode(enabled);
 
   if (!webvr_mode_ && !web_vr_autopresentation_expected_) {
     AssetsLoader::GetInstance()->GetMetricsHelper()->OnEnter(Mode::kVrBrowsing);
@@ -581,8 +580,8 @@
 
 void VrShell::SetAlertDialog(JNIEnv* env,
                              const base::android::JavaParamRef<jobject>& obj,
-                             int width,
-                             int height) {
+                             float width,
+                             float height) {
   PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::EnableAlertDialog,
                                            gl_thread_->GetVrShellGl(),
                                            gl_thread_.get(), width, height));
@@ -598,18 +597,55 @@
   CreatePageInfo();
 }
 
+void VrShell::SetDialogBufferSize(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj,
+    float width,
+    float height) {
+  if (ui_surface_texture_)
+    ui_surface_texture_->SetDefaultBufferSize(width, height);
+}
+
 void VrShell::SetAlertDialogSize(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& obj,
-    int width,
-    int height) {
-  if (ui_surface_texture_)
-    ui_surface_texture_->SetDefaultBufferSize(width, height);
+    float width,
+    float height) {
   PostToGlThread(FROM_HERE,
                  base::BindOnce(&VrShellGl::SetAlertDialogSize,
                                 gl_thread_->GetVrShellGl(), width, height));
 }
 
+void VrShell::SetDialogLocation(JNIEnv* env,
+                                const base::android::JavaParamRef<jobject>& obj,
+                                float x,
+                                float y) {
+  PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::SetDialogLocation,
+                                           gl_thread_->GetVrShellGl(), x, y));
+}
+
+void VrShell::SetDialogFloating(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::SetDialogFloating,
+                                           gl_thread_->GetVrShellGl()));
+}
+
+void VrShell::ShowToast(JNIEnv* env,
+                        const base::android::JavaParamRef<jobject>& obj,
+                        jstring jtext) {
+  base::string16 text;
+  base::android::ConvertJavaStringToUTF16(env, jtext, &text);
+  PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::ShowToast,
+                                           gl_thread_->GetVrShellGl(), text));
+}
+
+void VrShell::CancelToast(JNIEnv* env,
+                          const base::android::JavaParamRef<jobject>& obj) {
+  PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::CancelToast,
+                                           gl_thread_->GetVrShellGl()));
+}
+
 void VrShell::ConnectPresentingService(
     device::mojom::VRSubmitFrameClientPtr submit_client,
     device::mojom::VRPresentationProviderRequest request,
diff --git a/chrome/browser/android/vr/vr_shell.h b/chrome/browser/android/vr/vr_shell.h
index 3ca5e308..37c2e90 100644
--- a/chrome/browser/android/vr/vr_shell.h
+++ b/chrome/browser/android/vr/vr_shell.h
@@ -102,8 +102,7 @@
                   const base::android::JavaParamRef<jobject>& surface);
   void SetWebVrMode(JNIEnv* env,
                     const base::android::JavaParamRef<jobject>& obj,
-                    bool enabled,
-                    bool show_toast);
+                    bool enabled);
   bool GetWebVrMode(JNIEnv* env,
                     const base::android::JavaParamRef<jobject>& obj);
   bool IsDisplayingUrlForTesting(
@@ -206,14 +205,30 @@
 
   void SetAlertDialog(JNIEnv* env,
                       const base::android::JavaParamRef<jobject>& obj,
-                      int width,
-                      int height);
+                      float width,
+                      float height);
   void CloseAlertDialog(JNIEnv* env,
                         const base::android::JavaParamRef<jobject>& obj);
+  void SetDialogBufferSize(JNIEnv* env,
+                           const base::android::JavaParamRef<jobject>& obj,
+                           float width,
+                           float height);
   void SetAlertDialogSize(JNIEnv* env,
                           const base::android::JavaParamRef<jobject>& obj,
-                          int width,
-                          int height);
+                          float width,
+                          float height);
+  void SetDialogLocation(JNIEnv* env,
+                         const base::android::JavaParamRef<jobject>& obj,
+                         float x,
+                         float y);
+  void SetDialogFloating(JNIEnv* env,
+                         const base::android::JavaParamRef<jobject>& obj);
+
+  void ShowToast(JNIEnv* env,
+                 const base::android::JavaParamRef<jobject>& obj,
+                 jstring text);
+  void CancelToast(JNIEnv* env,
+                   const base::android::JavaParamRef<jobject>& obj);
 
   void ConnectPresentingService(
       device::mojom::VRSubmitFrameClientPtr submit_client,
diff --git a/chrome/browser/android/vr/vr_shell_gl.cc b/chrome/browser/android/vr/vr_shell_gl.cc
index d97ad51..68a727c 100644
--- a/chrome/browser/android/vr/vr_shell_gl.cc
+++ b/chrome/browser/android/vr/vr_shell_gl.cc
@@ -336,9 +336,26 @@
     OnVSync(base::TimeTicks::Now());
 }
 
+bool VrShellGl::WebVrCanSubmitFrame() {
+  return mailbox_bridge_ready_ && !webvr_frame_processing_;
+}
+
+void VrShellGl::WebVrTryDeferredSubmit() {
+  if (!webvr_deferred_mojo_submit_ || !WebVrCanSubmitFrame())
+    return;
+
+  DVLOG(2) << "Running deferred SubmitFrame";
+  // Run synchronously, not via PostTask, to ensure we don't
+  // get a new SendVSync scheduling in between.
+  base::ResetAndReturn(&webvr_deferred_mojo_submit_).Run();
+}
+
 void VrShellGl::OnGpuProcessConnectionReady() {
   DVLOG(1) << __FUNCTION__;
   mailbox_bridge_ready_ = true;
+  // We might have a deferred submit that was waiting for
+  // mailbox_bridge_ready_.
+  WebVrTryDeferredSubmit();
 }
 
 void VrShellGl::CreateOrResizeWebVRSurface(const gfx::Size& size) {
@@ -385,12 +402,22 @@
   if (!submit_client_.get())
     return;
 
+  if (!WebVrCanSubmitFrame()) {
+    DVLOG(2) << "Deferring SubmitFrame, not ready";
+    DCHECK(!webvr_deferred_mojo_submit_);
+    webvr_deferred_mojo_submit_ =
+        base::BindOnce(&VrShellGl::SubmitFrame, weak_ptr_factory_.GetWeakPtr(),
+                       frame_index, mailbox, time_waited);
+    return;
+  }
+
   if (frame_index < 0 ||
       !webvr_frame_oustanding_[frame_index % kPoseRingBufferSize]) {
     mojo::ReportBadMessage("SubmitFrame called with an invalid frame_index");
     binding_.Close();
     return;
   }
+  webvr_frame_processing_ = true;
 
   webvr_time_js_submit_[frame_index % kPoseRingBufferSize] =
       base::TimeTicks::Now();
@@ -466,8 +493,8 @@
 }
 
 void VrShellGl::EnableAlertDialog(ContentInputForwarder* input_forwarder,
-                                  int width,
-                                  int height) {
+                                  float width,
+                                  float height) {
   showing_vr_dialog_ = true;
   vr_dialog_.reset(new VrDialog(width, height));
   vr_dialog_->SetEventForwarder(input_forwarder);
@@ -482,12 +509,28 @@
   ScheduleOrCancelWebVrFrameTimeout();
 }
 
-void VrShellGl::SetAlertDialogSize(int width, int height) {
+void VrShellGl::SetAlertDialogSize(float width, float height) {
   if (vr_dialog_)
     vr_dialog_->SetSize(width, height);
   ui_->SetAlertDialogSize(width, height);
 }
 
+void VrShellGl::SetDialogLocation(float x, float y) {
+  ui_->SetDialogLocation(x, y);
+}
+
+void VrShellGl::SetDialogFloating() {
+  ui_->SetDialogFloating();
+}
+
+void VrShellGl::ShowToast(const base::string16& text) {
+  ui_->ShowPlatformToast(text);
+}
+
+void VrShellGl::CancelToast() {
+  ui_->CancelPlatformToast();
+}
+
 void VrShellGl::ResumeContentRendering() {
   if (!content_paused_)
     return;
@@ -517,15 +560,9 @@
   // This is called each time a frame that was drawn on the WebVR Surface
   // arrives on the SurfaceTexture.
 
-  // A "while" loop here is a bad idea. It's legal to call
-  // UpdateTexImage repeatedly even if no frames are available, but
-  // that does *not* wait for a new frame, it just reuses the most
-  // recent one. That would mess up the count.
-  if (pending_frames_.empty()) {
-    // We're expecting a frame, but it's not here yet. Retry in OnVsync.
-    ++premature_received_frames_;
-    return;
-  }
+  // This event should only occur in response to a SwapBuffers from
+  // an incoming SubmitFrame call.
+  DCHECK(!pending_frames_.empty()) << ": Frame arrived before SubmitFrame";
 
   webvr_surface_texture_->UpdateTexImage();
   int frame_index = pending_frames_.front();
@@ -857,10 +894,10 @@
   // Process all pending_bounds_ changes targeted for before this frame, being
   // careful of wrapping frame indices.
   static constexpr unsigned max =
-      std::numeric_limits<decltype(frame_index_)>::max();
+      std::numeric_limits<decltype(next_frame_index_)>::max();
   static_assert(max > kPoseRingBufferSize * 2,
                 "To detect wrapping, kPoseRingBufferSize must be smaller "
-                "than half of frame_index_ range.");
+                "than half of next_frame_index_ range.");
   while (!pending_bounds_.empty()) {
     uint16_t index = pending_bounds_.front().first;
     // If index is less than the frame_index it's possible we've wrapped, so we
@@ -942,8 +979,10 @@
 
 void VrShellGl::DrawFrame(int16_t frame_index, base::TimeTicks current_time) {
   TRACE_EVENT1("gpu", "VrShellGl::DrawFrame", "frame", frame_index);
-  if (!webvr_delayed_frame_submit_.IsCancelled()) {
-    webvr_delayed_frame_submit_.Cancel();
+  if (frame_index < 0 && !webvr_delayed_gvr_submit_.IsCancelled()) {
+    // We've exited WebVR, but the last submit to GVR didn't complete.
+    // Cancel the scheduled submit and reuse the frame.
+    webvr_delayed_gvr_submit_.Cancel();
     DrawIntoAcquiredFrame(frame_index, current_time);
     return;
   }
@@ -1164,11 +1203,11 @@
     }
   }
   if (fence) {
-    webvr_delayed_frame_submit_.Reset(base::BindRepeating(
+    webvr_delayed_gvr_submit_.Reset(base::BindRepeating(
         &VrShellGl::DrawFrameSubmitWhenReady, base::Unretained(this)));
     task_runner_->PostTask(
         FROM_HERE,
-        base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index,
+        base::BindOnce(webvr_delayed_gvr_submit_.callback(), frame_index,
                        submit_head_pose, base::Passed(&fence)));
   } else {
     // Continue with submit immediately.
@@ -1191,7 +1230,7 @@
           kWebVRFenceCheckTimeout.InMicroseconds() * 1000);
     }
     if (!fence->HasCompleted()) {
-      webvr_delayed_frame_submit_.Reset(base::BindRepeating(
+      webvr_delayed_gvr_submit_.Reset(base::BindRepeating(
           &VrShellGl::DrawFrameSubmitWhenReady, base::Unretained(this)));
       if (use_polling) {
         // Poll the fence status at a short interval. This burns some CPU, but
@@ -1200,13 +1239,13 @@
         // with a delay of up to one polling interval.
         task_runner_->PostDelayedTask(
             FROM_HERE,
-            base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index,
+            base::BindOnce(webvr_delayed_gvr_submit_.callback(), frame_index,
                            head_pose, base::Passed(&fence)),
             kWebVRFenceCheckPollInterval);
       } else {
         task_runner_->PostTask(
             FROM_HERE,
-            base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index,
+            base::BindOnce(webvr_delayed_gvr_submit_.callback(), frame_index,
                            head_pose, base::Passed(&fence)));
       }
       return;
@@ -1219,7 +1258,7 @@
     AddWebVrRenderTimeEstimate(frame_index, true);
   }
 
-  webvr_delayed_frame_submit_.Cancel();
+  webvr_delayed_gvr_submit_.Cancel();
   DrawFrameSubmitNow(frame_index, head_pose);
 }
 
@@ -1304,6 +1343,11 @@
     }
   }
 
+  webvr_frame_processing_ = false;
+  // If we have a waiting submit that arrived while processing this one, handle
+  // it now.
+  WebVrTryDeferredSubmit();
+
   // After saving the timestamp, fps will be available via GetFPS().
   // TODO(vollick): enable rendering of this framerate in a HUD.
   vr_ui_fps_meter_.AddFrame(base::TimeTicks::Now());
@@ -1409,11 +1453,6 @@
   TRACE_EVENT_INSTANT1("viz", "DisplayScheduler::BeginFrame",
                        TRACE_EVENT_SCOPE_THREAD, "args", std::move(args));
 
-  while (premature_received_frames_ > 0) {
-    TRACE_EVENT0("gpu", "VrShellGl::OnWebVRFrameAvailableRetry");
-    --premature_received_frames_;
-    OnWebVRFrameAvailable();
-  }
   vsync_helper_.RequestVSync(
       base::BindRepeating(&VrShellGl::OnVSync, base::Unretained(this)));
 
@@ -1539,13 +1578,21 @@
 }
 
 bool VrShellGl::ShouldSkipVSync() {
+  // If we appear to be backlogged, don't send additional VSyncs. Don't check
+  // WebVrCanSubmit() here - we intentionally want to allow the first VSync to
+  // go out before mailbox_bridge_ready_ becomes true. The first SubmitFrame
+  // will be deferred if needed, and we'll throttle here to avoid requesting
+  // more frames until that's done.
+  if (webvr_deferred_mojo_submit_)
+    return true;
+
   // Disable heuristic for traditional render path where we submit completed
   // frames.
   if (!webvr_use_gpu_fence_)
     return false;
 
   int16_t prev_idx =
-      (frame_index_ + kPoseRingBufferSize - 1) % kPoseRingBufferSize;
+      (next_frame_index_ + kPoseRingBufferSize - 1) % kPoseRingBufferSize;
   base::TimeTicks prev_js_submit = webvr_time_js_submit_[prev_idx];
   if (prev_js_submit.is_null())
     return false;
@@ -1579,17 +1626,21 @@
 }
 
 void VrShellGl::SendVSync(base::TimeTicks time, GetVSyncCallback callback) {
-  DVLOG(2) << __FUNCTION__;
   // There must not be a stored callback at this point, callers should use
   // ResetAndReturn to clear it before calling this method.
   DCHECK(!callback_);
 
   if (ShouldSkipVSync()) {
     callback_ = std::move(callback);
+    DVLOG(2) << __FUNCTION__ << ": ShouldSkipVSync()=true";
     return;
   }
 
-  uint8_t frame_index = frame_index_++;
+  // next_frame_index_ is an uint8_t that generates a wrapping 0.255 frame
+  // number. We store it in an int16_t to match mojo APIs, and to avoid it
+  // appearing as a char in debug logs.
+  int16_t frame_index = next_frame_index_++;
+  DVLOG(2) << __FUNCTION__ << " frame=" << frame_index;
 
   TRACE_EVENT1("input", "VrShellGl::SendVSync", "frame", frame_index);
 
diff --git a/chrome/browser/android/vr/vr_shell_gl.h b/chrome/browser/android/vr/vr_shell_gl.h
index a87c02f..23da9bc4 100644
--- a/chrome/browser/android/vr/vr_shell_gl.h
+++ b/chrome/browser/android/vr/vr_shell_gl.h
@@ -114,11 +114,16 @@
   void OnSwapContents(int new_content_id);
 
   void EnableAlertDialog(ContentInputForwarder* input_forwarder,
-                         int width,
-                         int height);
+                         float width,
+                         float height);
   void DisableAlertDialog();
 
-  void SetAlertDialogSize(int width, int height);
+  void SetAlertDialogSize(float width, float height);
+  void SetDialogLocation(float x, float y);
+  void SetDialogFloating();
+
+  void ShowToast(const base::string16& text);
+  void CancelToast();
 
   void AcceptDoffPromptForTesting();
 
@@ -187,6 +192,14 @@
   bool ShouldSkipVSync();
   void SendVSync(base::TimeTicks time, GetVSyncCallback callback);
 
+  // Checks if we're in a valid state for submitting a frame. Invalid states
+  // include mailbox_bridge_ready_ being false, or overlapping processing
+  // frames.
+  bool WebVrCanSubmitFrame();
+  // Call this after state changes that could result in WebVrCanSubmitFrame
+  // becoming true.
+  void WebVrTryDeferredSubmit();
+
   void ClosePresentationBindings();
 
   device::mojom::XRInputSourceStatePtr GetGazeInputSourceState();
@@ -217,7 +230,6 @@
   std::unique_ptr<gvr::SwapChain> swap_chain_;
   gvr::Frame acquired_frame_;
   base::queue<std::pair<uint8_t, WebVrBounds>> pending_bounds_;
-  int premature_received_frames_ = 0;
   base::queue<uint16_t> pending_frames_;
   std::unique_ptr<MailboxToSurfaceBridge> mailbox_bridge_;
   bool mailbox_bridge_ready_ = false;
@@ -284,9 +296,10 @@
 
   GlBrowserInterface* browser_;
 
-  uint8_t frame_index_ = 0;
-  // Larger than frame_index_ so it can be initialized out-of-band.
-  uint16_t last_frame_index_ = -1;
+  // Index of the next WebXR frame, wrapping from 255 back to 0. Elsewhere we
+  // use -1 to indicate a non-WebXR frame, so most internal APIs use int16_t to
+  // store the -1..255 range.
+  uint8_t next_frame_index_ = 0;
 
   uint64_t webvr_frames_received_ = 0;
 
@@ -323,9 +336,22 @@
 
   base::CancelableOnceCallback<void()> webvr_frame_timeout_;
   base::CancelableOnceCallback<void()> webvr_spinner_timeout_;
+
+  // WebVR defers submitting a frame to GVR by scheduling a closure
+  // for later. If we exit WebVR before it is executed, we need to
+  // cancel it to avoid inconsistent state.
   base::CancelableCallback<
       void(int16_t, const gfx::Transform&, std::unique_ptr<gl::GLFenceEGL>)>
-      webvr_delayed_frame_submit_;
+      webvr_delayed_gvr_submit_;
+
+  // We only want one frame at a time in the lifecycle from
+  // mojo SubmitFrame until we submit to GVR. This flag is true
+  // for that timespan.
+  bool webvr_frame_processing_ = false;
+
+  // If we receive a new SubmitFrame when we're not ready, save it for
+  // later execution.
+  base::OnceClosure webvr_deferred_mojo_submit_;
 
   std::vector<gvr::BufferSpec> specs_;
 
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc
index b49df1e..36c9bf12 100644
--- a/chrome/browser/autofill/autofill_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -14,6 +14,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/autofill/autofill_uitest_util.h"
@@ -38,6 +39,8 @@
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/validation.h"
+#include "components/autofill/core/common/autofill_features.h"
+#include "components/network_session_configurator/common/network_switches.h"
 #include "components/translate/core/browser/translate_manager.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/notification_observer.h"
@@ -162,8 +165,7 @@
 class AutofillManagerTestDelegateImpl
     : public autofill::AutofillManagerTestDelegate {
  public:
-  AutofillManagerTestDelegateImpl()
-      : waiting_for_text_change_(false) {}
+  AutofillManagerTestDelegateImpl() {}
   ~AutofillManagerTestDelegateImpl() override {}
 
   // autofill::AutofillManagerTestDelegate:
@@ -173,7 +175,8 @@
   }
 
   void DidFillFormData() override {
-    ASSERT_TRUE(loop_runner_->loop_running());
+    if (!is_expecting_dynamic_refill_)
+      ASSERT_TRUE(loop_runner_->loop_running());
     loop_runner_->Quit();
   }
 
@@ -203,9 +206,14 @@
     loop_runner_->Run();
   }
 
+  void SetIsExpectingDynamicRefill(bool expect_refill) {
+    is_expecting_dynamic_refill_ = expect_refill;
+  }
+
  private:
   scoped_refptr<content::MessageLoopRunner> loop_runner_;
-  bool waiting_for_text_change_;
+  bool waiting_for_text_change_ = false;
+  bool is_expecting_dynamic_refill_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl);
 };
@@ -277,10 +285,10 @@
 
   void CreateTestProfile() {
     AutofillProfile profile;
-    test::SetProfileInfo(
-        &profile, "Milton", "C.", "Waddams",
-        "red.swingline@initech.com", "Initech", "4120 Freidrich Lane",
-        "Basement", "Austin", "Texas", "78744", "US", "5125551234");
+    test::SetProfileInfo(&profile, "Milton", "C.", "Waddams",
+                         "red.swingline@initech.com", "Initech",
+                         "4120 Freidrich Lane", "Basement", "Austin", "Texas",
+                         "78744", "US", "15125551234");
 
     AddTestProfile(browser(), profile);
   }
@@ -426,7 +434,7 @@
     ExpectFieldValue("state", "TX");
     ExpectFieldValue("zip", "78744");
     ExpectFieldValue("country", "US");
-    ExpectFieldValue("phone", "5125551234");
+    ExpectFieldValue("phone", "15125551234");
   }
 
   void SendKeyToPageAndWait(ui::DomKey key) {
@@ -534,6 +542,22 @@
     ExpectFilledTestForm();
   }
 
+  void TriggerFormFill() {
+    FocusFirstNameField();
+
+    // Start filling the first name field with "M" and wait for the popup to be
+    // shown.
+    SendKeyToPageAndWait(ui::DomKey::FromCharacter('M'), ui::DomCode::US_M,
+                         ui::VKEY_M);
+
+    // Press the down arrow to select the suggestion and preview the autofilled
+    // form.
+    SendKeyToPopupAndWait(ui::DomKey::ARROW_DOWN);
+
+    // Press Enter to accept the autofill suggestions.
+    SendKeyToPopupAndWait(ui::DomKey::ENTER);
+  }
+
   AutofillManagerTestDelegateImpl* test_delegate() { return &test_delegate_; }
 
  private:
@@ -1595,7 +1619,7 @@
   ExpectFieldValue("ADDRESS_HOME_STATE", "Texas");
   ExpectFieldValue("ADDRESS_HOME_ZIP", "78744");
   ExpectFieldValue("ADDRESS_HOME_COUNTRY", "United States");
-  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "5125551234");
+  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "15125551234");
 }
 
 // Test Autofill distinguishes a middle initial in a name.
@@ -1899,4 +1923,203 @@
   EXPECT_FALSE(IsPopupShown());
 }
 
+class DynamicFormInteractiveTest : public AutofillInteractiveTest {
+ protected:
+  DynamicFormInteractiveTest()
+      : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
+  ~DynamicFormInteractiveTest() override = default;
+
+  // AutofillInteractiveTest:
+  void SetUp() override {
+    // Explicitly enable the filling of dynamic forms and disabled the
+    // requirement for a secure context to fill credit cards.
+    scoped_feature_list_.InitWithFeatures(
+        {features::kAutofillDynamicForms},
+        {features::kAutofillRequireSecureCreditCardContext});
+    https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
+    https_server_.ServeFilesFromSourceDirectory("chrome/test/data");
+    ASSERT_TRUE(https_server_.InitializeAndListen());
+    https_server_.StartAcceptingConnections();
+    AutofillInteractiveTest::SetUp();
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    AutofillInteractiveTest::SetUpCommandLine(command_line);
+    // HTTPS server only serves a valid cert for localhost, so this is needed to
+    // load pages from "a.com" without an interstitial.
+    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
+  }
+
+  net::EmbeddedTestServer* https_server() { return &https_server_; }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  net::EmbeddedTestServer https_server_;
+
+  DISALLOW_COPY_AND_ASSIGN(DynamicFormInteractiveTest);
+};
+
+// Test that we can Autofill dynamically generated forms.
+IN_PROC_BROWSER_TEST_F(DynamicFormInteractiveTest, DynamicChangingFormFill) {
+  // Setup that the test expects a re-fill to happen.
+  test_delegate()->SetIsExpectingDynamicRefill(true);
+
+  CreateTestProfile();
+
+  GURL url =
+      embedded_test_server()->GetURL("a.com", "/autofill/dynamic_form.html");
+  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url));
+
+  TriggerFormFill();
+
+  // Wait for the re-fill to happen.
+  bool has_refilled = false;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderViewHost(), "hasRefilled()", &has_refilled));
+  ASSERT_TRUE(has_refilled);
+
+  // Make sure the new form was filled correctly.
+  ExpectFieldValue("firstname", "Milton");
+  ExpectFieldValue("address1", "4120 Freidrich Lane");
+  ExpectFieldValue("state", "TX");
+  ExpectFieldValue("city", "Austin");
+  ExpectFieldValue("company", "Initech");
+  ExpectFieldValue("email", "red.swingline@initech.com");
+  ExpectFieldValue("phone", "15125551234");
+}
+
+// Test that forms that dynamically change a second time do not get filled.
+IN_PROC_BROWSER_TEST_F(DynamicFormInteractiveTest,
+                       DynamicChangingFormFill_SecondChange) {
+  // Setup that the test expects a re-fill to happen.
+  test_delegate()->SetIsExpectingDynamicRefill(true);
+
+  CreateTestProfile();
+
+  GURL url = embedded_test_server()->GetURL(
+      "a.com", "/autofill/double_dynamic_form.html");
+  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url));
+
+  TriggerFormFill();
+
+  // Wait for two dynamic changes to happen.
+  bool has_refilled = false;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderViewHost(), "hasFinished()", &has_refilled));
+  ASSERT_FALSE(has_refilled);
+
+  // Make sure the new form was not filled.
+  ExpectFieldValue("firstname", "");
+  ExpectFieldValue("address1", "");
+  ExpectFieldValue("state", "CA");  // Default value.
+  ExpectFieldValue("city", "");
+  ExpectFieldValue("company", "");
+  ExpectFieldValue("email", "");
+  ExpectFieldValue("phone", "");
+}
+
+// Test that forms that dynamically change after a second do not get filled.
+IN_PROC_BROWSER_TEST_F(DynamicFormInteractiveTest,
+                       DynamicChangingFormFill_AfterDelay) {
+  // Setup that the test expects a re-fill to happen.
+  test_delegate()->SetIsExpectingDynamicRefill(true);
+
+  CreateTestProfile();
+
+  GURL url = embedded_test_server()->GetURL(
+      "a.com", "/autofill/dynamic_form_after_delay.html");
+  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url));
+
+  TriggerFormFill();
+
+  // Wait for the dynamic change to happen.
+  bool has_refilled = false;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderViewHost(), "hasRefilled()", &has_refilled));
+  ASSERT_FALSE(has_refilled);
+
+  // Make sure that the new form was not filled.
+  ExpectFieldValue("firstname", "");
+  ExpectFieldValue("address1", "");
+  ExpectFieldValue("state", "CA");  // Default value.
+  ExpectFieldValue("city", "");
+  ExpectFieldValue("company", "");
+  ExpectFieldValue("email", "");
+  ExpectFieldValue("phone", "");
+}
+
+// Test that only field of a type group that was filled initially get refilled.
+IN_PROC_BROWSER_TEST_F(DynamicFormInteractiveTest,
+                       DynamicChangingFormFill_AddsNewFieldTypeGroups) {
+  // Setup that the test expects a re-fill to happen.
+  test_delegate()->SetIsExpectingDynamicRefill(true);
+
+  CreateTestProfile();
+
+  GURL url = embedded_test_server()->GetURL(
+      "a.com", "/autofill/dynamic_form_new_field_types.html");
+  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url));
+
+  TriggerFormFill();
+
+  // Wait for the dynamic change to happen.
+  bool has_refilled = false;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderViewHost(), "hasRefilled()", &has_refilled));
+  ASSERT_TRUE(has_refilled);
+
+  // The fields present in the initial fill should be filled.
+  ExpectFieldValue("firstname", "Milton");
+  ExpectFieldValue("address1", "4120 Freidrich Lane");
+  ExpectFieldValue("state", "TX");
+  ExpectFieldValue("city", "Austin");
+  // Fields from group that were not present in the initial fill should not be
+  // filled
+  ExpectFieldValue("company", "");
+  // Fields that were present but hidden in the initial fill should not be
+  // filled.
+  ExpectFieldValue("email", "");
+  // The phone should be filled even if it's a different format than the initial
+  // fill.
+  ExpectFieldValue("phone", "5125551234");
+}
+
+// Test that credit card fields are never re-filled.
+IN_PROC_BROWSER_TEST_F(DynamicFormInteractiveTest,
+                       DynamicChangingFormFill_NotForCreditCard) {
+  // Setup that the test expects a re-fill to happen.
+  test_delegate()->SetIsExpectingDynamicRefill(true);
+
+  // Add a credit card.
+  CreditCard card;
+  test::SetCreditCardInfo(&card, "Milton Waddams", "4111111111111111", "09",
+                          "2999", "");
+  AddTestCreditCard(browser(), card);
+
+  // Navigate to the page.
+  GURL url = https_server()->GetURL("a.com",
+                                    "/autofill/dynamic_form_credit_card.html");
+  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url));
+
+  // Trigger the initial fill.
+  FocusFieldByName("cc-name");
+  SendKeyToPageAndWait(ui::DomKey::FromCharacter('M'), ui::DomCode::US_M,
+                       ui::VKEY_M);
+  SendKeyToPopupAndWait(ui::DomKey::ARROW_DOWN);
+  SendKeyToPopupAndWait(ui::DomKey::ENTER);
+
+  // Wait for the dynamic change to happen.
+  bool has_refilled = false;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderViewHost(), "hasRefilled()", &has_refilled));
+  ASSERT_FALSE(has_refilled);
+
+  // There should be no values in the fields.
+  ExpectFieldValue("cc-name", "");
+  ExpectFieldValue("cc-num", "");
+  ExpectFieldValue("cc-exp-month", "01");   // Default value.
+  ExpectFieldValue("cc-exp-year", "2010");  // Default value.
+  ExpectFieldValue("cc-csc", "");
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/autofill/autofill_uitest_util.cc b/chrome/browser/autofill/autofill_uitest_util.cc
index 97ff742a..30df613 100644
--- a/chrome/browser/autofill/autofill_uitest_util.cc
+++ b/chrome/browser/autofill/autofill_uitest_util.cc
@@ -9,6 +9,8 @@
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/personal_data_manager_observer.h"
 #include "content/public/test/test_utils.h"
@@ -60,7 +62,7 @@
 }
 
 void AddTestProfile(Browser* browser, const AutofillProfile& profile) {
-    PdmChangeWaiter observer(browser);
+  PdmChangeWaiter observer(browser);
   GetPersonalDataManager(browser->profile())->AddProfile(profile);
 
   // AddProfile is asynchronous. Wait for it to finish before continuing the
@@ -80,4 +82,13 @@
   observer.Wait();
 }
 
+void AddTestCreditCard(Browser* browser, const CreditCard& card) {
+  PdmChangeWaiter observer(browser);
+  GetPersonalDataManager(browser->profile())->AddCreditCard(card);
+
+  // AddCreditCard is asynchronous. Wait for it to finish before continuing the
+  // tests.
+  observer.Wait();
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/autofill/autofill_uitest_util.h b/chrome/browser/autofill/autofill_uitest_util.h
index dc4fe6b..0cbcfa3d 100644
--- a/chrome/browser/autofill/autofill_uitest_util.h
+++ b/chrome/browser/autofill/autofill_uitest_util.h
@@ -12,11 +12,14 @@
 namespace autofill {
 
 class AutofillProfile;
+class CreditCard;
 
 void AddTestProfile(Browser* browser, const AutofillProfile& profile);
 void SetTestProfile(Browser* browser, const AutofillProfile& profile);
 void SetTestProfiles(Browser* browser, std::vector<AutofillProfile>* profiles);
 
+void AddTestCreditCard(Browser* browser, const CreditCard& card);
+
 }  // namespace autofill
 
 #endif  // CHROME_BROWSER_AUTOFILL_AUTOFILL_UITEST_UTIL_H_
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 46a3f2c..0aaf4c4 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -64,6 +64,7 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
+#include "components/device_event_log/device_event_log.h"
 #include "components/domain_reliability/service.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/language/core/browser/url_language_histogram.h"
@@ -675,6 +676,8 @@
             CreatePendingTaskCompletionClosure());
       }
     }
+
+    device_event_log::Clear(delete_begin_, delete_end_);
   }
 
   //////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
index f27f7a8..8d73eaa3 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -977,7 +977,8 @@
   void QueueReport(const GURL& url,
                    const std::string& group,
                    const std::string& type,
-                   std::unique_ptr<const base::Value> body) override {
+                   std::unique_ptr<const base::Value> body,
+                   int depth) override {
     NOTREACHED();
   }
 
@@ -994,9 +995,9 @@
     last_origin_filter_ = origin_filter;
   }
 
-  bool RequestIsUpload(const net::URLRequest& request) override {
+  int GetUploadDepth(const net::URLRequest& request) override {
     NOTREACHED();
-    return true;
+    return 0;
   }
 
   const net::ReportingPolicy& GetPolicy() const override {
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 93710f1..f544c76 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -1491,62 +1491,6 @@
     chrome_extra_parts_[i]->PostProfileInit();
 }
 
-#if defined(SYZYASAN)
-
-// This function must be in the global namespace as it needs to be friended
-// by ChromeMetricsServiceAccessor.
-void SyzyASANRegisterExperiment(const char* name, const char* group) {
-  ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(name, group);
-}
-
-namespace {
-
-void WINAPI SyzyASANExperimentCallback(const char* name, const char* group) {
-  // Indirect through the function above, so that the friend declaration doesn't
-  // need the ugly calling convention.
-  SyzyASANRegisterExperiment(name, group);
-}
-
-void SetupSyzyASAN() {
-  typedef VOID(WINAPI* SyzyASANExperimentCallbackFn)(const char* name,
-                                                     const char* group);
-  typedef VOID(WINAPI* SyzyASANEnumExperimentsFn)(SyzyASANExperimentCallbackFn);
-  HMODULE syzyasan_handle = ::GetModuleHandle(L"syzyasan_rtl.dll");
-  if (!syzyasan_handle)
-    return;
-
-  // Export the SyzyASAN experiments as synthetic field trials.
-  SyzyASANEnumExperimentsFn syzyasan_enum_experiments =
-      reinterpret_cast<SyzyASANEnumExperimentsFn>(
-            ::GetProcAddress(syzyasan_handle, "asan_EnumExperiments"));
-  if (syzyasan_enum_experiments) {
-    syzyasan_enum_experiments(&SyzyASANExperimentCallback);
-  }
-
-  // Enable the deferred free mechanism in the syzyasan module, which helps the
-  // performance by deferring some work on the critical path to a background
-  // thread. Note that this is now enabled by default, the feature is kept as a
-  // kill switch.
-  if (base::FeatureList::IsEnabled(features::kSyzyasanDeferredFree)) {
-    typedef VOID(WINAPI * SyzyasanEnableDeferredFreeThreadFunc)(VOID);
-    bool success = false;
-    SyzyasanEnableDeferredFreeThreadFunc syzyasan_enable_deferred_free =
-        reinterpret_cast<SyzyasanEnableDeferredFreeThreadFunc>(
-            ::GetProcAddress(syzyasan_handle,
-                             "asan_EnableDeferredFreeThread"));
-    if (syzyasan_enable_deferred_free) {
-      syzyasan_enable_deferred_free();
-      success = true;
-    }
-    UMA_HISTOGRAM_BOOLEAN("Syzyasan.DeferredFreeWasEnabled", success);
-  }
-}
-
-}  // namespace
-
-#endif  // SYZYASAN
-
-
 void ChromeBrowserMainParts::PreBrowserStart() {
   TRACE_EVENT0("startup", "ChromeBrowserMainParts::PreBrowserStart");
   for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
@@ -1554,10 +1498,6 @@
 
   three_d_observer_.reset(new ThreeDAPIObserver());
 
-#if defined(SYZYASAN)
-  SetupSyzyASAN();
-#endif
-
 // Start the tab manager here so that we give the most amount of time for the
 // other services to start up before we start adjusting the oom priority.
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
@@ -2210,23 +2150,6 @@
 
   restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop();
   browser_process_->StartTearDown();
-
-#if defined(SYZYASAN)
-  // Disable the deferred free mechanism in the syzyasan module. This is needed
-  // to avoid a potential crash when the syzyasan module is unloaded.
-  if (base::FeatureList::IsEnabled(features::kSyzyasanDeferredFree)) {
-    typedef VOID(WINAPI * SyzyasanDisableDeferredFreeThreadFunc)(VOID);
-    HMODULE syzyasan_handle = ::GetModuleHandle(L"syzyasan_rtl.dll");
-    if (syzyasan_handle) {
-      SyzyasanDisableDeferredFreeThreadFunc syzyasan_disable_deferred_free =
-          reinterpret_cast<SyzyasanDisableDeferredFreeThreadFunc>(
-              ::GetProcAddress(syzyasan_handle,
-                               "asan_DisableDeferredFreeThread"));
-      if (syzyasan_disable_deferred_free)
-        syzyasan_disable_deferred_free();
-    }
-  }
-#endif  // defined(SYZYASAN)
 #endif  // defined(OS_ANDROID)
 }
 
diff --git a/chrome/browser/chromeos/arc/arc_optin_uma.h b/chrome/browser/chromeos/arc/arc_optin_uma.h
index 706b5f7..68d0316 100644
--- a/chrome/browser/chromeos/arc/arc_optin_uma.h
+++ b/chrome/browser/chromeos/arc/arc_optin_uma.h
@@ -19,17 +19,23 @@
 
 // These enums are used to define the buckets for an enumerated UMA histogram
 // and need to be synced with tools/metrics/histograms/enums.xml. Note that
-// values 2, 3 and 4 are now deprecated.
+// values 0, 1, 2, 3 and 4 are now deprecated.
 enum class OptInActionType : int {
-  // ARC was opted out by user.
-  OPTED_OUT = 0,
-
-  // ARC was opted in by user.
-  OPTED_IN = 1,
-
   // User asked to retry OptIn.
   RETRY = 5,
 
+  // ARC was opted in by user from OOBE flow.
+  OOBE_OPTED_IN = 6,
+
+  // ARC was opted out by user from OOBE flow.
+  OOBE_OPTED_OUT = 7,
+
+  // ARC was opted in by user from session.
+  SESSION_OPTED_IN = 8,
+
+  // ARC was opted out by user from session.
+  SESSION_OPTED_OUT = 9,
+
   // The size of this enum; keep last.
   SIZE,
 };
diff --git a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.cc b/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.cc
index 130a439..3899cda 100644
--- a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.cc
+++ b/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.cc
@@ -50,13 +50,15 @@
   VLOG(1) << "Start observing Google Play Store enabled preference. "
           << "Initial value: " << is_play_store_enabled;
 
-  // If the OOBE screen is shown, don't kill the mini-container.
-  // We'll do it if and when the user declines the TOS. We need to check
-  // |is_play_store_enabled| to handle the case where |kArcEnabled| is managed
-  // but some of the preferences still need to be set by the user.
+  // If the OOBE or Assistant Wizard screen is shown, don't kill the
+  // mini-container. We'll do it if and when the user declines the TOS. We need
+  // to check |is_play_store_enabled| to handle the case where |kArcEnabled| is
+  // managed but some of the preferences still need to be set by the user.
   // TODO(cmtm): This feature isn't covered by unittests. Add a unittest for it.
-  if (!IsArcOobeOptInActive() || is_play_store_enabled)
+  if (!(IsArcOobeOptInActive() || IsArcOptInWizardForAssistantActive()) ||
+      is_play_store_enabled) {
     UpdateArcSessionManager();
+  }
   if (is_play_store_enabled)
     return;
 
@@ -80,9 +82,19 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   const bool is_play_store_enabled = IsArcPlayStoreEnabledForProfile(profile_);
   if (!IsArcPlayStoreEnabledPreferenceManagedForProfile(profile_)) {
-    // Update UMA only for non-Managed cases.
-    UpdateOptInActionUMA(is_play_store_enabled ? OptInActionType::OPTED_IN
-                                               : OptInActionType::OPTED_OUT);
+    // Update UMA only for non-Managed cases. Note, that multiple OptIn/OptOut
+    // may happen during a session. In this case each event would be reported.
+    // For example, if a user opts-in ARC on OOBE, and later opts-out via
+    // settings page, OOBE_OPTED_IN and SESSION_OPTED_OUT will be recorded.
+    if (IsArcOobeOptInActive()) {
+      UpdateOptInActionUMA(is_play_store_enabled
+                               ? OptInActionType::OOBE_OPTED_IN
+                               : OptInActionType::OOBE_OPTED_OUT);
+    } else {
+      UpdateOptInActionUMA(is_play_store_enabled
+                               ? OptInActionType::SESSION_OPTED_IN
+                               : OptInActionType::SESSION_OPTED_OUT);
+    }
 
     if (!is_play_store_enabled) {
       // Remove the pinned Play Store icon launcher in Shelf.
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.cc b/chrome/browser/chromeos/arc/arc_session_manager.cc
index ba2b8c7e..a5bfb710 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.cc
+++ b/chrome/browser/chromeos/arc/arc_session_manager.cc
@@ -305,7 +305,7 @@
     // it less weird that a browser window pops up.
     const bool suppress_play_store_app =
         !IsPlayStoreAvailable() || IsArcOptInVerificationDisabled() ||
-        IsRobotAccountMode() || oobe_start_ ||
+        IsRobotAccountMode() || oobe_or_assistant_wizard_start_ ||
         (IsArcPlayStoreEnabledPreferenceManagedForProfile(profile_) &&
          AreArcAllOptInPreferencesIgnorableForProfile(profile_));
     if (!suppress_play_store_app) {
@@ -607,7 +607,8 @@
     return false;
   }
 
-  oobe_start_ = IsArcOobeOptInActive();
+  oobe_or_assistant_wizard_start_ =
+      IsArcOobeOptInActive() || IsArcOptInWizardForAssistantActive();
 
   PrefService* const prefs = profile_->GetPrefs();
 
@@ -670,7 +671,7 @@
     return;
   }
 
-  oobe_start_ = false;
+  oobe_or_assistant_wizard_start_ = false;
   directly_started_ = false;
   enable_requested_ = false;
   scoped_opt_in_tracker_.reset();
@@ -737,7 +738,7 @@
     return;
   }
 
-  if (IsArcOobeOptInActive()) {
+  if (IsArcOobeOptInActive() || IsArcOptInWizardForAssistantActive()) {
     VLOG(1) << "Use OOBE negotiator.";
     terms_of_service_negotiator_ =
         std::make_unique<ArcTermsOfServiceOobeNegotiator>();
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.h b/chrome/browser/chromeos/arc/arc_session_manager.h
index c9e561c0..d241581 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.h
+++ b/chrome/browser/chromeos/arc/arc_session_manager.h
@@ -364,10 +364,12 @@
   bool reenable_arc_ = false;
   bool provisioning_reported_ = false;
   // In case ARC is started from OOBE |oobe_start_|, set to true. This flag is
-  // used to remember |IsArcOobeOptInActive| state when ARC start request was
-  // made.  |IsArcOobeOptInActive| will be changed by the time when
-  // |oobe_start_| is checked to prevent the Play Store auto-launch.
-  bool oobe_start_ = false;
+  // used to remember |IsArcOobeOptInActive| or
+  // |IsArcOptInWizardForAssistantActive| state when ARC start request was made.
+  // |IsArcOobeOptInActive| or |IsArcOptInWizardForAssistantActive| will be
+  // changed by the time when |oobe_or_opa_start_| is checked to prevent the
+  // Play Store auto-launch.
+  bool oobe_or_assistant_wizard_start_ = false;
   bool directly_started_ = false;
   base::OneShotTimer arc_sign_in_timer_;
 
diff --git a/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc b/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
index 92a2d36..745ef68 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
+++ b/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
@@ -24,9 +24,8 @@
 #include "chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h"
 #include "chrome/browser/chromeos/login/screens/arc_terms_of_service_screen_view.h"
 #include "chrome/browser/chromeos/login/screens/arc_terms_of_service_screen_view_observer.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/policy/profile_policy_connector_factory.h"
@@ -65,96 +64,6 @@
 
 namespace {
 
-class FakeBaseScreen : public chromeos::BaseScreen {
- public:
-  explicit FakeBaseScreen(chromeos::OobeScreen screen_id)
-      : BaseScreen(nullptr, screen_id) {}
-
-  ~FakeBaseScreen() override = default;
-
-  // chromeos::BaseScreen:
-  void Show() override {}
-  void Hide() override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FakeBaseScreen);
-};
-
-class FakeLoginDisplayHost : public chromeos::LoginDisplayHost {
- public:
-  FakeLoginDisplayHost() = default;
-  ~FakeLoginDisplayHost() override = default;
-
-  /// chromeos::LoginDisplayHost:
-  chromeos::LoginDisplay* CreateLoginDisplay(
-      chromeos::LoginDisplay::Delegate* delegate) override {
-    return nullptr;
-  }
-  gfx::NativeWindow GetNativeWindow() const override { return nullptr; }
-  chromeos::OobeUI* GetOobeUI() const override { return nullptr; }
-  chromeos::WebUILoginView* GetWebUILoginView() const override {
-    return nullptr;
-  }
-  void BeforeSessionStart() override {}
-  void Finalize(base::OnceClosure) override {}
-  void SetStatusAreaVisible(bool visible) override {}
-  void StartWizard(chromeos::OobeScreen first_screen) override {
-    // Reset the controller first since there could only be one wizard
-    // controller at any time.
-    wizard_controller_.reset();
-    wizard_controller_ =
-        std::make_unique<chromeos::WizardController>(nullptr, nullptr);
-
-    fake_screen_ = std::make_unique<FakeBaseScreen>(first_screen);
-    wizard_controller_->SetCurrentScreenForTesting(fake_screen_.get());
-  }
-  chromeos::WizardController* GetWizardController() override {
-    return wizard_controller_.get();
-  }
-  chromeos::AppLaunchController* GetAppLaunchController() override {
-    return nullptr;
-  }
-  void StartUserAdding(base::OnceClosure completion_callback) override {}
-  void CancelUserAdding() override {}
-  void StartSignInScreen(const chromeos::LoginScreenContext& context) override {
-  }
-  void OnPreferencesChanged() override {}
-  void PrewarmAuthentication() override {}
-  void StartAppLaunch(const std::string& app_id,
-                      bool diagnostic_mode,
-                      bool is_auto_launch) override {}
-  void StartDemoAppLaunch() override {}
-  void StartArcKiosk(const AccountId& account_id) override {}
-  void StartVoiceInteractionOobe() override {
-    is_voice_interaction_oobe_ = true;
-  }
-  bool IsVoiceInteractionOobe() override { return is_voice_interaction_oobe_; }
-  void CompleteLogin(const chromeos::UserContext& user_context) override {}
-  void OnGaiaScreenReady() override {}
-  void SetDisplayEmail(const std::string& email) override {}
-  void SetDisplayAndGivenName(const std::string& display_name,
-                              const std::string& given_name) override {}
-  void LoadWallpaper(const AccountId& account_id) override {}
-  void LoadSigninWallpaper() override {}
-  bool IsUserWhitelisted(const AccountId& account_id) override { return false; }
-  void UpdateGaiaDialogVisibility(bool visible) override {}
-  void UpdateGaiaDialogSize(int width, int height) override {}
-  const user_manager::UserList GetUsers() override {
-    return user_manager::UserList();
-  }
-
- private:
-  bool is_voice_interaction_oobe_ = false;
-
-  // SessionManager is required by the constructor of WizardController.
-  std::unique_ptr<session_manager::SessionManager> session_manager_ =
-      std::make_unique<session_manager::SessionManager>();
-  std::unique_ptr<FakeBaseScreen> fake_screen_;
-  std::unique_ptr<chromeos::WizardController> wizard_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeLoginDisplayHost);
-};
-
 class ArcSessionManagerInLoginScreenTest : public testing::Test {
  public:
   ArcSessionManagerInLoginScreenTest()
@@ -899,54 +808,15 @@
   EXPECT_TRUE(terminated);
 }
 
-class ArcSessionOobeOptInTest : public ArcSessionManagerTest {
- public:
-  ArcSessionOobeOptInTest() = default;
-
- protected:
-  void CreateLoginDisplayHost() {
-    fake_login_display_host_ = std::make_unique<FakeLoginDisplayHost>();
-  }
-
-  FakeLoginDisplayHost* login_display_host() {
-    return fake_login_display_host_.get();
-  }
-
-  void CloseLoginDisplayHost() { fake_login_display_host_.reset(); }
-
- private:
-  std::unique_ptr<FakeLoginDisplayHost> fake_login_display_host_;
-
-  DISALLOW_COPY_AND_ASSIGN(ArcSessionOobeOptInTest);
-};
-
-TEST_F(ArcSessionOobeOptInTest, OobeOptInActive) {
-  // OOBE OptIn is active in case of OOBE controller is alive and the ARC ToS
-  // screen is currently showing.
-  EXPECT_FALSE(IsArcOobeOptInActive());
-  CreateLoginDisplayHost();
-  EXPECT_FALSE(IsArcOobeOptInActive());
-  GetFakeUserManager()->set_current_user_new(true);
-  EXPECT_TRUE(IsArcOobeOptInActive());
-  login_display_host()->StartVoiceInteractionOobe();
-  EXPECT_FALSE(IsArcOobeOptInActive());
-  login_display_host()->StartWizard(
-      chromeos::OobeScreen::SCREEN_VOICE_INTERACTION_VALUE_PROP);
-  EXPECT_FALSE(IsArcOobeOptInActive());
-  login_display_host()->StartWizard(
-      chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
-  EXPECT_TRUE(IsArcOobeOptInActive());
-}
-
 class ArcSessionOobeOptInNegotiatorTest
-    : public ArcSessionOobeOptInTest,
+    : public ArcSessionManagerTest,
       public chromeos::ArcTermsOfServiceScreenView,
       public testing::WithParamInterface<bool> {
  public:
   ArcSessionOobeOptInNegotiatorTest() = default;
 
   void SetUp() override {
-    ArcSessionOobeOptInTest::SetUp();
+    ArcSessionManagerTest::SetUp();
 
     ArcTermsOfServiceOobeNegotiator::SetArcTermsOfServiceScreenViewForTesting(
         this);
@@ -979,7 +849,7 @@
     ArcTermsOfServiceOobeNegotiator::SetArcTermsOfServiceScreenViewForTesting(
         nullptr);
 
-    ArcSessionOobeOptInTest::TearDown();
+    ArcSessionManagerTest::TearDown();
   }
 
  protected:
@@ -1001,6 +871,17 @@
     base::RunLoop().RunUntilIdle();
   }
 
+  void CreateLoginDisplayHost() {
+    fake_login_display_host_ =
+        std::make_unique<chromeos::FakeLoginDisplayHost>();
+  }
+
+  chromeos::FakeLoginDisplayHost* login_display_host() {
+    return fake_login_display_host_.get();
+  }
+
+  void CloseLoginDisplayHost() { fake_login_display_host_.reset(); }
+
   chromeos::ArcTermsOfServiceScreenView* view() { return this; }
 
  private:
@@ -1026,6 +907,7 @@
 
   base::ObserverList<chromeos::ArcTermsOfServiceScreenViewObserver>
       observer_list_;
+  std::unique_ptr<chromeos::FakeLoginDisplayHost> fake_login_display_host_;
 
   DISALLOW_COPY_AND_ASSIGN(ArcSessionOobeOptInNegotiatorTest);
 };
diff --git a/chrome/browser/chromeos/arc/arc_util.cc b/chrome/browser/chromeos/arc/arc_util.cc
index a8d9ff7..30162c0 100644
--- a/chrome/browser/chromeos/arc/arc_util.cc
+++ b/chrome/browser/chromeos/arc/arc_util.cc
@@ -423,34 +423,44 @@
   if (!IsPlayStoreAvailable())
     return false;
 
-  // Check if Chrome OS OOBE or OPA OptIn flow is currently showing.
-  // TODO(b/65861628): Rename the method since it is no longer accurate.
-  // Redesign the OptIn flow since there is no longer reason to have two
-  // different OptIn flows.
+  // Check if Chrome OS OOBE flow is currently showing.
+  // TODO(b/65861628): Redesign the OptIn flow since there is no longer reason
+  // to have two different OptIn flows.
+  if (!chromeos::LoginDisplayHost::default_host())
+    return false;
+
+  // Use the legacy logic for first sign-in OOBE OptIn flow. Make sure the user
+  // is new.
+  if (!user_manager::UserManager::Get()->IsCurrentUserNew())
+    return false;
+
+  // Differentiate the case when Assistant Wizard is started later for the new
+  // user session. For example, OOBE was shown and user pressed Skip button.
+  // Later in the same user session user activates Assistant and we show
+  // Assistant Wizard with ARC terms. This case is not considered as OOBE OptIn.
+  return !IsArcOptInWizardForAssistantActive();
+}
+
+bool IsArcOptInWizardForAssistantActive() {
+  // Check if Assistant Wizard is currently showing.
+  // TODO(b/65861628): Redesign the OptIn flow since there is no longer reason
+  // to have two different OptIn flows.
   chromeos::LoginDisplayHost* host = chromeos::LoginDisplayHost::default_host();
-  if (!host)
+  if (!host || !host->IsVoiceInteractionOobe())
     return false;
 
   // Make sure the wizard controller is active and have the ARC ToS screen
   // showing for the voice interaction OptIn flow.
-  if (host->IsVoiceInteractionOobe()) {
-    const chromeos::WizardController* wizard_controller =
-        host->GetWizardController();
-    if (!wizard_controller)
-      return false;
-    const chromeos::BaseScreen* screen = wizard_controller->current_screen();
-    if (!screen)
-      return false;
-    return screen->screen_id() ==
-           chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE;
-  }
-
-  // Use the legacy logic for first sign-in OOBE OptIn flow. Make sure the user
-  // is new and the swtich is appended.
-  if (!user_manager::UserManager::Get()->IsCurrentUserNew())
+  const chromeos::WizardController* wizard_controller =
+      host->GetWizardController();
+  if (!wizard_controller)
     return false;
 
-  return true;
+  const chromeos::BaseScreen* screen = wizard_controller->current_screen();
+  if (!screen)
+    return false;
+  return screen->screen_id() ==
+         chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE;
 }
 
 bool IsArcTermsOfServiceNegotiationNeeded(const Profile* profile) {
diff --git a/chrome/browser/chromeos/arc/arc_util.h b/chrome/browser/chromeos/arc/arc_util.h
index afe3f9c6..4332182 100644
--- a/chrome/browser/chromeos/arc/arc_util.h
+++ b/chrome/browser/chromeos/arc/arc_util.h
@@ -126,6 +126,10 @@
 // Returns true if ChromeOS OOBE opt-in window is currently showing.
 bool IsArcOobeOptInActive();
 
+// Returns true if OPA opt-in window is currently showing and active screen is
+// ARC ToS.
+bool IsArcOptInWizardForAssistantActive();
+
 // Returns true if Terms of Service negotiation is needed. Otherwise false.
 bool IsArcTermsOfServiceNegotiationNeeded(const Profile* profile);
 
diff --git a/chrome/browser/chromeos/arc/arc_util_unittest.cc b/chrome/browser/chromeos/arc/arc_util_unittest.cc
index a30baae4..b88501a7 100644
--- a/chrome/browser/chromeos/arc/arc_util_unittest.cc
+++ b/chrome/browser/chromeos/arc/arc_util_unittest.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/supervised/supervised_user_creation_flow.h"
+#include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -988,5 +989,94 @@
                                        false /* arc_enabled */,
                                        false /* expect_migration_allowed */}));
 
+class ArcOobeOpaOptInActiveInTest : public ChromeArcUtilTest {
+ public:
+  ArcOobeOpaOptInActiveInTest() = default;
+
+ protected:
+  void CreateLoginDisplayHost() {
+    fake_login_display_host_ =
+        std::make_unique<chromeos::FakeLoginDisplayHost>();
+  }
+
+  chromeos::FakeLoginDisplayHost* login_display_host() {
+    return fake_login_display_host_.get();
+  }
+
+  void CloseLoginDisplayHost() { fake_login_display_host_.reset(); }
+
+ private:
+  std::unique_ptr<chromeos::FakeLoginDisplayHost> fake_login_display_host_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcOobeOpaOptInActiveInTest);
+};
+
+TEST_F(ArcOobeOpaOptInActiveInTest, OobeOptInActive) {
+  // OOBE OptIn is active in case of OOBE controller is alive and the ARC ToS
+  // screen is currently showing.
+  EXPECT_FALSE(IsArcOobeOptInActive());
+  CreateLoginDisplayHost();
+  EXPECT_FALSE(IsArcOobeOptInActive());
+  GetFakeUserManager()->set_current_user_new(true);
+  EXPECT_TRUE(IsArcOobeOptInActive());
+  // OOBE OptIn can be started only for new user flow.
+  GetFakeUserManager()->set_current_user_new(false);
+  EXPECT_FALSE(IsArcOobeOptInActive());
+  // ARC ToS wizard but not for new user.
+  login_display_host()->StartWizard(
+      chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
+  EXPECT_FALSE(IsArcOobeOptInActive());
+}
+
+TEST_F(ArcOobeOpaOptInActiveInTest, NewUserAndAssistantWizard) {
+  CreateLoginDisplayHost();
+  GetFakeUserManager()->set_current_user_new(true);
+  login_display_host()->StartVoiceInteractionOobe();
+  login_display_host()->StartWizard(
+      chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
+  EXPECT_FALSE(IsArcOobeOptInActive());
+  EXPECT_TRUE(IsArcOptInWizardForAssistantActive());
+}
+
+// Emulate the following case.
+// Create a new profile on the device.
+// ARC OOBE ToS is expected to be shown, and the user "SKIP" it.
+// Then, the user tries to use Assistant. In such a case, ARC OOBE ToS wizard
+// is used unlike other scenarios to enable ARC during a session, which use
+// ArcSupport.
+// Because, IsArcOobeOptInActive() checks the UI state, this test checks if it
+// works expected for Assistant cases.
+TEST_F(ArcOobeOpaOptInActiveInTest, NoOobeOptInForPlayStoreNotAvailable) {
+  // No OOBE OptIn when Play Store is not available.
+  auto* command_line = base::CommandLine::ForCurrentProcess();
+  command_line->InitFromArgv(
+      {"", "--arc-availability=installed",
+       "--arc-start-mode=always-start-with-no-play-store"});
+  CreateLoginDisplayHost();
+  GetFakeUserManager()->set_current_user_new(true);
+  EXPECT_FALSE(IsArcOobeOptInActive());
+}
+
+TEST_F(ArcOobeOpaOptInActiveInTest, OptInWizardForAssistantActive) {
+  // OPA OptIn is active when wizard is started and  ARC ToS screen is currently
+  // showing.
+  EXPECT_FALSE(IsArcOptInWizardForAssistantActive());
+  CreateLoginDisplayHost();
+  EXPECT_FALSE(IsArcOptInWizardForAssistantActive());
+  GetFakeUserManager()->set_current_user_new(true);
+  EXPECT_FALSE(IsArcOptInWizardForAssistantActive());
+  login_display_host()->StartVoiceInteractionOobe();
+  EXPECT_FALSE(IsArcOptInWizardForAssistantActive());
+  login_display_host()->StartWizard(
+      chromeos::OobeScreen::SCREEN_VOICE_INTERACTION_VALUE_PROP);
+  EXPECT_FALSE(IsArcOptInWizardForAssistantActive());
+  login_display_host()->StartWizard(
+      chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
+  EXPECT_TRUE(IsArcOptInWizardForAssistantActive());
+  // Assistant wizard can be started for any user session.
+  GetFakeUserManager()->set_current_user_new(false);
+  EXPECT_TRUE(IsArcOptInWizardForAssistantActive());
+}
+
 }  // namespace util
 }  // namespace arc
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index a1219e74..0585efe 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -798,7 +798,9 @@
     WizardController::SetZeroDelays();
   }
 
-  power_prefs_.reset(new PowerPrefs(PowerPolicyController::Get()));
+  power_prefs_ = std::make_unique<PowerPrefs>(
+      PowerPolicyController::Get(),
+      DBusThreadManager::Get()->GetPowerManagerClient());
 
   arc_kiosk_app_manager_.reset(new ArcKioskAppManager());
 
diff --git a/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc b/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc
index 2357fe7..7cdefb0 100644
--- a/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc
+++ b/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc
@@ -134,18 +134,18 @@
 std::unique_ptr<ChromeCryptAuthService> ChromeCryptAuthService::Create(
     Profile* profile) {
   std::unique_ptr<cryptauth::CryptAuthGCMManager> gcm_manager =
-      std::make_unique<cryptauth::CryptAuthGCMManagerImpl>(
+      cryptauth::CryptAuthGCMManagerImpl::Factory::NewInstance(
           gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver(),
           profile->GetPrefs());
 
   std::unique_ptr<cryptauth::CryptAuthDeviceManager> device_manager =
-      std::make_unique<cryptauth::CryptAuthDeviceManagerImpl>(
+      cryptauth::CryptAuthDeviceManagerImpl::Factory::NewInstance(
           base::DefaultClock::GetInstance(),
           CreateCryptAuthClientFactoryImpl(profile), gcm_manager.get(),
           profile->GetPrefs());
 
   std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> enrollment_manager =
-      std::make_unique<cryptauth::CryptAuthEnrollmentManagerImpl>(
+      cryptauth::CryptAuthEnrollmentManagerImpl::Factory::NewInstance(
           base::DefaultClock::GetInstance(),
           std::make_unique<CryptAuthEnrollerFactoryImpl>(profile),
           CreateSecureMessageDelegateImpl(), GetGcmDeviceInfo(),
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc
index 1f23a720..06fe1dc 100644
--- a/chrome/browser/chromeos/login/chrome_restart_request.cc
+++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -124,6 +124,7 @@
     ::switches::kEnableUnifiedDesktop,
     ::switches::kEnableUseZoomForDSF,
     ::switches::kEnableViewport,
+    ::switches::kEnableWaylandServer,
     ::switches::kEnableZeroCopy,
     ::switches::kEnableDrmAtomic,
     ::switches::kEnableHardwareOverlays,
@@ -168,6 +169,7 @@
 #endif
     ::switches::kOzonePlatform,
     ash::switches::kAshEnableTabletMode,
+    ash::switches::kAshEnableWaylandServer,
     ash::switches::kAshForceEnableStylusTools,
     ash::switches::kAshEnablePaletteOnAllDisplays,
     ash::switches::kAshTouchHud,
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
new file mode 100644
index 0000000..38be7d97
--- /dev/null
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
@@ -0,0 +1,127 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
+
+#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "components/session_manager/core/session_manager.h"
+
+namespace chromeos {
+
+class FakeLoginDisplayHost::FakeBaseScreen : public chromeos::BaseScreen {
+ public:
+  explicit FakeBaseScreen(chromeos::OobeScreen screen_id)
+      : BaseScreen(nullptr, screen_id) {}
+
+  ~FakeBaseScreen() override = default;
+
+  // chromeos::BaseScreen:
+  void Show() override {}
+  void Hide() override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FakeBaseScreen);
+};
+
+FakeLoginDisplayHost::FakeLoginDisplayHost()
+    : session_manager_(std::make_unique<session_manager::SessionManager>()) {}
+
+FakeLoginDisplayHost::~FakeLoginDisplayHost() = default;
+
+LoginDisplay* FakeLoginDisplayHost::CreateLoginDisplay(
+    LoginDisplay::Delegate* delegate) {
+  return nullptr;
+}
+
+gfx::NativeWindow FakeLoginDisplayHost::GetNativeWindow() const {
+  return nullptr;
+}
+
+OobeUI* FakeLoginDisplayHost::GetOobeUI() const {
+  return nullptr;
+}
+
+WebUILoginView* FakeLoginDisplayHost::GetWebUILoginView() const {
+  return nullptr;
+}
+
+void FakeLoginDisplayHost::BeforeSessionStart() {}
+
+void FakeLoginDisplayHost::Finalize(base::OnceClosure) {}
+
+void FakeLoginDisplayHost::SetStatusAreaVisible(bool visible) {}
+
+void FakeLoginDisplayHost::StartWizard(OobeScreen first_screen) {
+  // Reset the controller first since there could only be one wizard
+  // controller at any time.
+  wizard_controller_.reset();
+  wizard_controller_ = std::make_unique<WizardController>(nullptr, nullptr);
+
+  fake_screen_ = std::make_unique<FakeBaseScreen>(first_screen);
+  wizard_controller_->SetCurrentScreenForTesting(fake_screen_.get());
+}
+
+WizardController* FakeLoginDisplayHost::GetWizardController() {
+  return wizard_controller_.get();
+}
+
+AppLaunchController* FakeLoginDisplayHost::GetAppLaunchController() {
+  return nullptr;
+}
+
+void FakeLoginDisplayHost::StartUserAdding(
+    base::OnceClosure completion_callback) {}
+
+void FakeLoginDisplayHost::CancelUserAdding() {}
+
+void FakeLoginDisplayHost::StartSignInScreen(
+    const LoginScreenContext& context) {}
+
+void FakeLoginDisplayHost::OnPreferencesChanged() {}
+
+void FakeLoginDisplayHost::PrewarmAuthentication() {}
+
+void FakeLoginDisplayHost::StartAppLaunch(const std::string& app_id,
+                                          bool diagnostic_mode,
+                                          bool is_auto_launch) {}
+
+void FakeLoginDisplayHost::StartDemoAppLaunch() {}
+
+void FakeLoginDisplayHost::StartArcKiosk(const AccountId& account_id) {}
+
+void FakeLoginDisplayHost::StartVoiceInteractionOobe() {
+  is_voice_interaction_oobe_ = true;
+}
+
+bool FakeLoginDisplayHost::IsVoiceInteractionOobe() {
+  return is_voice_interaction_oobe_;
+}
+
+void FakeLoginDisplayHost::CompleteLogin(const UserContext& user_context) {}
+
+void FakeLoginDisplayHost::OnGaiaScreenReady() {}
+
+void FakeLoginDisplayHost::SetDisplayEmail(const std::string& email) {}
+
+void FakeLoginDisplayHost::SetDisplayAndGivenName(
+    const std::string& display_name,
+    const std::string& given_name) {}
+
+void FakeLoginDisplayHost::LoadWallpaper(const AccountId& account_id) {}
+
+void FakeLoginDisplayHost::LoadSigninWallpaper() {}
+
+bool FakeLoginDisplayHost::IsUserWhitelisted(const AccountId& account_id) {
+  return false;
+}
+
+void FakeLoginDisplayHost::UpdateGaiaDialogVisibility(bool visible) {}
+
+void FakeLoginDisplayHost::UpdateGaiaDialogSize(int width, int height) {}
+
+const user_manager::UserList FakeLoginDisplayHost::GetUsers() {
+  return user_manager::UserList();
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.h b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
new file mode 100644
index 0000000..204c110
--- /dev/null
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
@@ -0,0 +1,75 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_UI_FAKE_LOGIN_DISPLAY_HOST_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_UI_FAKE_LOGIN_DISPLAY_HOST_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host.h"
+
+namespace session_manager {
+class SessionManager;
+}
+
+namespace chromeos {
+
+class FakeLoginDisplayHost : public LoginDisplayHost {
+ public:
+  FakeLoginDisplayHost();
+  ~FakeLoginDisplayHost() override;
+
+  // chromeos::LoginDisplayHost:
+  LoginDisplay* CreateLoginDisplay(LoginDisplay::Delegate* delegate) override;
+  gfx::NativeWindow GetNativeWindow() const override;
+  OobeUI* GetOobeUI() const override;
+  WebUILoginView* GetWebUILoginView() const override;
+  void BeforeSessionStart() override;
+  void Finalize(base::OnceClosure) override;
+  void SetStatusAreaVisible(bool visible) override;
+  void StartWizard(chromeos::OobeScreen first_screen) override;
+  WizardController* GetWizardController() override;
+  AppLaunchController* GetAppLaunchController() override;
+  void StartUserAdding(base::OnceClosure completion_callback) override;
+  void CancelUserAdding() override;
+  void StartSignInScreen(const LoginScreenContext& context) override;
+  void OnPreferencesChanged() override;
+  void PrewarmAuthentication() override;
+  void StartAppLaunch(const std::string& app_id,
+                      bool diagnostic_mode,
+                      bool is_auto_launch) override;
+  void StartDemoAppLaunch() override;
+  void StartArcKiosk(const AccountId& account_id) override;
+  void StartVoiceInteractionOobe() override;
+  bool IsVoiceInteractionOobe() override;
+  void CompleteLogin(const chromeos::UserContext& user_context) override;
+  void OnGaiaScreenReady() override;
+  void SetDisplayEmail(const std::string& email) override;
+  void SetDisplayAndGivenName(const std::string& display_name,
+                              const std::string& given_name) override;
+  void LoadWallpaper(const AccountId& account_id) override;
+  void LoadSigninWallpaper() override;
+  bool IsUserWhitelisted(const AccountId& account_id) override;
+  void UpdateGaiaDialogVisibility(bool visible) override;
+  void UpdateGaiaDialogSize(int width, int height) override;
+  const user_manager::UserList GetUsers() override;
+
+ private:
+  class FakeBaseScreen;
+
+  bool is_voice_interaction_oobe_ = false;
+
+  // SessionManager is required by the constructor of WizardController.
+  std::unique_ptr<session_manager::SessionManager> session_manager_;
+  std::unique_ptr<FakeBaseScreen> fake_screen_;
+  std::unique_ptr<WizardController> wizard_controller_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeLoginDisplayHost);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_UI_FAKE_LOGIN_DISPLAY_HOST_H_
diff --git a/chrome/browser/chromeos/power/power_prefs.cc b/chrome/browser/chromeos/power/power_prefs.cc
index 6923d4d..bb7cd793 100644
--- a/chrome/browser/chromeos/power/power_prefs.cc
+++ b/chrome/browser/chromeos/power/power_prefs.cc
@@ -10,12 +10,14 @@
 #include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/logging.h"
+#include "base/time/default_tick_clock.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/pref_names.h"
+#include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/dbus/power_policy_controller.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_change_registrar.h"
@@ -26,10 +28,15 @@
 
 namespace chromeos {
 
-PowerPrefs::PowerPrefs(PowerPolicyController* power_policy_controller)
+PowerPrefs::PowerPrefs(PowerPolicyController* power_policy_controller,
+                       PowerManagerClient* power_manager_client)
     : power_policy_controller_(power_policy_controller),
-      profile_(NULL),
-      screen_is_locked_(false) {
+      power_manager_client_observer_(this),
+      tick_clock_(base::DefaultTickClock::GetInstance()) {
+  DCHECK(power_manager_client);
+  DCHECK(power_policy_controller_);
+  DCHECK(tick_clock_);
+
   notification_registrar_.Add(this,
                               chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
                               content::NotificationService::AllSources());
@@ -42,10 +49,10 @@
   notification_registrar_.Add(this,
                               chrome::NOTIFICATION_PROFILE_DESTROYED,
                               content::NotificationService::AllSources());
+  power_manager_client_observer_.Add(power_manager_client);
 }
 
-PowerPrefs::~PowerPrefs() {
-}
+PowerPrefs::~PowerPrefs() = default;
 
 // static
 void PowerPrefs::RegisterUserProfilePrefs(
@@ -69,6 +76,21 @@
                                 PowerPolicyController::ACTION_SHUT_DOWN);
 }
 
+void PowerPrefs::ScreenIdleStateChanged(
+    const power_manager::ScreenIdleState& proto) {
+  const bool already_off = !screen_idle_off_time_.is_null();
+  if (proto.off() == already_off)
+    return;
+
+  screen_idle_off_time_ =
+      proto.off() ? tick_clock_->NowTicks() : base::TimeTicks();
+
+  // If the screen is locked and we're no longer idle, we may need to switch to
+  // the lock-based delays.
+  if (!screen_lock_time_.is_null() && !proto.off())
+    UpdatePowerPolicyFromPrefs();
+}
+
 void PowerPrefs::Observe(int type,
                          const content::NotificationSource& source,
                          const content::NotificationDetails& details) {
@@ -80,12 +102,16 @@
         SetProfile(ProfileHelper::GetSigninProfile());
       break;
     }
-    case chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED:
-      // Update the policy in case different delays have been set for the lock
-      // screen.
-      screen_is_locked_ = *content::Details<bool>(details).ptr();
-      UpdatePowerPolicyFromPrefs();
+    case chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED: {
+      const bool locked = *content::Details<bool>(details).ptr();
+      const bool already_locked = !screen_lock_time_.is_null();
+      if (locked != already_locked) {
+        screen_lock_time_ =
+            locked ? tick_clock_->NowTicks() : base::TimeTicks();
+        UpdatePowerPolicyFromPrefs();
+      }
       break;
+    }
     case chrome::NOTIFICATION_SESSION_STARTED:
       // Update |profile_| when entering a session.
       SetProfile(ProfileManager::GetPrimaryUserProfile());
@@ -138,14 +164,24 @@
     return;
   }
 
+  // It's possible to end up in a situation where a shortened lock-screen idle
+  // delay would cause the system to suspend immediately as soon as the screen
+  // is locked due to inactivity; see https://crbug.com/807861 for the gory
+  // details. To avoid this, don't switch to the shorter delays immediately when
+  // the screen is locked automatically (as indicated by the screen having been
+  // previously turned off for inactivity).
+  bool use_lock_delays = !screen_lock_time_.is_null() &&
+                         (screen_idle_off_time_.is_null() ||
+                          screen_idle_off_time_ > screen_lock_time_);
+
   const PrefService* prefs = pref_change_registrar_->prefs();
   PowerPolicyController::PrefValues values;
   values.ac_screen_dim_delay_ms =
-      prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenDimDelayMs :
-          prefs::kPowerAcScreenDimDelayMs);
+      prefs->GetInteger(use_lock_delays ? prefs::kPowerLockScreenDimDelayMs
+                                        : prefs::kPowerAcScreenDimDelayMs);
   values.ac_screen_off_delay_ms =
-      prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenOffDelayMs :
-          prefs::kPowerAcScreenOffDelayMs);
+      prefs->GetInteger(use_lock_delays ? prefs::kPowerLockScreenOffDelayMs
+                                        : prefs::kPowerAcScreenOffDelayMs);
   values.ac_screen_lock_delay_ms =
       prefs->GetInteger(prefs::kPowerAcScreenLockDelayMs);
   values.ac_idle_warning_delay_ms =
@@ -153,11 +189,11 @@
   values.ac_idle_delay_ms =
       prefs->GetInteger(prefs::kPowerAcIdleDelayMs);
   values.battery_screen_dim_delay_ms =
-      prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenDimDelayMs :
-          prefs::kPowerBatteryScreenDimDelayMs);
+      prefs->GetInteger(use_lock_delays ? prefs::kPowerLockScreenDimDelayMs
+                                        : prefs::kPowerBatteryScreenDimDelayMs);
   values.battery_screen_off_delay_ms =
-      prefs->GetInteger(screen_is_locked_ ? prefs::kPowerLockScreenOffDelayMs :
-          prefs::kPowerBatteryScreenOffDelayMs);
+      prefs->GetInteger(use_lock_delays ? prefs::kPowerLockScreenOffDelayMs
+                                        : prefs::kPowerBatteryScreenOffDelayMs);
   values.battery_screen_lock_delay_ms =
       prefs->GetInteger(prefs::kPowerBatteryScreenLockDelayMs);
   values.battery_idle_warning_delay_ms =
diff --git a/chrome/browser/chromeos/power/power_prefs.h b/chrome/browser/chromeos/power/power_prefs.h
index d1a23a55..369beec 100644
--- a/chrome/browser/chromeos/power/power_prefs.h
+++ b/chrome/browser/chromeos/power/power_prefs.h
@@ -9,12 +9,19 @@
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "base/scoped_observer.h"
+#include "base/time/tick_clock.h"
+#include "chromeos/dbus/power_manager_client.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 
 class PrefChangeRegistrar;
 class Profile;
 
+namespace power_manager {
+class ScreenIdleState;
+}
+
 namespace user_prefs {
 class PrefRegistrySyncable;
 }
@@ -25,9 +32,11 @@
 
 // Sends an updated power policy to the |power_policy_controller| whenever one
 // of the power-related prefs changes.
-class PowerPrefs : public content::NotificationObserver {
+class PowerPrefs : public PowerManagerClient::Observer,
+                   public content::NotificationObserver {
  public:
-  explicit PowerPrefs(PowerPolicyController* power_policy_controller);
+  PowerPrefs(PowerPolicyController* power_policy_controller,
+             PowerManagerClient* power_manager_client);
   ~PowerPrefs() override;
 
   // Register power prefs with default values applicable to a user profile.
@@ -38,6 +47,12 @@
   static void RegisterLoginProfilePrefs(
       user_prefs::PrefRegistrySyncable* registry);
 
+  void set_tick_clock_for_test(base::TickClock* clock) { tick_clock_ = clock; }
+
+  // PowerManagerClient::Observer:
+  void ScreenIdleStateChanged(
+      const power_manager::ScreenIdleState& proto) override;
+
   // content::NotificationObserver:
   void Observe(int type,
                const content::NotificationSource& source,
@@ -58,11 +73,20 @@
 
   content::NotificationRegistrar notification_registrar_;
 
-  Profile* profile_;  // Not owned.
+  ScopedObserver<PowerManagerClient, PowerManagerClient::Observer>
+      power_manager_client_observer_;
+
+  Profile* profile_ = nullptr;  // Not owned.
   std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
 
-  // True while the screen is locked (but not while the login screen is shown).
-  bool screen_is_locked_;
+  base::TickClock* tick_clock_;  // Not owned.
+
+  // Time at which the screen was locked. Unset if the screen is unlocked.
+  base::TimeTicks screen_lock_time_;
+
+  // Time at which the screen was last turned off due to user inactivity.
+  // Unset if the screen isn't currently turned off due to user inactivity.
+  base::TimeTicks screen_idle_off_time_;
 
   DISALLOW_COPY_AND_ASSIGN(PowerPrefs);
 };
diff --git a/chrome/browser/chromeos/power/power_prefs_unittest.cc b/chrome/browser/chromeos/power/power_prefs_unittest.cc
index b68ea33d..d0523ea 100644
--- a/chrome/browser/chromeos/power/power_prefs_unittest.cc
+++ b/chrome/browser/chromeos/power/power_prefs_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/power/power_prefs.h"
 
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
@@ -13,6 +14,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
+#include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -26,6 +28,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "chromeos/dbus/fake_power_manager_client.h"
+#include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/dbus/power_manager/policy.pb.h"
 #include "chromeos/dbus/power_policy_controller.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -66,10 +69,18 @@
   bool GetExpectedAllowScreenWakeLocksForProfile(Profile* profile) const;
   bool GetCurrentAllowScreenWakeLocks() const;
 
+  // Notify |power_prefs_| about various events.
+  void NotifySessionStarted();
+  void NotifyProfileDestroyed(Profile* profile);
+  void NotifyLockStateChanged(Profile* profile, ScreenLockState state);
+  void NotifyLoginOrLockScreenShown();
+  void NotifyScreenIdleOffChanged(bool off);
+
   content::TestBrowserThreadBundle thread_bundle_;
   TestingProfileManager profile_manager_;
-  PowerPolicyController* power_policy_controller_;     // Not owned.
+  PowerPolicyController* power_policy_controller_ = nullptr;  // Not owned.
   std::unique_ptr<FakePowerManagerClient> fake_power_manager_client_;
+  base::SimpleTestTickClock tick_clock_;
 
   std::unique_ptr<PowerPrefs> power_prefs_;
 
@@ -78,9 +89,7 @@
 
 PowerPrefsTest::PowerPrefsTest()
     : profile_manager_(TestingBrowserProcess::GetGlobal()),
-      power_policy_controller_(NULL),
-      fake_power_manager_client_(new FakePowerManagerClient) {
-}
+      fake_power_manager_client_(std::make_unique<FakePowerManagerClient>()) {}
 
 void PowerPrefsTest::SetUp() {
   testing::Test::SetUp();
@@ -90,7 +99,13 @@
 
   ASSERT_TRUE(profile_manager_.SetUp());
 
-  power_prefs_.reset(new PowerPrefs(power_policy_controller_));
+  power_prefs_ = std::make_unique<PowerPrefs>(power_policy_controller_,
+                                              fake_power_manager_client_.get());
+
+  // Advance the clock an arbitrary amount of time so it won't report zero.
+  tick_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  power_prefs_->set_tick_clock_for_test(&tick_clock_);
+
   EXPECT_FALSE(GetProfile());
   EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(
                 power_manager::PowerManagementPolicy()),
@@ -138,13 +153,13 @@
       prefs->GetInteger(prefs::kPowerBatteryIdleDelayMs));
   expected_policy.set_ac_idle_action(
       static_cast<power_manager::PowerManagementPolicy_Action>(
-            prefs->GetInteger(prefs::kPowerAcIdleAction)));
+          prefs->GetInteger(prefs::kPowerAcIdleAction)));
   expected_policy.set_battery_idle_action(
       static_cast<power_manager::PowerManagementPolicy_Action>(
-            prefs->GetInteger(prefs::kPowerBatteryIdleAction)));
+          prefs->GetInteger(prefs::kPowerBatteryIdleAction)));
   expected_policy.set_lid_closed_action(
       static_cast<power_manager::PowerManagementPolicy_Action>(
-            prefs->GetInteger(prefs::kPowerLidClosedAction)));
+          prefs->GetInteger(prefs::kPowerLidClosedAction)));
   expected_policy.set_use_audio_activity(
       prefs->GetBoolean(prefs::kPowerUseAudioActivity));
   expected_policy.set_use_video_activity(
@@ -175,6 +190,38 @@
   return profile->GetPrefs()->GetBoolean(prefs::kPowerAllowScreenWakeLocks);
 }
 
+void PowerPrefsTest::NotifySessionStarted() {
+  power_prefs_->Observe(chrome::NOTIFICATION_SESSION_STARTED,
+                        content::Source<PowerPrefsTest>(this),
+                        content::NotificationService::NoDetails());
+}
+
+void PowerPrefsTest::NotifyProfileDestroyed(Profile* profile) {
+  power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED,
+                        content::Source<Profile>(profile),
+                        content::NotificationService::NoDetails());
+}
+
+void PowerPrefsTest::NotifyLockStateChanged(Profile* profile,
+                                            ScreenLockState state) {
+  bool locked = (state == LOCKED);
+  power_prefs_->Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
+                        content::Source<Profile>(profile),
+                        content::Details<bool>(&locked));
+}
+
+void PowerPrefsTest::NotifyLoginOrLockScreenShown() {
+  power_prefs_->Observe(chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
+                        content::Source<PowerPrefsTest>(this),
+                        content::NotificationService::NoDetails());
+}
+
+void PowerPrefsTest::NotifyScreenIdleOffChanged(bool off) {
+  power_manager::ScreenIdleState proto;
+  proto.set_off(off);
+  fake_power_manager_client_->SendScreenIdleStateChanged(proto);
+}
+
 TEST_F(PowerPrefsTest, LoginScreen) {
   // Set up login profile.
   std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
@@ -188,10 +235,7 @@
       profile_manager_.CreateTestingProfile(chrome::kInitialProfile));
 
   // Inform power_prefs_ that the login screen is being shown.
-  power_prefs_->Observe(chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
-                        content::Source<PowerPrefsTest>(this),
-                        content::NotificationService::NoDetails());
-
+  NotifyLoginOrLockScreenShown();
   EXPECT_EQ(login_profile, GetProfile());
   EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
             GetCurrentPowerPolicy());
@@ -201,12 +245,9 @@
   TestingProfile* other_profile =
       profile_manager_.CreateTestingProfile("other");
 
-  // Inform power_prefs_ that an unrelated profile has been destroyed.
-  power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED,
-                        content::Source<Profile>(other_profile),
-                        content::NotificationService::NoDetails());
-
-  // Verify that the login profile's power prefs are still being used.
+  // Inform power_prefs_ that an unrelated profile has been destroyed and verify
+  // that the login profile's power prefs are still being used.
+  NotifyProfileDestroyed(other_profile);
   EXPECT_EQ(login_profile, GetProfile());
   EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
             GetCurrentPowerPolicy());
@@ -214,27 +255,18 @@
             GetCurrentAllowScreenWakeLocks());
 
   // Lock the screen and check that the expected delays are used.
-  bool screen_is_locked = true;
-  power_prefs_->Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
-                        content::Source<Profile>(login_profile),
-                        content::Details<bool>(&screen_is_locked));
+  NotifyLockStateChanged(login_profile, LOCKED);
   EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, LOCKED),
             GetCurrentPowerPolicy());
 
   // Unlock the screen.
-  screen_is_locked = false;
-  power_prefs_->Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
-                        content::Source<Profile>(login_profile),
-                        content::Details<bool>(&screen_is_locked));
+  NotifyLockStateChanged(login_profile, UNLOCKED);
   EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
             GetCurrentPowerPolicy());
 
   // Inform power_prefs_ that the login profile has been destroyed.
-  power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED,
-                        content::Source<Profile>(login_profile),
-                        content::NotificationService::NoDetails());
-
   // The login profile's prefs should still be used.
+  NotifyProfileDestroyed(login_profile);
   EXPECT_FALSE(GetProfile());
   EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
             GetCurrentPowerPolicy());
@@ -290,10 +322,7 @@
 }
 
 TEST_F(PowerPrefsUserSessionTest, Basic) {
-  // Inform power_prefs_ that a session has started.
-  power_prefs_->Observe(chrome::NOTIFICATION_SESSION_STARTED,
-                        content::Source<PowerPrefsTest>(this),
-                        content::NotificationService::NoDetails());
+  NotifySessionStarted();
 
   EXPECT_EQ(user_profile_, GetProfile());
   EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
@@ -302,9 +331,7 @@
             GetCurrentAllowScreenWakeLocks());
 
   // Inform power_prefs_ that an unrelated profile has been destroyed.
-  power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED,
-                        content::Source<Profile>(second_user_profile_),
-                        content::NotificationService::NoDetails());
+  NotifyProfileDestroyed(second_user_profile_);
 
   // Verify that the user profile's power prefs are still being used.
   EXPECT_EQ(user_profile_, GetProfile());
@@ -314,9 +341,7 @@
             GetCurrentAllowScreenWakeLocks());
 
   // Simulate the login screen coming up as part of screen locking.
-  power_prefs_->Observe(chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
-                        content::Source<PowerPrefsTest>(this),
-                        content::NotificationService::NoDetails());
+  NotifyLoginOrLockScreenShown();
 
   // Verify that power policy didn't revert to login screen settings.
   EXPECT_EQ(user_profile_, GetProfile());
@@ -327,9 +352,7 @@
 
   // Inform power_prefs_ that the session has ended and the user profile has
   // been destroyed.
-  power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED,
-                        content::Source<Profile>(user_profile_),
-                        content::NotificationService::NoDetails());
+  NotifyProfileDestroyed(user_profile_);
 
   // The user profile's prefs should still be used.
   EXPECT_FALSE(GetProfile());
@@ -337,12 +360,34 @@
             GetCurrentPowerPolicy());
 }
 
-TEST_F(PowerPrefsUserSessionTest, DisabledLockScreen) {
-  // Inform power_prefs_ that a session has started.
-  power_prefs_->Observe(chrome::NOTIFICATION_SESSION_STARTED,
-                        content::Source<PowerPrefsTest>(this),
-                        content::NotificationService::NoDetails());
+TEST_F(PowerPrefsUserSessionTest, AvoidLockDelaysAfterInactivity) {
+  NotifySessionStarted();
+  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
+            GetCurrentPowerPolicy());
 
+  // If the screen was already off due to inactivity when it was locked, we
+  // should continue using the unlocked delays.
+  NotifyScreenIdleOffChanged(true);
+  tick_clock_.Advance(base::TimeDelta::FromSeconds(5));
+  NotifyLockStateChanged(user_profile_, LOCKED);
+  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
+            GetCurrentPowerPolicy());
+
+  // If the screen turns on while still locked, we should switch to the locked
+  // delays.
+  tick_clock_.Advance(base::TimeDelta::FromSeconds(5));
+  NotifyScreenIdleOffChanged(false);
+  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, LOCKED),
+            GetCurrentPowerPolicy());
+
+  tick_clock_.Advance(base::TimeDelta::FromSeconds(5));
+  NotifyLockStateChanged(user_profile_, UNLOCKED);
+  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
+            GetCurrentPowerPolicy());
+}
+
+TEST_F(PowerPrefsUserSessionTest, DisabledLockScreen) {
+  NotifySessionStarted();
   EXPECT_EQ(user_profile_, GetProfile());
 
   // Verify that the power policy actions are set to default values initially.
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
index 08c43f5..24fe2c22 100644
--- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
+++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
@@ -13,7 +13,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/data_use_measurement/chrome_data_use_recorder.h"
 #include "chrome/browser/data_use_measurement/page_load_capping/chrome_page_load_capping_features.h"
-#include "chrome/browser/data_use_measurement/page_load_capping/page_load_observer.h"
 #include "components/data_use_measurement/content/content_url_request_classifier.h"
 #include "components/data_use_measurement/core/data_use_recorder.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
@@ -51,12 +50,6 @@
 
 ChromeDataUseAscriber::ChromeDataUseAscriber() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-  if (base::FeatureList::IsEnabled(
-          page_load_capping::features::kDetectingHeavyPages)) {
-    page_capping_observer_ =
-        std::make_unique<page_load_capping::PageLoadObserver>();
-    AddObserver(page_capping_observer_.get());
-  }
 }
 
 ChromeDataUseAscriber::~ChromeDataUseAscriber() {
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc
index b0710c7..11a4540 100644
--- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc
+++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
-#include "chrome/browser/data_use_measurement/page_load_capping/chrome_page_load_capping_features.h"
 #include "components/data_use_measurement/core/data_use_recorder.h"
 #include "content/public/browser/resource_request_info.h"
 #include "content/public/common/browser_side_navigation_policy.h"
@@ -98,10 +97,6 @@
     return request;
   }
 
-  DataUseAscriber::PageLoadObserver* page_load_capping_observer() {
-    return ascriber_->page_capping_observer_.get();
-  }
-
  private:
   content::TestBrowserThreadBundle thread_bundle_;
   std::unique_ptr<ChromeDataUseAscriber> ascriber_;
@@ -459,11 +454,6 @@
 }
 
 TEST_F(ChromeDataUseAscriberTest, PageLoadObserverNotified) {
-  // Make sure that the page load capping observer does not DCHECK.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {page_load_capping::features::kDetectingHeavyPages}, {});
-
   CreateAscriber();
   // TODO(rajendrant): Handle PlzNavigate (http://crbug/664233).
   MockPageLoadObserver mock_observer;
@@ -579,17 +569,4 @@
   EXPECT_EQ(0u, recorders().size());
 }
 
-// Verify that the page load capping observer is only created when the feature
-// is enabled.
-TEST_F(ChromeDataUseAscriberTest, CappingObserverNeedsFeature) {
-  CreateAscriber();
-  EXPECT_FALSE(page_load_capping_observer());
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {page_load_capping::features::kDetectingHeavyPages}, {});
-
-  CreateAscriber();
-  EXPECT_TRUE(page_load_capping_observer());
-}
-
 }  // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.cc b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.cc
new file mode 100644
index 0000000..4b9e8a4
--- /dev/null
+++ b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.cc
@@ -0,0 +1,123 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h"
+
+#include <memory>
+
+#include "build/build_config.h"
+#include "chrome/browser/android/android_theme_resources.h"
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/infobars/core/infobar.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+// The infobar that allows the user to resume resource loading on the page.
+class ResumeDelegate : public PageLoadCappingInfoBarDelegate {
+ public:
+  ResumeDelegate() = default;
+  ~ResumeDelegate() override = default;
+
+ private:
+  // PageLoadCappingInfoBarDelegate:
+  base::string16 GetMessageText() const override {
+    return l10n_util::GetStringUTF16(IDS_PAGE_CAPPING_STOPPED_TITLE);
+  }
+  base::string16 GetButtonLabel(InfoBarButton button) const override {
+    DCHECK_EQ(ConfirmInfoBarDelegate::BUTTON_OK, button);
+    return l10n_util::GetStringUTF16(IDS_PAGE_CAPPING_CONTINUE_MESSAGE);
+  }
+  bool Accept() override {
+    // TODO(ryansturm): Add functionality to resume page loads.
+    // https://crbug.com/797979
+    return true;
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(ResumeDelegate);
+};
+
+// The infobar that allows the user to pause resoruce loading on the page.
+class PauseDelegate : public PageLoadCappingInfoBarDelegate {
+ public:
+  explicit PauseDelegate(int64_t bytes_threshold)
+      : bytes_threshold_(bytes_threshold) {}
+  ~PauseDelegate() override = default;
+
+ private:
+  // PageLoadCappingInfoBarDelegate:
+  base::string16 GetMessageText() const override {
+    return l10n_util::GetStringFUTF16Int(
+        IDS_PAGE_CAPPING_TITLE,
+        static_cast<int>(bytes_threshold_ / 1024 / 1024));
+  }
+
+  base::string16 GetButtonLabel(InfoBarButton button) const override {
+    DCHECK_EQ(ConfirmInfoBarDelegate::BUTTON_OK, button);
+    return l10n_util::GetStringUTF16(IDS_PAGE_CAPPING_STOP_MESSAGE);
+  }
+
+  bool Accept() override {
+    // TODO(ryansturm): Add functionality to pause page loads.
+    // https://crbug.com/797979
+
+    auto* infobar_manager = infobar()->owner();
+    // |this| will be gone after this call.
+    infobar_manager->ReplaceInfoBar(infobar(),
+                                    infobar_manager->CreateConfirmInfoBar(
+                                        std::make_unique<ResumeDelegate>()));
+
+    return false;
+  }
+
+ private:
+  // The amount of bytes that was exceeded to trigger this infobar.
+  int64_t bytes_threshold_;
+
+  DISALLOW_COPY_AND_ASSIGN(PauseDelegate);
+};
+
+}  // namespace
+
+// static
+bool PageLoadCappingInfoBarDelegate::Create(
+    int64_t bytes_threshold,
+    content::WebContents* web_contents) {
+  auto* infobar_service = InfoBarService::FromWebContents(web_contents);
+
+  // WrapUnique is used to allow for a private constructor.
+  return infobar_service->AddInfoBar(infobar_service->CreateConfirmInfoBar(
+      std::make_unique<PauseDelegate>(bytes_threshold)));
+}
+
+PageLoadCappingInfoBarDelegate::~PageLoadCappingInfoBarDelegate() = default;
+
+PageLoadCappingInfoBarDelegate::PageLoadCappingInfoBarDelegate() = default;
+
+infobars::InfoBarDelegate::InfoBarIdentifier
+PageLoadCappingInfoBarDelegate::GetIdentifier() const {
+  return PAGE_LOAD_CAPPING_INFOBAR_DELEGATE;
+}
+
+int PageLoadCappingInfoBarDelegate::GetIconId() const {
+// TODO(ryansturm): Make data saver resources available on other platforms.
+// https://crbug.com/820594
+#if defined(OS_ANDROID)
+  return IDR_ANDROID_INFOBAR_PREVIEWS;
+#else
+  return kNoIconID;
+#endif
+}
+
+bool PageLoadCappingInfoBarDelegate::ShouldExpire(
+    const NavigationDetails& details) const {
+  return true;
+}
+
+int PageLoadCappingInfoBarDelegate::GetButtons() const {
+  return ConfirmInfoBarDelegate::BUTTON_OK;
+}
diff --git a/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h
new file mode 100644
index 0000000..e4fa460d
--- /dev/null
+++ b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h
@@ -0,0 +1,59 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_DATA_USE_MEASUREMENT_PAGE_LOAD_CAPPING_PAGE_LOAD_CAPPING_INFOBAR_DELEGATE_H_
+#define CHROME_BROWSER_DATA_USE_MEASUREMENT_PAGE_LOAD_CAPPING_PAGE_LOAD_CAPPING_INFOBAR_DELEGATE_H_
+
+#include <stdint.h>
+
+#include "base/strings/string16.h"
+#include "components/infobars/core/confirm_infobar_delegate.h"
+
+namespace content {
+class WebContents;
+}  // namespace content
+
+// An InfoBar delegate for page load capping. This sets up the correct
+// strings for both the InfoBar that allows the user to pause the resource
+// loading and the InfoBar that allows the user to resume resource loading. When
+// the button in the pause InfoBar is clicked, the Resume InfoBar is shown and
+// the resource loading is paused. When the button in the resume InfoBar is
+// clicked, the resume InfoBar is dismissed, and resources continue to load.
+//
+// Page load capping is a feature that informs users when a page goes beyond a
+// certain amount of network bytes and presents the user an option to pause
+// resource loading on the page until the user chooses to resume resource
+// loading.
+//
+// This class cannot be created directly, but an instance can be created using
+// Create().
+class PageLoadCappingInfoBarDelegate : public ConfirmInfoBarDelegate {
+ public:
+  // Creates an InfoBar for page load capping. Returns whether the infobar was
+  // created. |bytes_threshold| is the amount of bytes used to determine if the
+  // page was large enough to cap. It will be truncated to megabytes and shown
+  // on the InfoBar. |web_contents| is the WebContents that caused the data
+  // usage.
+  static bool Create(int64_t bytes_threshold,
+                     content::WebContents* web_contents);
+
+  ~PageLoadCappingInfoBarDelegate() override;
+
+ protected:
+  PageLoadCappingInfoBarDelegate();
+
+ private:
+  // ConfirmInfoBarDelegate:
+  infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
+  int GetIconId() const override;
+  int GetButtons() const override;
+  bool ShouldExpire(const NavigationDetails& details) const override;
+  base::string16 GetMessageText() const override = 0;
+  base::string16 GetButtonLabel(InfoBarButton button) const override = 0;
+  bool Accept() override = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(PageLoadCappingInfoBarDelegate);
+};
+
+#endif  // CHROME_BROWSER_DATA_USE_MEASUREMENT_PAGE_LOAD_CAPPING_PAGE_LOAD_CAPPING_INFOBAR_DELEGATE_H_
diff --git a/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate_unittest.cc b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate_unittest.cc
new file mode 100644
index 0000000..6b67ace
--- /dev/null
+++ b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate_unittest.cc
@@ -0,0 +1,82 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h"
+
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/infobars/mock_infobar_service.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/infobars/core/confirm_infobar_delegate.h"
+#include "components/infobars/core/infobar.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+// A test URL used for simulated navigations that do not trigger real URL
+// requests.
+const char kTestURL[] = "http://www.test.com";
+static constexpr int64_t test_capping_threshold_bytes = 10 * 1024 * 1024;
+}  // namespace
+
+class PageLoadCappingInfoBarDelegateTest
+    : public ChromeRenderViewHostTestHarness {
+ public:
+  PageLoadCappingInfoBarDelegateTest() = default;
+  ~PageLoadCappingInfoBarDelegateTest() override = default;
+
+  void SetUpTest() {
+    InfoBarService* mock_infobar_service =
+        new MockInfoBarService(web_contents());
+    ASSERT_EQ(infobar_service(), mock_infobar_service);
+    ASSERT_TRUE(infobar_service());
+    NavigateAndCommit(GURL(kTestURL));
+  }
+
+  size_t InfoBarCount() { return infobar_service()->infobar_count(); }
+
+  void RemoveAllInfoBars() { infobar_service()->RemoveAllInfoBars(false); }
+
+  infobars::InfoBar* infobar_at(size_t index) {
+    return infobar_service()->infobar_at(index);
+  }
+
+  InfoBarService* infobar_service() {
+    return InfoBarService::FromWebContents(web_contents());
+  }
+};
+
+TEST_F(PageLoadCappingInfoBarDelegateTest, ClickingCreatesNewInfobar) {
+  SetUpTest();
+  EXPECT_TRUE(PageLoadCappingInfoBarDelegate::Create(
+      test_capping_threshold_bytes, web_contents()));
+  EXPECT_EQ(1u, InfoBarCount());
+  infobars::InfoBar* infobar = infobar_at(0);
+  EXPECT_TRUE(infobar);
+  ConfirmInfoBarDelegate* delegate = nullptr;
+  if (infobar)
+    delegate = infobar->delegate()->AsConfirmInfoBarDelegate();
+  EXPECT_TRUE(delegate);
+  // Make sure this is pause delegate.
+  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_PAGE_CAPPING_STOP_MESSAGE),
+            delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK));
+  // |delegate| and |infobar| will be deleted by this call.
+  EXPECT_FALSE(delegate->Accept());
+  EXPECT_EQ(1u, InfoBarCount());
+
+  infobar = infobar_at(0);
+  ConfirmInfoBarDelegate* stopped_delegate = nullptr;
+  if (infobar)
+    stopped_delegate = infobar->delegate()->AsConfirmInfoBarDelegate();
+
+  // Make sure this is the resume delegate.
+  EXPECT_EQ(
+      l10n_util::GetStringUTF16(IDS_PAGE_CAPPING_CONTINUE_MESSAGE),
+      stopped_delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK));
+  EXPECT_TRUE(stopped_delegate);
+  // Make sure that they are different infobar instances.
+  EXPECT_NE(delegate, stopped_delegate);
+
+  // If this is true, the infobar will be closed by the infobar manager.
+  EXPECT_TRUE(stopped_delegate->Accept());
+}
diff --git a/chrome/browser/data_use_measurement/page_load_capping/page_load_observer.cc b/chrome/browser/data_use_measurement/page_load_capping/page_load_observer.cc
deleted file mode 100644
index e5c55a7..0000000
--- a/chrome/browser/data_use_measurement/page_load_capping/page_load_observer.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/data_use_measurement/page_load_capping/page_load_observer.h"
-
-namespace data_use_measurement {
-namespace page_load_capping {
-
-PageLoadObserver::PageLoadObserver() = default;
-PageLoadObserver::~PageLoadObserver() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-// TODO(ryansturm): Add heavy page detection. https://crbug.com/797976
-void PageLoadObserver::OnPageLoadCommit(DataUse* data_use) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-void PageLoadObserver::OnPageResourceLoad(const net::URLRequest& request,
-                                          DataUse* data_use) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-void PageLoadObserver::OnPageDidFinishLoad(DataUse* data_use) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-void PageLoadObserver::OnPageLoadConcluded(DataUse* data_use) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-void PageLoadObserver::OnNetworkBytesUpdate(const net::URLRequest& request,
-                                            DataUse* data_use) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-}  // namespace page_load_capping
-}  // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/page_load_capping/page_load_observer.h b/chrome/browser/data_use_measurement/page_load_capping/page_load_observer.h
deleted file mode 100644
index e21e94b..0000000
--- a/chrome/browser/data_use_measurement/page_load_capping/page_load_observer.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_DATA_USE_MEASUREMENT_PAGE_LOAD_CAPPING_PAGE_LOAD_OBSERVER_H_
-#define CHROME_BROWSER_DATA_USE_MEASUREMENT_PAGE_LOAD_CAPPING_PAGE_LOAD_OBSERVER_H_
-
-#include "base/macros.h"
-#include "base/sequence_checker.h"
-#include "components/data_use_measurement/core/data_use_ascriber.h"
-
-namespace data_use_measurement {
-namespace page_load_capping {
-
-class PageLoadObserver : public DataUseAscriber::PageLoadObserver {
- public:
-  PageLoadObserver();
-  ~PageLoadObserver() override;
-
- private:
-  // DataUseAscriber::PageLoadObserver:
-  void OnPageLoadCommit(DataUse* data_use) override;
-  void OnPageResourceLoad(const net::URLRequest& request,
-                          DataUse* data_use) override;
-  void OnPageDidFinishLoad(DataUse* data_use) override;
-  void OnPageLoadConcluded(DataUse* data_use) override;
-  void OnNetworkBytesUpdate(const net::URLRequest& request,
-                            DataUse* data_use) override;
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  DISALLOW_COPY_AND_ASSIGN(PageLoadObserver);
-};
-
-}  // namespace page_load_capping
-}  // namespace data_use_measurement
-
-#endif  // CHROME_BROWSER_DATA_USE_MEASUREMENT_PAGE_LOAD_CAPPING_PAGE_LOAD_OBSERVER_H_
diff --git a/chrome/browser/extensions/active_tab_apitest.cc b/chrome/browser/extensions/active_tab_apitest.cc
index b8d3cdd..9e68cc8 100644
--- a/chrome/browser/extensions/active_tab_apitest.cc
+++ b/chrome/browser/extensions/active_tab_apitest.cc
@@ -24,13 +24,7 @@
 namespace extensions {
 namespace {
 
-// Times out on win syzyasan, http://crbug.com/166026
-#if defined(SYZYASAN)
-#define MAYBE_ActiveTab DISABLED_ActiveTab
-#else
-#define MAYBE_ActiveTab ActiveTab
-#endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_ActiveTab) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ActiveTab) {
   ASSERT_TRUE(StartEmbeddedTestServer());
 
   const Extension* extension =
diff --git a/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_apitest.cc b/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_apitest.cc
index eab6d93f..35c4ad6 100644
--- a/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_apitest.cc
+++ b/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_apitest.cc
@@ -26,13 +26,7 @@
 using bookmarks::BookmarkModel;
 using bookmarks::BookmarkNode;
 
-// Times out on win syzyasan, http://crbug.com/166026
-#if defined(SYZYASAN)
-#define MAYBE_BookmarkManager DISABLED_BookmarkManager
-#else
-#define MAYBE_BookmarkManager BookmarkManager
-#endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_BookmarkManager) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, BookmarkManager) {
   // Add managed bookmarks.
   Profile* profile = browser()->profile();
   BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile);
diff --git a/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc b/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
index ebbabcf0..9f0ccb4 100644
--- a/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
+++ b/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
@@ -125,13 +125,7 @@
   DISALLOW_COPY_AND_ASSIGN(ExtensionContextMenuApiTest);
 };
 
-// Times out on win syzyasan, http://crbug.com/166026
-#if defined(SYZYASAN)
-#define MAYBE_ContextMenus DISABLED_ContextMenus
-#else
-#define MAYBE_ContextMenus ContextMenus
-#endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_ContextMenus) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContextMenus) {
   ASSERT_TRUE(RunExtensionTest("context_menus/basics")) << message_;
   ASSERT_TRUE(RunExtensionTest("context_menus/no_perms")) << message_;
   ASSERT_TRUE(RunExtensionTest("context_menus/item_ids")) << message_;
diff --git a/chrome/browser/extensions/api/cookies/cookies_apitest.cc b/chrome/browser/extensions/api/cookies/cookies_apitest.cc
index 84d6f80..423a2c1 100644
--- a/chrome/browser/extensions/api/cookies/cookies_apitest.cc
+++ b/chrome/browser/extensions/api/cookies/cookies_apitest.cc
@@ -8,13 +8,7 @@
 
 namespace extensions {
 
-// Times out on win syzyasan, http://crbug.com/166026
-#if defined(SYZYASAN)
-#define MAYBE_Cookies DISABLED_Cookies
-#else
-#define MAYBE_Cookies Cookies
-#endif
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_Cookies) {
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Cookies) {
   ASSERT_TRUE(RunExtensionTest("cookies/api")) << message_;
 }
 
diff --git a/chrome/browser/extensions/api/sessions/sessions_api.cc b/chrome/browser/extensions/api/sessions/sessions_api.cc
index cc0b280..deefdd8 100644
--- a/chrome/browser/extensions/api/sessions/sessions_api.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_api.cc
@@ -146,8 +146,9 @@
     const sessions::TabRestoreService::Tab& tab,
     bool active) {
   return CreateTabModelHelper(tab.navigations[tab.current_navigation_index],
-                              base::IntToString(tab.id), tab.tabstrip_index,
-                              tab.pinned, active, extension());
+                              base::IntToString(tab.id.id()),
+                              tab.tabstrip_index, tab.pinned, active,
+                              extension());
 }
 
 std::unique_ptr<windows::Window>
@@ -160,9 +161,9 @@
     tabs->push_back(
         CreateTabModel(*tab, tab->tabstrip_index == window.selected_tab_index));
 
-  return CreateWindowModelHelper(std::move(tabs), base::IntToString(window.id),
-                                 windows::WINDOW_TYPE_NORMAL,
-                                 windows::WINDOW_STATE_NORMAL);
+  return CreateWindowModelHelper(
+      std::move(tabs), base::IntToString(window.id.id()),
+      windows::WINDOW_TYPE_NORMAL, windows::WINDOW_STATE_NORMAL);
 }
 
 std::unique_ptr<api::sessions::Session>
@@ -451,7 +452,7 @@
   // Check if the recently closed list contains an entry with the provided id.
   bool is_window = false;
   for (const auto& entry : entries) {
-    if (entry->id == session_id.id()) {
+    if (entry->id.id() == session_id.id()) {
       // A full window is being restored only if the entry ID
       // matches the provided ID and the entry type is Window.
       is_window = is_window_entry(*entry);
@@ -463,8 +464,9 @@
       BrowserLiveTabContext::FindContextForWebContents(
           browser->tab_strip_model()->GetActiveWebContents());
   std::vector<sessions::LiveTab*> restored_tabs =
-      tab_restore_service->RestoreEntryById(context, session_id.id(),
-                                            WindowOpenDisposition::UNKNOWN);
+      tab_restore_service->RestoreEntryById(
+          context, SessionID::FromSerializedValue(session_id.id()),
+          WindowOpenDisposition::UNKNOWN);
   // If the ID is invalid, restored_tabs will be empty.
   if (restored_tabs.empty())
     return Error(kInvalidSessionIdError, session_id.ToString());
diff --git a/chrome/browser/extensions/web_contents_browsertest.cc b/chrome/browser/extensions/web_contents_browsertest.cc
index a5b9516b..349d88bb 100644
--- a/chrome/browser/extensions/web_contents_browsertest.cc
+++ b/chrome/browser/extensions/web_contents_browsertest.cc
@@ -2,24 +2,69 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <map>
+
+#include "base/macros.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/devtools/devtools_window_testing.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
+#include "chrome/browser/sessions/session_tab_helper.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "extensions/browser/extension_api_frame_id_map.h"
+#include "extensions/browser/extension_navigation_ui_data.h"
 
 namespace {
 
+using ExtensionApiFrameIdMap = extensions::ExtensionApiFrameIdMap;
+
 content::WebContents* GetActiveWebContents(const Browser* browser) {
   return browser->tab_strip_model()->GetActiveWebContents();
 }
 
+// Saves ExtensionNavigationUIData for each render frame which completes
+// navigation.
+class ExtensionNavigationUIDataObserver : public content::WebContentsObserver {
+ public:
+  explicit ExtensionNavigationUIDataObserver(content::WebContents* web_contents)
+      : WebContentsObserver(web_contents) {}
+
+  const extensions::ExtensionNavigationUIData* GetExtensionNavigationUIData(
+      content::RenderFrameHost* rfh) const {
+    auto iter = navigation_ui_data_map_.find(rfh);
+    if (iter == navigation_ui_data_map_.end())
+      return nullptr;
+    return iter->second.get();
+  }
+
+ private:
+  void DidFinishNavigation(
+      content::NavigationHandle* navigation_handle) override {
+    if (!navigation_handle->HasCommitted())
+      return;
+
+    content::RenderFrameHost* rfh = navigation_handle->GetRenderFrameHost();
+    const auto* data = static_cast<const ChromeNavigationUIData*>(
+        navigation_handle->GetNavigationUIData());
+    navigation_ui_data_map_[rfh] =
+        data->GetExtensionNavigationUIData()->DeepCopy();
+  }
+
+  std::map<content::RenderFrameHost*,
+           std::unique_ptr<extensions::ExtensionNavigationUIData>>
+      navigation_ui_data_map_;
+
+  DISALLOW_COPY_AND_ASSIGN(ExtensionNavigationUIDataObserver);
+};
+
 }  // namespace
 
 // Tests that we can load extension pages into the tab area and they can call
@@ -84,8 +129,8 @@
   test_devtools_main_frame_cached(browser(), false /*is_docked*/);
 }
 
-// Test that we cache frame data for all frames on creation. Regression test for
-// crbug.com/810614.
+// Test that we correctly cache frame data for all frames on creation.
+// Regression test for crbug.com/810614.
 IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, FrameDataCached) {
   // Load an extension with a web accessible resource.
   const extensions::Extension* extension =
@@ -98,8 +143,12 @@
 
   // Returns whether the frame data for |rfh| is cached.
   auto has_cached_frame_data = [](content::RenderFrameHost* rfh) {
-    return extensions::ExtensionApiFrameIdMap::Get()
-        ->HasCachedFrameDataForTesting(rfh);
+    return ExtensionApiFrameIdMap::Get()->HasCachedFrameDataForTesting(rfh);
+  };
+
+  // Returns the cached frame data for |rfh|.
+  auto get_frame_data = [](content::RenderFrameHost* rfh) {
+    return ExtensionApiFrameIdMap::Get()->GetFrameData(rfh);
   };
 
   // Adds an iframe with the given |name| and |src| to the given |web_contents|
@@ -131,29 +180,66 @@
   };
 
   // Navigates the browser to |url|. Injects a web-frame and an extension frame
-  // into the page and ensures that extension frame data is cached for each
-  // created frame.
+  // into the page and ensures that extension frame data is correctly cached for
+  // each created frame.
   auto load_page_and_test = [&](const GURL& url) {
+    using FrameData = ExtensionApiFrameIdMap::FrameData;
+
     SCOPED_TRACE(base::StringPrintf("Testing %s", url.spec().c_str()));
 
     ui_test_utils::NavigateToURL(browser(), url);
     content::WebContents* web_contents = GetActiveWebContents(browser());
+    SessionTabHelper* session_tab_helper =
+        SessionTabHelper::FromWebContents(web_contents);
+    ASSERT_TRUE(session_tab_helper);
+    int expected_tab_id = session_tab_helper->session_id().id();
+    int expected_window_id = session_tab_helper->window_id().id();
 
     // Ensure that the frame data for the main frame is cached.
-    EXPECT_TRUE(has_cached_frame_data(web_contents->GetMainFrame()));
+    content::RenderFrameHost* rfh = web_contents->GetMainFrame();
+    EXPECT_TRUE(has_cached_frame_data(rfh));
+    FrameData main_frame_data = get_frame_data(rfh);
+    EXPECT_EQ(ExtensionApiFrameIdMap::kTopFrameId, main_frame_data.frame_id);
+    EXPECT_EQ(ExtensionApiFrameIdMap::kInvalidFrameId,
+              main_frame_data.parent_frame_id);
+    EXPECT_EQ(expected_tab_id, main_frame_data.tab_id);
+    EXPECT_EQ(expected_window_id, main_frame_data.window_id);
+    EXPECT_EQ(url, main_frame_data.last_committed_main_frame_url);
+    EXPECT_FALSE(main_frame_data.pending_main_frame_url);
 
     // Add an extension iframe to the page and ensure its frame data is cached.
     ASSERT_TRUE(
         add_iframe(web_contents, "extension_frame",
                    extension->GetResourceURL("web_accessible_page.html")));
-    EXPECT_TRUE(has_cached_frame_data(
-        get_frame_by_name(web_contents, "extension_frame")));
+    rfh = get_frame_by_name(web_contents, "extension_frame");
+    EXPECT_TRUE(has_cached_frame_data(rfh));
+    FrameData extension_frame_data = get_frame_data(rfh);
+    EXPECT_NE(ExtensionApiFrameIdMap::kInvalidFrameId,
+              extension_frame_data.frame_id);
+    EXPECT_NE(ExtensionApiFrameIdMap::kTopFrameId,
+              extension_frame_data.frame_id);
+    EXPECT_EQ(ExtensionApiFrameIdMap::kTopFrameId,
+              extension_frame_data.parent_frame_id);
+    EXPECT_EQ(expected_tab_id, extension_frame_data.tab_id);
+    EXPECT_EQ(expected_window_id, extension_frame_data.window_id);
+    EXPECT_EQ(url, extension_frame_data.last_committed_main_frame_url);
+    EXPECT_FALSE(extension_frame_data.pending_main_frame_url);
 
     // Add a web frame to the page and ensure its frame data is cached.
     ASSERT_TRUE(add_iframe(web_contents, "web_frame",
                            embedded_test_server()->GetURL("/empty.html")));
-    EXPECT_TRUE(
-        has_cached_frame_data(get_frame_by_name(web_contents, "web_frame")));
+    rfh = get_frame_by_name(web_contents, "web_frame");
+    EXPECT_TRUE(has_cached_frame_data(rfh));
+    FrameData web_frame_data = get_frame_data(rfh);
+    EXPECT_NE(ExtensionApiFrameIdMap::kInvalidFrameId, web_frame_data.frame_id);
+    EXPECT_NE(ExtensionApiFrameIdMap::kTopFrameId, web_frame_data.frame_id);
+    EXPECT_NE(extension_frame_data.frame_id, web_frame_data.frame_id);
+    EXPECT_EQ(ExtensionApiFrameIdMap::kTopFrameId,
+              web_frame_data.parent_frame_id);
+    EXPECT_EQ(expected_tab_id, web_frame_data.tab_id);
+    EXPECT_EQ(expected_window_id, web_frame_data.window_id);
+    EXPECT_EQ(url, web_frame_data.last_committed_main_frame_url);
+    EXPECT_FALSE(web_frame_data.pending_main_frame_url);
   };
   // End utility functions.
 
@@ -163,3 +249,60 @@
   // Test a non-extension page.
   load_page_and_test(embedded_test_server()->GetURL("/empty.html"));
 }
+
+// Test that we correctly set up the ExtensionNavigationUIData for each
+// navigation.
+IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ExtensionNavigationUIData) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  content::WebContents* web_contents = GetActiveWebContents(browser());
+  GURL last_committed_main_frame_url = web_contents->GetLastCommittedURL();
+  ExtensionNavigationUIDataObserver observer(web_contents);
+
+  // Load a page with an iframe.
+  const GURL url = embedded_test_server()->GetURL("/iframe.html");
+  ui_test_utils::NavigateToURL(browser(), url);
+
+  SessionTabHelper* session_tab_helper =
+      SessionTabHelper::FromWebContents(web_contents);
+  ASSERT_TRUE(session_tab_helper);
+  int expected_tab_id = session_tab_helper->session_id().id();
+  int expected_window_id = session_tab_helper->window_id().id();
+
+  // Test ExtensionNavigationUIData for the main frame.
+  {
+    const auto* extension_navigation_ui_data =
+        observer.GetExtensionNavigationUIData(web_contents->GetMainFrame());
+    ASSERT_TRUE(extension_navigation_ui_data);
+    EXPECT_FALSE(extension_navigation_ui_data->is_web_view());
+
+    ExtensionApiFrameIdMap::FrameData frame_data =
+        extension_navigation_ui_data->frame_data();
+    EXPECT_EQ(ExtensionApiFrameIdMap::kTopFrameId, frame_data.frame_id);
+    EXPECT_EQ(ExtensionApiFrameIdMap::kInvalidFrameId,
+              frame_data.parent_frame_id);
+    EXPECT_EQ(expected_tab_id, frame_data.tab_id);
+    EXPECT_EQ(expected_window_id, frame_data.window_id);
+    EXPECT_EQ(last_committed_main_frame_url,
+              frame_data.last_committed_main_frame_url);
+    EXPECT_FALSE(frame_data.pending_main_frame_url);
+  }
+
+  // Test ExtensionNavigationUIData for the sub-frame.
+  {
+    const auto* extension_navigation_ui_data =
+        observer.GetExtensionNavigationUIData(
+            content::ChildFrameAt(web_contents->GetMainFrame(), 0));
+    ASSERT_TRUE(extension_navigation_ui_data);
+    EXPECT_FALSE(extension_navigation_ui_data->is_web_view());
+
+    ExtensionApiFrameIdMap::FrameData frame_data =
+        extension_navigation_ui_data->frame_data();
+    EXPECT_NE(ExtensionApiFrameIdMap::kInvalidFrameId, frame_data.frame_id);
+    EXPECT_NE(ExtensionApiFrameIdMap::kTopFrameId, frame_data.frame_id);
+    EXPECT_EQ(ExtensionApiFrameIdMap::kTopFrameId, frame_data.parent_frame_id);
+    EXPECT_EQ(expected_tab_id, frame_data.tab_id);
+    EXPECT_EQ(expected_window_id, frame_data.window_id);
+    EXPECT_EQ(url, frame_data.last_committed_main_frame_url);
+    EXPECT_FALSE(frame_data.pending_main_frame_url);
+  }
+}
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 5beadaa..3a33981 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -55,6 +55,10 @@
 const char kAsyncImageDecodingDescription[] =
     "Enables asynchronous decoding of images from raster for web content";
 
+const char kAutofillDynamicFormsName[] = "Autofill Dynamic Forms";
+const char kAutofillDynamicFormsDescription[] =
+    "Allows autofill to fill dynamically changing forms";
+
 const char kAutoplayPolicyName[] = "Autoplay policy";
 const char kAutoplayPolicyDescription[] =
     "Policy used when deciding if audio or video is allowed to autoplay.";
@@ -280,6 +284,13 @@
     "If enabled, requests missing CVC when offering to upload credit cards to "
     "Google Payments.";
 
+const char kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingName[] =
+    "Enable Google Pay branding when offering credit card upload on Android";
+const char
+    kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingDescription[] =
+        "If enabled, shows the Google Pay logo and a shorter header message "
+        "when credit card upload to Google Payments is offered on Android.";
+
 const char kEnableAutofillCreditCardUploadSendDetectedValuesName[] =
     "Always send metadata on detected form values for Autofill credit card "
     "upload";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index ce08b95..eaa1b2a7 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -64,6 +64,9 @@
 extern const char kAsyncImageDecodingName[];
 extern const char kAsyncImageDecodingDescription[];
 
+extern const char kAutofillDynamicFormsName[];
+extern const char kAutofillDynamicFormsDescription[];
+
 extern const char kAutoplayPolicyName[];
 extern const char kAutoplayPolicyDescription[];
 
@@ -203,6 +206,11 @@
 extern const char kEnableAutofillCreditCardUploadCvcPromptName[];
 extern const char kEnableAutofillCreditCardUploadCvcPromptDescription[];
 
+extern const char
+    kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingName[];
+extern const char
+    kEnableAutofillCreditCardUploadGooglePayOnAndroidBrandingDescription[];
+
 extern const char kEnableAutofillCreditCardUploadSendDetectedValuesName[];
 extern const char
     kEnableAutofillCreditCardUploadSendDetectedValuesDescription[];
diff --git a/chrome/browser/infobars/infobar_service.h b/chrome/browser/infobars/infobar_service.h
index da565ecb..fb81f6be 100644
--- a/chrome/browser/infobars/infobar_service.h
+++ b/chrome/browser/infobars/infobar_service.h
@@ -63,11 +63,12 @@
       std::unique_ptr<ConfirmInfoBarDelegate> delegate);
 #endif
 
+ protected:
+  explicit InfoBarService(content::WebContents* web_contents);
+
  private:
   friend class content::WebContentsUserData<InfoBarService>;
 
-  explicit InfoBarService(content::WebContents* web_contents);
-
   // InfoBarManager:
   int GetActiveEntryID() override;
   // TODO(droger): Remove these functions once infobar notifications are
diff --git a/chrome/browser/infobars/infobars_browsertest.cc b/chrome/browser/infobars/infobars_browsertest.cc
index a96fbe0..83504d8 100644
--- a/chrome/browser/infobars/infobars_browsertest.cc
+++ b/chrome/browser/infobars/infobars_browsertest.cc
@@ -13,6 +13,7 @@
 #include "build/buildflag.h"
 #include "chrome/browser/banners/app_banner_infobar_delegate_desktop.h"
 #include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h"
 #include "chrome/browser/devtools/devtools_infobar_delegate.h"
 #include "chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h"
 #include "chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h"
@@ -272,6 +273,7 @@
       {"data_reduction_proxy_preview",
        IBD::DATA_REDUCTION_PROXY_PREVIEW_INFOBAR_DELEGATE},
       {"automation", IBD::AUTOMATION_INFOBAR_DELEGATE},
+      {"page_load_capping", IBD::PAGE_LOAD_CAPPING_INFOBAR_DELEGATE},
   };
   auto id = kIdentifiers.find(name);
   expected_identifiers_.push_back((id == kIdentifiers.end()) ? IBD::INVALID
@@ -450,6 +452,10 @@
       AutomationInfoBarDelegate::Create();
       break;
 
+    case IBD::PAGE_LOAD_CAPPING_INFOBAR_DELEGATE:
+      PageLoadCappingInfoBarDelegate::Create(1 * 1024 * 1024, GetWebContents());
+      break;
+
     default:
       break;
   }
@@ -611,6 +617,10 @@
   ShowAndVerifyUi();
 }
 
+IN_PROC_BROWSER_TEST_F(InfoBarUiTest, InvokeUi_page_load_capping) {
+  ShowAndVerifyUi();
+}
+
 IN_PROC_BROWSER_TEST_F(InfoBarUiTest, InvokeUi_automation) {
   ShowAndVerifyUi();
 }
diff --git a/chrome/browser/infobars/mock_infobar_service.cc b/chrome/browser/infobars/mock_infobar_service.cc
new file mode 100644
index 0000000..6454c23c
--- /dev/null
+++ b/chrome/browser/infobars/mock_infobar_service.cc
@@ -0,0 +1,22 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/infobars/mock_infobar_service.h"
+
+#include "components/infobars/core/confirm_infobar_delegate.h"
+#include "components/infobars/core/infobar.h"
+
+MockInfoBarService::MockInfoBarService(content::WebContents* web_contents)
+    : InfoBarService(web_contents) {
+  void* user_data_key = UserDataKey();
+  DCHECK(!web_contents->GetUserData(user_data_key));
+  web_contents->SetUserData(user_data_key, base::WrapUnique(this));
+}
+
+MockInfoBarService::~MockInfoBarService() = default;
+
+std::unique_ptr<infobars::InfoBar> MockInfoBarService::CreateConfirmInfoBar(
+    std::unique_ptr<ConfirmInfoBarDelegate> delegate) {
+  return std::make_unique<infobars::InfoBar>(std::move(delegate));
+}
diff --git a/chrome/browser/infobars/mock_infobar_service.h b/chrome/browser/infobars/mock_infobar_service.h
new file mode 100644
index 0000000..44faf037
--- /dev/null
+++ b/chrome/browser/infobars/mock_infobar_service.h
@@ -0,0 +1,23 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_INFOBARS_MOCK_INFOBAR_SERVICE_H_
+#define CHROME_BROWSER_INFOBARS_MOCK_INFOBAR_SERVICE_H_
+
+#include "chrome/browser/infobars/infobar_service.h"
+
+// A mock infobar service that creates do-nothing infobar objects.  This should
+// be used in tests that need to verify that infobars are created, but are not
+// trying to verify the visual appearance/platform-specific behavior of
+// infobars.
+class MockInfoBarService : public InfoBarService {
+ public:
+  explicit MockInfoBarService(content::WebContents* web_contents);
+  ~MockInfoBarService() override;
+
+  std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar(
+      std::unique_ptr<ConfirmInfoBarDelegate> delegate) override;
+};
+
+#endif  // CHROME_BROWSER_INFOBARS_MOCK_INFOBAR_SERVICE_H_
diff --git a/chrome/browser/metrics/chrome_metrics_service_accessor.h b/chrome/browser/metrics/chrome_metrics_service_accessor.h
index 98dd5ca..d0c5c93 100644
--- a/chrome/browser/metrics/chrome_metrics_service_accessor.h
+++ b/chrome/browser/metrics/chrome_metrics_service_accessor.h
@@ -129,7 +129,6 @@
   friend class safe_browsing::SRTGlobalError;
   friend class safe_browsing::SafeBrowsingService;
   friend class safe_browsing::SafeBrowsingUIManager;
-  friend void SyzyASANRegisterExperiment(const char*, const char*);
   friend class ChromeMetricsServiceClient;
   friend class ChromePasswordManagerClient;
   friend class NavigationMetricsRecorder;
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc
index 717db03b..8445abd 100644
--- a/chrome/browser/net/errorpage_browsertest.cc
+++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -60,7 +60,6 @@
 #include "content/public/test/url_loader_interceptor.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "net/base/filename_util.h"
-#include "net/base/mock_network_change_notifier.h"
 #include "net/base/net_errors.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/failing_http_transaction_factory.h"
@@ -1326,59 +1325,6 @@
   EXPECT_EQ(3, interceptor_requests());
 }
 
-class ErrorPageAutoReloadOffline : public ErrorPageAutoReloadTest {
- public:
-  void PreRunTestOnMainThread() override {
-    // Helps the browser to create renderer in offline mode.
-    MockNetwork();
-    InProcessBrowserTest::PreRunTestOnMainThread();
-  }
-  void PostRunTestOnMainThread() override {
-    InProcessBrowserTest::PostRunTestOnMainThread();
-    ReleaseNetwork();
-  }
-
-  void MockNetwork() {
-    mock_network_ =
-        std::make_unique<net::test::ScopedMockNetworkChangeNotifier>();
-    mock_network_->mock_network_change_notifier()->SetConnectionType(
-        net::NetworkChangeNotifier::CONNECTION_NONE);
-  }
-
-  void ReleaseNetwork() { mock_network_.reset(); }
-
- private:
-  std::unique_ptr<net::test::ScopedMockNetworkChangeNotifier> mock_network_;
-};
-
-IN_PROC_BROWSER_TEST_F(ErrorPageAutoReloadOffline,
-                       AvoidAutoReloadingWhenOffline) {
-  GURL test_url("http://error.page.auto.reload");
-  InstallInterceptor(test_url, 1);
-
-  ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), test_url,
-                                                            1);
-  base::RunLoop().RunUntilIdle();
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-
-  content::WaitForLoadStop(web_contents);
-  // Make sure that first autoreload did not happen.
-  EXPECT_EQ(1, interceptor_requests());
-
-  // Release network. Now the renderer can receive notifications about network.
-  ReleaseNetwork();
-
-  // Browser is online now. Autoreload request should start immediately.
-  net::NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChangeForTests(
-      1., net::NetworkChangeNotifier::CONNECTION_WIFI);
-
-  content::TestNavigationObserver tab_observer(web_contents, 1);
-  tab_observer.Wait();
-
-  EXPECT_EQ(2, interceptor_requests());
-}
-
 // TODO(dougt): AddressUnreachableInterceptor can be removed as soon as the
 // Network Service is the only code path.
 
diff --git a/chrome/browser/offline_pages/android/offline_page_bridge.cc b/chrome/browser/offline_pages/android/offline_page_bridge.cc
index 786262c4..756c746c 100644
--- a/chrome/browser/offline_pages/android/offline_page_bridge.cc
+++ b/chrome/browser/offline_pages/android/offline_page_bridge.cc
@@ -202,6 +202,12 @@
   GetLaunchUrlByOfflineIdCallback(j_callback_obj, launch_url.spec());
 }
 
+void AcquireFileAccessPermissionCallback(
+    const ScopedJavaGlobalRef<jobject>& j_callback_obj,
+    bool granted) {
+  base::android::RunCallbackAndroid(j_callback_obj, granted);
+}
+
 ScopedJavaLocalRef<jobjectArray> JNI_SavePageRequest_CreateJavaSavePageRequests(
     JNIEnv* env,
     std::vector<std::unique_ptr<SavePageRequest>> requests) {
@@ -948,6 +954,23 @@
                                       extra_headers);
 }
 
+void OfflinePageBridge::AcquireFileAccessPermission(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj,
+    const base::android::JavaParamRef<jobject>& j_web_contents,
+    const base::android::JavaParamRef<jobject>& j_callback_obj) {
+  ScopedJavaGlobalRef<jobject> j_callback_ref(j_callback_obj);
+  content::WebContents* web_contents =
+      content::WebContents::FromJavaWebContents(j_web_contents);
+  if (!web_contents) {
+    AcquireFileAccessPermissionCallback(j_callback_ref, false);
+    return;
+  }
+  OfflinePageUtils::AcquireFileAccessPermission(
+      web_contents,
+      base::Bind(&AcquireFileAccessPermissionCallback, j_callback_ref));
+}
+
 void OfflinePageBridge::NotifyIfDoneLoading() const {
   JNIEnv* env = base::android::AttachCurrentThread();
   Java_OfflinePageBridge_offlinePageModelLoaded(env, java_ref_);
diff --git a/chrome/browser/offline_pages/android/offline_page_bridge.h b/chrome/browser/offline_pages/android/offline_page_bridge.h
index 9d3c7e6..fcc9d71 100644
--- a/chrome/browser/offline_pages/android/offline_page_bridge.h
+++ b/chrome/browser/offline_pages/android/offline_page_bridge.h
@@ -212,6 +212,12 @@
       const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& j_web_contents);
 
+  void AcquireFileAccessPermission(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      const base::android::JavaParamRef<jobject>& j_web_contents,
+      const base::android::JavaParamRef<jobject>& j_callback_obj);
+
  private:
   void GetPageByOfflineIdDone(
       const base::android::ScopedJavaGlobalRef<jobject>& j_callback_obj,
diff --git a/chrome/browser/offline_pages/offline_page_utils.cc b/chrome/browser/offline_pages/offline_page_utils.cc
index 51eabc6b..92ff823 100644
--- a/chrome/browser/offline_pages/offline_page_utils.cc
+++ b/chrome/browser/offline_pages/offline_page_utils.cc
@@ -337,19 +337,12 @@
                                         const std::string& request_origin) {
   DCHECK(web_contents);
 
-// Ensure that the storage permission is granted since the archive file is
-// going to be placed in the public directory.
-#if defined(OS_ANDROID)
-  content::ResourceRequestInfo::WebContentsGetter web_contents_getter =
-      GetWebContentsGetter(web_contents);
-  DownloadControllerBase::Get()->AcquireFileAccessPermission(
-      web_contents_getter,
+  // Ensure that the storage permission is granted since the archive file is
+  // going to be placed in the public directory.
+  AcquireFileAccessPermission(
+      web_contents,
       base::Bind(&AcquireFileAccessPermissionDoneForScheduleDownload,
                  web_contents, name_space, url, ui_action, request_origin));
-#else
-  AcquireFileAccessPermissionDoneForScheduleDownload(
-      web_contents, name_space, url, ui_action, origin, true /*granted*/);
-#endif  // defined(OS_ANDROID)
 }
 
 // static
@@ -415,4 +408,19 @@
   return tab_helper && tab_helper->IsShowingTrustedOfflinePage();
 }
 
+// static
+void OfflinePageUtils::AcquireFileAccessPermission(
+    content::WebContents* web_contents,
+    const base::Callback<void(bool)>& callback) {
+#if defined(OS_ANDROID)
+  content::ResourceRequestInfo::WebContentsGetter web_contents_getter =
+      GetWebContentsGetter(web_contents);
+  DownloadControllerBase::Get()->AcquireFileAccessPermission(
+      web_contents_getter, callback);
+#else
+  // Not needed in other platforms.
+  callback.Run(true /*granted*/);
+#endif  // defined(OS_ANDROID)
+}
+
 }  // namespace offline_pages
diff --git a/chrome/browser/offline_pages/offline_page_utils.h b/chrome/browser/offline_pages/offline_page_utils.h
index 400df19..7d002da 100644
--- a/chrome/browser/offline_pages/offline_page_utils.h
+++ b/chrome/browser/offline_pages/offline_page_utils.h
@@ -164,6 +164,12 @@
 
   // Returns true if |web_contents| is showing a trusted offline page.
   static bool IsShowingTrustedOfflinePage(content::WebContents* web_contents);
+
+  // Tries to acquires the file access permission. |callback| will be called
+  // to inform if the file access permission is granted.
+  static void AcquireFileAccessPermission(
+      content::WebContents* web_contents,
+      const base::Callback<void(bool)>& callback);
 };
 
 }  // namespace offline_pages
diff --git a/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.cc
new file mode 100644
index 0000000..069128d7
--- /dev/null
+++ b/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.cc
@@ -0,0 +1,86 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.h"
+
+#include "base/feature_list.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/optional.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/data_use_measurement/page_load_capping/chrome_page_load_capping_features.h"
+#include "chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h"
+#include "content/public/browser/navigation_handle.h"
+
+namespace {
+
+const char kMediaPageCap[] = "MediaPageCapMB";
+const char kPageCap[] = "PageCapMB";
+
+// The page load capping bytes threshold for the page. There are seperate
+// thresholds for media and non-media pages. Returns empty optional if the page
+// should not be capped.
+base::Optional<int64_t> GetPageLoadCappingBytesThreshold(bool media_page_load) {
+  if (!base::FeatureList::IsEnabled(data_use_measurement::page_load_capping::
+                                        features::kDetectingHeavyPages)) {
+    return base::nullopt;
+  }
+  // Defaults are 15 MB for media and 5 MB for non-media.
+  int64_t default_cap_mb = media_page_load ? 15 : 5;
+  return base::GetFieldTrialParamByFeatureAsInt(
+             data_use_measurement::page_load_capping::features::
+                 kDetectingHeavyPages,
+             (media_page_load ? kMediaPageCap : kPageCap), default_cap_mb) *
+         1024 * 1024;
+}
+
+}  // namespace
+
+PageCappingPageLoadMetricsObserver::PageCappingPageLoadMetricsObserver() =
+    default;
+PageCappingPageLoadMetricsObserver::~PageCappingPageLoadMetricsObserver() =
+    default;
+
+page_load_metrics::PageLoadMetricsObserver::ObservePolicy
+PageCappingPageLoadMetricsObserver::OnCommit(
+    content::NavigationHandle* navigation_handle,
+    ukm::SourceId source_id) {
+  web_contents_ = navigation_handle->GetWebContents();
+  page_cap_ = GetPageLoadCappingBytesThreshold(false /* media_page_load */);
+  // TODO(ryansturm) Check a blacklist of eligible pages.
+  // https://crbug.com/797981
+  return page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING;
+}
+
+void PageCappingPageLoadMetricsObserver::OnLoadedResource(
+    const page_load_metrics::ExtraRequestCompleteInfo&
+        extra_request_complete_info) {
+  if (extra_request_complete_info.was_cached)
+    return;
+  network_bytes_ += extra_request_complete_info.raw_body_bytes;
+  MaybeCreate();
+}
+
+void PageCappingPageLoadMetricsObserver::MaybeCreate() {
+  // If the infobar has already been shown for the page, don't show an infobar.
+  if (displayed_infobar_)
+    return;
+
+  // If the page has not committed, don't show an infobar.
+  if (!web_contents_)
+    return;
+
+  // If there is no capping threshold, the threshold or the threshold is not
+  // met, do not show an infobar.
+  if (!page_cap_ || network_bytes_ < page_cap_.value())
+    return;
+
+  displayed_infobar_ =
+      PageLoadCappingInfoBarDelegate::Create(page_cap_.value(), web_contents_);
+}
+
+void PageCappingPageLoadMetricsObserver::MediaStartedPlaying(
+    const content::WebContentsObserver::MediaPlayerInfo& video_type,
+    bool is_in_main_frame) {
+  page_cap_ = GetPageLoadCappingBytesThreshold(true /* media_page_load */);
+}
diff --git a/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.h
new file mode 100644
index 0000000..4f07dcf
--- /dev/null
+++ b/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.h
@@ -0,0 +1,54 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_PAGE_CAPPING_PAGE_LOAD_METRICS_OBSERVER_H_
+#define CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_PAGE_CAPPING_PAGE_LOAD_METRICS_OBSERVER_H_
+
+#include <stdint.h>
+
+#include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
+
+namespace content {
+class WebContents;
+}
+
+// A class that tracks the data usage of a page load and triggers an infobar
+// when the page load is above a certain threshold. The thresholds are field
+// trial controlled and vary based on whether media has played on the page.
+class PageCappingPageLoadMetricsObserver
+    : public page_load_metrics::PageLoadMetricsObserver {
+ public:
+  PageCappingPageLoadMetricsObserver();
+  ~PageCappingPageLoadMetricsObserver() override;
+
+ private:
+  // page_load_metrics::PageLoadMetricsObserver:
+  void OnLoadedResource(const page_load_metrics::ExtraRequestCompleteInfo&
+                            extra_request_complete_info) override;
+  ObservePolicy OnCommit(content::NavigationHandle* navigation_handle,
+                         ukm::SourceId source_id) override;
+  void MediaStartedPlaying(
+      const content::WebContentsObserver::MediaPlayerInfo& video_type,
+      bool is_in_main_frame) override;
+
+  // Show the page capping infobar if it has not been shown before and the data
+  // use is above the threshold.
+  void MaybeCreate();
+
+  // The current bytes threshold of the capping page triggering.
+  base::Optional<int64_t> page_cap_;
+
+  // The WebContents for this page load. |this| cannot outlive |web_contents|.
+  content::WebContents* web_contents_ = nullptr;
+
+  // The cumulative network body bytes used so far.
+  int64_t network_bytes_ = 0;
+
+  // Track if the infobar has already been shown from this observer.
+  bool displayed_infobar_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(PageCappingPageLoadMetricsObserver);
+};
+
+#endif  // CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_PAGE_CAPPING_PAGE_LOAD_METRICS_OBSERVER_H_
diff --git a/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer_unittest.cc
new file mode 100644
index 0000000..7f59b380
--- /dev/null
+++ b/chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer_unittest.cc
@@ -0,0 +1,318 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.h"
+
+#include <memory>
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/data_use_measurement/page_load_capping/chrome_page_load_capping_features.h"
+#include "chrome/browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate.h"
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/infobars/mock_infobar_service.h"
+#include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
+#include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
+#include "chrome/browser/page_load_metrics/page_load_tracker.h"
+#include "url/gurl.h"
+
+namespace {
+const char kTestURL[] = "http://www.test.com";
+}
+
+class PageCappingObserverTest
+    : public page_load_metrics::PageLoadMetricsObserverTestHarness {
+ public:
+  PageCappingObserverTest() = default;
+  ~PageCappingObserverTest() override = default;
+
+  void SetUpTest() {
+    MockInfoBarService::CreateForWebContents(web_contents());
+    NavigateAndCommit(GURL(kTestURL));
+  }
+
+  size_t InfoBarCount() {
+    // Don't show multiple infobars.
+    return infobar_service() ? infobar_service()->infobar_count() : 0;
+  }
+
+  void RemoveAllInfoBars() {
+    // Don't show multiple infobars.
+    if (infobar_service())
+      infobar_service()->RemoveAllInfoBars(false);
+  }
+
+  InfoBarService* infobar_service() {
+    return InfoBarService::FromWebContents(web_contents());
+  }
+
+ protected:
+  void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
+    tracker->AddObserver(
+        std::make_unique<PageCappingPageLoadMetricsObserver>());
+  }
+};
+
+TEST_F(PageCappingObserverTest, ExperimentDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndDisableFeature(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages);
+  SetUpTest();
+
+  // A resource slightly over 1 MB.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (1 * 1024 * 1024) + 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // The infobar should not show even though the cap would be met because the
+  // feature is disabled.
+  SimulateLoadedResource(resource);
+
+  EXPECT_EQ(0u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, DefaultThresholdNotMetNonMedia) {
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      {});
+  SetUpTest();
+
+  // A resource slightly under 5 MB, the default page capping threshold.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (5 * 1024 * 1024) - 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // The cap is not met, so the infobar should not show.
+  SimulateLoadedResource(resource);
+
+  EXPECT_EQ(0u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, DefaultThresholdMetNonMedia) {
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      {});
+  SetUpTest();
+
+  // A resource slightly over 5 MB, the default page capping threshold.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (5 * 1024 * 1024) + 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // The cap is not met, so the infobar should not show.
+  SimulateLoadedResource(resource);
+
+  EXPECT_EQ(1u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, DefaultThresholdNotMetMedia) {
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      {});
+  SetUpTest();
+
+  SimulateMediaPlayed();
+
+  // A resource slightly under 15 MB, the default media page capping threshold.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (15 * 1024 * 1024) - 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // The cap is not met, so the infobar should not show.
+  SimulateLoadedResource(resource);
+
+  EXPECT_EQ(0u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, DefaultThresholdMetMedia) {
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      {});
+  SetUpTest();
+
+  SimulateMediaPlayed();
+
+  // A resource slightly over 15 MB, the default media page capping threshold.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (15 * 1024 * 1024) + 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // The cap is not met, so the infobar should not show.
+  SimulateLoadedResource(resource);
+
+  EXPECT_EQ(1u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, NotEnoughForThreshold) {
+  std::map<std::string, std::string> feature_parameters = {
+      {"MediaPageCapMB", "1"}, {"PageCapMB", "1"}};
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      feature_parameters);
+  SetUpTest();
+
+  // A resource slightly under 1 MB.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (1 * 1024 * 1024) - 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // The cap is not met, so the infobar should not show.
+  SimulateLoadedResource(resource);
+
+  EXPECT_EQ(0u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, InfobarOnlyShownOnce) {
+  std::map<std::string, std::string> feature_parameters = {
+      {"MediaPageCapMB", "1"}, {"PageCapMB", "1"}};
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      feature_parameters);
+  SetUpTest();
+
+  // A resource slightly over 1 MB.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (1 * 1024 * 1024) + 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // This should trigger the infobar.
+  SimulateLoadedResource(resource);
+  EXPECT_EQ(1u, InfoBarCount());
+  // The infobar is already being shown, so this should not trigger and infobar.
+  SimulateLoadedResource(resource);
+  EXPECT_EQ(1u, InfoBarCount());
+
+  // Clear all infobars.
+  RemoveAllInfoBars();
+  // Verify the infobars are clear.
+  EXPECT_EQ(0u, InfoBarCount());
+  // This would trigger and infobar if one was not already shown from this
+  // observer.
+  SimulateLoadedResource(resource);
+  EXPECT_EQ(0u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, MediaCap) {
+  std::map<std::string, std::string> feature_parameters = {
+      {"MediaPageCapMB", "10"}, {"PageCapMB", "1"}};
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      feature_parameters);
+  SetUpTest();
+
+  // Show that media has played.
+  SimulateMediaPlayed();
+
+  // A resource slightly under 10 MB.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (10 * 1024 * 1024) - 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // This should not trigger an infobar as the media cap is not met.
+  SimulateLoadedResource(resource);
+  EXPECT_EQ(0u, InfoBarCount());
+  // Adding more data should now trigger the infobar.
+  SimulateLoadedResource(resource);
+  EXPECT_EQ(1u, InfoBarCount());
+}
+
+TEST_F(PageCappingObserverTest, PageCap) {
+  std::map<std::string, std::string> feature_parameters = {
+      {"MediaPageCapMB", "1"}, {"PageCapMB", "10"}};
+  base::test::ScopedFeatureList scoped_feature_list_;
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      data_use_measurement::page_load_capping::features::kDetectingHeavyPages,
+      feature_parameters);
+  SetUpTest();
+
+  // A resource slightly under 10 MB.
+  page_load_metrics::ExtraRequestCompleteInfo resource = {
+      GURL(kTestURL),
+      net::HostPortPair(),
+      -1 /* frame_tree_node_id */,
+      false /* was_cached */,
+      (10 * 1024 * 1024) - 10 /* raw_body_bytes */,
+      0 /* original_network_content_length */,
+      nullptr,
+      content::ResourceType::RESOURCE_TYPE_SCRIPT,
+      0,
+      {} /* load_timing_info */};
+
+  // This should not trigger an infobar as the non-media cap is not met.
+  SimulateLoadedResource(resource);
+  EXPECT_EQ(0u, InfoBarCount());
+  // Adding more data should now trigger the infobar.
+  SimulateLoadedResource(resource);
+  EXPECT_EQ(1u, InfoBarCount());
+}
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
index 21b2ed0..b1483a6 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
@@ -30,6 +30,7 @@
 #include "chrome/browser/page_load_metrics/observers/noscript_preview_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/offline_page_previews_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h"
+#include "chrome/browser/page_load_metrics/observers/page_capping_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/previews_ukm_observer.h"
 #include "chrome/browser/page_load_metrics/observers/protocol_page_load_metrics_observer.h"
@@ -107,6 +108,8 @@
     tracker->AddObserver(
         std::make_unique<
             previews::OfflinePagePreviewsPageLoadMetricsObserver>());
+    tracker->AddObserver(
+        std::make_unique<PageCappingPageLoadMetricsObserver>());
     tracker->AddObserver(std::make_unique<previews::PreviewsUKMObserver>());
     tracker->AddObserver(
         std::make_unique<ServiceWorkerPageLoadMetricsObserver>());
diff --git a/chrome/browser/policy/policy_prefs_browsertest.cc b/chrome/browser/policy/policy_prefs_browsertest.cc
index 3727734..14c8927e 100644
--- a/chrome/browser/policy/policy_prefs_browsertest.cc
+++ b/chrome/browser/policy/policy_prefs_browsertest.cc
@@ -455,15 +455,9 @@
   MockConfigurationPolicyProvider provider_;
 };
 
-// Flaky on Win only. https://crbug.com/822975
-#if defined(OS_WIN)
-#define MAYBE_PolicyToPrefsMapping DISABLED_PolicyToPrefsMapping
-#else
-#define MAYBE_PolicyToPrefsMapping PolicyToPrefsMapping
-#endif
 // Verifies that policies make their corresponding preferences become managed,
 // and that the user can't override that setting.
-IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, MAYBE_PolicyToPrefsMapping) {
+IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, PolicyToPrefsMapping) {
   Schema chrome_schema = Schema::Wrap(GetChromeSchemaData());
   ASSERT_TRUE(chrome_schema.valid());
   PrefService* local_state = g_browser_process->local_state();
diff --git a/chrome/browser/predictors/glowplug_key_value_data.h b/chrome/browser/predictors/glowplug_key_value_data.h
index 17e2bde..71ae387 100644
--- a/chrome/browser/predictors/glowplug_key_value_data.h
+++ b/chrome/browser/predictors/glowplug_key_value_data.h
@@ -14,6 +14,7 @@
 
 #include "base/location.h"
 #include "base/memory/ref_counted.h"
+#include "base/timer/timer.h"
 #include "chrome/browser/predictors/glowplug_key_value_table.h"
 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
 #include "content/public/browser/browser_thread.h"
@@ -35,7 +36,8 @@
  public:
   GlowplugKeyValueData(scoped_refptr<ResourcePrefetchPredictorTables> tables,
                        GlowplugKeyValueTable<T>* backend,
-                       size_t max_size);
+                       size_t max_size,
+                       base::TimeDelta flush_delay);
 
   // Must be called on the DB sequence of the ResourcePrefetchPredictorTables
   // before calling all other methods.
@@ -66,9 +68,16 @@
     }
   };
 
+  enum class DeferredOperation { kUpdate, kDelete };
+
+  void FlushDataToDisk();
+
   scoped_refptr<ResourcePrefetchPredictorTables> tables_;
   GlowplugKeyValueTable<T>* backend_table_;
   std::unique_ptr<std::map<std::string, T>> data_cache_;
+  std::unordered_map<std::string, DeferredOperation> deferred_updates_;
+  base::RepeatingTimer flush_timer_;
+  const base::TimeDelta flush_delay_;
   const size_t max_size_;
   EntryCompare entry_compare_;
 
@@ -79,10 +88,11 @@
 GlowplugKeyValueData<T, Compare>::GlowplugKeyValueData(
     scoped_refptr<ResourcePrefetchPredictorTables> tables,
     GlowplugKeyValueTable<T>* backend,
-    size_t max_size)
+    size_t max_size,
+    base::TimeDelta flush_delay)
     : tables_(tables),
       backend_table_(backend),
-      data_cache_(),
+      flush_delay_(flush_delay),
       max_size_(max_size) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 }
@@ -136,21 +146,22 @@
     if (data_cache_->size() == max_size_) {
       auto entry_to_delete = std::min_element(
           data_cache_->begin(), data_cache_->end(), entry_compare_);
-      const std::string& key_to_delete = entry_to_delete->first;
-      tables_->ScheduleDBTask(
-          FROM_HERE, base::BindOnce(&GlowplugKeyValueTable<T>::DeleteData,
-                                    base::Unretained(backend_table_),
-                                    std::vector<std::string>({key_to_delete})));
+      deferred_updates_[entry_to_delete->first] = DeferredOperation::kDelete;
       data_cache_->erase(entry_to_delete);
     }
     data_cache_->emplace(key, data);
   } else {
     it->second = data;
   }
+  deferred_updates_[key] = DeferredOperation::kUpdate;
 
-  tables_->ScheduleDBTask(
-      FROM_HERE, base::BindOnce(&GlowplugKeyValueTable<T>::UpdateData,
-                                base::Unretained(backend_table_), key, data));
+  if (flush_delay_.is_zero()) {
+    // Flush immediately, only for tests.
+    FlushDataToDisk();
+  } else if (!flush_timer_.IsRunning()) {
+    flush_timer_.Start(FROM_HERE, flush_delay_, this,
+                       &GlowplugKeyValueData::FlushDataToDisk);
+  }
 }
 
 template <typename T, typename Compare>
@@ -158,15 +169,14 @@
     const std::vector<std::string>& keys) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(data_cache_);
-  std::vector<std::string> keys_found;
   for (const std::string& key : keys) {
     if (data_cache_->erase(key))
-      keys_found.emplace_back(key);
+      deferred_updates_[key] = DeferredOperation::kDelete;
   }
 
-  tables_->ScheduleDBTask(
-      FROM_HERE, base::BindOnce(&GlowplugKeyValueTable<T>::DeleteData,
-                                base::Unretained(backend_table_), keys_found));
+  // Run all deferred updates immediately because it was requested by user.
+  if (!deferred_updates_.empty())
+    FlushDataToDisk();
 }
 
 template <typename T, typename Compare>
@@ -174,11 +184,49 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(data_cache_);
   data_cache_->clear();
+  deferred_updates_.clear();
+  // Delete all the content of the database immediately because it was requested
+  // by user.
   tables_->ScheduleDBTask(
       FROM_HERE, base::BindOnce(&GlowplugKeyValueTable<T>::DeleteAllData,
                                 base::Unretained(backend_table_)));
 }
 
+template <typename T, typename Compare>
+void GlowplugKeyValueData<T, Compare>::FlushDataToDisk() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  if (deferred_updates_.empty())
+    return;
+
+  std::vector<std::string> keys_to_delete;
+  for (const auto& entry : deferred_updates_) {
+    const std::string& key = entry.first;
+    switch (entry.second) {
+      case DeferredOperation::kUpdate: {
+        auto it = data_cache_->find(key);
+        if (it != data_cache_->end()) {
+          tables_->ScheduleDBTask(
+              FROM_HERE, base::BindOnce(&GlowplugKeyValueTable<T>::UpdateData,
+                                        base::Unretained(backend_table_), key,
+                                        it->second));
+        }
+        break;
+      }
+      case DeferredOperation::kDelete:
+        keys_to_delete.push_back(key);
+    }
+  }
+
+  if (!keys_to_delete.empty()) {
+    tables_->ScheduleDBTask(
+        FROM_HERE,
+        base::BindOnce(&GlowplugKeyValueTable<T>::DeleteData,
+                       base::Unretained(backend_table_), keys_to_delete));
+  }
+
+  deferred_updates_.clear();
+}
+
 }  // namespace predictors
 
 #endif  // CHROME_BROWSER_PREDICTORS_GLOWPLUG_KEY_VALUE_DATA_H_
diff --git a/chrome/browser/predictors/loading_predictor_config.cc b/chrome/browser/predictors/loading_predictor_config.cc
index 7045e68..c9253363 100644
--- a/chrome/browser/predictors/loading_predictor_config.cc
+++ b/chrome/browser/predictors/loading_predictor_config.cc
@@ -96,7 +96,8 @@
       max_consecutive_misses(3),
       max_redirect_consecutive_misses(5),
       is_origin_learning_enabled(false),
-      should_disable_other_preconnects(false) {}
+      should_disable_other_preconnects(false),
+      flush_data_to_disk_delay_seconds(30) {}
 
 LoadingPredictorConfig::LoadingPredictorConfig(
     const LoadingPredictorConfig& other) = default;
diff --git a/chrome/browser/predictors/loading_predictor_config.h b/chrome/browser/predictors/loading_predictor_config.h
index 7dc9dec..32f5fe5 100644
--- a/chrome/browser/predictors/loading_predictor_config.h
+++ b/chrome/browser/predictors/loading_predictor_config.h
@@ -81,6 +81,10 @@
 
   // True iff all other implementations of preconnect should be disabled.
   bool should_disable_other_preconnects;
+
+  // Delay between writing data to the predictors database memory cache and
+  // flushing it to disk.
+  size_t flush_data_to_disk_delay_seconds;
 };
 
 }  // namespace predictors
diff --git a/chrome/browser/predictors/loading_test_util.cc b/chrome/browser/predictors/loading_test_util.cc
index b5f6b19..1c20740 100644
--- a/chrome/browser/predictors/loading_test_util.cc
+++ b/chrome/browser/predictors/loading_test_util.cc
@@ -150,6 +150,7 @@
   }
   config->is_origin_learning_enabled = true;
   config->mode = LoadingPredictorConfig::LEARNING;
+  config->flush_data_to_disk_delay_seconds = 0;
 }
 
 scoped_refptr<net::HttpResponseHeaders> MakeResponseHeaders(
diff --git a/chrome/browser/predictors/resource_prefetch_predictor.cc b/chrome/browser/predictors/resource_prefetch_predictor.cc
index b9b098c..754a0a6 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor.cc
@@ -152,9 +152,11 @@
 
   // Create local caches using the database as loaded.
   auto host_redirect_data = std::make_unique<RedirectDataMap>(
-      tables_, tables_->host_redirect_table(), config_.max_hosts_to_track);
+      tables_, tables_->host_redirect_table(), config_.max_hosts_to_track,
+      base::TimeDelta::FromSeconds(config_.flush_data_to_disk_delay_seconds));
   auto origin_data = std::make_unique<OriginDataMap>(
-      tables_, tables_->origin_table(), config_.max_hosts_to_track);
+      tables_, tables_->origin_table(), config_.max_hosts_to_track,
+      base::TimeDelta::FromSeconds(config_.flush_data_to_disk_delay_seconds));
 
   // Get raw pointers to pass to the first task. Ownership of the unique_ptrs
   // will be passed to the reply task.
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index cd6af5fc..75b9e2e 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -711,8 +711,15 @@
         continue;
       }
       Profile* profile = GetProfile(user_data_dir.AppendASCII(profile_path));
-      if (profile)
+      if (profile) {
+        // crbug.com/823338 -> CHECK that the profiles aren't guest or
+        // incognito, causing a crash during session restore.
+        CHECK(!profile->IsGuestSession())
+            << "Guest profiles shouldn't have been saved as active profiles";
+        CHECK(!profile->IsOffTheRecord())
+            << "OTR profiles shouldn't have been saved as active profiles";
         to_return.push_back(profile);
+      }
     }
   }
   return to_return;
@@ -1175,6 +1182,12 @@
     std::set<std::string> profile_paths;
     std::vector<Profile*>::const_iterator it;
     for (it = active_profiles_.begin(); it != active_profiles_.end(); ++it) {
+      // crbug.com/823338 -> CHECK that the profiles aren't guest or incognito,
+      // causing a crash during session restore.
+      CHECK(!(*it)->IsGuestSession())
+          << "Guest profiles shouldn't be saved as active profiles";
+      CHECK(!(*it)->IsOffTheRecord())
+          << "OTR profiles shouldn't be saved as active profiles";
       std::string profile_path = (*it)->GetPath().BaseName().MaybeAsASCII();
       // Some profiles might become ephemeral after they are created.
       // Don't persist the System Profile as one of the last actives, it should
diff --git a/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc b/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc
index 7531983..efd9216a 100644
--- a/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc
+++ b/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc
@@ -15,7 +15,7 @@
 
 void ChromeBrowserMainExtraPartsProfiling::ServiceManagerConnectionStarted(
     content::ServiceManagerConnection* connection) {
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
   // Memory sanitizers are using large memory shadow to keep track of memory
   // state. Using memlog and memory sanitizers at the same time is slowing down
   // user experience, causing the browser to be barely responsive. In theory,
diff --git a/chrome/browser/profiling_host/memlog_browsertest.cc b/chrome/browser/profiling_host/memlog_browsertest.cc
index 7a60fd9..75f6a2ae 100644
--- a/chrome/browser/profiling_host/memlog_browsertest.cc
+++ b/chrome/browser/profiling_host/memlog_browsertest.cc
@@ -25,7 +25,7 @@
 #include "third_party/zlib/zlib.h"
 
 // Some builds don't support memlog in which case the tests won't function.
-#if BUILDFLAG(USE_ALLOCATOR_SHIM) && !defined(SYZYASAN)
+#if BUILDFLAG(USE_ALLOCATOR_SHIM)
 
 namespace profiling {
 
@@ -155,4 +155,4 @@
 
 }  // namespace profiling
 
-#endif  // BUILDFLAG(USE_ALLOCATOR_SHIM) && !defined(SYZYASAN)
+#endif  // BUILDFLAG(USE_ALLOCATOR_SHIM)
diff --git a/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.html b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.html
new file mode 100644
index 0000000..b5c9ae0
--- /dev/null
+++ b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.html
@@ -0,0 +1,37 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="../settings_shared_css.html">
+<link rel="import" href="smb_browser_proxy.html">
+
+<dom-module id="settings-add-smb-share-dialog">
+  <template>
+    <style include="settings-shared">
+      paper-input {
+        width: var(--paper-input-max-width);
+      }
+
+    </style>
+
+    <dialog is="cr-dialog" id="dialog">
+      <div slot="title">$i18n{addSmbShare}</div>
+      <div slot="body" spellcheck="false">
+        <paper-input always-float-label id="address"
+            label="$i18n{smbShareUrl}"
+            value="{{mountUrl_}}"
+            autofocus>
+        </paper-input>
+      </div>
+      <div slot="button-container">
+        <paper-button class="cancel-button" on-click="cancel_" id="cancel">
+            $i18n{cancel}</paper-button>
+        <paper-button id="actionButton" class="action-button"
+          on-click="onAddButtonTap_"
+          disabled="[[!canAddShare_(mountUrl_)]]">
+            $i18n{add}
+        </paper-button>
+      </div>
+    </dialog>
+  </template>
+  <script src="add_smb_share_dialog.js"></script>
+</dom-module>
+
diff --git a/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.js b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.js
new file mode 100644
index 0000000..91211017
--- /dev/null
+++ b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.js
@@ -0,0 +1,48 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview 'settings-add-smb-share-dialog' is a component for adding
+ * an SMB Share.
+ */
+Polymer({
+  is: 'settings-add-smb-share-dialog',
+
+  properties: {
+    /** @private {string} */
+    mountUrl_: String,
+  },
+
+  /** @private {?settings.SmbBrowserProxy} */
+  browserProxy_: null,
+
+  /** @override */
+  created: function() {
+    this.browserProxy_ = settings.SmbBrowserProxyImpl.getInstance();
+  },
+
+  /** @override */
+  attached: function() {
+    this.$.dialog.showModal();
+  },
+
+  /** @private */
+  cancel_: function() {
+    this.$.dialog.cancel();
+  },
+
+  /** @private */
+  onAddButtonTap_: function() {
+    this.browserProxy_.smbMount(this.mountUrl_);
+    this.$.dialog.close();
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  canAddShare_: function() {
+    return !!this.mountUrl_;
+  },
+});
diff --git a/chrome/browser/resources/settings/downloads_page/compiled_resources2.gyp b/chrome/browser/resources/settings/downloads_page/compiled_resources2.gyp
index 038adcc..caa6e280 100644
--- a/chrome/browser/resources/settings/downloads_page/compiled_resources2.gyp
+++ b/chrome/browser/resources/settings/downloads_page/compiled_resources2.gyp
@@ -12,6 +12,29 @@
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
     {
+      'target_name': 'smb_shares_page',
+      'dependencies': [
+        'add_smb_share_dialog'
+
+      ],
+      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
+      'target_name': 'add_smb_share_dialog',
+      'dependencies': [
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior',
+        'smb_browser_proxy',
+      ],
+      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
+      'target_name': 'smb_browser_proxy',
+      'dependencies': [
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
+      ],
+      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
       'target_name': 'downloads_page',
       'dependencies': [
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
@@ -19,7 +42,9 @@
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data',
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:web_ui_listener_behavior',
         '../compiled_resources2.gyp:page_visibility',
+        '../compiled_resources2.gyp:route',
         'downloads_browser_proxy',
+        'smb_browser_proxy',
       ],
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.html b/chrome/browser/resources/settings/downloads_page/downloads_page.html
index ea4a199..089b55a 100644
--- a/chrome/browser/resources/settings/downloads_page/downloads_page.html
+++ b/chrome/browser/resources/settings/downloads_page/downloads_page.html
@@ -4,8 +4,12 @@
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="../controls/controlled_button.html">
 <link rel="import" href="../controls/settings_toggle_button.html">
+<link rel="import" href="../route.html">
 <link rel="import" href="../settings_shared_css.html">
 <link rel="import" href="downloads_browser_proxy.html">
+<if expr="chromeos">
+<link rel="import" href="smb_shares_page.html">
+</if>
 
 <dom-module id="settings-downloads-page">
   <template>
@@ -14,6 +18,9 @@
         display: block;
       }
     </style>
+  <settings-animated-pages id="pages" section="downloads"
+      focus-config="[[focusConfig_]]">
+    <neon-animatable route-path="default">
     <div class="settings-box first two-line">
       <div class="start">
         <div>$i18n{downloadLocation}</div>
@@ -45,6 +52,18 @@
         hidden="[[!pageVisibility.googleDrive]]">
     </settings-toggle-button>
 </if>
+<if expr="chromeos">
+  <template is="dom-if" if="[[enableSmbSettings_]]">
+    <div id="smbShares" class="settings-box"
+        on-click="onTapSmbShares_" actionable>
+      <div class="start"> $i18n{smbSharesTitle} </div>
+      <paper-icon-button-light class="subpage-arrow">
+        <button aria-label="$i18n{smbSharesTitle}"></button>
+      </paper-icon-button-light>
+    </div>
+  </template>
+</if>
+</neon-animatable>
     <template is="dom-if" if="[[autoOpenDownloads_]]" restamp>
       <div class="settings-box">
         <div class="start">
@@ -57,6 +76,17 @@
         </paper-button>
       </div>
     </template>
+<if expr="chromeos">
+      <template is="dom-if" route-path="/smbShares">
+        <settings-subpage
+            associated-control="[[$$('#smbShares')]]"
+            page-title="$i18n{smbSharesTitle}">
+          <settings-smb-shares-page>
+          </settings-smb-shares-page>
+        </settings-subpage>
+      </template>
+</if>
+  </settings-animated-pages>
   </template>
   <script src="downloads_page.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.js b/chrome/browser/resources/settings/downloads_page/downloads_page.js
index fcc2039..a4c9127 100644
--- a/chrome/browser/resources/settings/downloads_page/downloads_page.js
+++ b/chrome/browser/resources/settings/downloads_page/downloads_page.js
@@ -40,6 +40,35 @@
       type: Boolean,
       value: false,
     },
+
+    // <if expr="chromeos">
+    /**
+     * Whether Smb Shares settings should be fetched and displayed.
+     * @private
+     */
+    enableSmbSettings_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.getBoolean('enableNativeSmbSetting');
+      },
+      readOnly: true,
+    },
+    // </if>
+
+    /** @private {!Map<string, string>} */
+    focusConfig_: {
+      type: Object,
+      value: function() {
+        const map = new Map();
+        // <if expr="chromeos">
+        if (settings.routes.SMB_SHARES) {
+          map.set(settings.routes.SMB_SHARES.path, '#smbShares .subpage-arrow');
+        }
+        // </if>
+        return map;
+      },
+    },
+
   },
 
   /** @private {?settings.DownloadsBrowserProxy} */
@@ -64,6 +93,14 @@
   },
 
   // <if expr="chromeos">
+  /** @private */
+  onTapSmbShares_: function() {
+    settings.navigateTo(settings.routes.SMB_SHARES);
+  },
+  // </if>
+
+
+  // <if expr="chromeos">
   /**
    * @param {string} path
    * @return {string} The download location string that is suitable to display
diff --git a/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.html b/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.html
new file mode 100644
index 0000000..2d49472
--- /dev/null
+++ b/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.html
@@ -0,0 +1,2 @@
+<link rel="import" href="chrome://resources/html/cr.html">
+<script src="smb_browser_proxy.js"> </script>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.js b/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.js
new file mode 100644
index 0000000..94abaa2b
--- /dev/null
+++ b/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.js
@@ -0,0 +1,35 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview A helper object used from the "SMB Share" section to
+ * interact with the browser. Used only on Chrome OS.
+ */
+
+cr.define('settings', function() {
+  /** @interface */
+  class SmbBrowserProxy {
+    /**
+     * Attempts to mount an Smb filesystem with the provided url.
+     * @param {string} smbUrl
+     */
+    smbMount(smbUrl) {}
+  }
+
+  /** @implements {settings.SmbBrowserProxy} */
+  class SmbBrowserProxyImpl {
+    /** @override */
+    smbMount(smbUrl) {
+      chrome.send('smbMount', [smbUrl]);
+    }
+  }
+
+  cr.addSingletonGetter(SmbBrowserProxyImpl);
+
+  return {
+    SmbBrowserProxy: SmbBrowserProxy,
+    SmbBrowserProxyImpl: SmbBrowserProxyImpl,
+  };
+
+});
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/downloads_page/smb_shares_page.html b/chrome/browser/resources/settings/downloads_page/smb_shares_page.html
new file mode 100644
index 0000000..1787626
--- /dev/null
+++ b/chrome/browser/resources/settings/downloads_page/smb_shares_page.html
@@ -0,0 +1,36 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/html/action_link.html">
+<link rel="import" href="chrome://resources/html/action_link_css.html">
+<link rel="import" href="chrome://resources/html/assert.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="chrome://resources/html/md_select_css.html">
+<link rel="import" href="../settings_shared_css.html">
+<link rel="import" href="../settings_vars_css.html">
+<link rel="import" href="add_smb_share_dialog.html">
+
+<dom-module id="settings-smb-shares-page">
+  <template>
+    <style include="settings-shared"></style>
+    <div class="settings-box first">
+      <div class="start">
+        <span>$i18n{smbSharesLearnMoreLabel}</span>
+        <a href="http://support.google.com" target="_blank">
+          $i18n{learnMore}
+        </a>
+        <div class="secondary" hidden="false">
+          $i18n{requireNetworkMessage}
+        </div>
+      </div>
+      <paper-button class="primary-button" id="addShare"
+          on-click="onAddShareTap_">
+        $i18n{addSmbShare}
+      </paper-button>
+    </div>
+    <template is="dom-if" if="[[showAddSmbDialog_]]" restamp>
+      <settings-add-smb-share-dialog on-close="onAddSmbDialogClosed_">
+      </settings-add-smb-share-dialog>
+    </template>
+  </template>
+  <script src="smb_shares_page.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/downloads_page/smb_shares_page.js b/chrome/browser/resources/settings/downloads_page/smb_shares_page.js
new file mode 100644
index 0000000..09d58992
--- /dev/null
+++ b/chrome/browser/resources/settings/downloads_page/smb_shares_page.js
@@ -0,0 +1,23 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+Polymer({
+  is: 'settings-smb-shares-page',
+
+  properties: {
+    /** @private */
+    showAddSmbDialog_: Boolean,
+  },
+
+  /** @private */
+  onAddShareTap_: function() {
+    this.showAddSmbDialog_ = true;
+  },
+
+  /** @private */
+  onAddSmbDialogClosed_: function() {
+    this.showAddSmbDialog_ = false;
+  },
+
+});
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html
index f298949..ee0dead 100644
--- a/chrome/browser/resources/settings/people_page/people_page.html
+++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -302,9 +302,11 @@
                 unifiedConsentEnabled_)]]">
           <settings-sync-page
 <if expr="not chromeos">
-              setup-in-progress="[[syncStatus.setupInProgress]]"
+              dice-enabled="[[diceEnabled_]]"
 </if>
-          ></settings-sync-page>
+              unified-consent-enabled="[[unifiedConsentEnabled_]]"
+              sync-status="[[syncStatus]]">
+          </settings-sync-page>
         </settings-subpage>
       </template>
 <if expr="chromeos">
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html
index 06b6aab..34b019e 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.html
+++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -88,6 +88,17 @@
       }
 </if>
     </style>
+<if expr="not chromeos">
+    <template is="dom-if" if="[[shouldShowSyncAccountControl_(diceEnabled,
+        unifiedConsentEnabled, syncStatus.syncSystemEnabled,
+        syncStatus.signinAllowed)]]">
+      <settings-sync-account-control
+          sync-status="[[syncStatus]]"
+          promo-label="$i18n{syncSignInPrompt}"
+          promo-secondary-label="$i18n{syncSignInPromptSecondary}">
+      </settings-sync-account-control>
+    </template>
+</if>
     <div id="[[pages_.SPINNER]]" class="settings-box first"
         hidden$="[[!isStatus_(pages_.SPINNER, pageStatus_)]]">
       $i18n{syncLoading}
@@ -363,7 +374,7 @@
       </template>
     </div>
 <if expr="not chromeos">
-    <cr-toast id="toast" open="[[setupInProgress]]">
+    <cr-toast id="toast" open="[[syncStatus.setupInProgress]]">
       $i18n{syncWillStart}
       <paper-button on-click="onCancelSyncClick_">
         $i18n{cancelSync}
diff --git a/chrome/browser/resources/settings/people_page/sync_page.js b/chrome/browser/resources/settings/people_page/sync_page.js
index d39f8bde..ee32d2c 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.js
+++ b/chrome/browser/resources/settings/people_page/sync_page.js
@@ -53,13 +53,8 @@
       type: Object,
     },
 
-    // <if expr="not chromeos">
-    /** @private */
-    setupInProgress: {
-      type: Boolean,
-      value: false,
-    },
-    // </if>
+    /** @type {settings.SyncStatus} */
+    syncStatus: Object,
 
     /**
      * Whether the "create passphrase" inputs should be shown. These inputs
@@ -98,6 +93,12 @@
       type: String,
       value: '',
     },
+
+    // <if expr="not chromeos">
+    diceEnabled: Boolean,
+    // </if>
+
+    unifiedConsentEnabled: Boolean,
   },
 
   /** @private {?settings.SyncBrowserProxy} */
@@ -428,6 +429,17 @@
     this.didAbort_ = true;
     settings.navigateTo(settings.routes.BASIC);
   },
+
+  // <if expr="not chromeos">
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowSyncAccountControl_: function() {
+    return !!this.diceEnabled && !!this.unifiedConsentEnabled &&
+        !!this.syncStatus.syncSystemEnabled && !!this.syncStatus.signinAllowed;
+  },
+  // </if>
 });
 
 })();
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index e799ba3..64ed4a8b 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -89,6 +89,7 @@
  *   SITE_SETTINGS_UNSANDBOXED_PLUGINS: (undefined|!settings.Route),
  *   SITE_SETTINGS_USB_DEVICES: (undefined|!settings.Route),
  *   SITE_SETTINGS_ZOOM_LEVELS: (undefined|!settings.Route),
+ *   SMB_SHARES: (undefined|!settings.Route),
  *   STORAGE: (undefined|!settings.Route),
  *   STYLUS: (undefined|!settings.Route),
  *   SYNC: (undefined|!settings.Route),
@@ -366,6 +367,9 @@
 
       if (pageVisibility.downloads !== false) {
         r.DOWNLOADS = r.ADVANCED.createSection('/downloads', 'downloads');
+        // <if expr="chromeos">
+        r.SMB_SHARES = r.DOWNLOADS.createChild('/smbShares');
+        // </if>
       }
 
       r.PRINTING = r.ADVANCED.createSection('/printing', 'printing');
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.js b/chrome/browser/resources/settings/settings_menu/settings_menu.js
index ff4b8034d..ff2f5ff2 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.js
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.js
@@ -92,6 +92,5 @@
   onExtensionsLinkClick_: function() {
     chrome.metricsPrivate.recordUserAction(
         'SettingsMenu_ExtensionsLinkClicked');
-    this.fire('external-link-click');
   },
 });
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index 38b5138..494b1e45 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -559,6 +559,26 @@
                  file="downloads_page/downloads_page.js"
                  type="chrome_html"
                  preprocess="true" />
+      <if expr="chromeos">
+        <structure name="IDR_SETTINGS_SMB_BROWSER_PROXY_HTML"
+                   file="downloads_page/smb_browser_proxy.html"
+                   type="chrome_html" />
+        <structure name="IDR_SETTINGS_SMB_BROWSER_PROXY_JS"
+                   file="downloads_page/smb_browser_proxy.js"
+                   type="chrome_html" />
+        <structure name="IDR_SETTINGS_SMB_SHARES_PAGE_HTML"
+                   file="downloads_page/smb_shares_page.html"
+                   type="chrome_html" />
+        <structure name="IDR_SETTINGS_SMB_SHARES_PAGE_JS"
+                   file="downloads_page/smb_shares_page.js"
+                   type="chrome_html" />
+        <structure name="IDR_SETTINGS_ADD_SMB_SHARE_DIALOG_HTML"
+                   file="downloads_page/add_smb_share_dialog.html"
+                   type="chrome_html" />
+        <structure name="IDR_SETTINGS_ADD_SMB_SHARE_DIALOG_JS"
+                   file="downloads_page/add_smb_share_dialog.js"
+                   type="chrome_html" />
+      </if>
       <structure name="IDR_SETTINGS_I18n_SETUP_HTML"
                  file="i18n_setup.html"
                  type="chrome_html" />
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.js b/chrome/browser/resources/settings/settings_ui/settings_ui.js
index 77f59aa..9ef5df1 100644
--- a/chrome/browser/resources/settings/settings_ui/settings_ui.js
+++ b/chrome/browser/resources/settings/settings_ui/settings_ui.js
@@ -82,10 +82,6 @@
       this.$.drawerTemplate.if = true;
     });
 
-    this.addEventListener('external-link-click', () => {
-      this.$.drawer.closeDrawer();
-    });
-
     window.addEventListener('popstate', e => {
       this.$.drawer.closeDrawer();
     });
diff --git a/chrome/browser/sessions/chrome_tab_restore_service_client.cc b/chrome/browser/sessions/chrome_tab_restore_service_client.cc
index 3a16e9f..50940c5 100644
--- a/chrome/browser/sessions/chrome_tab_restore_service_client.cc
+++ b/chrome/browser/sessions/chrome_tab_restore_service_client.cc
@@ -78,12 +78,11 @@
 }
 
 sessions::LiveTabContext*
-ChromeTabRestoreServiceClient::FindLiveTabContextWithID(
-    SessionID::id_type desired_id) {
+ChromeTabRestoreServiceClient::FindLiveTabContextWithID(SessionID desired_id) {
 #if defined(OS_ANDROID)
-  return AndroidLiveTabContext::FindContextWithID(desired_id);;
+  return AndroidLiveTabContext::FindContextWithID(desired_id.id());
 #else
-  return BrowserLiveTabContext::FindContextWithID(desired_id);
+  return BrowserLiveTabContext::FindContextWithID(desired_id.id());
 #endif
 }
 
diff --git a/chrome/browser/sessions/chrome_tab_restore_service_client.h b/chrome/browser/sessions/chrome_tab_restore_service_client.h
index 0031f64..e433d5f0 100644
--- a/chrome/browser/sessions/chrome_tab_restore_service_client.h
+++ b/chrome/browser/sessions/chrome_tab_restore_service_client.h
@@ -27,7 +27,7 @@
   sessions::LiveTabContext* FindLiveTabContextForTab(
       const sessions::LiveTab* tab) override;
   sessions::LiveTabContext* FindLiveTabContextWithID(
-      SessionID::id_type desired_id) override;
+      SessionID desired_id) override;
   bool ShouldTrackURLForRestore(const GURL& url) override;
   std::string GetExtensionAppIDForTab(sessions::LiveTab* tab) override;
   base::FilePath GetPathToSaveTo() override;
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc
index b3c3709..fa557bbd 100644
--- a/chrome/browser/sessions/session_restore.cc
+++ b/chrome/browser/sessions/session_restore.cc
@@ -110,7 +110,7 @@
         clobber_existing_tab_(clobber_existing_tab),
         always_create_tabbed_browser_(always_create_tabbed_browser),
         urls_to_open_(urls_to_open),
-        active_window_id_(0),
+        active_window_id_(SessionID::InvalidValue()),
         restore_started_(base::TimeTicks::Now()),
         on_session_restored_callbacks_(callbacks) {
     if (active_session_restorers == nullptr)
@@ -330,7 +330,7 @@
 
   void OnGotSession(
       std::vector<std::unique_ptr<sessions::SessionWindow>> windows,
-      SessionID::id_type active_window_id) {
+      SessionID active_window_id) {
 #if defined(OS_CHROMEOS)
     chromeos::BootTimesRecorder::Get()->AddLoginTimeMarker(
         "SessionRestore-GotSession", false);
@@ -349,7 +349,7 @@
 
   Browser* ProcessSessionWindowsAndNotify(
       std::vector<std::unique_ptr<sessions::SessionWindow>>* windows,
-      SessionID::id_type active_window_id) {
+      SessionID active_window_id) {
     std::vector<RestoredTab> contents;
     Browser* result =
         ProcessSessionWindows(windows, active_window_id, &contents);
@@ -359,7 +359,7 @@
 
   Browser* ProcessSessionWindows(
       std::vector<std::unique_ptr<sessions::SessionWindow>>* windows,
-      SessionID::id_type active_window_id,
+      SessionID active_window_id,
       std::vector<RestoredTab>* created_contents) {
     DVLOG(1) << "ProcessSessionWindows " << windows->size();
 
@@ -393,7 +393,7 @@
     bool has_visible_browser = false;
     for (const auto& window : *windows) {
       if (window->show_state != ui::SHOW_STATE_MINIMIZED ||
-          window->window_id.id() == active_window_id)
+          window->window_id == active_window_id)
         has_visible_browser = true;
     }
 
@@ -443,7 +443,7 @@
               ? browser->tab_strip_model()->active_index()
               : std::max(0, std::min((*i)->selected_tab_index,
                                      static_cast<int>((*i)->tabs.size()) - 1));
-      if ((*i)->window_id.id() == active_window_id)
+      if ((*i)->window_id == active_window_id)
         browser_to_activate = browser;
 
       RestoreTabsToBrowser(*(*i), browser, initial_tab_count,
@@ -720,7 +720,7 @@
   // loop take a while) we cache the SessionWindows here and create the actual
   // windows when the nested run loop exits.
   std::vector<std::unique_ptr<sessions::SessionWindow>> windows_;
-  SessionID::id_type active_window_id_;
+  SessionID active_window_id_;
 
   content::NotificationRegistrar registrar_;
 
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc
index 7bc8124..4acd8a3 100644
--- a/chrome/browser/sessions/session_service.cc
+++ b/chrome/browser/sessions/session_service.cc
@@ -201,30 +201,29 @@
   if (!ShouldTrackChangesToWindow(window_id))
     return;
 
-  IdToRange::iterator i = tab_to_available_range_.find(tab_id.id());
+  IdToRange::iterator i = tab_to_available_range_.find(tab_id);
   if (i != tab_to_available_range_.end())
     tab_to_available_range_.erase(i);
 
   if (find(pending_window_close_ids_.begin(), pending_window_close_ids_.end(),
-           window_id.id()) != pending_window_close_ids_.end()) {
+           window_id) != pending_window_close_ids_.end()) {
     // Tab is in last window. Don't commit it immediately, instead add it to the
     // list of tabs to close. If the user creates another window, the close is
     // committed.
-    pending_tab_close_ids_.insert(tab_id.id());
+    pending_tab_close_ids_.insert(tab_id);
   } else if (find(window_closing_ids_.begin(), window_closing_ids_.end(),
-                  window_id.id()) != window_closing_ids_.end() ||
-             !IsOnlyOneTabLeft() ||
-             closed_by_user_gesture) {
+                  window_id) != window_closing_ids_.end() ||
+             !IsOnlyOneTabLeft() || closed_by_user_gesture) {
     // Close is the result of one of the following:
     // . window close (and it isn't the last window).
     // . closing a tab and there are other windows/tabs open.
     // . closed by a user gesture.
     // In all cases we need to mark the tab as explicitly closed.
-    ScheduleCommand(sessions::CreateTabClosedCommand(tab_id.id()));
+    ScheduleCommand(sessions::CreateTabClosedCommand(tab_id));
   } else {
     // User closed the last tab in the last tabbed browser. Don't mark the
     // tab closed.
-    pending_tab_close_ids_.insert(tab_id.id());
+    pending_tab_close_ids_.insert(tab_id);
     has_open_trackable_browsers_ = false;
   }
 }
@@ -281,9 +280,9 @@
     }
   }
   if (use_pending_close)
-    pending_window_close_ids_.insert(window_id.id());
+    pending_window_close_ids_.insert(window_id);
   else
-    window_closing_ids_.insert(window_id.id());
+    window_closing_ids_.insert(window_id);
 }
 
 void SessionService::WindowClosed(const SessionID& window_id) {
@@ -293,19 +292,19 @@
     return;
   }
 
-  windows_tracking_.erase(window_id.id());
+  windows_tracking_.erase(window_id);
 
-  if (window_closing_ids_.find(window_id.id()) != window_closing_ids_.end()) {
-    window_closing_ids_.erase(window_id.id());
-    ScheduleCommand(sessions::CreateWindowClosedCommand(window_id.id()));
-  } else if (pending_window_close_ids_.find(window_id.id()) ==
+  if (window_closing_ids_.find(window_id) != window_closing_ids_.end()) {
+    window_closing_ids_.erase(window_id);
+    ScheduleCommand(sessions::CreateWindowClosedCommand(window_id));
+  } else if (pending_window_close_ids_.find(window_id) ==
              pending_window_close_ids_.end()) {
     // We'll hit this if user closed the last tab in a window.
     has_open_trackable_browsers_ = HasOpenTrackableBrowsers(window_id);
     if (!has_open_trackable_browsers_)
-      pending_window_close_ids_.insert(window_id.id());
+      pending_window_close_ids_.insert(window_id);
     else
-      ScheduleCommand(sessions::CreateWindowClosedCommand(window_id.id()));
+      ScheduleCommand(sessions::CreateWindowClosedCommand(window_id));
   }
   MaybeDeleteSessionOnlyData();
 }
@@ -361,7 +360,7 @@
   if (!ShouldRestoreWindowOfType(window_type, app_type))
     return;
 
-  windows_tracking_.insert(window_id.id());
+  windows_tracking_.insert(window_id);
 
   // The user created a new tabbed browser with our profile. Commit any
   // pending closes.
@@ -400,9 +399,8 @@
     return;
 
   // Update the range of indices.
-  if (tab_to_available_range_.find(tab_id.id()) !=
-      tab_to_available_range_.end()) {
-    std::pair<int, int>& range = tab_to_available_range_[tab_id.id()];
+  if (tab_to_available_range_.find(tab_id) != tab_to_available_range_.end()) {
+    std::pair<int, int>& range = tab_to_available_range_[tab_id];
     range.first = std::max(0, range.first - count);
     range.second = std::max(0, range.second - count);
   }
@@ -431,9 +429,8 @@
     return;
   }
 
-  if (tab_to_available_range_.find(tab_id.id()) !=
-      tab_to_available_range_.end()) {
-    std::pair<int, int>& range = tab_to_available_range_[tab_id.id()];
+  if (tab_to_available_range_.find(tab_id) != tab_to_available_range_.end()) {
+    std::pair<int, int>& range = tab_to_available_range_[tab_id];
     range.first = std::min(navigation.index(), range.first);
     range.second = std::max(navigation.index(), range.second);
   }
@@ -455,10 +452,9 @@
   if (!ShouldTrackChangesToWindow(window_id))
     return;
 
-  if (tab_to_available_range_.find(tab_id.id()) !=
-      tab_to_available_range_.end()) {
-    if (index < tab_to_available_range_[tab_id.id()].first ||
-        index > tab_to_available_range_[tab_id.id()].second) {
+  if (tab_to_available_range_.find(tab_id) != tab_to_available_range_.end()) {
+    if (index < tab_to_available_range_[tab_id].first ||
+        index > tab_to_available_range_[tab_id].second) {
       // The new index is outside the range of what we've archived, schedule
       // a reset.
       ResetFromCurrentBrowsers();
@@ -604,7 +600,7 @@
     const sessions::GetLastSessionCallback& callback,
     std::vector<std::unique_ptr<sessions::SessionCommand>> commands) {
   std::vector<std::unique_ptr<sessions::SessionWindow>> valid_windows;
-  SessionID::id_type active_window_id = 0;
+  SessionID active_window_id = SessionID::InvalidValue();
 
   sessions::RestoreSessionFromCommands(commands, &valid_windows,
                                        &active_window_id);
@@ -618,7 +614,9 @@
                                          int index_in_window,
                                          bool is_pinned,
                                          IdToRange* tab_to_available_range) {
-  DCHECK(tab && window_id.id());
+  DCHECK(tab);
+  DCHECK(window_id.is_valid());
+
   SessionTabHelper* session_tab_helper = SessionTabHelper::FromWebContents(tab);
   const SessionID& session_id(session_tab_helper->session_id());
   base_session_service_->AppendRebuildCommand(
@@ -632,7 +630,7 @@
                tab->GetController().GetEntryCount());
   const int pending_index = tab->GetController().GetPendingEntryIndex();
   if (tab_to_available_range) {
-    (*tab_to_available_range)[session_id.id()] =
+    (*tab_to_available_range)[session_id] =
         std::pair<int, int>(min_index, max_index);
   }
 
@@ -693,9 +691,9 @@
 void SessionService::BuildCommandsForBrowser(
     Browser* browser,
     IdToRange* tab_to_available_range,
-    std::set<SessionID::id_type>* windows_to_track) {
+    std::set<SessionID>* windows_to_track) {
   DCHECK(browser);
-  DCHECK(browser->session_id().id());
+  DCHECK(browser->session_id().is_valid());
 
   base_session_service_->AppendRebuildCommand(
       sessions::CreateSetWindowBoundsCommand(
@@ -718,7 +716,7 @@
   sessions::CreateSetWindowWorkspaceCommand(
       browser->session_id(), browser->window()->GetWorkspace());
 
-  windows_to_track->insert(browser->session_id().id());
+  windows_to_track->insert(browser->session_id());
   TabStripModel* tab_strip = browser->tab_strip_model();
   for (int i = 0; i < tab_strip->count(); ++i) {
     WebContents* tab = tab_strip->GetWebContentsAt(i);
@@ -738,7 +736,7 @@
 
 void SessionService::BuildCommandsFromBrowsers(
     IdToRange* tab_to_available_range,
-    std::set<SessionID::id_type>* windows_to_track) {
+    std::set<SessionID>* windows_to_track) {
   for (auto* browser : *BrowserList::GetInstance()) {
     // Make sure the browser has tabs and a window. Browser's destructor
     // removes itself from the BrowserList. When a browser is closed the
@@ -811,7 +809,7 @@
 
   int window_count = 0;
   for (auto* browser : *BrowserList::GetInstance()) {
-    const SessionID::id_type window_id = browser->session_id().id();
+    const SessionID window_id = browser->session_id();
     if (ShouldTrackBrowser(browser) &&
         window_closing_ids_.find(window_id) == window_closing_ids_.end()) {
       if (++window_count > 1)
@@ -833,8 +831,8 @@
   }
 
   for (auto* browser : *BrowserList::GetInstance()) {
-    const SessionID::id_type browser_id = browser->session_id().id();
-    if (browser_id != window_id.id() &&
+    const SessionID browser_id = browser->session_id();
+    if (browser_id != window_id &&
         window_closing_ids_.find(browser_id) == window_closing_ids_.end() &&
         ShouldTrackBrowser(browser)) {
       return true;
@@ -845,7 +843,7 @@
 
 bool SessionService::ShouldTrackChangesToWindow(
     const SessionID& window_id) const {
-  return windows_tracking_.find(window_id.id()) != windows_tracking_.end();
+  return windows_tracking_.find(window_id) != windows_tracking_.end();
 }
 
 bool SessionService::ShouldTrackBrowser(Browser* browser) const {
diff --git a/chrome/browser/sessions/session_service.h b/chrome/browser/sessions/session_service.h
index 4961a2b..169c527 100644
--- a/chrome/browser/sessions/session_service.h
+++ b/chrome/browser/sessions/session_service.h
@@ -232,7 +232,7 @@
   FRIEND_TEST_ALL_PREFIXES(SessionServiceTest, RemoveUnusedRestoreWindowsTest);
   FRIEND_TEST_ALL_PREFIXES(NoStartupWindowTest, DontInitSessionServiceForApps);
 
-  typedef std::map<SessionID::id_type, std::pair<int, int> > IdToRange;
+  typedef std::map<SessionID, std::pair<int, int>> IdToRange;
 
   void Init();
 
@@ -275,18 +275,16 @@
   // Adds commands to create the specified browser, and invokes
   // BuildCommandsForTab for each of the tabs in the browser. This ignores
   // any tabs not in the profile we were created with.
-  void BuildCommandsForBrowser(
-      Browser* browser,
-      IdToRange* tab_to_available_range,
-      std::set<SessionID::id_type>* windows_to_track);
+  void BuildCommandsForBrowser(Browser* browser,
+                               IdToRange* tab_to_available_range,
+                               std::set<SessionID>* windows_to_track);
 
   // Iterates over all the known browsers invoking BuildCommandsForBrowser.
   // This only adds browsers that should be tracked (|ShouldRestoreWindowOfType|
   // returns true). All browsers that are tracked are added to windows_to_track
   // (as long as it is non-null).
-  void BuildCommandsFromBrowsers(
-      IdToRange* tab_to_available_range,
-      std::set<SessionID::id_type>* windows_to_track);
+  void BuildCommandsFromBrowsers(IdToRange* tab_to_available_range,
+                                 std::set<SessionID>* windows_to_track);
 
   // Schedules a reset of the existing commands. A reset means the contents
   // of the file are recreated from the state of the browser.
@@ -352,22 +350,22 @@
   // last tabbed browser and no more tabbed browsers are open with the same
   // profile, the window ID is added here. These IDs are only committed (which
   // marks them as closed) if the user creates a new tabbed browser.
-  typedef std::set<SessionID::id_type> PendingWindowCloseIDs;
+  typedef std::set<SessionID> PendingWindowCloseIDs;
   PendingWindowCloseIDs pending_window_close_ids_;
 
   // Set of tabs that have been closed by way of the last window or last tab
   // closing, but not yet committed.
-  typedef std::set<SessionID::id_type> PendingTabCloseIDs;
+  typedef std::set<SessionID> PendingTabCloseIDs;
   PendingTabCloseIDs pending_tab_close_ids_;
 
   // When a window other than the last window (see description of
   // pending_window_close_ids) is closed, the id is added to this set.
-  typedef std::set<SessionID::id_type> WindowClosingIDs;
+  typedef std::set<SessionID> WindowClosingIDs;
   WindowClosingIDs window_closing_ids_;
 
   // Set of windows we're tracking changes to. This is only browsers that
   // return true from |ShouldRestoreWindowOfType|.
-  typedef std::set<SessionID::id_type> WindowsTracking;
+  typedef std::set<SessionID> WindowsTracking;
   WindowsTracking windows_tracking_;
 
   // Are there any open trackable browsers?
diff --git a/chrome/browser/sessions/session_service_test_helper.cc b/chrome/browser/sessions/session_service_test_helper.cc
index a03c4441c..3f6743a3 100644
--- a/chrome/browser/sessions/session_service_test_helper.cc
+++ b/chrome/browser/sessions/session_service_test_helper.cc
@@ -57,7 +57,7 @@
 // Be sure and null out service to force closing the file.
 void SessionServiceTestHelper::ReadWindows(
     std::vector<std::unique_ptr<sessions::SessionWindow>>* windows,
-    SessionID::id_type* active_window_id) {
+    SessionID* active_window_id) {
   std::vector<std::unique_ptr<sessions::SessionCommand>> read_commands;
   sessions::BaseSessionServiceTestHelper test_helper(
       service_->GetBaseSessionServiceForTest());
diff --git a/chrome/browser/sessions/session_service_test_helper.h b/chrome/browser/sessions/session_service_test_helper.h
index 273da262..5b32812 100644
--- a/chrome/browser/sessions/session_service_test_helper.h
+++ b/chrome/browser/sessions/session_service_test_helper.h
@@ -50,7 +50,7 @@
   // Reads the contents of the last session.
   void ReadWindows(
       std::vector<std::unique_ptr<sessions::SessionWindow>>* windows,
-      SessionID::id_type* active_window_id);
+      SessionID* active_window_id);
 
   void AssertTabEquals(const SessionID& window_id,
                        const SessionID& tab_id,
diff --git a/chrome/browser/sessions/session_service_unittest.cc b/chrome/browser/sessions/session_service_unittest.cc
index f0e4072..a72c5ca 100644
--- a/chrome/browser/sessions/session_service_unittest.cc
+++ b/chrome/browser/sessions/session_service_unittest.cc
@@ -90,15 +90,15 @@
 
   void ReadWindows(
       std::vector<std::unique_ptr<sessions::SessionWindow>>* windows,
-      SessionID::id_type* active_window_id) {
+      SessionID* active_window_id) {
     // Forces closing the file.
     helper_.SetService(NULL);
 
     SessionService* session_service = new SessionService(path_);
     helper_.SetService(session_service);
 
-    SessionID::id_type* non_null_active_window_id = active_window_id;
-    SessionID::id_type dummy_active_window_id = 0;
+    SessionID* non_null_active_window_id = active_window_id;
+    SessionID dummy_active_window_id = SessionID::InvalidValue();
     if (!non_null_active_window_id)
       non_null_active_window_id = &dummy_active_window_id;
     helper_.ReadWindows(windows, non_null_active_window_id);
@@ -178,7 +178,7 @@
 
 TEST_F(SessionServiceTest, Basic) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
 
   SerializedNavigationEntry nav1 =
       SerializedNavigationEntryTestHelper::CreateNavigation(
@@ -196,7 +196,7 @@
   ASSERT_TRUE(window_bounds == windows[0]->bounds);
   ASSERT_EQ(window_workspace, windows[0]->workspace);
   ASSERT_EQ(0, windows[0]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
   ASSERT_EQ(1U, windows[0]->tabs.size());
   ASSERT_EQ(sessions::SessionWindow::TYPE_TABBED, windows[0]->type);
 
@@ -209,7 +209,7 @@
 // Make sure we persist post entries.
 TEST_F(SessionServiceTest, PersistPostData) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
 
   SerializedNavigationEntry nav1 =
       SerializedNavigationEntryTestHelper::CreateNavigation(
@@ -228,7 +228,7 @@
 TEST_F(SessionServiceTest, ClosingTabStaysClosed) {
   SessionID tab_id;
   SessionID tab2_id;
-  ASSERT_NE(tab_id.id(), tab2_id.id());
+  ASSERT_NE(tab_id, tab2_id);
 
   SerializedNavigationEntry nav1 =
       SerializedNavigationEntryTestHelper::CreateNavigation(
@@ -249,7 +249,7 @@
 
   ASSERT_EQ(1U, windows.size());
   ASSERT_EQ(0, windows[0]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
   ASSERT_EQ(1U, windows[0]->tabs.size());
 
   sessions::SessionTab* tab = windows[0]->tabs[0].get();
@@ -315,15 +315,15 @@
 
   sessions::SessionTab* rt1;
   sessions::SessionTab* rt2;
-  if (windows[0]->window_id.id() == window_id.id()) {
-    ASSERT_EQ(window2_id.id(), windows[1]->window_id.id());
+  if (windows[0]->window_id == window_id) {
+    ASSERT_EQ(window2_id, windows[1]->window_id);
     ASSERT_EQ(ui::SHOW_STATE_NORMAL, windows[0]->show_state);
     ASSERT_EQ(ui::SHOW_STATE_MAXIMIZED, windows[1]->show_state);
     rt1 = windows[0]->tabs[0].get();
     rt2 = windows[1]->tabs[0].get();
   } else {
-    ASSERT_EQ(window2_id.id(), windows[0]->window_id.id());
-    ASSERT_EQ(window_id.id(), windows[1]->window_id.id());
+    ASSERT_EQ(window2_id, windows[0]->window_id);
+    ASSERT_EQ(window_id, windows[1]->window_id);
     ASSERT_EQ(ui::SHOW_STATE_MAXIMIZED, windows[0]->show_state);
     ASSERT_EQ(ui::SHOW_STATE_NORMAL, windows[1]->show_state);
     rt1 = windows[1]->tabs[0].get();
@@ -365,7 +365,7 @@
   ASSERT_EQ(1U, windows.size());
   ASSERT_EQ(0, windows[0]->selected_tab_index);
   ASSERT_EQ(1U, windows[0]->tabs.size());
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
 
   sessions::SessionTab* tab = windows[0]->tabs[0].get();
   helper_.AssertTabEquals(window_id, tab1_id, 0, 0, 1, *tab);
@@ -375,7 +375,7 @@
 TEST_F(SessionServiceTest, ClosingWindowDoesntCloseTabs) {
   SessionID tab_id;
   SessionID tab2_id;
-  ASSERT_NE(tab_id.id(), tab2_id.id());
+  ASSERT_NE(tab_id, tab2_id);
 
   SerializedNavigationEntry nav1 =
       SerializedNavigationEntryTestHelper::CreateNavigation(
@@ -397,7 +397,7 @@
 
   ASSERT_EQ(1U, windows.size());
   ASSERT_EQ(0, windows[0]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
   ASSERT_EQ(2U, windows[0]->tabs.size());
 
   sessions::SessionTab* tab = windows[0]->tabs[0].get();
@@ -444,7 +444,7 @@
   SessionID window2_id;
   SessionID tab_id;
   SessionID tab2_id;
-  ASSERT_NE(window2_id.id(), window_id.id());
+  ASSERT_NE(window2_id, window_id);
 
   service()->SetWindowType(window2_id,
                            Browser::TYPE_TABBED,
@@ -475,7 +475,7 @@
 
   ASSERT_EQ(1U, windows.size());
   ASSERT_EQ(0, windows[0]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
   ASSERT_EQ(1U, windows[0]->tabs.size());
 
   sessions::SessionTab* tab = windows[0]->tabs[0].get();
@@ -488,7 +488,7 @@
   SessionID window2_id;
   SessionID tab_id;
   SessionID tab2_id;
-  ASSERT_NE(window2_id.id(), window_id.id());
+  ASSERT_NE(window2_id, window_id);
 
   service()->SetWindowType(window2_id,
                            Browser::TYPE_POPUP,
@@ -516,7 +516,7 @@
 
   ASSERT_EQ(1U, windows.size());
   ASSERT_EQ(0, windows[0]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
   ASSERT_EQ(1U, windows[0]->tabs.size());
 
   sessions::SessionTab* tab = windows[0]->tabs[0].get();
@@ -542,7 +542,7 @@
   SessionID window2_id;
   SessionID tab_id;
   SessionID tab2_id;
-  ASSERT_NE(window2_id.id(), window_id.id());
+  ASSERT_NE(window2_id, window_id);
 
   service()->SetWindowType(window2_id,
                            Browser::TYPE_POPUP,
@@ -573,7 +573,7 @@
       0 : 1;
   int app_index = tabbed_index == 0 ? 1 : 0;
   ASSERT_EQ(0, windows[tabbed_index]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[tabbed_index]->window_id.id());
+  ASSERT_EQ(window_id, windows[tabbed_index]->window_id);
   ASSERT_EQ(1U, windows[tabbed_index]->tabs.size());
 
   sessions::SessionTab* tab = windows[tabbed_index]->tabs[0].get();
@@ -581,7 +581,7 @@
   helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
 
   ASSERT_EQ(0, windows[app_index]->selected_tab_index);
-  ASSERT_EQ(window2_id.id(), windows[app_index]->window_id.id());
+  ASSERT_EQ(window2_id, windows[app_index]->window_id);
   ASSERT_EQ(1U, windows[app_index]->tabs.size());
   ASSERT_TRUE(windows[app_index]->type == sessions::SessionWindow::TYPE_POPUP);
   ASSERT_EQ("TestApp", windows[app_index]->app_name);
@@ -617,7 +617,7 @@
 
   ASSERT_EQ(1U, windows.size());
   ASSERT_EQ(0, windows[0]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
   ASSERT_EQ(1U, windows[0]->tabs.size());
 
   // There shouldn't be an app id.
@@ -679,7 +679,7 @@
 // Make sure application extension ids are persisted.
 TEST_F(SessionServiceTest, PersistApplicationExtensionID) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
   std::string app_id("foo");
 
   SerializedNavigationEntry nav1 =
@@ -700,7 +700,7 @@
 // Check that user agent overrides are persisted.
 TEST_F(SessionServiceTest, PersistUserAgentOverrides) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
   std::string user_agent_override = "Mozilla/5.0 (X11; Linux x86_64) "
       "AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 "
       "Safari/535.19";
@@ -727,7 +727,7 @@
 // Makes sure a tab closed by a user gesture is not restored.
 TEST_F(SessionServiceTest, CloseTabUserGesture) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
 
   SerializedNavigationEntry nav1 =
       SerializedNavigationEntryTestHelper::CreateNavigation(
@@ -746,7 +746,7 @@
 // Verifies SetWindowBounds maps SHOW_STATE_DEFAULT to SHOW_STATE_NORMAL.
 TEST_F(SessionServiceTest, DontPersistDefault) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
   SerializedNavigationEntry nav1 =
       SerializedNavigationEntryTestHelper::CreateNavigation(
           "http://google.com", "abc");
@@ -764,7 +764,7 @@
 
 TEST_F(SessionServiceTest, KeepPostDataWithoutPasswords) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
 
   // Create a page state representing a HTTP body without posted passwords.
   content::PageState page_state =
@@ -805,7 +805,7 @@
 
 TEST_F(SessionServiceTest, RemovePostDataWithPasswords) {
   SessionID tab_id;
-  ASSERT_NE(window_id.id(), tab_id.id());
+  ASSERT_NE(window_id, tab_id);
 
   // Create a page state representing a HTTP body with posted passwords.
   content::PageState page_state =
@@ -916,9 +916,9 @@
   service()->ScheduleCommand(sessions::CreateSetActiveWindowCommand(window_id));
 
   std::vector<std::unique_ptr<sessions::SessionWindow>> windows;
-  SessionID::id_type active_window_id = 0;
+  SessionID active_window_id = SessionID::InvalidValue();
   ReadWindows(&windows, &active_window_id);
-  EXPECT_EQ(window_id.id(), active_window_id);
+  EXPECT_EQ(window_id, active_window_id);
 }
 
 // It's easier to have two separate tests with setup/teardown than to manualy
@@ -940,9 +940,9 @@
       sessions::CreateSetActiveWindowCommand(window2_id));
 
   std::vector<std::unique_ptr<sessions::SessionWindow>> windows;
-  SessionID::id_type active_window_id = 0;
+  SessionID active_window_id = SessionID::InvalidValue();
   ReadWindows(&windows, &active_window_id);
-  EXPECT_EQ(window2_id.id(), active_window_id);
+  EXPECT_EQ(window2_id, active_window_id);
 }
 
 // Makes sure we don't track blacklisted URLs.
@@ -969,7 +969,7 @@
 
   ASSERT_EQ(1U, windows.size());
   ASSERT_EQ(0, windows[0]->selected_tab_index);
-  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
+  ASSERT_EQ(window_id, windows[0]->window_id);
   ASSERT_EQ(1U, windows[0]->tabs.size());
 
   sessions::SessionTab* tab = windows[0]->tabs[0].get();
@@ -982,7 +982,7 @@
 
 void OnGotPreviousSession(
     std::vector<std::unique_ptr<sessions::SessionWindow>> windows,
-    SessionID::id_type ignored_active_window) {
+    SessionID ignored_active_window) {
   FAIL() << "SessionService was destroyed, this shouldn't be reached.";
 }
 
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc
index 69665a4..8319032 100644
--- a/chrome/browser/sessions/tab_restore_browsertest.cc
+++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -523,7 +523,7 @@
   EXPECT_EQ(3u, tabs.size());
 
   // Find the Tab to restore.
-  SessionID::id_type tab_id_to_restore = 0;
+  SessionID tab_id_to_restore = SessionID::InvalidValue();
   bool found_tab_to_restore = false;
   for (const auto& tab_ptr : tabs) {
     auto& tab = *tab_ptr;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 0a326ee..0c3b3ce 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -2111,6 +2111,8 @@
       "webui/settings/chromeos/google_assistant_handler.h",
       "webui/settings/chromeos/internet_handler.cc",
       "webui/settings/chromeos/internet_handler.h",
+      "webui/settings/chromeos/smb_handler.cc",
+      "webui/settings/chromeos/smb_handler.h",
       "webui/version_handler_chromeos.cc",
       "webui/version_handler_chromeos.h",
       "window_sizer/window_sizer_ash.cc",
@@ -2145,6 +2147,7 @@
       "//ui/base/ime",
       "//ui/chromeos",
       "//ui/chromeos/events",
+      "//ui/compositor_extra",
       "//ui/keyboard:mojom",
     ]
     allow_circular_includes_from += [ "//chrome/browser/chromeos" ]
@@ -2502,6 +2505,20 @@
         "cocoa/bookmarks/bookmark_editor_controller.h",
         "cocoa/bookmarks/bookmark_editor_controller.mm",
         "cocoa/constrained_web_dialog_delegate_mac.mm",
+        "cocoa/content_settings/blocked_plugin_bubble_controller.h",
+        "cocoa/content_settings/blocked_plugin_bubble_controller.mm",
+        "cocoa/content_settings/collected_cookies_mac.h",
+        "cocoa/content_settings/collected_cookies_mac.mm",
+        "cocoa/content_settings/content_setting_bubble_cocoa.h",
+        "cocoa/content_settings/content_setting_bubble_cocoa.mm",
+        "cocoa/content_settings/cookie_details.h",
+        "cocoa/content_settings/cookie_details.mm",
+        "cocoa/content_settings/cookie_details_view_controller.h",
+        "cocoa/content_settings/cookie_details_view_controller.mm",
+        "cocoa/content_settings/cookie_tree_node.h",
+        "cocoa/content_settings/cookie_tree_node.mm",
+        "cocoa/content_settings/cookies_tree_controller_bridge.h",
+        "cocoa/content_settings/cookies_tree_controller_bridge.mm",
         "cocoa/download/download_danger_prompt_impl.cc",
         "cocoa/extensions/chooser_dialog_cocoa.h",
         "cocoa/extensions/chooser_dialog_cocoa.mm",
@@ -2526,6 +2543,8 @@
         "cocoa/simple_message_box_bridge_views.mm",
         "cocoa/simple_message_box_cocoa.h",
         "cocoa/simple_message_box_cocoa.mm",
+        "cocoa/subresource_filter/subresource_filter_bubble_controller.h",
+        "cocoa/subresource_filter/subresource_filter_bubble_controller.mm",
         "javascript_dialogs/javascript_dialog_cocoa.h",
         "javascript_dialogs/javascript_dialog_cocoa.mm",
         "javascript_dialogs/javascript_dialog_mac.cc",
diff --git a/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc b/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc
index 8aa444f..5ad144d0 100644
--- a/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc
+++ b/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc
@@ -8,6 +8,7 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
+#include "chrome/browser/android/android_theme_resources.h"
 #include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
@@ -42,6 +43,10 @@
       GURL(base::android::ConvertJavaStringToUTF16(env, url)));
 }
 
+int AutofillSaveCardInfoBar::GetGooglePayBrandingIconId() {
+  return IDR_AUTOFILL_GOOGLE_PAY_WITH_DIVIDER;
+}
+
 base::android::ScopedJavaLocalRef<jobject>
 AutofillSaveCardInfoBar::CreateRenderInfoBar(JNIEnv* env) {
   autofill::AutofillSaveCardInfoBarDelegateMobile* delegate =
@@ -52,16 +57,21 @@
     java_bitmap = gfx::ConvertToJavaBitmap(delegate->GetIcon().ToSkBitmap());
   }
 
+  base::string16 cancel_button_text =
+      GetTextFor(ConfirmInfoBarDelegate::BUTTON_CANCEL);
+  if (delegate->IsGooglePayBrandingEnabled()) {
+    cancel_button_text = GetTextFor(ConfirmInfoBarDelegate::BUTTON_NONE);
+  }
   base::android::ScopedJavaLocalRef<jobject> java_delegate =
       Java_AutofillSaveCardInfoBar_create(
           env, reinterpret_cast<intptr_t>(this), GetEnumeratedIconId(),
-          java_bitmap, base::android::ConvertUTF16ToJavaString(
-                           env, delegate->GetMessageText()),
+          java_bitmap,
+          base::android::ConvertUTF16ToJavaString(env,
+                                                  delegate->GetMessageText()),
           base::android::ConvertUTF16ToJavaString(env, delegate->GetLinkText()),
           base::android::ConvertUTF16ToJavaString(
               env, GetTextFor(ConfirmInfoBarDelegate::BUTTON_OK)),
-          base::android::ConvertUTF16ToJavaString(
-              env, GetTextFor(ConfirmInfoBarDelegate::BUTTON_CANCEL)));
+          base::android::ConvertUTF16ToJavaString(env, cancel_button_text));
 
   Java_AutofillSaveCardInfoBar_addDetail(
       env, java_delegate,
@@ -69,6 +79,19 @@
       base::android::ConvertUTF16ToJavaString(env, delegate->card_label()),
       base::android::ConvertUTF16ToJavaString(env, delegate->card_sub_label()));
 
+  if (delegate->IsGooglePayBrandingEnabled()) {
+    Java_AutofillSaveCardInfoBar_setBrandIconId(
+        env, java_delegate,
+        ResourceMapper::MapFromChromiumId(GetGooglePayBrandingIconId()));
+    Java_AutofillSaveCardInfoBar_setTitleText(
+        env, java_delegate,
+        base::android::ConvertUTF16ToJavaString(env, delegate->GetTitleText()));
+    Java_AutofillSaveCardInfoBar_setDescriptionText(
+        env, java_delegate,
+        base::android::ConvertUTF16ToJavaString(
+            env, delegate->GetDescriptionText()));
+  }
+
   for (const auto& line : delegate->legal_messages()) {
     Java_AutofillSaveCardInfoBar_addLegalMessageLine(
         env, java_delegate,
diff --git a/chrome/browser/ui/android/infobars/autofill_save_card_infobar.h b/chrome/browser/ui/android/infobars/autofill_save_card_infobar.h
index 0a70497..b176165 100644
--- a/chrome/browser/ui/android/infobars/autofill_save_card_infobar.h
+++ b/chrome/browser/ui/android/infobars/autofill_save_card_infobar.h
@@ -35,6 +35,11 @@
   // Returns the infobar delegate.
   autofill::AutofillSaveCardInfoBarDelegateMobile* GetSaveCardDelegate();
 
+  // Returns Google Pay branding icon id. Keeping this method here instead
+  // of autofill_save_card_infobar_delegate_mobile.cc as Android icon .xmls
+  // are stored in /chrome and /components cannot depend on /chrome.
+  int GetGooglePayBrandingIconId();
+
   DISALLOW_COPY_AND_ASSIGN(AutofillSaveCardInfoBar);
 };
 
diff --git a/chrome/browser/ui/ash/chrome_keyboard_ui.cc b/chrome/browser/ui/ash/chrome_keyboard_ui.cc
index b5d94c29..adca181 100644
--- a/chrome/browser/ui/ash/chrome_keyboard_ui.cc
+++ b/chrome/browser/ui/ash/chrome_keyboard_ui.cc
@@ -43,13 +43,13 @@
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/text_input_client.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
+#include "ui/compositor_extra/shadow.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/keyboard/keyboard_controller.h"
 #include "ui/keyboard/keyboard_controller_observer.h"
 #include "ui/keyboard/keyboard_resource_util.h"
 #include "ui/keyboard/keyboard_switches.h"
 #include "ui/keyboard/keyboard_util.h"
-#include "ui/wm/core/shadow.h"
 #include "ui/wm/core/shadow_types.h"
 
 namespace virtual_keyboard_private = extensions::api::virtual_keyboard_private;
@@ -477,7 +477,7 @@
     return;
 
   if (!shadow_) {
-    shadow_ = std::make_unique<::wm::Shadow>();
+    shadow_ = std::make_unique<ui::Shadow>();
     shadow_->Init(wm::kShadowElevationActiveWindow);
     shadow_->layer()->SetVisible(true);
     contents_window->parent()->layer()->Add(shadow_->layer());
diff --git a/chrome/browser/ui/ash/chrome_keyboard_ui.h b/chrome/browser/ui/ash/chrome_keyboard_ui.h
index d0f0162..d2de99e6c 100644
--- a/chrome/browser/ui/ash/chrome_keyboard_ui.h
+++ b/chrome/browser/ui/ash/chrome_keyboard_ui.h
@@ -24,15 +24,13 @@
 namespace gfx {
 class Rect;
 }
-namespace wm {
-class Shadow;
-}
 namespace content {
 class BrowserContext;
 class WebContents;
 }  // namespace content
 namespace ui {
 class InputMethod;
+class Shadow;
 }
 
 // Subclass of KeyboardUI. It is used by KeyboardController to get
@@ -126,7 +124,7 @@
   const GURL default_url_;
 
   std::unique_ptr<content::WebContents> keyboard_contents_;
-  std::unique_ptr<wm::Shadow> shadow_;
+  std::unique_ptr<ui::Shadow> shadow_;
 
   std::unique_ptr<keyboard::KeyboardControllerObserver> observer_;
   std::unique_ptr<WindowBoundsChangeObserver> window_bounds_observer_;
diff --git a/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc b/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc
index 3f040f6..3d3a799 100644
--- a/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc
+++ b/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc
@@ -4,12 +4,14 @@
 
 #include <set>
 #include <string>
+#include <tuple>
 #include <vector>
 
 #include "ash/accelerators/accelerator_table.h"
 #include "ash/components/shortcut_viewer/keyboard_shortcut_item.h"
 #include "ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.h"
 #include "base/macros.h"
+#include "base/md5.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/ui/views/accelerator_table.h"
@@ -17,14 +19,86 @@
 
 namespace {
 
+// The total number of Ash accelerators.
+constexpr int kAshAcceleratorsTotalNum = 98;
+// The hash of Ash accelerators.
+constexpr char kAshAcceleratorsHash[] = "71c96531d7639ba0ecf255a59546c243";
+// The total number of Chrome accelerators (available on Chrome OS).
+constexpr int kChromeAcceleratorsTotalNum = 91;
+// The hash of Chrome accelerators (available on Chrome OS).
+constexpr char kChromeAcceleratorsHash[] = "cde825b73b85f0ff34a1ff78086e61c8";
+
+const char* BooleanToString(bool value) {
+  return value ? "true" : "false";
+}
+
+std::string ModifiersToString(int modifiers) {
+  return base::StringPrintf("shift=%s control=%s alt=%s search=%s",
+                            BooleanToString(modifiers & ui::EF_SHIFT_DOWN),
+                            BooleanToString(modifiers & ui::EF_CONTROL_DOWN),
+                            BooleanToString(modifiers & ui::EF_ALT_DOWN),
+                            BooleanToString(modifiers & ui::EF_COMMAND_DOWN));
+}
+
+std::string AshAcceleratorDataToString(
+    const ash::AcceleratorData& accelerator) {
+  return base::StringPrintf("trigger_on_press=%s keycode=%d action=%d ",
+                            BooleanToString(accelerator.trigger_on_press),
+                            accelerator.keycode, accelerator.action) +
+         ModifiersToString(accelerator.modifiers);
+}
+
+std::string ChromeAcceleratorMappingToString(
+    const AcceleratorMapping& accelerator) {
+  return base::StringPrintf("keycode=%d command_id=%d ", accelerator.keycode,
+                            accelerator.command_id) +
+         ModifiersToString(accelerator.modifiers);
+}
+
+struct AshAcceleratorDataCmp {
+  bool operator()(const ash::AcceleratorData& lhs,
+                  const ash::AcceleratorData& rhs) {
+    return std::tie(lhs.trigger_on_press, lhs.keycode, lhs.modifiers) <
+           std::tie(rhs.trigger_on_press, rhs.keycode, rhs.modifiers);
+  }
+};
+
+struct ChromeAcceleratorMappingCmp {
+  bool operator()(const AcceleratorMapping& lhs,
+                  const AcceleratorMapping& rhs) {
+    return std::tie(lhs.keycode, lhs.modifiers) <
+           std::tie(rhs.keycode, rhs.modifiers);
+  }
+};
+
+std::string HashAshAcceleratorData(
+    const std::vector<ash::AcceleratorData> accelerators) {
+  base::MD5Context context;
+  base::MD5Init(&context);
+  for (const auto& accelerator : accelerators)
+    base::MD5Update(&context, AshAcceleratorDataToString(accelerator));
+
+  base::MD5Digest digest;
+  base::MD5Final(&digest, &context);
+  return MD5DigestToBase16(digest);
+}
+
+std::string HashChromeAcceleratorMapping(
+    const std::vector<AcceleratorMapping> accelerators) {
+  base::MD5Context context;
+  base::MD5Init(&context);
+  for (const auto& accelerator : accelerators)
+    base::MD5Update(&context, ChromeAcceleratorMappingToString(accelerator));
+
+  base::MD5Digest digest;
+  base::MD5Final(&digest, &context);
+  return MD5DigestToBase16(digest);
+}
+
 std::string AcceleratorIdToString(
     const keyboard_shortcut_viewer::AcceleratorId& accelerator_id) {
-  return base::StringPrintf(
-      "keycode=%d shift=%s control=%s alt=%s search=%s", accelerator_id.keycode,
-      (accelerator_id.modifiers & ui::EF_SHIFT_DOWN) ? "true" : "false",
-      (accelerator_id.modifiers & ui::EF_CONTROL_DOWN) ? "true" : "false",
-      (accelerator_id.modifiers & ui::EF_ALT_DOWN) ? "true" : "false",
-      (accelerator_id.modifiers & ui::EF_COMMAND_DOWN) ? "true" : "false");
+  return base::StringPrintf("keycode=%d ", accelerator_id.keycode) +
+         ModifiersToString(accelerator_id.modifiers);
 }
 
 std::string AcceleratorIdsToString(
@@ -118,3 +192,53 @@
     }
   }
 }
+
+// Test that modifying Ash/Chrome accelerator should update
+// KeyboardShortcutViewerMetadata. (https://crbug.com/826037).
+// 1. If you are adding/deleting/modifying shortcuts, please also
+//    add/delete/modify the corresponding strings and items to the list of
+//    KeyboardShortcutItem.
+// 2. Please update the number and hash value of Ash/Chrome accelerators (these
+//    available on Chrome OS) on the top of this file. The new number and hash
+//    value will be provided in the test output.
+// 3. If there is no corrensponding item in the Keyboard Shortcut Viewer, please
+//    consider adding the shortcut to it or only update 2.
+TEST_F(KeyboardShortcutViewerMetadataTest,
+       ModifyAcceleratorShouldUpdateMetadata) {
+  std::vector<ash::AcceleratorData> ash_accelerators;
+  std::vector<AcceleratorMapping> chrome_accelerators;
+  for (size_t i = 0; i < ash::kAcceleratorDataLength; ++i)
+    ash_accelerators.emplace_back(ash::kAcceleratorData[i]);
+  for (const auto& accel_mapping : GetAcceleratorList())
+    chrome_accelerators.emplace_back(accel_mapping);
+
+  const char kCommonMessage[] =
+      "If you are modifying Chrome OS available shortcuts, please update "
+      "Keyboard Shortcut Viewer shortcuts and the following value(s) on the "
+      "top of this file:\n";
+  const int ash_accelerators_number = ash_accelerators.size();
+  EXPECT_TRUE(ash_accelerators_number == kAshAcceleratorsTotalNum)
+      << kCommonMessage
+      << "kAshAcceleratorsTotalNum=" << ash_accelerators_number << "\n";
+
+  std::stable_sort(ash_accelerators.begin(), ash_accelerators.end(),
+                   AshAcceleratorDataCmp());
+  const std::string ash_accelerators_hash =
+      HashAshAcceleratorData(ash_accelerators);
+  EXPECT_TRUE(ash_accelerators_hash == kAshAcceleratorsHash)
+      << kCommonMessage << "kAshAcceleratorsHash=\"" << ash_accelerators_hash
+      << "\"\n";
+
+  const int chrome_accelerators_number = chrome_accelerators.size();
+  EXPECT_TRUE(chrome_accelerators_number == kChromeAcceleratorsTotalNum)
+      << kCommonMessage
+      << "kChromeAcceleratorsTotalNum=" << chrome_accelerators_number << "\n";
+
+  std::stable_sort(chrome_accelerators.begin(), chrome_accelerators.end(),
+                   ChromeAcceleratorMappingCmp());
+  const std::string chrome_accelerators_hash =
+      HashChromeAcceleratorMapping(chrome_accelerators);
+  EXPECT_TRUE(chrome_accelerators_hash == kChromeAcceleratorsHash)
+      << kCommonMessage << "kChromeAcceleratorsHash=\""
+      << chrome_accelerators_hash << "\"\n";
+}
diff --git a/chrome/browser/ui/cocoa/history_menu_bridge.h b/chrome/browser/ui/cocoa/history_menu_bridge.h
index a7a9669..7fa1ddaa 100644
--- a/chrome/browser/ui/cocoa/history_menu_bridge.h
+++ b/chrome/browser/ui/cocoa/history_menu_bridge.h
@@ -92,10 +92,10 @@
 
     // This ID is unique for a browser session and can be passed to the
     // TabRestoreService to re-open the closed window or tab that this
-    // references. A non-0 session ID indicates that this is an entry can be
+    // references. A valid session ID indicates that this is an entry can be
     // restored that way. Otherwise, the URL will be used to open the item and
-    // this ID will be 0.
-    SessionID::id_type session_id;
+    // this ID will be SessionID::InvalidValue().
+    SessionID session_id;
 
     // If the HistoryItem is a window, this will be the vector of tabs. Note
     // that this is a list of weak references. The |menu_item_map_| is the owner
diff --git a/chrome/browser/ui/cocoa/history_menu_bridge.mm b/chrome/browser/ui/cocoa/history_menu_bridge.mm
index bcf7d750..28ecd695 100644
--- a/chrome/browser/ui/cocoa/history_menu_bridge.mm
+++ b/chrome/browser/ui/cocoa/history_menu_bridge.mm
@@ -46,7 +46,7 @@
     : icon_requested(false),
       icon_task_id(base::CancelableTaskTracker::kBadTaskId),
       menu_item(nil),
-      session_id(0) {}
+      session_id(SessionID::InvalidValue()) {}
 
 HistoryMenuBridge::HistoryItem::HistoryItem(const HistoryItem& copy)
     : title(copy.title),
diff --git a/chrome/browser/ui/cocoa/history_menu_bridge_unittest.mm b/chrome/browser/ui/cocoa/history_menu_bridge_unittest.mm
index 33b482a..90d08a2 100644
--- a/chrome/browser/ui/cocoa/history_menu_bridge_unittest.mm
+++ b/chrome/browser/ui/cocoa/history_menu_bridge_unittest.mm
@@ -111,7 +111,7 @@
                                  const std::string& url,
                                  const std::string& title) {
     auto* tab = new MockTRS::Tab;
-    tab->id = id;
+    tab->id = SessionID::FromSerializedValue(id);
     tab->current_navigation_index = 0;
     tab->navigations.push_back(
         sessions::SerializedNavigationEntryTestHelper::CreateNavigation(url,
@@ -123,7 +123,7 @@
       SessionID::id_type id,
       std::initializer_list<MockTRS::Tab*> tabs) {
     auto* window = new MockTRS::Window;
-    window->id = id;
+    window->id = SessionID::FromSerializedValue(id);
     window->tabs.reserve(tabs.size());
     for (auto* tab : tabs)
       window->tabs.emplace_back(std::move(tab));
@@ -253,13 +253,13 @@
   NSMenuItem* item1 = [menu itemAtIndex:0];
   MockBridge::HistoryItem* hist1 = bridge_->HistoryItemForMenuItem(item1);
   EXPECT_TRUE(hist1);
-  EXPECT_EQ(24, hist1->session_id);
+  EXPECT_EQ(24, hist1->session_id.id());
   EXPECT_NSEQ(@"Google", [item1 title]);
 
   NSMenuItem* item2 = [menu itemAtIndex:1];
   MockBridge::HistoryItem* hist2 = bridge_->HistoryItemForMenuItem(item2);
   EXPECT_TRUE(hist2);
-  EXPECT_EQ(42, hist2->session_id);
+  EXPECT_EQ(42, hist2->session_id.id());
   EXPECT_NSEQ(@"Apple", [item2 title]);
 }
 
@@ -291,13 +291,13 @@
   NSMenuItem* item1 = [menu itemAtIndex:0];
   MockBridge::HistoryItem* hist1 = bridge_->HistoryItemForMenuItem(item1);
   EXPECT_TRUE(hist1);
-  EXPECT_EQ(24, hist1->session_id);
+  EXPECT_EQ(24, hist1->session_id.id());
   EXPECT_NSEQ(@"Google", [item1 title]);
 
   NSMenuItem* item2 = [menu itemAtIndex:1];
   MockBridge::HistoryItem* hist2 = bridge_->HistoryItemForMenuItem(item2);
   EXPECT_TRUE(hist2);
-  EXPECT_EQ(30, hist2->session_id);
+  EXPECT_EQ(30, hist2->session_id.id());
   EXPECT_EQ(2U, hist2->tabs.size());
   // Do not test menu item title because it is localized.
   NSMenu* submenu1 = [item2 submenu];
@@ -306,19 +306,19 @@
   EXPECT_TRUE([[submenu1 itemAtIndex:1] isSeparatorItem]);
   EXPECT_NSEQ(@"foo", [[submenu1 itemAtIndex:2] title]);
   EXPECT_NSEQ(@"bar", [[submenu1 itemAtIndex:3] title]);
-  EXPECT_EQ(31, hist2->tabs[0]->session_id);
-  EXPECT_EQ(32, hist2->tabs[1]->session_id);
+  EXPECT_EQ(31, hist2->tabs[0]->session_id.id());
+  EXPECT_EQ(32, hist2->tabs[1]->session_id.id());
 
   NSMenuItem* item3 = [menu itemAtIndex:2];
   MockBridge::HistoryItem* hist3 = bridge_->HistoryItemForMenuItem(item3);
   EXPECT_TRUE(hist3);
-  EXPECT_EQ(42, hist3->session_id);
+  EXPECT_EQ(42, hist3->session_id.id());
   EXPECT_NSEQ(@"Apple", [item3 title]);
 
   NSMenuItem* item4 = [menu itemAtIndex:3];
   MockBridge::HistoryItem* hist4 = bridge_->HistoryItemForMenuItem(item4);
   EXPECT_TRUE(hist4);
-  EXPECT_EQ(50, hist4->session_id);
+  EXPECT_EQ(50, hist4->session_id.id());
   EXPECT_EQ(3U, hist4->tabs.size());
   // Do not test menu item title because it is localized.
   NSMenu* submenu2 = [item4 submenu];
@@ -328,9 +328,9 @@
   EXPECT_NSEQ(@"magic", [[submenu2 itemAtIndex:2] title]);
   EXPECT_NSEQ(@"goats", [[submenu2 itemAtIndex:3] title]);
   EXPECT_NSEQ(@"teleporter", [[submenu2 itemAtIndex:4] title]);
-  EXPECT_EQ(51, hist4->tabs[0]->session_id);
-  EXPECT_EQ(52, hist4->tabs[1]->session_id);
-  EXPECT_EQ(53, hist4->tabs[2]->session_id);
+  EXPECT_EQ(51, hist4->tabs[0]->session_id.id());
+  EXPECT_EQ(52, hist4->tabs[1]->session_id.id());
+  EXPECT_EQ(53, hist4->tabs[2]->session_id.id());
 }
 
 // Tests that we properly request an icon from the FaviconService.
diff --git a/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm b/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm
index 96fe0ee..10adc480 100644
--- a/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm
+++ b/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm
@@ -45,7 +45,7 @@
   // just load the URL.
   sessions::TabRestoreService* service =
       TabRestoreServiceFactory::GetForProfile(bridge_->profile());
-  if (node->session_id && service) {
+  if (node->session_id.is_valid() && service) {
     Browser* browser = chrome::FindTabbedBrowser(bridge_->profile(), false);
     BrowserLiveTabContext* context =
         browser ? browser->live_tab_context() : NULL;
diff --git a/chrome/browser/ui/cocoa/history_menu_cocoa_controller_unittest.mm b/chrome/browser/ui/cocoa/history_menu_cocoa_controller_unittest.mm
index 690b8c8b6..f285dc37 100644
--- a/chrome/browser/ui/cocoa/history_menu_cocoa_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/history_menu_cocoa_controller_unittest.mm
@@ -17,7 +17,7 @@
 
 @interface FakeHistoryMenuController : HistoryMenuCocoaController {
  @public
-  BOOL opened_[2];
+  BOOL opened_[3];
 }
 @end
 
@@ -25,14 +25,14 @@
 
 - (id)initTest {
   if ((self = [super init])) {
-    opened_[0] = NO;
     opened_[1] = NO;
+    opened_[2] = NO;
   }
   return self;
 }
 
 - (void)openURLForItem:(const HistoryMenuBridge::HistoryItem*)item {
-  opened_[item->session_id] = YES;
+  opened_[item->session_id.id()] = YES;
 }
 
 @end  // FakeHistoryMenuController
@@ -52,12 +52,12 @@
   void CreateItems(NSMenu* menu) {
     HistoryMenuBridge::HistoryItem* item = new HistoryMenuBridge::HistoryItem();
     item->url = GURL("http://google.com");
-    item->session_id = 0;
+    item->session_id = SessionID::FromSerializedValue(1);
     bridge_->AddItemToMenu(item, menu, HistoryMenuBridge::kVisited, 0);
 
     item = new HistoryMenuBridge::HistoryItem();
     item->url = GURL("http://apple.com");
-    item->session_id = 1;
+    item->session_id = SessionID::FromSerializedValue(2);
     bridge_->AddItemToMenu(item, menu, HistoryMenuBridge::kVisited, 1);
   }
 
@@ -84,8 +84,8 @@
 
   for ( ; it != items.end(); ++it) {
     HistoryMenuBridge::HistoryItem* item = it->second;
-    EXPECT_FALSE(controller()->opened_[item->session_id]);
+    EXPECT_FALSE(controller()->opened_[item->session_id.id()]);
     [controller() openHistoryMenuItem:it->first];
-    EXPECT_TRUE(controller()->opened_[item->session_id]);
+    EXPECT_TRUE(controller()->opened_[item->session_id.id()]);
   }
 }
diff --git a/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm b/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm
index 70f9d77..3363f301 100644
--- a/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm
+++ b/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm
@@ -13,7 +13,6 @@
 #include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/cocoa/browser_dialogs_views_mac.h"
-#import "chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.h"
 #import "chrome/browser/ui/cocoa/l10n_util.h"
 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h"
 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
@@ -33,6 +32,10 @@
 #include "ui/gfx/mac/coordinate_conversion.h"
 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
 
+#if !BUILDFLAG(MAC_VIEWS_BROWSER)
+#import "chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.h"
+#endif
+
 using content::WebContents;
 
 namespace {
@@ -312,6 +315,9 @@
         web_contents, origin, this);
     bubbleWindow_.reset([bubble retain]);
   } else {
+#if BUILDFLAG(MAC_VIEWS_BROWSER)
+    NOTREACHED() << "MacViews Browser can't host Cocoa dialogs";
+#else
     ContentSettingBubbleController* bubbleController =
         [ContentSettingBubbleController showForModel:model
                                          webContents:web_contents
@@ -319,6 +325,7 @@
                                           decoration:this
                                           anchoredAt:anchor];
     bubbleWindow_.reset([[bubbleController window] retain]);
+#endif
   }
 
   return true;
diff --git a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm
index d98cc52..93390d2d 100644
--- a/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm
+++ b/chrome/browser/ui/cocoa/tab_dialogs_cocoa.mm
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "chrome/browser/ui/cocoa/browser_dialogs_views_mac.h"
-#import "chrome/browser/ui/cocoa/content_settings/collected_cookies_mac.h"
 #import "chrome/browser/ui/cocoa/hung_renderer_controller.h"
 #import "chrome/browser/ui/cocoa/passwords/passwords_bubble_cocoa.h"
 #import "chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h"
@@ -17,6 +16,10 @@
 #include "ui/base/ui_features.h"
 
 #if !BUILDFLAG(MAC_VIEWS_BROWSER)
+#import "chrome/browser/ui/cocoa/content_settings/collected_cookies_mac.h"
+#endif
+
+#if !BUILDFLAG(MAC_VIEWS_BROWSER)
 // static
 void TabDialogs::CreateForWebContents(content::WebContents* contents) {
   DCHECK(contents);
@@ -51,8 +54,12 @@
 }
 
 void TabDialogsCocoa::ShowCollectedCookies() {
+#if BUILDFLAG(MAC_VIEWS_BROWSER)
+  NOTREACHED() << "MacViewsBrowser builds can't use Cocoa dialogs";
+#else
   // Deletes itself on close.
   new CollectedCookiesMac(web_contents_);
+#endif
 }
 
 void TabDialogsCocoa::ShowHungRendererDialog(
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
index 06a4baf..417cc17 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
@@ -151,16 +151,13 @@
 // the navigation information of a local or other devices' tab required to
 // restore the tab.
 struct RecentTabsSubMenuModel::TabNavigationItem {
-  TabNavigationItem() : tab_id(-1) {}
+  TabNavigationItem() : tab_id(SessionID::InvalidValue()) {}
 
   TabNavigationItem(const std::string& session_tag,
-                    const SessionID::id_type& tab_id,
+                    SessionID tab_id,
                     const base::string16& title,
                     const GURL& url)
-      : session_tag(session_tag),
-        tab_id(tab_id),
-        title(title),
-        url(url) {}
+      : session_tag(session_tag), tab_id(tab_id), title(title), url(url) {}
 
   // For use by std::set for sorting.
   bool operator<(const TabNavigationItem& other) const {
@@ -169,7 +166,7 @@
 
   // Empty for local tabs, non-empty for other devices' tabs.
   std::string session_tag;
-  SessionID::id_type tab_id;  // -1 for invalid, >= 0 otherwise.
+  SessionID tab_id;  // Might be invalid.
   base::string16 title;
   GURL url;
 };
@@ -313,7 +310,7 @@
     TabNavigationItems* tab_items = NULL;
     int tab_items_idx = CommandIdToTabVectorIndex(command_id, &tab_items);
     const TabNavigationItem& item = (*tab_items)[tab_items_idx];
-    DCHECK(item.tab_id > -1 && item.url.is_valid());
+    DCHECK(item.tab_id.is_valid() && item.url.is_valid());
 
     if (item.session_tag.empty()) {  // Restore tab of local session.
       if (service && context) {
@@ -328,9 +325,7 @@
       if (!open_tabs)
         return;
       const sessions::SessionTab* tab;
-      if (!open_tabs->GetForeignTab(item.session_tag,
-                                    SessionID::FromSerializedValue(item.tab_id),
-                                    &tab))
+      if (!open_tabs->GetForeignTab(item.session_tag, item.tab_id, &tab))
         return;
       if (tab->navigations.empty())
         return;
@@ -536,7 +531,7 @@
   DCHECK_GT(GetItemCount(), 0);
 }
 
-void RecentTabsSubMenuModel::BuildLocalTabItem(int session_id,
+void RecentTabsSubMenuModel::BuildLocalTabItem(SessionID session_id,
                                                const base::string16& title,
                                                const GURL& url,
                                                int curr_model_index) {
@@ -551,10 +546,9 @@
   local_tab_navigation_items_.push_back(item);
 }
 
-void RecentTabsSubMenuModel::BuildLocalWindowItem(
-    const SessionID::id_type& window_id,
-    int num_tabs,
-    int curr_model_index) {
+void RecentTabsSubMenuModel::BuildLocalWindowItem(SessionID window_id,
+                                                  int num_tabs,
+                                                  int curr_model_index) {
   int command_id = WindowVectorIndexToCommandId(local_window_items_.size());
   // See comments in BuildLocalEntries() about usage of InsertItem*At().
   InsertItemAt(curr_model_index, command_id, l10n_util::GetPluralStringFUTF16(
@@ -573,8 +567,7 @@
     const sessions::SessionTab& tab) {
   const sessions::SerializedNavigationEntry& current_navigation =
       tab.navigations.at(tab.normalized_navigation_index());
-  TabNavigationItem item(session_tag, tab.tab_id.id(),
-                         current_navigation.title(),
+  TabNavigationItem item(session_tag, tab.tab_id, current_navigation.title(),
                          current_navigation.virtual_url());
   int command_id = TabVectorIndexToCommandId(
       other_devices_tab_navigation_items_.size(),
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h
index 8c2e570..b978b700 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h
@@ -13,6 +13,7 @@
 #include "base/task/cancelable_task_tracker.h"
 #include "base/timer/elapsed_timer.h"
 #include "components/favicon/core/favicon_service.h"
+#include "components/sessions/core/session_id.h"
 #include "components/sessions/core/tab_restore_service.h"
 #include "components/sessions/core/tab_restore_service_observer.h"
 #include "components/sync/driver/sync_service_observer.h"
@@ -87,7 +88,7 @@
   struct TabNavigationItem;
   typedef std::vector<TabNavigationItem> TabNavigationItems;
 
-  typedef std::vector<SessionID::id_type> WindowItems;
+  typedef std::vector<SessionID> WindowItems;
 
   // Build the menu items by populating the menumodel.
   void Build();
@@ -100,14 +101,14 @@
 
   // Build a recently closed tab item with parameters needed to restore it, and
   // add it to the menumodel at |curr_model_index|.
-  void BuildLocalTabItem(int seesion_id,
+  void BuildLocalTabItem(SessionID session_id,
                          const base::string16& title,
                          const GURL& url,
                          int curr_model_index);
 
   // Build the recently closed window item with parameters needed to restore it,
   // and add it to the menumodel at |curr_model_index|.
-  void BuildLocalWindowItem(const SessionID::id_type& window_id,
+  void BuildLocalWindowItem(SessionID window_id,
                             int num_tabs,
                             int curr_model_index);
 
diff --git a/chrome/browser/ui/views/conflicting_module_view_win.cc b/chrome/browser/ui/views/conflicting_module_view_win.cc
index 97f2327e..b63c053 100644
--- a/chrome/browser/ui/views/conflicting_module_view_win.cc
+++ b/chrome/browser/ui/views/conflicting_module_view_win.cc
@@ -20,7 +20,6 @@
 #include "chrome/grit/theme_resources.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/notification_service.h"
-#include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/geometry/insets.h"
@@ -106,10 +105,6 @@
   bubble_shown.SetValue(bubble_shown.GetValue() + 1);
 }
 
-ax::mojom::Role ConflictingModuleView::GetAccessibleWindowRole() const {
-  return ax::mojom::Role::kAlertDialog;
-}
-
 void ConflictingModuleView::OnWidgetClosing(views::Widget* widget) {
   views::BubbleDialogDelegateView::OnWidgetClosing(widget);
   base::RecordAction(
diff --git a/chrome/browser/ui/views/conflicting_module_view_win.h b/chrome/browser/ui/views/conflicting_module_view_win.h
index 06dd735d..b5d4598 100644
--- a/chrome/browser/ui/views/conflicting_module_view_win.h
+++ b/chrome/browser/ui/views/conflicting_module_view_win.h
@@ -32,8 +32,6 @@
   // Shows the bubble and updates the counter for how often it has been shown.
   void ShowBubble();
 
-  // views::BubbleDialogDelegateView:
-  ax::mojom::Role GetAccessibleWindowRole() const override;
   void OnWidgetClosing(views::Widget* widget) override;
   bool Accept() override;
   base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
diff --git a/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc
index bfd0592..29f308c 100644
--- a/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc
@@ -134,7 +134,7 @@
   // to report a valid state.
   ui::AXNodeData node_data;
   bubble->GetWidget()->GetRootView()->GetAccessibleNodeData(&node_data);
-  EXPECT_EQ(ax::mojom::Role::kDialog, node_data.role);
+  EXPECT_EQ(ax::mojom::Role::kAlertDialog, node_data.role);
 }
 
 void ExtensionMessageBubbleViewBrowserTest::ClickActionButton(
diff --git a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
index af197f3..29b2c90 100644
--- a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
+++ b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
@@ -294,7 +294,7 @@
 }  // namespace
 
 struct GlobalMenuBarX11::HistoryItem {
-  HistoryItem() : session_id(0) {}
+  HistoryItem() : session_id(SessionID::InvalidValue()) {}
 
   // The title for the menu item.
   base::string16 title;
@@ -303,10 +303,10 @@
 
   // This ID is unique for a browser session and can be passed to the
   // TabRestoreService to re-open the closed window or tab that this
-  // references. A non-0 session ID indicates that this is an entry can be
+  // references. A valid session ID indicates that this is an entry can be
   // restored that way. Otherwise, the URL will be used to open the item and
-  // this ID will be 0.
-  SessionID::id_type session_id;
+  // this ID will be invalid.
+  SessionID session_id;
 
   // If the HistoryItem is a window, this will be the vector of tabs. Note
   // that this is a list of weak references. The |menu_item_map_| is the owner
@@ -845,7 +845,7 @@
   // just load the URL.
   sessions::TabRestoreService* service =
       TabRestoreServiceFactory::GetForProfile(profile_);
-  if (item->session_id && service) {
+  if (item->session_id.is_valid() && service) {
     service->RestoreEntryById(browser_->live_tab_context(), item->session_id,
                               WindowOpenDisposition::UNKNOWN);
   } else {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
index c16854c..76677eb1 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -116,14 +116,14 @@
           font_list.GetHeight(),
           font_list.DeriveWithWeight(gfx::Font::Weight::BOLD).GetHeight())),
       animation_(new gfx::SlideAnimation(this)),
-      icon_view_(AddOmniboxImageView()),
-      image_view_(AddOmniboxImageView()),
+      suggestion_icon_view_(AddOmniboxImageView()),
+      suggestion_image_view_(AddOmniboxImageView()),
+      suggestion_content_view_(AddOmniboxTextView(font_list)),
+      suggestion_description_view_(AddOmniboxTextView(font_list)),
+      suggestion_separator_view_(AddOmniboxTextView(font_list)),
       keyword_icon_view_(AddOmniboxImageView()),
-      content_view_(AddOmniboxTextView(font_list)),
-      description_view_(AddOmniboxTextView(font_list)),
       keyword_content_view_(AddOmniboxTextView(font_list)),
-      keyword_description_view_(AddOmniboxTextView(font_list)),
-      separator_view_(AddOmniboxTextView(font_list)) {
+      keyword_description_view_(AddOmniboxTextView(font_list)) {
   CHECK_GE(model_index, 0);
 
   keyword_icon_view_->EnableCanvasFlippingForRTLUI(true);
@@ -133,9 +133,9 @@
   keyword_icon_view_->SizeToPreferredSize();
 
   if (OmniboxFieldTrial::InTabSwitchSuggestionWithButtonTrial()) {
-    tab_switch_button_ =
+    suggestion_tab_switch_button_ =
         std::make_unique<OmniboxTabSwitchButton>(this, GetTextHeight());
-    tab_switch_button_->set_owned_by_client();
+    suggestion_tab_switch_button_->set_owned_by_client();
   }
 }
 
@@ -149,16 +149,16 @@
   match_ = match.GetMatchWithContentsAndDescriptionPossiblySwapped();
   animation_->Reset();
   is_hovered_ = false;
-  image_view_->SetVisible(false);  // Until SetAnswerImage is called.
+  suggestion_image_view_->SetVisible(false);  // Until SetAnswerImage is called.
   keyword_icon_view_->SetVisible(match_.associated_keyword.get());
-  if (tab_switch_button_) {
+  if (suggestion_tab_switch_button_) {
     if (match.type == AutocompleteMatchType::TAB_SEARCH &&
         !keyword_icon_view_->visible()) {
-      if (!tab_switch_button_->parent()) {
-        AddChildView(tab_switch_button_.get());
+      if (!suggestion_tab_switch_button_->parent()) {
+        AddChildView(suggestion_tab_switch_button_.get());
       }
-    } else if (tab_switch_button_->parent()) {
-      RemoveChildView(tab_switch_button_.get());
+    } else if (suggestion_tab_switch_button_->parent()) {
+      RemoveChildView(suggestion_tab_switch_button_.get());
     }
   }
 
@@ -189,23 +189,24 @@
   //       SetMatch() once (rather than repeatedly, as happens here). There may
   //       be an optimization opportunity here.
   // TODO(dschuyler): determine whether to optimize the color changes.
-  icon_view_->SetImage(GetIcon().ToImageSkia());
+  suggestion_icon_view_->SetImage(GetIcon().ToImageSkia());
   keyword_icon_view_->SetImage(gfx::CreateVectorIcon(
       omnibox::kKeywordSearchIcon, GetLayoutConstant(LOCATION_BAR_ICON_SIZE),
       GetColor(OmniboxPart::RESULTS_ICON)));
 
   if (match_.answer) {
-    content_view_->SetText(match_.answer->first_line());
-    description_view_->SetText(match_.answer->second_line());
+    suggestion_content_view_->SetText(match_.answer->first_line());
+    suggestion_description_view_->SetText(match_.answer->second_line());
   } else {
-    content_view_->SetText(match_.contents, match_.contents_class);
-    description_view_->SetText(match_.description, match_.description_class);
+    suggestion_content_view_->SetText(match_.contents, match_.contents_class);
+    suggestion_description_view_->SetText(match_.description,
+                                          match_.description_class);
   }
 
   const base::string16& separator =
       l10n_util::GetStringUTF16(IDS_AUTOCOMPLETE_MATCH_DESCRIPTION_SEPARATOR);
-  separator_view_->SetText(separator);
-  separator_view_->Dim();
+  suggestion_separator_view_->SetText(separator);
+  suggestion_separator_view_->Dim();
 
   AutocompleteMatch* keyword_match = match_.associated_keyword.get();
   keyword_content_view_->SetVisible(keyword_match);
@@ -250,8 +251,8 @@
 }
 
 void OmniboxResultView::SetAnswerImage(const gfx::ImageSkia& image) {
-  image_view_->SetImage(image);
-  image_view_->SetVisible(true);
+  suggestion_image_view_->SetImage(image);
+  suggestion_image_view_->SetVisible(true);
   Layout();
   SchedulePaint();
 }
@@ -276,12 +277,14 @@
     if (event.IsOnlyLeftMouseButton()) {
       if (!IsSelected())
         model_->SetSelectedLine(model_index_);
-      if (tab_switch_button_ && tab_switch_button_->parent()) {
+      if (suggestion_tab_switch_button_ &&
+          suggestion_tab_switch_button_->parent()) {
         gfx::Point point_in_child_coords(event.location());
-        View::ConvertPointToTarget(this, tab_switch_button_.get(),
+        View::ConvertPointToTarget(this, suggestion_tab_switch_button_.get(),
                                    &point_in_child_coords);
-        if (tab_switch_button_->HitTestPoint(point_in_child_coords)) {
-          SetMouseHandler(tab_switch_button_.get());
+        if (suggestion_tab_switch_button_->HitTestPoint(
+                point_in_child_coords)) {
+          SetMouseHandler(suggestion_tab_switch_button_.get());
           return false;
         }
       }
@@ -379,15 +382,16 @@
       GetLayoutConstant(LOCATION_BAR_ICON_INTERIOR_PADDING);
   const gfx::Image icon = GetIcon();
   int icon_width = icon.Width();
-  int answer_icon_size = image_view_->visible()
-                             ? image_view_->height() + kAnswerIconToTextPadding
-                             : 0;
+  int answer_icon_size =
+      suggestion_image_view_->visible()
+          ? suggestion_image_view_->height() + kAnswerIconToTextPadding
+          : 0;
   // TODO(dschuyler): The GetIconAlignmentOffset() is applied an extra time to
   // match the math in Layout(). This seems like a (minor) mistake.
   int deduction = (GetIconAlignmentOffset() * 2) + icon_width +
                   (horizontal_padding * 3) + answer_icon_size;
   int description_width = std::max(width() - deduction, 0);
-  return description_view_->GetHeightForWidth(description_width) +
+  return suggestion_description_view_->GetHeightForWidth(description_width) +
          kVerticalPadding;
 }
 
@@ -440,7 +444,7 @@
   int row_height = text_height;
   if (IsTwoLineLayout())
     row_height += match_.answer ? GetAnswerHeight() : GetTextHeight();
-  separator_view_->SetVisible(false);
+  suggestion_separator_view_->SetVisible(false);
 
   // TODO(dschuyler): Refactor these if/else's into separate pieces of code to
   // improve readability/maintainability.
@@ -462,7 +466,8 @@
     int description_width =
         keyword_description_view_->CalculatePreferredSize().width();
     OmniboxPopupModel::ComputeMatchMaxWidths(
-        content_width, separator_view_->width(), description_width, width(),
+        content_width, suggestion_separator_view_->width(), description_width,
+        width(),
         /*description_on_separate_line=*/false,
         !AutocompleteMatch::IsSearchType(match_.type), &content_width,
         &description_width);
@@ -470,10 +475,10 @@
     keyword_content_view_->SetBounds(kw_x, y, content_width, text_height);
     if (description_width != 0) {
       kw_x += keyword_content_view_->width();
-      separator_view_->SetVisible(true);
-      separator_view_->SetBounds(kw_x, y, separator_view_->width(),
-                                 text_height);
-      kw_x += separator_view_->width();
+      suggestion_separator_view_->SetVisible(true);
+      suggestion_separator_view_->SetBounds(
+          kw_x, y, suggestion_separator_view_->width(), text_height);
+      kw_x += suggestion_separator_view_->width();
       keyword_description_view_->SetBounds(kw_x, y, description_width,
                                            text_height);
     } else if (IsTwoLineLayout()) {
@@ -483,17 +488,19 @@
 
   const gfx::Image icon = GetIcon();
   const int icon_y = GetVerticalMargin() + (row_height - icon.Height()) / 2;
-  icon_view_->SetBounds(start_x, icon_y, std::min(end_x, icon.Width()),
-                        icon.Height());
+  suggestion_icon_view_->SetBounds(
+      start_x, icon_y, std::min(end_x, icon.Width()), icon.Height());
 
-  if (tab_switch_button_ && match_.type == AutocompleteMatchType::TAB_SEARCH) {
-    const gfx::Size ts_button_size = tab_switch_button_->GetPreferredSize();
-    tab_switch_button_->SetSize(ts_button_size);
+  if (suggestion_tab_switch_button_ &&
+      match_.type == AutocompleteMatchType::TAB_SEARCH) {
+    const gfx::Size ts_button_size =
+        suggestion_tab_switch_button_->GetPreferredSize();
+    suggestion_tab_switch_button_->SetSize(ts_button_size);
 
     // It looks nice to have the same margin on top, bottom and right side.
     const int margin = (height() - ts_button_size.height()) / 2;
     end_x -= ts_button_size.width() + margin;
-    tab_switch_button_->SetPosition(gfx::Point(end_x, margin));
+    suggestion_tab_switch_button_->SetPosition(gfx::Point(end_x, margin));
   }
 
   // NOTE: While animating the keyword match, both matches may be visible.
@@ -502,69 +509,77 @@
 
   if (base::FeatureList::IsEnabled(omnibox::kOmniboxRichEntitySuggestions) &&
       match_.answer) {
-    icon_view_->SetVisible(false);
-    int image_edge_length = text_height + description_view_->GetLineHeight();
-    image_view_->SetImageSize(gfx::Size(image_edge_length, image_edge_length));
-    image_view_->SetBounds(x, y, image_edge_length, image_edge_length);
+    suggestion_icon_view_->SetVisible(false);
+    int image_edge_length =
+        text_height + suggestion_description_view_->GetLineHeight();
+    suggestion_image_view_->SetImageSize(
+        gfx::Size(image_edge_length, image_edge_length));
+    suggestion_image_view_->SetBounds(x, y, image_edge_length,
+                                      image_edge_length);
     x += image_edge_length + horizontal_padding;
-    content_view_->SetBounds(x, y, end_x - x, text_height);
+    suggestion_content_view_->SetBounds(x, y, end_x - x, text_height);
     y += text_height;
-    description_view_->SetBounds(x, y, end_x - x, text_height);
+    suggestion_description_view_->SetBounds(x, y, end_x - x, text_height);
     return;
   }
 
-  icon_view_->SetVisible(true);
+  suggestion_icon_view_->SetVisible(true);
   x += icon.Width() + horizontal_padding;
   if (match_.answer) {
-    content_view_->SetBounds(x, y, end_x - x, text_height);
+    suggestion_content_view_->SetBounds(x, y, end_x - x, text_height);
     y += text_height;
-    if (image_view_->visible()) {
+    if (suggestion_image_view_->visible()) {
       // The description may be multi-line. Using the view height results in
       // an image that's too large, so we use the line height here instead.
-      int image_edge_length = description_view_->GetLineHeight();
-      image_view_->SetBounds(start_x + icon_view_->width() + horizontal_padding,
-                             y + (kVerticalPadding / 2), image_edge_length,
-                             image_edge_length);
-      image_view_->SetImageSize(
+      int image_edge_length = suggestion_description_view_->GetLineHeight();
+      suggestion_image_view_->SetBounds(
+          start_x + suggestion_icon_view_->width() + horizontal_padding,
+          y + (kVerticalPadding / 2), image_edge_length, image_edge_length);
+      suggestion_image_view_->SetImageSize(
           gfx::Size(image_edge_length, image_edge_length));
-      x += image_view_->width() + kAnswerIconToTextPadding;
+      x += suggestion_image_view_->width() + kAnswerIconToTextPadding;
     }
     int description_width = end_x - x;
-    description_view_->SetBounds(
+    suggestion_description_view_->SetBounds(
         x, y, description_width,
-        description_view_->GetHeightForWidth(description_width) +
+        suggestion_description_view_->GetHeightForWidth(description_width) +
             kVerticalPadding);
   } else if (IsTwoLineLayout()) {
-    if (!!description_view_->GetContentsBounds().width()) {
+    if (!!suggestion_description_view_->GetContentsBounds().width()) {
       // A description is present.
-      content_view_->SetBounds(x, y, end_x - x, GetTextHeight());
+      suggestion_content_view_->SetBounds(x, y, end_x - x, GetTextHeight());
       y += GetTextHeight();
       int description_width = end_x - x;
-      description_view_->SetBounds(
+      suggestion_description_view_->SetBounds(
           x, y, description_width,
-          description_view_->GetHeightForWidth(description_width) +
+          suggestion_description_view_->GetHeightForWidth(description_width) +
               kVerticalPadding);
     } else {
       // For no description, shift down halfway to draw contents in middle.
       y += GetTextHeight() / 2;
-      content_view_->SetBounds(x, y, end_x - x, GetTextHeight());
+      suggestion_content_view_->SetBounds(x, y, end_x - x, GetTextHeight());
     }
   } else {
-    int content_width = content_view_->CalculatePreferredSize().width();
-    int description_width = description_view_->CalculatePreferredSize().width();
+    int content_width =
+        suggestion_content_view_->CalculatePreferredSize().width();
+    int description_width =
+        suggestion_description_view_->CalculatePreferredSize().width();
     OmniboxPopupModel::ComputeMatchMaxWidths(
-        content_width, separator_view_->width(), description_width, end_x - x,
+        content_width, suggestion_separator_view_->width(), description_width,
+        end_x - x,
         /*description_on_separate_line=*/false,
         !AutocompleteMatch::IsSearchType(match_.type), &content_width,
         &description_width);
-    content_view_->SetBounds(x, y, content_width, text_height);
+    suggestion_content_view_->SetBounds(x, y, content_width, text_height);
     x += content_width;
     if (description_width) {
-      separator_view_->SetVisible(true);
-      separator_view_->SetBounds(x, y, separator_view_->width(), text_height);
-      x += separator_view_->width();
+      suggestion_separator_view_->SetVisible(true);
+      suggestion_separator_view_->SetBounds(
+          x, y, suggestion_separator_view_->width(), text_height);
+      x += suggestion_separator_view_->width();
     }
-    description_view_->SetBounds(x, y, description_width, text_height);
+    suggestion_description_view_->SetBounds(x, y, description_width,
+                                            text_height);
   }
 }
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
index 06134d2..3885150 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -126,15 +126,16 @@
   std::unique_ptr<gfx::SlideAnimation> animation_;
 
   // Weak pointers for easy reference.
-  views::ImageView* icon_view_;          // Small icon. e.g. favicon.
-  views::ImageView* image_view_;         // Larger image for rich suggestions.
+  views::ImageView* suggestion_icon_view_;   // Small icon. e.g. favicon.
+  views::ImageView* suggestion_image_view_;  // For rich suggestions.
+  OmniboxTextView* suggestion_content_view_;
+  OmniboxTextView* suggestion_description_view_;
+  OmniboxTextView* suggestion_separator_view_;  // e.g. A hyphen.
+  std::unique_ptr<OmniboxTabSwitchButton> suggestion_tab_switch_button_;
+
   views::ImageView* keyword_icon_view_;  // An icon resembling a '>'.
-  std::unique_ptr<OmniboxTabSwitchButton> tab_switch_button_;
-  OmniboxTextView* content_view_;
-  OmniboxTextView* description_view_;
   OmniboxTextView* keyword_content_view_;
   OmniboxTextView* keyword_description_view_;
-  OmniboxTextView* separator_view_;  // e.g. A hyphen.
 
   DISALLOW_COPY_AND_ASSIGN(OmniboxResultView);
 };
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
index 5526e5b..69862fb 100644
--- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
+++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
@@ -16,8 +16,6 @@
 #if defined(USE_AURA)
 #include "ui/aura/window.h"
 #include "ui/aura/window_targeter.h"
-#include "ui/wm/core/shadow.h"
-#include "ui/wm/core/shadow_controller.h"
 #endif
 
 namespace {
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc
index e005e78..7618a2c 100644
--- a/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc
+++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc
@@ -73,9 +73,7 @@
 
   void CloseBubble();
 
-  // BubbleDialogDelegateView:
-  ax::mojom::Role GetAccessibleWindowRole() const override;
-  base::string16 GetAccessibleWindowTitle() const override;
+  // BubbleDialogDelegateView overrides.
   bool ShouldShowCloseButton() const override;
   base::string16 GetWindowTitle() const override;
   void OnWidgetDestroying(views::Widget* widget) override;
@@ -178,17 +176,6 @@
   GetBubbleFrameView()->SetTitleView(std::move(title));
 }
 
-ax::mojom::Role PermissionsBubbleDialogDelegateView::GetAccessibleWindowRole()
-    const {
-  return ax::mojom::Role::kAlertDialog;
-}
-
-base::string16 PermissionsBubbleDialogDelegateView::GetAccessibleWindowTitle()
-    const {
-  return l10n_util::GetStringFUTF16(IDS_PERMISSIONS_BUBBLE_ACCESSIBLE_TITLE,
-                                    name_or_origin_.name_or_origin);
-}
-
 bool PermissionsBubbleDialogDelegateView::ShouldShowCloseButton() const {
   return true;
 }
diff --git a/chrome/browser/ui/webui/memory_internals_ui.cc b/chrome/browser/ui/webui/memory_internals_ui.cc
index fb970e4..0259dee 100644
--- a/chrome/browser/ui/webui/memory_internals_ui.cc
+++ b/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -77,7 +77,7 @@
           "Memory logging must be manually enabled for each process via "
           "chrome://memory-internals.");
   }
-#elif defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#elif defined(ADDRESS_SANITIZER)
   return "Memory logging is not available in this build because a memory "
          "sanitizer is running.";
 #else
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 200bb88e..4e3c95d 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -1161,7 +1161,12 @@
 }
 
 void PrintPreviewHandler::OnPrintPreviewCancelled() {
-  if (preview_callbacks_.empty() || !IsJavascriptAllowed()) {
+  if (!IsJavascriptAllowed()) {
+    BadMessageReceived();
+    return;
+  }
+
+  if (preview_callbacks_.empty()) {
     BadMessageReceived();
     return;
   }
diff --git a/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc b/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc
new file mode 100644
index 0000000..3891250a
--- /dev/null
+++ b/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc
@@ -0,0 +1,51 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/chromeos/smb_handler.h"
+
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/values.h"
+#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
+#include "chrome/browser/chromeos/smb_client/smb_service.h"
+#include "chrome/browser/profiles/profile.h"
+
+namespace {
+void DoNothingCallback(base::File::Error error) {
+  return;
+}
+}  // namespace
+
+namespace chromeos {
+namespace settings {
+
+SmbHandler::SmbHandler(Profile* profile) : profile_(profile) {}
+
+SmbHandler::~SmbHandler() = default;
+
+void SmbHandler::RegisterMessages() {
+  web_ui()->RegisterMessageCallback(
+      "smbMount",
+      base::BindRepeating(&SmbHandler::HandleSmbMount, base::Unretained(this)));
+}
+
+void SmbHandler::HandleSmbMount(const base::ListValue* args) {
+  CHECK_EQ(1U, args->GetSize());
+  std::string mountUrl;
+  CHECK(args->GetString(0, &mountUrl));
+
+  chromeos::smb_client::SmbService* const service =
+      chromeos::smb_client::SmbService::Get(profile_);
+
+  chromeos::file_system_provider::MountOptions mo;
+  mo.display_name = mountUrl;
+
+  service->Mount(mo, base::FilePath(mountUrl),
+                 base::BindOnce(&DoNothingCallback));
+}
+
+}  // namespace settings
+}  // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/chromeos/smb_handler.h b/chrome/browser/ui/webui/settings/chromeos/smb_handler.h
new file mode 100644
index 0000000..fc7e1463
--- /dev/null
+++ b/chrome/browser/ui/webui/settings/chromeos/smb_handler.h
@@ -0,0 +1,37 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SMB_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SMB_HANDLER_H_
+
+#include "base/macros.h"
+#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
+
+class Profile;
+
+namespace chromeos {
+namespace settings {
+
+class SmbHandler : public ::settings::SettingsPageUIHandler {
+ public:
+  explicit SmbHandler(Profile* profile);
+  ~SmbHandler() override;
+
+  void RegisterMessages() override;
+  void OnJavascriptAllowed() override {}
+  void OnJavascriptDisallowed() override {}
+
+ private:
+  // WebUI call to mount an Smb Filesystem.
+  void HandleSmbMount(const base::ListValue* args);
+
+  Profile* const profile_;
+
+  DISALLOW_COPY_AND_ASSIGN(SmbHandler);
+};
+
+}  // namespace settings
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SMB_HANDLER_H_
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index 17af7ce9..af9f432b 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -776,15 +776,27 @@
 
 void AddDownloadsStrings(content::WebUIDataSource* html_source) {
   LocalizedString localized_strings[] = {
-      {"downloadsPageTitle", IDS_SETTINGS_DOWNLOADS},
-      {"downloadLocation", IDS_SETTINGS_DOWNLOAD_LOCATION},
-      {"changeDownloadLocation", IDS_SETTINGS_CHANGE_DOWNLOAD_LOCATION},
-      {"promptForDownload", IDS_SETTINGS_PROMPT_FOR_DOWNLOAD},
-      {"disconnectGoogleDriveAccount", IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE},
-      {"openFileTypesAutomatically",
-       IDS_SETTINGS_OPEN_FILE_TYPES_AUTOMATICALLY}};
+    {"downloadsPageTitle", IDS_SETTINGS_DOWNLOADS},
+    {"downloadLocation", IDS_SETTINGS_DOWNLOAD_LOCATION},
+    {"changeDownloadLocation", IDS_SETTINGS_CHANGE_DOWNLOAD_LOCATION},
+    {"promptForDownload", IDS_SETTINGS_PROMPT_FOR_DOWNLOAD},
+    {"disconnectGoogleDriveAccount", IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE},
+    {"openFileTypesAutomatically", IDS_SETTINGS_OPEN_FILE_TYPES_AUTOMATICALLY},
+#if defined(OS_CHROMEOS)
+    {"smbSharesTitle", IDS_SETTINGS_DOWNLOADS_SMB_SHARES},
+    {"smbSharesLearnMoreLabel",
+     IDS_SETTINGS_DOWNLOADS_SMB_SHARES_LEARN_MORE_LABEL},
+    {"addSmbShare", IDS_SETTINGS_DOWNLOADS_SMB_SHARES_ADD_SHARE},
+    {"smbShareUrl", IDS_SETTINGS_DOWNLOADS_ADD_SHARE_URL},
+#endif
+  };
   AddLocalizedStringsBulk(html_source, localized_strings,
                           arraysize(localized_strings));
+
+#if defined(OS_CHROMEOS)
+  html_source->AddBoolean("enableNativeSmbSetting",
+                          base::FeatureList::IsEnabled(features::kNativeSmb));
+#endif
 }
 
 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
@@ -1516,6 +1528,8 @@
     {"syncedToName", IDS_SETTINGS_PEOPLE_SYNCED_AS_NAME},
     {"turnOffSync", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF},
     {"syncNotWorking", IDS_SETTINGS_PEOPLE_SYNC_NOT_WORKING},
+    {"syncSignInPrompt", IDS_SETTINGS_SYNC_SIGN_IN_PROMPT},
+    {"syncSignInPromptSecondary", IDS_SETTINGS_SYNC_SIGN_IN_PROMPT_SECONDARY},
 #endif
     {"syncOverview", IDS_SETTINGS_SYNC_OVERVIEW},
     {"syncDisabledByAdministrator",
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc
index 158af7fd..6b0c35d5 100644
--- a/chrome/browser/ui/webui/settings/md_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -85,6 +85,7 @@
 #include "chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h"
 #include "chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h"
 #include "chrome/browser/ui/webui/settings/chromeos/internet_handler.h"
+#include "chrome/browser/ui/webui/settings/chromeos/smb_handler.h"
 #include "chrome/common/chrome_switches.h"
 #include "chromeos/chromeos_switches.h"
 #include "components/arc/arc_util.h"
@@ -186,6 +187,8 @@
   AddSettingsPageUIHandler(
       std::make_unique<chromeos::settings::PointerHandler>());
   AddSettingsPageUIHandler(
+      std::make_unique<chromeos::settings::SmbHandler>(profile));
+  AddSettingsPageUIHandler(
       std::make_unique<chromeos::settings::StorageHandler>());
   AddSettingsPageUIHandler(
       std::make_unique<chromeos::settings::StylusHandler>());
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn
index 4259749..64cf2e8 100644
--- a/chrome/browser/vr/BUILD.gn
+++ b/chrome/browser/vr/BUILD.gn
@@ -101,8 +101,6 @@
     "elements/textured_element.h",
     "elements/throbber.cc",
     "elements/throbber.h",
-    "elements/toast.cc",
-    "elements/toast.h",
     "elements/transient_element.cc",
     "elements/transient_element.h",
     "elements/ui_element.cc",
@@ -152,13 +150,15 @@
     "model/color_scheme.h",
     "model/controller_model.cc",
     "model/controller_model.h",
+    "model/hosted_platform_ui.h",
     "model/modal_prompt_type.cc",
     "model/modal_prompt_type.h",
     "model/model.cc",
     "model/model.h",
-    "model/native_ui_model.h",
     "model/omnibox_suggestions.cc",
     "model/omnibox_suggestions.h",
+    "model/platform_toast.cc",
+    "model/platform_toast.h",
     "model/reticle_model.h",
     "model/speech_recognition_model.h",
     "model/text_input_info.cc",
diff --git a/chrome/browser/vr/browser_ui_interface.h b/chrome/browser/vr/browser_ui_interface.h
index c742d238..decfd09b 100644
--- a/chrome/browser/vr/browser_ui_interface.h
+++ b/chrome/browser/vr/browser_ui_interface.h
@@ -25,7 +25,7 @@
  public:
   virtual ~BrowserUiInterface() {}
 
-  virtual void SetWebVrMode(bool enabled, bool show_toast) = 0;
+  virtual void SetWebVrMode(bool enabled) = 0;
   virtual void SetFullscreen(bool enabled) = 0;
   virtual void SetToolbarState(const ToolbarState& state) = 0;
   virtual void SetIncognito(bool enabled) = 0;
diff --git a/chrome/browser/vr/elements/toast.cc b/chrome/browser/vr/elements/toast.cc
deleted file mode 100644
index 70ee424a..0000000
--- a/chrome/browser/vr/elements/toast.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/vr/elements/toast.h"
-
-#include "chrome/browser/vr/elements/linear_layout.h"
-#include "chrome/browser/vr/elements/rect.h"
-#include "chrome/browser/vr/elements/ui_element.h"
-#include "chrome/browser/vr/elements/ui_element_name.h"
-#include "chrome/browser/vr/elements/ui_element_type.h"
-#include "chrome/browser/vr/elements/vector_icon.h"
-#include "chrome/browser/vr/ui_scene_constants.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace vr {
-
-Toast::Toast() {
-  set_bounds_contain_children(true);
-
-  auto background = std::make_unique<Rect>();
-  background->SetType(kTypeToastBackground);
-  background->set_contributes_to_parent_bounds(false);
-  background_ = background.get();
-
-  auto container = std::make_unique<LinearLayout>(LinearLayout::kRight);
-  container->SetType(kTypeToastContainer);
-  container_ = container.get();
-
-  AddChild(std::move(background));
-  AddChild(std::move(container));
-}
-
-Toast::~Toast() = default;
-
-void Toast::Render(UiElementRenderer* renderer,
-                   const CameraModel& model) const {}
-
-void Toast::AddIcon(const gfx::VectorIcon& icon,
-                    int width_pixels,
-                    float icon_size) {
-  DCHECK(!icon_);
-  auto vector_icon = std::make_unique<VectorIcon>(width_pixels);
-  vector_icon->SetType(kTypeToastIcon);
-  vector_icon->SetDrawPhase(draw_phase());
-  vector_icon->SetIcon(icon);
-  vector_icon->SetSize(icon_size, icon_size);
-  vector_icon->SetVisible(true);
-  vector_icon->set_owner_name_for_test(name());
-  icon_ = vector_icon.get();
-  container_->AddChild(std::move(vector_icon));
-}
-
-void Toast::AddText(const base::string16& text,
-                    float font_height_dmm,
-                    TextLayoutMode text_layout_mode) {
-  DCHECK(!text_);
-  auto text_element = std::make_unique<Text>(font_height_dmm);
-  text_element->SetType(kTypeToastText);
-  text_element->SetDrawPhase(draw_phase());
-  text_element->SetText(text);
-  text_element->SetLayoutMode(text_layout_mode);
-  text_element->set_owner_name_for_test(name());
-  text_element->SetVisible(true);
-  text_ = text_element.get();
-  container_->AddChild(std::move(text_element));
-}
-
-void Toast::SetMargin(float margin) {
-  container_->set_margin(margin);
-}
-
-void Toast::OnSetDrawPhase() {
-  background_->SetDrawPhase(draw_phase());
-  if (icon_)
-    icon_->SetDrawPhase(draw_phase());
-  if (text_)
-    text_->SetDrawPhase(draw_phase());
-}
-
-void Toast::OnSetName() {
-  background_->set_owner_name_for_test(name());
-  container_->set_owner_name_for_test(name());
-  if (icon_)
-    icon_->set_owner_name_for_test(name());
-  if (text_)
-    text_->set_owner_name_for_test(name());
-}
-
-void Toast::OnSetSize(const gfx::SizeF& size) {
-  background_->SetSize(size.width(), size.height());
-}
-
-void Toast::OnSetCornerRadii(const CornerRadii& radii) {
-  background_->SetCornerRadii(radii);
-}
-
-void Toast::SetForegroundColor(SkColor color) {
-  DCHECK(icon_ || text_);
-  if (icon_)
-    icon_->SetColor(color);
-  if (text_)
-    text_->SetColor(color);
-}
-
-void Toast::SetBackgroundColor(SkColor color) {
-  DCHECK(background_);
-  background_->SetColor(color);
-}
-
-void Toast::NotifyClientSizeAnimated(const gfx::SizeF& size,
-                                     int target_property_id,
-                                     cc::KeyframeModel* animation) {
-  if (target_property_id == BOUNDS)
-    background_->SetSize(size.width(), size.height());
-  UiElement::NotifyClientSizeAnimated(size, target_property_id, animation);
-}
-
-}  // namespace vr
diff --git a/chrome/browser/vr/elements/toast.h b/chrome/browser/vr/elements/toast.h
deleted file mode 100644
index 9f2daad3..0000000
--- a/chrome/browser/vr/elements/toast.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_VR_ELEMENTS_TOAST_H_
-#define CHROME_BROWSER_VR_ELEMENTS_TOAST_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chrome/browser/vr/elements/draw_phase.h"
-#include "chrome/browser/vr/elements/text.h"
-#include "chrome/browser/vr/elements/ui_element.h"
-#include "chrome/browser/vr/model/color_scheme.h"
-#include "ui/gfx/vector_icon_types.h"
-
-namespace vr {
-
-class LinearLayout;
-class Rect;
-class VectorIcon;
-
-// Toast may have a vector icon or a text or both as the foreground and rounded
-// rect background.
-class Toast : public UiElement {
- public:
-  Toast();
-  ~Toast() override;
-
-  void Render(UiElementRenderer* renderer,
-              const CameraModel& model) const final;
-
-  void AddIcon(const gfx::VectorIcon& icon, int width_pixels, float icon_size);
-  void AddText(const base::string16& text,
-               float font_height_dmm,
-               TextLayoutMode text_layout_mode);
-  void SetMargin(float margin_in_dmms);
-
-  void SetForegroundColor(SkColor color);
-  void SetBackgroundColor(SkColor color);
-
- private:
-  void OnSetDrawPhase() override;
-  void OnSetName() override;
-  void OnSetSize(const gfx::SizeF& size) override;
-  void OnSetCornerRadii(const CornerRadii& radii) override;
-  void NotifyClientSizeAnimated(const gfx::SizeF& size,
-                                int target_property_id,
-                                cc::KeyframeModel* keyframe_model) override;
-
-  LinearLayout* container_ = nullptr;
-  Rect* background_ = nullptr;
-  VectorIcon* icon_ = nullptr;
-  Text* text_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(Toast);
-};
-
-}  // namespace vr
-
-#endif  // CHROME_BROWSER_VR_ELEMENTS_TOAST_H_
diff --git a/chrome/browser/vr/elements/ui_element.cc b/chrome/browser/vr/elements/ui_element.cc
index 67787b7..293a1d0 100644
--- a/chrome/browser/vr/elements/ui_element.cc
+++ b/chrome/browser/vr/elements/ui_element.cc
@@ -112,6 +112,14 @@
   OnSetType();
 }
 
+UiElement* UiElement::GetDescendantByType(UiElementType type) {
+  for (auto& descendant : *this) {
+    if (descendant.type() == type)
+      return &descendant;
+  }
+  return nullptr;
+}
+
 void UiElement::OnSetType() {}
 
 void UiElement::SetDrawPhase(DrawPhase draw_phase) {
diff --git a/chrome/browser/vr/elements/ui_element.h b/chrome/browser/vr/elements/ui_element.h
index 46639e0..4ee494d 100644
--- a/chrome/browser/vr/elements/ui_element.h
+++ b/chrome/browser/vr/elements/ui_element.h
@@ -131,6 +131,7 @@
   UiElementType type() const { return type_; }
   void SetType(UiElementType type);
   virtual void OnSetType();
+  UiElement* GetDescendantByType(UiElementType type);
 
   DrawPhase draw_phase() const { return draw_phase_; }
   void SetDrawPhase(DrawPhase draw_phase);
diff --git a/chrome/browser/vr/elements/ui_element_name.cc b/chrome/browser/vr/elements/ui_element_name.cc
index f6c51b0..5bded7a 100644
--- a/chrome/browser/vr/elements/ui_element_name.cc
+++ b/chrome/browser/vr/elements/ui_element_name.cc
@@ -113,6 +113,8 @@
     "kExclusiveScreenToastTransientParent",
     "kExclusiveScreenToast",
     "kWebVrExclusiveScreenToast",
+    "kPlatformToastTransientParent",
+    "kPlatformToast",
     "kSplashScreenRoot",
     "kSplashScreenTransientParent",
     "kSplashScreenViewportAwareRoot",
diff --git a/chrome/browser/vr/elements/ui_element_name.h b/chrome/browser/vr/elements/ui_element_name.h
index 3b7196ce..b862f74 100644
--- a/chrome/browser/vr/elements/ui_element_name.h
+++ b/chrome/browser/vr/elements/ui_element_name.h
@@ -112,6 +112,8 @@
   kExclusiveScreenToastTransientParent,
   kExclusiveScreenToast,
   kWebVrExclusiveScreenToast,
+  kPlatformToastTransientParent,
+  kPlatformToast,
   kSplashScreenRoot,
   kSplashScreenTransientParent,
   kSplashScreenViewportAwareRoot,
diff --git a/chrome/browser/vr/model/color_scheme.cc b/chrome/browser/vr/model/color_scheme.cc
index 811439b6..659400c 100644
--- a/chrome/browser/vr/model/color_scheme.cc
+++ b/chrome/browser/vr/model/color_scheme.cc
@@ -64,8 +64,8 @@
   normal_scheme.exit_warning_background = 0xCC1A1A1A;
   normal_scheme.web_vr_transient_toast_foreground = 0xFFF3F3F3;
   normal_scheme.web_vr_transient_toast_background = SK_ColorBLACK;
-  normal_scheme.exclusive_screen_toast_foreground = 0xCCFFFFFF;
-  normal_scheme.exclusive_screen_toast_background = 0xCC2F2F2F;
+  normal_scheme.toast_foreground = 0xCCFFFFFF;
+  normal_scheme.toast_background = 0xCC2F2F2F;
   normal_scheme.modal_prompt_icon_foreground = 0xFF4285F4;
   normal_scheme.modal_prompt_background = 0xFFF5F5F5;
   normal_scheme.modal_prompt_foreground = 0xFF333333;
diff --git a/chrome/browser/vr/model/color_scheme.h b/chrome/browser/vr/model/color_scheme.h
index 84be5f1..58901a1 100644
--- a/chrome/browser/vr/model/color_scheme.h
+++ b/chrome/browser/vr/model/color_scheme.h
@@ -73,8 +73,8 @@
   SkColor exit_warning_background;
   SkColor web_vr_transient_toast_foreground;
   SkColor web_vr_transient_toast_background;
-  SkColor exclusive_screen_toast_foreground;
-  SkColor exclusive_screen_toast_background;
+  SkColor toast_foreground;
+  SkColor toast_background;
   SkColor modal_prompt_icon_foreground;
   SkColor modal_prompt_background;
   SkColor modal_prompt_foreground;
diff --git a/chrome/browser/vr/model/native_ui_model.h b/chrome/browser/vr/model/hosted_platform_ui.h
similarity index 61%
rename from chrome/browser/vr/model/native_ui_model.h
rename to chrome/browser/vr/model/hosted_platform_ui.h
index 0d61afe..dfe1cd4 100644
--- a/chrome/browser/vr/model/native_ui_model.h
+++ b/chrome/browser/vr/model/hosted_platform_ui.h
@@ -2,20 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_VR_MODEL_NATIVE_UI_MODEL_H_
-#define CHROME_BROWSER_VR_MODEL_NATIVE_UI_MODEL_H_
+#ifndef CHROME_BROWSER_VR_MODEL_HOSTED_PLATFORM_UI_H_
+#define CHROME_BROWSER_VR_MODEL_HOSTED_PLATFORM_UI_H_
 
 #include "chrome/browser/vr/content_input_delegate.h"
+#include "ui/gfx/geometry/rect_f.h"
 
 namespace vr {
 typedef ContentInputDelegate* ContentInputDelegatePtr;
-struct NativeUiModel {
+struct HostedPlatformUi {
   bool hosted_ui_enabled = false;
-  float size_ratio = 0;
   ContentInputDelegatePtr delegate = nullptr;
   unsigned int texture_id = 0;
+  bool floating = false;
+  gfx::RectF rect;
 };
 
 }  // namespace vr
 
-#endif  // CHROME_BROWSER_VR_MODEL_NATIVE_UI_MODEL_H_
+#endif  // CHROME_BROWSER_VR_MODEL_HOSTED_PLATFORM_UI_H_
diff --git a/chrome/browser/vr/model/model.cc b/chrome/browser/vr/model/model.cc
index 4462b54..fee14e1 100644
--- a/chrome/browser/vr/model/model.cc
+++ b/chrome/browser/vr/model/model.cc
@@ -122,7 +122,7 @@
 bool Model::reposition_window_permitted() const {
   return !editing_input && !editing_web_input &&
          active_modal_prompt_type == kModalPromptTypeNone &&
-         !native_ui.hosted_ui_enabled;
+         !hosted_platform_ui.hosted_ui_enabled;
 }
 
 }  // namespace vr
diff --git a/chrome/browser/vr/model/model.h b/chrome/browser/vr/model/model.h
index 3ef8961..67959b8 100644
--- a/chrome/browser/vr/model/model.h
+++ b/chrome/browser/vr/model/model.h
@@ -5,12 +5,15 @@
 #ifndef CHROME_BROWSER_VR_MODEL_MODEL_H_
 #define CHROME_BROWSER_VR_MODEL_MODEL_H_
 
+#include <memory>
+
 #include "chrome/browser/vr/model/capturing_state_model.h"
 #include "chrome/browser/vr/model/color_scheme.h"
 #include "chrome/browser/vr/model/controller_model.h"
+#include "chrome/browser/vr/model/hosted_platform_ui.h"
 #include "chrome/browser/vr/model/modal_prompt_type.h"
-#include "chrome/browser/vr/model/native_ui_model.h"
 #include "chrome/browser/vr/model/omnibox_suggestions.h"
+#include "chrome/browser/vr/model/platform_toast.h"
 #include "chrome/browser/vr/model/reticle_model.h"
 #include "chrome/browser/vr/model/speech_recognition_model.h"
 #include "chrome/browser/vr/model/text_input_info.h"
@@ -91,7 +94,9 @@
   bool experimental_features_enabled = false;
   bool skips_redraw_when_not_dirty = false;
   bool exiting_vr = false;
-  NativeUiModel native_ui;
+  HostedPlatformUi hosted_platform_ui;
+
+  std::unique_ptr<const PlatformToast> platform_toast;
 };
 
 }  // namespace vr
diff --git a/chrome/browser/vr/model/platform_toast.cc b/chrome/browser/vr/model/platform_toast.cc
new file mode 100644
index 0000000..abac78f
--- /dev/null
+++ b/chrome/browser/vr/model/platform_toast.cc
@@ -0,0 +1,13 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/vr/model/platform_toast.h"
+
+namespace vr {
+
+PlatformToast::PlatformToast() = default;
+
+PlatformToast::PlatformToast(base::string16 t) : text(t) {}
+
+}  // namespace vr
diff --git a/chrome/browser/vr/model/platform_toast.h b/chrome/browser/vr/model/platform_toast.h
new file mode 100644
index 0000000..e6897d3
--- /dev/null
+++ b/chrome/browser/vr/model/platform_toast.h
@@ -0,0 +1,22 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_VR_MODEL_PLATFORM_TOAST_H_
+#define CHROME_BROWSER_VR_MODEL_PLATFORM_TOAST_H_
+
+#include "base/strings/string16.h"
+
+namespace vr {
+
+// Represent a request to show a text only Toast.
+struct PlatformToast {
+  PlatformToast();
+  explicit PlatformToast(base::string16 text);
+
+  base::string16 text;
+};
+
+}  // namespace vr
+
+#endif  // CHROME_BROWSER_VR_MODEL_PLATFORM_TOAST_H_
diff --git a/chrome/browser/vr/model/web_vr_model.h b/chrome/browser/vr/model/web_vr_model.h
index 954931a..4b189ae6 100644
--- a/chrome/browser/vr/model/web_vr_model.h
+++ b/chrome/browser/vr/model/web_vr_model.h
@@ -31,10 +31,6 @@
 
 struct WebVrModel {
   WebVrState state = kWebVrNoTimeoutPending;
-
-  // TODO(ymalik): We should be able to remove this by keeping a history of UI
-  // modes.
-  bool show_exit_toast = false;
   bool has_received_permissions = false;
   bool showing_hosted_ui = false;
   bool presenting_web_vr() const {
diff --git a/chrome/browser/vr/test/mock_browser_ui_interface.h b/chrome/browser/vr/test/mock_browser_ui_interface.h
index a43b7176..45593fc 100644
--- a/chrome/browser/vr/test/mock_browser_ui_interface.h
+++ b/chrome/browser/vr/test/mock_browser_ui_interface.h
@@ -19,7 +19,7 @@
   MockBrowserUiInterface();
   ~MockBrowserUiInterface() override;
 
-  MOCK_METHOD2(SetWebVrMode, void(bool enabled, bool show_toast));
+  MOCK_METHOD1(SetWebVrMode, void(bool enabled));
   MOCK_METHOD1(SetFullscreen, void(bool enabled));
   MOCK_METHOD1(SetToolbarState, void(const ToolbarState& state));
   MOCK_METHOD1(SetIncognito, void(bool enabled));
diff --git a/chrome/browser/vr/testapp/gl_renderer.cc b/chrome/browser/vr/testapp/gl_renderer.cc
index b9b1076..87df75c6 100644
--- a/chrome/browser/vr/testapp/gl_renderer.cc
+++ b/chrome/browser/vr/testapp/gl_renderer.cc
@@ -49,6 +49,10 @@
 
 void GlRenderer::RenderFrame() {
   context_->MakeCurrent(surface_.get());
+
+  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+  glClear(GL_COLOR_BUFFER_BIT);
+
   vr_->DrawFrame();
   PostRenderFrameTask(
       surface_->SwapBuffers(base::BindRepeating(&OnPresentedFrame)));
diff --git a/chrome/browser/vr/testapp/vr_test_context.cc b/chrome/browser/vr/testapp/vr_test_context.cc
index eef5e40..b1a9021 100644
--- a/chrome/browser/vr/testapp/vr_test_context.cc
+++ b/chrome/browser/vr/testapp/vr_test_context.cc
@@ -132,11 +132,11 @@
   // Update the render position of all UI elements (including desktop).
   ui_->scene()->OnBeginFrame(current_time, head_pose_);
   ui_->OnProjMatrixChanged(render_info.left_eye_model.proj_matrix);
-  ui_->ui_renderer()->Draw(render_info);
 
-  // This is required in order to show the WebVR toasts.
-  if (model_->web_vr.presenting_web_vr()) {
+  if (web_vr_mode_ && ui_->ShouldRenderWebVr() && webvr_frames_received_) {
     ui_->ui_renderer()->DrawWebVrOverlayForeground(render_info);
+  } else {
+    ui_->ui_renderer()->Draw(render_info);
   }
 
   auto load_progress = (current_time - page_load_start_).InMilliseconds() /
@@ -164,6 +164,13 @@
         fullscreen_ = !fullscreen_;
         ui_->SetFullscreen(fullscreen_);
         break;
+      case ui::DomCode::US_A:
+        if (model_->platform_toast) {
+          ui_->CancelPlatformToast();
+        } else {
+          ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading"));
+        }
+        break;
       case ui::DomCode::US_H:
         handedness_ = handedness_ == PlatformController::kRightHanded
                           ? PlatformController::kLeftHanded
@@ -191,9 +198,15 @@
       case ui::DomCode::US_S:
         ToggleSplashScreen();
         break;
-      case ui::DomCode::US_R:
+      case ui::DomCode::US_R: {
+        webvr_frames_received_ = true;
+        CapturingStateModel capturing_state;
+        capturing_state.bluetooth_connected = true;
+        capturing_state.location_access_enabled = true;
+        ui_->SetCapturingState(capturing_state);
         ui_->OnWebVrFrameAvailable();
         break;
+      }
       case ui::DomCode::US_E:
         model_->experimental_features_enabled =
             !model_->experimental_features_enabled;
@@ -403,11 +416,9 @@
 void VrTestContext::CycleWebVrModes() {
   switch (model_->web_vr.state) {
     case kWebVrNoTimeoutPending: {
-      ui_->SetWebVrMode(true, false);
-      CapturingStateModel capturing_state;
-      capturing_state.bluetooth_connected = true;
-      capturing_state.location_access_enabled = true;
-      ui_->SetCapturingState(capturing_state);
+      web_vr_mode_ = true;
+      webvr_frames_received_ = false;
+      ui_->SetWebVrMode(true);
       break;
     }
     case kWebVrAwaitingMinSplashScreenDuration:
@@ -419,7 +430,12 @@
       ui_->OnWebVrTimedOut();
       break;
     case kWebVrTimedOut:
-      ui_->SetWebVrMode(false, false);
+      ui_->SetWebVrMode(false);
+      web_vr_mode_ = false;
+      break;
+    case kWebVrPresenting:
+      ui_->SetWebVrMode(false);
+      web_vr_mode_ = false;
       break;
     default:
       break;
@@ -428,6 +444,8 @@
 
 void VrTestContext::ToggleSplashScreen() {
   if (!show_web_vr_splash_screen_) {
+    web_vr_mode_ = true;
+    webvr_frames_received_ = false;
     UiInitialState state;
     state.in_web_vr = true;
     state.web_vr_autopresentation_expected = true;
@@ -463,10 +481,14 @@
     ui_->OnSpeechRecognitionStateChanged(SPEECH_RECOGNITION_RECOGNIZING);
 }
 
-void VrTestContext::ExitPresent() {}
+void VrTestContext::ExitPresent() {
+  web_vr_mode_ = false;
+  ui_->SetWebVrMode(false);
+}
+
 void VrTestContext::ExitFullscreen() {
   fullscreen_ = false;
-  ui_->SetFullscreen(fullscreen_);
+  ui_->SetFullscreen(false);
 }
 
 void VrTestContext::Navigate(GURL gurl, NavigationMethod method) {
diff --git a/chrome/browser/vr/testapp/vr_test_context.h b/chrome/browser/vr/testapp/vr_test_context.h
index 16b83608..94ad4cb 100644
--- a/chrome/browser/vr/testapp/vr_test_context.h
+++ b/chrome/browser/vr/testapp/vr_test_context.h
@@ -93,6 +93,8 @@
   // This avoids storing a duplicate of the model state here.
   Model* model_;
 
+  bool web_vr_mode_ = false;
+  bool webvr_frames_received_ = false;
   bool fullscreen_ = false;
   bool incognito_ = false;
   bool show_web_vr_splash_screen_ = false;
diff --git a/chrome/browser/vr/ui.cc b/chrome/browser/vr/ui.cc
index 17107fa..4dc7a73f 100644
--- a/chrome/browser/vr/ui.cc
+++ b/chrome/browser/vr/ui.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/vr/model/assets.h"
 #include "chrome/browser/vr/model/model.h"
 #include "chrome/browser/vr/model/omnibox_suggestions.h"
+#include "chrome/browser/vr/model/platform_toast.h"
 #include "chrome/browser/vr/model/sound_id.h"
 #include "chrome/browser/vr/speech_recognizer.h"
 #include "chrome/browser/vr/ui_browser_interface.h"
@@ -74,8 +75,7 @@
   return weak_ptr_factory_.GetWeakPtr();
 }
 
-void Ui::SetWebVrMode(bool enabled, bool show_toast) {
-  model_->web_vr.show_exit_toast = show_toast;
+void Ui::SetWebVrMode(bool enabled) {
   if (enabled) {
     model_->web_vr.has_received_permissions = false;
     if (!model_->web_vr_autopresentation_enabled()) {
@@ -222,18 +222,35 @@
 
 void Ui::SetAlertDialogEnabled(bool enabled,
                                ContentInputDelegate* delegate,
-                               int width,
-                               int height) {
+                               float width,
+                               float height) {
   model_->web_vr.showing_hosted_ui = enabled;
-  model_->native_ui.hosted_ui_enabled = enabled;
-  model_->native_ui.size_ratio =
-      static_cast<float>(height) / static_cast<float>(width);
-  model_->native_ui.delegate = delegate;
+  model_->hosted_platform_ui.hosted_ui_enabled = enabled;
+  model_->hosted_platform_ui.rect.set_height(height);
+  model_->hosted_platform_ui.rect.set_width(width);
+  model_->hosted_platform_ui.delegate = delegate;
 }
 
-void Ui::SetAlertDialogSize(int width, int height) {
-  model_->native_ui.size_ratio =
-      static_cast<float>(height) / static_cast<float>(width);
+void Ui::SetAlertDialogSize(float width, float height) {
+  model_->hosted_platform_ui.rect.set_height(height);
+  model_->hosted_platform_ui.rect.set_width(width);
+}
+
+void Ui::SetDialogLocation(float x, float y) {
+  model_->hosted_platform_ui.rect.set_y(y);
+  model_->hosted_platform_ui.rect.set_x(x);
+}
+
+void Ui::SetDialogFloating() {
+  model_->hosted_platform_ui.floating = true;
+}
+
+void Ui::ShowPlatformToast(const base::string16& text) {
+  model_->platform_toast = std::make_unique<PlatformToast>(text);
+}
+
+void Ui::CancelPlatformToast() {
+  model_->platform_toast.reset();
 }
 
 bool Ui::ShouldRenderWebVr() {
@@ -260,7 +277,7 @@
   model_->content_overlay_texture_id = content_overlay_texture_id;
   model_->content_location = content_location;
   model_->content_overlay_location = content_overlay_location;
-  model_->native_ui.texture_id = ui_texture_id;
+  model_->hosted_platform_ui.texture_id = ui_texture_id;
 }
 
 void Ui::RequestFocus(int element_id) {
@@ -299,7 +316,7 @@
     return;
   }
 
-  if (model_->native_ui.hosted_ui_enabled) {
+  if (model_->hosted_platform_ui.hosted_ui_enabled) {
     browser_->CloseHostedDialog();
     return;
   }
diff --git a/chrome/browser/vr/ui.h b/chrome/browser/vr/ui.h
index 0cd14f7b..ead70d8 100644
--- a/chrome/browser/vr/ui.h
+++ b/chrome/browser/vr/ui.h
@@ -77,7 +77,7 @@
   base::WeakPtr<BrowserUiInterface> GetBrowserUiWeakPtr();
 
   // BrowserUiInterface
-  void SetWebVrMode(bool enabled, bool show_toast) override;
+  void SetWebVrMode(bool enabled) override;
   void SetFullscreen(bool enabled) override;
   void SetToolbarState(const ToolbarState& state) override;
   void SetIncognito(bool enabled) override;
@@ -113,9 +113,13 @@
 
   void SetAlertDialogEnabled(bool enabled,
                              ContentInputDelegate* delegate,
-                             int width,
-                             int height);
-  void SetAlertDialogSize(int width, int height);
+                             float width,
+                             float height);
+  void SetAlertDialogSize(float width, float height);
+  void SetDialogLocation(float x, float y);
+  void SetDialogFloating();
+  void ShowPlatformToast(const base::string16& text);
+  void CancelPlatformToast();
   bool ShouldRenderWebVr();
 
   void OnGlInitialized(
diff --git a/chrome/browser/vr/ui_scene_constants.h b/chrome/browser/vr/ui_scene_constants.h
index 4b33dd77..309212500 100644
--- a/chrome/browser/vr/ui_scene_constants.h
+++ b/chrome/browser/vr/ui_scene_constants.h
@@ -95,10 +95,10 @@
 
 static constexpr float kWebVrToastDistance = 1.0f;
 static constexpr float kFullScreenToastOffsetDMM = 0.1f;
-static constexpr float kExclusiveScreenToastXPaddingDMM = 0.017f;
-static constexpr float kExclusiveScreenToastYPaddingDMM = 0.02f;
-static constexpr float kExclusiveScreenToastCornerRadiusDMM = 0.004f;
-static constexpr float kExclusiveScreenToastTextFontHeightDMM = 0.023f;
+static constexpr float kToastXPaddingDMM = 0.017f;
+static constexpr float kToastYPaddingDMM = 0.02f;
+static constexpr float kToastCornerRadiusDMM = 0.004f;
+static constexpr float kToastTextFontHeightDMM = 0.023f;
 // When changing the value here, make sure it doesn't collide with
 // kWarningAngleRadians.
 static constexpr float kWebVrAngleRadians = gfx::DegToRad(9.88f);
@@ -172,10 +172,10 @@
 static constexpr float kTimeoutButtonTextHeightDMM = 0.024f;
 static constexpr float kTimeoutButtonTextVerticalOffsetDMM = 0.024f;
 
-static constexpr float kHostedUiHeightDMM = 0.576f;
-static constexpr float kHostedUiWidthDMM = 0.384f;
-static constexpr float kHostedUiVerticalOffsetDMM = -0.1f;
+static constexpr float kHostedUiHeightRatio = 0.6f;
+static constexpr float kHostedUiWidthRatio = 0.6f;
 static constexpr float kHostedUiDepthOffset = 0.3f;
+static constexpr float kFloatingHostedUiDistance = 0.01f;
 
 static constexpr float kScreenDimmerOpacity = 0.9f;
 
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc
index 2d87f84..077c8a37 100644
--- a/chrome/browser/vr/ui_scene_creator.cc
+++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -45,7 +45,6 @@
 #include "chrome/browser/vr/elements/text.h"
 #include "chrome/browser/vr/elements/text_input.h"
 #include "chrome/browser/vr/elements/throbber.h"
-#include "chrome/browser/vr/elements/toast.h"
 #include "chrome/browser/vr/elements/transient_element.h"
 #include "chrome/browser/vr/elements/ui_element.h"
 #include "chrome/browser/vr/elements/ui_element_name.h"
@@ -56,6 +55,7 @@
 #include "chrome/browser/vr/elements/webvr_url_toast.h"
 #include "chrome/browser/vr/keyboard_delegate.h"
 #include "chrome/browser/vr/model/model.h"
+#include "chrome/browser/vr/model/platform_toast.h"
 #include "chrome/browser/vr/speech_recognizer.h"
 #include "chrome/browser/vr/target_property.h"
 #include "chrome/browser/vr/ui.h"
@@ -677,21 +677,24 @@
     float distance) {
   auto hosted_ui = Create<ContentElement>(
       kNone, kPhaseForeground, content_input_delegate, base::DoNothing());
-  hosted_ui->SetSize(kHostedUiWidthDMM, kHostedUiHeightDMM);
+  hosted_ui->SetSize(kContentWidth * kHostedUiWidthRatio,
+                     kContentHeight * kHostedUiHeightRatio);
   hosted_ui->SetVisible(false);
+  hosted_ui->set_opacity_when_visible(1.0);
   hosted_ui->set_requires_layout(false);
   hosted_ui->set_corner_radius(kContentCornerRadius);
   hosted_ui->SetTransitionedProperties({OPACITY});
   hosted_ui->SetTranslate(0, 0, kHostedUiDepthOffset);
-  hosted_ui->AddBinding(VR_BIND_FUNC(ContentInputDelegatePtr, Model, model,
-                                     model->native_ui.delegate, ContentElement,
-                                     hosted_ui.get(), SetDelegate));
-  hosted_ui->AddBinding(
-      VR_BIND_FUNC(unsigned int, Model, model, model->native_ui.texture_id,
-                   ContentElement, hosted_ui.get(), SetTextureId));
+  hosted_ui->AddBinding(VR_BIND_FUNC(
+      ContentInputDelegatePtr, Model, model, model->hosted_platform_ui.delegate,
+      ContentElement, hosted_ui.get(), SetDelegate));
+  hosted_ui->AddBinding(VR_BIND_FUNC(
+      unsigned int, Model, model, model->hosted_platform_ui.texture_id,
+      ContentElement, hosted_ui.get(), SetTextureId));
   hosted_ui->AddBinding(std::make_unique<Binding<bool>>(
-      VR_BIND_LAMBDA([](Model* m) { return m->native_ui.hosted_ui_enabled; },
-                     base::Unretained(model)),
+      VR_BIND_LAMBDA(
+          [](Model* m) { return m->hosted_platform_ui.hosted_ui_enabled; },
+          base::Unretained(model)),
       VR_BIND_LAMBDA(
           [](ContentElement* dialog, const bool& enabled) {
             dialog->SetVisible(enabled);
@@ -699,39 +702,75 @@
             dialog->set_hit_testable(enabled);
           },
           base::Unretained(hosted_ui.get()))));
-  hosted_ui->AddBinding(std::make_unique<Binding<float>>(
-      base::BindRepeating([](Model* m) { return m->native_ui.size_ratio; },
-                          base::Unretained(model)),
+  hosted_ui->AddBinding(std::make_unique<Binding<std::pair<bool, gfx::PointF>>>(
       base::BindRepeating(
-          [](ContentElement* dialog, const float& value) {
-            dialog->SetSize(kHostedUiWidthDMM, kHostedUiWidthDMM * value);
+          [](Model* m) {
+            return std::pair<bool, gfx::PointF>(
+                m->hosted_platform_ui.floating,
+                gfx::PointF(m->hosted_platform_ui.rect.x(),
+                            m->hosted_platform_ui.rect.y()));
+          },
+          base::Unretained(model)),
+      base::BindRepeating(
+          [](ContentElement* dialog,
+             const std::pair<bool, gfx::PointF>& value) {
+            if (value.first) {
+              dialog->set_x_centering(LEFT);
+              dialog->set_y_centering(TOP);
+              dialog->SetTranslate((value.second.x() - 0.5) * kContentWidth,
+                                   (0.5 - value.second.y()) * kContentHeight,
+                                   kFloatingHostedUiDistance);
+            } else {
+              dialog->set_x_centering(NONE);
+              dialog->set_y_centering(NONE);
+              dialog->SetTranslate(0, 0, kHostedUiDepthOffset);
+            }
           },
           base::Unretained(hosted_ui.get()))));
 
-  auto backplane = Create<InvisibleHitTarget>(kNone, kPhaseForeground);
+  hosted_ui->AddBinding(std::make_unique<Binding<std::pair<bool, gfx::SizeF>>>(
+      base::BindRepeating(
+          [](Model* m) {
+            return std::pair<bool, gfx::SizeF>(
+                m->hosted_platform_ui.floating,
+                gfx::SizeF(m->hosted_platform_ui.rect.width(),
+                           m->hosted_platform_ui.rect.height()));
+          },
+          base::Unretained(model)),
+      base::BindRepeating(
+          [](ContentElement* dialog, const std::pair<bool, gfx::SizeF>& value) {
+            if (!value.first && value.second.width() > 0) {
+              float ratio = static_cast<float>(value.second.height()) /
+                            value.second.width();
+              dialog->SetSize(kContentWidth * kHostedUiWidthRatio,
+                              kContentWidth * kHostedUiWidthRatio * ratio);
+            } else if (value.first) {
+              dialog->SetSize(kContentWidth * value.second.width(),
+                              kContentWidth * value.second.height());
+            }
+          },
+          base::Unretained(hosted_ui.get()))));
+
+  auto backplane = Create<InvisibleHitTarget>(name, kPhaseForeground);
   backplane->SetType(kTypeHostedUiBackplane);
   backplane->SetSize(kSceneSize, kSceneSize);
-  backplane->SetTranslate(0.0, kHostedUiVerticalOffsetDMM, 0.0);
+  backplane->SetTranslate(0.0, kContentVerticalOffset, -kContentDistance);
   backplane->set_contributes_to_parent_bounds(false);
   EventHandlers event_handlers;
   event_handlers.button_up = base::BindRepeating(
       [](Model* model, UiBrowserInterface* browser) {
-        if (model->native_ui.hosted_ui_enabled) {
+        if (model->hosted_platform_ui.hosted_ui_enabled) {
           browser->CloseHostedDialog();
         }
       },
       base::Unretained(model), base::Unretained(browser));
   backplane->set_event_handlers(event_handlers);
   backplane->AddChild(std::move(hosted_ui));
+  backplane->AddBinding(VR_BIND_FUNC(
+      bool, Model, model, model->hosted_platform_ui.hosted_ui_enabled,
+      InvisibleHitTarget, backplane.get(), SetVisible));
 
-  auto scaler = Create<ScaledDepthAdjuster>(name, kPhaseNone, distance);
-  scaler->SetType(kTypeScaledDepthAdjuster);
-  scaler->AddChild(std::move(backplane));
-  scaler->set_contributes_to_parent_bounds(false);
-  scaler->AddBinding(VR_BIND_FUNC(bool, Model, model,
-                                  model->native_ui.hosted_ui_enabled, UiElement,
-                                  scaler.get(), SetVisible));
-  return scaler;
+  return backplane;
 }
 
 std::unique_ptr<Grid> CreateGrid(Model* model, UiElementName name) {
@@ -752,6 +791,44 @@
   e->set_requires_layout(v);
 }
 
+std::unique_ptr<TransientElement> CreateTextToast(
+    UiElementName transient_parent_name,
+    UiElementName toast_name,
+    Model* model,
+    const base::string16& text) {
+  auto parent =
+      CreateTransientParent(transient_parent_name, kToastTimeoutSeconds, false);
+  parent->set_bounds_contain_children(true);
+  parent->SetScale(kContentDistance, kContentDistance, 1.0f);
+
+  auto background_element = Create<Rect>(toast_name, kPhaseForeground);
+  VR_BIND_COLOR(model, background_element.get(), &ColorScheme::toast_background,
+                &Rect::SetColor);
+
+  background_element->set_bounds_contain_children(true);
+  background_element->set_padding(kToastXPaddingDMM, kToastYPaddingDMM,
+                                  kToastXPaddingDMM, kToastYPaddingDMM);
+  background_element->SetTransitionedProperties({OPACITY});
+  background_element->SetType(kTypeToastBackground);
+  background_element->set_corner_radius(kToastCornerRadiusDMM);
+
+  auto text_element =
+      Create<Text>(kNone, kPhaseForeground, kToastTextFontHeightDMM);
+  text_element->SetLayoutMode(kSingleLine);
+  text_element->SetColor(SK_ColorWHITE);
+  text_element->set_owner_name_for_test(toast_name);
+  text_element->SetSize(0.0f, kToastTextFontHeightDMM);
+  text_element->SetType(kTypeToastText);
+  text_element->SetText(text);
+
+  VR_BIND_COLOR(model, text_element.get(), &ColorScheme::toast_foreground,
+                &Text::SetColor);
+
+  background_element->AddChild(std::move(text_element));
+  parent->AddChild(std::move(background_element));
+  return parent;
+}
+
 }  // namespace
 
 UiSceneCreator::UiSceneCreator(UiBrowserInterface* browser,
@@ -789,7 +866,7 @@
   }
   CreateOmnibox();
   CreateCloseButton();
-  CreateFullscreenToast();
+  CreateToasts();
   CreateVoiceSearchUiGroup();
   CreateContentRepositioningAffordance();
   CreateExitWarning();
@@ -885,9 +962,10 @@
                               kPhaseNone);
   element->set_bounds_contain_children(true);
   element->SetTransitionedProperties({OPACITY});
-  element->AddBinding(VR_BIND(
-      bool, Model, model_, !model->native_ui.hosted_ui_enabled, UiElement,
-      element.get(), view->SetOpacity(value ? 1.0 : kModalPromptFadeOpacity)));
+  element->AddBinding(
+      VR_BIND(bool, Model, model_, !model->hosted_platform_ui.hosted_ui_enabled,
+              UiElement, element.get(),
+              view->SetOpacity(value ? 1.0 : kModalPromptFadeOpacity)));
   scene_->AddUiElement(k2dBrowsingOpacityControlForUpdateKeyboardPrompt,
                        std::move(element));
 
@@ -1724,7 +1802,7 @@
   root->SetName(kControllerRoot);
   VR_BIND_VISIBILITY(root, model->browsing_enabled() ||
                                model->web_vr.state == kWebVrTimedOut ||
-                               model->native_ui.hosted_ui_enabled);
+                               model->hosted_platform_ui.hosted_ui_enabled);
   scene_->AddUiElement(kRoot, std::move(root));
 
   auto group = std::make_unique<UiElement>();
@@ -2785,7 +2863,8 @@
             e->RefreshVisible();
             SetVisibleInLayout(
                 scene->GetUiElementByName(kWebVrExclusiveScreenToast),
-                model->web_vr.show_exit_toast && !value.second);
+                !model->web_vr_autopresentation_enabled() &&
+                    !model->browsing_disabled && !value.second);
             SetVisibleInLayout(scene->GetUiElementByName(kWebVrUrlToast),
                                model->web_vr_autopresentation_enabled() &&
                                    model->toolbar_state.should_display_url);
@@ -2849,35 +2928,50 @@
   scene_->AddUiElement(kWebVrViewportAwareRoot, std::move(parent));
 }
 
-void UiSceneCreator::CreateFullscreenToast() {
-  auto parent = CreateTransientParent(kExclusiveScreenToastTransientParent,
-                                      kToastTimeoutSeconds, false);
-  parent->set_contributes_to_parent_bounds(false);
-  parent->set_y_anchoring(TOP);
-  parent->SetScale(kContentDistance, kContentDistance, 1.0f);
-  parent->SetTranslate(0, kIndicatorVerticalOffset, kIndicatorDistanceOffset);
-  VR_BIND_VISIBILITY(parent, model->fullscreen_enabled());
-  scene_->AddUiElement(k2dBrowsingContentGroup, std::move(parent));
+void UiSceneCreator::CreateToasts() {
+  auto layout = Create<LinearLayout>(kNone, kPhaseNone, LinearLayout::kLeft);
+  layout->set_contributes_to_parent_bounds(false);
+  layout->set_y_anchoring(TOP);
+  layout->SetTranslate(0, kIndicatorVerticalOffset, kIndicatorDistanceOffset);
+  layout->set_margin(kWebVrPermissionMargin);
 
-  auto element = std::make_unique<Toast>();
-  element->SetName(kExclusiveScreenToast);
-  element->SetDrawPhase(kPhaseForeground);
-  element->set_padding(kExclusiveScreenToastXPaddingDMM,
-                       kExclusiveScreenToastYPaddingDMM);
-  element->set_corner_radius(kExclusiveScreenToastCornerRadiusDMM);
-  element->AddText(l10n_util::GetStringUTF16(IDS_PRESS_APP_TO_EXIT_FULLSCREEN),
-                   kExclusiveScreenToastTextFontHeightDMM,
-                   TextLayoutMode::kSingleLine);
+  auto fullscreen_toast = CreateTextToast(
+      kExclusiveScreenToastTransientParent, kExclusiveScreenToast, model_,
+      l10n_util::GetStringUTF16(IDS_PRESS_APP_TO_EXIT_FULLSCREEN));
+  fullscreen_toast->AddBinding(
+      VR_BIND(bool, Model, model_, model->fullscreen_enabled(), UiElement,
+              fullscreen_toast.get(), SetVisibleInLayout(view, value)));
+  layout->AddChild(std::move(fullscreen_toast));
 
-  VR_BIND_COLOR(model_, element.get(),
-                &ColorScheme::exclusive_screen_toast_background,
-                &Toast::SetBackgroundColor);
-  VR_BIND_COLOR(model_, element.get(),
-                &ColorScheme::exclusive_screen_toast_foreground,
-                &Toast::SetForegroundColor);
+  auto platform_toast = CreateTextToast(
+      kPlatformToastTransientParent, kPlatformToast, model_, base::string16());
+  platform_toast->AddBinding(std::make_unique<Binding<const PlatformToast*>>(
+      VR_BIND_LAMBDA([](Model* m) { return m->platform_toast.get(); },
+                     base::Unretained(model_)),
+      VR_BIND_LAMBDA(
+          [](TransientElement* t, const PlatformToast* const& value) {
+            SetVisibleInLayout(t, value);
+            if (value) {
+              t->RefreshVisible();
+            }
+          },
+          base::Unretained(platform_toast.get()))));
+  Text* text_element =
+      static_cast<Text*>(platform_toast->GetDescendantByType(kTypeToastText));
+  DCHECK(text_element);
+  text_element->AddBinding(std::make_unique<Binding<const PlatformToast*>>(
+      VR_BIND_LAMBDA([](Model* m) { return m->platform_toast.get(); },
+                     base::Unretained(model_)),
+      VR_BIND_LAMBDA(
+          [](Text* t, const PlatformToast* const& value) {
+            if (value) {
+              t->SetText(value->text);
+            }
+          },
+          base::Unretained(text_element))));
+  layout->AddChild(std::move(platform_toast));
 
-  scene_->AddUiElement(kExclusiveScreenToastTransientParent,
-                       std::move(element));
+  scene_->AddUiElement(k2dBrowsingContentGroup, std::move(layout));
 }
 
 }  // namespace vr
diff --git a/chrome/browser/vr/ui_scene_creator.h b/chrome/browser/vr/ui_scene_creator.h
index 30a5b63..64a894d3 100644
--- a/chrome/browser/vr/ui_scene_creator.h
+++ b/chrome/browser/vr/ui_scene_creator.h
@@ -49,7 +49,7 @@
   void CreateCloseButton();
   void CreateExitPrompt();
   void CreatePrompts();
-  void CreateFullscreenToast();
+  void CreateToasts();
   void CreateVoiceSearchUiGroup();
   void CreateContentRepositioningAffordance();
   void CreateExitWarning();
diff --git a/chrome/browser/vr/ui_unittest.cc b/chrome/browser/vr/ui_unittest.cc
index e33ea0921..427751a 100644
--- a/chrome/browser/vr/ui_unittest.cc
+++ b/chrome/browser/vr/ui_unittest.cc
@@ -133,13 +133,13 @@
   EXPECT_TRUE(IsVisible(kExclusiveScreenToast));
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
 
-  ui_->SetWebVrMode(true, true);
+  ui_->SetWebVrMode(true);
   ui_->OnWebVrFrameAvailable();
   ui_->SetCapturingState(CapturingStateModel());
   EXPECT_FALSE(IsVisible(kExclusiveScreenToast));
   EXPECT_TRUE(IsVisible(kWebVrExclusiveScreenToast));
 
-  ui_->SetWebVrMode(false, false);
+  ui_->SetWebVrMode(false);
   // TODO(crbug.com/787582): we should not show the fullscreen toast again when
   // returning to fullscreen mode after presenting webvr.
   EXPECT_TRUE(IsVisible(kExclusiveScreenToast));
@@ -149,11 +149,11 @@
   EXPECT_FALSE(IsVisible(kExclusiveScreenToast));
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
 
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   EXPECT_FALSE(IsVisible(kExclusiveScreenToast));
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
 
-  ui_->SetWebVrMode(false, false);
+  ui_->SetWebVrMode(false);
   EXPECT_FALSE(IsVisible(kExclusiveScreenToast));
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
 }
@@ -168,7 +168,7 @@
                                                    kSmallDelaySeconds)));
   EXPECT_FALSE(IsVisible(kExclusiveScreenToast));
 
-  ui_->SetWebVrMode(true, true);
+  ui_->SetWebVrMode(true);
   ui_->OnWebVrFrameAvailable();
   ui_->SetCapturingState(CapturingStateModel());
   EXPECT_TRUE(IsVisible(kWebVrExclusiveScreenToast));
@@ -176,17 +176,46 @@
                                                    kSmallDelaySeconds)));
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
 
-  ui_->SetWebVrMode(false, false);
+  ui_->SetWebVrMode(false);
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
 }
 
+TEST_F(UiTest, PlatformToast) {
+  CreateScene(kNotInCct, kNotInWebVr);
+  EXPECT_FALSE(IsVisible(kPlatformToast));
+
+  // show and hide toast after a timeout.
+  ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading"));
+  EXPECT_TRUE(IsVisible(kPlatformToast));
+  EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds +
+                                                   kSmallDelaySeconds)));
+  EXPECT_FALSE(IsVisible(kPlatformToast));
+
+  // toast can be cancelled.
+  ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading"));
+  EXPECT_TRUE(IsVisible(kPlatformToast));
+  ui_->CancelPlatformToast();
+  EXPECT_FALSE(IsVisible(kPlatformToast));
+
+  // toast can refresh visible timeout.
+  ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading"));
+  EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kSmallDelaySeconds)));
+  ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading"));
+  EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds -
+                                                   kSmallDelaySeconds)));
+  EXPECT_TRUE(IsVisible(kPlatformToast));
+  EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds +
+                                                   kSmallDelaySeconds)));
+  EXPECT_FALSE(IsVisible(kPlatformToast));
+}
+
 TEST_F(UiTest, CaptureToasts) {
   CreateScene(kNotInCct, kNotInWebVr);
   EXPECT_FALSE(IsVisible(kExclusiveScreenToast));
 
   for (auto& spec : GetIndicatorSpecs()) {
     for (int i = 0; i < 3; ++i) {
-      ui_->SetWebVrMode(true, true);
+      ui_->SetWebVrMode(true);
       ui_->OnWebVrFrameAvailable();
 
       CapturingStateModel state;
@@ -203,7 +232,7 @@
                                                        kSmallDelaySeconds)));
       EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
 
-      ui_->SetWebVrMode(false, false);
+      ui_->SetWebVrMode(false);
       EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
       EXPECT_FALSE(IsVisible(spec.webvr_name));
     }
@@ -228,7 +257,7 @@
   // Button should not be visible when in WebVR.
   CreateScene(kInCct, kInWebVr);
   EXPECT_FALSE(IsVisible(kCloseButton));
-  ui_->SetWebVrMode(false, false);
+  ui_->SetWebVrMode(false);
   EXPECT_TRUE(IsVisible(kCloseButton));
 
   // Button should be visible in Cct across transistions in fullscreen.
@@ -333,13 +362,13 @@
   EXPECT_EQ(model_->ui_modes.back(), kModeBrowsing);
   VerifyOnlyElementsVisible("Initial", kElementsVisibleInBrowsing);
 
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   EXPECT_EQ(model_->ui_modes.size(), 2u);
   EXPECT_EQ(model_->ui_modes[1], kModeWebVr);
   EXPECT_EQ(model_->ui_modes[0], kModeBrowsing);
   VerifyOnlyElementsVisible("WebVR", {kWebVrBackground});
 
-  ui_->SetWebVrMode(false, false);
+  ui_->SetWebVrMode(false);
   EXPECT_EQ(model_->ui_modes.size(), 1u);
   EXPECT_EQ(model_->ui_modes.back(), kModeBrowsing);
   VerifyOnlyElementsVisible("Browsing after WebVR", kElementsVisibleInBrowsing);
@@ -435,7 +464,7 @@
   VerifyOnlyElementsVisible("Initial", {kSplashScreenText, kWebVrBackground});
 
   // Enter WebVR with autopresentation.
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   ui_->SetCapturingState(CapturingStateModel());
 
   // The splash screen should go away.
@@ -457,7 +486,7 @@
   // Initially, we should only show the splash screen.
   VerifyOnlyElementsVisible("Initial", {kSplashScreenText, kWebVrBackground});
 
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   EXPECT_TRUE(RunFor(MsToDelta(
       1000 * (kSplashScreenMinDurationSeconds + kSmallDelaySeconds * 2))));
 
@@ -706,7 +735,7 @@
   ui_->OnWebVrFrameAvailable();
   VerifyOnlyElementsVisible("Elements hidden", std::set<UiElementName>{});
   // Disable WebVR mode.
-  ui_->SetWebVrMode(false, false);
+  ui_->SetWebVrMode(false);
 
   // New frame available after exiting WebVR mode.
   ui_->OnWebVrFrameAvailable();
@@ -722,7 +751,7 @@
   model_->capturing_state.bluetooth_connected = true;
 
   // Transition to WebVR mode
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   ui_->OnWebVrFrameAvailable();
 
   // All elements should be hidden.
@@ -749,9 +778,9 @@
   EXPECT_TRUE(VerifyRequiresLayout(indicators, true));
 
   // Go into non-browser modes and make sure all indicators are hidden.
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   EXPECT_TRUE(VerifyVisibility(indicators, false));
-  ui_->SetWebVrMode(false, false);
+  ui_->SetWebVrMode(false);
   ui_->SetFullscreen(true);
   EXPECT_TRUE(VerifyVisibility(indicators, false));
   ui_->SetFullscreen(false);
@@ -848,7 +877,7 @@
 TEST_F(UiTest, WebVrTimeout) {
   CreateScene(kNotInCct, kInWebVr);
 
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   model_->web_vr.state = kWebVrAwaitingFirstFrame;
 
   RunFor(MsToDelta(500));
@@ -1105,7 +1134,7 @@
 
 TEST_F(UiTest, ExitPresentAndFullscreenOnAppButtonClick) {
   CreateScene(kNotInCct, kNotInWebVr);
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   // Clicking app button should trigger to exit presentation.
   EXPECT_CALL(*browser_, ExitPresent());
   // And also trigger exit fullscreen.
@@ -1125,7 +1154,7 @@
   EXPECT_FALSE(IsVisible(kWebVrUrlToast));
 
   // Enter WebVR with autopresentation.
-  ui_->SetWebVrMode(true, false);
+  ui_->SetWebVrMode(true);
   ui_->SetCapturingState(CapturingStateModel());
   OnBeginFrame(MsToDelta(1000 * kSplashScreenMinDurationSeconds));
   EXPECT_TRUE(IsVisible(kSplashScreenText));
@@ -1314,10 +1343,10 @@
   OnBeginFrame();
   EXPECT_TRUE(hit_plane->hit_testable());
 
-  model_->native_ui.hosted_ui_enabled = true;
+  model_->hosted_platform_ui.hosted_ui_enabled = true;
   OnBeginFrame();
   EXPECT_FALSE(hit_plane->hit_testable());
-  model_->native_ui.hosted_ui_enabled = false;
+  model_->hosted_platform_ui.hosted_ui_enabled = false;
   OnBeginFrame();
   EXPECT_TRUE(hit_plane->hit_testable());
 
@@ -1358,7 +1387,7 @@
 // these cases requires knowledge of the previous state.
 TEST_F(UiTest, LongPressAppButtonInWebVrMode) {
   CreateScene(kNotInCct, kInWebVr);
-  ui_->SetWebVrMode(true, true);
+  ui_->SetWebVrMode(true);
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
   ui_->OnWebVrFrameAvailable();
   ui_->SetCapturingState(CapturingStateModel());
diff --git a/chrome/child/BUILD.gn b/chrome/child/BUILD.gn
index 01571f0..669d80c 100644
--- a/chrome/child/BUILD.gn
+++ b/chrome/child/BUILD.gn
@@ -4,8 +4,6 @@
 
 static_library("child") {
   sources = [
-    "child_profiling.cc",
-    "child_profiling.h",
     "pdf_child_init.cc",
     "pdf_child_init.h",
     "v8_breakpad_support_win.cc",
diff --git a/chrome/child/child_profiling.cc b/chrome/child/child_profiling.cc
deleted file mode 100644
index 8cd6795..0000000
--- a/chrome/child/child_profiling.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/child/child_profiling.h"
-
-#include "base/debug/profiler.h"
-#include "base/logging.h"
-#include "chrome/common/chrome_features.h"
-#include "gin/public/debug.h"
-#include "v8/include/v8.h"
-
-namespace {
-
-base::debug::AddDynamicSymbol add_dynamic_symbol_func = NULL;
-base::debug::MoveDynamicSymbol move_dynamic_symbol_func = NULL;
-
-void JitCodeEventHandler(const v8::JitCodeEvent* event) {
-  DCHECK_NE(static_cast<base::debug::AddDynamicSymbol>(NULL),
-            add_dynamic_symbol_func);
-  DCHECK_NE(static_cast<base::debug::MoveDynamicSymbol>(NULL),
-            move_dynamic_symbol_func);
-
-  switch (event->type) {
-    case v8::JitCodeEvent::CODE_ADDED:
-      add_dynamic_symbol_func(event->code_start, event->code_len,
-                              event->name.str, event->name.len);
-      break;
-
-    case v8::JitCodeEvent::CODE_MOVED:
-      move_dynamic_symbol_func(event->code_start, event->new_code_start);
-      break;
-
-    default:
-      break;
-  }
-}
-
-}  // namespace
-
-// static
-void ChildProfiling::ProcessStarted() {
-  // Establish the V8 profiling hooks if we're an instrumented binary.
-  if (base::debug::IsBinaryInstrumented()) {
-    base::debug::ReturnAddressLocationResolver resolve_func =
-        base::debug::GetProfilerReturnAddrResolutionFunc();
-
-    if (resolve_func != NULL) {
-      v8::V8::SetReturnAddressLocationResolver(resolve_func);
-    }
-
-    // Set up the JIT code entry handler and the symbol callbacks if the
-    // profiler supplies them.
-    // TODO(siggi): Maybe add a switch or an environment variable to turn off
-    //     V8 profiling?
-    base::debug::DynamicFunctionEntryHook entry_hook_func =
-        base::debug::GetProfilerDynamicFunctionEntryHookFunc();
-    add_dynamic_symbol_func = base::debug::GetProfilerAddDynamicSymbolFunc();
-    move_dynamic_symbol_func = base::debug::GetProfilerMoveDynamicSymbolFunc();
-
-    if (entry_hook_func != NULL &&
-        add_dynamic_symbol_func != NULL &&
-        move_dynamic_symbol_func != NULL) {
-      gin::Debug::SetFunctionEntryHook(entry_hook_func);
-      gin::Debug::SetJitCodeEventHandler(&JitCodeEventHandler);
-    }
-  }
-}
diff --git a/chrome/child/child_profiling.h b/chrome/child/child_profiling.h
deleted file mode 100644
index a53c4cb0..0000000
--- a/chrome/child/child_profiling.h
+++ /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.
-
-#ifndef CHROME_CHILD_CHILD_PROFILING_H_
-#define CHROME_CHILD_CHILD_PROFILING_H_
-
-#include "base/macros.h"
-
-// This class is the child-process-only (i.e. non-browser) portion of
-// chrome/common/profiling.h.
-class ChildProfiling {
- public:
-  // Called early in a process' life to allow profiling of startup time.
-  static void ProcessStarted();
-
- private:
-  ChildProfiling();
-  DISALLOW_COPY_AND_ASSIGN(ChildProfiling);
-};
-
-#endif  // CHROME_CHILD_CHILD_PROFILING_H_
diff --git a/chrome/common/channel_info_win.cc b/chrome/common/channel_info_win.cc
index a15dec0..61470614 100644
--- a/chrome/common/channel_info_win.cc
+++ b/chrome/common/channel_info_win.cc
@@ -14,9 +14,10 @@
 std::string GetChannelName() {
 #if defined(GOOGLE_CHROME_BUILD)
   base::string16 channel(install_static::GetChromeChannelName());
-#if defined(SYZYASAN)
-  if (base::debug::IsBinaryInstrumented())
-    channel += L" SyzyASan";
+#if defined(DCHECK_IS_CONFIGURABLE)
+  // Adorn the channel when DCHECKs are baked into the build, as there will be
+  // a performance hit. See https://crbug.com/812058 for details.
+  channel += " DCheck";
 #endif
   return base::UTF16ToASCII(channel);
 #else
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 0ba33fc..ebceee1 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -514,7 +514,7 @@
 
 #if defined(OS_ANDROID)
 const base::Feature kShowTrustedPublisherURL{"ShowTrustedPublisherURL",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+                                             base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 // Alternative to switches::kSitePerProcess, for turning on full site isolation.
@@ -562,14 +562,6 @@
                                   base::FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
-#if defined(SYZYASAN)
-// Enable the deferred free mechanism in the syzyasan module, which helps the
-// performance by deferring some work on the critical path to a background
-// thread.
-const base::Feature kSyzyasanDeferredFree{"SyzyasanDeferredFree",
-                                          base::FEATURE_ENABLED_BY_DEFAULT};
-#endif
-
 // Enable TopSites to source and sort its site data using site engagement.
 const base::Feature kTopSitesFromSiteEngagement{
     "TopSitesFromSiteEngagement", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index bba233c..f58d057 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -304,10 +304,6 @@
 extern const base::Feature kSysInternals;
 #endif
 
-#if defined(SYZYASAN)
-extern const base::Feature kSyzyasanDeferredFree;
-#endif
-
 #if !defined(OS_ANDROID)
 extern const base::Feature kTabMetricsLogging;
 #endif
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn
index 27bb1d4..c365088 100644
--- a/chrome/installer/mini_installer/BUILD.gn
+++ b/chrome/installer/mini_installer/BUILD.gn
@@ -293,14 +293,6 @@
   chrome_dll_target = "//chrome:main_dll"
 }
 
-if (is_syzyasan) {
-  generate_mini_installer("mini_installer_syzygy") {
-    out_dir = "$root_out_dir/syzygy/"
-    chrome_dll_file = "$root_out_dir/syzygy/chrome.dll"
-    chrome_dll_target = "//chrome/tools/build/win/syzygy:chrome_dll_syzygy"
-  }
-}
-
 # next_version_mini_installer.exe can't be generated in an x86 Debug component
 # build because it requires too much memory.
 # TODO(thakis): Enable this in cross builds, https://crbug.com/799827
diff --git a/chrome/installer/mini_installer/chrome.release b/chrome/installer/mini_installer/chrome.release
index 4a502c6..29da5235 100644
--- a/chrome/installer/mini_installer/chrome.release
+++ b/chrome/installer/mini_installer/chrome.release
@@ -35,7 +35,6 @@
 natives_blob.bin: %(VersionDir)s\
 notification_helper.exe: %(VersionDir)s\
 resources.pak: %(VersionDir)s\
-syzyasan_rtl.dll: %(VersionDir)s\
 v8_context_snapshot.bin: %(VersionDir)s\
 #
 # Sub directories living in the version dir
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 5c705c5ac..15218945 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -550,8 +550,7 @@
   SandboxStatusExtension::Create(render_frame);
 #endif
 
-  new NetErrorHelper(render_frame,
-                     chrome_observer_ ? chrome_observer_->is_online() : true);
+  new NetErrorHelper(render_frame);
 
   new page_load_metrics::MetricsRenderFrameObserver(render_frame);
 
diff --git a/chrome/renderer/chrome_render_thread_observer.cc b/chrome/renderer/chrome_render_thread_observer.cc
index d81dc01..71295829 100644
--- a/chrome/renderer/chrome_render_thread_observer.cc
+++ b/chrome/renderer/chrome_render_thread_observer.cc
@@ -187,10 +187,6 @@
       chrome::mojom::RendererConfiguration::Name_);
 }
 
-void ChromeRenderThreadObserver::NetworkStateChanged(bool online) {
-  online_ = online;
-}
-
 void ChromeRenderThreadObserver::SetInitialConfiguration(
     bool is_incognito_process) {
   is_incognito_process_ = is_incognito_process;
diff --git a/chrome/renderer/chrome_render_thread_observer.h b/chrome/renderer/chrome_render_thread_observer.h
index 75f45a0..2d401850 100644
--- a/chrome/renderer/chrome_render_thread_observer.h
+++ b/chrome/renderer/chrome_render_thread_observer.h
@@ -44,15 +44,12 @@
     return visited_link_slave_.get();
   }
 
-  bool is_online() { return online_; }
-
  private:
   // content::RenderThreadObserver:
   void RegisterMojoInterfaces(
       blink::AssociatedInterfaceRegistry* associated_interfaces) override;
   void UnregisterMojoInterfaces(
       blink::AssociatedInterfaceRegistry* associated_interfaces) override;
-  void NetworkStateChanged(bool online) override;
 
   // chrome::mojom::RendererConfiguration:
   void SetInitialConfiguration(bool is_incognito_process) override;
@@ -64,9 +61,6 @@
   void OnRendererConfigurationAssociatedRequest(
       chrome::mojom::RendererConfigurationAssociatedRequest request);
 
-  // Is the browser online? The a priori assumption.
-  bool online_ = true;
-
   static bool is_incognito_process_;
   std::unique_ptr<content::ResourceDispatcherDelegate> resource_delegate_;
   RendererContentSettingRules content_setting_rules_;
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index 5bfbbd0..a1c9015 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -119,7 +119,7 @@
 
 }  // namespace
 
-NetErrorHelper::NetErrorHelper(RenderFrame* render_frame, bool online)
+NetErrorHelper::NetErrorHelper(RenderFrame* render_frame)
     : RenderFrameObserver(render_frame),
       content::RenderFrameObserverTracker<NetErrorHelper>(render_frame),
       weak_controller_delegate_factory_(this),
@@ -133,9 +133,10 @@
       command_line->HasSwitch(switches::kEnableOfflineAutoReloadVisibleOnly);
   // TODO(mmenke): Consider only creating a NetErrorHelperCore for main frames.
   // subframes don't need any of the NetErrorHelperCore's extra logic.
-  core_.reset(new NetErrorHelperCore(this, auto_reload_enabled,
+  core_.reset(new NetErrorHelperCore(this,
+                                     auto_reload_enabled,
                                      auto_reload_visible_only,
-                                     !render_frame->IsHidden(), online));
+                                     !render_frame->IsHidden()));
 
   render_frame->GetAssociatedInterfaceRegistry()->AddInterface(
       base::Bind(&NetErrorHelper::OnNetworkDiagnosticsClientRequest,
diff --git a/chrome/renderer/net/net_error_helper.h b/chrome/renderer/net/net_error_helper.h
index e97ba0a..d848a30 100644
--- a/chrome/renderer/net/net_error_helper.h
+++ b/chrome/renderer/net/net_error_helper.h
@@ -59,7 +59,7 @@
       public chrome::mojom::NetworkDiagnosticsClient,
       public chrome::mojom::NavigationCorrector {
  public:
-  NetErrorHelper(content::RenderFrame* render_frame, bool online);
+  explicit NetErrorHelper(content::RenderFrame* render_frame);
   ~NetErrorHelper() override;
 
   // NetErrorPageController::Delegate implementation
diff --git a/chrome/renderer/net/net_error_helper_core.cc b/chrome/renderer/net/net_error_helper_core.cc
index d36b4505..6cdea7e0 100644
--- a/chrome/renderer/net/net_error_helper_core.cc
+++ b/chrome/renderer/net/net_error_helper_core.cc
@@ -501,8 +501,7 @@
 NetErrorHelperCore::NetErrorHelperCore(Delegate* delegate,
                                        bool auto_reload_enabled,
                                        bool auto_reload_visible_only,
-                                       bool is_visible,
-                                       bool online)
+                                       bool is_visible)
     : delegate_(delegate),
       last_probe_status_(error_page::DNS_PROBE_POSSIBLE),
       can_show_network_diagnostics_dialog_(false),
@@ -512,7 +511,8 @@
       auto_reload_paused_(false),
       auto_reload_in_flight_(false),
       uncommitted_load_started_(false),
-      online_(online),
+      // TODO(ellyjones): Make online_ accurate at object creation.
+      online_(true),
       visible_(is_visible),
       auto_reload_count_(0),
       navigation_from_button_(NO_BUTTON) {}
diff --git a/chrome/renderer/net/net_error_helper_core.h b/chrome/renderer/net/net_error_helper_core.h
index c9ca49cb..d0d4e73 100644
--- a/chrome/renderer/net/net_error_helper_core.h
+++ b/chrome/renderer/net/net_error_helper_core.h
@@ -132,8 +132,7 @@
   NetErrorHelperCore(Delegate* delegate,
                      bool auto_reload_enabled,
                      bool auto_reload_visible_only,
-                     bool is_visible,
-                     bool online);
+                     bool is_visible);
   ~NetErrorHelperCore();
 
   // Sets values in |pending_error_page_info_|. If |error_html| is not null, it
diff --git a/chrome/renderer/net/net_error_helper_core_unittest.cc b/chrome/renderer/net/net_error_helper_core_unittest.cc
index 88802c4..fb67444 100644
--- a/chrome/renderer/net/net_error_helper_core_unittest.cc
+++ b/chrome/renderer/net/net_error_helper_core_unittest.cc
@@ -178,8 +178,8 @@
     // The old value of timer_, if any, will be freed by the old core_ being
     // destructed, since core_ takes ownership of the timer.
     timer_ = new base::MockTimer(false, false);
-    core_.reset(new NetErrorHelperCore(
-        this, auto_reload_enabled, auto_reload_visible_only, visible, true));
+    core_.reset(new NetErrorHelperCore(this, auto_reload_enabled,
+                                       auto_reload_visible_only, visible));
     core_->set_timer_for_testing(std::unique_ptr<base::Timer>(timer_));
   }
 
diff --git a/chrome/renderer/page_load_metrics/fake_page_timing_sender.cc b/chrome/renderer/page_load_metrics/fake_page_timing_sender.cc
index 0045b45..1977d9b5 100644
--- a/chrome/renderer/page_load_metrics/fake_page_timing_sender.cc
+++ b/chrome/renderer/page_load_metrics/fake_page_timing_sender.cc
@@ -50,6 +50,11 @@
   expected_features_.insert(feature);
 }
 
+void FakePageTimingSender::PageTimingValidator::
+    UpdateExpectPageLoadCssProperties(int css_property_id) {
+  expected_css_properties_.insert(css_property_id);
+}
+
 void FakePageTimingSender::PageTimingValidator::VerifyExpectedFeatures() const {
   ASSERT_EQ(actual_features_.size(), expected_features_.size());
   std::vector<blink::mojom::WebFeature> diff;
@@ -66,6 +71,25 @@
       << "More features are actually observed than expected";
 }
 
+void FakePageTimingSender::PageTimingValidator::VerifyExpectedCssProperties()
+    const {
+  ASSERT_EQ(actual_css_properties_.size(), expected_css_properties_.size());
+  std::vector<int> diff;
+  std::set_difference(actual_css_properties_.begin(),
+                      actual_css_properties_.end(),
+                      expected_css_properties_.begin(),
+                      expected_css_properties_.end(), diff.begin());
+  EXPECT_TRUE(diff.empty())
+      << "Expected more CSS properties than the actual features observed";
+
+  std::set_difference(expected_css_properties_.begin(),
+                      expected_css_properties_.end(),
+                      actual_css_properties_.begin(),
+                      actual_css_properties_.end(), diff.begin());
+  EXPECT_TRUE(diff.empty())
+      << "More CSS Properties are actually observed than expected";
+}
+
 void FakePageTimingSender::PageTimingValidator::UpdateTiming(
     const mojom::PageLoadTimingPtr& timing,
     const mojom::PageLoadMetadataPtr& metadata,
@@ -76,8 +100,16 @@
         << "Feature " << feature << "has been sent more than once";
     actual_features_.insert(feature);
   }
+  for (const auto css_property_id : new_features->css_properties) {
+    EXPECT_EQ(actual_css_properties_.find(css_property_id),
+              actual_css_properties_.end())
+        << "CSS Property ID " << css_property_id
+        << "has been sent more than once";
+    actual_css_properties_.insert(css_property_id);
+  }
   VerifyExpectedTimings();
   VerifyExpectedFeatures();
+  VerifyExpectedCssProperties();
 }
 
 }  // namespace page_load_metrics
diff --git a/chrome/renderer/page_load_metrics/fake_page_timing_sender.h b/chrome/renderer/page_load_metrics/fake_page_timing_sender.h
index 4234a91..117ca34 100644
--- a/chrome/renderer/page_load_metrics/fake_page_timing_sender.h
+++ b/chrome/renderer/page_load_metrics/fake_page_timing_sender.h
@@ -50,10 +50,16 @@
     // PageLoad features that are expected to be sent through SendTiming()
     // should be passed via UpdateExpectedPageLoadFeatures.
     void UpdateExpectPageLoadFeatures(const blink::mojom::WebFeature feature);
+    // PageLoad CSS properties that are expected to be sent through SendTiming()
+    // should be passed via UpdateExpectedPageLoadCSSProperties.
+    void UpdateExpectPageLoadCssProperties(int css_property_id);
 
     // Forces verification that actual features sent through SendTiming match
     // expected features provided via ExpectPageLoadFeatures.
     void VerifyExpectedFeatures() const;
+    // Forces verification that actual CSS properties sent through SendTiming
+    // match expected CSS properties provided via ExpectPageLoadCSSProperties.
+    void VerifyExpectedCssProperties() const;
 
     const std::vector<mojom::PageLoadTimingPtr>& expected_timings() const {
       return expected_timings_;
@@ -71,6 +77,8 @@
     std::vector<mojom::PageLoadTimingPtr> actual_timings_;
     std::set<blink::mojom::WebFeature> expected_features_;
     std::set<blink::mojom::WebFeature> actual_features_;
+    std::set<int> expected_css_properties_;
+    std::set<int> actual_css_properties_;
     DISALLOW_COPY_AND_ASSIGN(PageTimingValidator);
   };
 
diff --git a/chrome/renderer/page_load_metrics/page_timing_metrics_sender_unittest.cc b/chrome/renderer/page_load_metrics/page_timing_metrics_sender_unittest.cc
index 80f35f6..24b9282 100644
--- a/chrome/renderer/page_load_metrics/page_timing_metrics_sender_unittest.cc
+++ b/chrome/renderer/page_load_metrics/page_timing_metrics_sender_unittest.cc
@@ -231,4 +231,113 @@
   validator_.VerifyExpectedFeatures();
 }
 
+TEST_F(PageTimingMetricsSenderTest, SendSingleCssProperty) {
+  mojom::PageLoadTiming timing;
+  InitPageLoadTimingForTest(&timing);
+
+  metrics_sender_->Send(timing.Clone());
+  validator_.ExpectPageLoadTiming(timing);
+  // Observe a single CSS property, update expected CSS properties sent across
+  // IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(3);
+  // Fire the timer to trigger sending of features via an SendTiming call.
+  metrics_sender_->mock_timer()->Fire();
+  validator_.VerifyExpectedCssProperties();
+}
+
+TEST_F(PageTimingMetricsSenderTest, SendCssPropertiesInRange) {
+  mojom::PageLoadTiming timing;
+  InitPageLoadTimingForTest(&timing);
+
+  metrics_sender_->Send(timing.Clone());
+  validator_.ExpectPageLoadTiming(timing);
+  // Observe the smallest CSS property ID.
+  metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(2);
+  // Observe the largest CSS property ID.
+  metrics_sender_->DidObserveNewCssPropertyUsage(
+      blink::mojom::kMaximumCSSSampleId, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(
+      blink::mojom::kMaximumCSSSampleId);
+  // Fire the timer to trigger sending of features via an SendTiming call.
+  metrics_sender_->mock_timer()->Fire();
+  validator_.VerifyExpectedCssProperties();
+}
+
+TEST_F(PageTimingMetricsSenderTest, SendMultipleCssProperties) {
+  mojom::PageLoadTiming timing;
+  InitPageLoadTimingForTest(&timing);
+
+  metrics_sender_->Send(timing.Clone());
+  validator_.ExpectPageLoadTiming(timing);
+  // Observe the first CSS property, update expected CSS properties sent across
+  // IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(3);
+  // Observe the second CSS property, update expected CSS properties sent across
+  // IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(123, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(123);
+  // Fire the timer to trigger sending of CSS properties via an SendTiming call.
+  metrics_sender_->mock_timer()->Fire();
+  validator_.VerifyExpectedCssProperties();
+}
+
+TEST_F(PageTimingMetricsSenderTest, SendDuplicatedCssProperties) {
+  mojom::PageLoadTiming timing;
+  InitPageLoadTimingForTest(&timing);
+
+  metrics_sender_->Send(timing.Clone());
+  validator_.ExpectPageLoadTiming(timing);
+  metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(3);
+  // Observe a duplicated CSS property usage, without updating expected CSS
+  // properties sent across IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
+  // Fire the timer to trigger sending of CSS properties via an SendTiming call.
+  metrics_sender_->mock_timer()->Fire();
+  validator_.VerifyExpectedCssProperties();
+}
+
+TEST_F(PageTimingMetricsSenderTest, SendMultipleCssPropertiesTwice) {
+  mojom::PageLoadTiming timing;
+  InitPageLoadTimingForTest(&timing);
+
+  metrics_sender_->Send(timing.Clone());
+  validator_.ExpectPageLoadTiming(timing);
+  // Observe the first CSS property, update expected CSS properties sent across
+  // IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(2);
+  // Observe the second CSS property, update expected CSS properties sent across
+  // IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(5, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(5);
+  // Observe a duplicated usage, without updating expected CSS properties sent
+  // across IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
+  // Fire the timer to trigger sending of features via an SendTiming call.
+  metrics_sender_->mock_timer()->Fire();
+  validator_.VerifyExpectedFeatures();
+
+  base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
+  // Send an updated PageLoadTiming after the timer for the first send request
+  // has fired, and verify that a second list of CSS properties is sent.
+  timing.document_timing->load_event_start = load_event;
+  metrics_sender_->Send(timing.Clone());
+  validator_.ExpectPageLoadTiming(timing);
+  // Observe duplicated usage, without updating expected features sent across
+  // IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
+  metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
+  // Observe an additional usage, update expected features sent across IPC.
+  metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
+  validator_.UpdateExpectPageLoadCssProperties(3);
+  // Fire the timer to trigger another sending of features via the second
+  // SendTiming call.
+  metrics_sender_->mock_timer()->Fire();
+  validator_.VerifyExpectedFeatures();
+}
+
 }  // namespace page_load_metrics
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index f2bc6b5..59a69bf 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2313,6 +2313,7 @@
     "../browser/data_usage/tab_id_annotator_unittest.cc",
     "../browser/data_usage/tab_id_provider_unittest.cc",
     "../browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc",
+    "../browser/data_use_measurement/page_load_capping/page_load_capping_infobar_delegate_unittest.cc",
     "../browser/download/chrome_download_manager_delegate_unittest.cc",
     "../browser/download/download_history_unittest.cc",
     "../browser/download/download_item_model_unittest.cc",
@@ -2344,6 +2345,8 @@
     "../browser/history/android/sqlite_cursor_unittest.cc",
     "../browser/history/android/urls_sql_handler_unittest.cc",
     "../browser/history/android/visit_sql_handler_unittest.cc",
+    "../browser/infobars/mock_infobar_service.cc",
+    "../browser/infobars/mock_infobar_service.h",
     "../browser/install_verification/win/loaded_module_verification_unittest.cc",
     "../browser/install_verification/win/module_ids_unittest.cc",
     "../browser/install_verification/win/module_info_unittest.cc",
@@ -2435,6 +2438,7 @@
     "../browser/page_load_metrics/observers/multi_tab_loading_page_load_metrics_observer_unittest.cc",
     "../browser/page_load_metrics/observers/noscript_preview_page_load_metrics_observer_unittest.cc",
     "../browser/page_load_metrics/observers/offline_page_previews_page_load_metrics_observer_unittest.cc",
+    "../browser/page_load_metrics/observers/page_capping_page_load_metrics_observer_unittest.cc",
     "../browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc",
     "../browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h",
     "../browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc",
@@ -4078,6 +4082,9 @@
         "../browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm",
         "../browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm",
         "../browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm",
+        "../browser/ui/cocoa/content_settings/collected_cookies_mac_unittest.mm",
+        "../browser/ui/cocoa/content_settings/cookie_details_unittest.mm",
+        "../browser/ui/cocoa/content_settings/cookie_details_view_controller_unittest.mm",
         "../browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller_unittest.mm",
         "../browser/ui/cocoa/extensions/extension_installed_bubble_controller_unittest.mm",
         "../browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_unittest.mm",
diff --git a/chrome/test/base/javascript_browser_test.cc b/chrome/test/base/javascript_browser_test.cc
index f9ed35f3..8c31bec 100644
--- a/chrome/test/base/javascript_browser_test.cc
+++ b/chrome/test/base/javascript_browser_test.cc
@@ -58,7 +58,7 @@
 // enabled. Also, it seems some ChromeOS-specific tests use the
 // js2gtest GN template.
 #if (!defined(MEMORY_SANITIZER) && !defined(ADDRESS_SANITIZER) && \
-     !defined(LEAK_SANITIZER) && !defined(SYZYASAN)) ||           \
+     !defined(LEAK_SANITIZER)) ||                                 \
     BUILDFLAG(ENABLE_NACL) || defined(OS_CHROMEOS)
   base::FilePath gen_test_data_directory;
   ASSERT_TRUE(
diff --git a/chrome/test/data/autofill/double_dynamic_form.html b/chrome/test/data/autofill/double_dynamic_form.html
new file mode 100644
index 0000000..5195d85
--- /dev/null
+++ b/chrome/test/data/autofill/double_dynamic_form.html
@@ -0,0 +1,65 @@
+<!-- A page that is used to test that a dynamic form fill is only triggered the first time the form changes. -->
+<body>
+  <form name="addr1.1" id="form1" action="https://example.com/" method="post">
+    Name: <input type="text" name="firstname" id="firstname"><br>
+    Address: <input type="text" name="address1" id="address1"><br>
+    City: <input type="text" name="city" id="city"><br>
+    State: <select name="state">
+      <option value="CA">CA</option>
+      <option value="MA">MA</option>
+      <option value="NY">NY</option>
+      <option value="MD">MD</option>
+      <option value="OR">OR</option>
+      <option value="OH">OH</option>
+      <option value="IL">IL</option>
+      <option value="DC">DC</option>
+    </select> <br>
+    Zip: <input name="zip" id="zip"> <br>
+    Country: <select name="country" id="country" onchange="CountryChanged()">
+      <option value="CA">Canada</option>
+      <option value="US">United States</option>
+    </select> <br>
+    Company: <input name="company" id="company"> <br>
+    Email: <input name="email" id="email"> <br>
+    Phone: <input name="phone" id="phone"> <br>
+    <input type="reset" value="Reset">
+    <input type="submit" value="Submit" id="profile_submit">
+  </form>
+</body>
+
+<script src="dynamic_form_utils.js"></script>
+<script>
+
+var refilled = false;
+var callback_c = false;
+
+function CountryChanged() {
+  DynamicallyChangeForm();
+
+  // Prepare the function to trigger a second dynamic form change.
+  document.getElementById("email").addEventListener('change', function(){
+
+    RemoveForm("form1")
+
+    var new_form2 = AddNewFormAndFields();
+    new_form2.setAttribute('id', "form2");
+
+    document.getElementsByTagName('body')[0].appendChild(new_form2);
+
+    if (callback_c)
+      window.domAutomationController.send(document.getElementById("firstname").value != '');
+
+  });
+}
+
+function hasFinished() {
+  var first_name_input = document.getElementById("firstname");
+  if (refilled) {
+    alert("Calling back");
+    window.domAutomationController.send(document.getElementById("firstname").value != '');
+  } else {
+    callback_c = true;
+  }
+}
+
+</script>
diff --git a/chrome/test/data/autofill/dynamic_form.html b/chrome/test/data/autofill/dynamic_form.html
new file mode 100644
index 0000000..8e05a655
--- /dev/null
+++ b/chrome/test/data/autofill/dynamic_form.html
@@ -0,0 +1,50 @@
+<!-- A page that is used to test that a dynamic form fill feature works properly. -->
+<body>
+  <form name="addr1.1" id="form1" action="https://example.com/" method="post">
+    Name: <input type="text" name="firstname" id="firstname"><br>
+    Address: <input type="text" name="address1" id="address1"><br>
+    City: <input type="text" name="city" id="city"><br>
+    State: <select name="state" id="state">
+      <option value="CA">CA</option>
+      <option value="MA">MA</option>
+      <option value="NY">NY</option>
+      <option value="MD">MD</option>
+      <option value="OR">OR</option>
+      <option value="OH">OH</option>
+      <option value="IL">IL</option>
+      <option value="DC">DC</option>
+    </select> <br>
+    Zip: <input name="zip" id="zip"> <br>
+    Country: <select name="country" id="country" onchange="CountryChanged()">
+      <option value="CA">Canada</option>
+      <option value="US">United States</option>
+    </select> <br>
+    Company: <input name="company" id="company"> <br>
+    Email: <input name="email" id="email"> <br>
+    Phone: <input name="phone" id="phone"> <br>
+    <input type="reset" value="Reset">
+    <input type="submit" value="Submit" id="profile_submit">
+  </form>
+</body>
+
+<script src="dynamic_form_utils.js"></script>
+<script>
+var filled = false;
+
+function CountryChanged() {
+  DynamicallyChangeForm();
+  filled = true;
+}
+
+function hasRefilled() {
+  var first_name_input = document.getElementById("firstname");
+  if (!filled || first_name_input.value == '') {
+    first_name_input.onchange = function() {
+      window.domAutomationController.send(document.getElementById("firstname").value != '');
+    }
+  } else {
+    window.domAutomationController.send(document.getElementById("firstname").value != '');
+  }
+}
+
+</script>
diff --git a/chrome/test/data/autofill/dynamic_form_after_delay.html b/chrome/test/data/autofill/dynamic_form_after_delay.html
new file mode 100644
index 0000000..b2b34fe
--- /dev/null
+++ b/chrome/test/data/autofill/dynamic_form_after_delay.html
@@ -0,0 +1,52 @@
+<!-- A page that is used to test that a dynamic form fill doesn't trigger if the form is modified more that a second after the user triggered the first fill. -->
+<body>
+  <form name="addr1.1" id="form1" action="https://example.com/" method="post">
+    Name: <input type="text" name="firstname" id="firstname"><br>
+    Address: <input type="text" name="address1" id="address1"><br>
+    City: <input type="text" name="city" id="city"><br>
+    State: <select name="state" id="state">
+      <option value="CA">CA</option>
+      <option value="MA">MA</option>
+      <option value="NY">NY</option>
+      <option value="MD">MD</option>
+      <option value="OR">OR</option>
+      <option value="OH">OH</option>
+      <option value="IL">IL</option>
+      <option value="DC">DC</option>
+    </select> <br>
+    Zip: <input name="zip" id="zip"> <br>
+    Country: <select name="country" id="country" onchange="CountryChanged()">
+      <option value="CA">Canada</option>
+      <option value="US">United States</option>
+    </select> <br>
+    Company: <input name="company" id="company"> <br>
+    Email: <input name="email" id="email"> <br>
+    Phone: <input name="phone" id="phone"> <br>
+    <input type="reset" value="Reset">
+    <input type="submit" value="Submit" id="profile_submit">
+  </form>
+</body>
+
+<script src="dynamic_form_utils.js"></script>
+<script>
+var filled = false;
+
+function sleep (time) {
+  return new Promise((resolve) => setTimeout(resolve, time));
+}
+
+function CountryChanged() {
+  sleep(2000).then(() => {
+    DynamicallyChangeForm();
+    filled = true;
+
+    // Give time to see if it fills.
+    setTimeout(function() {
+      window.domAutomationController.send(document.getElementById("firstname").value != '');
+    }, 1000);});
+}
+
+// The callback will happen after the dynamic change.
+function hasFinished() {}
+
+</script>
diff --git a/chrome/test/data/autofill/dynamic_form_credit_card.html b/chrome/test/data/autofill/dynamic_form_credit_card.html
new file mode 100644
index 0000000..0ad00d7
--- /dev/null
+++ b/chrome/test/data/autofill/dynamic_form_credit_card.html
@@ -0,0 +1,112 @@
+<!-- A page that is used to test that a dynamic form fill doesn't trigger for credit card forms. -->
+<form name="cc1.1" id="cc1" method="post">
+  Name on card: <input type="text" name="cc-name" id="cc-name"><br>
+  Credit card number: <input type="text" name="cc-num" id="cc-num"><br>
+  Expiry Date: <select name="cc-exp-month" id="cc-exp-month">
+    <option value="01">01</option>
+    <option value="02">02</option>
+    <option value="03">03</option>
+    <option value="04">04</option>
+    <option value="05">05</option>
+    <option value="06">06</option>
+    <option value="07">07</option>
+    <option value="08">08</option>
+    <option value="09">09</option>
+    <option value="10">10</option>
+    <option value="11">11</option>
+    <option value="12">12</option>
+  </select>
+  /
+<select name="cc-exp-year" id="cc-exp-year" onchange="ExpChanged()">
+    <option value="2010">2010</option>
+    <option value="2017">2017</option>
+    <option value="2018">2018</option>
+    <option value="2019">2019</option>
+    <option value="2020">2020</option>
+    <option value="2021">2021</option>
+    <option value="2022">2022</option>
+    <option value="2023">2023</option>
+    <option value="2098">2098</option>
+    <option value="2099">2099</option>
+  </select>
+  <br>
+  CVC: <input name="cc-csc" id="cc-csc">
+<br>
+  <input type="reset" value="Reset">
+  <input type="submit" value="Submit">
+</form>
+
+<script src="dynamic_form_utils.js"></script>
+<script>
+var filled = false;
+
+function ExpChanged() {
+  RemoveForm("cc1");
+
+  var new_form = document.createElement("form");
+  new_form.setAttribute('method',"post");
+  //new_form.setAttribute('action',"https://example.com/")
+  new_form.setAttribute('name',"cc1.1");
+  new_form.setAttribute('id', "cc1");
+
+  var i = document.createElement("input");
+  i.setAttribute('type',"text");
+  i.setAttribute('name',"cc-name");
+  i.setAttribute('id', "cc-name");
+  i.setAttribute('autocomplete', 'cc-name');
+  new_form.appendChild(i);
+
+  i = document.createElement("input");
+  i.setAttribute('type',"text");
+  i.setAttribute('name',"cc-num");
+  i.setAttribute('id', "cc-num");
+  i.setAttribute('autocomplete', 'cc-number');
+  new_form.appendChild(i);
+
+  i = document.createElement("select");
+  i.setAttribute('name',"cc-exp-month");
+  i.setAttribute('id', "cc-exp-month");
+  i.setAttribute('autocomplete', 'cc-exp-month');
+  i.options[0] = new Option("01", "01");
+  i.options[1] = new Option("02", "02");
+  i.options[2] = new Option("03", "03");
+  i.options[3] = new Option("04", "04");
+  i.options[4] = new Option("05", "05");
+  i.options[5] = new Option("06", "06");
+  i.options[6] = new Option("07", "07");
+  i.options[7] = new Option("08", "08");
+  i.options[8] = new Option("09", "09");
+  i.options[9] = new Option("10", "10");
+  i.options[10] = new Option("11", "11");
+  i.options[11] = new Option("12", "12");
+  new_form.appendChild(i);
+
+  i = document.createElement("select");
+  i.setAttribute('name',"cc-exp-year");
+  i.setAttribute('id', "cc-exp-year");
+  i.setAttribute('autocomplete', 'cc-exp-year');
+  i.options[0] = new Option("2010", "2010");
+  i.options[1] = new Option("2998", "2998");
+  i.options[2] = new Option("2999", "2999");
+  new_form.appendChild(i);
+
+  i = document.createElement("input");
+  i.setAttribute('type',"text");
+  i.setAttribute('name',"cc-csc");
+  i.setAttribute('id', "cc-csc");
+  i.setAttribute('autocomplete', 'cc-csc');
+  new_form.appendChild(i);
+
+  document.getElementsByTagName('body')[0].appendChild(new_form);
+
+  filled = true;
+
+  // Give time to see if it fills.
+  setTimeout(function() {
+    window.domAutomationController.send(document.getElementById("cc-name").value != '');
+  }, 1000);
+}
+
+// The callback will happen after the dynamic change
+function hasRefilled() {}
+</script>
\ No newline at end of file
diff --git a/chrome/test/data/autofill/dynamic_form_new_field_types.html b/chrome/test/data/autofill/dynamic_form_new_field_types.html
new file mode 100644
index 0000000..9adb6c08
--- /dev/null
+++ b/chrome/test/data/autofill/dynamic_form_new_field_types.html
@@ -0,0 +1,58 @@
+<!-- A page that is used to test that a dynamic form fill only fills fields of a group type present in the initial fill. -->
+<body>
+  <!-- A form that does not ask for name or email -->
+  <form name="addr1.1" id="form1" action="https://example.com/" method="post">
+    Name: <input type="text" name="firstname" id="firstname"><br>
+    Address: <input type="text" name="address1" id="address1"><br>
+    City: <input type="text" name="city" id="city"><br>
+    State: <select name="state" id="state">
+      <option value="CA">CA</option>
+      <option value="MA">MA</option>
+      <option value="NY">NY</option>
+      <option value="MD">MD</option>
+      <option value="OR">OR</option>
+      <option value="OH">OH</option>
+      <option value="IL">IL</option>
+      <option value="DC">DC</option>
+    </select> <br>
+    Zip: <input name="zip" id="zip"> <br>
+    Country: <select name="country" id="country" onchange="CountryChanged()">
+      <option value="CA">Canada</option>
+      <option value="US">United States</option>
+    </select> <br>
+    <!-- A hidden email field -->
+    <input name="email" id="email" type="hidden"> <br>
+    <!-- An international phone field -->
+    Phone: <input name="phone" id="phone" autocomplete="tel-national"> <br>
+    <input type="reset" value="Reset">
+    <input type="submit" value="Submit" id="profile_submit">
+  </form>
+</body>
+
+<script src="dynamic_form_utils.js"></script>
+<script>
+var filled = false;
+
+function CountryChanged() {
+  RemoveForm("form1");
+  var new_form = AddNewFormAndFields();
+
+  // Set a different type of phone field.
+  new_form.elements[6].setAttribute('autocomplete', 'tel-national');
+
+  document.getElementsByTagName('body')[0].appendChild(new_form);
+  filled = true;
+}
+
+function hasRefilled() {
+  var first_name_input = document.getElementById("firstname");
+  if (!filled || first_name_input.value == '') {
+    first_name_input.onchange = function() {
+      window.domAutomationController.send(document.getElementById("firstname").value != '');
+    }
+  } else {
+    window.domAutomationController.send(document.getElementById("firstname").value != '');
+  }
+}
+
+</script>
diff --git a/chrome/test/data/autofill/dynamic_form_utils.js b/chrome/test/data/autofill/dynamic_form_utils.js
new file mode 100644
index 0000000..4e378b3
--- /dev/null
+++ b/chrome/test/data/autofill/dynamic_form_utils.js
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2018 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+function DynamicallyChangeForm() {
+  RemoveForm('form1');
+  var new_form = AddNewFormAndFields();
+  document.getElementsByTagName('body')[0].appendChild(new_form);
+}
+
+//* Removes the initial form. */
+function RemoveForm(form_id) {
+  var initial_form = document.getElementById(form_id);
+  initial_form.parentNode.removeChild(initial_form);
+  initial_form.innerHTML = '';
+  initial_form.remove();
+}
+
+/** Adds a new form and fields for the dynamic form. */
+function AddNewFormAndFields() {
+  var new_form = document.createElement('form');
+  new_form.setAttribute('method', 'post');
+  new_form.setAttribute('action', 'https://example.com/')
+  new_form.setAttribute('name', 'addr1.1');
+  new_form.setAttribute('id', 'form1');
+
+  var i = document.createElement('input');
+  i.setAttribute('type', 'text');
+  i.setAttribute('name', 'firstname');
+  i.setAttribute('id', 'firstname');
+  i.setAttribute('autocomplete', 'given-name');
+  new_form.appendChild(i);
+
+  i = document.createElement('input');
+  i.setAttribute('type', 'text');
+  i.setAttribute('name', 'address1');
+  i.setAttribute('id', 'address1');
+  i.setAttribute('autocomplete', 'address-line1');
+  new_form.appendChild(i);
+
+  i = document.createElement('select');
+  i.setAttribute('name', 'state');
+  i.setAttribute('id', 'state');
+  i.setAttribute('autocomplete', 'region');
+  i.options[0] = new Option('CA', 'CA');
+  i.options[1] = new Option('MA', 'MA');
+  i.options[2] = new Option('TX', 'TX');
+  new_form.appendChild(i);
+
+  i = document.createElement('input');
+  i.setAttribute('type', 'text');
+  i.setAttribute('name', 'city');
+  i.setAttribute('id', 'city');
+  i.setAttribute('autocomplete', 'locality');
+  new_form.appendChild(i);
+
+  i = document.createElement('input');
+  i.setAttribute('type', 'text');
+  i.setAttribute('name', 'company');
+  i.setAttribute('id', 'company');
+  i.setAttribute('autocomplete', 'organization');
+  new_form.appendChild(i);
+
+  i = document.createElement('input');
+  i.setAttribute('type', 'text');
+  i.setAttribute('name', 'email');
+  i.setAttribute('id', 'email');
+  i.setAttribute('autocomplete', 'email');
+  new_form.appendChild(i);
+
+  i = document.createElement('input');
+  i.setAttribute('type', 'text');
+  i.setAttribute('name', 'phone');
+  i.setAttribute('id', 'phone');
+  i.setAttribute('autocomplete', 'tel');
+  new_form.appendChild(i);
+
+  return new_form;
+}
\ No newline at end of file
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 11aa8235..91a2deb 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1276,7 +1276,6 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_util.js',
     'settings_menu_test.js',
   ]),
 };
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js
index 39c7bbb0..e08381f2 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -423,7 +423,7 @@
       test('FirstTimeSetupNotification', function() {
         assertTrue(!!syncPage.$.toast);
         assertFalse(syncPage.$.toast.open);
-        syncPage.setupInProgress = true;
+        syncPage.syncStatus = {setupInProgress: true};
         Polymer.dom.flush();
         assertTrue(syncPage.$.toast.open);
 
@@ -434,6 +434,20 @@
               assertTrue(abort);
             });
       });
+
+      test('ShowAccountRow', function() {
+        assertFalse(!!syncPage.$$('settings-sync-account-control'));
+        syncPage.diceEnabled = true;
+        Polymer.dom.flush();
+        assertFalse(!!syncPage.$$('settings-sync-account-control'));
+        syncPage.unifiedConsentEnabled = true;
+        syncPage.syncStatus = {signinAllowed: false, syncSystemEnabled: false};
+        Polymer.dom.flush();
+        assertFalse(!!syncPage.$$('settings-sync-account-control'));
+        syncPage.syncStatus = {signinAllowed: true, syncSystemEnabled: true};
+        Polymer.dom.flush();
+        assertTrue(!!syncPage.$$('settings-sync-account-control'));
+      });
     }
   });
 });
diff --git a/chrome/test/data/webui/settings/people_page_test.js b/chrome/test/data/webui/settings/people_page_test.js
index 08f8417..d9dab6b 100644
--- a/chrome/test/data/webui/settings/people_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_test.js
@@ -4,8 +4,11 @@
 
 cr.define('settings_people_page', function() {
   suite('ProfileInfoTests', function() {
+    /** @type {SettingsPeoplePageElement} */
     let peoplePage = null;
+    /** @type {settings.ProfileInfoBrowserProxy} */
     let browserProxy = null;
+    /** @type {settings.SyncBrowserProxy} */
     let syncBrowserProxy = null;
 
     suiteSetup(function() {
@@ -71,8 +74,11 @@
 
   if (!cr.isChromeOS) {
     suite('SyncStatusTests', function() {
+      /** @type {SettingsPeoplePageElement} */
       let peoplePage = null;
+      /** @type {settings.SyncBrowserProxy} */
       let browserProxy = null;
+      /** @type {settings.ProfileInfoBrowserProxy} */
       let profileInfoBrowserProxy = null;
 
       suiteSetup(function() {
@@ -341,8 +347,11 @@
     });
 
     suite('DiceUITest', function() {
+      /** @type {SettingsPeoplePageElement} */
       let peoplePage = null;
+      /** @type {settings.SyncBrowserProxy} */
       let browserProxy = null;
+      /** @type {settings.ProfileInfoBrowserProxy} */
       let profileInfoBrowserProxy = null;
 
       suiteSetup(function() {
@@ -422,8 +431,11 @@
   }
 
   suite('UnifiedConsentUITest', function() {
+    /** @type {SettingsPeoplePageElement} */
     let peoplePage = null;
+    /** @type {settings.SyncBrowserProxy} */
     let browserProxy = null;
+    /** @type {settings.ProfileInfoBrowserProxy} */
     let profileInfoBrowserProxy = null;
 
     suiteSetup(function() {
diff --git a/chrome/test/data/webui/settings/settings_menu_test.js b/chrome/test/data/webui/settings/settings_menu_test.js
index 7307d51..7629908 100644
--- a/chrome/test/data/webui/settings/settings_menu_test.js
+++ b/chrome/test/data/webui/settings/settings_menu_test.js
@@ -75,13 +75,6 @@
       MockInteractions.tap(settingsMenu.$.people);
       assertEquals('', settings.getQueryParameters().toString());
     });
-
-    test('extensionsLinkClicked', function() {
-      const eventPromise =
-          test_util.eventToPromise('external-link-click', settingsMenu);
-      settingsMenu.$.extensionsLink.click();
-      return eventPromise;
-    });
   });
 
   suite('SettingsMenuReset', function() {
diff --git a/chrome/test/ppapi/ppapi_interactive_browsertest.cc b/chrome/test/ppapi/ppapi_interactive_browsertest.cc
index 849f680..4894a4d8 100644
--- a/chrome/test/ppapi/ppapi_interactive_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_interactive_browsertest.cc
@@ -17,7 +17,7 @@
 // Disable tests under ASAN.  http://crbug.com/104832.
 // This is a bit heavy handed, but the majority of these tests fail under ASAN.
 // See bug for history.
-#if !defined(ADDRESS_SANITIZER) && !defined(SYZYASAN)
+#if !defined(ADDRESS_SANITIZER)
 
 // Disabled due to timeouts: http://crbug.com/136548
 IN_PROC_BROWSER_TEST_F(
diff --git a/chrome/tools/build/win/FILES.cfg b/chrome/tools/build/win/FILES.cfg
index 848e660..2d3079aa 100644
--- a/chrome/tools/build/win/FILES.cfg
+++ b/chrome/tools/build/win/FILES.cfg
@@ -548,54 +548,6 @@
     'buildtype': ['official'],
     'archive': 'cloud_print.zip',
   },
-  # Syzygy modified binaries and related files. Only add to this section if you
-  # know what you're doing! The build configuration has to be modified to run
-  # Syzygy on the target in question before adding a staging dependency here!
-  {
-    'filename': 'syzygy/chrome.dll',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'syzygy/chrome.dll',
-    'filegroup': ['symsrc'],
-    'optional': ['dev', 'official'],
-  },
-  {
-    'filename': 'syzygy/chrome_child.dll',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'syzygy/chrome_child.dll',
-    'filegroup': ['symsrc'],
-    'optional': ['dev', 'official'],
-  },
-  {
-    'filename': 'syzygy/instrumented/chrome_child.dll',
-    'arch': ['32bit'],
-    'buildtype': ['official'],
-    'archive': 'syzygy/instrumented/chrome_child.dll',
-    'filegroup': ['symsrc'],
-    'optional': ['official'],
-  },
-  {
-    'filename': 'syzygy/mini_installer.exe',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'syzygy/mini_installer.exe',
-    'filegroup': ['symsrc'],
-    'optional': ['dev', 'official'],
-  },
-  {
-    'filename': 'syzygy/chrome.packed.7z',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'syzygy/chrome.packed.7z',
-    'optional': ['dev', 'official'],
-  },
-  {
-    'filename': 'syzygy/syzyasan_rtl.dll',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'optional': ['dev', 'official'],
-  },
   # Test binaries for external QA:
   {
     'filename': 'interactive_ui_tests.exe',
@@ -742,37 +694,6 @@
     'buildtype': ['dev', 'official'],
     'archive': 'chrome-win32-syms.zip',
   },
-  # PDB files for Syzygy modified binaries. Only add to this section if you
-  # know what you're doing! The build configuration has to be modified to run
-  # Syzygy on the target in question before adding a staging dependency here!
-  {
-    'filename': 'syzygy/chrome.dll.pdb',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'chrome-win32-syms.zip',
-    'optional': ['dev', 'official'],
-  },
-  {
-    'filename': 'syzygy/chrome_child.dll.pdb',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'chrome-win32-syms.zip',
-    'optional': ['dev', 'official'],
-  },
-  {
-    'filename': 'syzygy/mini_installer.exe.pdb',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'chrome-win32-syms.zip',
-    'optional': ['dev', 'official'],
-  },
-  {
-    'filename': 'syzygy/syzyasan_rtl.dll.pdb',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-    'archive': 'chrome-win32-syms.zip',
-    'optional': ['dev', 'official'],
-  },
   {
     'filename': 'nacl_irt_x86_32.nexe.debug',
     'arch': ['32bit'],
diff --git a/chrome/tools/build/win/create_installer_archive.py b/chrome/tools/build/win/create_installer_archive.py
index 8bef984..baadb8b 100755
--- a/chrome/tools/build/win/create_installer_archive.py
+++ b/chrome/tools/build/win/create_installer_archive.py
@@ -540,15 +540,7 @@
                                 options.last_chrome_installer,
                                 options.output_name)
 
-  # Preferentially copy the files we can find from the output_dir, as
-  # this is where we'll find the Syzygy-optimized executables when
-  # building the optimized mini_installer.
-  if options.build_dir != options.output_dir:
-    CopyAllFilesToStagingDir(config, options.distribution,
-                             staging_dir, options.output_dir,
-                             options.enable_hidpi)
-
-  # Now copy the remainder of the files from the build dir.
+  # Copy the files from the build dir.
   CopyAllFilesToStagingDir(config, options.distribution,
                            staging_dir, options.build_dir,
                            options.enable_hidpi)
diff --git a/chrome/tools/build/win/syzygy/BUILD.gn b/chrome/tools/build/win/syzygy/BUILD.gn
deleted file mode 100644
index 08139f1..0000000
--- a/chrome/tools/build/win/syzygy/BUILD.gn
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/chrome_build.gni")
-import("//build/config/compiler/compiler.gni")
-import("//build/config/sanitizers/sanitizers.gni")
-import("//build/win/syzygy/syzygy.gni")
-
-# Where the output binaries will be placed.
-syzygy_dest_dir = "$root_out_dir/syzygy"
-
-if (is_syzyasan) {
-  syzygy_asan("chrome_dll_syzygy") {
-    binary_name = "chrome.dll"
-    dest_dir = syzygy_dest_dir
-    deps = [
-      "//chrome:main_dll",
-    ]
-    if (is_multi_dll_chrome) {
-      data_deps = [
-        ":chrome_child_dll_syzygy",
-      ]
-    }
-  }
-
-  if (is_multi_dll_chrome) {
-    # Also instrument chrome_child.dll.
-    #
-    # For official builds, the instrumented version will be put into an
-    # "instrumented" subdirectory and the regular output will be
-    # uninstrumented. Otherwise, chrome_child is also instrumented to the
-    # normal place.
-    syzygy_asan("chrome_child_dll_syzygy") {
-      binary_name = "chrome_child.dll"
-      deps = [
-        "//chrome:chrome_child",
-      ]
-
-      if (is_official_build) {
-        dest_dir = "$syzygy_dest_dir/instrumented"
-        deps += [ ":chrome_child_dll_syzygy_copy" ]
-      } else {
-        dest_dir = syzygy_dest_dir
-      }
-    }
-
-    if (is_official_build) {
-      # Copies the uninstrumented chrome_child.dll.
-      copy("chrome_child_dll_syzygy_copy") {
-        sources = [
-          "$root_out_dir/chrome_child.dll",
-        ]
-        outputs = [
-          "$syzygy_dest_dir/{{source_file_part}}",
-        ]
-        deps = [
-          "//chrome:chrome_child",
-        ]
-      }
-    }
-  }
-} else {
-  # No syzygy. Generate dummy targets so other targets can unconditionally
-  # depend on these without having to duplicate our conditions.
-  group("chrome_dll_syzygy") {
-  }
-  if (is_multi_dll_chrome) {
-    group("chrome_child_dll_syzygy") {
-    }
-  }
-}
-
-# Prevent unused variable warning for code paths where this is unused.
-assert(syzygy_dest_dir != "")
diff --git a/chrome/tools/build/win/syzygy/OWNERS b/chrome/tools/build/win/syzygy/OWNERS
deleted file mode 100644
index 4fa8ee3f..0000000
--- a/chrome/tools/build/win/syzygy/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-chrisha@chromium.org
-siggi@chromium.org
diff --git a/chrome_elf/elf_imports_unittest.cc b/chrome_elf/elf_imports_unittest.cc
index dfcb9b9..cd2b4772 100644
--- a/chrome_elf/elf_imports_unittest.cc
+++ b/chrome_elf/elf_imports_unittest.cc
@@ -87,9 +87,6 @@
   static const char* const kValidFilePatterns[] = {
     "KERNEL32.dll",
     "RPCRT4.dll",
-#if defined(SYZYASAN)
-    "syzyasan_rtl.dll",
-#endif
 #if defined(ADDRESS_SANITIZER) && defined(COMPONENT_BUILD)
     "clang_rt.asan_dynamic-i386.dll",
 #endif
diff --git a/chromeos/components/tether/ble_connection_manager.cc b/chromeos/components/tether/ble_connection_manager.cc
index bd5572b7..3547c13 100644
--- a/chromeos/components/tether/ble_connection_manager.cc
+++ b/chromeos/components/tether/ble_connection_manager.cc
@@ -340,7 +340,8 @@
 
 void BleConnectionManager::OnReceivedAdvertisementFromDevice(
     const cryptauth::RemoteDevice& remote_device,
-    device::BluetoothDevice* bluetooth_device) {
+    device::BluetoothDevice* bluetooth_device,
+    bool is_background_advertisement) {
   const std::string device_id = remote_device.GetDeviceId();
 
   ConnectionMetadata* connection_metadata = GetConnectionMetadata(device_id);
@@ -369,6 +370,9 @@
                << remote_device.GetTruncatedDeviceIdForLogs()
                << "\". Starting authentication handshake.";
 
+  device_id_to_received_advertisement_time_and_is_background_map_[device_id] =
+      std::pair<base::Time, bool>(clock_->Now(), is_background_advertisement);
+
   // Stop trying to connect to that device, since it has been found.
   StopConnectionAttemptAndMoveToEndOfQueue(device_id);
 
@@ -511,7 +515,7 @@
     StateChangeDetail state_change_detail) {
   GetConnectionMetadata(device_id)->StopConnectionAttemptTimer();
   StopConnectionAttemptAndMoveToEndOfQueue(device_id);
-  device_id_to_advertising_start_time_map_[device_id] = base::Time();
+  device_id_to_started_scan_time_map_[device_id] = base::Time();
 
   // Send a "connecting => disconnected" update to alert clients that a
   // connection attempt for |device_id| has failed.
@@ -595,10 +599,10 @@
                << StateChangeDetailToString(state_change_detail);
 
   if (new_status == cryptauth::SecureChannel::Status::CONNECTING) {
-    device_id_to_advertising_start_time_map_[device_id] = clock_->Now();
+    device_id_to_started_scan_time_map_[device_id] = clock_->Now();
   } else if (new_status == cryptauth::SecureChannel::Status::CONNECTED) {
     device_id_to_status_connected_time_map_[device_id] = clock_->Now();
-    RecordAdvertisementToConnectionDuration(device_id);
+    RecordStartScanToConnectionDuration(device_id);
   } else if (new_status == cryptauth::SecureChannel::Status::AUTHENTICATED) {
     RecordConnectionToAuthenticationDuration(device_id);
   }
@@ -621,23 +625,64 @@
   timer_factory_ = std::move(test_timer_factory);
 }
 
-void BleConnectionManager::RecordAdvertisementToConnectionDuration(
+void BleConnectionManager::RecordStartScanToConnectionDuration(
     const std::string device_id) {
-  if (!base::ContainsKey(device_id_to_advertising_start_time_map_, device_id) ||
-      device_id_to_advertising_start_time_map_[device_id].is_null() ||
+  if (!base::ContainsKey(device_id_to_started_scan_time_map_, device_id) ||
+      device_id_to_started_scan_time_map_[device_id].is_null() ||
+      !base::ContainsKey(
+          device_id_to_received_advertisement_time_and_is_background_map_,
+          device_id) ||
+      device_id_to_received_advertisement_time_and_is_background_map_[device_id]
+          .first.is_null() ||
       !base::ContainsKey(device_id_to_status_connected_time_map_, device_id) ||
       device_id_to_status_connected_time_map_[device_id].is_null()) {
-    LOG(ERROR) << "Failed to record advertisement to connection duration: "
+    LOG(ERROR) << "Failed to record start scan to connection duration: "
                << "times are invalid";
     return;
   }
 
-  UMA_HISTOGRAM_MEDIUM_TIMES(
-      "InstantTethering.Performance.AdvertisementToConnectionDuration",
+  base::TimeDelta start_scan_to_received_advertisment_duration =
+      device_id_to_received_advertisement_time_and_is_background_map_[device_id]
+          .first -
+      device_id_to_started_scan_time_map_[device_id];
+  base::TimeDelta received_advertisment_to_connection_duration =
       device_id_to_status_connected_time_map_[device_id] -
-          device_id_to_advertising_start_time_map_[device_id]);
+      device_id_to_received_advertisement_time_and_is_background_map_[device_id]
+          .first;
+  base::TimeDelta start_scan_to_connection_duration =
+      device_id_to_status_connected_time_map_[device_id] -
+      device_id_to_started_scan_time_map_[device_id];
 
-  device_id_to_advertising_start_time_map_.erase(device_id);
+  bool is_background_advertisement =
+      device_id_to_received_advertisement_time_and_is_background_map_[device_id]
+          .second;
+  if (is_background_advertisement) {
+    UMA_HISTOGRAM_TIMES(
+        "InstantTethering.Performance.StartScanToReceiveAdvertisementDuration."
+        "Background",
+        start_scan_to_received_advertisment_duration);
+    UMA_HISTOGRAM_MEDIUM_TIMES(
+        "InstantTethering.Performance.ReceiveAdvertisementToConnectionDuration."
+        "Background",
+        received_advertisment_to_connection_duration);
+    UMA_HISTOGRAM_MEDIUM_TIMES(
+        "InstantTethering.Performance.StartScanToConnectionDuration.Background",
+        start_scan_to_connection_duration);
+  } else {
+    UMA_HISTOGRAM_TIMES(
+        "InstantTethering.Performance.StartScanToReceiveAdvertisementDuration",
+        start_scan_to_received_advertisment_duration);
+    UMA_HISTOGRAM_MEDIUM_TIMES(
+        "InstantTethering.Performance.ReceiveAdvertisementToConnectionDuration",
+        received_advertisment_to_connection_duration);
+    UMA_HISTOGRAM_MEDIUM_TIMES(
+        "InstantTethering.Performance.AdvertisementToConnectionDuration",
+        start_scan_to_connection_duration);
+  }
+
+  device_id_to_started_scan_time_map_.erase(device_id);
+  device_id_to_received_advertisement_time_and_is_background_map_.erase(
+      device_id);
 }
 
 void BleConnectionManager::RecordConnectionToAuthenticationDuration(
diff --git a/chromeos/components/tether/ble_connection_manager.h b/chromeos/components/tether/ble_connection_manager.h
index 5e19fe2fe..1a53796 100644
--- a/chromeos/components/tether/ble_connection_manager.h
+++ b/chromeos/components/tether/ble_connection_manager.h
@@ -133,7 +133,8 @@
   // BleScanner::Observer:
   void OnReceivedAdvertisementFromDevice(
       const cryptauth::RemoteDevice& remote_device,
-      device::BluetoothDevice* bluetooth_device) override;
+      device::BluetoothDevice* bluetooth_device,
+      bool is_background_advertisement) override;
 
  protected:
   void NotifyMessageReceived(std::string device_id, std::string payload);
@@ -229,7 +230,7 @@
   // Record various operation durations. These need to be separate methods
   // because internally they use a macro which maintains a static state that
   // does not tolerate different histogram names being passed to it.
-  void RecordAdvertisementToConnectionDuration(const std::string device_id);
+  void RecordStartScanToConnectionDuration(const std::string device_id);
   void RecordConnectionToAuthenticationDuration(const std::string device_id);
 
   cryptauth::CryptAuthService* cryptauth_service_;
@@ -246,7 +247,11 @@
   std::map<std::string, std::unique_ptr<ConnectionMetadata>>
       device_id_to_metadata_map_;
 
-  std::map<std::string, base::Time> device_id_to_advertising_start_time_map_;
+  std::map<std::string, base::Time> device_id_to_started_scan_time_map_;
+  // Records when an advertisement was received, and whether or not it was a
+  // background advertisement.
+  std::map<std::string, std::pair<base::Time, bool>>
+      device_id_to_received_advertisement_time_and_is_background_map_;
   std::map<std::string, base::Time> device_id_to_status_connected_time_map_;
 
   base::ObserverList<Observer> observer_list_;
diff --git a/chromeos/components/tether/ble_connection_manager_unittest.cc b/chromeos/components/tether/ble_connection_manager_unittest.cc
index c3ca16b..4dfc9bc 100644
--- a/chromeos/components/tether/ble_connection_manager_unittest.cc
+++ b/chromeos/components/tether/ble_connection_manager_unittest.cc
@@ -44,10 +44,12 @@
 const char kBluetoothAddress2[] = "22:33:44:55:66:77";
 const char kBluetoothAddress3[] = "33:44:55:66:77:88";
 
-constexpr base::TimeDelta kStatusConnectedTime =
+constexpr base::TimeDelta kReceiveAdvertisementTime =
     base::TimeDelta::FromSeconds(1);
-constexpr base::TimeDelta kStatusAuthenticatedTime =
+constexpr base::TimeDelta kStatusConnectedTime =
     base::TimeDelta::FromSeconds(3);
+constexpr base::TimeDelta kStatusAuthenticatedTime =
+    base::TimeDelta::FromSeconds(7);
 
 struct SecureChannelStatusChange {
   SecureChannelStatusChange(
@@ -401,12 +403,13 @@
 
   void NotifyReceivedAdvertisementFromDevice(
       const std::string& bluetooth_address,
-      const cryptauth::RemoteDevice& remote_device) {
+      const cryptauth::RemoteDevice& remote_device,
+      bool is_background_advertisement) {
     device::MockBluetoothDevice device(
         mock_adapter_.get(), 0u /* bluetooth_class */, "name",
         bluetooth_address, false /* paired */, false /* connected */);
-    fake_ble_scanner_->NotifyReceivedAdvertisementFromDevice(remote_device,
-                                                             &device);
+    fake_ble_scanner_->NotifyReceivedAdvertisementFromDevice(
+        remote_device, &device, is_background_advertisement);
   }
 
   FakeSecureChannel* GetChannelForDevice(
@@ -437,7 +440,8 @@
   FakeSecureChannel* ConnectSuccessfully(
       const cryptauth::RemoteDevice& remote_device,
       const std::string& bluetooth_address,
-      const ConnectionReason connection_reason) {
+      const ConnectionReason connection_reason,
+      bool is_background_advertisement) {
     test_clock_.SetNow(base::Time::UnixEpoch());
 
     manager_->RegisterRemoteDevice(remote_device.GetDeviceId(),
@@ -449,28 +453,41 @@
          cryptauth::SecureChannel::Status::CONNECTING,
          BleConnectionManager::StateChangeDetail::STATE_CHANGE_DETAIL_NONE}});
 
-    FakeSecureChannel* channel =
-        ConnectChannel(remote_device, bluetooth_address);
-    AuthenticateChannel(remote_device);
+    FakeSecureChannel* channel = ReceiveAdvertisementAndConnectChannel(
+        remote_device, bluetooth_address, is_background_advertisement);
+    AuthenticateChannelAndResetClock(remote_device,
+                                     is_background_advertisement);
     return channel;
   }
 
   // Creates a connection to |remote_device| at |bluetooth_address|. The device
   // must be registered before calling this function.
-  FakeSecureChannel* ConnectChannel(
+  FakeSecureChannel* ReceiveAdvertisementAndConnectChannel(
       const cryptauth::RemoteDevice& remote_device,
-      const std::string& bluetooth_address) {
+      const std::string& bluetooth_address,
+      bool is_background_advertisement) {
     VerifyDeviceRegistered(remote_device);
 
     fake_secure_channel_factory_->SetExpectedDeviceAddress(bluetooth_address);
-    NotifyReceivedAdvertisementFromDevice(bluetooth_address, remote_device);
+
+    test_clock_.SetNow(base::Time::UnixEpoch() + kReceiveAdvertisementTime);
+
+    NotifyReceivedAdvertisementFromDevice(bluetooth_address, remote_device,
+                                          is_background_advertisement);
+
+    // Prevent the time manipulation of this method from affecting time
+    // measurements in the rest of the test.
+    test_clock_.SetNow(base::Time::UnixEpoch());
+
     return GetChannelForDevice(remote_device);
   }
 
   // Authenticates the SecureChannel associated with |remote_device|. The device
   // must be registered and already have an associated channel before calling
   // this function.
-  void AuthenticateChannel(const cryptauth::RemoteDevice& remote_device) {
+  void AuthenticateChannelAndResetClock(
+      const cryptauth::RemoteDevice& remote_device,
+      bool is_background_advertisement) {
     VerifyDeviceRegistered(remote_device);
 
     FakeSecureChannel* channel = GetChannelForDevice(remote_device);
@@ -478,22 +495,75 @@
 
     num_expected_authenticated_channels_++;
 
-    test_clock_.SetNow(base::Time::UnixEpoch());
-    channel->ChangeStatus(cryptauth::SecureChannel::Status::CONNECTING);
-
-    test_clock_.Advance(kStatusConnectedTime);
+    test_clock_.SetNow(base::Time::UnixEpoch() + kReceiveAdvertisementTime +
+                       kStatusConnectedTime);
     channel->ChangeStatus(cryptauth::SecureChannel::Status::CONNECTED);
-    histogram_tester_.ExpectTimeBucketCount(
-        "InstantTethering.Performance.AdvertisementToConnectionDuration",
-        kStatusConnectedTime, num_expected_authenticated_channels_);
 
-    test_clock_.Advance(kStatusAuthenticatedTime);
+    if (is_background_advertisement) {
+      histogram_tester_.ExpectTimeBucketCount(
+          "InstantTethering.Performance."
+          "StartScanToReceiveAdvertisementDuration.Background",
+          kReceiveAdvertisementTime, num_expected_authenticated_channels_);
+      histogram_tester_.ExpectTimeBucketCount(
+          "InstantTethering.Performance."
+          "ReceiveAdvertisementToConnectionDuration.Background",
+          kStatusConnectedTime, num_expected_authenticated_channels_);
+      histogram_tester_.ExpectTimeBucketCount(
+          "InstantTethering.Performance.StartScanToConnectionDuration."
+          "Background",
+          kReceiveAdvertisementTime + kStatusConnectedTime,
+          num_expected_authenticated_channels_);
+
+      histogram_tester_.ExpectTotalCount(
+          "InstantTethering.Performance."
+          "StartScanToReceiveAdvertisementDuration",
+          0);
+      histogram_tester_.ExpectTotalCount(
+          "InstantTethering.Performance."
+          "ReceiveAdvertisementToConnectionDuration",
+          0);
+      histogram_tester_.ExpectTotalCount(
+          "InstantTethering.Performance.AdvertisementToConnectionDuration", 0);
+    } else {
+      histogram_tester_.ExpectTotalCount(
+          "InstantTethering.Performance."
+          "StartScanToReceiveAdvertisementDuration.Background",
+          0);
+      histogram_tester_.ExpectTotalCount(
+          "InstantTethering.Performance."
+          "ReceiveAdvertisementToConnectionDuration.Background",
+          0);
+      histogram_tester_.ExpectTotalCount(
+          "InstantTethering.Performance.StartScanToConnectionDuration."
+          "Background",
+          0);
+
+      histogram_tester_.ExpectTimeBucketCount(
+          "InstantTethering.Performance."
+          "StartScanToReceiveAdvertisementDuration",
+          kReceiveAdvertisementTime, num_expected_authenticated_channels_);
+      histogram_tester_.ExpectTimeBucketCount(
+          "InstantTethering.Performance."
+          "ReceiveAdvertisementToConnectionDuration",
+          kStatusConnectedTime, num_expected_authenticated_channels_);
+      histogram_tester_.ExpectTimeBucketCount(
+          "InstantTethering.Performance.AdvertisementToConnectionDuration",
+          kReceiveAdvertisementTime + kStatusConnectedTime,
+          num_expected_authenticated_channels_);
+    }
+
+    test_clock_.SetNow(base::Time::UnixEpoch() + kReceiveAdvertisementTime +
+                       kStatusConnectedTime + kStatusAuthenticatedTime);
     channel->ChangeStatus(cryptauth::SecureChannel::Status::AUTHENTICATING);
     channel->ChangeStatus(cryptauth::SecureChannel::Status::AUTHENTICATED);
     histogram_tester_.ExpectTimeBucketCount(
         "InstantTethering.Performance.ConnectionToAuthenticationDuration",
         kStatusAuthenticatedTime, num_expected_authenticated_channels_);
 
+    // Prevent the time manipulation of this method from affecting time
+    // measurements in the rest of the test.
+    test_clock_.SetNow(base::Time::UnixEpoch());
+
     VerifyConnectionStateChanges(std::vector<SecureChannelStatusChange>{
         {remote_device.GetDeviceId(),
          cryptauth::SecureChannel::Status::CONNECTING,
@@ -646,8 +716,9 @@
        BleConnectionManager::StateChangeDetail::STATE_CHANGE_DETAIL_NONE}});
 
   // Simulate the channel failing to find GATT services and disconnecting.
-  FakeSecureChannel* channel =
-      ConnectChannel(test_devices_[0], kBluetoothAddress1);
+  FakeSecureChannel* channel = ReceiveAdvertisementAndConnectChannel(
+      test_devices_[0], kBluetoothAddress1,
+      false /* is_background_advertisement */);
   channel->NotifyGattCharacteristicsNotAvailable();
   channel->Disconnect();
   VerifyConnectionStateChanges(std::vector<SecureChannelStatusChange>{
@@ -713,7 +784,9 @@
        BleConnectionManager::StateChangeDetail::STATE_CHANGE_DETAIL_NONE}});
 
   fake_secure_channel_factory_->SetExpectedDeviceAddress(kBluetoothAddress1);
-  NotifyReceivedAdvertisementFromDevice(kBluetoothAddress1, test_devices_[0]);
+  NotifyReceivedAdvertisementFromDevice(
+      kBluetoothAddress1, test_devices_[0],
+      false /* is_background_advertisement */);
   FakeSecureChannel* channel = GetChannelForDevice(test_devices_[0]);
 
   // Should not result in an additional "disconnected => connecting" broadcast.
@@ -753,7 +826,8 @@
 TEST_F(BleConnectionManagerTest, TestSuccessfulConnection_SendAndReceive) {
   FakeSecureChannel* channel =
       ConnectSuccessfully(test_devices_[0], kBluetoothAddress1,
-                          ConnectionReason::TETHER_AVAILABILITY_REQUEST);
+                          ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                          false /* is_background_advertisement */);
 
   int sequence_number =
       manager_->SendMessage(test_devices_[0].GetDeviceId(), "request1");
@@ -791,6 +865,13 @@
            STATE_CHANGE_DETAIL_DEVICE_WAS_UNREGISTERED}});
 }
 
+TEST_F(BleConnectionManagerTest,
+       TestSuccessfulConnection_BackgroundAdvertisement) {
+  ConnectSuccessfully(test_devices_[0], kBluetoothAddress1,
+                      ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                      true /* is_background_advertisement */);
+}
+
 // Test for fix to crbug.com/706640. This test will crash without the fix.
 TEST_F(BleConnectionManagerTest,
        TestSuccessfulConnection_MultipleAdvertisementsReceived) {
@@ -806,14 +887,20 @@
   fake_secure_channel_factory_->SetExpectedDeviceAddress(kBluetoothAddress1);
 
   // Simulate multiple advertisements being received:
-  NotifyReceivedAdvertisementFromDevice(kBluetoothAddress1, test_devices_[0]);
+  NotifyReceivedAdvertisementFromDevice(
+      kBluetoothAddress1, test_devices_[0],
+      false /* is_background_advertisement */);
   FakeSecureChannel* channel = GetChannelForDevice(test_devices_[0]);
 
-  NotifyReceivedAdvertisementFromDevice(kBluetoothAddress1, test_devices_[0]);
+  NotifyReceivedAdvertisementFromDevice(
+      kBluetoothAddress1, test_devices_[0],
+      false /* is_background_advertisement */);
   // Verify that a new channel has not been created:
   EXPECT_EQ(channel, GetChannelForDevice(test_devices_[0]));
 
-  NotifyReceivedAdvertisementFromDevice(kBluetoothAddress1, test_devices_[0]);
+  NotifyReceivedAdvertisementFromDevice(
+      kBluetoothAddress1, test_devices_[0],
+      false /* is_background_advertisement */);
   // Verify that a new channel has not been created:
   EXPECT_EQ(channel, GetChannelForDevice(test_devices_[0]));
 }
@@ -821,7 +908,8 @@
 TEST_F(BleConnectionManagerTest,
        TestSuccessfulConnection_MultipleConnectionReasons) {
   ConnectSuccessfully(test_devices_[0], kBluetoothAddress1,
-                      ConnectionReason::TETHER_AVAILABILITY_REQUEST);
+                      ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                      false /* is_background_advertisement */);
 
   // Now, register a different connection reason.
   manager_->RegisterRemoteDevice(test_devices_[0].GetDeviceId(),
@@ -877,7 +965,9 @@
   EXPECT_EQ(cryptauth::SecureChannel::Status::CONNECTING, status);
 
   fake_secure_channel_factory_->SetExpectedDeviceAddress(kBluetoothAddress1);
-  NotifyReceivedAdvertisementFromDevice(kBluetoothAddress1, test_devices_[0]);
+  NotifyReceivedAdvertisementFromDevice(
+      kBluetoothAddress1, test_devices_[0],
+      false /* is_background_advertisement */);
   FakeSecureChannel* channel = GetChannelForDevice(test_devices_[0]);
 
   channel->ChangeStatus(cryptauth::SecureChannel::Status::CONNECTING);
@@ -944,7 +1034,8 @@
        TestSuccessfulConnection_DisconnectsAfterConnection) {
   FakeSecureChannel* channel =
       ConnectSuccessfully(test_devices_[0], kBluetoothAddress1,
-                          ConnectionReason::TETHER_AVAILABILITY_REQUEST);
+                          ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                          false /* is_background_advertisement */);
 
   channel->ChangeStatus(cryptauth::SecureChannel::Status::DISCONNECTED);
   VerifyConnectionStateChanges(std::vector<SecureChannelStatusChange>{
@@ -1082,7 +1173,8 @@
 TEST_F(BleConnectionManagerTest, TwoDevices_OneConnects) {
   // Successfully connect to device 0.
   ConnectSuccessfully(test_devices_[0], kBluetoothAddress1,
-                      ConnectionReason::TETHER_AVAILABILITY_REQUEST);
+                      ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                      false /* is_background_advertisement */);
 
   // Register device 1.
   manager_->RegisterRemoteDevice(test_devices_[1].GetDeviceId(),
@@ -1141,11 +1233,13 @@
 TEST_F(BleConnectionManagerTest, TwoDevices_BothConnectSendAndReceive) {
   FakeSecureChannel* channel0 =
       ConnectSuccessfully(test_devices_[0], kBluetoothAddress1,
-                          ConnectionReason::TETHER_AVAILABILITY_REQUEST);
+                          ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                          false /* is_background_advertisement */);
 
   FakeSecureChannel* channel1 =
       ConnectSuccessfully(test_devices_[1], kBluetoothAddress2,
-                          ConnectionReason::TETHER_AVAILABILITY_REQUEST);
+                          ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                          false /* is_background_advertisement */);
 
   int sequence_number =
       manager_->SendMessage(test_devices_[0].GetDeviceId(), "request1_device0");
@@ -1246,8 +1340,9 @@
        BleConnectionManager::StateChangeDetail::STATE_CHANGE_DETAIL_NONE}});
 
   // Device 0 connects successfully.
-  FakeSecureChannel* channel0 =
-      ConnectChannel(test_devices_[0], kBluetoothAddress1);
+  FakeSecureChannel* channel0 = ReceiveAdvertisementAndConnectChannel(
+      test_devices_[0], kBluetoothAddress1,
+      false /* is_background_advertisement */);
 
   // Since device 0 has connected, advertising to that device is no longer
   // necessary. Device 2 should have filled up that advertising slot.
@@ -1274,7 +1369,8 @@
        BleConnectionManager::StateChangeDetail::STATE_CHANGE_DETAIL_NONE}});
 
   // Now, device 0 authenticates and sends and receives a message.
-  AuthenticateChannel(test_devices_[0]);
+  AuthenticateChannelAndResetClock(test_devices_[0],
+                                   false /* is_background_advertisement */);
   int sequence_number =
       manager_->SendMessage(test_devices_[0].GetDeviceId(), "request1");
   VerifyLastMessageSent(channel0, sequence_number, "request1", 1);
@@ -1318,8 +1414,9 @@
        BleConnectionManager::StateChangeDetail::STATE_CHANGE_DETAIL_NONE}});
 
   // Device 3 connects successfully.
-  FakeSecureChannel* channel3 =
-      ConnectChannel(test_devices_[3], kBluetoothAddress3);
+  FakeSecureChannel* channel3 = ReceiveAdvertisementAndConnectChannel(
+      test_devices_[3], kBluetoothAddress3,
+      false /* is_background_advertisement */);
 
   // Since device 3 has connected, device 2 starts connecting again.
   VerifyConnectionStateChanges(std::vector<SecureChannelStatusChange>{
@@ -1329,7 +1426,8 @@
        BleConnectionManager::StateChangeDetail::STATE_CHANGE_DETAIL_NONE}});
 
   // Now, device 3 authenticates and sends and receives a message.
-  AuthenticateChannel(test_devices_[3]);
+  AuthenticateChannelAndResetClock(test_devices_[3],
+                                   false /* is_background_advertisement */);
   sequence_number =
       manager_->SendMessage(test_devices_[3].GetDeviceId(), "request3");
   VerifyLastMessageSent(channel3, sequence_number, "request3", 1);
@@ -1393,7 +1491,8 @@
 TEST_F(BleConnectionManagerTest, ObserverUnregisters) {
   FakeSecureChannel* channel =
       ConnectSuccessfully(test_devices_[0], kBluetoothAddress1,
-                          ConnectionReason::TETHER_AVAILABILITY_REQUEST);
+                          ConnectionReason::TETHER_AVAILABILITY_REQUEST,
+                          false /* is_background_advertisement */);
 
   // Register two separate UnregisteringObservers. When a message is received,
   // the first observer will unregister the device.
diff --git a/chromeos/components/tether/ble_scanner.cc b/chromeos/components/tether/ble_scanner.cc
index dd69a51..5cff97a 100644
--- a/chromeos/components/tether/ble_scanner.cc
+++ b/chromeos/components/tether/ble_scanner.cc
@@ -22,9 +22,11 @@
 
 void BleScanner::NotifyReceivedAdvertisementFromDevice(
     const cryptauth::RemoteDevice& remote_device,
-    device::BluetoothDevice* bluetooth_device) {
+    device::BluetoothDevice* bluetooth_device,
+    bool is_background_advertisement) {
   for (auto& observer : observer_list_)
-    observer.OnReceivedAdvertisementFromDevice(remote_device, bluetooth_device);
+    observer.OnReceivedAdvertisementFromDevice(remote_device, bluetooth_device,
+                                               is_background_advertisement);
 }
 
 void BleScanner::NotifyDiscoverySessionStateChanged(
diff --git a/chromeos/components/tether/ble_scanner.h b/chromeos/components/tether/ble_scanner.h
index bdcf0b1..3ef0f9c 100644
--- a/chromeos/components/tether/ble_scanner.h
+++ b/chromeos/components/tether/ble_scanner.h
@@ -24,7 +24,8 @@
    public:
     virtual void OnReceivedAdvertisementFromDevice(
         const cryptauth::RemoteDevice& remote_device,
-        device::BluetoothDevice* bluetooth_device) {}
+        device::BluetoothDevice* bluetooth_device,
+        bool is_background_advertisement) {}
     virtual void OnDiscoverySessionStateChanged(bool discovery_session_active) {
     }
   };
@@ -53,7 +54,8 @@
  protected:
   void NotifyReceivedAdvertisementFromDevice(
       const cryptauth::RemoteDevice& remote_device,
-      device::BluetoothDevice* bluetooth_device);
+      device::BluetoothDevice* bluetooth_device,
+      bool is_background_advertisement);
   void NotifyDiscoverySessionStateChanged(bool discovery_session_active);
 
  private:
diff --git a/chromeos/components/tether/ble_scanner_impl.cc b/chromeos/components/tether/ble_scanner_impl.cc
index 278788a..dd2ba2ae 100644
--- a/chromeos/components/tether/ble_scanner_impl.cc
+++ b/chromeos/components/tether/ble_scanner_impl.cc
@@ -324,6 +324,7 @@
     device::BluetoothDevice* bluetooth_device,
     const std::string& service_data) {
   std::string device_id;
+  bool is_background_advertisement = false;
 
   // First try, identifying |service_data| as a foreground advertisement.
   if (service_data.size() >= kMinNumBytesInForegroundServiceData) {
@@ -343,6 +344,7 @@
     device_id = background_eid_generator_->IdentifyRemoteDeviceByAdvertisement(
         remote_beacon_seed_fetcher_, service_data,
         registered_remote_device_ids_);
+    is_background_advertisement = true;
   }
 
   // If the service data does not correspond to an advertisement from a device
@@ -351,14 +353,15 @@
     return;
 
   tether_host_fetcher_->FetchTetherHost(
-      device_id,
-      base::Bind(&BleScannerImpl::OnIdentifiedHostFetched,
-                 weak_ptr_factory_.GetWeakPtr(), bluetooth_device, device_id));
+      device_id, base::Bind(&BleScannerImpl::OnIdentifiedHostFetched,
+                            weak_ptr_factory_.GetWeakPtr(), bluetooth_device,
+                            device_id, is_background_advertisement));
 }
 
 void BleScannerImpl::OnIdentifiedHostFetched(
     device::BluetoothDevice* bluetooth_device,
     const std::string& device_id,
+    bool is_background_advertisement,
     std::unique_ptr<cryptauth::RemoteDevice> identified_device) {
   if (!identified_device) {
     PA_LOG(ERROR) << "Unable to fetch RemoteDevice object with ID \""
@@ -367,7 +370,8 @@
     return;
   }
 
-  NotifyReceivedAdvertisementFromDevice(*identified_device, bluetooth_device);
+  NotifyReceivedAdvertisementFromDevice(*identified_device, bluetooth_device,
+                                        is_background_advertisement);
 }
 
 void BleScannerImpl::ScheduleStatusChangeNotification(
diff --git a/chromeos/components/tether/ble_scanner_impl.h b/chromeos/components/tether/ble_scanner_impl.h
index 2b4e91e..e7f5d1c 100644
--- a/chromeos/components/tether/ble_scanner_impl.h
+++ b/chromeos/components/tether/ble_scanner_impl.h
@@ -135,6 +135,7 @@
   void OnIdentifiedHostFetched(
       device::BluetoothDevice* bluetooth_device,
       const std::string& device_id,
+      bool is_background_advertisement,
       std::unique_ptr<cryptauth::RemoteDevice> identified_device);
 
   void ScheduleStatusChangeNotification(bool discovery_session_active);
diff --git a/chromeos/components/tether/ble_scanner_impl_unittest.cc b/chromeos/components/tether/ble_scanner_impl_unittest.cc
index dd9fcab6..07741df 100644
--- a/chromeos/components/tether/ble_scanner_impl_unittest.cc
+++ b/chromeos/components/tether/ble_scanner_impl_unittest.cc
@@ -53,7 +53,8 @@
   // BleScanner::Observer:
   void OnReceivedAdvertisementFromDevice(
       const cryptauth::RemoteDevice& remote_device,
-      device::BluetoothDevice* bluetooth_device) override {
+      device::BluetoothDevice* bluetooth_device,
+      bool is_background_advertisement) override {
     device_addresses_.push_back(bluetooth_device->GetAddress());
     devices_.push_back(remote_device);
   }
@@ -88,7 +89,8 @@
 
   void OnReceivedAdvertisementFromDevice(
       const cryptauth::RemoteDevice& remote_device,
-      device::BluetoothDevice* bluetooth_device) override {}
+      device::BluetoothDevice* bluetooth_device,
+      bool is_background_advertisement) override {}
 
  private:
   std::unique_ptr<BleScannerImpl>& ble_scanner_;
diff --git a/chromeos/components/tether/fake_ble_scanner.cc b/chromeos/components/tether/fake_ble_scanner.cc
index c79b273..51f02dc 100644
--- a/chromeos/components/tether/fake_ble_scanner.cc
+++ b/chromeos/components/tether/fake_ble_scanner.cc
@@ -20,9 +20,10 @@
 
 void FakeBleScanner::NotifyReceivedAdvertisementFromDevice(
     const cryptauth::RemoteDevice& remote_device,
-    device::BluetoothDevice* bluetooth_device) {
-  BleScanner::NotifyReceivedAdvertisementFromDevice(remote_device,
-                                                    bluetooth_device);
+    device::BluetoothDevice* bluetooth_device,
+    bool is_background_advertisement) {
+  BleScanner::NotifyReceivedAdvertisementFromDevice(
+      remote_device, bluetooth_device, is_background_advertisement);
 }
 
 void FakeBleScanner::NotifyDiscoverySessionStateChanged(
diff --git a/chromeos/components/tether/fake_ble_scanner.h b/chromeos/components/tether/fake_ble_scanner.h
index b78d698..f6fcfe6 100644
--- a/chromeos/components/tether/fake_ble_scanner.h
+++ b/chromeos/components/tether/fake_ble_scanner.h
@@ -43,7 +43,8 @@
 
   void NotifyReceivedAdvertisementFromDevice(
       const cryptauth::RemoteDevice& remote_device,
-      device::BluetoothDevice* bluetooth_device);
+      device::BluetoothDevice* bluetooth_device,
+      bool is_background_advertisement);
   void NotifyDiscoverySessionStateChanged(bool discovery_session_active);
 
   // BleScanner:
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index a4d60c5..6993ae9 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -30,7 +30,9 @@
                                                      kDefaultConfigStr)),
       assistant_manager_internal_(
           UnwrapAssistantManagerInternal(assistant_manager_.get())),
-      display_connection_(std::make_unique<CrosDisplayConnection>(this)) {}
+      display_connection_(std::make_unique<CrosDisplayConnection>(this)),
+      main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+      weak_factory_(this) {}
 
 AssistantManagerServiceImpl::~AssistantManagerServiceImpl() {}
 
@@ -46,6 +48,59 @@
   running_ = true;
 }
 
+bool AssistantManagerServiceImpl::IsRunning() const {
+  return running_;
+}
+
+void AssistantManagerServiceImpl::SetAccessToken(
+    const std::string& access_token) {
+  // Push the |access_token| we got as an argument into AssistantManager before
+  // starting to ensure that all server requests will be authenticated once
+  // it is started. |user_id| is used to pair a user to their |access_token|,
+  // since we do not support multi-user in this example we can set it to a
+  // dummy value like "0".
+  assistant_manager_->SetAuthTokens({std::pair<std::string, std::string>(
+      /* user_id: */ "0", access_token)});
+}
+
+void AssistantManagerServiceImpl::EnableListening(bool enable) {
+  assistant_manager_->EnableListening(enable);
+}
+
+void AssistantManagerServiceImpl::SendTextQuery(const std::string& query) {
+  assistant_manager_internal_->SendTextQuery(query);
+}
+
+void AssistantManagerServiceImpl::AddAssistantEventSubscriber(
+    mojom::AssistantEventSubscriberPtr subscriber) {
+  subscribers_.AddPtr(std::move(subscriber));
+}
+
+void AssistantManagerServiceImpl::OnShowHtml(const std::string& html) {
+  main_thread_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&OnShowHtmlInternal, weak_factory_.GetWeakPtr(), html));
+}
+
+void AssistantManagerServiceImpl::OnShowText(const std::string& text) {
+  main_thread_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&OnShowTextInternal, weak_factory_.GetWeakPtr(), text));
+}
+
+void AssistantManagerServiceImpl::OnOpenUrl(const std::string& url) {
+  main_thread_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&OnOpenUrlInteranl, weak_factory_.GetWeakPtr(), url));
+}
+
+void AssistantManagerServiceImpl::OnSpeechLevelUpdated(
+    const float speech_level) {
+  main_thread_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&OnSpeechLevelUpdatedInternal,
+                                weak_factory_.GetWeakPtr(), speech_level));
+}
+
 void AssistantManagerServiceImpl::StartAssistantInternal(
     const std::string& access_token,
     const std::string& arc_version) {
@@ -82,51 +137,45 @@
   return user_agent;
 }
 
-bool AssistantManagerServiceImpl::IsRunning() const {
-  return running_;
+// static
+void AssistantManagerServiceImpl::OnShowHtmlInternal(
+    const base::WeakPtr<AssistantManagerServiceImpl>& self,
+    const std::string& html) {
+  if (self) {
+    self->subscribers_.ForAllPtrs(
+        [&html](auto* ptr) { ptr->OnHtmlResponse(html); });
+  }
 }
 
-void AssistantManagerServiceImpl::SetAccessToken(
-    const std::string& access_token) {
-  // Push the |access_token| we got as an argument into AssistantManager before
-  // starting to ensure that all server requests will be authenticated once
-  // it is started. |user_id| is used to pair a user to their |access_token|,
-  // since we do not support multi-user in this example we can set it to a
-  // dummy value like "0".
-  assistant_manager_->SetAuthTokens({std::pair<std::string, std::string>(
-      /* user_id: */ "0", access_token)});
+// static
+void AssistantManagerServiceImpl::OnShowTextInternal(
+    const base::WeakPtr<AssistantManagerServiceImpl>& self,
+    const std::string& text) {
+  if (self) {
+    self->subscribers_.ForAllPtrs(
+        [&text](auto* ptr) { ptr->OnTextResponse(text); });
+  }
 }
 
-void AssistantManagerServiceImpl::EnableListening(bool enable) {
-  assistant_manager_->EnableListening(enable);
+// static
+void AssistantManagerServiceImpl::OnOpenUrlInteranl(
+    const base::WeakPtr<AssistantManagerServiceImpl>& self,
+    const std::string& url) {
+  if (self) {
+    self->subscribers_.ForAllPtrs(
+        [&url](auto* ptr) { ptr->OnOpenUrlResponse(GURL(url)); });
+  }
 }
 
-void AssistantManagerServiceImpl::SendTextQuery(const std::string& query) {
-  assistant_manager_internal_->SendTextQuery(query);
-}
-
-void AssistantManagerServiceImpl::AddAssistantEventSubscriber(
-    mojom::AssistantEventSubscriberPtr subscriber) {
-  subscribers_.AddPtr(std::move(subscriber));
-}
-
-void AssistantManagerServiceImpl::OnShowHtml(const std::string& html) {
-  subscribers_.ForAllPtrs([&html](auto* ptr) { ptr->OnHtmlResponse(html); });
-}
-
-void AssistantManagerServiceImpl::OnShowText(const std::string& text) {
-  subscribers_.ForAllPtrs([&text](auto* ptr) { ptr->OnTextResponse(text); });
-}
-
-void AssistantManagerServiceImpl::OnOpenUrl(const std::string& url) {
-  subscribers_.ForAllPtrs(
-      [&url](auto* ptr) { ptr->OnOpenUrlResponse(GURL(url)); });
-}
-
-void AssistantManagerServiceImpl::OnSpeechLevelUpdated(
+// static
+void AssistantManagerServiceImpl::OnSpeechLevelUpdatedInternal(
+    const base::WeakPtr<AssistantManagerServiceImpl>& self,
     const float speech_level) {
-  subscribers_.ForAllPtrs(
-      [&speech_level](auto* ptr) { ptr->OnSpeechLevelUpdated(speech_level); });
+  if (self) {
+    self->subscribers_.ForAllPtrs([&speech_level](auto* ptr) {
+      ptr->OnSpeechLevelUpdated(speech_level);
+    });
+  }
 }
 
 }  // namespace assistant
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h
index e6c0ae1..ae497a7 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.h
+++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -55,6 +55,23 @@
   void OnSpeechLevelUpdated(float speech_level) override;
 
  private:
+  void StartAssistantInternal(const std::string& access_token,
+                              const std::string& arc_version);
+  std::string BuildUserAgent(const std::string& arc_version) const;
+
+  static void OnShowHtmlInternal(
+      const base::WeakPtr<AssistantManagerServiceImpl>& self,
+      const std::string& html);
+  static void OnShowTextInternal(
+      const base::WeakPtr<AssistantManagerServiceImpl>& self,
+      const std::string& text);
+  static void OnOpenUrlInteranl(
+      const base::WeakPtr<AssistantManagerServiceImpl>& self,
+      const std::string& url);
+  static void OnSpeechLevelUpdatedInternal(
+      const base::WeakPtr<AssistantManagerServiceImpl>& self,
+      const float speech_level);
+
   bool running_ = false;
   PlatformApiImpl platform_api_;
   std::unique_ptr<action::CrosActionModule> action_module_;
@@ -62,10 +79,8 @@
   assistant_client::AssistantManagerInternal* const assistant_manager_internal_;
   std::unique_ptr<CrosDisplayConnection> display_connection_;
   mojo::InterfacePtrSet<mojom::AssistantEventSubscriber> subscribers_;
-
-  void StartAssistantInternal(const std::string& access_token,
-                              const std::string& arc_version);
-  std::string BuildUserAgent(const std::string& arc_version) const;
+  scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
+  base::WeakPtrFactory<AssistantManagerServiceImpl> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(AssistantManagerServiceImpl);
 };
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index f9d8ed44..f33a68ec 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -427,6 +427,9 @@
   if (id != autofill_query_id_ && id != kNoQueryId)
     return;
 
+  if (base::FeatureList::IsEnabled(features::kAutofillDynamicForms))
+    ReplaceElementIfNowInvalid(form);
+
   was_query_node_autofilled_ = element_.IsAutofilled();
   form_util::FillForm(form, element_);
   if (!element_.Form().IsNull())
@@ -986,6 +989,47 @@
   submitted_forms_.clear();
 }
 
+void AutofillAgent::ReplaceElementIfNowInvalid(const FormData& original_form) {
+  // If the document is invalid, bail out.
+  if (element_.GetDocument().IsNull())
+    return;
+
+  if (!element_.Form().IsNull()) {
+    // If |element_|'s parent form has no elements, |element_| is now invalid
+    // and should be updated.
+    WebVector<WebFormControlElement> form_elements;
+    element_.Form().GetFormControlElements(form_elements);
+    if (!form_elements.empty())
+      return;
+  }
+
+  // Try to find the new version of the form.
+  WebFormElement form_element;
+  WebVector<WebFormElement> forms;
+  element_.GetDocument().Forms(forms);
+  for (const WebFormElement& form : forms) {
+    if (original_form.name == form.GetName().Utf16() ||
+        original_form.name == form.GetAttribute("id").Utf16()) {
+      form_element = form;
+      break;
+    }
+  }
+
+  // Could not find the new version of the form, bail out.
+  if (form_element.IsNull())
+    return;
+
+  // Try to find the new version of the last interacted element.
+  WebVector<WebFormControlElement> elements;
+  form_element.GetFormControlElements(elements);
+  for (const WebFormControlElement& element : elements) {
+    if (element_.NameForAutofill() == element.NameForAutofill()) {
+      element_ = element;
+      return;
+    }
+  }
+}
+
 const mojom::AutofillDriverPtr& AutofillAgent::GetAutofillDriver() {
   if (!autofill_driver_) {
     render_frame()->GetRemoteInterfaces()->GetInterface(
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index 683acecd..161c35d 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -258,6 +258,11 @@
   // cleared in this method.
   void OnFormNoLongerSubmittable();
 
+  // Check whether |element_| was removed or replaced dynamically on the page.
+  // If so, looks for the same element in the updated |form| and replaces the
+  // |element_| with it if it's found.
+  void ReplaceElementIfNowInvalid(const FormData& form);
+
   // Formerly cached forms for all frames, now only caches forms for the current
   // frame.
   FormCache form_cache_;
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 1992454..b3674d100 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -58,6 +58,7 @@
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_data_validation.h"
+#include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_pref_names.h"
 #include "components/autofill/core/common/autofill_util.h"
 #include "components/autofill/core/common/form_data.h"
@@ -92,6 +93,13 @@
 // cache, simply to prevent unbounded memory consumption.
 const size_t kMaxFormCacheSize = 100;
 
+// Time to wait, in ms, after a dynamic form change before triggering a refill.
+// This is used for sites that change multiple things consecutively.
+const size_t kWaitTimeForDynamicFormsMs = 200;
+
+// The time limit, in ms, between a fill and when a refill can happen.
+const int kLimitBeforeRefillMs = 1000;
+
 // Precondition: |form_structure| and |form| should correspond to the same
 // logical form.  Returns true if any field in the given |section| within |form|
 // is auto-filled.
@@ -191,6 +199,17 @@
 
 }  // namespace
 
+AutofillManager::FillingContext::FillingContext() = default;
+
+AutofillManager::FillingContext::~FillingContext() = default;
+
+void AutofillManager::FillingContext::Reset() {
+  attempted_refill = false;
+  filled_form_name.clear();
+  filled_field_name.clear();
+  type_groups_to_refill.clear();
+}
+
 AutofillManager::AutofillManager(
     AutofillDriver* driver,
     AutofillClient* client,
@@ -549,7 +568,10 @@
   }
 
   std::vector<Suggestion> suggestions;
-  const bool is_context_secure = !IsFormNonSecure(form);
+  const bool is_context_secure =
+      !IsFormNonSecure(form) ||
+      !base::FeatureList::IsEnabled(
+          features::kAutofillRequireSecureCreditCardContext);
   const bool is_http_warning_enabled =
       security_state::IsHttpWarningInFormEnabled();
 
@@ -748,10 +770,19 @@
   AutofillField* autofill_field = nullptr;
   if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field))
     return;
-  if (action == AutofillDriver::FORM_DATA_ACTION_FILL)
+  if (action == AutofillDriver::FORM_DATA_ACTION_FILL) {
     address_form_event_logger_->OnDidFillSuggestion(
         profile, form_structure->form_parsed_timestamp());
 
+    // Set up the information needed for an eventual refill.
+    if (base::FeatureList::IsEnabled(features::kAutofillDynamicForms)) {
+      filling_context_.temp_data_model = profile;
+      filling_context_.filled_form_name = form_structure->form_name();
+      filling_context_.filled_field_name = autofill_field->unique_name();
+      filling_context_.original_fill_time = base::TimeTicks::Now();
+    }
+  }
+
   FillOrPreviewDataModelForm(
       action, query_id, form, field, profile, false /* is_credit_card */,
       base::string16() /* cvc */, form_structure, autofill_field);
@@ -789,8 +820,14 @@
     return;
   }
 
-  FillOrPreviewDataModelForm(AutofillDriver::FORM_DATA_ACTION_FILL, query_id,
-                             form, field, credit_card, true, cvc);
+  FormStructure* form_structure = nullptr;
+  AutofillField* autofill_field = nullptr;
+  if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field))
+    return;
+
+  FillOrPreviewDataModelForm(
+      AutofillDriver::FORM_DATA_ACTION_FILL, query_id, form, field, credit_card,
+      true /* is_credit_card */, cvc, form_structure, autofill_field);
 }
 
 void AutofillManager::OnFocusNoLongerOnForm() {
@@ -1167,6 +1204,7 @@
   forms_loaded_timestamps_.clear();
   initial_interaction_timestamp_ = TimeTicks();
   external_delegate_->Reset();
+  filling_context_.Reset();
 }
 
 AutofillManager::AutofillManager(
@@ -1298,26 +1336,10 @@
     const FormFieldData& field,
     const AutofillDataModel& data_model,
     bool is_credit_card,
-    const base::string16& cvc) {
-  FormStructure* form_structure = nullptr;
-  AutofillField* autofill_field = nullptr;
-  if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field))
-    return;
-  FillOrPreviewDataModelForm(action, query_id, form, field, data_model,
-                             is_credit_card, cvc, form_structure,
-                             autofill_field);
-}
-
-void AutofillManager::FillOrPreviewDataModelForm(
-    AutofillDriver::RendererFormDataAction action,
-    int query_id,
-    const FormData& form,
-    const FormFieldData& field,
-    const AutofillDataModel& data_model,
-    bool is_credit_card,
     const base::string16& cvc,
     FormStructure* form_structure,
-    AutofillField* autofill_field) {
+    AutofillField* autofill_field,
+    bool is_refill) {
   DCHECK(form_structure);
   DCHECK(autofill_field);
 
@@ -1329,6 +1351,16 @@
 
   DCHECK_EQ(form_structure->field_count(), form.fields.size());
 
+  // Only record the types that are filled for an eventual refill if all the
+  // following are satisfied:
+  //  The refilling feature is enabled.
+  //  A refill has not been attempted yet.
+  //  This fill is not a refill attempt.
+  //  This is not a credit card fill.
+  bool could_attempt_refill =
+      base::FeatureList::IsEnabled(features::kAutofillDynamicForms) &&
+      !filling_context_.attempted_refill && !is_refill && !is_credit_card;
+
   for (size_t i = 0; i < form_structure->field_count(); ++i) {
     if (form_structure->field(i)->section() != autofill_field->section())
       continue;
@@ -1345,21 +1377,27 @@
 
     // Don't fill non-focusable fields, with the exception of <select> fields.
     if (!cached_field->is_focusable &&
-        result.fields[i].form_control_type != "select-one")
-      continue;
-
-    if (cached_field->role == FormFieldData::ROLE_ATTRIBUTE_PRESENTATION) {
+        result.fields[i].form_control_type != "select-one") {
       continue;
     }
 
+    if (cached_field->role == FormFieldData::ROLE_ATTRIBUTE_PRESENTATION)
+      continue;
+
     // Don't fill previously autofilled fields.
-    if (result.fields[i].is_autofilled && !cached_field->SameFieldAs(field)) {
+    if (result.fields[i].is_autofilled && !cached_field->SameFieldAs(field))
       continue;
-    }
 
     if (field_group_type == NO_GROUP)
       continue;
 
+    // On a refill, only fill fields from type groups that were present during
+    // the initial fill.
+    if (is_refill && !base::ContainsKey(filling_context_.type_groups_to_refill,
+                                        field_group_type)) {
+      continue;
+    }
+
     // Don't fill expired cards expiration date.
     if (IsCreditCardExpirationType(cached_field->Type().GetStorableType()) &&
         static_cast<const CreditCard*>(&data_model)
@@ -1367,6 +1405,9 @@
       continue;
     }
 
+    if (could_attempt_refill)
+      filling_context_.type_groups_to_refill.insert(field_group_type);
+
     // Must match ForEachMatchingFormField() in form_autofill_util.cc.
     // Only notify autofilling of empty fields and the field that initiated
     // the filling (note that "select-one" controls may not be empty but will
@@ -1617,6 +1658,22 @@
 
     AutofillMetrics::LogParseFormTiming(TimeTicks::Now() -
                                         parse_form_start_time);
+
+    // If a form with the same name was previously filled, and there has not
+    // been a refill attempt yet, start the process of triggering a refill.
+    if (ShouldTriggerRefill(*form_structure)) {
+      // If a timer for the refill was already running, it means the form
+      // changed again. Stop the timer and start it again.
+      if (filling_context_.on_refill_timer.IsRunning())
+        filling_context_.on_refill_timer.AbandonAndStop();
+
+      filling_context_.on_refill_timer.Start(
+          FROM_HERE,
+          base::TimeDelta::FromMilliseconds(kWaitTimeForDynamicFormsMs),
+          base::BindRepeating(&AutofillManager::TriggerRefill,
+                              weak_ptr_factory_.GetWeakPtr(), form,
+                              form_structure));
+    }
   }
 
   if (!queryable_forms.empty() || !non_queryable_forms.empty()) {
@@ -1942,6 +1999,44 @@
   }
 }
 
+bool AutofillManager::ShouldTriggerRefill(const FormStructure& form_structure) {
+  if (!base::FeatureList::IsEnabled(features::kAutofillDynamicForms))
+    return false;
+
+  base::TimeTicks now = base::TimeTicks::Now();
+  base::TimeDelta delta = now - filling_context_.original_fill_time;
+  return !filling_context_.attempted_refill &&
+         !filling_context_.filled_form_name.empty() &&
+         filling_context_.filled_form_name == form_structure.form_name() &&
+         delta.InMilliseconds() < kLimitBeforeRefillMs;
+}
+
+void AutofillManager::TriggerRefill(const FormData& form,
+                                    FormStructure* form_structure) {
+  filling_context_.attempted_refill = true;
+
+  // Try to find the field from which the original field originated.
+  AutofillField* autofill_field = nullptr;
+  for (const std::unique_ptr<AutofillField>& field : *form_structure) {
+    if (field->unique_name() == filling_context_.filled_field_name) {
+      autofill_field = field.get();
+      break;
+    }
+  }
+
+  // If it was not found cancel the refill.
+  if (!autofill_field)
+    return;
+
+  FormFieldData field = *autofill_field;
+  base::string16 cvc;
+  FillOrPreviewDataModelForm(
+      AutofillDriver::RendererFormDataAction::FORM_DATA_ACTION_FILL,
+      /*query_id=*/-1, form, field, filling_context_.temp_data_model,
+      /*is_credit_card=*/false, cvc, form_structure, autofill_field,
+      /*is_refill=*/true);
+}
+
 AutofillMetrics::CardNumberStatus AutofillManager::GetCardNumberStatus(
     CreditCard& credit_card) {
   base::string16 number = credit_card.number();
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h
index d0f12d2c..e74cae3d 100644
--- a/components/autofill/core/browser/autofill_manager.h
+++ b/components/autofill/core/browser/autofill_manager.h
@@ -18,6 +18,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autocomplete_history_manager.h"
 #include "components/autofill/core/browser/autofill_client.h"
@@ -287,6 +288,28 @@
   }
 
  private:
+  struct FillingContext {
+    FillingContext();
+    ~FillingContext();
+
+    void Reset();
+
+    // Whether a refill attempts was made on that page.
+    bool attempted_refill = false;
+    // The profile that was used for the initial fill.
+    AutofillProfile temp_data_model;
+    // The name of the form that was initially filled.
+    base::string16 filled_form_name;
+    // The name of the field that was initially filled.
+    base::string16 filled_field_name;
+    // The time at which the initial fill occured.
+    base::TimeTicks original_fill_time;
+    // The timer used to trigger a refill.
+    base::OneShotTimer on_refill_timer;
+    // The field type groups that were initially filled.
+    std::set<FieldTypeGroup> type_groups_to_refill;
+  };
+
   // AutofillDownloadManager::Observer:
   void OnLoadedServerPredictions(
       std::string response,
@@ -344,9 +367,6 @@
                                 const FormFieldData& field,
                                 const AutofillProfile& profile);
 
-  // TODO(rogerm) here to see if these can be merged. FormData should be a
-  // subset of the data in FormStructure and FormFieldData a subset of that in
-  // AutofillField.
   // Fills or previews |data_model| in the |form|.
   void FillOrPreviewDataModelForm(AutofillDriver::RendererFormDataAction action,
                                   int query_id,
@@ -354,16 +374,10 @@
                                   const FormFieldData& field,
                                   const AutofillDataModel& data_model,
                                   bool is_credit_card,
-                                  const base::string16& cvc);
-  void FillOrPreviewDataModelForm(AutofillDriver::RendererFormDataAction action,
-                                  int query_id,
-                                  const FormData& form,
-                                  const FormFieldData& field,
-                                  const AutofillDataModel& data_model,
-                                  bool is_credit_card,
                                   const base::string16& cvc,
                                   FormStructure* form_structure,
-                                  AutofillField* autofill_field);
+                                  AutofillField* autofill_field,
+                                  bool is_refill = false);
 
   // Creates a FormStructure using the FormData received from the renderer. Will
   // return an empty scoped_ptr if the data should not be processed for upload
@@ -469,6 +483,18 @@
   AutofillMetrics::CardNumberStatus GetCardNumberStatus(
       CreditCard& credit_card);
 
+  // Whether there should be an attemps to refill the form. Returns true if all
+  // the following are satisfied:
+  //  There have been no refill on that page yet.
+  //  A non empty form name was recorded in a previous fill
+  //  That form name matched the currently parsed form name
+  //  It's been less than kLimitBeforeRefillMs since the original fill.
+  bool ShouldTriggerRefill(const FormStructure& form_structure);
+
+  // Attempts to refill the form that was changed dynamically. Should only be
+  // called if ShouldTriggerRefill returns true.
+  void TriggerRefill(const FormData& form, FormStructure* form_structure);
+
   AutofillClient* const client_;
 
   // Handles Payments service requests.
@@ -565,6 +591,9 @@
   AutofillAssistant autofill_assistant_;
 #endif
 
+  // Filling context used for dynamic fills.
+  FillingContext filling_context_;
+
   base::WeakPtrFactory<AutofillManager> weak_ptr_factory_;
 
   friend class AutofillManagerTest;
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
index dd5aca9..becc128 100644
--- a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
+++ b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
@@ -11,6 +11,7 @@
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/legal_message_line.h"
 #include "components/autofill/core/common/autofill_constants.h"
+#include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_pref_names.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/infobars/core/infobar.h"
@@ -53,6 +54,10 @@
       return;
     }
   }
+  if (IsGooglePayBrandingEnabled()) {
+    card_label_ = card.NetworkForDisplay() + base::string16(kMidlineEllipsis) +
+                  card.LastFourDigits();
+  }
 
   AutofillMetrics::LogCreditCardInfoBarMetric(
       AutofillMetrics::INFOBAR_SHOWN, upload_,
@@ -77,18 +82,40 @@
   return !upload_ || !legal_messages_.empty();
 }
 
+bool AutofillSaveCardInfoBarDelegateMobile::IsGooglePayBrandingEnabled() const {
+  return upload_ &&
+         base::FeatureList::IsEnabled(
+             features::kAutofillUpstreamUseGooglePayOnAndroidBranding);
+}
+
+base::string16 AutofillSaveCardInfoBarDelegateMobile::GetTitleText() const {
+  return l10n_util::GetStringUTF16(
+      IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V3);
+}
+
+base::string16 AutofillSaveCardInfoBarDelegateMobile::GetDescriptionText()
+    const {
+  return l10n_util::GetStringUTF16(
+      IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V2);
+}
+
 int AutofillSaveCardInfoBarDelegateMobile::GetIconId() const {
-  return IDR_INFOBAR_AUTOFILL_CC;
+  return IsGooglePayBrandingEnabled() ? 0 : IDR_INFOBAR_AUTOFILL_CC;
 }
 
 base::string16 AutofillSaveCardInfoBarDelegateMobile::GetMessageText() const {
+  if (IsGooglePayBrandingEnabled()) {
+    return base::string16();
+  }
   return l10n_util::GetStringUTF16(
       upload_ ? IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD
               : IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_LOCAL);
 }
 
 base::string16 AutofillSaveCardInfoBarDelegateMobile::GetLinkText() const {
-  return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
+  return IsGooglePayBrandingEnabled()
+             ? base::string16()
+             : l10n_util::GetStringUTF16(IDS_LEARN_MORE);
 }
 
 infobars::InfoBarDelegate::InfoBarIdentifier
@@ -128,7 +155,7 @@
 }
 
 GURL AutofillSaveCardInfoBarDelegateMobile::GetLinkURL() const {
-  return GURL(kHelpURL);
+  return IsGooglePayBrandingEnabled() ? GURL() : GURL(kHelpURL);
 }
 
 void AutofillSaveCardInfoBarDelegateMobile::LogUserAction(
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h
index 8b6c119..0d4d63c 100644
--- a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h
+++ b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h
@@ -49,6 +49,14 @@
   // Legal messages are only specified for the upload case, not for local save.
   bool LegalMessagesParsedSuccessfully();
 
+  // Google Pay branding is enabled with a flag and only for cards upstreamed
+  // to Google.
+  bool IsGooglePayBrandingEnabled() const;
+
+  // All following changes are with respect to Google Pay branding.
+  base::string16 GetTitleText() const;
+  base::string16 GetDescriptionText() const;
+
   // ConfirmInfoBarDelegate:
   int GetIconId() const override;
   base::string16 GetMessageText() const override;
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index 17610833..df69471 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -12,6 +12,14 @@
 const base::Feature kAutofillAddressNormalizer{
     "AutofillAddressNormalizer", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Controls whether credit card suggestions are made on insecure pages.
+const base::Feature kAutofillRequireSecureCreditCardContext{
+    "AutofillRequireSecureCreditCardContext", base::FEATURE_ENABLED_BY_DEFAULT};
+
+// Controls whether Autofill attemps to fill dynamically changing forms.
+const base::Feature kAutofillDynamicForms{"AutofillDynamicForms",
+                                          base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Controls whether or not a minimum number of fields is required before
 // heuristic field type prediction is run for a form.
 const base::Feature kAutofillEnforceMinRequiredFieldsForHeuristics{
@@ -47,5 +55,11 @@
 const base::Feature kAutofillSkipComparingInferredLabels{
     "AutofillSkipComparingInferredLabels", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Controls whether the credit card upload bubble shows the Google Pay logo and
+// a shorter "Save card?" header message on Android.
+const base::Feature kAutofillUpstreamUseGooglePayOnAndroidBranding{
+    "AutofillUpstreamUseGooglePayOnAndroidBranding",
+    base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace autofill
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index 38d613e..3d32bcf 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -12,12 +12,15 @@
 
 // All features in alphabetical order.
 extern const base::Feature kAutofillAddressNormalizer;
+extern const base::Feature kAutofillRequireSecureCreditCardContext;
+extern const base::Feature kAutofillDynamicForms;
 extern const base::Feature kAutofillEnforceMinRequiredFieldsForHeuristics;
 extern const base::Feature kAutofillEnforceMinRequiredFieldsForQuery;
 extern const base::Feature kAutofillEnforceMinRequiredFieldsForUpload;
 extern const base::Feature kAutofillRestrictUnownedFieldsToFormlessCheckout;
 extern const base::Feature kAutofillShowTypePredictions;
 extern const base::Feature kAutofillSkipComparingInferredLabels;
+extern const base::Feature kAutofillUpstreamUseGooglePayOnAndroidBranding;
 
 }  // namespace features
 }  // namespace autofill
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm
index 8c2211a..0022f8d24 100644
--- a/components/autofill/ios/browser/autofill_agent.mm
+++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -33,6 +33,7 @@
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/autofill/ios/browser/autofill_driver_ios.h"
+#include "components/autofill/ios/browser/autofill_util.h"
 #import "components/autofill/ios/browser/form_suggestion.h"
 #import "components/autofill/ios/browser/js_autofill_manager.h"
 #include "components/prefs/pref_service.h"
@@ -115,20 +116,6 @@
                        pageURL:(const GURL&)pageURL
              completionHandler:(FetchFormsCompletionHandler)completionHandler;
 
-// Processes the JSON form data extracted from the page into the format expected
-// by AutofillManager and fills it in |formsData|.
-// |formsData| cannot be nil.
-// |filtered| and |formName| limit the field that will be returned in
-// |formData|. See
-// |fetchFormsFiltered:withName:minimumRequiredFieldsCount:pageURL:
-// completionHandler:| for details.
-// Returns a BOOL indicating the success value and the vector of form data.
-- (BOOL)getExtractedFormsData:(FormDataVector*)formsData
-                     fromJSON:(NSString*)formJSON
-                     filtered:(BOOL)filtered
-                     formName:(const base::string16&)formName
-                      pageURL:(const GURL&)pageURL;
-
 // Processes the JSON form data extracted from the page when form activity is
 // detected and informs the AutofillManager.
 - (void)processFormActivityExtractedData:(const FormDataVector&)forms
@@ -263,72 +250,6 @@
       ->autofill_manager();
 }
 
-// Extracts a single form field from the JSON dictionary into a FormFieldData
-// object.
-// Returns NO if the field could not be extracted.
-- (BOOL)extractFormField:(const base::DictionaryValue&)field
-             asFieldData:(autofill::FormFieldData*)fieldData {
-  if (!field.GetString("name", &fieldData->name) ||
-      !field.GetString("identifier", &fieldData->id) ||
-      !field.GetString("form_control_type", &fieldData->form_control_type)) {
-    return NO;
-  }
-
-  // Optional fields.
-  field.GetString("label", &fieldData->label);
-  field.GetString("value", &fieldData->value);
-  field.GetString("autocomplete_attribute", &fieldData->autocomplete_attribute);
-
-  int maxLength;
-  if (field.GetInteger("max_length", &maxLength))
-    fieldData->max_length = maxLength;
-
-  field.GetBoolean("is_autofilled", &fieldData->is_autofilled);
-
-  // TODO(crbug.com/427614): Extract |is_checked|.
-  bool isCheckable = false;
-  field.GetBoolean("is_checkable", &isCheckable);
-  autofill::SetCheckStatus(fieldData, isCheckable, false);
-
-  field.GetBoolean("is_focusable", &fieldData->is_focusable);
-  field.GetBoolean("should_autocomplete", &fieldData->should_autocomplete);
-
-  // ROLE_ATTRIBUTE_OTHER is the default value. The only other value as of this
-  // writing is ROLE_ATTRIBUTE_PRESENTATION.
-  int role;
-  if (field.GetInteger("role", &role) &&
-      role == autofill::AutofillField::ROLE_ATTRIBUTE_PRESENTATION) {
-    fieldData->role = autofill::AutofillField::ROLE_ATTRIBUTE_PRESENTATION;
-  }
-
-  // TODO(crbug.com/427614): Extract |text_direction|.
-
-  // Load option values where present.
-  const base::ListValue* optionValues;
-  if (field.GetList("option_values", &optionValues)) {
-    for (const auto& optionValue : *optionValues) {
-      base::string16 value;
-      if (optionValue.GetAsString(&value))
-        fieldData->option_values.push_back(value);
-    }
-  }
-
-  // Load option contents where present.
-  const base::ListValue* optionContents;
-  if (field.GetList("option_contents", &optionContents)) {
-    for (const auto& optionContent : *optionContents) {
-      base::string16 content;
-      if (optionContent.GetAsString(&content))
-        fieldData->option_contents.push_back(content);
-    }
-  }
-
-  if (fieldData->option_values.size() != fieldData->option_contents.size())
-    return NO;  // Option values and contents lists should match 1-1.
-
-  return YES;
-}
-
 - (void)notifyAutofillManager:(autofill::AutofillManager*)autofillManager
                   ofFormsSeen:(const FormDataVector&)forms {
   DCHECK(autofillManager);
@@ -360,108 +281,17 @@
   // Necessary so the values can be used inside a block.
   base::string16 formNameCopy = formName;
   GURL pageURLCopy = pageURL;
-  __weak AutofillAgent* weakSelf = self;
   [jsAutofillManager_
       fetchFormsWithMinimumRequiredFieldsCount:requiredFieldsCount
                              completionHandler:^(NSString* formJSON) {
                                std::vector<autofill::FormData> formData;
-                               BOOL success =
-                                   [weakSelf getExtractedFormsData:&formData
-                                                          fromJSON:formJSON
-                                                          filtered:filtered
-                                                          formName:formNameCopy
-                                                           pageURL:pageURLCopy];
+                               bool success = autofill::ExtractFormsData(
+                                   formJSON, filtered, formNameCopy,
+                                   pageURLCopy, &formData);
                                completionHandler(success, formData);
                              }];
 }
 
-- (BOOL)getExtractedFormsData:(FormDataVector*)formsData
-                     fromJSON:(NSString*)formJSON
-                     filtered:(BOOL)filtered
-                     formName:(const base::string16&)formName
-                      pageURL:(const GURL&)pageURL {
-  DCHECK(formsData);
-  // Convert JSON string to JSON object |dataJson|.
-  int errorCode = 0;
-  std::string errorMessage;
-  std::unique_ptr<base::Value> dataJson(base::JSONReader::ReadAndReturnError(
-      base::SysNSStringToUTF8(formJSON), base::JSON_PARSE_RFC, &errorCode,
-      &errorMessage));
-  if (errorCode) {
-    LOG(WARNING) << "JSON parse error in form extraction: "
-                 << errorMessage.c_str();
-    return NO;
-  }
-
-  // Returned data should be a list of forms.
-  const base::ListValue* formsList;
-  if (!dataJson->GetAsList(&formsList))
-    return NO;
-
-  // Iterate through all the extracted forms and copy the data from JSON into
-  // AutofillManager structures.
-  for (const auto& formDict : *formsList) {
-    // Each form list entry should be a JSON dictionary.
-    const base::DictionaryValue* formData;
-    if (!formDict.GetAsDictionary(&formData))
-      return NO;
-
-    // Form data is copied into a FormData object field-by-field.
-    autofill::FormData form;
-    if (!formData->GetString("name", &form.name))
-      return NO;
-    if (filtered && formName != form.name)
-      continue;
-
-    // Origin is mandatory.
-    base::string16 origin;
-    if (!formData->GetString("origin", &origin))
-      return NO;
-
-    // Use GURL object to verify origin of host page URL.
-    form.origin = GURL(origin);
-    if (form.origin.GetOrigin() != pageURL.GetOrigin()) {
-      LOG(WARNING) << "Form extraction aborted due to same origin policy";
-      return NO;
-    }
-
-    // main_frame_origin is used for logging UKM.
-    form.main_frame_origin = url::Origin::Create(pageURL);
-
-    // Action is optional.
-    base::string16 action;
-    formData->GetString("action", &action);
-    form.action = GURL(action);
-
-    // Is form tag is optional.
-    bool is_form_tag;
-    if (formData->GetBoolean("is_form_tag", &is_form_tag))
-      form.is_form_tag = is_form_tag;
-
-    // Is formless checkout tag is optional.
-    bool is_formless_checkout;
-    if (formData->GetBoolean("is_formless_checkout", &is_formless_checkout))
-      form.is_formless_checkout = is_formless_checkout;
-
-    // Field list (mandatory) is extracted.
-    const base::ListValue* fieldsList;
-    if (!formData->GetList("fields", &fieldsList))
-      return NO;
-    for (const auto& fieldDict : *fieldsList) {
-      const base::DictionaryValue* field;
-      autofill::FormFieldData fieldData;
-      if (fieldDict.GetAsDictionary(&field) &&
-          [self extractFormField:*field asFieldData:&fieldData]) {
-        form.fields.push_back(fieldData);
-      } else {
-        return NO;
-      }
-    }
-    formsData->push_back(form);
-  }
-  return YES;
-}
-
 - (NSArray*)processSuggestions:(NSArray*)suggestions {
   // The suggestion array is cloned (to claim ownership) and to slightly
   // reorder; a future improvement is to base order on text typed in other
diff --git a/components/autofill/ios/browser/autofill_util.h b/components/autofill/ios/browser/autofill_util.h
index 828c811..f34cc8f 100644
--- a/components/autofill/ios/browser/autofill_util.h
+++ b/components/autofill/ios/browser/autofill_util.h
@@ -5,13 +5,53 @@
 #ifndef COMPONENTS_AUTOFILL_IOS_BROWSER_AUTOFILL_UTIL_H_
 #define COMPONENTS_AUTOFILL_IOS_BROWSER_AUTOFILL_UTIL_H_
 
+#include <vector>
+
 #import "ios/web/public/web_state/web_state.h"
 
+class GURL;
+
 namespace autofill {
 
+struct FormData;
+struct FormFieldData;
+
 // Checks if current context is secure from an autofill standpoint.
 bool IsContextSecureForWebState(web::WebState* web_state);
 
+// Tries to parse a JSON string into base::Value. Returns nullptr if parsing is
+// unsuccessful.
+std::unique_ptr<base::Value> ParseJson(NSString* json_string);
+
+// Processes the JSON form data extracted from the page into the format expected
+// by AutofillManager and fills it in |forms_data|.
+// |forms_data| cannot be nil.
+// |filtered| and |form_name| limit the field that will be returned in
+// |forms_data|.
+// Returns a bool indicating the success value and the vector of form data.
+bool ExtractFormsData(NSString* form_json,
+                      bool filtered,
+                      const base::string16& form_name,
+                      const GURL& page_url,
+                      std::vector<FormData>* forms_data);
+
+// Converts |form| into |form_data|.
+// Returns false if a form can not be extracted.
+// Returns false if |filtered| == true and |form["name"]| != |formName|.
+// Returns false if |form["origin"]| != |page_url|.
+// Returns true if the conversion succeeds.
+bool ExtractFormData(const base::Value& form,
+                     bool filtered,
+                     const base::string16& form_name,
+                     const GURL& page_url,
+                     FormData* form_data);
+
+// Extracts a single form field from the JSON dictionary into a FormFieldData
+// object.
+// Returns false if the field could not be extracted.
+bool ExtractFormFieldData(const base::DictionaryValue& field,
+                          FormFieldData* field_data);
+
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_IOS_BROWSER_AUTOFILL_UTIL_H_
diff --git a/components/autofill/ios/browser/autofill_util.mm b/components/autofill/ios/browser/autofill_util.mm
index 1fa0772..869efa7b 100644
--- a/components/autofill/ios/browser/autofill_util.mm
+++ b/components/autofill/ios/browser/autofill_util.mm
@@ -4,9 +4,21 @@
 
 #include "components/autofill/ios/browser/autofill_util.h"
 
+#include <utility>
+
+#include "base/json/json_reader.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#include "components/autofill/core/browser/autofill_field.h"
+#include "components/autofill/core/common/autofill_util.h"
+#include "components/autofill/core/common/form_data.h"
+#include "components/autofill/core/common/form_field_data.h"
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/navigation_manager.h"
 #include "ios/web/public/ssl_status.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace autofill {
 
@@ -26,4 +38,159 @@
           net::IsCertStatusMinorError(ssl.cert_status));
 }
 
+std::unique_ptr<base::Value> ParseJson(NSString* json_string) {
+  // Convert JSON string to JSON object |JSONValue|.
+  int error_code = 0;
+  std::string error_message;
+  std::unique_ptr<base::Value> json_value(base::JSONReader::ReadAndReturnError(
+      base::SysNSStringToUTF8(json_string), base::JSON_PARSE_RFC, &error_code,
+      &error_message));
+  if (error_code)
+    return nullptr;
+
+  return json_value;
+}
+
+bool ExtractFormsData(NSString* forms_json,
+                      bool filtered,
+                      const base::string16& form_name,
+                      const GURL& page_url,
+                      std::vector<FormData>* forms_data) {
+  DCHECK(forms_data);
+  std::unique_ptr<base::Value> forms_value = ParseJson(forms_json);
+  if (!forms_value)
+    return false;
+
+  // Returned data should be a list of forms.
+  const base::ListValue* forms_list = nullptr;
+  if (!forms_value->GetAsList(&forms_list))
+    return false;
+
+  // Iterate through all the extracted forms and copy the data from JSON into
+  // AutofillManager structures.
+  for (const auto& form_dict : *forms_list) {
+    autofill::FormData form;
+    if (ExtractFormData(form_dict, filtered, form_name, page_url, &form))
+      forms_data->push_back(std::move(form));
+  }
+  return true;
+}
+
+bool ExtractFormData(const base::Value& form_value,
+                     bool filtered,
+                     const base::string16& form_name,
+                     const GURL& page_url,
+                     autofill::FormData* form_data) {
+  DCHECK(form_data);
+  // Each form should be a JSON dictionary.
+  const base::DictionaryValue* form_dictionary = nullptr;
+  if (!form_value.GetAsDictionary(&form_dictionary))
+    return false;
+
+  // Form data is copied into a FormData object field-by-field.
+  if (!form_dictionary->GetString("name", &form_data->name))
+    return false;
+  if (filtered && form_name != form_data->name)
+    return false;
+
+  // Origin is mandatory.
+  base::string16 origin;
+  if (!form_dictionary->GetString("origin", &origin))
+    return false;
+
+  // Use GURL object to verify origin of host page URL.
+  form_data->origin = GURL(origin);
+  if (form_data->origin.GetOrigin() != page_url.GetOrigin())
+    return false;
+
+  // main_frame_origin is used for logging UKM.
+  form_data->main_frame_origin = url::Origin::Create(page_url);
+
+  // Action is optional.
+  base::string16 action;
+  form_dictionary->GetString("action", &action);
+  form_data->action = GURL(action);
+
+  // Optional fields.
+  form_dictionary->GetBoolean("is_form_tag", &form_data->is_form_tag);
+  form_dictionary->GetBoolean("is_formless_checkout",
+                              &form_data->is_formless_checkout);
+
+  // Field list (mandatory) is extracted.
+  const base::ListValue* fields_list = nullptr;
+  if (!form_dictionary->GetList("fields", &fields_list))
+    return false;
+  for (const auto& field_dict : *fields_list) {
+    const base::DictionaryValue* field;
+    autofill::FormFieldData field_data;
+    if (field_dict.GetAsDictionary(&field) &&
+        ExtractFormFieldData(*field, &field_data)) {
+      form_data->fields.push_back(std::move(field_data));
+    } else {
+      return false;
+    }
+  }
+  return true;
+}
+
+bool ExtractFormFieldData(const base::DictionaryValue& field,
+                          autofill::FormFieldData* field_data) {
+  if (!field.GetString("name", &field_data->name) ||
+      !field.GetString("identifier", &field_data->id) ||
+      !field.GetString("form_control_type", &field_data->form_control_type)) {
+    return false;
+  }
+
+  // Optional fields.
+  field.GetString("label", &field_data->label);
+  field.GetString("value", &field_data->value);
+  field.GetString("autocomplete_attribute",
+                  &field_data->autocomplete_attribute);
+  field.GetBoolean("is_autofilled", &field_data->is_autofilled);
+
+  int max_length = 0;
+  if (field.GetInteger("max_length", &max_length))
+    field_data->max_length = max_length;
+
+  // TODO(crbug.com/427614): Extract |is_checked|.
+  bool is_checkable = false;
+  field.GetBoolean("is_checkable", &is_checkable);
+  autofill::SetCheckStatus(field_data, is_checkable, false);
+
+  field.GetBoolean("is_focusable", &field_data->is_focusable);
+  field.GetBoolean("should_autocomplete", &field_data->should_autocomplete);
+
+  // ROLE_ATTRIBUTE_OTHER is the default value. The only other value as of this
+  // writing is ROLE_ATTRIBUTE_PRESENTATION.
+  int role = 0;
+  if (field.GetInteger("role", &role) &&
+      role == autofill::AutofillField::ROLE_ATTRIBUTE_PRESENTATION) {
+    field_data->role = autofill::AutofillField::ROLE_ATTRIBUTE_PRESENTATION;
+  }
+
+  // TODO(crbug.com/427614): Extract |text_direction|.
+
+  // Load option values where present.
+  const base::ListValue* option_values = nullptr;
+  if (field.GetList("option_values", &option_values)) {
+    for (const auto& optionValue : *option_values) {
+      base::string16 value;
+      if (optionValue.GetAsString(&value))
+        field_data->option_values.push_back(std::move(value));
+    }
+  }
+
+  // Load option contents where present.
+  const base::ListValue* option_contents = nullptr;
+  if (field.GetList("option_contents", &option_contents)) {
+    for (const auto& option_content : *option_contents) {
+      base::string16 content;
+      if (option_content.GetAsString(&content))
+        field_data->option_contents.push_back(std::move(content));
+    }
+  }
+
+  return field_data->option_values.size() == field_data->option_contents.size();
+}
+
 }  // namespace autofill
diff --git a/components/autofill/ios/fill/BUILD.gn b/components/autofill/ios/fill/BUILD.gn
index 2feac5a..8797ef1d 100644
--- a/components/autofill/ios/fill/BUILD.gn
+++ b/components/autofill/ios/fill/BUILD.gn
@@ -9,11 +9,16 @@
   testonly = true
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
+    "fill_js_unittest.mm",
     "form_unittest.mm",
   ]
   deps = [
     ":form_js",
     "//base",
+    "//ios/chrome/app:tests_fake_hook",
+    "//ios/chrome/browser/browser_state:test_support",
+    "//ios/chrome/browser/tabs:tabs_internal",
+    "//ios/chrome/browser/web:test_support",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
     "//ios/web/web_state/js",
diff --git a/components/autofill/ios/fill/fill_js_unittest.mm b/components/autofill/ios/fill/fill_js_unittest.mm
new file mode 100644
index 0000000..65b0b16
--- /dev/null
+++ b/components/autofill/ios/fill/fill_js_unittest.mm
@@ -0,0 +1,72 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Foundation/Foundation.h>
+#include <stddef.h>
+
+#include "base/macros.h"
+#include "base/strings/sys_string_conversions.h"
+#import "ios/web/public/test/web_js_test.h"
+#import "ios/web/public/test/web_test_with_web_state.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#import "testing/gtest_mac.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+class FillJsTest : public web::WebJsTest<web::WebTestWithWebState> {
+ public:
+  FillJsTest()
+      : web::WebJsTest<web::WebTestWithWebState>(
+            @[ @"chrome_bundle_main_frame" ]) {}
+};
+
+TEST_F(FillJsTest, GetCanonicalActionForForm) {
+  struct TestData {
+    NSString* html_action;
+    NSString* expected_action;
+  } test_data[] = {
+      // Empty action.
+      {nil, @"baseurl/"},
+      // Absolute urls.
+      {@"http://foo1.com/bar", @"http://foo1.com/bar"},
+      {@"http://foo2.com/bar#baz", @"http://foo2.com/bar"},
+      {@"http://foo3.com/bar?baz", @"http://foo3.com/bar"},
+      // Relative urls.
+      {@"action.php", @"baseurl/action.php"},
+      {@"action.php?abc", @"baseurl/action.php"},
+      // Non-http protocols.
+      {@"data:abc", @"data:abc"},
+      {@"javascript:login()", @"javascript:login()"},
+  };
+
+  for (size_t i = 0; i < arraysize(test_data); i++) {
+    TestData& data = test_data[i];
+    NSString* html_action =
+        data.html_action == nil
+            ? @""
+            : [NSString stringWithFormat:@"action='%@'", data.html_action];
+    NSString* html = [NSString stringWithFormat:
+                                   @"<html><body>"
+                                    "<form %@></form>"
+                                    "</body></html>",
+                                   html_action];
+
+    LoadHtmlAndInject(html);
+    id result = ExecuteJavaScript(
+        @"__gCrWeb.fill.getCanonicalActionForForm(document.body.children[0])");
+    //  [NSThread sleepForTimeInterval:10000];
+    NSString* base_url = base::SysUTF8ToNSString(BaseUrl());
+    NSString* expected_action =
+        [data.expected_action stringByReplacingOccurrencesOfString:@"baseurl/"
+                                                        withString:base_url];
+    EXPECT_NSEQ(expected_action, result)
+        << " in test " << i << ": "
+        << base::SysNSStringToUTF8(data.html_action);
+  }
+}
+
+}  // namespace
diff --git a/components/autofill/ios/fill/resources/fill.js b/components/autofill/ios/fill/resources/fill.js
index fa594543..28ee906 100644
--- a/components/autofill/ios/fill/resources/fill.js
+++ b/components/autofill/ios/fill/resources/fill.js
@@ -4,7 +4,7 @@
 
 // This file provides methods used to fill forms in JavaScript.
 
-goog.module('__crWeb.fill');
+goog.provide('__crWeb.fill');
 
 /**
  * @typedef {{
@@ -420,6 +420,19 @@
   element.dispatchEvent(changeEvent);
 };
 
+ /**
+  * Returns a canonical action for |formElement|. It works the same as upstream
+  * function GetCanonicalActionForForm.
+  * @param {HTMLFormElement} formElement
+  * @return {string} Canonical action.
+  */
+__gCrWeb.fill.getCanonicalActionForForm = function(formElement) {
+  var rawAction = formElement.getAttribute('action') || "";
+  var absoluteUrl = __gCrWeb.common.absoluteURL(
+     formElement.ownerDocument, rawAction);
+  return __gCrWeb.common.removeQueryAndReferenceFromURL(absoluteUrl);
+};
+
 /**
  * Extracts fields from |controlElements| with |extractMask| to |formFields|.
  * The extracted fields are also placed in |elementArray|.
@@ -605,7 +618,7 @@
  *     will be processed.
  * @param {number} extractMask Mask controls what data is extracted from
  *     formElement.
- * @param {AutofillFormData} form Form to fill in the AutofillFormData
+ * @param {Object} form Form to fill in the AutofillFormData
  *     information of formElement.
  * @param {?AutofillFormFieldData} field Field to fill in the form field
  *     information of formControlElement.
@@ -704,7 +717,7 @@
  *     formElment, the FormField of which will be returned in field.
  * @param {number} extractMask Mask controls what data is extracted from
  *     formElement.
- * @param {AutofillFormData} form Form to fill in the AutofillFormData
+ * @param {Object} form Form to fill in the AutofillFormData
  *     information of formElement.
  * @param {?AutofillFormFieldData} field Field to fill in the form field
  *     information of formControlElement.
@@ -720,8 +733,7 @@
   form['name'] = __gCrWeb.form.getFormIdentifier(formElement);
   form['origin'] =
       __gCrWeb.common.removeQueryAndReferenceFromURL(frame.location.href);
-  form['action'] = __gCrWeb.common.absoluteURL(
-      frame.document, formElement.getAttribute('action'));
+  form['action'] = __gCrWeb.fill.getCanonicalActionForForm(formElement);
 
   // Note different from form_autofill_util.cc version of this method, which
   // computes |form.action| using document.completeURL(form_element.action())
@@ -1884,5 +1896,4 @@
   field['value'] = value;
 };
 
-
 }());  // End of anonymous object
diff --git a/components/browser_watcher/stability_debugging.cc b/components/browser_watcher/stability_debugging.cc
index 4692026..f6ac8713 100644
--- a/components/browser_watcher/stability_debugging.cc
+++ b/components/browser_watcher/stability_debugging.cc
@@ -65,7 +65,7 @@
 }
 
 void RegisterStabilityVEH() {
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
   // ASAN on windows x64 is dynamically allocating the shadow memory on a
   // memory access violation by setting up an vector exception handler.
   // When instrumented with ASAN, this code may trigger an exception by
diff --git a/components/cryptauth/cryptauth_device_manager_impl.cc b/components/cryptauth/cryptauth_device_manager_impl.cc
index b03f075..2247600 100644
--- a/components/cryptauth/cryptauth_device_manager_impl.cc
+++ b/components/cryptauth/cryptauth_device_manager_impl.cc
@@ -11,6 +11,7 @@
 #include <memory>
 
 #include "base/base64url.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/cryptauth/cryptauth_client.h"
 #include "components/cryptauth/pref_names.h"
@@ -316,6 +317,40 @@
 
 }  // namespace
 
+// static
+CryptAuthDeviceManagerImpl::Factory*
+    CryptAuthDeviceManagerImpl::Factory::factory_instance_ = nullptr;
+
+// static
+std::unique_ptr<CryptAuthDeviceManager>
+CryptAuthDeviceManagerImpl::Factory::NewInstance(
+    base::Clock* clock,
+    std::unique_ptr<CryptAuthClientFactory> client_factory,
+    CryptAuthGCMManager* gcm_manager,
+    PrefService* pref_service) {
+  if (!factory_instance_)
+    factory_instance_ = new Factory();
+
+  return factory_instance_->BuildInstance(clock, std::move(client_factory),
+                                          gcm_manager, pref_service);
+}
+
+// static
+void CryptAuthDeviceManagerImpl::Factory::SetInstanceForTesting(
+    Factory* factory) {
+  factory_instance_ = factory;
+}
+
+std::unique_ptr<CryptAuthDeviceManager>
+CryptAuthDeviceManagerImpl::Factory::BuildInstance(
+    base::Clock* clock,
+    std::unique_ptr<CryptAuthClientFactory> client_factory,
+    CryptAuthGCMManager* gcm_manager,
+    PrefService* pref_service) {
+  return base::WrapUnique(new CryptAuthDeviceManagerImpl(
+      clock, std::move(client_factory), gcm_manager, pref_service));
+}
+
 CryptAuthDeviceManagerImpl::CryptAuthDeviceManagerImpl(
     base::Clock* clock,
     std::unique_ptr<CryptAuthClientFactory> client_factory,
diff --git a/components/cryptauth/cryptauth_device_manager_impl.h b/components/cryptauth/cryptauth_device_manager_impl.h
index 41b3ff1..260a4d6 100644
--- a/components/cryptauth/cryptauth_device_manager_impl.h
+++ b/components/cryptauth/cryptauth_device_manager_impl.h
@@ -27,19 +27,27 @@
                                    public SyncScheduler::Delegate,
                                    public CryptAuthGCMManager::Observer {
  public:
-  // Creates the manager:
-  // |clock|: Used to determine the time between sync attempts.
-  // |client_factory|: Creates CryptAuthClient instances to perform each sync.
-  // |gcm_manager|: Notifies when GCM push messages trigger device syncs.
-  //                Not owned and must outlive this instance.
-  // |pref_service|: Stores syncing metadata and unlock key information to
-  //                 persist across browser restarts. Must already be registered
-  //                 with RegisterPrefs().
-  CryptAuthDeviceManagerImpl(
-      base::Clock* clock,
-      std::unique_ptr<CryptAuthClientFactory> client_factory,
-      CryptAuthGCMManager* gcm_manager,
-      PrefService* pref_service);
+  class Factory {
+   public:
+    static std::unique_ptr<CryptAuthDeviceManager> NewInstance(
+        base::Clock* clock,
+        std::unique_ptr<CryptAuthClientFactory> client_factory,
+        CryptAuthGCMManager* gcm_manager,
+        PrefService* pref_service);
+
+    static void SetInstanceForTesting(Factory* factory);
+
+   protected:
+    virtual std::unique_ptr<CryptAuthDeviceManager> BuildInstance(
+        base::Clock* clock,
+        std::unique_ptr<CryptAuthClientFactory> client_factory,
+        CryptAuthGCMManager* gcm_manager,
+        PrefService* pref_service);
+
+   private:
+    static Factory* factory_instance_;
+  };
+
   ~CryptAuthDeviceManagerImpl() override;
 
   // CryptAuthDeviceManager:
@@ -56,6 +64,20 @@
   std::vector<ExternalDeviceInfo> GetPixelTetherHosts() const override;
 
  protected:
+  // Creates the manager:
+  // |clock|: Used to determine the time between sync attempts.
+  // |client_factory|: Creates CryptAuthClient instances to perform each sync.
+  // |gcm_manager|: Notifies when GCM push messages trigger device syncs.
+  //                Not owned and must outlive this instance.
+  // |pref_service|: Stores syncing metadata and unlock key information to
+  //                 persist across browser restarts. Must already be registered
+  //                 with RegisterPrefs().
+  CryptAuthDeviceManagerImpl(
+      base::Clock* clock,
+      std::unique_ptr<CryptAuthClientFactory> client_factory,
+      CryptAuthGCMManager* gcm_manager,
+      PrefService* pref_service);
+
   void SetSyncSchedulerForTest(std::unique_ptr<SyncScheduler> sync_scheduler);
 
  private:
diff --git a/components/cryptauth/cryptauth_enrollment_manager_impl.cc b/components/cryptauth/cryptauth_enrollment_manager_impl.cc
index 9759d23..0c61192 100644
--- a/components/cryptauth/cryptauth_enrollment_manager_impl.cc
+++ b/components/cryptauth/cryptauth_enrollment_manager_impl.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/base64url.h"
+#include "base/memory/ptr_util.h"
 #include "base/time/clock.h"
 #include "base/time/time.h"
 #include "components/cryptauth/cryptauth_enroller.h"
@@ -52,6 +53,46 @@
 
 }  // namespace
 
+// static
+CryptAuthEnrollmentManagerImpl::Factory*
+    CryptAuthEnrollmentManagerImpl::Factory::factory_instance_ = nullptr;
+
+// static
+std::unique_ptr<CryptAuthEnrollmentManager>
+CryptAuthEnrollmentManagerImpl::Factory::NewInstance(
+    base::Clock* clock,
+    std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory,
+    std::unique_ptr<SecureMessageDelegate> secure_message_delegate,
+    const GcmDeviceInfo& device_info,
+    CryptAuthGCMManager* gcm_manager,
+    PrefService* pref_service) {
+  if (!factory_instance_)
+    factory_instance_ = new Factory();
+
+  return factory_instance_->BuildInstance(
+      clock, std::move(enroller_factory), std::move(secure_message_delegate),
+      device_info, gcm_manager, pref_service);
+}
+
+// static
+void CryptAuthEnrollmentManagerImpl::Factory::SetInstanceForTesting(
+    Factory* factory) {
+  factory_instance_ = factory;
+}
+
+std::unique_ptr<CryptAuthEnrollmentManager>
+CryptAuthEnrollmentManagerImpl::Factory::BuildInstance(
+    base::Clock* clock,
+    std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory,
+    std::unique_ptr<SecureMessageDelegate> secure_message_delegate,
+    const GcmDeviceInfo& device_info,
+    CryptAuthGCMManager* gcm_manager,
+    PrefService* pref_service) {
+  return base::WrapUnique(new CryptAuthEnrollmentManagerImpl(
+      clock, std::move(enroller_factory), std::move(secure_message_delegate),
+      device_info, gcm_manager, pref_service));
+}
+
 CryptAuthEnrollmentManagerImpl::CryptAuthEnrollmentManagerImpl(
     base::Clock* clock,
     std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory,
diff --git a/components/cryptauth/cryptauth_enrollment_manager_impl.h b/components/cryptauth/cryptauth_enrollment_manager_impl.h
index 52b378b..ce8b142 100644
--- a/components/cryptauth/cryptauth_enrollment_manager_impl.h
+++ b/components/cryptauth/cryptauth_enrollment_manager_impl.h
@@ -33,6 +33,45 @@
                                        public SyncScheduler::Delegate,
                                        public CryptAuthGCMManager::Observer {
  public:
+  class Factory {
+   public:
+    static std::unique_ptr<CryptAuthEnrollmentManager> NewInstance(
+        base::Clock* clock,
+        std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory,
+        std::unique_ptr<SecureMessageDelegate> secure_message_delegate,
+        const GcmDeviceInfo& device_info,
+        CryptAuthGCMManager* gcm_manager,
+        PrefService* pref_service);
+
+    static void SetInstanceForTesting(Factory* factory);
+
+   protected:
+    virtual std::unique_ptr<CryptAuthEnrollmentManager> BuildInstance(
+        base::Clock* clock,
+        std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory,
+        std::unique_ptr<SecureMessageDelegate> secure_message_delegate,
+        const GcmDeviceInfo& device_info,
+        CryptAuthGCMManager* gcm_manager,
+        PrefService* pref_service);
+
+   private:
+    static Factory* factory_instance_;
+  };
+
+  ~CryptAuthEnrollmentManagerImpl() override;
+
+  // CryptAuthEnrollmentManager:
+  void Start() override;
+  void ForceEnrollmentNow(InvocationReason invocation_reason) override;
+  bool IsEnrollmentValid() const override;
+  base::Time GetLastEnrollmentTime() const override;
+  base::TimeDelta GetTimeToNextAttempt() const override;
+  bool IsEnrollmentInProgress() const override;
+  bool IsRecoveringFromFailure() const override;
+  std::string GetUserPublicKey() const override;
+  std::string GetUserPrivateKey() const override;
+
+ protected:
   // Creates the manager:
   // |clock|: Used to determine the time between sync attempts.
   // |enroller_factory|: Creates CryptAuthEnroller instances to perform each
@@ -54,20 +93,6 @@
       CryptAuthGCMManager* gcm_manager,
       PrefService* pref_service);
 
-  ~CryptAuthEnrollmentManagerImpl() override;
-
-  // CryptAuthEnrollmentManager:
-  void Start() override;
-  void ForceEnrollmentNow(InvocationReason invocation_reason) override;
-  bool IsEnrollmentValid() const override;
-  base::Time GetLastEnrollmentTime() const override;
-  base::TimeDelta GetTimeToNextAttempt() const override;
-  bool IsEnrollmentInProgress() const override;
-  bool IsRecoveringFromFailure() const override;
-  std::string GetUserPublicKey() const override;
-  std::string GetUserPrivateKey() const override;
-
- protected:
   void SetSyncSchedulerForTest(std::unique_ptr<SyncScheduler> sync_scheduler);
 
  private:
diff --git a/components/cryptauth/cryptauth_gcm_manager_impl.cc b/components/cryptauth/cryptauth_gcm_manager_impl.cc
index 6178481..94070c1 100644
--- a/components/cryptauth/cryptauth_gcm_manager_impl.cc
+++ b/components/cryptauth/cryptauth_gcm_manager_impl.cc
@@ -5,6 +5,7 @@
 #include "components/cryptauth/cryptauth_gcm_manager_impl.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "components/cryptauth/pref_names.h"
 #include "components/gcm_driver/gcm_driver.h"
@@ -30,6 +31,32 @@
 
 }  // namespace
 
+// static
+CryptAuthGCMManagerImpl::Factory*
+    CryptAuthGCMManagerImpl::Factory::factory_instance_ = nullptr;
+
+// static
+std::unique_ptr<CryptAuthGCMManager>
+CryptAuthGCMManagerImpl::Factory::NewInstance(gcm::GCMDriver* gcm_driver,
+                                              PrefService* pref_service) {
+  if (!factory_instance_)
+    factory_instance_ = new Factory();
+
+  return factory_instance_->BuildInstance(gcm_driver, pref_service);
+}
+
+// static
+void CryptAuthGCMManagerImpl::Factory::SetInstanceForTesting(Factory* factory) {
+  factory_instance_ = factory;
+}
+
+std::unique_ptr<CryptAuthGCMManager>
+CryptAuthGCMManagerImpl::Factory::BuildInstance(gcm::GCMDriver* gcm_driver,
+                                                PrefService* pref_service) {
+  return base::WrapUnique(
+      new CryptAuthGCMManagerImpl(gcm_driver, pref_service));
+}
+
 CryptAuthGCMManagerImpl::CryptAuthGCMManagerImpl(gcm::GCMDriver* gcm_driver,
                                                  PrefService* pref_service)
     : gcm_driver_(gcm_driver),
diff --git a/components/cryptauth/cryptauth_gcm_manager_impl.h b/components/cryptauth/cryptauth_gcm_manager_impl.h
index 28c64db..1498356 100644
--- a/components/cryptauth/cryptauth_gcm_manager_impl.h
+++ b/components/cryptauth/cryptauth_gcm_manager_impl.h
@@ -25,14 +25,22 @@
 class CryptAuthGCMManagerImpl : public CryptAuthGCMManager,
                                 public gcm::GCMAppHandler {
  public:
-  // Creates the manager:
-  // |gcm_driver|: Handles the actual GCM communications. The driver is not
-  //     owned and must outlive this instance.
-  // |pref_service|: Contains preferences across browser restarts, and should
-  //     have been registered through RegisterPrefs(). The service is not owned
-  //     and must outlive this instance.
-  CryptAuthGCMManagerImpl(gcm::GCMDriver* gcm_driver,
-                          PrefService* pref_service);
+  class Factory {
+   public:
+    static std::unique_ptr<CryptAuthGCMManager> NewInstance(
+        gcm::GCMDriver* gcm_driver,
+        PrefService* pref_service);
+
+    static void SetInstanceForTesting(Factory* factory);
+
+   protected:
+    virtual std::unique_ptr<CryptAuthGCMManager> BuildInstance(
+        gcm::GCMDriver* gcm_driver,
+        PrefService* pref_service);
+
+   private:
+    static Factory* factory_instance_;
+  };
 
   ~CryptAuthGCMManagerImpl() override;
 
@@ -43,7 +51,19 @@
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
 
+ protected:
+  // Creates the manager:
+  // |gcm_driver|: Handles the actual GCM communications. The driver is not
+  //     owned and must outlive this instance.
+  // |pref_service|: Contains preferences across browser restarts, and should
+  //     have been registered through RegisterPrefs(). The service is not owned
+  //     and must outlive this instance.
+  CryptAuthGCMManagerImpl(gcm::GCMDriver* gcm_driver,
+                          PrefService* pref_service);
+
  private:
+  friend class CryptAuthGCMManagerImplTest;
+
   // GCMAppHandler:
   void ShutdownHandler() override;
   void OnStoreReset() override;
diff --git a/components/device_event_log/device_event_log.cc b/components/device_event_log/device_event_log.cc
index 9a69b45..1b68fb6 100644
--- a/components/device_event_log/device_event_log.cc
+++ b/components/device_event_log/device_event_log.cc
@@ -77,6 +77,11 @@
                                          max_events);
 }
 
+void Clear(const base::Time& begin, const base::Time& end) {
+  if (g_device_event_log)
+    g_device_event_log->Clear(begin, end);
+}
+
 namespace internal {
 
 DeviceEventLogInstance::DeviceEventLogInstance(const char* file,
diff --git a/components/device_event_log/device_event_log.h b/components/device_event_log/device_event_log.h
index 133cf79..c3d52a723 100644
--- a/components/device_event_log/device_event_log.h
+++ b/components/device_event_log/device_event_log.h
@@ -164,6 +164,10 @@
                                                 LogLevel max_level,
                                                 size_t max_events);
 
+// Clear entries from the device event log between the given times.
+void DEVICE_EVENT_LOG_EXPORT Clear(const base::Time& begin,
+                                   const base::Time& end);
+
 DEVICE_EVENT_LOG_EXPORT extern const LogLevel kDefaultLogLevel;
 
 namespace internal {
diff --git a/components/device_event_log/device_event_log_impl.cc b/components/device_event_log/device_event_log_impl.cc
index db7eb5b..7d0cfe7 100644
--- a/components/device_event_log/device_event_log_impl.cc
+++ b/components/device_event_log/device_event_log_impl.cc
@@ -260,9 +260,26 @@
                                   const std::string& event) {
   LogEntry entry(file, file_line, log_type, log_level, event);
   if (!task_runner_->RunsTasksInCurrentSequence()) {
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(&DeviceEventLogImpl::AddLogEntry,
-                                      weak_ptr_factory_.GetWeakPtr(), entry));
+    task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(&DeviceEventLogImpl::AddLogEntry,
+                                  weak_ptr_factory_.GetWeakPtr(), entry));
+    return;
+  }
+  AddLogEntry(entry);
+}
+
+void DeviceEventLogImpl::AddEntryWithTimestampForTesting(
+    const char* file,
+    int file_line,
+    LogType log_type,
+    LogLevel log_level,
+    const std::string& event,
+    base::Time time) {
+  LogEntry entry(file, file_line, log_type, log_level, event, time);
+  if (!task_runner_->RunsTasksInCurrentSequence()) {
+    task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(&DeviceEventLogImpl::AddLogEntry,
+                                  weak_ptr_factory_.GetWeakPtr(), entry));
     return;
   }
   AddLogEntry(entry);
@@ -382,6 +399,17 @@
   return result;
 }
 
+void DeviceEventLogImpl::Clear(const base::Time& begin, const base::Time& end) {
+  LogEntryList::iterator begin_it = std::find_if(
+      entries_.begin(), entries_.end(),
+      [begin](const LogEntry& entry) { return entry.time >= begin; });
+  LogEntryList::reverse_iterator end_rev_it =
+      std::find_if(entries_.rbegin(), entries_.rend(),
+                   [end](const LogEntry& entry) { return entry.time <= end; });
+
+  entries_.erase(begin_it, end_rev_it.base());
+}
+
 DeviceEventLogImpl::LogEntry::LogEntry(const char* filedesc,
                                        int file_line,
                                        LogType log_type,
@@ -402,6 +430,16 @@
   }
 }
 
+DeviceEventLogImpl::LogEntry::LogEntry(const char* filedesc,
+                                       int file_line,
+                                       LogType log_type,
+                                       LogLevel log_level,
+                                       const std::string& event,
+                                       base::Time time_for_testing)
+    : LogEntry(filedesc, file_line, log_type, log_level, event) {
+  time = time_for_testing;
+}
+
 DeviceEventLogImpl::LogEntry::LogEntry(const LogEntry& other) = default;
 
 }  // namespace device_event_log
diff --git a/components/device_event_log/device_event_log_impl.h b/components/device_event_log/device_event_log_impl.h
index 218a2e7ff..f127f05 100644
--- a/components/device_event_log/device_event_log_impl.h
+++ b/components/device_event_log/device_event_log_impl.h
@@ -28,6 +28,12 @@
              LogType log_type,
              LogLevel log_level,
              const std::string& event);
+    LogEntry(const char* filedesc,
+             int file_line,
+             LogType log_type,
+             LogLevel log_level,
+             const std::string& event,
+             base::Time time_for_testing);
     LogEntry(const LogEntry& other);
 
     std::string file;
@@ -51,6 +57,13 @@
                 LogLevel level,
                 const std::string& event);
 
+  void AddEntryWithTimestampForTesting(const char* file,
+                                       int file_line,
+                                       LogType log_type,
+                                       LogLevel log_level,
+                                       const std::string& event,
+                                       base::Time time);
+
   // Implements device_event_log::GetAsString.
   std::string GetAsString(StringOrder order,
                           const std::string& format,
@@ -58,6 +71,9 @@
                           LogLevel max_level,
                           size_t max_events);
 
+  // Implements device_event_log::Clear.
+  void Clear(const base::Time& begin, const base::Time& end);
+
   // Called from device_event_log::AddEntry if the global instance has not been
   // created (or has already been destroyed). Logs to LOG(ERROR) or VLOG(1).
   static void SendToVLogOrErrorLog(const char* file,
diff --git a/components/device_event_log/device_event_log_impl_unittest.cc b/components/device_event_log/device_event_log_impl_unittest.cc
index 1b86243..41b20ab3a8 100644
--- a/components/device_event_log/device_event_log_impl_unittest.cc
+++ b/components/device_event_log/device_event_log_impl_unittest.cc
@@ -111,6 +111,14 @@
     AddNetworkEntry(kFileName, 0, level, event);
   }
 
+  void AddTestEventWithTimestamp(LogLevel level,
+                                 const std::string& event,
+                                 base::Time time) {
+    impl_->AddEntryWithTimestampForTesting(kFileName, 0, kDefaultType, level,
+                                           event, time);
+    task_runner_->RunUntilIdle();
+  }
+
   void AddEventType(LogType type, const std::string& event) {
     impl_->AddEntry(kFileName, 0, type, kDefaultLevel, event);
     task_runner_->RunUntilIdle();
@@ -290,4 +298,39 @@
   EXPECT_EQ(all_events, GetLogStringForType(""));
 }
 
+TEST_F(DeviceEventLogTest, TestClear) {
+  AddTestEvent(LOG_LEVEL_EVENT, "event1");
+  AddTestEvent(LOG_LEVEL_EVENT, "event2");
+  AddTestEvent(LOG_LEVEL_EVENT, "event3");
+  AddTestEvent(LOG_LEVEL_EVENT, "event4");
+
+  std::string out = GetLogString(OLDEST_FIRST, "", LOG_LEVEL_EVENT, 0);
+  EXPECT_EQ(4u, CountLines(out));
+
+  impl_->Clear(base::Time(), base::Time::Max());
+
+  out = GetLogString(OLDEST_FIRST, "", LOG_LEVEL_EVENT, 0);
+  EXPECT_EQ(0u, CountLines(out));
+}
+
+TEST_F(DeviceEventLogTest, TestClearRange) {
+  AddTestEventWithTimestamp(LOG_LEVEL_EVENT, "event1",
+                            base::Time() + base::TimeDelta::FromSeconds(1));
+  AddTestEventWithTimestamp(LOG_LEVEL_EVENT, "event2",
+                            base::Time() + base::TimeDelta::FromSeconds(2));
+  AddTestEventWithTimestamp(LOG_LEVEL_EVENT, "event3",
+                            base::Time() + base::TimeDelta::FromSeconds(3));
+  AddTestEventWithTimestamp(LOG_LEVEL_EVENT, "event4",
+                            base::Time() + base::TimeDelta::FromSeconds(4));
+
+  EXPECT_EQ("event1\nevent2\nevent3\nevent4\n",
+            GetLogString(OLDEST_FIRST, "", LOG_LEVEL_EVENT, 0));
+
+  impl_->Clear(base::Time() + base::TimeDelta::FromSeconds(2),
+               base::Time() + base::TimeDelta::FromSeconds(3));
+
+  EXPECT_EQ("event1\nevent4\n",
+            GetLogString(OLDEST_FIRST, "", LOG_LEVEL_EVENT, 0));
+}
+
 }  // namespace device_event_log
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn
index 5d4d32d..4fec457f 100644
--- a/components/exo/BUILD.gn
+++ b/components/exo/BUILD.gn
@@ -79,6 +79,7 @@
     "//skia",
     "//ui/aura",
     "//ui/compositor",
+    "//ui/compositor_extra",
     "//ui/display/manager",
     "//ui/events/devices:devices",
     "//ui/events/ozone:events_ozone_evdev",
@@ -167,6 +168,7 @@
     "//testing/gtest",
     "//ui/aura",
     "//ui/compositor:test_support",
+    "//ui/compositor_extra",
     "//ui/events:dom_keycode_converter",
     "//ui/events:test_support",
     "//ui/events/ozone:events_ozone_evdev",
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc
index 669b847..2b475592 100644
--- a/components/exo/client_controlled_shell_surface_unittest.cc
+++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -28,11 +28,11 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/compositor_extra/shadow.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/event_targeter.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/widget/widget.h"
-#include "ui/wm/core/shadow.h"
 #include "ui/wm/core/shadow_controller.h"
 #include "ui/wm/core/shadow_types.h"
 
@@ -269,7 +269,7 @@
   surface->SetFrame(SurfaceFrameType::NORMAL);
   shell_surface->SetShadowBounds(gfx::Rect(10, 10, 100, 100));
   surface->Commit();
-  wm::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
+  ui::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
   ASSERT_TRUE(shadow);
   EXPECT_TRUE(shadow->layer()->visible());
 
@@ -333,7 +333,7 @@
 
   views::Widget* widget = shell_surface->GetWidget();
   aura::Window* window = widget->GetNativeWindow();
-  wm::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
+  ui::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
 
   shell_surface->SetShadowBounds(shadow_bounds);
   surface->Commit();
@@ -384,7 +384,7 @@
   surface->Commit();
 
   aura::Window* window = shell_surface->GetWidget()->GetNativeWindow();
-  wm::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
+  ui::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
 
   // Placing a shadow at screen origin will make the shadow's origin (-10, -10).
   const gfx::Rect shadow_bounds(content_size);
@@ -427,7 +427,7 @@
   // Restore the window and make sure the shadow is created, visible and
   // has the latest bounds.
   widget->Restore();
-  wm::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
+  ui::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
   ASSERT_TRUE(shadow);
   EXPECT_TRUE(shadow->layer()->visible());
   EXPECT_EQ(gfx::Rect(10, 10, 100, 100), shadow->content_bounds());
diff --git a/components/exo/shell_surface_base.cc b/components/exo/shell_surface_base.cc
index cc50e772..421e0311 100644
--- a/components/exo/shell_surface_base.cc
+++ b/components/exo/shell_surface_base.cc
@@ -36,13 +36,13 @@
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/class_property.h"
 #include "ui/compositor/compositor.h"
+#include "ui/compositor_extra/shadow.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/vector2d_conversions.h"
 #include "ui/gfx/path.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/coordinate_conversion.h"
-#include "ui/wm/core/shadow.h"
 #include "ui/wm/core/shadow_controller.h"
 #include "ui/wm/core/shadow_types.h"
 #include "ui/wm/core/window_animations.h"
@@ -1270,7 +1270,7 @@
   } else {
     wm::SetShadowElevation(window, wm::kShadowElevationDefault);
 
-    wm::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
+    ui::Shadow* shadow = wm::ShadowController::GetShadowForWindow(window);
     // Maximized/Fullscreen window does not create a shadow.
     if (!shadow)
       return;
diff --git a/components/infobars/core/infobar_delegate.h b/components/infobars/core/infobar_delegate.h
index 2a99697..6e72ea8 100644
--- a/components/infobars/core/infobar_delegate.h
+++ b/components/infobars/core/infobar_delegate.h
@@ -149,6 +149,7 @@
     SURVEY_INFOBAR_ANDROID = 78,
     NEAR_OOM_INFOBAR_ANDROID = 79,
     INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE = 80,
+    PAGE_LOAD_CAPPING_INFOBAR_DELEGATE = 81,
   };
 
   // Describes navigation events, used to decide whether infobars should be
diff --git a/components/metrics/metrics_log.cc b/components/metrics/metrics_log.cc
index 6d691f9..09e52b8d 100644
--- a/components/metrics/metrics_log.cc
+++ b/components/metrics/metrics_log.cc
@@ -149,7 +149,7 @@
   system_profile->set_channel(client->GetChannel());
   system_profile->set_application_locale(client->GetApplicationLocale());
 
-#if defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
   system_profile->set_is_asan_build(true);
 #endif
 
diff --git a/components/metrics/metrics_log_unittest.cc b/components/metrics/metrics_log_unittest.cc
index 1394d0a..6ea123854 100644
--- a/components/metrics/metrics_log_unittest.cc
+++ b/components/metrics/metrics_log_unittest.cc
@@ -136,7 +136,7 @@
   system_profile->set_channel(client.GetChannel());
   system_profile->set_application_locale(client.GetApplicationLocale());
 
-#if defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
   system_profile->set_is_asan_build(true);
 #endif
   metrics::SystemProfileProto::Hardware* hardware =
diff --git a/components/mirroring/service/BUILD.gn b/components/mirroring/service/BUILD.gn
index 786b7ba4b..3e2ee46 100644
--- a/components/mirroring/service/BUILD.gn
+++ b/components/mirroring/service/BUILD.gn
@@ -8,6 +8,8 @@
   sources = [
     "rtp_stream.cc",
     "rtp_stream.h",
+    "udp_socket_client.cc",
+    "udp_socket_client.h",
     "video_capture_client.cc",
     "video_capture_client.h",
   ]
@@ -20,9 +22,12 @@
     "//media",
     "//media/capture/mojom:video_capture",
     "//media/cast:common",
+    "//media/cast:net",
     "//media/cast:sender",
     "//media/mojo/common:common",
     "//mojo/public/cpp/bindings",
+    "//net",
+    "//services/network/public/mojom",
     "//ui/gfx",
   ]
 }
@@ -30,7 +35,10 @@
 source_set("unittests") {
   testonly = true
   sources = [
+    "fake_network_service.cc",
+    "fake_network_service.h",
     "rtp_stream_unittest.cc",
+    "udp_socket_client_unittest.cc",
     "video_capture_client_unittest.cc",
   ]
 
@@ -41,9 +49,12 @@
     "//media",
     "//media/capture/mojom:video_capture",
     "//media/cast:common",
+    "//media/cast:net",
     "//media/cast:sender",
     "//media/cast:test_support",
     "//mojo/public/cpp/bindings",
+    "//net",
+    "//services/network/public/mojom",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/components/mirroring/service/DEPS b/components/mirroring/service/DEPS
new file mode 100644
index 0000000..d924f83
--- /dev/null
+++ b/components/mirroring/service/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+net",
+  "+services/network/public/mojom",
+]
diff --git a/components/mirroring/service/fake_network_service.cc b/components/mirroring/service/fake_network_service.cc
new file mode 100644
index 0000000..ca32b97
--- /dev/null
+++ b/components/mirroring/service/fake_network_service.cc
@@ -0,0 +1,66 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/mirroring/service/fake_network_service.h"
+
+#include "media/cast/test/utility/net_utility.h"
+
+namespace mirroring {
+
+MockUdpSocket::MockUdpSocket(network::mojom::UDPSocketRequest request,
+                             network::mojom::UDPSocketReceiverPtr receiver)
+    : binding_(this, std::move(request)), receiver_(std::move(receiver)) {}
+
+MockUdpSocket::~MockUdpSocket() {}
+
+void MockUdpSocket::Connect(const net::IPEndPoint& remote_addr,
+                            network::mojom::UDPSocketOptionsPtr options,
+                            ConnectCallback callback) {
+  std::move(callback).Run(net::OK, media::cast::test::GetFreeLocalPort());
+}
+
+void MockUdpSocket::ReceiveMore(uint32_t num_additional_datagrams) {
+  num_ask_for_receive_ += num_additional_datagrams;
+}
+
+void MockUdpSocket::Send(
+    base::span<const uint8_t> data,
+    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
+    SendCallback callback) {
+  sending_packet_ =
+      std::make_unique<media::cast::Packet>(data.begin(), data.end());
+  std::move(callback).Run(net::OK);
+  OnSend();
+}
+
+void MockUdpSocket::OnReceivedPacket(const media::cast::Packet& packet) {
+  if (num_ask_for_receive_) {
+    receiver_->OnReceived(
+        net::OK, base::nullopt,
+        base::span<const uint8_t>(
+            reinterpret_cast<const uint8_t*>(packet.data()), packet.size()));
+    ASSERT_LT(0, num_ask_for_receive_);
+    --num_ask_for_receive_;
+  }
+}
+
+void MockUdpSocket::VerifySendingPacket(const media::cast::Packet& packet) {
+  EXPECT_TRUE(
+      std::equal(packet.begin(), packet.end(), sending_packet_->begin()));
+}
+
+MockNetworkContext::MockNetworkContext(
+    network::mojom::NetworkContextRequest request)
+    : binding_(this, std::move(request)) {}
+MockNetworkContext::~MockNetworkContext() {}
+
+void MockNetworkContext::CreateUDPSocket(
+    network::mojom::UDPSocketRequest request,
+    network::mojom::UDPSocketReceiverPtr receiver) {
+  udp_socket_ =
+      std::make_unique<MockUdpSocket>(std::move(request), std::move(receiver));
+  OnUDPSocketCreated();
+}
+
+}  // namespace mirroring
diff --git a/components/mirroring/service/fake_network_service.h b/components/mirroring/service/fake_network_service.h
new file mode 100644
index 0000000..cdc0062
--- /dev/null
+++ b/components/mirroring/service/fake_network_service.h
@@ -0,0 +1,125 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MIRRORING_SERVICE_FAKE_NETWORK_SERVICE_H_
+#define COMPONENTS_MIRRORING_SERVICE_FAKE_NETWORK_SERVICE_H_
+
+#include "base/callback.h"
+#include "media/cast/net/cast_transport_config.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "services/network/public/mojom/network_service.mojom.h"
+#include "services/network/public/mojom/udp_socket.mojom.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace mirroring {
+
+class MockUdpSocket final : public network::mojom::UDPSocket {
+ public:
+  MockUdpSocket(network::mojom::UDPSocketRequest request,
+                network::mojom::UDPSocketReceiverPtr receiver);
+  ~MockUdpSocket() override;
+
+  MOCK_METHOD0(OnSend, void());
+
+  // network::mojom::UDPSocket implementation.
+  void Connect(const net::IPEndPoint& remote_addr,
+               network::mojom::UDPSocketOptionsPtr options,
+               ConnectCallback callback) override;
+  void Bind(const net::IPEndPoint& local_addr,
+            network::mojom::UDPSocketOptionsPtr options,
+            BindCallback callback) override {}
+  void SetBroadcast(bool broadcast, SetBroadcastCallback callback) override {}
+  void JoinGroup(const net::IPAddress& group_address,
+                 JoinGroupCallback callback) override {}
+  void LeaveGroup(const net::IPAddress& group_address,
+                  LeaveGroupCallback callback) override {}
+  void ReceiveMore(uint32_t num_additional_datagrams) override;
+  void ReceiveMoreWithBufferSize(uint32_t num_additional_datagrams,
+                                 uint32_t buffer_size) override {}
+  void SendTo(const net::IPEndPoint& dest_addr,
+              base::span<const uint8_t> data,
+              const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
+              SendToCallback callback) override {}
+  void Send(base::span<const uint8_t> data,
+            const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
+            SendCallback callback) override;
+  void Close() override {}
+
+  // Simulate receiving a packet from the network.
+  void OnReceivedPacket(const media::cast::Packet& packet);
+
+  void VerifySendingPacket(const media::cast::Packet& packet);
+
+ private:
+  mojo::Binding<network::mojom::UDPSocket> binding_;
+  network::mojom::UDPSocketReceiverPtr receiver_;
+  std::unique_ptr<media::cast::Packet> sending_packet_;
+  int num_ask_for_receive_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(MockUdpSocket);
+};
+
+class MockNetworkContext final : public network::mojom::NetworkContext {
+ public:
+  explicit MockNetworkContext(network::mojom::NetworkContextRequest request);
+  ~MockNetworkContext() override;
+
+  MOCK_METHOD0(OnUDPSocketCreated, void());
+
+  // network::mojom::NetworkContext implementation:
+  void CreateURLLoaderFactory(network::mojom::URLLoaderFactoryRequest request,
+                              uint32_t process_id) override {}
+  void GetCookieManager(network::mojom::CookieManagerRequest request) override {
+  }
+  void GetRestrictedCookieManager(
+      network::mojom::RestrictedCookieManagerRequest request,
+      int32_t render_process_id,
+      int32_t render_frame_id) override {}
+  void ClearNetworkingHistorySince(
+      base::Time time,
+      base::OnceClosure completion_callback) override {}
+  void ClearHttpCache(base::Time start_time,
+                      base::Time end_time,
+                      network::mojom::ClearCacheUrlFilterPtr filter,
+                      ClearHttpCacheCallback callback) override {}
+  void SetNetworkConditions(
+      const std::string& profile_id,
+      network::mojom::NetworkConditionsPtr conditions) override {}
+  void SetAcceptLanguage(const std::string& new_accept_language) override {}
+  void AddHSTSForTesting(const std::string& host,
+                         base::Time expiry,
+                         bool include_subdomains,
+                         AddHSTSForTestingCallback callback) override {}
+  void CreateUDPSocket(network::mojom::UDPSocketRequest request,
+                       network::mojom::UDPSocketReceiverPtr receiver) override;
+  void CreateTCPServerSocket(
+      const net::IPEndPoint& local_addr,
+      uint32_t backlog,
+      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
+      network::mojom::TCPServerSocketRequest request,
+      CreateTCPServerSocketCallback callback) override {}
+  void CreateTCPConnectedSocket(
+      const base::Optional<net::IPEndPoint>& local_addr,
+      const net::AddressList& remote_addr_list,
+      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
+      network::mojom::TCPConnectedSocketRequest request,
+      network::mojom::TCPConnectedSocketObserverPtr observer,
+      CreateTCPConnectedSocketCallback callback) override {}
+  void CreateWebSocket(network::mojom::WebSocketRequest request,
+                       int process_id,
+                       int render_frame_id,
+                       const url::Origin& origin) override {}
+
+  MockUdpSocket* udp_socket() const { return udp_socket_.get(); }
+
+ private:
+  mojo::Binding<network::mojom::NetworkContext> binding_;
+  std::unique_ptr<MockUdpSocket> udp_socket_;
+  DISALLOW_COPY_AND_ASSIGN(MockNetworkContext);
+};
+
+}  // namespace mirroring
+
+#endif  // COMPONENTS_MIRRORING_SERVICE_FAKE_NETWORK_SERVICE_H_
diff --git a/media/cast/net/udp_socket_client.cc b/components/mirroring/service/udp_socket_client.cc
similarity index 92%
rename from media/cast/net/udp_socket_client.cc
rename to components/mirroring/service/udp_socket_client.cc
index 6854d81..f767769 100644
--- a/media/cast/net/udp_socket_client.cc
+++ b/components/mirroring/service/udp_socket_client.cc
@@ -2,15 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "media/cast/net/udp_socket_client.h"
+#include "components/mirroring/service/udp_socket_client.h"
 
 #include "base/callback.h"
-#include "media/cast/net/udp_packet_pipe.h"
 #include "net/base/address_family.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
-namespace media {
-namespace cast {
+namespace mirroring {
 
 namespace {
 
@@ -62,7 +60,7 @@
 
 UdpSocketClient::~UdpSocketClient() {}
 
-bool UdpSocketClient::SendPacket(cast::PacketRef packet,
+bool UdpSocketClient::SendPacket(media::cast::PacketRef packet,
                                  const base::RepeatingClosure& cb) {
   DVLOG(3) << __func__;
   DCHECK(resume_send_callback_.is_null());
@@ -102,7 +100,7 @@
 }
 
 void UdpSocketClient::StartReceiving(
-    const cast::PacketReceiverCallbackWithStatus& packet_receiver) {
+    const media::cast::PacketReceiverCallbackWithStatus& packet_receiver) {
   DVLOG(1) << __func__;
   packet_receiver_callback_ = packet_receiver;
   network::mojom::UDPSocketReceiverPtr udp_socket_receiver;
@@ -162,10 +160,9 @@
   }
   if (result != net::OK)
     return;
-  std::unique_ptr<cast::Packet> packet(
-      new cast::Packet(data->begin(), data->end()));
+  std::unique_ptr<media::cast::Packet> packet(
+      new media::cast::Packet(data->begin(), data->end()));
   packet_receiver_callback_.Run(std::move(packet));
 }
 
-}  // namespace cast
-}  // namespace media
+}  // namespace mirroring
diff --git a/media/cast/net/udp_socket_client.h b/components/mirroring/service/udp_socket_client.h
similarity index 83%
rename from media/cast/net/udp_socket_client.h
rename to components/mirroring/service/udp_socket_client.h
index c2e190e..2eda92f8 100644
--- a/media/cast/net/udp_socket_client.h
+++ b/components/mirroring/service/udp_socket_client.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MEDIA_CAST_NET_UDP_SOCKET_CLIENT_H_
-#define MEDIA_CAST_NET_UDP_SOCKET_CLIENT_H_
+#ifndef COMPONENTS_MIRRORING_SERVICE_UDP_SOCKET_CLIENT_H_
+#define COMPONENTS_MIRRORING_SERVICE_UDP_SOCKET_CLIENT_H_
 
 #include "base/callback.h"
 #include "media/cast/net/cast_transport_config.h"
@@ -12,8 +12,7 @@
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "services/network/public/mojom/udp_socket.mojom.h"
 
-namespace media {
-namespace cast {
+namespace mirroring {
 
 // This class implements a UDP packet transport that can send/receive UDP
 // packets to/from |remote_endpoint_| through a UDPSocket that implements
@@ -21,7 +20,7 @@
 // |remote_endpoint_| when StartReceiving() is called. Sending/Receiving ends
 // when StopReceiving() is called or this class is destructed. |error_callback|
 // will be called if the UDPSocket is failed to be created or connected.
-class UdpSocketClient final : public PacketTransport,
+class UdpSocketClient final : public media::cast::PacketTransport,
                               public network::mojom::UDPSocketReceiver {
  public:
   UdpSocketClient(const net::IPEndPoint& remote_endpoint,
@@ -30,12 +29,12 @@
 
   ~UdpSocketClient() override;
 
-  // cast::PacketTransport implementations.
-  bool SendPacket(cast::PacketRef packet,
+  // media::cast::PacketTransport implementations.
+  bool SendPacket(media::cast::PacketRef packet,
                   const base::RepeatingClosure& cb) override;
   int64_t GetBytesSent() override;
-  void StartReceiving(
-      const cast::PacketReceiverCallbackWithStatus& packet_receiver) override;
+  void StartReceiving(const media::cast::PacketReceiverCallbackWithStatus&
+                          packet_receiver) override;
   void StopReceiving() override;
 
   // network::mojom::UDPSocketReceiver implementation.
@@ -62,7 +61,7 @@
 
   // The callback to deliver the received packets to the packet parser. Set
   // when StartReceiving() is called.
-  cast::PacketReceiverCallbackWithStatus packet_receiver_callback_;
+  media::cast::PacketReceiverCallbackWithStatus packet_receiver_callback_;
 
   network::mojom::UDPSocketPtr udp_socket_;
 
@@ -88,7 +87,6 @@
   DISALLOW_COPY_AND_ASSIGN(UdpSocketClient);
 };
 
-}  // namespace cast
-}  // namespace media
+}  // namespace mirroring
 
-#endif  // MEDIA_CAST_NET_UDP_SOCKET_CLIENT_H_
+#endif  // COMPONENTS_MIRRORING_SERVICE_UDP_SOCKET_CLIENT_H_
diff --git a/components/mirroring/service/udp_socket_client_unittest.cc b/components/mirroring/service/udp_socket_client_unittest.cc
new file mode 100644
index 0000000..9ec51e2
--- /dev/null
+++ b/components/mirroring/service/udp_socket_client_unittest.cc
@@ -0,0 +1,135 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/mirroring/service/udp_socket_client.h"
+
+#include <algorithm>
+#include <string>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/test/mock_callback.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/time/time.h"
+#include "components/mirroring/service/fake_network_service.h"
+#include "media/cast/net/cast_transport_config.h"
+#include "media/cast/test/utility/net_utility.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "net/base/ip_endpoint.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::InvokeWithoutArgs;
+using media::cast::Packet;
+
+namespace mirroring {
+
+class UdpSocketClientTest : public ::testing::Test {
+ public:
+  UdpSocketClientTest() {
+    network::mojom::NetworkContextPtr network_context_ptr;
+    network_context_ = std::make_unique<MockNetworkContext>(
+        mojo::MakeRequest(&network_context_ptr));
+    udp_transport_client_ = std::make_unique<UdpSocketClient>(
+        media::cast::test::GetFreeLocalPort(), std::move(network_context_ptr),
+        base::OnceClosure());
+  }
+
+  ~UdpSocketClientTest() override = default;
+
+  MOCK_METHOD0(OnReceivedPacketCall, void());
+  bool OnReceivedPacket(std::unique_ptr<Packet> packet) {
+    received_packet_ = std::move(packet);
+    OnReceivedPacketCall();
+    return true;
+  }
+
+ protected:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  std::unique_ptr<MockNetworkContext> network_context_;
+  std::unique_ptr<UdpSocketClient> udp_transport_client_;
+  std::unique_ptr<Packet> received_packet_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UdpSocketClientTest);
+};
+
+TEST_F(UdpSocketClientTest, SendAndReceive) {
+  std::string data = "Test";
+  Packet packet(data.begin(), data.end());
+
+  {
+    // Expect the UDPSocket to be created when calling StartReceiving().
+    base::RunLoop run_loop;
+    EXPECT_CALL(*network_context_, OnUDPSocketCreated())
+        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+    udp_transport_client_->StartReceiving(base::BindRepeating(
+        &UdpSocketClientTest::OnReceivedPacket, base::Unretained(this)));
+    run_loop.Run();
+  }
+  scoped_task_environment_.RunUntilIdle();
+
+  MockUdpSocket* socket = network_context_->udp_socket();
+
+  {
+    // Request to send one packet.
+    base::RunLoop run_loop;
+    base::RepeatingClosure cb;
+    EXPECT_CALL(*socket, OnSend())
+        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+    EXPECT_TRUE(udp_transport_client_->SendPacket(
+        new base::RefCountedData<Packet>(packet), cb));
+    run_loop.Run();
+  }
+
+  // Expect the packet to be sent is delivered to the UDPSocket.
+  socket->VerifySendingPacket(packet);
+
+  // Test receiving packet.
+  std::string data2 = "Hello";
+  Packet packet2(data.begin(), data.end());
+  {
+    // Simulate receiving |packet2| from the network.
+    base::RunLoop run_loop;
+    EXPECT_CALL(*this, OnReceivedPacketCall())
+        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+    socket->OnReceivedPacket(packet2);
+    run_loop.Run();
+  }
+
+  // The packet is expected to be received.
+  EXPECT_TRUE(
+      std::equal(packet2.begin(), packet2.end(), received_packet_->begin()));
+
+  udp_transport_client_->StopReceiving();
+}
+
+TEST_F(UdpSocketClientTest, SendBeforeConnected) {
+  std::string data = "Test";
+  Packet packet(data.begin(), data.end());
+
+  // Request to send one packet.
+  base::MockCallback<base::RepeatingClosure> resume_send_cb;
+  {
+    EXPECT_CALL(resume_send_cb, Run()).Times(0);
+    EXPECT_FALSE(udp_transport_client_->SendPacket(
+        new base::RefCountedData<Packet>(packet), resume_send_cb.Get()));
+    scoped_task_environment_.RunUntilIdle();
+  }
+  {
+    // Expect the UDPSocket to be created when calling StartReceiving().
+    base::RunLoop run_loop;
+    EXPECT_CALL(*network_context_, OnUDPSocketCreated()).Times(1);
+    EXPECT_CALL(resume_send_cb, Run())
+        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+    udp_transport_client_->StartReceiving(base::BindRepeating(
+        &UdpSocketClientTest::OnReceivedPacket, base::Unretained(this)));
+    run_loop.Run();
+  }
+  udp_transport_client_->StopReceiving();
+}
+
+}  // namespace mirroring
diff --git a/components/ntp_snippets/contextual/contextual_content_suggestions_service.cc b/components/ntp_snippets/contextual/contextual_content_suggestions_service.cc
index a5f0887..6a5c0de 100644
--- a/components/ntp_snippets/contextual/contextual_content_suggestions_service.cc
+++ b/components/ntp_snippets/contextual/contextual_content_suggestions_service.cc
@@ -18,6 +18,10 @@
 
 namespace ntp_snippets {
 
+ContextualContentSuggestionsService::Cluster::Cluster() = default;
+
+ContextualContentSuggestionsService::Cluster::~Cluster() = default;
+
 ContextualContentSuggestionsService::ContextualContentSuggestionsService(
     std::unique_ptr<ContextualSuggestionsFetcher>
         contextual_suggestions_fetcher,
@@ -42,6 +46,12 @@
           base::Unretained(this), url, std::move(callback)));
 }
 
+void ContextualContentSuggestionsService::FetchContextualSuggestionClusters(
+    const GURL& url,
+    FetchContextualSuggestionClustersCallback callback) {
+  // Fetch suggestions using the updated fetcher.
+}
+
 void ContextualContentSuggestionsService::FetchContextualSuggestionImage(
     const ContentSuggestion::ID& suggestion_id,
     ImageFetchedCallback callback) {
diff --git a/components/ntp_snippets/contextual/contextual_content_suggestions_service.h b/components/ntp_snippets/contextual/contextual_content_suggestions_service.h
index 4b050ba..bee7905 100644
--- a/components/ntp_snippets/contextual/contextual_content_suggestions_service.h
+++ b/components/ntp_snippets/contextual/contextual_content_suggestions_service.h
@@ -38,18 +38,6 @@
     DISALLOW_COPY_AND_ASSIGN(Cluster);
   };
 
-  // Delegate for UI to hook into contextual suggestions service.
-  class Delegate {
-   public:
-    virtual ~Delegate() = default;
-
-    // Sends the new suggestions to the delegate, when they are available.
-    virtual void OnSuggestionsAvailable(std::vector<Cluster> clusters) = 0;
-    // Informs the delegate that user has switched to another tab or clobbered
-    // the current tab, therefore the UI state should be cleared.
-    virtual void OnStateCleared() = 0;
-  };
-
   ContextualContentSuggestionsService(
       std::unique_ptr<ContextualSuggestionsFetcher>
           contextual_suggestions_fetcher,
@@ -63,10 +51,18 @@
                               const GURL& url,
                               std::vector<ContentSuggestion> suggestions)>;
 
+  using FetchContextualSuggestionClustersCallback =
+      base::OnceCallback<void(std::vector<Cluster> clusters)>;
+
   // Asynchronously fetches contextual suggestions for the given URL.
   void FetchContextualSuggestions(const GURL& url,
                                   FetchContextualSuggestionsCallback callback);
 
+  // Asynchronously fetches contextual suggestions for the given URL.
+  void FetchContextualSuggestionClusters(
+      const GURL& url,
+      FetchContextualSuggestionClustersCallback callback);
+
   // Fetches an image for a given contextual suggestion ID.
   // Asynchronous if cache or network is queried.
   void FetchContextualSuggestionImage(
@@ -80,6 +76,10 @@
       Status status,
       ContextualSuggestionsFetcher::OptionalSuggestions fetched_suggestions);
 
+  void DidFetchContextualSuggestionsCluster(
+      FetchContextualSuggestionClustersCallback callback,
+      ContextualSuggestionsFetcher::OptionalSuggestions fetched_suggestions);
+
   // Cache for images of contextual suggestions, needed by CachedImageFetcher.
   std::unique_ptr<RemoteSuggestionsDatabase> contextual_suggestions_database_;
 
diff --git a/components/password_manager/content/common/credential_manager_mojom_traits.cc b/components/password_manager/content/common/credential_manager_mojom_traits.cc
index 8592c8d..85db1cc 100644
--- a/components/password_manager/content/common/credential_manager_mojom_traits.cc
+++ b/components/password_manager/content/common/credential_manager_mojom_traits.cc
@@ -90,6 +90,7 @@
     case password_manager::mojom::CredentialManagerError::NOT_ALLOWED:
     case password_manager::mojom::CredentialManagerError::NOT_SUPPORTED:
     case password_manager::mojom::CredentialManagerError::INVALID_DOMAIN:
+    case password_manager::mojom::CredentialManagerError::INVALID_STATE:
     case password_manager::mojom::CredentialManagerError::NOT_IMPLEMENTED:
     case password_manager::mojom::CredentialManagerError::UNKNOWN:
       *output = password_manager::CredentialManagerError::UNKNOWN;
diff --git a/components/rlz/rlz_tracker.cc b/components/rlz/rlz_tracker.cc
index ba9532e8..43139f1 100644
--- a/components/rlz/rlz_tracker.cc
+++ b/components/rlz/rlz_tracker.cc
@@ -23,6 +23,10 @@
 #include "build/build_config.h"
 #include "components/rlz/rlz_tracker_delegate.h"
 
+#if defined(OS_CHROMEOS)
+#include "base/syslog_logging.h"
+#endif
+
 namespace rlz {
 namespace {
 
@@ -247,6 +251,15 @@
   }
   delegate_->GetReactivationBrand(&reactivation_brand_);
 
+#if defined(OS_CHROMEOS)
+  // If the brand is organic, RLZ is essentially disabled.  Write a log to the
+  // console for administrators and QA.
+  if (delegate_->IsBrandOrganic(brand_) &&
+      delegate_->IsBrandOrganic(reactivation_brand_)) {
+    SYSLOG(INFO) << "RLZ is disabled";
+  }
+#endif
+
   // Could be null; don't run if so.  RLZ will try again next restart.
   net::URLRequestContextGetter* context_getter = delegate_->GetRequestContext();
   if (context_getter) {
diff --git a/components/security_interstitials/content/unsafe_resource.cc b/components/security_interstitials/content/unsafe_resource.cc
index cedabfe..6a29eb1 100644
--- a/components/security_interstitials/content/unsafe_resource.cc
+++ b/components/security_interstitials/content/unsafe_resource.cc
@@ -47,6 +47,8 @@
     case safe_browsing::SB_THREAT_TYPE_URL_CLIENT_SIDE_MALWARE:
     // Ad sampling happens in the background.
     case safe_browsing::SB_THREAT_TYPE_AD_SAMPLE:
+    // Password reuse warning happens after the page is finished loading.
+    case safe_browsing::SB_THREAT_TYPE_PASSWORD_REUSE:
     // Suspicious site collection happens in the background
     case safe_browsing::SB_THREAT_TYPE_SUSPICIOUS_SITE:
       return false;
diff --git a/components/sessions/core/base_session_service_commands.cc b/components/sessions/core/base_session_service_commands.cc
index 934f13d6..b6029a7 100644
--- a/components/sessions/core/base_session_service_commands.cc
+++ b/components/sessions/core/base_session_service_commands.cc
@@ -29,15 +29,24 @@
   }
 }
 
+bool ReadSessionIdFromPickle(base::PickleIterator* iterator, SessionID* id) {
+  SessionID::id_type value;
+  if (!iterator->ReadInt(&value)) {
+    return false;
+  }
+  *id = SessionID::FromSerializedValue(value);
+  return true;
+}
+
 }  // namespace
 
 std::unique_ptr<SessionCommand> CreateUpdateTabNavigationCommand(
-    SessionID::id_type command_id,
-    SessionID::id_type tab_id,
+    SessionCommand::id_type command_id,
+    SessionID tab_id,
     const sessions::SerializedNavigationEntry& navigation) {
   // Use pickle to handle marshalling.
   base::Pickle pickle;
-  pickle.WriteInt(tab_id);
+  pickle.WriteInt(tab_id.id());
   // We only allow navigations up to 63k (which should be completely
   // reasonable).
   static const size_t max_state_size =
@@ -48,12 +57,12 @@
 }
 
 std::unique_ptr<SessionCommand> CreateSetTabExtensionAppIDCommand(
-    SessionID::id_type command_id,
-    SessionID::id_type tab_id,
+    SessionCommand::id_type command_id,
+    SessionID tab_id,
     const std::string& extension_id) {
   // Use pickle to handle marshalling.
   base::Pickle pickle;
-  pickle.WriteInt(tab_id);
+  pickle.WriteInt(tab_id.id());
 
   // Enforce a max for ids. They should never be anywhere near this size.
   static const SessionCommand::size_type max_id_size =
@@ -68,12 +77,12 @@
 }
 
 std::unique_ptr<SessionCommand> CreateSetTabUserAgentOverrideCommand(
-    SessionID::id_type command_id,
-    SessionID::id_type tab_id,
+    SessionCommand::id_type command_id,
+    SessionID tab_id,
     const std::string& user_agent_override) {
   // Use pickle to handle marshalling.
   base::Pickle pickle;
-  pickle.WriteInt(tab_id);
+  pickle.WriteInt(tab_id.id());
 
   // Enforce a max for the user agent length.  They should never be anywhere
   // near this size.
@@ -90,12 +99,12 @@
 }
 
 std::unique_ptr<SessionCommand> CreateSetWindowAppNameCommand(
-    SessionID::id_type command_id,
-    SessionID::id_type window_id,
+    SessionCommand::id_type command_id,
+    SessionID window_id,
     const std::string& app_name) {
   // Use pickle to handle marshalling.
   base::Pickle pickle;
-  pickle.WriteInt(window_id);
+  pickle.WriteInt(window_id.id());
 
   // Enforce a max for ids. They should never be anywhere near this size.
   static const SessionCommand::size_type max_id_size =
@@ -112,45 +121,49 @@
 bool RestoreUpdateTabNavigationCommand(
     const SessionCommand& command,
     sessions::SerializedNavigationEntry* navigation,
-    SessionID::id_type* tab_id) {
+    SessionID* tab_id) {
   std::unique_ptr<base::Pickle> pickle(command.PayloadAsPickle());
   if (!pickle.get())
     return false;
   base::PickleIterator iterator(*pickle);
-  return iterator.ReadInt(tab_id) && navigation->ReadFromPickle(&iterator);
+  return ReadSessionIdFromPickle(&iterator, tab_id) &&
+         navigation->ReadFromPickle(&iterator);
 }
 
 bool RestoreSetTabExtensionAppIDCommand(const SessionCommand& command,
-                                        SessionID::id_type* tab_id,
+                                        SessionID* tab_id,
                                         std::string* extension_app_id) {
   std::unique_ptr<base::Pickle> pickle(command.PayloadAsPickle());
   if (!pickle.get())
     return false;
 
   base::PickleIterator iterator(*pickle);
-  return iterator.ReadInt(tab_id) && iterator.ReadString(extension_app_id);
+  return ReadSessionIdFromPickle(&iterator, tab_id) &&
+         iterator.ReadString(extension_app_id);
 }
 
 bool RestoreSetTabUserAgentOverrideCommand(const SessionCommand& command,
-                                           SessionID::id_type* tab_id,
+                                           SessionID* tab_id,
                                            std::string* user_agent_override) {
   std::unique_ptr<base::Pickle> pickle(command.PayloadAsPickle());
   if (!pickle.get())
     return false;
 
   base::PickleIterator iterator(*pickle);
-  return iterator.ReadInt(tab_id) && iterator.ReadString(user_agent_override);
+  return ReadSessionIdFromPickle(&iterator, tab_id) &&
+         iterator.ReadString(user_agent_override);
 }
 
 bool RestoreSetWindowAppNameCommand(const SessionCommand& command,
-                                    SessionID::id_type* window_id,
+                                    SessionID* window_id,
                                     std::string* app_name) {
   std::unique_ptr<base::Pickle> pickle(command.PayloadAsPickle());
   if (!pickle.get())
     return false;
 
   base::PickleIterator iterator(*pickle);
-  return iterator.ReadInt(window_id) && iterator.ReadString(app_name);
+  return ReadSessionIdFromPickle(&iterator, window_id) &&
+         iterator.ReadString(app_name);
 }
 
 }  // namespace sessions
diff --git a/components/sessions/core/base_session_service_commands.h b/components/sessions/core/base_session_service_commands.h
index 05fd51f..3fa30535 100644
--- a/components/sessions/core/base_session_service_commands.h
+++ b/components/sessions/core/base_session_service_commands.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "components/sessions/core/session_command.h"
 #include "components/sessions/core/session_id.h"
 #include "components/sessions/core/sessions_export.h"
 
@@ -19,61 +20,57 @@
 // PersistentTabRestoreService.
 
 // Creates a SessionCommand that represents a navigation.
-SESSIONS_EXPORT std::unique_ptr<SessionCommand>
-CreateUpdateTabNavigationCommand(
-    SessionID::id_type command_id,
-    SessionID::id_type tab_id,
+std::unique_ptr<SessionCommand> CreateUpdateTabNavigationCommand(
+    SessionCommand::id_type command_id,
+    SessionID tab_id,
     const sessions::SerializedNavigationEntry& navigation);
 
 // Creates a SessionCommand that represents marking a tab as an application.
-SESSIONS_EXPORT std::unique_ptr<SessionCommand>
-CreateSetTabExtensionAppIDCommand(SessionID::id_type command_id,
-                                  SessionID::id_type tab_id,
-                                  const std::string& extension_id);
+std::unique_ptr<SessionCommand> CreateSetTabExtensionAppIDCommand(
+    SessionCommand::id_type command_id,
+    SessionID tab_id,
+    const std::string& extension_id);
 
 // Creates a SessionCommand that containing user agent override used by a
 // tab's navigations.
-SESSIONS_EXPORT std::unique_ptr<SessionCommand>
-CreateSetTabUserAgentOverrideCommand(SessionID::id_type command_id,
-                                     SessionID::id_type tab_id,
-                                     const std::string& user_agent_override);
+std::unique_ptr<SessionCommand> CreateSetTabUserAgentOverrideCommand(
+    SessionCommand::id_type command_id,
+    SessionID tab_id,
+    const std::string& user_agent_override);
 
 // Creates a SessionCommand stores a browser window's app name.
-SESSIONS_EXPORT std::unique_ptr<SessionCommand> CreateSetWindowAppNameCommand(
-    SessionID::id_type command_id,
-    SessionID::id_type window_id,
+std::unique_ptr<SessionCommand> CreateSetWindowAppNameCommand(
+    SessionCommand::id_type command_id,
+    SessionID window_id,
     const std::string& app_name);
 
 // Converts a SessionCommand previously created by
 // CreateUpdateTabNavigationCommand into a
 // SerializedNavigationEntry. Returns true on success. If
 // successful |tab_id| is set to the id of the restored tab.
-SESSIONS_EXPORT bool RestoreUpdateTabNavigationCommand(
+bool RestoreUpdateTabNavigationCommand(
     const SessionCommand& command,
     sessions::SerializedNavigationEntry* navigation,
-    SessionID::id_type* tab_id);
+    SessionID* tab_id);
 
 // Extracts a SessionCommand as previously created by
 // CreateSetTabExtensionAppIDCommand into the tab id and application
 // extension id.
-SESSIONS_EXPORT bool RestoreSetTabExtensionAppIDCommand(
-    const SessionCommand& command,
-    SessionID::id_type* tab_id,
-    std::string* extension_app_id);
+bool RestoreSetTabExtensionAppIDCommand(const SessionCommand& command,
+                                        SessionID* tab_id,
+                                        std::string* extension_app_id);
 
 // Extracts a SessionCommand as previously created by
 // CreateSetTabUserAgentOverrideCommand into the tab id and user agent.
-SESSIONS_EXPORT bool RestoreSetTabUserAgentOverrideCommand(
-    const SessionCommand& command,
-    SessionID::id_type* tab_id,
-    std::string* user_agent_override);
+bool RestoreSetTabUserAgentOverrideCommand(const SessionCommand& command,
+                                           SessionID* tab_id,
+                                           std::string* user_agent_override);
 
 // Extracts a SessionCommand as previously created by
 // CreateSetWindowAppNameCommand into the window id and application name.
-SESSIONS_EXPORT bool RestoreSetWindowAppNameCommand(
-    const SessionCommand& command,
-    SessionID::id_type* window_id,
-    std::string* app_name);
+bool RestoreSetWindowAppNameCommand(const SessionCommand& command,
+                                    SessionID* window_id,
+                                    std::string* app_name);
 
 }  // namespace sessions
 
diff --git a/components/sessions/core/in_memory_tab_restore_service.cc b/components/sessions/core/in_memory_tab_restore_service.cc
index bfbf7ae..7ad73e7 100644
--- a/components/sessions/core/in_memory_tab_restore_service.cc
+++ b/components/sessions/core/in_memory_tab_restore_service.cc
@@ -61,13 +61,13 @@
 }
 
 std::unique_ptr<TabRestoreService::Tab>
-InMemoryTabRestoreService::RemoveTabEntryById(SessionID::id_type id) {
+InMemoryTabRestoreService::RemoveTabEntryById(SessionID id) {
   return helper_.RemoveTabEntryById(id);
 }
 
 std::vector<LiveTab*> InMemoryTabRestoreService::RestoreEntryById(
     LiveTabContext* context,
-    SessionID::id_type id,
+    SessionID id,
     WindowOpenDisposition disposition) {
   return helper_.RestoreEntryById(context, id, disposition);
 }
diff --git a/components/sessions/core/in_memory_tab_restore_service.h b/components/sessions/core/in_memory_tab_restore_service.h
index b2ca707..07a4ab3 100644
--- a/components/sessions/core/in_memory_tab_restore_service.h
+++ b/components/sessions/core/in_memory_tab_restore_service.h
@@ -43,10 +43,10 @@
   const Entries& entries() const override;
   std::vector<LiveTab*> RestoreMostRecentEntry(
       LiveTabContext* context) override;
-  std::unique_ptr<Tab> RemoveTabEntryById(SessionID::id_type id) override;
+  std::unique_ptr<Tab> RemoveTabEntryById(SessionID id) override;
   std::vector<LiveTab*> RestoreEntryById(
       LiveTabContext* context,
-      SessionID::id_type id,
+      SessionID id,
       WindowOpenDisposition disposition) override;
   void LoadTabsFromLastSession() override;
   bool IsLoaded() const override;
diff --git a/components/sessions/core/persistent_tab_restore_service.cc b/components/sessions/core/persistent_tab_restore_service.cc
index ba77aa9..f46f5878 100644
--- a/components/sessions/core/persistent_tab_restore_service.cc
+++ b/components/sessions/core/persistent_tab_restore_service.cc
@@ -111,7 +111,7 @@
 const size_t kMaxEntries = TabRestoreServiceHelper::kMaxEntries;
 
 void RemoveEntryByID(
-    SessionID::id_type id,
+    SessionID id,
     std::vector<std::unique_ptr<TabRestoreService::Entry>>* entries) {
   // Look for the entry in the top-level collection.
   for (auto it = entries->begin(); it != entries->end(); ++it) {
@@ -230,7 +230,7 @@
 
 std::unique_ptr<sessions::TabRestoreService::Window>
 CreateWindowEntryFromCommand(const SessionCommand* command,
-                             SessionID::id_type* window_id,
+                             SessionID* window_id,
                              int32_t* num_tabs) {
   WindowCommandFields fields;
   ui::WindowShowState show_state = ui::SHOW_STATE_DEFAULT;
@@ -315,7 +315,7 @@
       std::make_unique<sessions::TabRestoreService::Window>();
   window->selected_tab_index = fields.selected_tab_index;
   window->timestamp = base::Time::FromInternalValue(fields.timestamp);
-  *window_id = static_cast<SessionID::id_type>(fields.window_id);
+  *window_id = SessionID::FromSerializedValue(fields.window_id);
   *num_tabs = fields.num_tabs;
 
   // Set the bounds, show state and workspace if valid ones have been provided.
@@ -353,7 +353,7 @@
   // TabRestoreServiceHelper::Observer:
   void OnClearEntries() override;
   void OnNavigationEntriesDeleted() override;
-  void OnRestoreEntryById(SessionID::id_type id,
+  void OnRestoreEntryById(SessionID id,
                           Entries::const_iterator entry_iterator) override;
   void OnAddEntry() override;
 
@@ -384,7 +384,7 @@
 
   // Creates a window close command.
   static std::unique_ptr<SessionCommand> CreateWindowCommand(
-      SessionID::id_type window_id,
+      SessionID window_id,
       int selected_tab_index,
       int num_tabs,
       const gfx::Rect& bounds,
@@ -394,13 +394,13 @@
 
   // Creates a tab close command.
   static std::unique_ptr<SessionCommand> CreateSelectedNavigationInTabCommand(
-      SessionID::id_type tab_id,
+      SessionID tab_id,
       int32_t index,
       base::Time timestamp);
 
   // Creates a restore command.
   static std::unique_ptr<SessionCommand> CreateRestoredEntryCommand(
-      SessionID::id_type entry_id);
+      SessionID entry_id);
 
   // Returns the index to persist as the selected index. This is the same as
   // |tab.current_navigation_index| unless the entry at
@@ -429,7 +429,7 @@
   // invokes LoadStateChanged. |ignored_active_window| is ignored because we
   // don't need to restore activation.
   void OnGotPreviousSession(std::vector<std::unique_ptr<SessionWindow>> windows,
-                            SessionID::id_type ignored_active_window);
+                            SessionID ignored_active_window);
 
   // Converts a SessionWindow into a Window, returning true on success. We use 0
   // as the timestamp here since we do not know when the window/tab was closed.
@@ -536,7 +536,8 @@
   base_session_service_->set_pending_reset(true);
   // Schedule a command, otherwise if there are no pending commands Save does
   // nothing.
-  base_session_service_->ScheduleCommand(CreateRestoredEntryCommand(1));
+  base_session_service_->ScheduleCommand(
+      CreateRestoredEntryCommand(SessionID::InvalidValue()));
 }
 
 void PersistentTabRestoreService::Delegate::OnNavigationEntriesDeleted() {
@@ -547,11 +548,12 @@
   base_session_service_->set_pending_reset(true);
   // Schedule a command, otherwise if there are no pending commands Save does
   // nothing.
-  base_session_service_->ScheduleCommand(CreateRestoredEntryCommand(1));
+  base_session_service_->ScheduleCommand(
+      CreateRestoredEntryCommand(SessionID::InvalidValue()));
 }
 
 void PersistentTabRestoreService::Delegate::OnRestoreEntryById(
-    SessionID::id_type id,
+    SessionID id,
     Entries::const_iterator entry_iterator) {
   size_t index = 0;
   const Entries& entries = tab_restore_service_helper_->entries();
@@ -710,7 +712,7 @@
 // static
 std::unique_ptr<SessionCommand>
 PersistentTabRestoreService::Delegate::CreateWindowCommand(
-    SessionID::id_type window_id,
+    SessionID window_id,
     int selected_tab_index,
     int num_tabs,
     const gfx::Rect& bounds,
@@ -723,7 +725,7 @@
   // Use a pickle to handle marshaling as this command contains variable-length
   // content.
   base::Pickle pickle;
-  pickle.WriteInt(static_cast<int>(window_id));
+  pickle.WriteInt(static_cast<int>(window_id.id()));
   pickle.WriteInt(selected_tab_index);
   pickle.WriteInt(num_tabs);
   pickle.WriteInt64(timestamp.ToInternalValue());
@@ -748,11 +750,11 @@
 // static
 std::unique_ptr<SessionCommand>
 PersistentTabRestoreService::Delegate::CreateSelectedNavigationInTabCommand(
-    SessionID::id_type tab_id,
+    SessionID tab_id,
     int32_t index,
     base::Time timestamp) {
   SelectedNavigationInTabPayload2 payload;
-  payload.id = tab_id;
+  payload.id = tab_id.id();
   payload.index = index;
   payload.timestamp = timestamp.ToInternalValue();
   std::unique_ptr<SessionCommand> command(
@@ -764,8 +766,8 @@
 // static
 std::unique_ptr<SessionCommand>
 PersistentTabRestoreService::Delegate::CreateRestoredEntryCommand(
-    SessionID::id_type entry_id) {
-  RestoredEntryPayload payload = entry_id;
+    SessionID entry_id) {
+  RestoredEntryPayload payload = entry_id.id();
   std::unique_ptr<SessionCommand> command(
       new SessionCommand(kCommandRestoredEntry, sizeof(payload)));
   memcpy(command->contents(), &payload, sizeof(payload));
@@ -842,7 +844,7 @@
         RestoredEntryPayload payload;
         if (!command.GetPayload(&payload, sizeof(payload)))
           return;
-        RemoveEntryByID(payload, &entries);
+        RemoveEntryByID(SessionID::FromSerializedValue(payload), &entries);
         break;
       }
 
@@ -855,7 +857,7 @@
 
         // Try to parse the command, and silently skip if it fails.
         int32_t num_tabs = 0;
-        SessionID::id_type window_id = 0;
+        SessionID window_id = SessionID::InvalidValue();
         std::unique_ptr<Window> window =
             CreateWindowEntryFromCommand(&command, &window_id, &num_tabs);
         if (!window)
@@ -896,7 +898,7 @@
           if (--pending_window_tabs == 0)
             current_window = nullptr;
         } else {
-          RemoveEntryByID(payload.id, &entries);
+          RemoveEntryByID(SessionID::FromSerializedValue(payload.id), &entries);
           entries.push_back(std::make_unique<Tab>());
           current_tab = static_cast<Tab*>(entries.back().get());
           current_tab->timestamp =
@@ -912,7 +914,7 @@
           return;
         }
         current_tab->navigations.resize(current_tab->navigations.size() + 1);
-        SessionID::id_type tab_id;
+        SessionID tab_id = SessionID::InvalidValue();
         if (!RestoreUpdateTabNavigationCommand(command,
                                                &current_tab->navigations.back(),
                                                &tab_id)) {
@@ -943,7 +945,7 @@
           return;
         }
 
-        SessionID::id_type window_id;
+        SessionID window_id = SessionID::InvalidValue();
         std::string app_name;
         if (!RestoreSetWindowAppNameCommand(command, &window_id, &app_name))
           return;
@@ -957,7 +959,7 @@
           // Should be in a tab when we get this.
           return;
         }
-        SessionID::id_type tab_id;
+        SessionID tab_id = SessionID::InvalidValue();
         std::string extension_app_id;
         if (!RestoreSetTabExtensionAppIDCommand(command,
                                                 &tab_id,
@@ -973,7 +975,7 @@
           // Should be in a tab when we get this.
           return;
         }
-        SessionID::id_type tab_id;
+        SessionID tab_id = SessionID::InvalidValue();
         std::string user_agent_override;
         if (!RestoreSetTabUserAgentOverrideCommand(command,
                                                    &tab_id,
@@ -1011,7 +1013,7 @@
 
 void PersistentTabRestoreService::Delegate::OnGotPreviousSession(
     std::vector<std::unique_ptr<SessionWindow>> windows,
-    SessionID::id_type ignored_active_window) {
+    SessionID ignored_active_window) {
   std::vector<std::unique_ptr<Entry>> entries;
   CreateEntriesFromWindows(&windows, &entries);
   // Previous session tabs go first.
@@ -1151,13 +1153,13 @@
 }
 
 std::unique_ptr<TabRestoreService::Tab>
-PersistentTabRestoreService::RemoveTabEntryById(SessionID::id_type id) {
+PersistentTabRestoreService::RemoveTabEntryById(SessionID id) {
   return helper_.RemoveTabEntryById(id);
 }
 
 std::vector<LiveTab*> PersistentTabRestoreService::RestoreEntryById(
     LiveTabContext* context,
-    SessionID::id_type id,
+    SessionID id,
     WindowOpenDisposition disposition) {
   return helper_.RestoreEntryById(context, id, disposition);
 }
diff --git a/components/sessions/core/persistent_tab_restore_service.h b/components/sessions/core/persistent_tab_restore_service.h
index 206ca4ae..1ac2659 100644
--- a/components/sessions/core/persistent_tab_restore_service.h
+++ b/components/sessions/core/persistent_tab_restore_service.h
@@ -39,10 +39,10 @@
   const Entries& entries() const override;
   std::vector<LiveTab*> RestoreMostRecentEntry(
       LiveTabContext* context) override;
-  std::unique_ptr<Tab> RemoveTabEntryById(SessionID::id_type id) override;
+  std::unique_ptr<Tab> RemoveTabEntryById(SessionID id) override;
   std::vector<LiveTab*> RestoreEntryById(
       LiveTabContext* context,
-      SessionID::id_type id,
+      SessionID id,
       WindowOpenDisposition disposition) override;
   void LoadTabsFromLastSession() override;
   bool IsLoaded() const override;
diff --git a/components/sessions/core/session_service_commands.cc b/components/sessions/core/session_service_commands.cc
index e78449f0..5d40ee2 100644
--- a/components/sessions/core/session_service_commands.cc
+++ b/components/sessions/core/session_service_commands.cc
@@ -117,10 +117,8 @@
   PERSISTED_SHOW_STATE_END = 8,
 };
 
-using IdToSessionTab =
-    std::map<SessionID::id_type, std::unique_ptr<SessionTab>>;
-using IdToSessionWindow =
-    std::map<SessionID::id_type, std::unique_ptr<SessionWindow>>;
+using IdToSessionTab = std::map<SessionID, std::unique_ptr<SessionTab>>;
+using IdToSessionWindow = std::map<SessionID, std::unique_ptr<SessionWindow>>;
 
 // Assert to ensure PersistedWindowShowState is updated if ui::WindowShowState
 // is changed.
@@ -190,12 +188,11 @@
 
 // Returns the window in windows with the specified id. If a window does
 // not exist, one is created.
-SessionWindow* GetWindow(SessionID::id_type window_id,
-                         IdToSessionWindow* windows) {
+SessionWindow* GetWindow(SessionID window_id, IdToSessionWindow* windows) {
   auto i = windows->find(window_id);
   if (i == windows->end()) {
     SessionWindow* window = new SessionWindow();
-    window->window_id.set_id(window_id);
+    window->window_id = window_id;
     (*windows)[window_id] = base::WrapUnique(window);
     return window;
   }
@@ -204,12 +201,12 @@
 
 // Returns the tab with the specified id in tabs. If a tab does not exist,
 // it is created.
-SessionTab* GetTab(SessionID::id_type tab_id, IdToSessionTab* tabs) {
+SessionTab* GetTab(SessionID tab_id, IdToSessionTab* tabs) {
   DCHECK(tabs);
   auto i = tabs->find(tab_id);
   if (i == tabs->end()) {
     SessionTab* tab = new SessionTab();
-    tab->tab_id.set_id(tab_id);
+    tab->tab_id = tab_id;
     (*tabs)[tab_id] = base::WrapUnique(tab);
     return tab;
   }
@@ -293,7 +290,7 @@
       continue;
 
     SessionTab* tab_ptr = tab.get();
-    SessionWindow* window = GetWindow(tab_ptr->window_id.id(), windows);
+    SessionWindow* window = GetWindow(tab_ptr->window_id, windows);
     window->tabs.push_back(std::move(tab));
 
     // See note in SessionTab as to why we do this.
@@ -324,7 +321,7 @@
     const std::vector<std::unique_ptr<SessionCommand>>& data,
     IdToSessionTab* tabs,
     IdToSessionWindow* windows,
-    SessionID::id_type* active_window_id) {
+    SessionID* active_window_id) {
   // If the file is corrupt (command with wrong size, or unknown command), we
   // still return true and attempt to restore what we we can.
   DVLOG(1) << "CreateTabsAndWindows";
@@ -341,7 +338,9 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetTab(payload[1], tabs)->window_id.set_id(payload[0]);
+        SessionID window_id = SessionID::FromSerializedValue(payload[0]);
+        SessionID tab_id = SessionID::FromSerializedValue(payload[1]);
+        GetTab(tab_id, tabs)->window_id = window_id;
         break;
       }
 
@@ -353,13 +352,12 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x,
-                                                              payload.y,
-                                                              payload.w,
-                                                              payload.h);
-        GetWindow(payload.window_id, windows)->show_state =
-            payload.is_maximized ?
-                ui::SHOW_STATE_MAXIMIZED : ui::SHOW_STATE_NORMAL;
+        SessionID window_id = SessionID::FromSerializedValue(payload.window_id);
+        GetWindow(window_id, windows)
+            ->bounds.SetRect(payload.x, payload.y, payload.w, payload.h);
+        GetWindow(window_id, windows)->show_state =
+            payload.is_maximized ? ui::SHOW_STATE_MAXIMIZED
+                                 : ui::SHOW_STATE_NORMAL;
         break;
       }
 
@@ -369,11 +367,10 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x,
-                                                              payload.y,
-                                                              payload.w,
-                                                              payload.h);
-        GetWindow(payload.window_id, windows)->show_state =
+        SessionID window_id = SessionID::FromSerializedValue(payload.window_id);
+        GetWindow(window_id, windows)
+            ->bounds.SetRect(payload.x, payload.y, payload.w, payload.h);
+        GetWindow(window_id, windows)->show_state =
             PersistedShowStateToShowState(payload.show_state);
         break;
       }
@@ -384,7 +381,8 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetTab(payload.id, tabs)->tab_visual_index = payload.index;
+        SessionID tab_id = SessionID::FromSerializedValue(payload.id);
+        GetTab(tab_id, tabs)->tab_visual_index = payload.index;
         break;
       }
 
@@ -396,9 +394,9 @@
           return true;
         }
         if (command->id() == kCommandTabClosed)
-          tabs->erase(payload.id);
+          tabs->erase(SessionID::FromSerializedValue(payload.id));
         else
-          windows->erase(payload.id);
+          windows->erase(SessionID::FromSerializedValue(payload.id));
 
         break;
       }
@@ -409,7 +407,8 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        SessionTab* tab = GetTab(payload.id, tabs);
+        SessionTab* tab =
+            GetTab(SessionID::FromSerializedValue(payload.id), tabs);
         tab->navigations.erase(
             FindClosestNavigationWithIndex(&(tab->navigations), payload.index),
             tab->navigations.end());
@@ -423,7 +422,8 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        SessionTab* tab = GetTab(payload.id, tabs);
+        SessionTab* tab =
+            GetTab(SessionID::FromSerializedValue(payload.id), tabs);
 
         // Update the selected navigation index.
         tab->current_navigation_index =
@@ -442,7 +442,7 @@
 
       case kCommandUpdateTabNavigation: {
         sessions::SerializedNavigationEntry navigation;
-        SessionID::id_type tab_id;
+        SessionID tab_id = SessionID::InvalidValue();
         if (!RestoreUpdateTabNavigationCommand(*command,
                                                &navigation,
                                                &tab_id)) {
@@ -465,7 +465,8 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetTab(payload.id, tabs)->current_navigation_index = payload.index;
+        GetTab(SessionID::FromSerializedValue(payload.id), tabs)
+            ->current_navigation_index = payload.index;
         break;
       }
 
@@ -475,7 +476,8 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetWindow(payload.id, windows)->selected_tab_index = payload.index;
+        GetWindow(SessionID::FromSerializedValue(payload.id), windows)
+            ->selected_tab_index = payload.index;
         break;
       }
 
@@ -485,8 +487,9 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetWindow(payload.id, windows)->is_constrained = false;
-        GetWindow(payload.id, windows)->type =
+        SessionID window_id = SessionID::FromSerializedValue(payload.id);
+        GetWindow(window_id, windows)->is_constrained = false;
+        GetWindow(window_id, windows)->type =
             static_cast<SessionWindow::WindowType>(payload.index);
         break;
       }
@@ -497,12 +500,13 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetTab(payload.tab_id, tabs)->pinned = payload.pinned_state;
+        GetTab(SessionID::FromSerializedValue(payload.tab_id), tabs)->pinned =
+            payload.pinned_state;
         break;
       }
 
       case kCommandSetWindowAppName: {
-        SessionID::id_type window_id;
+        SessionID window_id = SessionID::InvalidValue();
         std::string app_name;
         if (!RestoreSetWindowAppNameCommand(*command, &window_id, &app_name))
           return true;
@@ -512,7 +516,7 @@
       }
 
       case kCommandSetExtensionAppID: {
-        SessionID::id_type tab_id;
+        SessionID tab_id = SessionID::InvalidValue();
         std::string extension_app_id;
         if (!RestoreSetTabExtensionAppIDCommand(*command,
                                                 &tab_id,
@@ -526,7 +530,7 @@
       }
 
       case kCommandSetTabUserAgentOverride: {
-        SessionID::id_type tab_id;
+        SessionID tab_id = SessionID::InvalidValue();
         std::string user_agent_override;
         if (!RestoreSetTabUserAgentOverrideCommand(
                 *command,
@@ -549,8 +553,8 @@
             !iter.ReadString(&session_storage_persistent_id))
           return true;
         // Associate the session storage back.
-        GetTab(command_tab_id, tabs)->session_storage_persistent_id =
-            session_storage_persistent_id;
+        GetTab(SessionID::FromSerializedValue(command_tab_id), tabs)
+            ->session_storage_persistent_id = session_storage_persistent_id;
         break;
       }
 
@@ -560,7 +564,7 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        *active_window_id = payload;
+        *active_window_id = SessionID::FromSerializedValue(payload);
         break;
       }
 
@@ -570,7 +574,8 @@
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        SessionTab* tab = GetTab(payload.tab_id, tabs);
+        SessionTab* tab =
+            GetTab(SessionID::FromSerializedValue(payload.tab_id), tabs);
         tab->last_active_time =
             base::TimeTicks::FromInternalValue(payload.last_active_time);
         break;
@@ -579,13 +584,14 @@
       case kCommandSetWindowWorkspace2: {
         std::unique_ptr<base::Pickle> pickle(command->PayloadAsPickle());
         base::PickleIterator it(*pickle);
-        SessionID::id_type window_id;
+        SessionID::id_type window_id = -1;
         std::string workspace;
          if (!it.ReadInt(&window_id) || !it.ReadString(&workspace)) {
           DVLOG(1) << "Failed reading command " << command->id();
           return true;
         }
-        GetWindow(window_id, windows)->workspace = workspace;
+        GetWindow(SessionID::FromSerializedValue(window_id), windows)
+            ->workspace = workspace;
         break;
       }
 
@@ -652,14 +658,13 @@
   return command;
 }
 
-std::unique_ptr<SessionCommand> CreateTabClosedCommand(
-    const SessionID::id_type tab_id) {
+std::unique_ptr<SessionCommand> CreateTabClosedCommand(const SessionID tab_id) {
   ClosedPayload payload;
   // Because of what appears to be a compiler bug setting payload to {0} doesn't
   // set the padding to 0, resulting in Purify reporting an UMR when we write
   // the structure to disk. To avoid this we explicitly memset the struct.
   memset(&payload, 0, sizeof(payload));
-  payload.id = tab_id;
+  payload.id = tab_id.id();
   payload.close_time = base::Time::Now().ToInternalValue();
   std::unique_ptr<SessionCommand> command =
       std::make_unique<SessionCommand>(kCommandTabClosed, sizeof(payload));
@@ -668,11 +673,11 @@
 }
 
 std::unique_ptr<SessionCommand> CreateWindowClosedCommand(
-    const SessionID::id_type window_id) {
+    const SessionID window_id) {
   ClosedPayload payload;
   // See comment in CreateTabClosedCommand as to why we do this.
   memset(&payload, 0, sizeof(payload));
-  payload.id = window_id;
+  payload.id = window_id.id();
   payload.close_time = base::Time::Now().ToInternalValue();
   std::unique_ptr<SessionCommand> command =
       std::make_unique<SessionCommand>(kCommandWindowClosed, sizeof(payload));
@@ -786,33 +791,29 @@
 std::unique_ptr<SessionCommand> CreateUpdateTabNavigationCommand(
     const SessionID& tab_id,
     const sessions::SerializedNavigationEntry& navigation) {
-  return CreateUpdateTabNavigationCommand(kCommandUpdateTabNavigation,
-                                            tab_id.id(),
-                                            navigation);
+  return CreateUpdateTabNavigationCommand(kCommandUpdateTabNavigation, tab_id,
+                                          navigation);
 }
 
 std::unique_ptr<SessionCommand> CreateSetTabExtensionAppIDCommand(
     const SessionID& tab_id,
     const std::string& extension_id) {
-  return CreateSetTabExtensionAppIDCommand(kCommandSetExtensionAppID,
-                                             tab_id.id(),
-                                             extension_id);
+  return CreateSetTabExtensionAppIDCommand(kCommandSetExtensionAppID, tab_id,
+                                           extension_id);
 }
 
 std::unique_ptr<SessionCommand> CreateSetTabUserAgentOverrideCommand(
     const SessionID& tab_id,
     const std::string& user_agent_override) {
   return CreateSetTabUserAgentOverrideCommand(kCommandSetTabUserAgentOverride,
-                                                tab_id.id(),
-                                                user_agent_override);
+                                              tab_id, user_agent_override);
 }
 
 std::unique_ptr<SessionCommand> CreateSetWindowAppNameCommand(
     const SessionID& window_id,
     const std::string& app_name) {
-  return CreateSetWindowAppNameCommand(kCommandSetWindowAppName,
-                                         window_id.id(),
-                                         app_name);
+  return CreateSetWindowAppNameCommand(kCommandSetWindowAppName, window_id,
+                                       app_name);
 }
 
 bool ReplacePendingCommand(BaseSessionService* base_session_service,
@@ -880,7 +881,7 @@
 void RestoreSessionFromCommands(
     const std::vector<std::unique_ptr<SessionCommand>>& commands,
     std::vector<std::unique_ptr<SessionWindow>>* valid_windows,
-    SessionID::id_type* active_window_id) {
+    SessionID* active_window_id) {
   IdToSessionTab tabs;
   IdToSessionWindow windows;
 
diff --git a/components/sessions/core/session_service_commands.h b/components/sessions/core/session_service_commands.h
index be85475..1e3a1746 100644
--- a/components/sessions/core/session_service_commands.h
+++ b/components/sessions/core/session_service_commands.h
@@ -36,9 +36,9 @@
 SESSIONS_EXPORT std::unique_ptr<SessionCommand>
 CreateSetTabIndexInWindowCommand(const SessionID& tab_id, int new_index);
 SESSIONS_EXPORT std::unique_ptr<SessionCommand> CreateTabClosedCommand(
-    SessionID::id_type tab_id);
+    SessionID tab_id);
 SESSIONS_EXPORT std::unique_ptr<SessionCommand> CreateWindowClosedCommand(
-    SessionID::id_type tab_id);
+    SessionID tab_id);
 SESSIONS_EXPORT std::unique_ptr<SessionCommand>
 CreateSetSelectedNavigationIndexCommand(const SessionID& tab_id, int index);
 SESSIONS_EXPORT std::unique_ptr<SessionCommand> CreateSetWindowTypeCommand(
@@ -98,7 +98,7 @@
 SESSIONS_EXPORT void RestoreSessionFromCommands(
     const std::vector<std::unique_ptr<SessionCommand>>& commands,
     std::vector<std::unique_ptr<SessionWindow>>* valid_windows,
-    SessionID::id_type* active_window_id);
+    SessionID* active_window_id);
 
 }  // namespace sessions
 
diff --git a/components/sessions/core/session_types.cc b/components/sessions/core/session_types.cc
index 4b7ced9..ff8a23e 100644
--- a/components/sessions/core/session_types.cc
+++ b/components/sessions/core/session_types.cc
@@ -15,18 +15,19 @@
 // SessionTab -----------------------------------------------------------------
 
 SessionTab::SessionTab()
-    : tab_visual_index(-1),
+    : window_id(SessionID::NewUnique()),
+      tab_id(SessionID::NewUnique()),
+      tab_visual_index(-1),
       current_navigation_index(-1),
-      pinned(false) {
-}
+      pinned(false) {}
 
 SessionTab::~SessionTab() {
 }
 
 void SessionTab::SetFromSyncData(const sync_pb::SessionTab& sync_data,
                                  base::Time timestamp) {
-  window_id.set_id(sync_data.window_id());
-  tab_id.set_id(sync_data.tab_id());
+  window_id = SessionID::FromSerializedValue(sync_data.window_id());
+  tab_id = SessionID::FromSerializedValue(sync_data.tab_id());
   tab_visual_index = sync_data.tab_visual_index();
   current_navigation_index = sync_data.current_navigation_index();
   pinned = sync_data.pinned();
@@ -58,7 +59,8 @@
 // SessionWindow ---------------------------------------------------------------
 
 SessionWindow::SessionWindow()
-    : selected_tab_index(-1),
+    : window_id(SessionID::NewUnique()),
+      selected_tab_index(-1),
       type(TYPE_TABBED),
       is_constrained(true),
       show_state(ui::SHOW_STATE_DEFAULT) {}
diff --git a/components/sessions/core/tab_restore_service.cc b/components/sessions/core/tab_restore_service.cc
index bd3183f..f6dde30 100644
--- a/components/sessions/core/tab_restore_service.cc
+++ b/components/sessions/core/tab_restore_service.cc
@@ -14,11 +14,10 @@
 
 // Entry ----------------------------------------------------------------------
 
-// ID of the next Entry.
-static SessionID::id_type next_entry_id = 1;
-
 TabRestoreService::Entry::~Entry() = default;
-TabRestoreService::Entry::Entry(Type type) : id(next_entry_id++), type(type) {}
+
+TabRestoreService::Entry::Entry(Type type)
+    : id(SessionID::NewUnique()), type(type) {}
 
 size_t TabRestoreService::Entry::EstimateMemoryUsage() const {
   return 0;
diff --git a/components/sessions/core/tab_restore_service.h b/components/sessions/core/tab_restore_service.h
index 5a84024..c83730c 100644
--- a/components/sessions/core/tab_restore_service.h
+++ b/components/sessions/core/tab_restore_service.h
@@ -58,7 +58,7 @@
 
     // Unique id for this entry. The id is guaranteed to be unique for a
     // session.
-    SessionID::id_type id;
+    SessionID id;
 
     // The type of the entry.
     const Type type;
@@ -186,7 +186,7 @@
       LiveTabContext* context) = 0;
 
   // Removes the Tab with id |id| from the list and returns it.
-  virtual std::unique_ptr<Tab> RemoveTabEntryById(SessionID::id_type id) = 0;
+  virtual std::unique_ptr<Tab> RemoveTabEntryById(SessionID id) = 0;
 
   // Restores an entry by id. If there is no entry with an id matching |id|,
   // this does nothing. If |context| is NULL, this creates a new window for the
@@ -196,7 +196,7 @@
   // tab(s).
   virtual std::vector<LiveTab*> RestoreEntryById(
       LiveTabContext* context,
-      SessionID::id_type id,
+      SessionID id,
       WindowOpenDisposition disposition) = 0;
 
   // Loads the tabs and previous session. This does nothing if the tabs
diff --git a/components/sessions/core/tab_restore_service_client.h b/components/sessions/core/tab_restore_service_client.h
index 60cdc1ea..f9388fe9 100644
--- a/components/sessions/core/tab_restore_service_client.h
+++ b/components/sessions/core/tab_restore_service_client.h
@@ -33,7 +33,7 @@
 // The second parameter is the id of the window that was last active.
 using GetLastSessionCallback =
     base::Callback<void(std::vector<std::unique_ptr<SessionWindow>>,
-                        SessionID::id_type)>;
+                        SessionID)>;
 
 // A client interface that needs to be supplied to the tab restore service by
 // the embedder.
@@ -56,8 +56,7 @@
 
   // Returns the LiveTabContext instance that is associated with |desired_id|,
   // or null if there is no such instance.
-  virtual LiveTabContext* FindLiveTabContextWithID(
-      SessionID::id_type desired_id) = 0;
+  virtual LiveTabContext* FindLiveTabContextWithID(SessionID desired_id) = 0;
 
   // Returns whether a given URL should be tracked for restoring.
   virtual bool ShouldTrackURLForRestore(const GURL& url) = 0;
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc
index 66feac6..d7e3a95 100644
--- a/components/sessions/core/tab_restore_service_helper.cc
+++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -37,9 +37,8 @@
 void TabRestoreServiceHelper::Observer::OnNavigationEntriesDeleted() {}
 
 void TabRestoreServiceHelper::Observer::OnRestoreEntryById(
-    SessionID::id_type id,
-    Entries::const_iterator entry_iterator) {
-}
+    SessionID id,
+    Entries::const_iterator entry_iterator) {}
 
 void TabRestoreServiceHelper::Observer::OnAddEntry() {}
 
@@ -243,7 +242,7 @@
 }
 
 std::unique_ptr<TabRestoreService::Tab>
-TabRestoreServiceHelper::RemoveTabEntryById(SessionID::id_type id) {
+TabRestoreServiceHelper::RemoveTabEntryById(SessionID id) {
   auto it = GetEntryIteratorById(id);
   if (it == entries_.end())
     return nullptr;
@@ -258,7 +257,7 @@
 
 std::vector<LiveTab*> TabRestoreServiceHelper::RestoreEntryById(
     LiveTabContext* context,
-    SessionID::id_type id,
+    SessionID id,
     WindowOpenDisposition disposition) {
   Entries::iterator entry_iterator = GetEntryIteratorById(id);
   if (entry_iterator == entries_.end()) {
@@ -315,7 +314,7 @@
         }
         // All the window's tabs had the same former browser_id.
         if (auto browser_id = window.tabs[0]->browser_id) {
-          UpdateTabBrowserIDs(browser_id, context->GetSessionID().id());
+          UpdateTabBrowserIDs(browser_id, context->GetSessionID());
         }
       } else {
         // Restore a single tab from the window. Find the tab that matches the
@@ -343,7 +342,7 @@
             // any one is restored, it goes into the same window as the tab
             // being restored now.
             UpdateTabBrowserIDs(restored_tab_browser_id,
-                                context->GetSessionID().id());
+                                context->GetSessionID());
             for (auto& tab_j : window.tabs)
               tab_j->browser_id = context->GetSessionID().id();
           }
@@ -417,7 +416,7 @@
 }
 
 TabRestoreService::Entries::iterator
-TabRestoreServiceHelper::GetEntryIteratorById(SessionID::id_type id) {
+TabRestoreServiceHelper::GetEntryIteratorById(SessionID id) {
   for (Entries::iterator i = entries_.begin(); i != entries_.end(); ++i) {
     if ((*i)->id == id)
       return i;
@@ -545,7 +544,8 @@
   } else {
     // We only respect the tab's original browser if there's no disposition.
     if (disposition == WindowOpenDisposition::UNKNOWN && tab.browser_id) {
-      context = client_->FindLiveTabContextWithID(tab.browser_id);
+      context = client_->FindLiveTabContextWithID(
+          SessionID::FromSerializedValue(tab.browser_id));
     }
 
     int tab_index = -1;
@@ -559,7 +559,7 @@
       context = client_->CreateLiveTabContext(
           std::string(), gfx::Rect(), ui::SHOW_STATE_NORMAL, std::string());
       if (tab.browser_id)
-        UpdateTabBrowserIDs(tab.browser_id, context->GetSessionID().id());
+        UpdateTabBrowserIDs(tab.browser_id, context->GetSessionID());
     }
 
     // Place the tab at the end if the tab index is no longer valid or
@@ -638,12 +638,12 @@
 }
 
 void TabRestoreServiceHelper::UpdateTabBrowserIDs(SessionID::id_type old_id,
-                                                  SessionID::id_type new_id) {
+                                                  SessionID new_id) {
   for (const auto& entry : entries_) {
     if (entry->type == TabRestoreService::TAB) {
       auto& tab = static_cast<Tab&>(*entry);
       if (tab.browser_id == old_id)
-        tab.browser_id = new_id;
+        tab.browser_id = new_id.id();
     }
   }
 }
diff --git a/components/sessions/core/tab_restore_service_helper.h b/components/sessions/core/tab_restore_service_helper.h
index abeb588d..1967625 100644
--- a/components/sessions/core/tab_restore_service_helper.h
+++ b/components/sessions/core/tab_restore_service_helper.h
@@ -50,7 +50,7 @@
 
     // Invoked before the entry is restored. |entry_iterator| points to the
     // entry corresponding to the session identified by |id|.
-    virtual void OnRestoreEntryById(SessionID::id_type id,
+    virtual void OnRestoreEntryById(SessionID id,
                                     Entries::const_iterator entry_iterator);
 
     // Invoked after an entry was added.
@@ -86,9 +86,9 @@
 
   const Entries& entries() const;
   std::vector<LiveTab*> RestoreMostRecentEntry(LiveTabContext* context);
-  std::unique_ptr<Tab> RemoveTabEntryById(SessionID::id_type id);
+  std::unique_ptr<Tab> RemoveTabEntryById(SessionID id);
   std::vector<LiveTab*> RestoreEntryById(LiveTabContext* context,
-                                         SessionID::id_type id,
+                                         SessionID id,
                                          WindowOpenDisposition disposition);
   bool IsRestoring() const;
 
@@ -112,7 +112,7 @@
   // identifies a Window, then its iterator position will be returned. If it
   // identifies a tab, then the iterator position of the Window in which the Tab
   // resides is returned.
-  Entries::iterator GetEntryIteratorById(SessionID::id_type id);
+  Entries::iterator GetEntryIteratorById(SessionID id);
 
   // From base::trace_event::MemoryDumpProvider
   bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
@@ -170,8 +170,7 @@
   bool FilterEntry(const Entry& entry);
 
   // Finds tab entries with the old browser_id and sets it to the new one.
-  void UpdateTabBrowserIDs(SessionID::id_type old_id,
-                           SessionID::id_type new_id);
+  void UpdateTabBrowserIDs(SessionID::id_type old_id, SessionID new_id);
 
   // Gets the current time. This uses the time_factory_ if there is one.
   base::Time TimeNow() const;
diff --git a/components/sync_sessions/local_session_event_handler_impl.cc b/components/sync_sessions/local_session_event_handler_impl.cc
index aef93b6..2d2d449c 100644
--- a/components/sync_sessions/local_session_event_handler_impl.cc
+++ b/components/sync_sessions/local_session_event_handler_impl.cc
@@ -192,7 +192,7 @@
     }
 
     SessionID window_id = window_delegate->GetSessionId();
-    DVLOG(1) << "Associating window " << window_id << " with "
+    DVLOG(1) << "Associating window " << window_id.id() << " with "
              << window_delegate->GetTabCount() << " tabs.";
 
     bool found_tabs = false;
@@ -234,7 +234,7 @@
           AssociateRestoredPlaceholderTab(*synced_tab, tab_id, window_id,
                                           batch);
         } else {
-          DVLOG(1) << "Placeholder tab " << tab_id << " has no sync id.";
+          DVLOG(1) << "Placeholder tab " << tab_id.id() << " has no sync id.";
         }
       } else if (RELOAD_TABS == option) {
         AssociateTab(synced_tab, has_tabbed_window, batch);
@@ -314,8 +314,8 @@
   }
 
   SessionID tab_id = tab_delegate->GetSessionId();
-  DVLOG(1) << "Syncing tab " << tab_id << " from window "
-           << tab_delegate->GetWindowId();
+  DVLOG(1) << "Syncing tab " << tab_id.id() << " from window "
+           << tab_delegate->GetWindowId().id();
 
   int tab_node_id = TabNodePool::kInvalidTabNodeID;
   bool existing_tab_node = true;
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc
index 50085fe..3834776f 100644
--- a/components/variations/service/variations_service.cc
+++ b/components/variations/service/variations_service.cc
@@ -254,8 +254,6 @@
       weak_ptr_factory_(this) {
   DCHECK(client_.get());
   DCHECK(resource_request_allowed_notifier_.get());
-
-  resource_request_allowed_notifier_->Init(this);
 }
 
 VariationsService::~VariationsService() {
@@ -264,6 +262,12 @@
 void VariationsService::PerformPreMainMessageLoopStartup() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  // ResourceRequestAllowedNotifier does not install an observer if there is no
+  // NetworkChangeNotifier, which results in never being notified of changes to
+  // network status.
+  DCHECK(net::NetworkChangeNotifier::HasNetworkChangeNotifier());
+  resource_request_allowed_notifier_->Init(this);
+
   if (!IsFetchingEnabled())
     return;
 
diff --git a/components/variations/service/variations_service_unittest.cc b/components/variations/service/variations_service_unittest.cc
index b8e5ff3..1c57e93 100644
--- a/components/variations/service/variations_service_unittest.cc
+++ b/components/variations/service/variations_service_unittest.cc
@@ -32,6 +32,7 @@
 #include "components/variations/proto/study.pb.h"
 #include "components/variations/proto/variations_seed.pb.h"
 #include "components/web_resource/resource_request_allowed_notifier_test_util.h"
+#include "net/base/mock_network_change_notifier.h"
 #include "net/base/url_util.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_status_code.h"
@@ -381,6 +382,7 @@
 }
 
 TEST_F(VariationsServiceTest, RequestsInitiallyNotAllowed) {
+  net::test::MockNetworkChangeNotifier network_change_notifier;
   // Pass ownership to TestVariationsService, but keep a weak pointer to
   // manipulate it for this test.
   std::unique_ptr<web_resource::TestRequestAllowedNotifier> test_notifier =
@@ -388,6 +390,7 @@
   web_resource::TestRequestAllowedNotifier* raw_notifier = test_notifier.get();
   TestVariationsService test_service(std::move(test_notifier), &prefs_,
                                      GetMetricsStateManager(), true);
+  test_service.PerformPreMainMessageLoopStartup();
 
   // Force the notifier to initially disallow requests.
   raw_notifier->SetRequestsAllowedOverride(false);
@@ -771,6 +774,8 @@
 
   VariationsService::EnableFetchForTesting();
 
+  net::test::MockNetworkChangeNotifier network_change_notifier;
+
   // Create a variations service and perform a successful fetch.
   VariationsService service(
       std::make_unique<TestVariationsServiceClient>(),
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc
index 78c6bca3..ef675f56 100644
--- a/components/viz/service/display/surface_aggregator.cc
+++ b/components/viz/service/display/surface_aggregator.cc
@@ -536,12 +536,12 @@
   // If the fallback surface is unavailable then that's an error.
   std::stringstream error_stream;
   error_stream << fallback_surface_id;
-#if DCHECK_IS_ON()
   std::string frame_sink_debug_label(
       manager_->GetFrameSinkDebugLabel(fallback_surface_id.frame_sink_id()));
+  // Add the debug label, if available, to the error log to help diagnose a
+  // misbehaving client.
   if (!frame_sink_debug_label.empty())
     error_stream << " [" << frame_sink_debug_label << "]";
-#endif
   if (!fallback_surface) {
     error_stream << " is missing during aggregation";
     ++uma_stats_.missing_surface;
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 460f43729..41d6b68 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -358,10 +358,17 @@
   RunAriaTest(FILE_PATH_LITERAL("aria-alert.html"));
 }
 
+#if defined(OS_WIN)
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
+                       DISABLED_AccessibilityAriaAlertDialog) {
+  RunAriaTest(FILE_PATH_LITERAL("aria-alertdialog.html"));
+}
+#else
 IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
                        AccessibilityAriaAlertDialog) {
   RunAriaTest(FILE_PATH_LITERAL("aria-alertdialog.html"));
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
                        AccessibilityAriaApplication) {
diff --git a/content/browser/frame_host/debug_urls.cc b/content/browser/frame_host/debug_urls.cc
index 2145d65..f66e16a 100644
--- a/content/browser/frame_host/debug_urls.cc
+++ b/content/browser/frame_host/debug_urls.cc
@@ -4,10 +4,6 @@
 
 #include "content/browser/frame_host/debug_urls.h"
 
-#if defined(SYZYASAN)
-#include <windows.h>
-#endif
-
 #include <vector>
 
 #include "base/command_line.h"
@@ -16,6 +12,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread_restrictions.h"
+#include "build/build_config.h"
 #include "cc/base/switches.h"
 #include "content/browser/gpu/gpu_process_host.h"
 #include "content/public/browser/browser_thread.h"
@@ -43,7 +40,8 @@
 const char kAsanHeapOverflow[] = "/browser-heap-overflow";
 const char kAsanHeapUnderflow[] = "/browser-heap-underflow";
 const char kAsanUseAfterFree[] = "/browser-use-after-free";
-#if defined(SYZYASAN)
+
+#if defined(OS_WIN)
 const char kAsanCorruptHeapBlock[] = "/browser-corrupt-heap-block";
 const char kAsanCorruptHeap[] = "/browser-corrupt-heap";
 #endif
@@ -66,11 +64,6 @@
 }
 
 bool IsAsanDebugURL(const GURL& url) {
-#if defined(SYZYASAN)
-  if (!base::debug::IsBinaryInstrumented())
-    return false;
-#endif
-
   if (!(url.is_valid() && url.SchemeIs(kChromeUIScheme) &&
         url.DomainIs(kAsanCrashDomain) &&
         url.has_path())) {
@@ -83,7 +76,7 @@
     return true;
   }
 
-#if defined(SYZYASAN)
+#if defined(OS_WIN)
   if (url.path_piece() == kAsanCorruptHeapBlock ||
       url.path_piece() == kAsanCorruptHeap) {
     return true;
@@ -94,10 +87,8 @@
 }
 
 bool HandleAsanDebugURL(const GURL& url) {
-#if defined(SYZYASAN)
-  if (!base::debug::IsBinaryInstrumented())
-    return false;
-
+#if defined(ADDRESS_SANITIZER)
+#if defined(OS_WIN)
   if (url.path_piece() == kAsanCorruptHeapBlock) {
     base::debug::AsanCorruptHeapBlock();
     return true;
@@ -105,9 +96,8 @@
     base::debug::AsanCorruptHeap();
     return true;
   }
-#endif
+#endif  // OS_WIN
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
   if (url.path_piece() == kAsanHeapOverflow) {
     base::debug::AsanHeapOverflow();
   } else if (url.path_piece() == kAsanHeapUnderflow) {
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index 194b79b..4d23d40 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -474,16 +474,19 @@
     }
   }
 
-  // Save the origin of the new page.  Do this before calling
-  // DidNavigateFrame(), because the origin needs to be included in the SwapOut
-  // message, which is sent inside DidNavigateFrame().  SwapOut needs the
-  // origin because it creates a RenderFrameProxy that needs this to initialize
-  // its security context. This origin will also be sent to RenderFrameProxies
-  // created via mojom::Renderer::CreateView and
-  // mojom::Renderer::CreateFrameProxy.
+  // DidNavigateFrame() must be called before replicating the new origin and
+  // other properties to proxies.  This is because it destroys the subframes of
+  // the frame we're navigating from, which might trigger those subframes to
+  // run unload handlers.  Those unload handlers should still see the old
+  // frame's origin.  See https://crbug.com/825283.
+  frame_tree_node->render_manager()->DidNavigateFrame(
+      render_frame_host, params.gesture == NavigationGestureUser);
+
+  // Save the new page's origin and other properties, and replicate them to
+  // proxies, including the proxy created in DidNavigateFrame() to replace the
+  // old frame in cross-process navigation cases.
   frame_tree_node->SetCurrentOrigin(
       params.origin, params.has_potentially_trustworthy_unique_origin);
-
   frame_tree_node->SetInsecureRequestPolicy(params.insecure_request_policy);
   frame_tree_node->SetInsecureNavigationsSet(params.insecure_navigations_set);
 
@@ -494,9 +497,6 @@
     frame_tree_node->ResetForNavigation();
   }
 
-  frame_tree_node->render_manager()->DidNavigateFrame(
-      render_frame_host, params.gesture == NavigationGestureUser);
-
   // Update the site of the SiteInstance if it doesn't have one yet, unless
   // assigning a site is not necessary for this URL or the commit was for an
   // error page.  In that case, the SiteInstance can still be considered unused
diff --git a/content/browser/generic_sensor_browsertest.cc b/content/browser/generic_sensor/generic_sensor_browsertest.cc
similarity index 100%
rename from content/browser/generic_sensor_browsertest.cc
rename to content/browser/generic_sensor/generic_sensor_browsertest.cc
diff --git a/content/browser/gpu/browser_gpu_channel_host_factory.cc b/content/browser/gpu/browser_gpu_channel_host_factory.cc
index b2a89383..cdc4d3d 100644
--- a/content/browser/gpu/browser_gpu_channel_host_factory.cc
+++ b/content/browser/gpu/browser_gpu_channel_host_factory.cc
@@ -352,7 +352,7 @@
     return;
 
 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
-    defined(SYZYASAN) || defined(CYGPROFILE_INSTRUMENTATION)
+    defined(CYGPROFILE_INSTRUMENTATION)
   constexpr int64_t kGpuChannelTimeoutInSeconds = 40;
 #else
   // The GPU watchdog timeout is 15 seconds (1.5x the kGpuTimeout value due to
diff --git a/content/browser/net/reporting_service_proxy.cc b/content/browser/net/reporting_service_proxy.cc
index 99f7d73..97fc3ec3 100644
--- a/content/browser/net/reporting_service_proxy.cc
+++ b/content/browser/net/reporting_service_proxy.cc
@@ -116,7 +116,10 @@
       return;
     }
 
-    reporting_service->QueueReport(url, group, type, std::move(body));
+    // Depth is only non-zero for NEL reports, and those can't come from the
+    // renderer.
+    reporting_service->QueueReport(url, group, type, std::move(body),
+                                   /* depth= */ 0);
   }
 
   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc
index a892fe9..5546524 100644
--- a/content/browser/renderer_host/render_widget_host_input_event_router.cc
+++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -1192,11 +1192,22 @@
   event.SetPositionInWidget(event.PositionInWidget() +
                             touchscreen_gesture_target_.delta);
   // Temporary logging for https://crbug.com/824774.
+  // TODO(wjmaclean): Remove all this logging code once the issue is resolved.
   static auto* target_ptr_key = base::debug::AllocateCrashKeyString(
       "touchscreen-gesture-target-ptr", base::debug::CrashKeySize::Size64);
   base::debug::SetCrashKeyString(
       target_ptr_key,
       base::StringPrintf("%p", touchscreen_gesture_target_.target));
+  // Issue 824772 is a potential cause for issue 824774. Report whether
+  // devtools is in use to investigate this possibility.
+  auto* contents = root_view->host()->delegate()->GetAsWebContents();
+  const bool have_devtools =
+      contents && DevToolsAgentHost::IsDebuggerAttached(contents);
+  static auto* devtools_key = base::debug::AllocateCrashKeyString(
+      "touchscreen-gesture-target-have-devtools",
+      base::debug::CrashKeySize::Size32);
+  base::debug::SetCrashKeyString(devtools_key, std::to_string(have_devtools));
+  // Crash in 824774 appears to happen on next line.
   touchscreen_gesture_target_.target->ProcessGestureEvent(event, latency);
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_ns_view_bridge.h b/content/browser/renderer_host/render_widget_host_ns_view_bridge.h
index 0f23f9f..22db536 100644
--- a/content/browser/renderer_host/render_widget_host_ns_view_bridge.h
+++ b/content/browser/renderer_host/render_widget_host_ns_view_bridge.h
@@ -15,12 +15,14 @@
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace gfx {
+class Range;
 class Rect;
-}
+}  // namespace gfx
 
 namespace content {
 
 class RenderWidgetHostNSViewClient;
+class WebCursor;
 
 // The interface through which RenderWidgetHostViewMac is to manipulate its
 // corresponding NSView (potentially in another process).
@@ -62,6 +64,17 @@
   // Call the -[NSView setToolTipAtMousePoint] method.
   virtual void SetTooltipText(const base::string16& display_text) = 0;
 
+  // Set or clear the marked and selected range.
+  virtual void SetMarkedRange(const gfx::Range& range) = 0;
+  virtual void ClearMarkedText() = 0;
+  virtual void SetSelectedRange(const gfx::Range& range) = 0;
+
+  // Indicate if the WebContext is showing a context menu.
+  virtual void SetShowingContextMenu(bool showing) = 0;
+
+  // Set the cursor type to display.
+  virtual void DisplayCursor(const WebCursor& cursor) = 0;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostNSViewBridge);
 };
diff --git a/content/browser/renderer_host/render_widget_host_ns_view_bridge.mm b/content/browser/renderer_host/render_widget_host_ns_view_bridge.mm
index 2703931..ffd59f8 100644
--- a/content/browser/renderer_host/render_widget_host_ns_view_bridge.mm
+++ b/content/browser/renderer_host/render_widget_host_ns_view_bridge.mm
@@ -11,6 +11,7 @@
 #import "content/browser/renderer_host/popup_window_mac.h"
 #import "content/browser/renderer_host/render_widget_host_view_cocoa.h"
 #include "content/browser/renderer_host/render_widget_host_view_mac.h"
+#include "content/common/cursors/webcursor.h"
 #import "skia/ext/skia_utils_mac.h"
 #import "ui/base/cocoa/animation_utils.h"
 #include "ui/display/display_observer.h"
@@ -41,6 +42,11 @@
   void SetBackgroundColor(SkColor color) override;
   void SetVisible(bool visible) override;
   void SetTooltipText(const base::string16& display_text) override;
+  void SetMarkedRange(const gfx::Range& range) override;
+  void ClearMarkedText() override;
+  void SetSelectedRange(const gfx::Range& range) override;
+  void SetShowingContextMenu(bool showing) override;
+  void DisplayCursor(const WebCursor& cursor) override;
 
  private:
   bool IsPopup() const {
@@ -192,6 +198,31 @@
   [cocoa_view_ setToolTipAtMousePoint:tooltip_nsstring];
 }
 
+void RenderWidgetHostViewNSViewBridgeLocal::SetMarkedRange(
+    const gfx::Range& range) {
+  [cocoa_view_ setMarkedRange:range.ToNSRange()];
+}
+
+void RenderWidgetHostViewNSViewBridgeLocal::ClearMarkedText() {
+  [cocoa_view_ cancelComposition];
+}
+
+void RenderWidgetHostViewNSViewBridgeLocal::SetSelectedRange(
+    const gfx::Range& range) {
+  [cocoa_view_ setSelectedRange:range.ToNSRange()];
+  // Updates markedRange when there is no marked text so that retrieving
+  // markedRange immediately after calling setMarkdText: returns the current
+  // caret position.
+  if (![cocoa_view_ hasMarkedText]) {
+    [cocoa_view_ setMarkedRange:range.ToNSRange()];
+  }
+}
+
+void RenderWidgetHostViewNSViewBridgeLocal::SetShowingContextMenu(
+    bool showing) {
+  [cocoa_view_ setShowingContextMenu:showing];
+}
+
 void RenderWidgetHostViewNSViewBridgeLocal::OnDisplayMetricsChanged(
     const display::Display& display,
     uint32_t changed_metrics) {
@@ -201,6 +232,12 @@
   [cocoa_view_ updateScreenProperties];
 }
 
+void RenderWidgetHostViewNSViewBridgeLocal::DisplayCursor(
+    const WebCursor& cursor) {
+  WebCursor non_const_cursor = cursor;
+  [cocoa_view_ updateCursor:non_const_cursor.GetNativeCursor()];
+}
+
 }  // namespace
 
 // static
diff --git a/content/browser/renderer_host/render_widget_host_view_cocoa.h b/content/browser/renderer_host/render_widget_host_view_cocoa.h
index 6f5e0fd..a71b3b4 100644
--- a/content/browser/renderer_host/render_widget_host_view_cocoa.h
+++ b/content/browser/renderer_host/render_widget_host_view_cocoa.h
@@ -78,6 +78,9 @@
   // Is YES if the cursor is hidden by key events.
   BOOL cursorHidden_;
 
+  // Controlled by setShowingContextMenu.
+  BOOL showingContextMenu_;
+
   // Set during -setFrame to avoid spamming client_ with origin and size
   // changes.
   BOOL inSetFrame_;
@@ -222,6 +225,8 @@
 // Query the display::Display from the view's NSWindow's NSScreen and forward
 // it to the RenderWidgetHostNSViewClient (only if the screen is non-nil).
 - (void)updateScreenProperties;
+// Indicate if the embedding WebContents is showing a web content context menu.
+- (void)setShowingContextMenu:(BOOL)showing;
 
 // Methods previously marked as private.
 - (id)initWithClient:
diff --git a/content/browser/renderer_host/render_widget_host_view_cocoa.mm b/content/browser/renderer_host/render_widget_host_view_cocoa.mm
index dd52a36..a1aef875 100644
--- a/content/browser/renderer_host/render_widget_host_view_cocoa.mm
+++ b/content/browser/renderer_host/render_widget_host_view_cocoa.mm
@@ -300,6 +300,36 @@
   clientWasDestroyed_ = YES;
 }
 
+- (void)setShowingContextMenu:(BOOL)showing {
+  showingContextMenu_ = showing;
+
+  // Create a fake mouse event to inform the render widget that the mouse
+  // left or entered.
+  NSWindow* window = [self window];
+  int window_number = window ? [window windowNumber] : -1;
+
+  // TODO(asvitkine): If the location outside of the event stream doesn't
+  // correspond to the current event (due to delayed event processing), then
+  // this may result in a cursor flicker if there are later mouse move events
+  // in the pipeline. Find a way to use the mouse location from the event that
+  // dismissed the context menu.
+  NSPoint location = [window mouseLocationOutsideOfEventStream];
+  NSTimeInterval event_time = [[NSApp currentEvent] timestamp];
+  NSEvent* event = [NSEvent mouseEventWithType:NSMouseMoved
+                                      location:location
+                                 modifierFlags:0
+                                     timestamp:event_time
+                                  windowNumber:window_number
+                                       context:nil
+                                   eventNumber:0
+                                    clickCount:0
+                                      pressure:0];
+  WebMouseEvent web_event = WebMouseEventBuilder::Build(event, self);
+  web_event.SetModifiers(web_event.GetModifiers() |
+                         WebInputEvent::kRelativeMotionEvent);
+  renderWidgetHostView_->ForwardMouseEvent(web_event);
+}
+
 - (BOOL)shouldIgnoreMouseEvent:(NSEvent*)theEvent {
   NSWindow* window = [self window];
   // If this is a background window, don't handle mouse movement events. This
@@ -2021,8 +2051,7 @@
   // NSWindow's invalidateCursorRectsForView: resets cursor rects but does not
   // update the cursor instantly. The cursor is updated when the mouse moves.
   // Update the cursor by setting the current cursor if not hidden.
-  WebContents* web_contents = renderWidgetHostView_->GetWebContents();
-  if (!cursorHidden_ && web_contents && !web_contents->IsShowingContextMenu())
+  if (!cursorHidden_ && !showingContextMenu_)
     [currentCursor_ set];
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 6d9d7df..a2207c69 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -21,7 +21,6 @@
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/renderer_host/text_input_manager.h"
 #include "content/common/content_export.h"
-#include "content/common/cursors/webcursor.h"
 #include "ipc/ipc_sender.h"
 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
 #include "ui/accelerated_widget_mac/display_link_mac.h"
@@ -33,6 +32,7 @@
 class RenderWidgetHostNSViewBridge;
 class RenderWidgetHostViewMac;
 class WebContents;
+class WebCursor;
 }
 
 namespace ui {
@@ -273,8 +273,6 @@
 
   CONTENT_EXPORT void release_pepper_fullscreen_window_for_testing();
 
-  int window_number() const;
-
   // Update the size, scale factor, color profile, vsync parameters, and any
   // other properties of the NSView or its NSScreen. Propagate these to the
   // RenderWidgetHostImpl as well.
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 7467d2e1..3d01effe 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -346,13 +346,6 @@
   pepper_fullscreen_window_.reset();
 }
 
-int RenderWidgetHostViewMac::window_number() const {
-  NSWindow* window = [cocoa_view() window];
-  if (!window)
-    return -1;
-  return [window windowNumber];
-}
-
 void RenderWidgetHostViewMac::UpdateDisplayVSyncParameters() {
   if (!host() || !display_link_.get())
     return;
@@ -515,8 +508,7 @@
 }
 
 void RenderWidgetHostViewMac::DisplayCursor(const WebCursor& cursor) {
-  WebCursor web_cursor = cursor;
-  [cocoa_view() updateCursor:web_cursor.GetNativeCursor()];
+  ns_view_bridge_->DisplayCursor(cursor);
 }
 
 CursorManager* RenderWidgetHostViewMac::GetCursorManager() {
@@ -577,7 +569,7 @@
 void RenderWidgetHostViewMac::OnImeCancelComposition(
     TextInputManager* text_input_manager,
     RenderWidgetHostViewBase* updated_view) {
-  [cocoa_view() cancelComposition];
+  ns_view_bridge_->ClearMarkedText();
 }
 
 void RenderWidgetHostViewMac::OnImeCompositionRangeChanged(
@@ -589,7 +581,7 @@
     return;
   // The RangeChanged message is only sent with valid values. The current
   // caret position (start == end) will be sent if there is no IME range.
-  [cocoa_view() setMarkedRange:info->range.ToNSRange()];
+  ns_view_bridge_->SetMarkedRange(info->range);
 }
 
 void RenderWidgetHostViewMac::OnSelectionBoundsChanged(
@@ -634,13 +626,7 @@
   if (!selection)
     return;
 
-  [cocoa_view() setSelectedRange:selection->range().ToNSRange()];
-  // Updates markedRange when there is no marked text so that retrieving
-  // markedRange immediately after calling setMarkdText: returns the current
-  // caret position.
-  if (![cocoa_view() hasMarkedText]) {
-    [cocoa_view() setMarkedRange:selection->range().ToNSRange()];
-  }
+  ns_view_bridge_->SetSelectedRange(selection->range());
 }
 
 void RenderWidgetHostViewMac::OnRenderFrameMetadataChanged() {
@@ -797,29 +783,7 @@
 //
 
 void RenderWidgetHostViewMac::SetShowingContextMenu(bool showing) {
-  // Create a fake mouse event to inform the render widget that the mouse
-  // left or entered.
-  NSWindow* window = [cocoa_view() window];
-  // TODO(asvitkine): If the location outside of the event stream doesn't
-  // correspond to the current event (due to delayed event processing), then
-  // this may result in a cursor flicker if there are later mouse move events
-  // in the pipeline. Find a way to use the mouse location from the event that
-  // dismissed the context menu.
-  NSPoint location = [window mouseLocationOutsideOfEventStream];
-  NSTimeInterval event_time = [[NSApp currentEvent] timestamp];
-  NSEvent* event = [NSEvent mouseEventWithType:NSMouseMoved
-                                      location:location
-                                 modifierFlags:0
-                                     timestamp:event_time
-                                  windowNumber:window_number()
-                                       context:nil
-                                   eventNumber:0
-                                    clickCount:0
-                                      pressure:0];
-  WebMouseEvent web_event = WebMouseEventBuilder::Build(event, cocoa_view());
-  web_event.SetModifiers(web_event.GetModifiers() |
-                         WebInputEvent::kRelativeMotionEvent);
-  ForwardMouseEvent(web_event);
+  ns_view_bridge_->SetShowingContextMenu(showing);
 }
 
 void RenderWidgetHostViewMac::CopyFromSurface(
@@ -1033,7 +997,7 @@
 void RenderWidgetHostViewMac::FocusedNodeChanged(
     bool is_editable_node,
     const gfx::Rect& node_bounds_in_screen) {
-  [cocoa_view() cancelComposition];
+  ns_view_bridge_->ClearMarkedText();
 
   // If the Mac Zoom feature is enabled, update it with the bounds of the
   // current focused node so that it can ensure that it's scrolled into view.
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 74bfebc..438d439 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -11073,4 +11073,53 @@
   EXPECT_EQ(0u, popup_process->GetFrameDepthForTesting());
 }
 
+// Ensure that after a main frame with an OOPIF is navigated cross-site, the
+// unload handler in the OOPIF sees correct main frame origin, namely the old
+// and not the new origin.  See https://crbug.com/825283.
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+                       ParentOriginDoesNotChangeInUnloadHandler) {
+  GURL main_url(embedded_test_server()->GetURL(
+      "a.com", "/cross_site_iframe_factory.html?a(b)"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetFrameTree()
+                            ->root();
+
+  // Open a popup on b.com.  The b.com subframe on the main frame will use this
+  // in its unload handler.
+  GURL b_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  EXPECT_TRUE(OpenPopup(shell()->web_contents(), b_url, "popup"));
+
+  // Add an unload handler to b.com subframe, which will look up the top
+  // frame's origin and send it via domAutomationController.  Unfortunately,
+  // the subframe's browser-side state will have been torn down when it runs
+  // the unload handler, so to ensure that the message can be received, send it
+  // through the popup.
+  EXPECT_TRUE(
+      ExecuteScript(root->child_at(0),
+                    "window.onunload = function(e) {"
+                    "  window.open('','popup').domAutomationController.send("
+                    "      'top-origin ' + location.ancestorOrigins[0]);"
+                    "};"));
+
+  // Navigate the main frame to c.com and wait for the message from the
+  // subframe's unload handler.
+  GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html"));
+  DOMMessageQueue msg_queue;
+  EXPECT_TRUE(NavigateToURL(shell(), c_url));
+  std::string message, top_origin;
+  while (msg_queue.WaitForMessage(&message)) {
+    base::TrimString(message, "\"", &message);
+    auto message_parts = base::SplitString(message, " ", base::TRIM_WHITESPACE,
+                                           base::SPLIT_WANT_NONEMPTY);
+    if (message_parts[0] == "top-origin") {
+      top_origin = message_parts[1];
+      break;
+    }
+  }
+
+  // The top frame's origin should be a.com, not c.com.
+  EXPECT_EQ(top_origin + "/", main_url.GetOrigin().spec());
+}
+
 }  // namespace content
diff --git a/content/browser/webauth/authenticator_impl.cc b/content/browser/webauth/authenticator_impl.cc
index 9c0183df..d1ae36c 100644
--- a/content/browser/webauth/authenticator_impl.cc
+++ b/content/browser/webauth/authenticator_impl.cc
@@ -545,7 +545,7 @@
   DCHECK(u2f_request_) << "unsupported callback hairpin";
 
   switch (status_code) {
-    case device::FidoReturnCode::kConditionsNotSatisfied:
+    case device::FidoReturnCode::kInvalidState:
       // Duplicate registration: the new credential would be created on an
       // authenticator that already contains one of the credentials in
       // |exclude_credentials|.
@@ -560,6 +560,7 @@
           webauth::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR, nullptr);
       return;
     case device::FidoReturnCode::kInvalidParams:
+    case device::FidoReturnCode::kConditionsNotSatisfied:
       NOTREACHED();
       return;
     case device::FidoReturnCode::kSuccess:
@@ -653,6 +654,7 @@
           webauth::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR, nullptr);
       return;
     case device::FidoReturnCode::kInvalidParams:
+    case device::FidoReturnCode::kInvalidState:
       NOTREACHED();
       return;
     case device::FidoReturnCode::kSuccess:
diff --git a/content/browser/webrtc/webrtc_stress_pause_browsertest.cc b/content/browser/webrtc/webrtc_stress_pause_browsertest.cc
index e95a00a..c7248a87 100644
--- a/content/browser/webrtc/webrtc_stress_pause_browsertest.cc
+++ b/content/browser/webrtc/webrtc_stress_pause_browsertest.cc
@@ -17,7 +17,7 @@
 
 namespace {
 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
-    defined(SYZYASAN) || defined(MEMORY_SANITIZER)
+    defined(MEMORY_SANITIZER)
 static const int kTestDurationSecs = 2;
 static const int kNumPeerConnections = 3;
 #else
diff --git a/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc b/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc
index 1494d11..2af0209 100644
--- a/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc
+++ b/content/browser/webrtc/webrtc_stress_resolution_switch_browsertest.cc
@@ -17,7 +17,7 @@
 
 namespace {
 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
-    defined(SYZYASAN) || defined(MEMORY_SANITIZER)
+    defined(MEMORY_SANITIZER)
 static const int kTestDurationSecs = 2;
 static const int kNumPeerConnections = 3;
 #else
diff --git a/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc b/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc
index 0924d9e..86f3aa1 100644
--- a/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc
+++ b/content/browser/webrtc/webrtc_stress_source_switch_browsertest.cc
@@ -17,7 +17,7 @@
 
 namespace {
 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
-    defined(SYZYASAN) || defined(MEMORY_SANITIZER)
+    defined(MEMORY_SANITIZER)
 static const int kTestDurationSecs = 2;
 static const int kNumPeerConnections = 3;
 #else
diff --git a/content/public/common/url_constants.cc b/content/public/common/url_constants.cc
index 4bfbb922a1..ece77d538 100644
--- a/content/public/common/url_constants.cc
+++ b/content/public/common/url_constants.cc
@@ -57,15 +57,19 @@
 #if defined(OS_ANDROID)
 const char kChromeUIGpuJavaCrashURL[] = "chrome://gpu-java-crash/";
 #endif
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 const char kChromeUICrashHeapOverflowURL[] = "chrome://crash/heap-overflow";
 const char kChromeUICrashHeapUnderflowURL[] = "chrome://crash/heap-underflow";
 const char kChromeUICrashUseAfterFreeURL[] = "chrome://crash/use-after-free";
-#endif
-#if defined(SYZYASAN)
+
+#if defined(OS_WIN)
 const char kChromeUICrashCorruptHeapBlockURL[] =
     "chrome://crash/corrupt-heap-block";
 const char kChromeUICrashCorruptHeapURL[] = "chrome://crash/corrupt-heap";
+#endif  // OS_WIN
+#endif  // ADDRESS_SANITIZER
+
+#if DCHECK_IS_ON()
 const char kChromeUICrashDcheckURL[] = "chrome://crash/dcheck";
 #endif
 
diff --git a/content/public/common/url_constants.h b/content/public/common/url_constants.h
index f51416f..67009bed 100644
--- a/content/public/common/url_constants.h
+++ b/content/public/common/url_constants.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_PUBLIC_COMMON_URL_CONSTANTS_H_
 #define CONTENT_PUBLIC_COMMON_URL_CONSTANTS_H_
 
+#include "base/logging.h"
 #include "build/build_config.h"
 #include "content/common/content_export.h"
 #include "url/url_constants.h"
@@ -66,14 +67,17 @@
 #if defined(OS_ANDROID)
 CONTENT_EXPORT extern const char kChromeUIGpuJavaCrashURL[];
 #endif
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 CONTENT_EXPORT extern const char kChromeUICrashHeapOverflowURL[];
 CONTENT_EXPORT extern const char kChromeUICrashHeapUnderflowURL[];
 CONTENT_EXPORT extern const char kChromeUICrashUseAfterFreeURL[];
-#endif
-#if defined(SYZYASAN)
+#if defined(OS_WIN)
 CONTENT_EXPORT extern const char kChromeUICrashCorruptHeapBlockURL[];
 CONTENT_EXPORT extern const char kChromeUICrashCorruptHeapURL[];
+#endif  // OS_WIN
+#endif  // ADDRESS_SANITIZER
+
+#if DCHECK_IS_ON()
 CONTENT_EXPORT extern const char kChromeUICrashDcheckURL[];
 #endif
 
diff --git a/content/public/common/url_utils.cc b/content/public/common/url_utils.cc
index 7954cfe..e14b5d9 100644
--- a/content/public/common/url_utils.cc
+++ b/content/public/common/url_utils.cc
@@ -4,6 +4,7 @@
 
 #include "content/public/common/url_utils.h"
 
+#include "base/logging.h"
 #include "build/build_config.h"
 #include "content/common/url_schemes.h"
 #include "content/public/common/browser_side_navigation_policy.h"
@@ -81,7 +82,7 @@
     return true;
   }
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
   if (url == kChromeUICrashHeapOverflowURL ||
       url == kChromeUICrashHeapUnderflowURL ||
       url == kChromeUICrashUseAfterFreeURL) {
@@ -89,9 +90,14 @@
   }
 #endif
 
-#if defined(SYZYASAN)
+#if DCHECK_IS_ON()
+  if (url == kChromeUICrashDcheckURL)
+    return true;
+#endif
+
+#if defined(OS_WIN) && defined(ADDRESS_SANITIZER)
   if (url == kChromeUICrashCorruptHeapBlockURL ||
-      url == kChromeUICrashCorruptHeapURL || url == kChromeUICrashDcheckURL) {
+      url == kChromeUICrashCorruptHeapURL) {
     return true;
   }
 #endif
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 4cfa3ac..ea59a6e 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -851,7 +851,7 @@
   } while (ptr);
 }
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if defined(ADDRESS_SANITIZER)
 NOINLINE void MaybeTriggerAsanError(const GURL& url) {
   // NOTE(rogerm): We intentionally perform an invalid heap access here in
   //     order to trigger an Address Sanitizer (ASAN) error report.
@@ -867,7 +867,7 @@
     LOG(ERROR) << "Intentionally causing ASAN heap use-after-free"
                << " because user navigated to " << url.spec();
     base::debug::AsanHeapUseAfterFree();
-#if defined(SYZYASAN)
+#if defined(OS_WIN)
   } else if (url == kChromeUICrashCorruptHeapBlockURL) {
     LOG(ERROR) << "Intentionally causing ASAN corrupt heap block"
                << " because user navigated to " << url.spec();
@@ -876,15 +876,10 @@
     LOG(ERROR) << "Intentionally causing ASAN corrupt heap"
                << " because user navigated to " << url.spec();
     base::debug::AsanCorruptHeap();
-  } else if (url == kChromeUICrashDcheckURL) {
-    LOG(ERROR) << "Intentionally DCHECKING because user navigated to "
-               << url.spec();
-
-    DCHECK(false) << "Intentional DCHECK.";
-#endif
+#endif  // OS_WIN
   }
 }
-#endif  // ADDRESS_SANITIZER || SYZYASAN
+#endif  // ADDRESS_SANITIZER
 
 // Returns true if the URL is a debug URL, false otherwise. These URLs do not
 // commit, though they are intentionally left in the address bar above the
@@ -931,9 +926,18 @@
     CHECK(false);
   }
 
-#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
+#if DCHECK_IS_ON()
+  if (url == kChromeUICrashDcheckURL) {
+    LOG(ERROR) << "Intentionally causing DCHECK because user navigated to "
+               << url.spec();
+
+    DCHECK(false) << "Intentional DCHECK.";
+  }
+#endif
+
+#if defined(ADDRESS_SANITIZER)
   MaybeTriggerAsanError(url);
-#endif  // ADDRESS_SANITIZER || SYZYASAN
+#endif  // ADDRESS_SANITIZER
 }
 
 struct RenderFrameImpl::PendingFileChooser {
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 1bd71a3..d70edf43 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -21,8 +21,6 @@
   import("//build/mac/tweak_info_plist.gni")
   import("//third_party/icu/config.gni")
   import("//v8/gni/v8.gni")
-} else if (is_win) {
-  import("//build/win/syzygy/syzygy.gni")
 }
 
 declare_args() {
@@ -616,19 +614,6 @@
   }
 }
 
-if (is_win) {
-  if (is_syzyasan) {
-    syzygy_asan("content_shell_syzyasan") {
-      binary_name = "content_shell.exe"
-      dest_dir = "$root_out_dir/syzygy"
-      deps = [
-        "//content/shell:content_shell",
-      ]
-      testonly = true
-    }
-  }
-}
-
 if (is_mac) {
   bundle_data("content_shell_framework_helpers") {
     testonly = true
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 9ed2b6e..35386c5 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -743,7 +743,7 @@
     "../browser/frame_host/render_frame_host_impl_browsertest.cc",
     "../browser/frame_host/render_frame_host_manager_browsertest.cc",
     "../browser/frame_host/render_frame_message_filter_browsertest.cc",
-    "../browser/generic_sensor_browsertest.cc",
+    "../browser/generic_sensor/generic_sensor_browsertest.cc",
     "../browser/gpu/gpu_ipc_browsertests.cc",
     "../browser/gpu/in_process_gpu_thread_browsertests.cc",
     "../browser/indexed_db/indexed_db_browsertest.cc",
diff --git a/device/fido/fido_constants.h b/device/fido/fido_constants.h
index 30b64e1..b64034b 100644
--- a/device/fido/fido_constants.h
+++ b/device/fido/fido_constants.h
@@ -20,6 +20,7 @@
   kFailure,
   kInvalidParams,
   kConditionsNotSatisfied,
+  kInvalidState,
 };
 
 enum class ProtocolVersion {
diff --git a/device/fido/u2f_register.cc b/device/fido/u2f_register.cc
index 21cfadb0..9051e0e 100644
--- a/device/fido/u2f_register.cc
+++ b/device/fido/u2f_register.cc
@@ -142,7 +142,7 @@
       state_ = State::COMPLETE;
       if (is_duplicate_registration) {
         std::move(completion_callback_)
-            .Run(FidoReturnCode::kConditionsNotSatisfied, base::nullopt);
+            .Run(FidoReturnCode::kInvalidState, base::nullopt);
         break;
       }
       auto response =
diff --git a/device/fido/u2f_register_unittest.cc b/device/fido/u2f_register_unittest.cc
index e7539f84..b0bd8e1 100644
--- a/device/fido/u2f_register_unittest.cc
+++ b/device/fido/u2f_register_unittest.cc
@@ -645,7 +645,7 @@
   discovery()->AddDevice(std::move(device));
 
   register_callback_receiver().WaitForCallback();
-  EXPECT_EQ(FidoReturnCode::kConditionsNotSatisfied,
+  EXPECT_EQ(FidoReturnCode::kInvalidState,
             register_callback_receiver().status());
   EXPECT_FALSE(register_callback_receiver().value());
 }
@@ -697,7 +697,7 @@
   discovery()->WaitForCallToStartAndSimulateSuccess();
 
   register_callback_receiver().WaitForCallback();
-  EXPECT_EQ(FidoReturnCode::kConditionsNotSatisfied,
+  EXPECT_EQ(FidoReturnCode::kInvalidState,
             register_callback_receiver().status());
   EXPECT_FALSE(register_callback_receiver().value());
 }
diff --git a/docs/clang.md b/docs/clang.md
index 341dc39..a45d15f 100644
--- a/docs/clang.md
+++ b/docs/clang.md
@@ -49,6 +49,17 @@
      ./test.py ../../../../third_party/llvm-build/Release+Asserts/bin/clang \
                ../../../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so)
 
+Since the plugin is rolled with clang changes, behavior changes to the plugin
+should be guarded by flags to make it easy to roll clang. A general outline:
+1.  Implement new plugin behavior behind a flag.
+1.  Wait for a compiler roll to bring in the flag.
+1.  Start passing the new flag in `GN` and verify the new behavior.
+1.  Enable the new plugin behavior unconditionally and update the plugin to
+    ignore the flag.
+1.  Wait for another compiler roll.
+1.  Stop passing the flag from `GN`.
+1.  Remove the flag completely.
+
 ## Using the clang static analyzer
 
 See [clang_static_analyzer.md](clang_static_analyzer.md).
diff --git a/extensions/browser/extension_api_frame_id_map.cc b/extensions/browser/extension_api_frame_id_map.cc
index aa044e3d..2329c71 100644
--- a/extensions/browser/extension_api_frame_id_map.cc
+++ b/extensions/browser/extension_api_frame_id_map.cc
@@ -5,6 +5,7 @@
 #include "extensions/browser/extension_api_frame_id_map.h"
 
 #include <tuple>
+#include <utility>
 
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
@@ -47,11 +48,20 @@
 ExtensionApiFrameIdMap::FrameData::FrameData(int frame_id,
                                              int parent_frame_id,
                                              int tab_id,
-                                             int window_id)
+                                             int window_id,
+                                             GURL last_committed_main_frame_url)
     : frame_id(frame_id),
       parent_frame_id(parent_frame_id),
       tab_id(tab_id),
-      window_id(window_id) {}
+      window_id(window_id),
+      last_committed_main_frame_url(std::move(last_committed_main_frame_url)) {}
+
+ExtensionApiFrameIdMap::FrameData::~FrameData() = default;
+
+ExtensionApiFrameIdMap::FrameData::FrameData(
+    const ExtensionApiFrameIdMap::FrameData& other) = default;
+ExtensionApiFrameIdMap::FrameData& ExtensionApiFrameIdMap::FrameData::operator=(
+    const ExtensionApiFrameIdMap::FrameData& other) = default;
 
 ExtensionApiFrameIdMap::RenderFrameIdKey::RenderFrameIdKey()
     : render_process_id(content::ChildProcessHost::kInvalidUniqueID),
@@ -166,11 +176,19 @@
   if (!rfh || !rfh->IsRenderFrameLive())
     return FrameData();
 
+  content::WebContents* web_contents =
+      content::WebContents::FromRenderFrameHost(rfh);
+
+  // The RenderFrameHost may not have an associated WebContents in cases
+  // such as interstitial pages.
+  GURL last_committed_main_frame_url =
+      web_contents ? web_contents->GetLastCommittedURL() : GURL();
   int tab_id = extension_misc::kUnknownTabId;
   int window_id = extension_misc::kUnknownWindowId;
   if (helper_)
     helper_->PopulateTabData(rfh, &tab_id, &window_id);
-  return FrameData(GetFrameId(rfh), GetParentFrameId(rfh), tab_id, window_id);
+  return FrameData(GetFrameId(rfh), GetParentFrameId(rfh), tab_id, window_id,
+                   std::move(last_committed_main_frame_url));
 }
 
 ExtensionApiFrameIdMap::FrameData ExtensionApiFrameIdMap::LookupFrameDataOnUI(
@@ -365,6 +383,79 @@
   iter->second.window_id = window_id;
 }
 
+void ExtensionApiFrameIdMap::OnMainFrameReadyToCommitNavigation(
+    content::NavigationHandle* navigation_handle) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(navigation_handle->IsInMainFrame());
+
+  bool did_insert = false;
+  std::tie(std::ignore, did_insert) =
+      ready_to_commit_document_navigations_.insert(navigation_handle);
+  DCHECK(did_insert);
+
+  content::RenderFrameHost* main_frame =
+      navigation_handle->GetRenderFrameHost();
+  DCHECK(main_frame);
+
+  // We only track live frames.
+  if (!main_frame->IsRenderFrameLive())
+    return;
+
+  const RenderFrameIdKey key(main_frame->GetProcess()->GetID(),
+                             main_frame->GetRoutingID());
+  base::AutoLock lock(frame_data_map_lock_);
+  FrameDataMap::iterator iter = frame_data_map_.find(key);
+
+  // We must have already cached the FrameData for this in
+  // InitializeRenderFrameHost.
+  DCHECK(iter != frame_data_map_.end());
+  iter->second.pending_main_frame_url = navigation_handle->GetURL();
+}
+
+void ExtensionApiFrameIdMap::OnMainFrameDidFinishNavigation(
+    content::NavigationHandle* navigation_handle) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(navigation_handle->IsInMainFrame());
+
+  bool did_fire_ready_to_commit_navigation =
+      !!ready_to_commit_document_navigations_.erase(navigation_handle);
+
+  // It's safe to call NavigationHandle::GetRenderFrameHost here iff the
+  // navigation committed or a ReadyToCommitNavigation event was dispatched for
+  // this navigation.
+  // Note a RenderFrameHost might not be associated with the NavigationHandle in
+  // WebContentsObserver::DidFinishNavigation. This might happen when the
+  // navigation doesn't commit which might happen for a variety of reasons like
+  // the network network request to fetch the navigation url failed, the
+  // navigation was cancelled, by say a NavigationThrottle etc.
+  // There's nothing to do if the RenderFrameHost can't be fetched for this
+  // navigation.
+  bool can_fetch_render_frame_host =
+      navigation_handle->HasCommitted() || did_fire_ready_to_commit_navigation;
+  if (!can_fetch_render_frame_host)
+    return;
+
+  content::RenderFrameHost* main_frame =
+      navigation_handle->GetRenderFrameHost();
+  DCHECK(main_frame);
+
+  // We only track live frames.
+  if (!main_frame->IsRenderFrameLive())
+    return;
+
+  const RenderFrameIdKey key(main_frame->GetProcess()->GetID(),
+                             main_frame->GetRoutingID());
+  base::AutoLock lock(frame_data_map_lock_);
+  FrameDataMap::iterator iter = frame_data_map_.find(key);
+
+  // We must have already cached the FrameData for this in
+  // InitializeRenderFrameHost.
+  DCHECK(iter != frame_data_map_.end());
+  iter->second.last_committed_main_frame_url =
+      main_frame->GetLastCommittedURL();
+  iter->second.pending_main_frame_url = base::nullopt;
+}
+
 bool ExtensionApiFrameIdMap::HasCachedFrameDataForTesting(
     content::RenderFrameHost* rfh) const {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/extensions/browser/extension_api_frame_id_map.h b/extensions/browser/extension_api_frame_id_map.h
index 6eed79a..d90b4fc 100644
--- a/extensions/browser/extension_api_frame_id_map.h
+++ b/extensions/browser/extension_api_frame_id_map.h
@@ -8,11 +8,14 @@
 #include <list>
 #include <map>
 #include <memory>
+#include <set>
 
 #include "base/callback.h"
 #include "base/lazy_instance.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "base/synchronization/lock.h"
+#include "url/gurl.h"
 
 namespace content {
 class NavigationHandle;
@@ -58,7 +61,15 @@
   // The data for a RenderFrame. Every RenderFrameIdKey maps to a FrameData.
   struct FrameData {
     FrameData();
-    FrameData(int frame_id, int parent_frame_id, int tab_id, int window_id);
+    FrameData(int frame_id,
+              int parent_frame_id,
+              int tab_id,
+              int window_id,
+              GURL last_committed_main_frame_url);
+    ~FrameData();
+
+    FrameData(const FrameData&);
+    FrameData& operator=(const FrameData&);
 
     // The extension API frame ID of the frame.
     int frame_id;
@@ -73,6 +84,15 @@
     // The id of the window that the frame is in, or -1 if the frame isn't in a
     // window.
     int window_id;
+
+    // The last committed url of the main frame to which this frame belongs.
+    // This ignores any same-document navigations.
+    GURL last_committed_main_frame_url;
+
+    // The pending main frame url. This is only non-empty for main frame data
+    // when the main frame is ready to commit navigation but hasn't fully
+    // completed the navigation yet. This ignores any same-document navigations.
+    base::Optional<GURL> pending_main_frame_url;
   };
 
   using FrameDataCallback = base::Callback<void(const FrameData&)>;
@@ -136,6 +156,16 @@
                             int window_id,
                             content::RenderFrameHost* rfh);
 
+  // Called when WebContentsObserver::ReadyToCommitNavigation is dispatched for
+  // a main frame.
+  void OnMainFrameReadyToCommitNavigation(
+      content::NavigationHandle* navigation_handle);
+
+  // Called when WebContentsObserver::DidFinishNavigation is dispatched for a
+  // main frame.
+  void OnMainFrameDidFinishNavigation(
+      content::NavigationHandle* navigation_handle);
+
   // Returns whether frame data for |rfh| is cached.
   bool HasCachedFrameDataForTesting(content::RenderFrameHost* rfh) const;
 
@@ -213,6 +243,12 @@
   // and during a write on the UI thread.
   base::Lock frame_data_map_lock_;
 
+  // The set of pending main frame navigations for which ReadyToCommitNavigation
+  // has been fired. Only used on the UI thread. This is needed to clear state
+  // set up in OnMainFrameReadyToCommitNavigation for navigations which
+  // eventually do not commit.
+  std::set<content::NavigationHandle*> ready_to_commit_document_navigations_;
+
   DISALLOW_COPY_AND_ASSIGN(ExtensionApiFrameIdMap);
 };
 
diff --git a/extensions/browser/extension_api_frame_id_map_unittest.cc b/extensions/browser/extension_api_frame_id_map_unittest.cc
index 8fb7def..1a77fbd 100644
--- a/extensions/browser/extension_api_frame_id_map_unittest.cc
+++ b/extensions/browser/extension_api_frame_id_map_unittest.cc
@@ -2,19 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "extensions/browser/extension_api_frame_id_map.h"
+
 #include "base/bind.h"
 #include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "extensions/browser/extension_api_frame_id_map.h"
+#include "extensions/common/constants.h"
 #include "ipc/ipc_message.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using FrameDataCallback = extensions::ExtensionApiFrameIdMap::FrameDataCallback;
-
 namespace extensions {
 
 namespace {
 
+using FrameDataCallback = extensions::ExtensionApiFrameIdMap::FrameDataCallback;
+
 int ToTestFrameId(int render_process_id, int frame_routing_id) {
   if (render_process_id < 0 && frame_routing_id < 0)
     return ExtensionApiFrameIdMap::kInvalidFrameId;
@@ -33,7 +36,7 @@
 
 int ToTestTabId(int render_process_id, int frame_routing_id) {
   if (render_process_id < 0 && frame_routing_id < 0)
-    return -1;
+    return extension_misc::kUnknownTabId;
   // Return a deterministic value (yet different from the input) for testing.
   // To make debugging easier: Ending with 5 = tab ID.
   return render_process_id * 1000 + frame_routing_id * 10 + 5;
@@ -41,12 +44,22 @@
 
 int ToTestWindowId(int render_process_id, int frame_routing_id) {
   if (render_process_id < 0 && frame_routing_id < 0)
-    return -1;
+    return extension_misc::kUnknownWindowId;
   // Return a deterministic value (yet different from the input) for testing.
   // To make debugging easier: Ending with 4 = window ID.
   return render_process_id * 1000 + frame_routing_id * 10 + 4;
 }
 
+GURL ToTestLastCommittedMainFrameURL(int render_process_id,
+                                     int frame_routing_id) {
+  if (render_process_id < 0 && frame_routing_id < 0)
+    return GURL();
+
+  // Return a deterministic value (yet different from the input) for testing.
+  return GURL(base::StringPrintf("http://%d.com/%d", render_process_id,
+                                 frame_routing_id));
+}
+
 class TestExtensionApiFrameIdMap : public ExtensionApiFrameIdMap {
  public:
   TestExtensionApiFrameIdMap() {}
@@ -80,7 +93,9 @@
         ToTestFrameId(key.render_process_id, key.frame_routing_id),
         ToTestParentFrameId(key.render_process_id, key.frame_routing_id),
         ToTestTabId(key.render_process_id, key.frame_routing_id),
-        ToTestWindowId(key.render_process_id, key.frame_routing_id));
+        ToTestWindowId(key.render_process_id, key.frame_routing_id),
+        ToTestLastCommittedMainFrameURL(key.render_process_id,
+                                        key.frame_routing_id));
   }
 };
 
@@ -113,6 +128,9 @@
               frame_data.tab_id);
     EXPECT_EQ(ToTestWindowId(render_process_id, frame_routing_id),
               frame_data.window_id);
+    EXPECT_EQ(
+        ToTestLastCommittedMainFrameURL(render_process_id, frame_routing_id),
+        frame_data.last_committed_main_frame_url);
   }
 
   const std::vector<std::string>& results() { return results_; }
@@ -273,6 +291,8 @@
             data.parent_frame_id);
   EXPECT_EQ(ToTestTabId(kRenderProcessId, kFrameRoutingId), data.tab_id);
   EXPECT_EQ(ToTestWindowId(kRenderProcessId, kFrameRoutingId), data.window_id);
+  EXPECT_EQ(ToTestLastCommittedMainFrameURL(kRenderProcessId, kFrameRoutingId),
+            data.last_committed_main_frame_url);
 }
 
 }  // namespace extensions
diff --git a/extensions/browser/extension_navigation_ui_data.cc b/extensions/browser/extension_navigation_ui_data.cc
index b80fe23..f6b0f034 100644
--- a/extensions/browser/extension_navigation_ui_data.cc
+++ b/extensions/browser/extension_navigation_ui_data.cc
@@ -6,6 +6,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/web_contents.h"
 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
 
 namespace extensions {
@@ -64,7 +65,13 @@
     int window_id,
     int frame_id,
     int parent_frame_id)
-    : frame_data_(frame_id, parent_frame_id, tab_id, window_id) {
+    : frame_data_(frame_id,
+                  parent_frame_id,
+                  tab_id,
+                  window_id,
+                  // The RenderFrameHost may not have an associated WebContents
+                  // in cases such as interstitial pages.
+                  web_contents ? web_contents->GetLastCommittedURL() : GURL()) {
   WebViewGuest* web_view = WebViewGuest::FromWebContents(web_contents);
   if (web_view) {
     is_web_view_ = true;
diff --git a/extensions/browser/extension_web_contents_observer.cc b/extensions/browser/extension_web_contents_observer.cc
index f6191b1d..e641aa10 100644
--- a/extensions/browser/extension_web_contents_observer.cc
+++ b/extensions/browser/extension_web_contents_observer.cc
@@ -169,9 +169,24 @@
   }
 }
 
+void ExtensionWebContentsObserver::ReadyToCommitNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (navigation_handle->IsInMainFrame() &&
+      !navigation_handle->IsSameDocument()) {
+    ExtensionApiFrameIdMap::Get()->OnMainFrameReadyToCommitNavigation(
+        navigation_handle);
+  }
+}
+
 void ExtensionWebContentsObserver::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
   DCHECK(initialized_);
+  if (navigation_handle->IsInMainFrame() &&
+      !navigation_handle->IsSameDocument()) {
+    ExtensionApiFrameIdMap::Get()->OnMainFrameDidFinishNavigation(
+        navigation_handle);
+  }
+
   if (!navigation_handle->HasCommitted())
     return;
 
@@ -179,6 +194,8 @@
 
   content::RenderFrameHost* render_frame_host =
       navigation_handle->GetRenderFrameHost();
+  DCHECK(render_frame_host);
+
   const Extension* frame_extension =
       GetExtensionFromFrame(render_frame_host, true);
   if (pm->IsRenderFrameHostRegistered(render_frame_host)) {
diff --git a/extensions/browser/extension_web_contents_observer.h b/extensions/browser/extension_web_contents_observer.h
index 9a412ac..289cbcb 100644
--- a/extensions/browser/extension_web_contents_observer.h
+++ b/extensions/browser/extension_web_contents_observer.h
@@ -91,6 +91,8 @@
   void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
   void RenderFrameHostChanged(content::RenderFrameHost* old_host,
                               content::RenderFrameHost* new_host) override;
+  void ReadyToCommitNavigation(
+      content::NavigationHandle* navigation_handle) override;
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
 
diff --git a/infra/config/branch/cq.cfg b/infra/config/branch/cq.cfg
index 003d136..cd50f2565 100644
--- a/infra/config/branch/cq.cfg
+++ b/infra/config/branch/cq.cfg
@@ -184,15 +184,7 @@
       }
       builders {
         name: "win_chromium_compile_dbg_ng"
-        equivalent_to { bucket: "luci.chromium.try" percentage: 0 }
-      }
-      builders {
-        # The only purpose of this builder here is get data for migrating this
-        # builder to LUCI, see https://crbug.com/731384.
-        # TODO(jchinlee): remove this builder once enough data has been
-        # collected.
-        name: "win_chromium_dbg_ng"
-        experiment_percentage: 5
+        equivalent_to { bucket: "luci.chromium.try" percentage: 10 }
       }
       builders {
         name: "win7_chromium_rel_loc_exp"
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index 143b0b0..155492c 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -1001,6 +1001,7 @@
       mixins: "linux-try"
       mixins: "goma-j150"
       name: "linux_chromium_rel_ng_patch_on_gclient"
+      dimensions: "builder:linux_chromium_rel_ng"
       experimental: YES
       recipe {
         properties: "buildername:linux_chromium_rel_ng"
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index f6c7d64..d489e8e 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -117,6 +117,7 @@
     "//ios/chrome/browser/browsing_data:features",
     "//ios/chrome/browser/download",
     "//ios/chrome/browser/drag_and_drop",
+    "//ios/chrome/browser/itunes_links",
     "//ios/chrome/browser/mailto:features",
     "//ios/chrome/browser/payments:constants",
     "//ios/chrome/browser/ssl:features",
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index d121ce8..d6e66b5 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -42,6 +42,7 @@
 #include "ios/chrome/browser/chrome_switches.h"
 #include "ios/chrome/browser/drag_and_drop/drag_and_drop_flag.h"
 #include "ios/chrome/browser/ios_chrome_flag_descriptions.h"
+#include "ios/chrome/browser/itunes_links/itunes_links_flag.h"
 #include "ios/chrome/browser/mailto/features.h"
 #include "ios/chrome/browser/ssl/captive_portal_features.h"
 #include "ios/chrome/browser/ui/external_search/features.h"
@@ -269,6 +270,10 @@
     {"search-icon-toggle", flag_descriptions::kSearchIconToggleName,
      flag_descriptions::kSearchIconToggleDescription, flags_ui::kOsIos,
      MULTI_VALUE_TYPE(kSearchButtonIconChoices)},
+    {"itunes-links-store-kit-handling",
+     flag_descriptions::kITunesLinksStoreKitHandlingName,
+     flag_descriptions::kITunesLinksStoreKitHandlingDescription,
+     flags_ui::kOsIos, FEATURE_VALUE_TYPE(kITunesLinksStoreKitHandling)},
     {"unified-consent", flag_descriptions::kUnifiedConsentName,
      flag_descriptions::kUnifiedConsentDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(signin::kUnifiedConsent)},
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
index 7ef62b1..41f2935 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -66,6 +66,11 @@
     "an individual promotion causes that promotion but no other promotions to "
     "occur.";
 
+const char kITunesLinksStoreKitHandlingName[] = "Store kit for ITunes links";
+const char kITunesLinksStoreKitHandlingDescription[] =
+    "When enabled, opening itunes product links will be handled using the "
+    "store kit.";
+
 const char kMailtoHandlingWithGoogleUIName[] = "Mailto Handling with Google UI";
 const char kMailtoHandlingWithGoogleUIDescription[] =
     "When enabled, tapping mailto: links will open a contextual menu to allow "
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h
index 721ea75..e269ac00 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -58,6 +58,10 @@
 extern const char kInProductHelpDemoModeName[];
 extern const char kInProductHelpDemoModeDescription[];
 
+// Title and description for the flag to enable ITunes links store kit handling.
+extern const char kITunesLinksStoreKitHandlingName[];
+extern const char kITunesLinksStoreKitHandlingDescription[];
+
 // Title, description, and options for Google UI menu for handling mailto links.
 extern const char kMailtoHandlingWithGoogleUIName[];
 extern const char kMailtoHandlingWithGoogleUIDescription[];
diff --git a/ios/chrome/browser/itunes_links/BUILD.gn b/ios/chrome/browser/itunes_links/BUILD.gn
index ecedc575..ac05a6c 100644
--- a/ios/chrome/browser/itunes_links/BUILD.gn
+++ b/ios/chrome/browser/itunes_links/BUILD.gn
@@ -5,8 +5,10 @@
 source_set("itunes_links") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "itunes_links_observer.h",
-    "itunes_links_observer.mm",
+    "itunes_links_flag.h",
+    "itunes_links_flag.mm",
+    "itunes_links_handler_tab_helper.h",
+    "itunes_links_handler_tab_helper.mm",
   ]
   deps = [
     "//base",
@@ -20,12 +22,14 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
-    "itunes_links_observer_unittest.mm",
+    "itunes_links_handler_tab_helper_unittest.mm",
   ]
   deps = [
     ":itunes_links",
     "//base",
     "//ios/chrome/browser/store_kit",
+    "//ios/chrome/test/fakes",
+    "//ios/web/public",
     "//ios/web/public/test/fakes",
     "//testing/gtest",
     "//third_party/ocmock",
diff --git a/ios/chrome/browser/itunes_links/itunes_links_flag.h b/ios/chrome/browser/itunes_links/itunes_links_flag.h
new file mode 100644
index 0000000..5f548559
--- /dev/null
+++ b/ios/chrome/browser/itunes_links/itunes_links_flag.h
@@ -0,0 +1,12 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_FLAG_H_
+#define IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_FLAG_H_
+
+#include "base/feature_list.h"
+
+extern const base::Feature kITunesLinksStoreKitHandling;
+
+#endif  // IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_FLAG_H
diff --git a/ios/chrome/browser/itunes_links/itunes_links_flag.mm b/ios/chrome/browser/itunes_links/itunes_links_flag.mm
new file mode 100644
index 0000000..a886670
--- /dev/null
+++ b/ios/chrome/browser/itunes_links/itunes_links_flag.mm
@@ -0,0 +1,12 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/itunes_links/itunes_links_flag.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+const base::Feature kITunesLinksStoreKitHandling{
+    "ITunesLinksStoreKitHandling", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.h b/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.h
new file mode 100644
index 0000000..668f91fb
--- /dev/null
+++ b/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.h
@@ -0,0 +1,40 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_HANDLER_TAB_HELPER_H_
+#define IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_HANDLER_TAB_HELPER_H_
+
+#include "base/macros.h"
+#include "ios/web/public/web_state/web_state_observer.h"
+#include "ios/web/public/web_state/web_state_user_data.h"
+
+namespace web {
+class WebStatePolicyDecider;
+}
+// TabHelper which handles navigation to iTunes links.
+// If a navigation to web page for a product in iTunes App Store happens, this
+// helper will use StoreKitTabHelper to present the information of that product.
+// The goal of this class is to workaround a bug where appstore website serves
+// the wrong content for itunes.apple.com pages, see http://crbug.com/623016.
+class ITunesLinksHandlerTabHelper
+    : public web::WebStateObserver,
+      public web::WebStateUserData<ITunesLinksHandlerTabHelper> {
+ public:
+  ~ITunesLinksHandlerTabHelper() override;
+  explicit ITunesLinksHandlerTabHelper(web::WebState* web_state);
+
+ private:
+  // web::WebStateObserver implementation
+  void DidFinishNavigation(web::WebState* web_state,
+                           web::NavigationContext* navigation_context) override;
+  void WebStateDestroyed(web::WebState* web_state) override;
+
+  // PolicyDecider instance that will be initialized with the
+  // ITunesLinkHandlerTabHelper object, and destroyed with it.
+  std::unique_ptr<web::WebStatePolicyDecider> policy_decider_;
+
+  DISALLOW_COPY_AND_ASSIGN(ITunesLinksHandlerTabHelper);
+};
+
+#endif  // IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_HANDLER_TAB_HELPER_H_
diff --git a/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.mm b/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.mm
new file mode 100644
index 0000000..8300772
--- /dev/null
+++ b/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.mm
@@ -0,0 +1,112 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.h"
+
+#import <Foundation/Foundation.h>
+
+#include "base/logging.h"
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
+#include "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/store_kit/store_kit_tab_helper.h"
+#import "ios/web/public/navigation_item.h"
+#import "ios/web/public/navigation_manager.h"
+#import "ios/web/public/web_state/navigation_context.h"
+#import "ios/web/public/web_state/web_state_policy_decider.h"
+#import "net/base/mac/url_conversions.h"
+#include "url/gurl.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+DEFINE_WEB_STATE_USER_DATA_KEY(ITunesLinksHandlerTabHelper);
+
+namespace {
+
+// The domain for iTunes appstore links.
+const char kITunesUrlDomain[] = "itunes.apple.com";
+const char kITunesProductIdPrefix[] = "id";
+
+// Returns true, it the given |url| is iTunes product url.
+bool IsITunesProductUrl(const GURL& url) {
+  if (!url.SchemeIsHTTPOrHTTPS() || !url.DomainIs(kITunesUrlDomain))
+    return false;
+  std::string file_name = url.ExtractFileName();
+  // The first |kITunesProductIdLength| characters must be
+  // |kITunesProductIdPrefix|, followed by the app ID.
+  size_t prefix_length = strlen(kITunesProductIdPrefix);
+  return (file_name.length() > prefix_length &&
+          file_name.substr(0, prefix_length) == kITunesProductIdPrefix);
+}
+
+// This class handles requests & responses that involve iTunes product links.
+class ITunesLinksHandlerWebStatePolicyDecider
+    : public web::WebStatePolicyDecider {
+ public:
+  explicit ITunesLinksHandlerWebStatePolicyDecider(web::WebState* web_state)
+      : web::WebStatePolicyDecider(web_state) {}
+
+  // web::WebStatePolicyDecider implementation
+  bool ShouldAllowResponse(NSURLResponse* response,
+                           bool for_main_frame) override {
+    // Don't allow rendering responses from Itunes appstore URLs unless it's on
+    // iframe.
+    return !for_main_frame ||
+           !IsITunesProductUrl(net::GURLWithNSURL(response.URL));
+  }
+
+  bool ShouldAllowRequest(NSURLRequest* request,
+                          ui::PageTransition transition) override {
+    web::NavigationItem* pending_item =
+        web_state()->GetNavigationManager()->GetPendingItem();
+
+    if (!pending_item)
+      return true;
+    // If the pending item URL is http iTunes appstore URL, but the request URL
+    // is not http URL, then there was a redirect to an external application and
+    // request should be blocked to be able to show the store kit later.
+    GURL pending_item_url = pending_item->GetURL();
+    GURL request_url = net::GURLWithNSURL(request.URL);
+    return !IsITunesProductUrl(pending_item_url) ||
+           request_url.SchemeIsHTTPOrHTTPS();
+  }
+};
+
+}  // namespace
+
+ITunesLinksHandlerTabHelper::~ITunesLinksHandlerTabHelper() = default;
+
+ITunesLinksHandlerTabHelper::ITunesLinksHandlerTabHelper(
+    web::WebState* web_state)
+    : policy_decider_(std::make_unique<ITunesLinksHandlerWebStatePolicyDecider>(
+          web_state)) {
+  web_state->AddObserver(this);
+}
+
+// WebStateObserver
+void ITunesLinksHandlerTabHelper::DidFinishNavigation(
+    web::WebState* web_state,
+    web::NavigationContext* navigation_context) {
+  GURL url = navigation_context->GetUrl();
+  // Whenever a navigation to iTunes product url is finished, launch StoreKit.
+  if (IsITunesProductUrl(url)) {
+    // If the url is iTunes product url, then this navigation should not be
+    // committed, as the policy decider's ShouldAllowResponse will return false.
+    DCHECK(!navigation_context->HasCommitted());
+    std::string product_id =
+        url.ExtractFileName().substr(strlen(kITunesProductIdPrefix));
+    StoreKitTabHelper* tab_helper = StoreKitTabHelper::FromWebState(web_state);
+    if (tab_helper) {
+      base::RecordAction(
+          base::UserMetricsAction("ITunesLinksHandler_StoreKitLaunched"));
+      tab_helper->OpenAppStore(base::SysUTF8ToNSString(product_id));
+    }
+  }
+}
+
+void ITunesLinksHandlerTabHelper::WebStateDestroyed(web::WebState* web_state) {
+  web_state->RemoveObserver(this);
+}
diff --git a/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper_unittest.mm b/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper_unittest.mm
new file mode 100644
index 0000000..1ff1df56
--- /dev/null
+++ b/ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper_unittest.mm
@@ -0,0 +1,164 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.h"
+
+#import <Foundation/Foundation.h>
+
+#include "base/observer_list.h"
+#import "ios/chrome/browser/store_kit/store_kit_tab_helper.h"
+#import "ios/chrome/test/fakes/fake_store_kit_launcher.h"
+#import "ios/web/public/test/fakes/fake_navigation_context.h"
+#import "ios/web/public/test/fakes/test_navigation_manager.h"
+#import "ios/web/public/test/fakes/test_web_state.h"
+#import "ios/web/public/web_state/web_state_policy_decider.h"
+#include "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+#include "url/gurl.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+class ITunesLinksHandlerTabHelperTest : public PlatformTest {
+ protected:
+  ITunesLinksHandlerTabHelperTest()
+      : fake_launcher_([[FakeStoreKitLauncher alloc] init]) {
+    StoreKitTabHelper::CreateForWebState(&web_state_);
+    std::unique_ptr<web::TestNavigationManager> test_navigation_manager =
+        std::make_unique<web::TestNavigationManager>();
+    navigation_manager_ = test_navigation_manager.get();
+    web_state_.SetNavigationManager(std::move(test_navigation_manager));
+    ITunesLinksHandlerTabHelper::CreateForWebState(&web_state_);
+    StoreKitTabHelper::FromWebState(&web_state_)->SetLauncher(fake_launcher_);
+  }
+
+  // Tries to finish navigation with the given |url_string| and returns true if
+  // store kit was launched.
+  bool VerifyStoreKitLaunched(const std::string& url_string) {
+    fake_launcher_.launchedProductID = nil;
+    web::FakeNavigationContext context;
+    context.SetUrl(GURL(url_string));
+    web_state_.OnNavigationFinished(&context);
+    return fake_launcher_.launchedProductID != nil;
+  }
+
+  // Checks that given the pending item URL & the request URL if
+  // ITunesHandlerPolicyDecider will allow the request.
+  bool ShouldAllowRequest(NSString* url_string,
+                          std::string const& pending_item_url) {
+    std::unique_ptr<web::NavigationItem> pending_item;
+    if (!pending_item_url.empty()) {
+      pending_item = web::NavigationItem::Create();
+      pending_item->SetURL(GURL(pending_item_url));
+    }
+    navigation_manager_->SetPendingItem(pending_item.get());
+
+    return web_state_.ShouldAllowRequest(
+        [NSURLRequest requestWithURL:[NSURL URLWithString:url_string]],
+        ui::PageTransition::PAGE_TRANSITION_LINK);
+  }
+
+  // Checks that given the pending item URL & the request URL if
+  // ITunesHandlerPolicyDecider will allow the request.
+  bool ShouldAllowResponse(NSString* url_string, bool main_frame) {
+    NSURLResponse* response =
+        [[NSURLResponse alloc] initWithURL:[NSURL URLWithString:url_string]
+                                  MIMEType:@"text/html"
+                     expectedContentLength:0
+                          textEncodingName:nil];
+    return web_state_.ShouldAllowResponse(response, main_frame);
+  }
+
+  web::TestNavigationManager* navigation_manager_;
+  FakeStoreKitLauncher* fake_launcher_;
+  web::TestWebState web_state_;
+};
+
+// Verifies that navigating to URLs that are not product hosted on the iTunes
+// AppStore does not launch storekit.
+TEST_F(ITunesLinksHandlerTabHelperTest, NonMatchingUrlsDoesntLaunchStoreKit) {
+  EXPECT_FALSE(VerifyStoreKitLaunched(""));
+  EXPECT_FALSE(VerifyStoreKitLaunched("foobar"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("foo://bar"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("http://foo"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("http://foo?bar#qux"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("http://foo.bar/qux"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("http://itunes.apple.com"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("http://itunes.apple.com/id"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("http://itunes.apple.com/12345"));
+  EXPECT_FALSE(VerifyStoreKitLaunched("itms-apps://itunes.apple.com/id123"));
+}
+
+// Verifies that navigating to URLs for a product hosted on iTunes AppStore
+// launches storekit.
+TEST_F(ITunesLinksHandlerTabHelperTest, MatchingUrlsLaunchesStoreKit) {
+  EXPECT_TRUE(VerifyStoreKitLaunched("http://itunes.apple.com/id123"));
+  EXPECT_NSEQ(@"123", fake_launcher_.launchedProductID);
+
+  EXPECT_TRUE(VerifyStoreKitLaunched("https://itunes.apple.com/id134"));
+  EXPECT_NSEQ(@"134", fake_launcher_.launchedProductID);
+
+  EXPECT_TRUE(VerifyStoreKitLaunched("http://itunes.apple.com/bar/id123"));
+  EXPECT_NSEQ(@"123", fake_launcher_.launchedProductID);
+
+  EXPECT_TRUE(VerifyStoreKitLaunched("http://itunes.apple.com/bar/id243?qux"));
+  EXPECT_NSEQ(@"243", fake_launcher_.launchedProductID);
+
+  EXPECT_TRUE(
+      VerifyStoreKitLaunched("http://itunes.apple.com/bar/idabc?qux&baz"));
+  EXPECT_NSEQ(@"abc", fake_launcher_.launchedProductID);
+
+  EXPECT_TRUE(
+      VerifyStoreKitLaunched("http://itunes.apple.com/bar/id123?qux&baz#foo"));
+  EXPECT_NSEQ(@"123", fake_launcher_.launchedProductID);
+
+  EXPECT_TRUE(VerifyStoreKitLaunched(
+      "http://foo.itunes.apple.com/bar/id123?qux&baz#foo"));
+  EXPECT_NSEQ(@"123", fake_launcher_.launchedProductID);
+}
+
+// Verifies that ItunesLinkHandlerPolicyDecider don't allow redirects to Apple
+// appstore when the original request link is http itunes product URL.
+TEST_F(ITunesLinksHandlerTabHelperTest, TestPolicyDeciderShouldAllowRequest) {
+  EXPECT_FALSE(ShouldAllowRequest(
+      /*url_string=*/@"itms://itunes.apple.com/12345",
+      /*pending_item_url=*/"http://itunes.apple.com/bar/id123"));
+  EXPECT_TRUE(
+      ShouldAllowRequest(/*url_string=*/@"itms://itunes.apple.com/12345",
+                         /*pending_item_url=*/"http://foo.bar"));
+  EXPECT_TRUE(
+      ShouldAllowRequest(/*url_string=*/@"http://itunes.apple.com/12345",
+                         /*pending_item_url=*/""));
+  EXPECT_TRUE(
+      ShouldAllowRequest(/*url_string=*/@"http://itunes.apple.com/bar/id123",
+                         /*pending_item_url=*/""));
+  EXPECT_TRUE(ShouldAllowRequest(
+      /*url_string=*/@"http://itunes.apple.com/12345",
+      /*pending_item_url=*/"https://foo.bar"));
+}
+
+// Verifies that ItunesLinkHandlerPolicyDecider block response from http itunes
+// product URL.
+TEST_F(ITunesLinksHandlerTabHelperTest, TestPolicyDeciderShouldAllowResponse) {
+  EXPECT_TRUE(ShouldAllowResponse(/*url_string=*/@"http://itunes.apple.com",
+                                  /*main_frame=*/true));
+  EXPECT_FALSE(ShouldAllowResponse(
+      /*url_string=*/@"http://itunes.apple.com/id1234", /*main_frame=*/true));
+  // If the response is for subframe, it should be allowed.
+  EXPECT_TRUE(ShouldAllowResponse(
+      /*url_string=*/@"http://itunes.apple.com/id1234", /*main_frame=*/false));
+
+  EXPECT_TRUE(ShouldAllowResponse(
+      /*url_string=*/@"http://itunes.apple.com/12345", /*main_frame=*/true));
+  EXPECT_FALSE(ShouldAllowResponse(
+      /*url_string=*/@"http://itunes.apple.com/bar/id123?qux",
+      /*main_frame=*/true));
+
+  EXPECT_TRUE(
+      ShouldAllowResponse(/*url_string=*/@"itms-apps://itunes.apple.com/id123",
+                          /*main_frame=*/true));
+  EXPECT_TRUE(ShouldAllowResponse(/*url_string=*/@"http://foo.bar/qux",
+                                  /*main_frame=*/true));
+}
diff --git a/ios/chrome/browser/itunes_links/itunes_links_observer.h b/ios/chrome/browser/itunes_links/itunes_links_observer.h
deleted file mode 100644
index 4cf8ea0b..0000000
--- a/ios/chrome/browser/itunes_links/itunes_links_observer.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_OBSERVER_H_
-#define IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_OBSERVER_H_
-
-#import <Foundation/Foundation.h>
-
-#import "ios/web/public/web_state/web_state_observer_bridge.h"
-
-namespace web {
-class WebState;
-};
-
-@protocol StoreKitLauncher;
-
-// Instances of this class observe navigation events. If a page concerning a
-// product on the iTunes App Store is loaded, this class will trigger the
-// opening of a SKStoreProductViewController presenting the information of the
-// said product.
-// The goal of this class is to workaround a bug where Apple serves the wrong
-// content for itunes.apple.com pages, see http://crbug.com/623016.
-@interface ITunesLinksObserver : NSObject<CRWWebStateObserver>
-- (instancetype)initWithWebState:(web::WebState*)webState
-    NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-// Sets the object responsible for showing the App Store product page.
-// |storeKitLauncher| can be nil.
-- (void)setStoreKitLauncher:(id<StoreKitLauncher>)storeKitLauncher;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_ITUNES_LINKS_ITUNES_LINKS_OBSERVER_H_
diff --git a/ios/chrome/browser/itunes_links/itunes_links_observer.mm b/ios/chrome/browser/itunes_links/itunes_links_observer.mm
deleted file mode 100644
index 54ba8db..0000000
--- a/ios/chrome/browser/itunes_links/itunes_links_observer.mm
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/itunes_links/itunes_links_observer.h"
-
-#include <memory>
-
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/sys_string_conversions.h"
-#import "ios/chrome/browser/store_kit/store_kit_tab_helper.h"
-#import "ios/web/public/web_state/web_state.h"
-#import "ios/web/public/web_state/web_state_observer_bridge.h"
-#include "url/gurl.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface ITunesLinksObserver ()
-
-// If |URL| points to a product on itunes.apple.com, returns the product ID.
-// Otherwise, returns nil.
-// Examples of URLs pointing to products on itunes.apple.com can be found in
-// itunes_links_observer_unittest.mm.
-+ (NSString*)productIDFromURL:(const GURL&)URL;
-
-@end
-
-@implementation ITunesLinksObserver {
-  // The WebState this instance is observing. Will be null after
-  // -webStateDestroyed: has been called.
-  web::WebState* _webState;
-
-  // Bridge used to observe C++ WebState instance.
-  std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge;
-}
-
-- (instancetype)initWithWebState:(web::WebState*)webState {
-  self = [super init];
-  if (self) {
-    DCHECK(webState);
-    _webState = webState;
-    _webStateObserverBridge =
-        std::make_unique<web::WebStateObserverBridge>(self);
-    _webState->AddObserver(_webStateObserverBridge.get());
-  }
-  return self;
-}
-
-- (void)dealloc {
-  if (_webState) {
-    _webState->RemoveObserver(_webStateObserverBridge.get());
-    _webStateObserverBridge.reset();
-    _webState = nullptr;
-  }
-}
-
-+ (NSString*)productIDFromURL:(const GURL&)URL {
-  if (!URL.SchemeIsHTTPOrHTTPS() || !URL.DomainIs("itunes.apple.com"))
-    return nil;
-  std::string fileName = URL.ExtractFileName();
-  // The first 2 characters must be "id", followed by the app ID.
-  if (fileName.length() < 3 || fileName.substr(0, 2) != "id")
-    return nil;
-  std::string productID = fileName.substr(2);
-  return base::SysUTF8ToNSString(productID);
-}
-
-#pragma mark - WebStateObserverBridge
-
-- (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success {
-  DCHECK_EQ(_webState, webState);
-  GURL URL = webState->GetLastCommittedURL();
-  NSString* productID = [ITunesLinksObserver productIDFromURL:URL];
-  if (productID) {
-    StoreKitTabHelper* tabHelper = StoreKitTabHelper::FromWebState(_webState);
-    if (tabHelper)
-      tabHelper->OpenAppStore(productID);
-  }
-}
-
-- (void)webStateDestroyed:(web::WebState*)webState {
-  DCHECK_EQ(_webState, webState);
-  _webState->RemoveObserver(_webStateObserverBridge.get());
-  _webStateObserverBridge.reset();
-  _webState = nullptr;
-}
-
-#pragma mark - Public methods.
-
-- (void)setStoreKitLauncher:(id<StoreKitLauncher>)storeKitLauncher {
-  StoreKitTabHelper* tabHelper = StoreKitTabHelper::FromWebState(_webState);
-  if (tabHelper)
-    tabHelper->SetLauncher(storeKitLauncher);
-}
-
-@end
diff --git a/ios/chrome/browser/itunes_links/itunes_links_observer_unittest.mm b/ios/chrome/browser/itunes_links/itunes_links_observer_unittest.mm
deleted file mode 100644
index a375467..0000000
--- a/ios/chrome/browser/itunes_links/itunes_links_observer_unittest.mm
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Foundation/Foundation.h>
-
-#import "ios/chrome/browser/itunes_links/itunes_links_observer.h"
-
-#import "ios/chrome/browser/store_kit/store_kit_tab_helper.h"
-#import "ios/web/public/test/fakes/test_web_state.h"
-#include "testing/gtest_mac.h"
-#include "testing/platform_test.h"
-#import "third_party/ocmock/OCMock/OCMock.h"
-#import "third_party/ocmock/gtest_support.h"
-#include "url/gurl.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-
-class ITunesLinksObserverTest : public PlatformTest {
- protected:
-  void SetUp() override {
-    StoreKitTabHelper::CreateForWebState(&web_state_);
-    mocked_store_kit_launcher_ =
-        [OCMockObject mockForProtocol:@protocol(StoreKitLauncher)];
-    link_observer_ = [[ITunesLinksObserver alloc] initWithWebState:&web_state_];
-    [link_observer_ setStoreKitLauncher:mocked_store_kit_launcher_];
-  }
-  void VerifyOpeningOfAppStore(NSString* expected_product_id,
-                               std::string const& url_string) {
-    if (expected_product_id)
-      [[mocked_store_kit_launcher_ expect] openAppStore:expected_product_id];
-    web_state_.SetCurrentURL(GURL(url_string));
-    [link_observer_ webState:&web_state_ didLoadPageWithSuccess:YES];
-    EXPECT_OCMOCK_VERIFY(mocked_store_kit_launcher_);
-  }
-
-  void TearDown() override {
-    // |link_observer_| must be destroyed before web_state_.
-    link_observer_ = nil;
-  }
-
-  web::TestWebState web_state_;
-  id mocked_store_kit_launcher_;
-  // |link_observer_| must be destroyed before web_state_.
-  ITunesLinksObserver* link_observer_;
-};
-
-// Verifies that navigating to URLs not concerning a product hosted on the
-// iTunes AppStore does not trigger the opening of the AppStore.
-TEST_F(ITunesLinksObserverTest, NonMatchingUrls) {
-  VerifyOpeningOfAppStore(nil, "");
-  VerifyOpeningOfAppStore(nil, "foobar");
-  VerifyOpeningOfAppStore(nil, "foo://bar");
-  VerifyOpeningOfAppStore(nil, "http://foo");
-  VerifyOpeningOfAppStore(nil, "http://foo?bar#qux");
-  VerifyOpeningOfAppStore(nil, "http://foo.bar/qux");
-  VerifyOpeningOfAppStore(nil, "http://itunes.apple.com");
-  VerifyOpeningOfAppStore(nil, "http://itunes.apple.com/id");
-  VerifyOpeningOfAppStore(nil, "http://itunes.apple.com/12345");
-  VerifyOpeningOfAppStore(nil, "ftp://itunes.apple.com/id123");
-}
-
-// Verifies that navigating to URLs concerning a product hosted on iTunes
-// AppStore triggers the opening of the AppStore.
-TEST_F(ITunesLinksObserverTest, MatchingUrls) {
-  VerifyOpeningOfAppStore(@"123", "http://itunes.apple.com/id123");
-  VerifyOpeningOfAppStore(@"123", "https://itunes.apple.com/id123");
-  VerifyOpeningOfAppStore(@"123", "http://itunes.apple.com/bar/id123");
-  VerifyOpeningOfAppStore(@"123", "http://itunes.apple.com/bar/id123?qux");
-  VerifyOpeningOfAppStore(@"123", "http://itunes.apple.com/bar/id123?qux&baz");
-  VerifyOpeningOfAppStore(@"123",
-                          "http://itunes.apple.com/bar/id123?qux&baz#foo");
-  VerifyOpeningOfAppStore(@"123",
-                          "http://foo.itunes.apple.com/bar/id123?qux&baz#foo");
-}
-
-}  // namespace
diff --git a/ios/chrome/browser/passwords/form_parser.cc b/ios/chrome/browser/passwords/form_parser.cc
index 4cbe1447..7bebb80 100644
--- a/ios/chrome/browser/passwords/form_parser.cc
+++ b/ios/chrome/browser/passwords/form_parser.cc
@@ -320,6 +320,7 @@
   result->origin = form_data.origin;
   result->signon_realm = form_data.origin.GetOrigin().spec();
   result->action = form_data.action;
+  result->form_data = form_data;
 
   // Try to parse with autocomplete attributes.
   auto autocomplete_parse_result = ParseUsingAutocomplete(fields);
diff --git a/ios/chrome/browser/passwords/form_parser_unittest.cc b/ios/chrome/browser/passwords/form_parser_unittest.cc
index 7621bed67..344b664 100644
--- a/ios/chrome/browser/passwords/form_parser_unittest.cc
+++ b/ios/chrome/browser/passwords/form_parser_unittest.cc
@@ -156,6 +156,7 @@
           EXPECT_TRUE(parsed_form)
               << "The form is expected to be parsed successfully";
       } else if (!expected_indices.IsEmpty() && parsed_form) {
+        EXPECT_TRUE(form_data.SameFormAs(parsed_form->form_data));
         CheckPasswordFormFields(*parsed_form, form_data, expected_indices);
       } else {
         // Expected and parsed results are empty, everything is ok.
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index fb01571..476bf7e 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -22,8 +22,10 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
+#include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/autofill/core/common/password_form_fill_data.h"
+#include "components/autofill/ios/browser/autofill_util.h"
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/infobars/core/infobar_manager.h"
 #include "components/password_manager/core/browser/password_bubble_experiment.h"
@@ -36,6 +38,7 @@
 #include "ios/chrome/browser/passwords/account_select_fill_data.h"
 #include "ios/chrome/browser/passwords/credential_manager.h"
 #include "ios/chrome/browser/passwords/credential_manager_features.h"
+#include "ios/chrome/browser/passwords/form_parser.h"
 #import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h"
 #import "ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.h"
 #import "ios/chrome/browser/passwords/js_password_manager.h"
@@ -57,6 +60,8 @@
 #error "This file requires ARC support."
 #endif
 
+using autofill::FormData;
+using autofill::PasswordForm;
 using password_manager::AccountSelectFillData;
 using password_manager::FillData;
 using password_manager::PasswordFormManager;
@@ -102,13 +107,6 @@
            fromFormsJSON:(NSString*)jsonString
                  pageURL:(const GURL&)pageURL;
 
-// Processes the JSON string returned as a result of extracting the submitted
-// form data and populates |form|. Returns YES on success. NO otherwise.
-// |form| cannot be nil.
-- (BOOL)getPasswordForm:(autofill::PasswordForm*)form
-   fromPasswordFormJSON:(NSString*)jsonString
-                pageURL:(const GURL&)pageURL;
-
 // Informs the |passwordManager_| of the password forms (if any were present)
 // that have been found on the page.
 - (void)didFinishPasswordFormExtraction:
@@ -148,13 +146,6 @@
                                  const autofill::PasswordForm& form))
                            completionHandler;
 
-// Takes values from a JSON |dictionary| and populates the |form|.
-// The |pageLocation| is the URL of the current page.
-// Returns YES if the form was correctly populated, NO otherwise.
-- (BOOL)getPasswordForm:(autofill::PasswordForm*)form
-         fromDictionary:(const base::DictionaryValue*)dictionary
-                pageURL:(const GURL&)pageLocation;
-
 // Displays infobar for |form| with |type|. If |type| is UPDATE, the user
 // is prompted to update the password. If |type| is SAVE, the user is prompted
 // to save the password.
@@ -211,18 +202,6 @@
   return [suggestions copy];
 }
 
-// Removes URL components not essential for matching the URL to
-// saved password databases entries.  The stripped components are:
-// user, password, query and ref.
-GURL stripURL(GURL& url) {
-  url::Replacements<char> replacements;
-  replacements.ClearUsername();
-  replacements.ClearPassword();
-  replacements.ClearQuery();
-  replacements.ClearRef();
-  return url.ReplaceComponents(replacements);
-}
-
 // Serializes arguments into a JSON string that can be used by the JS side
 // of PasswordController.
 NSString* SerializeFillData(const GURL& origin,
@@ -293,6 +272,8 @@
 
   AccountSelectFillData fillData_;
 
+  FormParser formParser_;
+
   // The WebState this instance is observing. Will be null after
   // -webStateDestroyed: has been called.
   web::WebState* webState_;
@@ -557,35 +538,17 @@
            fromFormsJSON:(NSString*)JSONNSString
                  pageURL:(const GURL&)pageURL {
   DCHECK(forms);
-  std::string JSONString = base::SysNSStringToUTF8(JSONNSString);
-  if (JSONString.empty()) {
-    VLOG(1) << "Error in password controller javascript.";
+  std::vector<autofill::FormData> formsData;
+  if (!autofill::ExtractFormsData(JSONNSString, false, base::string16(),
+                                  pageURL, &formsData)) {
     return;
   }
 
-  int errorCode = 0;
-  std::string errorMessage;
-  std::unique_ptr<base::Value> jsonData(base::JSONReader::ReadAndReturnError(
-      JSONString, false, &errorCode, &errorMessage));
-  if (errorCode || !jsonData || !jsonData->is_list()) {
-    VLOG(1) << "JSON parse error " << errorMessage
-            << " JSON string: " << JSONString;
-    return;
-  }
-
-  const base::ListValue* formDataList;
-  if (!jsonData->GetAsList(&formDataList))
-    return;
-  for (size_t i = 0; i != formDataList->GetSize(); ++i) {
-    const base::DictionaryValue* formData;
-    if (formDataList->GetDictionary(i, &formData)) {
-      autofill::PasswordForm form;
-      if ([self getPasswordForm:&form
-                 fromDictionary:formData
-                        pageURL:pageURL]) {
-        forms->push_back(form);
-      }
-    }
+  for (const auto& formData : formsData) {
+    std::unique_ptr<PasswordForm> form =
+        formParser_.Parse(formData, FormParsingMode::FILLING);
+    if (form)
+      forms->push_back(*form);
   }
 }
 
@@ -605,53 +568,34 @@
     return;
   }
 
-  __weak PasswordController* weakSelf = self;
   id extractSubmittedFormCompletionHandler = ^(NSString* jsonString) {
-    autofill::PasswordForm form;
-    BOOL found = [weakSelf getPasswordForm:&form
-                      fromPasswordFormJSON:jsonString
-                                   pageURL:pageURL];
-    completionHandler(found, form);
+    std::unique_ptr<base::Value> formValue = autofill::ParseJson(jsonString);
+    if (!formValue) {
+      completionHandler(NO, PasswordForm());
+      return;
+    }
+
+    FormData formData;
+    if (!autofill::ExtractFormData(*formValue, false, base::string16(), pageURL,
+                                   &formData)) {
+      completionHandler(NO, PasswordForm());
+      return;
+    }
+
+    std::unique_ptr<PasswordForm> form =
+        formParser_.Parse(formData, FormParsingMode::SAVING);
+    if (!form) {
+      completionHandler(NO, PasswordForm());
+      return;
+    }
+
+    completionHandler(YES, *form);
   };
 
   [passwordJsManager_ extractForm:base::SysUTF8ToNSString(formName)
                 completionHandler:extractSubmittedFormCompletionHandler];
 }
 
-- (BOOL)getPasswordForm:(autofill::PasswordForm*)form
-    fromPasswordFormJSON:(NSString*)JSONNSString
-                 pageURL:(const GURL&)pageURL {
-  DCHECK(form);
-  // There is no identifiable password form on the page.
-  if ([JSONNSString isEqualToString:@"noPasswordsFound"])
-    return NO;
-
-  int errorCode = 0;
-  std::string errorMessage;
-  std::string JSONString = base::SysNSStringToUTF8(JSONNSString);
-  std::unique_ptr<const base::Value> JSONData(
-      base::JSONReader::ReadAndReturnError(JSONString, false, &errorCode,
-                                           &errorMessage));
-
-  // If the the JSON string contains null, there is no identifiable password
-  // form on the page.
-  if (!errorCode && !JSONData) {
-    return NO;
-  }
-
-  if (errorCode || !JSONData->is_dict()) {
-    VLOG(1) << "JSON parse error " << errorMessage
-            << " JSON string: " << JSONString;
-    return NO;
-  }
-
-  const base::DictionaryValue* passwordJsonData;
-  return JSONData->GetAsDictionary(&passwordJsonData) &&
-         [self getPasswordForm:form
-                fromDictionary:passwordJsonData
-                       pageURL:pageURL];
-}
-
 - (void)didFinishPasswordFormExtraction:
     (const std::vector<autofill::PasswordForm>&)forms {
   // Do nothing if |self| has been detached.
@@ -839,119 +783,6 @@
 #pragma mark -
 #pragma mark WebPasswordFormData Adaptation
 
-- (BOOL)getPasswordForm:(autofill::PasswordForm*)form
-         fromDictionary:(const base::DictionaryValue*)dictionary
-                pageURL:(const GURL&)pageLocation {
-  DCHECK(form);
-  DCHECK(dictionary);
-  DCHECK(pageLocation.is_valid());
-
-  base::string16 formOrigin;
-  if (!(dictionary->GetString("origin", &formOrigin)) ||
-      (GURL(formOrigin).GetOrigin() != pageLocation.GetOrigin())) {
-    return NO;
-  }
-
-  std::string origin = pageLocation.spec();
-  GURL originUrl(origin);
-  if (!originUrl.is_valid()) {
-    return NO;
-  }
-  form->origin = stripURL(originUrl);
-  url::Replacements<char> remove_path;
-  remove_path.ClearPath();
-  form->signon_realm = form->origin.ReplaceComponents(remove_path).spec();
-
-  std::string action;
-  dictionary->GetString("action", &action);
-  form->action = GURL(action);
-
-  if (!dictionary->GetString("usernameElement", &form->username_element) ||
-      !dictionary->GetString("usernameValue", &form->username_value) ||
-      !dictionary->GetString("name", &form->form_data.name)) {
-    return NO;
-  }
-
-  const base::ListValue* passwordDataList;
-  if (!dictionary->GetList("passwords", &passwordDataList))
-    return NO;
-
-  size_t passwordCount = passwordDataList->GetSize();
-  if (passwordCount == 0)
-    return NO;
-
-  const base::DictionaryValue* passwordData;
-
-  // The "passwords" list contains element/value pairs for
-  // password inputs found in the form.  We recognize
-  // up to three passwords in any given form and ignore the rest.
-  const size_t kMaxPasswordsConsidered = 3;
-  base::string16 elements[kMaxPasswordsConsidered];
-  base::string16 values[kMaxPasswordsConsidered];
-
-  for (size_t i = 0; i < std::min(passwordCount, kMaxPasswordsConsidered);
-       ++i) {
-    if (!passwordDataList->GetDictionary(i, &passwordData) ||
-        !passwordData->GetString("element", &elements[i]) ||
-        !passwordData->GetString("value", &values[i])) {
-      return NO;
-    }
-  }
-
-  // Determine which password is the main one, and which is
-  // an old password (e.g on a "make new password" form), if any.
-  // TODO(crbug.com/564578): Make this compatible with other platforms.
-  switch (passwordCount) {
-    case 1:
-      form->password_element = elements[0];
-      form->password_value = values[0];
-      break;
-    case 2: {
-      if (!values[0].empty() && values[0] == values[1]) {
-        // Treat two identical passwords as a single password new password, with
-        // confirmation. This can be either be a sign-up form or a password
-        // change form that does not ask for a new password.
-        form->new_password_element = elements[0];
-        form->new_password_value = values[0];
-      } else {
-        // Assume first is old password, second is new (no choice but to guess).
-        form->password_element = elements[0];
-        form->password_value = values[0];
-        form->new_password_element = elements[1];
-        form->new_password_value = values[1];
-      }
-      break;
-      default:
-        if (!values[0].empty() && values[0] == values[1] &&
-            values[0] == values[2]) {
-          // All three passwords the same? This does not make sense, do not
-          // add the password element.
-          break;
-        } else if (values[0] == values[1]) {
-          // First two the same and the third different implies that the old
-          // password is the duplicated one.
-          form->password_element = elements[0];
-          form->password_value = values[0];
-          form->new_password_element = elements[2];
-          form->new_password_value = values[2];
-        } else if (values[1] == values[2]) {
-          // Two the same and one different -> new password is the duplicated
-          // one.
-          form->password_element = elements[0];
-          form->password_value = values[0];
-          form->new_password_element = elements[1];
-          form->new_password_value = values[1];
-        } else {
-          // Three different passwords, or first and last match with middle
-          // different. No idea which is which, so no luck.
-        }
-        break;
-    }
-  }
-
-  return YES;
-}
-
 - (void)fillPasswordForm:(const autofill::PasswordFormFillData&)formData
             withUsername:(const base::string16&)username
                 password:(const base::string16&)password
@@ -1024,12 +855,21 @@
   GURL pageURL;
   if (!GetPageURLAndCheckTrustLevel(webState_, &pageURL))
     return NO;
-  autofill::PasswordForm form;
-  BOOL formParsedFromJSON =
-      [self getPasswordForm:&form fromDictionary:&JSONCommand pageURL:pageURL];
-  if (formParsedFromJSON && ![self isWebStateDestroyed]) {
+
+  FormData formData;
+  if (!autofill::ExtractFormData(JSONCommand, false, base::string16(), pageURL,
+                                 &formData)) {
+    return NO;
+  }
+
+  std::unique_ptr<PasswordForm> form =
+      formParser_.Parse(formData, FormParsingMode::SAVING);
+  if (!form)
+    return NO;
+
+  if (![self isWebStateDestroyed]) {
     self.passwordManager->OnPasswordFormSubmitted(self.passwordManagerDriver,
-                                                  form);
+                                                  *form);
     return YES;
   }
 
diff --git a/ios/chrome/browser/passwords/password_controller_js_unittest.mm b/ios/chrome/browser/passwords/password_controller_js_unittest.mm
index 5cde324..600c3bc 100644
--- a/ios/chrome/browser/passwords/password_controller_js_unittest.mm
+++ b/ios/chrome/browser/passwords/password_controller_js_unittest.mm
@@ -143,15 +143,16 @@
   const std::string base_url = BaseUrl();
   NSString* result = [NSString
       stringWithFormat:
-          @"[{\"action\":\"https://chromium.test/generic_submit\","
-           "\"name\":\"login_form\","
-           "\"origin\":\"%s\","
-           "\"fields\":[{\"element\":\"name\",\"type\":\"text\"},"
-           "{\"element\":\"password\",\"type\":\"password\"},"
-           "{\"element\":\"gChrome~field~2\",\"type\":\"submit\"}],"
-           "\"usernameElement\":\"name\","
-           "\"usernameValue\":\"\","
-           "\"passwords\":[{\"element\":\"password\",\"value\":\"\"}]}]",
+          @"[{\"name\":\"login_form\",\"origin\":\"%s\",\"action\":\"https://"
+          @"chromium.test/"
+          @"generic_submit\",\"fields\":[{\"identifier\":\"name\",\"name\":"
+          @"\"name\",\"form_control_type\":\"text\",\"should_autocomplete\":"
+          @"true,\"is_focusable\":true,\"max_length\":524288,\"is_checkable\":"
+          @"false,\"value\":\"\",\"label\":\"Name:\"},{\"identifier\":"
+          @"\"password\",\"name\":\"password\",\"form_control_type\":"
+          @"\"password\",\"should_autocomplete\":true,\"is_focusable\":true,"
+          @"\"max_length\":524288,\"is_checkable\":false,\"value\":\"\","
+          @"\"label\":\"Password:\"}]}]",
           base_url.c_str()];
   EXPECT_NSEQ(result,
               ExecuteJavaScriptWithFormat(@"__gCrWeb.findPasswordForms()"));
@@ -177,25 +178,26 @@
   const std::string base_url = BaseUrl();
   NSString* result = [NSString
       stringWithFormat:
-          @"[{\"action\":\"https://chromium.test/generic_submit\","
-           "\"name\":\"login_form1\","
-           "\"origin\":\"%s\","
-           "\"fields\":[{\"element\":\"name\",\"type\":\"text\"},"
-           "{\"element\":\"password\",\"type\":\"password\"},"
-           "{\"element\":\"gChrome~field~2\",\"type\":\"submit\"}],"
-           "\"usernameElement\":\"name\","
-           "\"usernameValue\":\"\","
-           "\"passwords\":[{\"element\":\"password\",\"value\":\"\"}]},"
-           "{\"action\":\"https://chromium.test/generic_s2\","
-           "\"name\":\"login_form2\","
-           "\"origin\":\"%s\","
-           "\"fields\":[{\"element\":\"name2\",\"type\":\"text\"},"
-           "{\"element\":\"password2\",\"type\":\"password\"},"
-           "{\"element\":\"gChrome~field~2\",\"type\":\"submit\"}],"
-           "\"usernameElement\":\"name2\","
-           "\"usernameValue\":\"\","
-           "\"passwords\":[{\"element\":\"password2\",\"value\":\"\"}]}]",
+          @"[{\"name\":\"login_form1\",\"origin\":\"%s\",\"action\":\"%s"
+          @"generic_submit\",\"fields\":[{\"identifier\":\"name\",\"name\":"
+          @"\"name\",\"form_control_type\":\"text\",\"should_autocomplete\":"
+          @"true,\"is_focusable\":true,\"max_length\":524288,\"is_checkable\":"
+          @"false,\"value\":\"\",\"label\":\"Name:\"},{\"identifier\":"
+          @"\"password\",\"name\":\"password\",\"form_control_type\":"
+          @"\"password\",\"should_autocomplete\":true,\"is_focusable\":true,"
+          @"\"max_length\":524288,\"is_checkable\":false,\"value\":\"\","
+          @"\"label\":\"Password:\"}]},{\"name\":\"login_form2\",\"origin\":"
+          @"\"https://chromium.test/\",\"action\":\"https://chromium.test/"
+          @"generic_s2\",\"fields\":[{\"identifier\":\"name2\",\"name\":"
+          @"\"name2\",\"form_control_type\":\"text\",\"should_autocomplete\":"
+          @"true,\"is_focusable\":true,\"max_length\":524288,\"is_checkable\":"
+          @"false,\"value\":\"\",\"label\":\"Name:\"},{\"identifier\":"
+          @"\"password2\",\"name\":\"password2\",\"form_control_type\":"
+          @"\"password\",\"should_autocomplete\":true,\"is_focusable\":true,"
+          @"\"max_length\":524288,\"is_checkable\":false,\"value\":\"\","
+          @"\"label\":\"Password:\"}]}]",
           base_url.c_str(), base_url.c_str()];
+
   EXPECT_NSEQ(result,
               ExecuteJavaScriptWithFormat(@"__gCrWeb.findPasswordForms()"));
 };
@@ -213,18 +215,19 @@
 
   const std::string base_url = BaseUrl();
   NSString* parameter = @"window.document.getElementsByTagName('form')[0]";
+
   NSString* result = [NSString
       stringWithFormat:
-          @"{\"action\":\"https://chromium.test/generic_submit\","
-           "\"name\":\"np\","
-           "\"origin\":\"%s\","
-           "\"fields\":[{\"element\":\"name\",\"type\":\"text\"},"
-           "{\"element\":\"password\",\"type\":\"password\"},"
-           "{\"element\":\"gChrome~field~2\",\"type\":\"submit\"}],"
-           "\"usernameElement\":\"name\","
-           "\"usernameValue\":\"\","
-           "\"passwords\":[{\"element\":\"password\",\"value\":\"\"}]}",
-          base_url.c_str()];
+          @"{\"name\":\"np\",\"origin\":\"%s\",\"action\":\"%sgeneric_submit\","
+          @"\"fields\":[{\"identifier\":\"name\",\"name\":\"name\",\"form_"
+          @"control_type\":\"text\",\"should_autocomplete\":true,\"is_"
+          @"focusable\":true,\"max_length\":524288,\"is_checkable\":false,"
+          @"\"value\":\"\",\"label\":\"Name:\"},{\"identifier\":\"password\","
+          @"\"name\":\"password\",\"form_control_type\":\"password\",\"should_"
+          @"autocomplete\":true,\"is_focusable\":true,\"max_length\":524288,"
+          @"\"is_checkable\":false,\"value\":\"\",\"label\":\"Password:\"}]}",
+          base_url.c_str(), base_url.c_str()];
+
   EXPECT_NSEQ(
       result,
       ExecuteJavaScriptWithFormat(
@@ -246,16 +249,15 @@
   const std::string base_url = BaseUrl();
   NSString* result = [NSString
       stringWithFormat:
-          @"[{\"action\":\"https://chromium.test/\","
-           "\"name\":\"login_form\","
-           "\"origin\":\"%s\","
-           "\"fields\":[{\"element\":\"name\",\"type\":\"text\"},"
-           "{\"element\":\"password\",\"type\":\"password\"},"
-           "{\"element\":\"gChrome~field~2\",\"type\":\"submit\"}],"
-           "\"usernameElement\":\"name\","
-           "\"usernameValue\":\"\","
-           "\"passwords\":[{\"element\":\"password\",\"value\":\"\"}]}]",
-          base_url.c_str()];
+          @"[{\"name\":\"login_form\",\"origin\":\"%s\",\"action\":\"%s\","
+          @"\"fields\":[{\"identifier\":\"name\",\"name\":\"name\",\"form_"
+          @"control_type\":\"text\",\"should_autocomplete\":true,\"is_"
+          @"focusable\":true,\"max_length\":524288,\"is_checkable\":false,"
+          @"\"value\":\"\",\"label\":\"Name:\"},{\"identifier\":\"password\","
+          @"\"name\":\"password\",\"form_control_type\":\"password\",\"should_"
+          @"autocomplete\":true,\"is_focusable\":true,\"max_length\":524288,"
+          @"\"is_checkable\":false,\"value\":\"\",\"label\":\"Password:\"}]}]",
+          base_url.c_str(), base_url.c_str()];
   EXPECT_NSEQ(result,
               ExecuteJavaScriptWithFormat(@"__gCrWeb.findPasswordForms()"));
 };
@@ -298,16 +300,17 @@
 
   NSString* expected_command = [NSString
       stringWithFormat:
-          @"{\"action\":\"%s\","
-           "\"name\":\"login_form\","
-           "\"origin\":\"%s\","
-           "\"fields\":[{\"element\":\"username\",\"type\":\"text\"},"
-           "{\"element\":\"password\",\"type\":\"password\"}],"
-           "\"usernameElement\":\"username\","
-           "\"usernameValue\":\"user1\","
-           "\"passwords\":[{\"element\":\"password\",\"value\":\"password1\"}],"
-           "\"command\":\"passwordForm.submitButtonClick\"}",
-          BaseUrl().c_str(), BaseUrl().c_str()];
+          @"{\"name\":\"login_form\",\"origin\":\"https://chromium.test/"
+          @"\",\"action\":\"%s\",\"fields\":[{\"identifier\":\"username\","
+          @"\"name\":\"username\",\"form_control_type\":\"text\",\"should_"
+          @"autocomplete\":true,\"is_focusable\":true,\"max_length\":524288,"
+          @"\"is_checkable\":false,\"value\":\"user1\",\"label\":\"Name:\"},{"
+          @"\"identifier\":\"password\",\"name\":\"password\",\"form_control_"
+          @"type\":\"password\",\"should_autocomplete\":true,\"is_focusable\":"
+          @"true,\"max_length\":524288,\"is_checkable\":false,\"value\":"
+          @"\"password1\",\"label\":\"Password:\"}],\"command\":\"passwordForm."
+          @"submitButtonClick\"}",
+          BaseUrl().c_str()];
 
   // Check that invokeOnHost was called with the correct argument.
   EXPECT_NSEQ(
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm
index 67cd8c2..e21bcf4e 100644
--- a/ios/chrome/browser/passwords/password_controller_unittest.mm
+++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -287,217 +287,6 @@
   MockPasswordManagerClient* weak_client_;
 };
 
-struct PasswordFormTestData {
-  const char* const page_location;
-  const char* const json_string;
-  const char* const expected_origin;
-  const char* const expected_action;
-  const char* const expected_username_element;
-  const char* const expected_username_value;
-  const char* const expected_new_password_element;
-  const char* const expected_new_password_value;
-  const char* const expected_old_password_element;
-  const char* const expected_old_password_value;
-};
-
-// Check that given a serialization of a PasswordForm, the controller is able
-// to create the corresponding PasswordForm object.
-TEST_F(PasswordControllerTest, PopulatePasswordFormWithDictionary) {
-  // clang-format off
-  PasswordFormTestData test_data[] = {
-    // One username element, one password element.  URLs contain extra
-    // parts: username/password, query, reference, which are all expected
-    // to be stripped off. The password is recognized as an old password.
-    {
-      "http://john:doe@fakedomain.com/foo/bar?baz=quz#foobar",
-      "{ \"action\": \"http://fakedomain.com/foo/some/action\","
-          "\"usernameElement\": \"account\","
-          "\"usernameValue\": \"fakeaccount\","
-          "\"name\": \"signup\","
-          "\"origin\": \"http://john:doe@fakedomain.com/foo/bar\","
-          "\"passwords\": ["
-              "{ \"element\": \"secret\"," "\"value\": \"fakesecret\" },"
-          "]}",
-      "http://fakedomain.com/foo/bar",
-      "http://fakedomain.com/foo/some/action",
-      "account",
-      "fakeaccount",
-      "",
-      "",
-      "secret",
-      "fakesecret",
-    },
-    // One username element, one password element. Population should fail
-    // due to an origin mismatch.
-    {
-      "http://john:doe@fakedomain.com/foo/bar?baz=quz#foobar",
-      "{ \"action\": \"\","
-          "\"usernameElement\": \"account\","
-          "\"usernameValue\": \"fakeaccount\","
-          "\"name\": \"signup\","
-          "\"origin\": \"http://john:doe@realdomainipromise.com/foo/bar\","
-          "\"passwords\": ["
-              "{ \"element\": \"secret\"," "\"value\": \"fakesecret\" },"
-          "]}",
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-    },
-    // One username element, two password elements.  Since both password
-    // values are the same, we are assuming that the webpage asked the user
-    // to enter the password twice for confirmation.
-    {
-      "http://fakedomain.com/foo",
-      "{ \"action\": \"http://anotherdomain.com/some_action\","
-          "\"usernameElement\": \"account\","
-          "\"usernameValue\": \"fakeaccount\","
-          "\"name\": \"signup\","
-          "\"origin\": \"http://fakedomain.com/foo\","
-          "\"passwords\": ["
-              "{ \"element\": \"secret\"," "\"value\": \"fakesecret\" },"
-              "{ \"element\": \"confirm\"," "\"value\": \"fakesecret\" },"
-          "]}",
-      "http://fakedomain.com/foo",
-      "http://anotherdomain.com/some_action",
-      "account",
-      "fakeaccount",
-      "secret",
-      "fakesecret",
-      "",
-      "",
-    },
-    // One username element, two password elements.  The password
-    // values are different, so we are assuming that the webpage asked the user
-    // to enter the old password and new password.
-    {
-      "http://fakedomain.com/foo",
-      "{ \"action\": \"http://fakedomain.com/foo\","
-          "\"usernameElement\": \"account\","
-          "\"usernameValue\": \"fakeaccount\","
-          "\"name\": \"signup\","
-          "\"origin\": \"http://fakedomain.com/foo\","
-          "\"passwords\": ["
-              "{ \"element\": \"old\"," "\"value\": \"oldsecret\" },"
-              "{ \"element\": \"new\"," "\"value\": \"newsecret\" },"
-          "]}",
-      "http://fakedomain.com/foo",
-      "http://fakedomain.com/foo",
-      "account",
-      "fakeaccount",
-      "new",
-      "newsecret",
-      "old",
-      "oldsecret",
-    },
-    // One username element, three password elements.  All passwords
-    // are the same. Password population should fail because this configuration
-    // does not make sense.
-    {
-      "http://fakedomain.com",
-      "{ \"action\": \"http://fakedomain.com/\","
-          "\"usernameElement\": \"account\","
-          "\"usernameValue\": \"fakeaccount\","
-          "\"name\": \"signup\","
-          "\"origin\": \"http://fakedomain.com/foo\","
-          "\"passwords\": ["
-              "{ \"element\": \"pass1\"," "\"value\": \"word\" },"
-              "{ \"element\": \"pass2\"," "\"value\": \"word\" },"
-              "{ \"element\": \"pass3\"," "\"value\": \"word\" },"
-          "]}",
-      "http://fakedomain.com/",
-      "http://fakedomain.com/",
-      "account",
-      "fakeaccount",
-      "",
-      "",
-      "",
-      "",
-    },
-    // One username element, three password elements.  Two passwords are
-    // the same followed by a different one.  Assuming that the duplicated
-    // password is the old one.
-    {
-      "http://fakedomain.com",
-      "{ \"action\": \"http://fakedomain.com/\","
-          "\"usernameElement\": \"account\","
-          "\"usernameValue\": \"fakeaccount\","
-          "\"name\": \"signup\","
-          "\"origin\": \"http://fakedomain.com/foo\","
-          "\"passwords\": ["
-              "{ \"element\": \"pass1\"," "\"value\": \"word1\" },"
-              "{ \"element\": \"pass2\"," "\"value\": \"word1\" },"
-              "{ \"element\": \"pass3\"," "\"value\": \"word3\" },"
-          "]}",
-      "http://fakedomain.com/",
-      "http://fakedomain.com/",
-      "account",
-      "fakeaccount",
-      "pass3",
-      "word3",
-      "pass1",
-      "word1",
-    },
-    // One username element, three password elements.  A password is
-    // follwed by two duplicate ones.  Assuming that the duplicated
-    // password is the new one.
-    {
-      "http://fakedomain.com",
-      "{ \"action\": \"http://fakedomain.com/\","
-          "\"usernameElement\": \"account\","
-          "\"usernameValue\": \"fakeaccount\","
-          "\"name\": \"signup\","
-          "\"origin\": \"http://fakedomain.com/foo\","
-          "\"passwords\": ["
-              "{ \"element\": \"pass1\"," "\"value\": \"word1\" },"
-              "{ \"element\": \"pass2\"," "\"value\": \"word2\" },"
-              "{ \"element\": \"pass3\"," "\"value\": \"word2\" },"
-          "]}",
-      "http://fakedomain.com/",
-      "http://fakedomain.com/",
-      "account",
-      "fakeaccount",
-      "pass2",
-      "word2",
-      "pass1",
-      "word1",
-    },
-  };
-  // clang-format on
-
-  for (const PasswordFormTestData& data : test_data) {
-    SCOPED_TRACE(testing::Message()
-                 << "for page_location=" << data.page_location
-                 << " and json_string=" << data.json_string);
-    std::unique_ptr<base::Value> json_data(
-        base::JSONReader::Read(data.json_string, true));
-    const base::DictionaryValue* json_dict = nullptr;
-    ASSERT_TRUE(json_data->GetAsDictionary(&json_dict));
-    PasswordForm form;
-    [passwordController_ getPasswordForm:&form
-                          fromDictionary:json_dict
-                                 pageURL:GURL(data.page_location)];
-    EXPECT_STREQ(data.expected_origin, form.origin.spec().c_str());
-    EXPECT_STREQ(data.expected_action, form.action.spec().c_str());
-    EXPECT_EQ(base::ASCIIToUTF16(data.expected_username_element),
-              form.username_element);
-    EXPECT_EQ(base::ASCIIToUTF16(data.expected_username_value),
-              form.username_value);
-    EXPECT_EQ(base::ASCIIToUTF16(data.expected_new_password_element),
-              form.new_password_element);
-    EXPECT_EQ(base::ASCIIToUTF16(data.expected_new_password_value),
-              form.new_password_value);
-    EXPECT_EQ(base::ASCIIToUTF16(data.expected_old_password_element),
-              form.password_element);
-    EXPECT_EQ(base::ASCIIToUTF16(data.expected_old_password_value),
-              form.password_value);
-  }
-};
-
 struct FindPasswordFormTestData {
   NSString* html_string;
   const bool expected_form_found;
@@ -548,7 +337,7 @@
           "<input type='text' name='user4' disabled='disabled'>"
           "<input type='password' name='pass4'>"
           "</form>",
-      true, "", "pass4"
+      true, "user4", "pass4"
     },
     // Username element has autocomplete='off'.
     {
@@ -566,29 +355,21 @@
           "</form>",
       false, nullptr, nullptr
     },
-    // Disabled password element.
-    {
-      @"<form>"
-          "<input type='text' name='user7'>"
-          "<input type='password' name='pass7' disabled='disabled'>"
-          "</form>",
-      false, nullptr, nullptr
-    },
     // Password element has autocomplete='off'.
     {
       @"<form>"
-          "<input type='text' name='user8'>"
-          "<input type='password' name='pass8' AUTOCOMPLETE='OFF'>"
+          "<input type='text' name='user7'>"
+          "<input type='password' name='pass7' AUTOCOMPLETE='OFF'>"
           "</form>",
-      true, "user8", "pass8"
+      true, "user7", "pass7"
     },
     // Form element has autocomplete='off'.
     {
       @"<form autocomplete='off'>"
-          "<input type='text' name='user9'>"
-          "<input type='password' name='pass9'>"
+          "<input type='text' name='user8'>"
+          "<input type='password' name='pass8'>"
           "</form>",
-      true, "user9", "pass9"
+      true, "user8", "pass8"
     },
   };
   // clang-format on
@@ -636,12 +417,12 @@
     // Two forms with no explicit names.
     {
       @"<form action='javascript:;'>"
-          "<input type='text' name='user1'>"
-          "<input type='password' name='pass1'>"
+          "<input type='text' name='user1' value='user1'>"
+          "<input type='password' name='pass1' value='pw1'>"
           "</form>"
           "<form action='javascript:;'>"
-          "<input type='text' name='user2'>"
-          "<input type='password' name='pass2'>"
+          "<input type='text' name='user2' value='user2'>"
+          "<input type='password' name='pass2' value='pw2'>"
           "<input type='submit' id='s2'>"
           "</form>",
       @"document.getElementById('s2').click()",
@@ -650,13 +431,13 @@
     // Two forms with explicit names.
     {
       @"<form name='test2a' action='javascript:;'>"
-          "<input type='text' name='user1'>"
-          "<input type='password' name='pass1'>"
+          "<input type='text' name='user1' value='user1'>"
+          "<input type='password' name='pass1' value='pw1'>"
           "<input type='submit' id='s1'>"
           "</form>"
-          "<form name='test2b' action='javascript:;'>"
+          "<form name='test2b' action='javascript:;' value='user2'>"
           "<input type='text' name='user2'>"
-          "<input type='password' name='pass2'>"
+          "<input type='password' name='pass2' value='pw2'>"
           "</form>",
       @"document.getElementById('s1').click()",
       0, true, "user1"
@@ -664,8 +445,8 @@
     // No password forms.
     {
       @"<form action='javascript:;'>"
-          "<input type='text' name='user1'>"
-          "<input type='text' name='pass1'>"
+          "<input type='text' name='user1' value='user1'>"
+          "<input type='text' name='pass1' value='text1'>"
           "<input type='submit' id='s1'>"
           "</form>",
       @"document.getElementById('s1').click()",
@@ -674,8 +455,8 @@
     // Form with quotes in the form and field names.
     {
       @"<form name=\"foo'\" action='javascript:;'>"
-          "<input type='text' name=\"user1'\">"
-          "<input type='password' id='s1' name=\"pass1'\">"
+          "<input type='text' name=\"user1'\" value='user1'>"
+          "<input type='password' id='s1' name=\"pass1'\" value='pw2'>"
           "</form>",
       @"document.getElementById('s1').click()",
       0, true, "user1'"
@@ -1337,64 +1118,6 @@
   }
 }
 
-// Tests with invalid inputs.
-TEST_F(PasswordControllerTest, CheckIncorrectData) {
-  // clang-format off
-  std::string invalid_data[] = {
-    "{}",
-
-    "{  \"usernameValue\": \"fakeaccount\","
-       "\"passwords\": ["
-         "{ \"element\": \"secret\"," "\"value\": \"fakesecret\" },"
-       "]}",
-
-    "{  \"usernameElement\": \"account\","
-       "\"passwords\": ["
-         "{ \"element\": \"secret\"," "\"value\": \"fakesecret\" },"
-       "]}",
-
-    "{  \"usernameElement\": \"account\","
-       "\"usernameValue\": \"fakeaccount\","
-    "}",
-
-    "{  \"usernameElement\": \"account\","
-       "\"usernameValue\": \"fakeaccount\","
-       "\"passwords\": {},"
-    "}",
-
-    "{  \"usernameElement\": \"account\","
-       "\"usernameValue\": \"fakeaccount\","
-       "\"passwords\": ["
-       "]}",
-
-    "{  \"usernameElement\": \"account\","
-       "\"usernameValue\": \"fakeaccount\","
-       "\"passwords\": ["
-         "{ \"value\": \"fakesecret\" },"
-       "]}",
-
-    "{  \"usernameElement\": \"account\","
-       "\"usernameValue\": \"fakeaccount\","
-       "\"passwords\": ["
-         "{ \"element\": \"secret\" },"
-       "]}",
-  };
-  // clang-format on
-
-  for (const std::string& data : invalid_data) {
-    SCOPED_TRACE(testing::Message() << "for data=" << data);
-    std::unique_ptr<base::Value> json_data(base::JSONReader::Read(data, true));
-    const base::DictionaryValue* json_dict = nullptr;
-    ASSERT_TRUE(json_data->GetAsDictionary(&json_dict));
-    PasswordForm form;
-    BOOL res =
-        [passwordController_ getPasswordForm:&form
-                              fromDictionary:json_dict
-                                     pageURL:GURL("https://www.foo.com/")];
-    EXPECT_FALSE(res);
-  }
-}
-
 using PasswordControllerTestSimple = PlatformTest;
 
 // The test case below does not need the heavy fixture from above, but it
diff --git a/ios/chrome/browser/passwords/resources/password_controller.js b/ios/chrome/browser/passwords/resources/password_controller.js
index 1ccae2f1..6cb85d1 100644
--- a/ios/chrome/browser/passwords/resources/password_controller.js
+++ b/ios/chrome/browser/passwords/resources/password_controller.js
@@ -75,19 +75,6 @@
   };
 
   /**
-   * Returns a canonical action for |formElement|. It works the same as upstream
-   * function GetCanonicalActionForForm.
-   * @param {HTMLFormElement} formElement
-   * @return {string} Canonical action.
-   */
-  var getCanonicalActionForForm_ = function(formElement) {
-    var raw_action = formElement.getAttribute('action') || '';
-    var absolute_url =
-        __gCrWeb.common.absoluteURL(formElement.ownerDocument, raw_action);
-    return __gCrWeb.common.removeQueryAndReferenceFromURL(absolute_url);
-  };
-
-  /**
    * If |form| has no submit elements and exactly 1 button that button
    * is assumed to be a submit button. This function adds onSubmitButtonClick_
    * as a handler for touchend event of this button. Touchend event is used as
@@ -174,9 +161,9 @@
    */
   __gCrWeb['getPasswordFormDataAsString'] = function(identifier) {
     var el = getPasswordFormElement_(window, identifier);
-    if (!el) return 'noPasswordsFound';
+    if (!el) return '{}';
     var formData = __gCrWeb.getPasswordFormData(el);
-    if (!formData) return 'noPasswordsFound';
+    if (!formData) return '{}';
     return __gCrWeb.stringify(formData);
   };
 
@@ -187,10 +174,7 @@
    * This is a public function invoked by Chrome. There is no information
    * passed to this function that the page does not have access to anyway.
    *
-   * @param {!Object.<string, *>} formData Dictionary of parameters,
-   *    including:
-   *      'action': <string> The form action URL;
-   *      'fields': {Array.{Object.<string, string>}} Field name/value pairs;
+   * @param {AutofillFormData} formData Form data.
    * @param {string} username The username to fill.
    * @param {string} password The password to fill.
    * @param {string=} opt_normalizedOrigin The origin URL to compare to.
@@ -213,7 +197,7 @@
    * finds that form on the page and fills in the specified username
    * and password.
    *
-   * @param {Object} formData Form data.
+   * @param {AutofillFormData} formData Form data.
    * @param {string} username The username to fill.
    * @param {string} password The password to fill.
    * @param {Window} win A window or a frame containing formData.
@@ -228,10 +212,9 @@
 
     for (var i = 0; i < forms.length; i++) {
       var form = forms[i];
-      var normalizedFormAction =
-          opt_normalizedOrigin || getCanonicalActionForForm_(form);
+      var normalizedFormAction = opt_normalizedOrigin ||
+          __gCrWeb.fill.getCanonicalActionForForm(form);
       if (formData.action != normalizedFormAction) continue;
-
       var inputs = getFormInputElements_(form);
       var usernameInput =
           findInputByFieldIdentifier_(inputs, formData.fields[0].name);
@@ -309,54 +292,11 @@
    * @return {Object} Object of data from formElement.
    */
   __gCrWeb.getPasswordFormData = function(formElement) {
-    var inputs = getFormInputElements_(formElement);
-
-    var fields = [];
-    var passwords = [];
-    var firstPasswordIndex = 0;
-    for (var j = 0; j < inputs.length; j++) {
-      var input = inputs[j];
-
-      fields.push({
-        'element': __gCrWeb.form.getFieldIdentifier(input),
-        'type': input.type
-      });
-
-      if (!input.disabled && input.type == 'password') {
-        if (passwords.length == 0) {
-          firstPasswordIndex = j;
-        }
-        passwords.push({
-          'element': __gCrWeb.form.getFieldIdentifier(input),
-          'value': input.value
-        });
-      }
-    }
-
-    if (passwords.length == 0) return null;
-
-    var usernameElement = '';
-    var usernameValue = '';
-    for (var j = firstPasswordIndex - 1; j >= 0; j--) {
-      var input = inputs[j];
-      if (!input.disabled && __gCrWeb.common.isTextField(input)) {
-        usernameElement = __gCrWeb.form.getFieldIdentifier(input);
-        usernameValue = input.value;
-        break;
-      }
-    }
-
-    var origin = __gCrWeb.common.removeQueryAndReferenceFromURL(
-        formElement.ownerDocument.location.href);
-
-    return {
-      'action': getCanonicalActionForForm_(formElement),
-      'name': __gCrWeb.form.getFormIdentifier(formElement),
-      'origin': origin,
-      'fields': fields,
-      'usernameElement': usernameElement,
-      'usernameValue': usernameValue,
-      'passwords': passwords
-    };
+      var extractMask = __gCrWeb.fill.EXTRACT_MASK_VALUE;
+      var formData = {}
+      var ok = __gCrWeb.fill.webFormElementToFormData(
+        window, formElement,  null /* formControlElement */,
+        extractMask, formData, null /* field */);
+      return ok ? formData : null;
   };
 }
diff --git a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.h b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.h
index 7f75480..e6533e1 100644
--- a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.h
+++ b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.h
@@ -31,7 +31,7 @@
   sessions::LiveTabContext* FindLiveTabContextForTab(
       const sessions::LiveTab* tab) override;
   sessions::LiveTabContext* FindLiveTabContextWithID(
-      SessionID::id_type desired_id) override;
+      SessionID desired_id) override;
   bool ShouldTrackURLForRestore(const GURL& url) override;
   std::string GetExtensionAppIDForTab(sessions::LiveTab* tab) override;
   base::FilePath GetPathToSaveTo() override;
diff --git a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm
index 441c308..e0161fbb6 100644
--- a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm
+++ b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm
@@ -98,12 +98,11 @@
 
 sessions::LiveTabContext*
 IOSChromeTabRestoreServiceClient::FindLiveTabContextWithID(
-    SessionID::id_type desired_id) {
+    SessionID desired_id) {
   return FindLiveTabContextWithCondition(base::Bind(
-      [](SessionID::id_type desired_id, TabModel* tab_model) {
+      [](SessionID desired_id, TabModel* tab_model) {
         DCHECK(tab_model.syncedWindowDelegate);
-        return tab_model.syncedWindowDelegate->GetSessionId().id() ==
-               desired_id;
+        return tab_model.syncedWindowDelegate->GetSessionId() == desired_id;
       },
       desired_id));
 }
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn
index dbb73d4d..64252fee7 100644
--- a/ios/chrome/browser/tabs/BUILD.gn
+++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -97,6 +97,7 @@
     "//ios/chrome/browser/history",
     "//ios/chrome/browser/history:tab_helper",
     "//ios/chrome/browser/infobars",
+    "//ios/chrome/browser/itunes_links",
     "//ios/chrome/browser/language",
     "//ios/chrome/browser/metrics",
     "//ios/chrome/browser/metrics:metrics_internal",
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm
index d7ca68d..a0c9ff3 100644
--- a/ios/chrome/browser/tabs/tab_helper_util.mm
+++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -24,6 +24,8 @@
 #include "ios/chrome/browser/history/history_tab_helper.h"
 #include "ios/chrome/browser/history/top_sites_factory.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#include "ios/chrome/browser/itunes_links/itunes_links_flag.h"
+#import "ios/chrome/browser/itunes_links/itunes_links_handler_tab_helper.h"
 #import "ios/chrome/browser/metrics/ukm_url_recorder.h"
 #import "ios/chrome/browser/passwords/password_tab_helper.h"
 #include "ios/chrome/browser/reading_list/reading_list_model_factory.h"
@@ -78,6 +80,9 @@
   BlockedPopupTabHelper::CreateForWebState(web_state);
   FindTabHelper::CreateForWebState(web_state);
   StoreKitTabHelper::CreateForWebState(web_state);
+  if (base::FeatureList::IsEnabled(kITunesLinksStoreKitHandling)) {
+    ITunesLinksHandlerTabHelper::CreateForWebState(web_state);
+  }
   HistoryTabHelper::CreateForWebState(web_state);
   LoadTimingTabHelper::CreateForWebState(web_state);
 
diff --git a/ios/chrome/browser/ui/browser_view_controller_egtest.mm b/ios/chrome/browser/ui/browser_view_controller_egtest.mm
index 6c44333..bb1f87d7 100644
--- a/ios/chrome/browser/ui/browser_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/browser_view_controller_egtest.mm
@@ -36,7 +36,7 @@
 - (void)testJavaScriptInOmnibox {
   // TODO(crbug.com/703855): Keyboard entry inside the omnibox fails only on
   // iPad running iOS 10.
-  if (IsIPadIdiom() && base::ios::IsRunningOnIOS10OrLater())
+  if (IsIPadIdiom())
     return;
 
   // Preps the http server with two URLs serving content.
diff --git a/ios/chrome/browser/ui/download/download_manager_view_controller.mm b/ios/chrome/browser/ui/download/download_manager_view_controller.mm
index 9421039..962d8d6 100644
--- a/ios/chrome/browser/ui/download/download_manager_view_controller.mm
+++ b/ios/chrome/browser/ui/download/download_manager_view_controller.mm
@@ -243,9 +243,8 @@
   [NSLayoutConstraint activateConstraints:@[
     [installDriveIcon.centerYAnchor
         constraintEqualToAnchor:installDriveRow.centerYAnchor],
-    [installDriveIcon.leadingAnchor
-        constraintEqualToAnchor:installDriveRow.layoutMarginsGuide
-                                    .leadingAnchor],
+    [installDriveIcon.centerXAnchor
+        constraintEqualToAnchor:stateIcon.centerXAnchor],
   ]];
 
   // install google drive label constraints.
@@ -254,8 +253,7 @@
     [installDriveLabel.centerYAnchor
         constraintEqualToAnchor:installDriveRow.centerYAnchor],
     [installDriveLabel.leadingAnchor
-        constraintEqualToAnchor:installDriveIcon.trailingAnchor
-                       constant:kElementMargin],
+        constraintEqualToAnchor:statusLabel.leadingAnchor],
     [installDriveLabel.trailingAnchor
         constraintLessThanOrEqualToAnchor:installDriveButton.leadingAnchor
                                  constant:-kElementMargin],
diff --git a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge.png b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge.png
index a05f3d6..ba04732e 100644
--- a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge.png
+++ b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge.png
Binary files differ
diff --git a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@2x.png b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@2x.png
index 60d595b2..34546620 100644
--- a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@2x.png
+++ b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@3x.png b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@3x.png
index 731982e..9fdaaf91 100644
--- a/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@3x.png
+++ b/ios/chrome/browser/ui/download/resources/done_badge.imageset/done_badge@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index 9638855..23ececd 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -58,16 +58,17 @@
     "//ios/chrome/browser/sync",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/collection_view",
-    "//ios/chrome/browser/ui/collection_view/cells",
     "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/context_menu",
     "//ios/chrome/browser/ui/icons",
     "//ios/chrome/browser/ui/keyboard",
+    "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/material_components",
     "//ios/chrome/browser/ui/ntp/recent_tabs/views",
     "//ios/chrome/browser/ui/popup_menu",
     "//ios/chrome/browser/ui/settings",
+    "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
     "//ios/third_party/material_components_ios",
@@ -129,6 +130,7 @@
     "//ios/chrome/browser/sync:test_support",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/collection_view",
+    "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
     "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/ui/history/history_entry_inserter.h b/ios/chrome/browser/ui/history/history_entry_inserter.h
index dd5e7e0..fccc8237 100644
--- a/ios/chrome/browser/ui/history/history_entry_inserter.h
+++ b/ios/chrome/browser/ui/history/history_entry_inserter.h
@@ -7,14 +7,13 @@
 
 #import <Foundation/Foundation.h>
 
-#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
-
 namespace base {
 class Time;
 }
-@class CollectionViewModel;
+@class ListModel;
 @class HistoryEntryInserter;
-@class LegacyHistoryEntryItem;
+@class ListItem;
+@protocol HistoryEntryItemInterface;
 
 // Delegate for HistoryEntryInserter. Provides callbacks for completion of item
 // and section insertion and deletion.
@@ -31,27 +30,26 @@
 @end
 
 // Object for ensuring history entry items are kept in order as they are added
-// to the CollectionViewModel.
+// to the ListModel.
 @interface HistoryEntryInserter : NSObject
 
 // Delegate for the HistoryEntryInserter. Receives callbacks upon item and
 // section insertion and removal.
 @property(nonatomic, weak) id<HistoryEntryInserterDelegate> delegate;
 
-// Designated initializer for HistoryEntryInserter. collectionViewModel is the
+// Designated initializer for HistoryEntryInserter. listModel is the
 // model into which entries are inserted. Sections for history entries are
 // appended to the model. Sections already in the model at initialization
 // of the inserter should not be removed, and sections should not be added
 // except by the inserter. Duplicate entries are not inserted.
-- (instancetype)initWithModel:(CollectionViewModel*)collectionViewModel
-    NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithModel:(ListModel*)listModel NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
 // Inserts a history entry into the model at the correct sorted index path.
 // History entries in the model are sorted from most to least recent, and
 // grouped into section by date. Duplicate entries are not inserted. Invokes
 // delegate callback when insertion is complete.
-- (void)insertHistoryEntryItem:(LegacyHistoryEntryItem*)item;
+- (void)insertHistoryEntryItem:(ListItem<HistoryEntryItemInterface>*)item;
 
 // Returns section identifier for provided timestamp. Adds section for date if
 // not found, and invokes delegate callback.
diff --git a/ios/chrome/browser/ui/history/history_entry_inserter.mm b/ios/chrome/browser/ui/history/history_entry_inserter.mm
index 3f4ce8e0..4b146dc8 100644
--- a/ios/chrome/browser/ui/history/history_entry_inserter.mm
+++ b/ios/chrome/browser/ui/history/history_entry_inserter.mm
@@ -7,10 +7,13 @@
 #include "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/time/time.h"
+#include "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h"
-#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
+#import "ios/chrome/browser/ui/history/history_entry_item_interface.h"
 #include "ios/chrome/browser/ui/history/history_util.h"
 #import "ios/chrome/browser/ui/history/legacy_history_entry_item.h"
+#import "ios/chrome/browser/ui/list_model/list_model.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_text_header_footer_item.h"
 #include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -18,8 +21,8 @@
 #endif
 
 @interface HistoryEntryInserter () {
-  // CollectionViewModel in which to insert history entries.
-  CollectionViewModel* _collectionViewModel;
+  // ListModel in which to insert history entries.
+  ListModel* _listModel;
   // The index of the first section to contain history entries.
   NSInteger _firstSectionIndex;
   // Number of assigned section identifiers.
@@ -35,17 +38,17 @@
 @implementation HistoryEntryInserter
 @synthesize delegate = _delegate;
 
-- (instancetype)initWithModel:(CollectionViewModel*)collectionViewModel {
+- (instancetype)initWithModel:(ListModel*)listModel {
   if ((self = [super init])) {
-    _collectionViewModel = collectionViewModel;
-    _firstSectionIndex = [collectionViewModel numberOfSections];
+    _listModel = listModel;
+    _firstSectionIndex = [listModel numberOfSections];
     _dates = [[NSMutableOrderedSet alloc] init];
     _sectionIdentifiers = [NSMutableDictionary dictionary];
   }
   return self;
 }
 
-- (void)insertHistoryEntryItem:(LegacyHistoryEntryItem*)item {
+- (void)insertHistoryEntryItem:(ListItem<HistoryEntryItemInterface>*)item {
   NSInteger sectionIdentifier =
       [self sectionIdentifierForTimestamp:item.timestamp];
 
@@ -66,8 +69,7 @@
                                               : NSOrderedDescending;
   };
 
-  NSArray* items =
-      [_collectionViewModel itemsInSectionWithIdentifier:sectionIdentifier];
+  NSArray* items = [_listModel itemsInSectionWithIdentifier:sectionIdentifier];
   NSRange range = NSMakeRange(0, [items count]);
   // If the object is not already in the section, insert it.
   if ([items indexOfObject:item
@@ -79,12 +81,12 @@
                               inSortedRange:range
                                     options:NSBinarySearchingInsertionIndex
                             usingComparator:objectComparator];
-    [_collectionViewModel insertItem:item
-             inSectionWithIdentifier:sectionIdentifier
-                             atIndex:index];
+    [_listModel insertItem:item
+        inSectionWithIdentifier:sectionIdentifier
+                        atIndex:index];
     NSIndexPath* indexPath = [NSIndexPath
         indexPathForItem:index
-               inSection:[_collectionViewModel
+               inSection:[_listModel
                              sectionForSectionIdentifier:sectionIdentifier]];
     [self.delegate historyEntryInserter:self
                didInsertItemAtIndexPath:indexPath];
@@ -119,14 +121,22 @@
                            usingComparator:comparator];
   [_dates insertObject:date atIndex:index];
   NSInteger insertionIndex = _firstSectionIndex + index;
-  CollectionViewTextItem* header =
-      [[CollectionViewTextItem alloc] initWithType:kItemTypeEnumZero];
-  header.text =
-      base::SysUTF16ToNSString(history::GetRelativeDateLocalized(timestamp));
-  [_collectionViewModel insertSectionWithIdentifier:sectionIdentifier
-                                            atIndex:insertionIndex];
-  [_collectionViewModel setHeader:header
-         forSectionWithIdentifier:sectionIdentifier];
+  if (experimental_flags::IsCollectionsUIRebootEnabled()) {
+    TableViewTextHeaderFooterItem* header =
+        [[TableViewTextHeaderFooterItem alloc] initWithType:kItemTypeEnumZero];
+    header.text =
+        base::SysUTF16ToNSString(history::GetRelativeDateLocalized(timestamp));
+    [_listModel setHeader:header forSectionWithIdentifier:sectionIdentifier];
+
+  } else {
+    CollectionViewTextItem* header =
+        [[CollectionViewTextItem alloc] initWithType:kItemTypeEnumZero];
+    header.text =
+        base::SysUTF16ToNSString(history::GetRelativeDateLocalized(timestamp));
+    [_listModel setHeader:header forSectionWithIdentifier:sectionIdentifier];
+  }
+  [_listModel insertSectionWithIdentifier:sectionIdentifier
+                                  atIndex:insertionIndex];
   [self.delegate historyEntryInserter:self
               didInsertSectionAtIndex:insertionIndex];
   return sectionIdentifier;
@@ -134,12 +144,11 @@
 
 - (void)removeSection:(NSInteger)sectionIndex {
   NSUInteger sectionIdentifier =
-      [_collectionViewModel sectionIdentifierForSection:sectionIndex];
+      [_listModel sectionIdentifierForSection:sectionIndex];
 
   // Sections should not be removed unless there are no items in that section.
-  DCHECK(![[_collectionViewModel itemsInSectionWithIdentifier:sectionIdentifier]
-      count]);
-  [_collectionViewModel removeSectionWithIdentifier:sectionIdentifier];
+  DCHECK(![[_listModel itemsInSectionWithIdentifier:sectionIdentifier] count]);
+  [_listModel removeSectionWithIdentifier:sectionIdentifier];
 
   NSEnumerator* dateEnumerator = [_sectionIdentifiers keyEnumerator];
   NSDate* date = nil;
diff --git a/ios/chrome/browser/ui/history/history_entry_inserter_unittest.mm b/ios/chrome/browser/ui/history/history_entry_inserter_unittest.mm
index 5c03250e..b4cf5be 100644
--- a/ios/chrome/browser/ui/history/history_entry_inserter_unittest.mm
+++ b/ios/chrome/browser/ui/history/history_entry_inserter_unittest.mm
@@ -8,8 +8,8 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "components/history/core/browser/browsing_history_service.h"
-#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
 #import "ios/chrome/browser/ui/history/legacy_history_entry_item.h"
+#import "ios/chrome/browser/ui/list_model/list_model.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/gtest_mac.h"
 #include "testing/platform_test.h"
@@ -38,7 +38,7 @@
 class HistoryEntryInserterTest : public PlatformTest {
  public:
   HistoryEntryInserterTest() {
-    model_ = [[CollectionViewModel alloc] init];
+    model_ = [[ListModel alloc] init];
     [model_ addSectionWithIdentifier:kSectionIdentifierEnumZero];
     inserter_ = [[HistoryEntryInserter alloc] initWithModel:model_];
     mock_delegate_ =
@@ -47,12 +47,12 @@
   }
 
  protected:
-  __strong CollectionViewModel* model_;
+  __strong ListModel* model_;
   __strong HistoryEntryInserter* inserter_;
   __strong id<HistoryEntryInserterDelegate> mock_delegate_;
 };
 
-// Tests that history entry items added to CollectionViewModel are sorted by
+// Tests that history entry items added to ListModel are sorted by
 // timestamp.
 TEST_F(HistoryEntryInserterTest, AddItems) {
   base::Time today =
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
index 4d77a40..f68f5972 100644
--- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -524,27 +524,6 @@
   return mainBrowserState_;
 }
 
-#pragma mark - Status bar
-
-- (BOOL)modalPresentationCapturesStatusBarAppearance {
-  if (!base::ios::IsRunningOnIOS10OrLater()) {
-    // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
-    // dropped.
-    return YES;
-  } else {
-    return [super modalPresentationCapturesStatusBarAppearance];
-  }
-}
-
-- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
-  [super traitCollectionDidChange:previousTraitCollection];
-  if (!base::ios::IsRunningOnIOS10OrLater()) {
-    // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
-    // dropped.
-    [self setNeedsStatusBarAppearanceUpdate];
-  }
-}
-
 #pragma mark - AppBar Containment
 
 // If viewController doesn't implement the AppBarPresenting protocol, it is
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
index da231e9..168daa0 100644
--- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
@@ -127,52 +127,6 @@
   [self.dispatcher closeSettingsUIAndOpenURL:command];
 }
 
-#pragma mark - Status bar
-
-- (UIViewController*)childViewControllerForStatusBarHidden {
-  if (!base::ios::IsRunningOnIOS10OrLater()) {
-    // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
-    // dropped.
-    return nil;
-  } else {
-    return [super childViewControllerForStatusBarHidden];
-  }
-}
-
-- (BOOL)prefersStatusBarHidden {
-  if (!base::ios::IsRunningOnIOS10OrLater()) {
-    // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
-    // dropped.
-    return NO;
-  } else {
-    return [super prefersStatusBarHidden];
-  }
-}
-
-- (UIViewController*)childViewControllerForStatusBarStyle {
-  if (!base::ios::IsRunningOnIOS10OrLater()) {
-    // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
-    // dropped.
-    return nil;
-  } else {
-    return [super childViewControllerForStatusBarStyle];
-  }
-}
-
-- (UIStatusBarStyle)preferredStatusBarStyle {
-  if (!base::ios::IsRunningOnIOS10OrLater()) {
-    // TODO(crbug.com/620361): Remove the entire method override when iOS 9 is
-    // dropped.
-    if (IsIPadIdiom() && !IsCompactWidth()) {
-      return UIStatusBarStyleLightContent;
-    } else {
-      return UIStatusBarStyleDefault;
-    }
-  } else {
-    return [super preferredStatusBarStyle];
-  }
-}
-
 #pragma mark - Subclassing
 
 - (BOOL)shouldShowEditButton {
diff --git a/ios/chrome/browser/web/browsing_egtest.mm b/ios/chrome/browser/web/browsing_egtest.mm
index 55138fa..f855684f 100644
--- a/ios/chrome/browser/web/browsing_egtest.mm
+++ b/ios/chrome/browser/web/browsing_egtest.mm
@@ -7,7 +7,6 @@
 #include <memory>
 #include <string>
 
-#include "base/ios/ios_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/browser/ui/ui_util.h"
@@ -388,8 +387,8 @@
 // modifies history.
 - (void)testBrowsingUserJavaScriptNavigation {
   // TODO(crbug.com/703855): Keyboard entry inside the omnibox fails only on
-  // iPad running iOS 10.
-  if (IsIPadIdiom() && base::ios::IsRunningOnIOS10OrLater())
+  // iPad.
+  if (IsIPadIdiom())
     return;
 
   // Create map of canned responses and set up the test HTML server.
@@ -424,8 +423,8 @@
 // Tests that evaluating non-navigation user JavaScript doesn't affect history.
 - (void)testBrowsingUserJavaScriptWithoutNavigation {
   // TODO(crbug.com/703855): Keyboard entry inside the omnibox fails only on
-  // iPad running iOS 10.
-  if (IsIPadIdiom() && base::ios::IsRunningOnIOS10OrLater())
+  // iPad.
+  if (IsIPadIdiom())
     return;
 
   // Create map of canned responses and set up the test HTML server.
diff --git a/ios/chrome/test/fakes/BUILD.gn b/ios/chrome/test/fakes/BUILD.gn
index 4a93e5d..5b2f061c 100644
--- a/ios/chrome/test/fakes/BUILD.gn
+++ b/ios/chrome/test/fakes/BUILD.gn
@@ -17,11 +17,14 @@
     "fake_download_manager_tab_helper_delegate.mm",
     "fake_pass_kit_tab_helper_delegate.h",
     "fake_pass_kit_tab_helper_delegate.mm",
+    "fake_store_kit_launcher.h",
+    "fake_store_kit_launcher.mm",
   ]
 
   deps = [
     "//base",
     "//ios/chrome/browser/download",
+    "//ios/chrome/browser/store_kit",
     "//ios/chrome/browser/ui/download",
     "//ios/chrome/browser/ui/presenters",
     "//ios/web/public",
diff --git a/ios/chrome/test/fakes/fake_store_kit_launcher.h b/ios/chrome/test/fakes/fake_store_kit_launcher.h
new file mode 100644
index 0000000..8a6599d
--- /dev/null
+++ b/ios/chrome/test/fakes/fake_store_kit_launcher.h
@@ -0,0 +1,20 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_TEST_FAKES_FAKE_STORE_KIT_LAUNCHER_H_
+#define IOS_CHROME_TEST_FAKES_FAKE_STORE_KIT_LAUNCHER_H_
+
+#import <Foundation/Foundation.h>
+
+#import "ios/chrome/browser/store_kit/store_kit_launcher.h"
+
+// Implementation of StoreKitLauncher that whenever openAppStore with productID
+// is called, launchedProductID will be set to that productID. Users need to
+// reset |launchedProductID| between uses.
+@interface FakeStoreKitLauncher : NSObject<StoreKitLauncher>
+// This string will have the product id that store kit with launched for.
+@property(nonatomic, copy) NSString* launchedProductID;
+@end
+
+#endif  // IOS_CHROME_TEST_FAKES_FAKE_STORE_KIT_LAUNCHER_H_
diff --git a/ios/chrome/test/fakes/fake_store_kit_launcher.mm b/ios/chrome/test/fakes/fake_store_kit_launcher.mm
new file mode 100644
index 0000000..c0d54a2
--- /dev/null
+++ b/ios/chrome/test/fakes/fake_store_kit_launcher.mm
@@ -0,0 +1,18 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/test/fakes/fake_store_kit_launcher.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation FakeStoreKitLauncher
+@synthesize launchedProductID = _launchedProductID;
+
+#pragma mark - StoreKitLauncher
+- (void)openAppStore:(NSString*)productID {
+  _launchedProductID = [productID copy];
+}
+@end
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index b0829dc..eeb7bc8 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -258,7 +258,7 @@
     "navigation/placeholder_navigation_util_unittest.mm",
     "navigation/serializable_user_data_manager_impl_unittest.mm",
     "navigation/wk_based_navigation_manager_impl_unittest.mm",
-    "navigation/wk_based_restore_session_util_unittest.mm",
+    "navigation/wk_navigation_util_unittest.mm",
   ]
 }
 
diff --git a/ios/web/features.mm b/ios/web/features.mm
index d76ecb6..4cc5466 100644
--- a/ios/web/features.mm
+++ b/ios/web/features.mm
@@ -17,7 +17,7 @@
                                      base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kWKHTTPSystemCookieStore{"WKHTTPSystemCookieStore",
-                                             base::FEATURE_ENABLED_BY_DEFAULT};
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
 }  // namespace features
 }  // namespace web
diff --git a/ios/web/navigation/BUILD.gn b/ios/web/navigation/BUILD.gn
index 672c48f..8c564f84 100644
--- a/ios/web/navigation/BUILD.gn
+++ b/ios/web/navigation/BUILD.gn
@@ -62,8 +62,8 @@
     "navigation_manager_util.mm",
     "placeholder_navigation_util.h",
     "placeholder_navigation_util.mm",
-    "wk_based_restore_session_util.h",
-    "wk_based_restore_session_util.mm",
+    "wk_navigation_util.h",
+    "wk_navigation_util.mm",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm
index b083eaf..5807090 100644
--- a/ios/web/navigation/navigation_manager_impl.mm
+++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -5,7 +5,7 @@
 #import "ios/web/navigation/navigation_manager_impl.h"
 
 #import "ios/web/navigation/navigation_manager_delegate.h"
-#include "ios/web/navigation/wk_based_restore_session_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 #import "ios/web/public/web_client.h"
 #include "ui/base/page_transition_types.h"
 
@@ -352,7 +352,7 @@
   // WKBackForwardList for the new user agent type. This hack is not needed for
   // LegacyNavigationManagerImpl which manages its own history entries.
   if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
-    reloadURL = CreateRedirectUrl(reloadURL);
+    reloadURL = wk_navigation_util::CreateRedirectUrl(reloadURL);
   }
 
   WebLoadParams params(reloadURL);
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.mm b/ios/web/navigation/wk_based_navigation_manager_impl.mm
index b24c730..3be38c4 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.mm
@@ -16,7 +16,7 @@
 #include "ios/web/navigation/navigation_item_impl_list.h"
 #import "ios/web/navigation/navigation_manager_delegate.h"
 #include "ios/web/navigation/placeholder_navigation_util.h"
-#include "ios/web/navigation/wk_based_restore_session_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 #include "ios/web/public/load_committed_details.h"
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/web_client.h"
@@ -429,7 +429,8 @@
   // TODO(crbug.com/771200): Retain these original NavigationItems restored from
   // storage and associate them with new WKBackForwardListItems created after
   // history restore so information such as scroll position is restored.
-  GURL url = CreateRestoreSessionUrl(last_committed_item_index, items);
+  GURL url = wk_navigation_util::CreateRestoreSessionUrl(
+      last_committed_item_index, items);
 
   WebLoadParams params(url);
   // It's not clear how this transition type will be used and what's the impact.
@@ -485,9 +486,9 @@
   // the query parameter automatically. Set virtual URL to the target URL so the
   // internal restore_session.html is not exposed in the UI and to URL-sensing
   // components outside of //ios/web layer.
-  if (IsRestoreSessionUrl(url)) {
+  if (wk_navigation_util::IsRestoreSessionUrl(url)) {
     GURL virtual_url;
-    bool success = ExtractTargetURL(url, &virtual_url);
+    bool success = wk_navigation_util::ExtractTargetURL(url, &virtual_url);
     DCHECK(success);
     if (success)
       new_item->SetVirtualURL(virtual_url);
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm b/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
index 572c5a9..404ac26 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
@@ -12,7 +12,7 @@
 #include "base/strings/utf_string_conversions.h"
 #import "ios/web/navigation/navigation_manager_delegate.h"
 #import "ios/web/navigation/navigation_manager_impl.h"
-#include "ios/web/navigation/wk_based_restore_session_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 #include "ios/web/public/load_committed_details.h"
 #include "ios/web/public/navigation_item.h"
 #include "ios/web/public/test/fakes/test_browser_state.h"
@@ -607,7 +607,8 @@
   EXPECT_EQ("http://www.0.com/", pending_item->GetVirtualURL());
 
   std::string session_json;
-  net::GetValueForKeyInQuery(pending_url, kRestoreSessionSessionQueryKey,
+  net::GetValueForKeyInQuery(pending_url,
+                             wk_navigation_util::kRestoreSessionSessionQueryKey,
                              &session_json);
   EXPECT_EQ(
       "{\"offset\":0,\"titles\":[\"Test Website 0\",\"\"],"
@@ -687,9 +688,9 @@
 // the target URL.
 TEST_F(WKBasedNavigationManagerTest, HideInternalRedirectUrl) {
   GURL target_url = GURL("http://www.1.com?query=special%26chars");
-  GURL url = net::AppendQueryParameter(GetRestoreSessionBaseUrl(),
-                                       kRestoreSessionTargetUrlQueryKey,
-                                       target_url.spec());
+  GURL url = net::AppendQueryParameter(
+      wk_navigation_util::GetRestoreSessionBaseUrl(),
+      wk_navigation_util::kRestoreSessionTargetUrlQueryKey, target_url.spec());
   NSString* url_spec = base::SysUTF8ToNSString(url.spec());
   [mock_wk_list_ setCurrentURL:url_spec];
   NavigationItem* item = manager_->GetItemAtIndex(0);
diff --git a/ios/web/navigation/wk_based_restore_session_util.h b/ios/web/navigation/wk_navigation_util.h
similarity index 90%
rename from ios/web/navigation/wk_based_restore_session_util.h
rename to ios/web/navigation/wk_navigation_util.h
index 6033d52..dfef6ef0 100644
--- a/ios/web/navigation/wk_based_restore_session_util.h
+++ b/ios/web/navigation/wk_navigation_util.h
@@ -4,8 +4,8 @@
 //
 // This file contains utility functions for WKBasedNavigationManagerImpl.
 
-#ifndef IOS_WEB_NAVIGATION_WK_BASED_RESTORE_SESSION_UTIL_H_
-#define IOS_WEB_NAVIGATION_WK_BASED_RESTORE_SESSION_UTIL_H_
+#ifndef IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_
+#define IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_
 
 #include <memory>
 #include <vector>
@@ -16,6 +16,8 @@
 
 class NavigationItem;
 
+namespace wk_navigation_util {
+
 // Query parameter key used to encode the session history to inject in a
 // restore_session.html URL.
 extern const char kRestoreSessionSessionQueryKey[];
@@ -51,6 +53,7 @@
 // component exists, returns false.
 bool ExtractTargetURL(const GURL& restore_session_url, GURL* target_url);
 
+}  // namespace wk_navigation_util
 }  // namespace web
 
-#endif  // IOS_WEB_NAVIGATION_WK_BASED_RESTORE_SESSION_UTIL_H_
+#endif  // IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_
diff --git a/ios/web/navigation/wk_based_restore_session_util.mm b/ios/web/navigation/wk_navigation_util.mm
similarity index 93%
rename from ios/web/navigation/wk_based_restore_session_util.mm
rename to ios/web/navigation/wk_navigation_util.mm
index d55d622..9d898ba 100644
--- a/ios/web/navigation/wk_based_restore_session_util.mm
+++ b/ios/web/navigation/wk_navigation_util.mm
@@ -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 "ios/web/navigation/wk_based_restore_session_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 
 #include "base/json/json_writer.h"
 #include "base/mac/bundle_locations.h"
@@ -14,7 +14,12 @@
 #include "net/base/url_util.h"
 #include "url/url_constants.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace web {
+namespace wk_navigation_util {
 
 const char kRestoreSessionSessionQueryKey[] = "session";
 const char kRestoreSessionTargetUrlQueryKey[] = "targetUrl";
@@ -87,4 +92,5 @@
   return success;
 }
 
+}  // namespace wk_navigation_util
 }  // namespace web
diff --git a/ios/web/navigation/wk_based_restore_session_util_unittest.mm b/ios/web/navigation/wk_navigation_util_unittest.mm
similarity index 83%
rename from ios/web/navigation/wk_based_restore_session_util_unittest.mm
rename to ios/web/navigation/wk_navigation_util_unittest.mm
index ba04128..bd08dfb2 100644
--- a/ios/web/navigation/wk_based_restore_session_util_unittest.mm
+++ b/ios/web/navigation/wk_navigation_util_unittest.mm
@@ -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 "ios/web/navigation/wk_based_restore_session_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 
 #include <memory>
 #include <vector>
@@ -14,11 +14,16 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace web {
+namespace wk_navigation_util {
 
-typedef PlatformTest WKBasedRestoreSessionUtilTest;
+typedef PlatformTest WKNavigationUtilTest;
 
-TEST_F(WKBasedRestoreSessionUtilTest, CreateRestoreSessionUrl) {
+TEST_F(WKNavigationUtilTest, CreateRestoreSessionUrl) {
   auto item0 = std::make_unique<NavigationItemImpl>();
   item0->SetURL(GURL("http://www.0.com"));
   item0->SetTitle(base::ASCIIToUTF16("Test Website 0"));
@@ -50,7 +55,7 @@
       session_json);
 }
 
-TEST_F(WKBasedRestoreSessionUtilTest, IsNotRestoreSessionUrl) {
+TEST_F(WKNavigationUtilTest, IsNotRestoreSessionUrl) {
   EXPECT_FALSE(IsRestoreSessionUrl(GURL()));
   EXPECT_FALSE(IsRestoreSessionUrl(GURL("file://somefile")));
   EXPECT_FALSE(IsRestoreSessionUrl(GURL("http://www.1.com")));
@@ -58,7 +63,7 @@
 
 // Tests that CreateRedirectUrl and ExtractTargetURL used back-to-back is an
 // identity transformation.
-TEST_F(WKBasedRestoreSessionUtilTest, CreateAndExtractTargetURL) {
+TEST_F(WKNavigationUtilTest, CreateAndExtractTargetURL) {
   GURL target_url = GURL("http://www.1.com?query=special%26chars");
   GURL url = CreateRedirectUrl(target_url);
   ASSERT_TRUE(url.SchemeIsFile());
@@ -68,4 +73,5 @@
   EXPECT_EQ(target_url, extracted_url);
 }
 
+}  // namespace wk_navigation_util
 }  // namespace web
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 557788e..2a152d64 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -44,7 +44,7 @@
 #import "ios/web/navigation/navigation_manager_impl.h"
 #include "ios/web/navigation/navigation_manager_util.h"
 #include "ios/web/navigation/placeholder_navigation_util.h"
-#include "ios/web/navigation/wk_based_restore_session_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 #include "ios/web/net/cert_host_pair.h"
 #import "ios/web/net/crw_cert_verification_controller.h"
 #import "ios/web/net/crw_ssl_status_updater.h"
@@ -124,6 +124,7 @@
 using web::placeholder_navigation_util::IsPlaceholderUrl;
 using web::placeholder_navigation_util::CreatePlaceholderUrlForUrl;
 using web::placeholder_navigation_util::ExtractUrlFromPlaceholderUrl;
+using web::wk_navigation_util::IsRestoreSessionUrl;
 
 // Struct to capture data about a user interaction. Records the time of the
 // interaction and the main document URL at that time.
@@ -1196,7 +1197,7 @@
   // navigation stack.
   GURL webViewURL = net::GURLWithNSURL(_webView.URL);
   if (_webView && !IsPlaceholderUrl(webViewURL) &&
-      !web::IsRestoreSessionUrl(webViewURL)) {
+      !IsRestoreSessionUrl(webViewURL)) {
     return [self webURLWithTrustLevel:trustLevel];
   }
   // Any non-web URL source is trusted.
@@ -2080,7 +2081,7 @@
   // Placeholder and restore session URLs are implementation details so should
   // not notify WebStateObservers.
   bool isInternalURL = context && (IsPlaceholderUrl(context->GetUrl()) ||
-                                   web::IsRestoreSessionUrl(context->GetUrl()));
+                                   IsRestoreSessionUrl(context->GetUrl()));
   if (!isInternalURL) {
     _webStateImpl->SetIsLoading(false);
     _webStateImpl->OnPageLoaded(currentURL, loadSuccess);
@@ -4363,6 +4364,7 @@
         item->SetVirtualURL(webViewURL);
         item->SetURL(webViewURL);
       }
+      context->SetUrl(webViewURL);
     }
     _webStateImpl->OnNavigationStarted(context);
     return;
@@ -4484,22 +4486,39 @@
 
   [self didReceiveWebViewNavigationDelegateCallback];
 
+  // For reasons not yet fully understood, sometimes WKWebView triggers
+  // |webView:didFinishNavigation| before |webView:didCommitNavigation|. If a
+  // navigation is already finished, stop processing
+  // (https://crbug.com/818796#c2).
+  if ([_navigationStates stateForNavigation:navigation] ==
+      web::WKNavigationState::FINISHED)
+    return;
+
+  GURL webViewURL = net::GURLWithNSURL(webView.URL);
+  GURL currentWKItemURL =
+      net::GURLWithNSURL(webView.backForwardList.currentItem.URL);
+  UMA_HISTOGRAM_BOOLEAN("IOS.CommittedURLMatchesCurrentItem",
+                        webViewURL == currentWKItemURL);
+
+  web::NavigationContextImpl* context =
+      [_navigationStates contextForNavigation:navigation];
+
   // TODO(crbug.com/787497): Always use webView.backForwardList.currentItem.URL
   // to obtain lastCommittedURL once loadHTML: is no longer user for WebUI.
-  GURL webViewURL = net::GURLWithNSURL(webView.URL);
-
   if (webViewURL.is_empty()) {
     // It is possible for |webView.URL| to be nil, in which case
     // webView.backForwardList.currentItem.URL will return the right committed
     // URL (crbug.com/784480).
     webViewURL = net::GURLWithNSURL(webView.backForwardList.currentItem.URL);
+  } else if (context->GetUrl() == currentWKItemURL) {
+    // If webView.backForwardList.currentItem.URL matches |context|, then this
+    // is a known edge case where |webView.URL| is wrong.
+    // TODO(crbug.com/826013): Remove this workaround.
+    webViewURL = currentWKItemURL;
   }
 
   [self displayWebView];
 
-  bool navigationFinished = [_navigationStates stateForNavigation:navigation] ==
-                            web::WKNavigationState::FINISHED;
-
   // Record the navigation state.
   [_navigationStates setState:web::WKNavigationState::COMMITTED
                 forNavigation:navigation];
@@ -4513,8 +4532,6 @@
 
   // Update HTTP response headers.
   _webStateImpl->UpdateHttpResponseHeaders(_documentURL);
-  web::NavigationContextImpl* context =
-      [_navigationStates contextForNavigation:navigation];
 
   if (@available(iOS 11.3, *)) {
     // On iOS 11.3 didReceiveServerRedirectForProvisionalNavigation: is not
@@ -4627,14 +4644,6 @@
     UMA_HISTOGRAM_BOOLEAN("WebController.WKWebViewHasCertForSecureConnection",
                           static_cast<bool>(cert));
   }
-
-  if (navigationFinished) {
-    // webView:didFinishNavigation: was called before
-    // webView:didCommitNavigation:, so forget null navigation now and signal
-    // that navigation was finished.
-    [self forgetNullWKNavigation:navigation];
-    [self didFinishNavigation:navigation];
-  }
 }
 
 - (void)didFinishGoToIndexSameDocumentNavigationWithType:
@@ -4657,7 +4666,33 @@
     didFinishNavigation:(WKNavigation*)navigation {
   [self didReceiveWebViewNavigationDelegateCallback];
 
+  // Sometimes |webView:didFinishNavigation| arrives before
+  // |webView:didCommitNavigation|. Explicitly trigger post-commit processing.
+  bool navigationCommitted =
+      [_navigationStates stateForNavigation:navigation] ==
+      web::WKNavigationState::COMMITTED;
+  UMA_HISTOGRAM_BOOLEAN("IOS.WKWebViewFinishBeforeCommit",
+                        !navigationCommitted);
+  if (!navigationCommitted) {
+    [self webView:webView didCommitNavigation:navigation];
+    DCHECK_EQ(web::WKNavigationState::COMMITTED,
+              [_navigationStates stateForNavigation:navigation]);
+  }
+
   GURL webViewURL = net::GURLWithNSURL(webView.URL);
+  GURL currentWKItemURL =
+      net::GURLWithNSURL(webView.backForwardList.currentItem.URL);
+  UMA_HISTOGRAM_BOOLEAN("IOS.FinishedURLMatchesCurrentItem",
+                        webViewURL == currentWKItemURL);
+
+  web::NavigationContextImpl* context =
+      [_navigationStates contextForNavigation:navigation];
+  if (context->GetUrl() == currentWKItemURL) {
+    // If webView.backForwardList.currentItem.URL matches |context|, then this
+    // is a known edge case where |webView.URL| is wrong.
+    // TODO(crbug.com/826013): Remove this workaround.
+    webViewURL = currentWKItemURL;
+  }
 
   // If this is a placeholder navigation for an app-specific URL, finish
   // loading by running the completion handler.
@@ -4669,8 +4704,6 @@
       return;
     }
 
-    web::NavigationContextImpl* context =
-        [_navigationStates contextForNavigation:navigation];
     web::NavigationItemImpl* item = self.currentNavItem;
     web::ErrorRetryState errorRetryState = item->GetErrorRetryState();
 
@@ -4741,9 +4774,6 @@
     }
   }
 
-  bool navigationCommitted =
-      [_navigationStates stateForNavigation:navigation] ==
-      web::WKNavigationState::COMMITTED;
   [_navigationStates setState:web::WKNavigationState::FINISHED
                 forNavigation:navigation];
 
@@ -4754,12 +4784,7 @@
   // appropriate time rather than invoking here.
   web::ExecuteJavaScript(webView, @"__gCrWeb.didFinishNavigation()", nil);
   [self didFinishNavigation:navigation];
-
-  // Forget null navigation only if it has been committed. Otherwise it will be
-  // forgotten in webView:didCommitNavigation: callback.
-  if (navigationCommitted) {
-    [self forgetNullWKNavigation:navigation];
-  }
+  [self forgetNullWKNavigation:navigation];
 }
 
 - (void)webView:(WKWebView*)webView
@@ -4948,7 +4973,7 @@
       IsPlaceholderUrl(_documentURL) ||
       web::GetWebClient()->IsAppSpecificURL(_documentURL);
   if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
-      web::IsRestoreSessionUrl(webViewURL) && previousURLIsAppSpecific) {
+      IsRestoreSessionUrl(webViewURL) && previousURLIsAppSpecific) {
     [_webView reload];
     return;
   }
@@ -5024,7 +5049,8 @@
       lastNavigationState == web::WKNavigationState::STARTED ||
       lastNavigationState == web::WKNavigationState::REDIRECTED;
 
-  if (!hasPendingNavigation) {
+  if (!hasPendingNavigation &&
+      !IsPlaceholderUrl(net::GURLWithNSURL(_webView.URL))) {
     // Do not update the title if there is a navigation in progress because
     // there is no way to tell if KVO change fired for new or previous page.
     [self setNavigationItemTitle:[_webView title]];
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn
index 02c2822..5b7f5c7 100644
--- a/media/cast/BUILD.gn
+++ b/media/cast/BUILD.gn
@@ -104,8 +104,6 @@
     "net/rtp/rtp_sender.h",
     "net/udp_packet_pipe.cc",
     "net/udp_packet_pipe.h",
-    "net/udp_socket_client.cc",
-    "net/udp_socket_client.h",
     "net/udp_transport_impl.cc",
     "net/udp_transport_impl.h",
     "net/udp_transport_interface.h",
@@ -117,7 +115,6 @@
     "//media/mojo/common",
     "//mojo/public/cpp/system",
     "//net",
-    "//services/network/public/mojom",
   ]
 
   public_deps = [
@@ -320,7 +317,6 @@
     "net/rtp/rtp_packetizer_unittest.cc",
     "net/rtp/rtp_parser_unittest.cc",
     "net/udp_packet_pipe_unittest.cc",
-    "net/udp_socket_client_unittest.cc",
     "net/udp_transport_unittest.cc",
     "receiver/audio_decoder_unittest.cc",
     "receiver/frame_receiver_unittest.cc",
@@ -351,7 +347,6 @@
     "//media/test:run_all_unittests",
     "//mojo/public/cpp/bindings",
     "//net",
-    "//services/network/public/mojom",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/opus",
diff --git a/media/cast/net/DEPS b/media/cast/net/DEPS
index f1d2b5a..0979a06 100644
--- a/media/cast/net/DEPS
+++ b/media/cast/net/DEPS
@@ -9,7 +9,6 @@
   "+media/mojo/common",
   "+mojo/public/cpp",
   "+net",
-  "+services/network/public/mojom",
 ]
 
 specific_include_rules = {
diff --git a/media/cast/net/udp_socket_client_unittest.cc b/media/cast/net/udp_socket_client_unittest.cc
deleted file mode 100644
index 59d59024..0000000
--- a/media/cast/net/udp_socket_client_unittest.cc
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/cast/net/udp_socket_client.h"
-
-#include <algorithm>
-#include <string>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/test/mock_callback.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/time/time.h"
-#include "media/cast/net/cast_transport_config.h"
-#include "media/cast/test/utility/net_utility.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "net/base/ip_endpoint.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::InvokeWithoutArgs;
-
-namespace media {
-namespace cast {
-
-namespace {
-
-class MockUdpSocket final : public network::mojom::UDPSocket {
- public:
-  MockUdpSocket(network::mojom::UDPSocketRequest request,
-                network::mojom::UDPSocketReceiverPtr receiver)
-      : binding_(this, std::move(request)), receiver_(std::move(receiver)) {}
-
-  ~MockUdpSocket() override {}
-
-  MOCK_METHOD0(OnSend, void());
-
-  // network::mojom::UDPSocket implementation.
-  void Connect(const net::IPEndPoint& remote_addr,
-               network::mojom::UDPSocketOptionsPtr options,
-               ConnectCallback callback) override {
-    std::move(callback).Run(net::OK, test::GetFreeLocalPort());
-  }
-
-  void Bind(const net::IPEndPoint& local_addr,
-            network::mojom::UDPSocketOptionsPtr options,
-            BindCallback callback) override {}
-  void SetBroadcast(bool broadcast, SetBroadcastCallback callback) override {}
-  void JoinGroup(const net::IPAddress& group_address,
-                 JoinGroupCallback callback) override {}
-  void LeaveGroup(const net::IPAddress& group_address,
-                  LeaveGroupCallback callback) override {}
-
-  void ReceiveMore(uint32_t num_additional_datagrams) override {
-    num_ask_for_receive_ += num_additional_datagrams;
-  }
-
-  void ReceiveMoreWithBufferSize(uint32_t num_additional_datagrams,
-                                 uint32_t buffer_size) override {}
-  void SendTo(const net::IPEndPoint& dest_addr,
-              base::span<const uint8_t> data,
-              const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
-              SendToCallback callback) override {}
-
-  void Send(base::span<const uint8_t> data,
-            const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
-            SendCallback callback) override {
-    sending_packet_ = std::make_unique<Packet>(data.begin(), data.end());
-    std::move(callback).Run(net::OK);
-    OnSend();
-  }
-
-  void Close() override {}
-
-  // Simulate receiving a packet from the network.
-  void OnReceivedPacket(const Packet& packet) {
-    if (num_ask_for_receive_) {
-      receiver_->OnReceived(
-          net::OK, base::nullopt,
-          base::span<const uint8_t>(
-              reinterpret_cast<const uint8_t*>(packet.data()), packet.size()));
-      ASSERT_LT(0, num_ask_for_receive_);
-      --num_ask_for_receive_;
-    }
-  }
-
-  void VerifySendingPacket(const Packet& packet) {
-    EXPECT_TRUE(
-        std::equal(packet.begin(), packet.end(), sending_packet_->begin()));
-  }
-
- private:
-  mojo::Binding<network::mojom::UDPSocket> binding_;
-  network::mojom::UDPSocketReceiverPtr receiver_;
-  std::unique_ptr<Packet> sending_packet_;
-  int num_ask_for_receive_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(MockUdpSocket);
-};
-
-class MockNetworkContext final : public network::mojom::NetworkContext {
- public:
-  explicit MockNetworkContext(network::mojom::NetworkContextRequest request)
-      : binding_(this, std::move(request)) {}
-  ~MockNetworkContext() override {}
-
-  // network::mojom::NetworkContext implementation:
-  void CreateURLLoaderFactory(network::mojom::URLLoaderFactoryRequest request,
-                              uint32_t process_id) override {}
-  void GetCookieManager(network::mojom::CookieManagerRequest request) override {
-  }
-  void GetRestrictedCookieManager(
-      network::mojom::RestrictedCookieManagerRequest request,
-      int32_t render_process_id,
-      int32_t render_frame_id) override {}
-  void ClearNetworkingHistorySince(
-      base::Time time,
-      base::OnceClosure completion_callback) override {}
-  void ClearHttpCache(base::Time start_time,
-                      base::Time end_time,
-                      network::mojom::ClearCacheUrlFilterPtr filter,
-                      ClearHttpCacheCallback callback) override {}
-  void SetNetworkConditions(
-      const std::string& profile_id,
-      network::mojom::NetworkConditionsPtr conditions) override {}
-  void SetAcceptLanguage(const std::string& new_accept_language) override {}
-  void AddHSTSForTesting(const std::string& host,
-                         base::Time expiry,
-                         bool include_subdomains,
-                         AddHSTSForTestingCallback callback) override {}
-
-  MOCK_METHOD0(OnUDPSocketCreated, void());
-  void CreateUDPSocket(network::mojom::UDPSocketRequest request,
-                       network::mojom::UDPSocketReceiverPtr receiver) override {
-    udp_socket_ = std::make_unique<MockUdpSocket>(std::move(request),
-                                                  std::move(receiver));
-    OnUDPSocketCreated();
-  }
-  void CreateTCPServerSocket(
-      const net::IPEndPoint& local_addr,
-      uint32_t backlog,
-      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
-      network::mojom::TCPServerSocketRequest request,
-      CreateTCPServerSocketCallback callback) override {}
-  void CreateTCPConnectedSocket(
-      const base::Optional<net::IPEndPoint>& local_addr,
-      const net::AddressList& remote_addr_list,
-      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
-      network::mojom::TCPConnectedSocketRequest request,
-      network::mojom::TCPConnectedSocketObserverPtr observer,
-      CreateTCPConnectedSocketCallback callback) override {}
-
-  MockUdpSocket* udp_socket() const { return udp_socket_.get(); }
-  void CreateWebSocket(network::mojom::WebSocketRequest request,
-                       int process_id,
-                       int render_frame_id,
-                       const url::Origin& origin) override {}
-
- private:
-  mojo::Binding<network::mojom::NetworkContext> binding_;
-  std::unique_ptr<MockUdpSocket> udp_socket_;
-  DISALLOW_COPY_AND_ASSIGN(MockNetworkContext);
-};
-
-}  // namespace
-
-class UdpSocketClientTest : public ::testing::Test {
- public:
-  UdpSocketClientTest() {
-    network::mojom::NetworkContextPtr network_context_ptr;
-    network_context_ = std::make_unique<MockNetworkContext>(
-        mojo::MakeRequest(&network_context_ptr));
-    udp_transport_client_ = std::make_unique<UdpSocketClient>(
-        test::GetFreeLocalPort(), std::move(network_context_ptr),
-        base::OnceClosure());
-  }
-
-  ~UdpSocketClientTest() override = default;
-
-  MOCK_METHOD0(OnReceivedPacketCall, void());
-  bool OnReceivedPacket(std::unique_ptr<Packet> packet) {
-    received_packet_ = std::move(packet);
-    OnReceivedPacketCall();
-    return true;
-  }
-
- protected:
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-  std::unique_ptr<MockNetworkContext> network_context_;
-  std::unique_ptr<UdpSocketClient> udp_transport_client_;
-  std::unique_ptr<Packet> received_packet_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(UdpSocketClientTest);
-};
-
-TEST_F(UdpSocketClientTest, SendAndReceive) {
-  std::string data = "Test";
-  Packet packet(data.begin(), data.end());
-
-  {
-    // Expect the UDPSocket to be created when calling StartReceiving().
-    base::RunLoop run_loop;
-    EXPECT_CALL(*network_context_, OnUDPSocketCreated())
-        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
-    udp_transport_client_->StartReceiving(base::BindRepeating(
-        &UdpSocketClientTest::OnReceivedPacket, base::Unretained(this)));
-    run_loop.Run();
-  }
-  scoped_task_environment_.RunUntilIdle();
-
-  MockUdpSocket* socket = network_context_->udp_socket();
-
-  {
-    // Request to send one packet.
-    base::RunLoop run_loop;
-    base::RepeatingClosure cb;
-    EXPECT_CALL(*socket, OnSend())
-        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
-    EXPECT_TRUE(udp_transport_client_->SendPacket(
-        new base::RefCountedData<Packet>(packet), cb));
-    run_loop.Run();
-  }
-
-  // Expect the packet to be sent is delivered to the UDPSocket.
-  socket->VerifySendingPacket(packet);
-
-  // Test receiving packet.
-  std::string data2 = "Hello";
-  Packet packet2(data.begin(), data.end());
-  {
-    // Simulate receiving |packet2| from the network.
-    base::RunLoop run_loop;
-    EXPECT_CALL(*this, OnReceivedPacketCall())
-        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
-    socket->OnReceivedPacket(packet2);
-    run_loop.Run();
-  }
-
-  // The packet is expected to be received.
-  EXPECT_TRUE(
-      std::equal(packet2.begin(), packet2.end(), received_packet_->begin()));
-
-  udp_transport_client_->StopReceiving();
-}
-
-TEST_F(UdpSocketClientTest, SendBeforeConnected) {
-  std::string data = "Test";
-  Packet packet(data.begin(), data.end());
-
-  // Request to send one packet.
-  base::MockCallback<base::RepeatingClosure> resume_send_cb;
-  {
-    EXPECT_CALL(resume_send_cb, Run()).Times(0);
-    EXPECT_FALSE(udp_transport_client_->SendPacket(
-        new base::RefCountedData<Packet>(packet), resume_send_cb.Get()));
-    scoped_task_environment_.RunUntilIdle();
-  }
-  {
-    // Expect the UDPSocket to be created when calling StartReceiving().
-    base::RunLoop run_loop;
-    EXPECT_CALL(*network_context_, OnUDPSocketCreated()).Times(1);
-    EXPECT_CALL(resume_send_cb, Run())
-        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
-    udp_transport_client_->StartReceiving(base::BindRepeating(
-        &UdpSocketClientTest::OnReceivedPacket, base::Unretained(this)));
-    run_loop.Run();
-  }
-  udp_transport_client_->StopReceiving();
-}
-
-}  // namespace cast
-}  // namespace media
diff --git a/net/base/file_stream_context.cc b/net/base/file_stream_context.cc
index ecb497b0..75dcfb97 100644
--- a/net/base/file_stream_context.cc
+++ b/net/base/file_stream_context.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/debug/alias.h"
 #include "base/files/file_path.h"
 #include "base/location.h"
 #include "base/task_runner.h"
@@ -82,7 +81,7 @@
 void FileStream::Context::Open(const base::FilePath& path,
                                int open_flags,
                                CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
   bool posted = base::PostTaskAndReplyWithResult(
       task_runner_.get(), FROM_HERE,
@@ -92,12 +91,12 @@
                      std::move(callback)));
   DCHECK(posted);
 
-  last_operation_ = OPEN;
   async_in_progress_ = true;
 }
 
 void FileStream::Context::Close(CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
+
   bool posted = base::PostTaskAndReplyWithResult(
       task_runner_.get(), FROM_HERE,
       base::BindOnce(&Context::CloseFileImpl, base::Unretained(this)),
@@ -105,13 +104,12 @@
                      IntToInt64(std::move(callback))));
   DCHECK(posted);
 
-  last_operation_ = CLOSE;
   async_in_progress_ = true;
 }
 
 void FileStream::Context::Seek(int64_t offset,
                                Int64CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
   bool posted = base::PostTaskAndReplyWithResult(
       task_runner_.get(), FROM_HERE,
@@ -120,14 +118,11 @@
                      std::move(callback)));
   DCHECK(posted);
 
-  last_operation_ = SEEK;
   async_in_progress_ = true;
 }
 
 void FileStream::Context::GetFileInfo(base::File::Info* file_info,
                                       CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
-
   base::PostTaskAndReplyWithResult(
       task_runner_.get(), FROM_HERE,
       base::BindOnce(&Context::GetFileInfoImpl, base::Unretained(this),
@@ -139,7 +134,7 @@
 }
 
 void FileStream::Context::Flush(CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
   bool posted = base::PostTaskAndReplyWithResult(
       task_runner_.get(), FROM_HERE,
@@ -148,7 +143,6 @@
                      IntToInt64(std::move(callback))));
   DCHECK(posted);
 
-  last_operation_ = FLUSH;
   async_in_progress_ = true;
 }
 
@@ -156,16 +150,6 @@
   return file_.IsValid();
 }
 
-void FileStream::Context::CheckNoAsyncInProgress() const {
-  if (!async_in_progress_)
-    return;
-  LastOperation state = last_operation_;
-  base::debug::Alias(&state);
-  // TODO(xunjieli): Once https://crbug.com/732321 is fixed, use
-  // DCHECK(!async_in_progress_) directly at call places.
-  CHECK(!async_in_progress_);
-}
-
 FileStream::Context::OpenResult FileStream::Context::OpenFileImpl(
     const base::FilePath& path, int open_flags) {
 #if defined(OS_POSIX)
@@ -230,10 +214,7 @@
 }
 
 void FileStream::Context::CloseAndDelete() {
-  // TODO(ananta)
-  // Replace this CHECK with a DCHECK once we figure out the root cause of
-  // http://crbug.com/455066
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
   if (file_.IsValid()) {
     bool posted = task_runner_.get()->PostTask(
@@ -256,7 +237,6 @@
   // should be reset before Close() because it shouldn't run if any async
   // operation is in progress.
   async_in_progress_ = false;
-  last_operation_ = NONE;
   if (orphaned_) {
     CloseAndDelete();
   } else {
diff --git a/net/base/file_stream_context.h b/net/base/file_stream_context.h
index 7a34aad..c8fbff6 100644
--- a/net/base/file_stream_context.h
+++ b/net/base/file_stream_context.h
@@ -124,27 +124,6 @@
     DISALLOW_COPY_AND_ASSIGN(OpenResult);
   };
 
-  // TODO(xunjieli): Remove after crbug.com/732321 is fixed.
-  enum LastOperation {
-    // FileStream has a pending Open().
-    OPEN,
-    // FileStream has a pending Write().
-    WRITE,
-    // FileStream has a pending Read().
-    READ,
-    // FileStream has a pending Seek().
-    SEEK,
-    // FileStream has a pending Flush().
-    FLUSH,
-    // FileStream has a pending Close().
-    CLOSE,
-    // FileStream doesn't have any pending operation.
-    NONE
-  };
-
-  // TODO(xunjieli): Remove after crbug.com/732321 is fixed.
-  void CheckNoAsyncInProgress() const;
-
   ////////////////////////////////////////////////////////////////////////////
   // Platform-independent methods implemented in file_stream_context.cc.
   ////////////////////////////////////////////////////////////////////////////
@@ -239,9 +218,6 @@
   base::File file_;
   bool async_in_progress_;
 
-  // TODO(xunjieli): Remove after crbug.com/732321 is fixed.
-  LastOperation last_operation_;
-
   bool orphaned_;
   scoped_refptr<base::TaskRunner> task_runner_;
 
diff --git a/net/base/file_stream_context_posix.cc b/net/base/file_stream_context_posix.cc
index 1880b95a..b15c651 100644
--- a/net/base/file_stream_context_posix.cc
+++ b/net/base/file_stream_context_posix.cc
@@ -31,7 +31,6 @@
                              const scoped_refptr<base::TaskRunner>& task_runner)
     : file_(std::move(file)),
       async_in_progress_(false),
-      last_operation_(NONE),
       orphaned_(false),
       task_runner_(task_runner) {}
 
@@ -40,7 +39,7 @@
 int FileStream::Context::Read(IOBuffer* in_buf,
                               int buf_len,
                               CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
   scoped_refptr<IOBuffer> buf = in_buf;
   const bool posted = base::PostTaskAndReplyWithResult(
@@ -52,14 +51,13 @@
   DCHECK(posted);
 
   async_in_progress_ = true;
-  last_operation_ = READ;
   return ERR_IO_PENDING;
 }
 
 int FileStream::Context::Write(IOBuffer* in_buf,
                                int buf_len,
                                CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
   scoped_refptr<IOBuffer> buf = in_buf;
   const bool posted = base::PostTaskAndReplyWithResult(
@@ -71,7 +69,6 @@
   DCHECK(posted);
 
   async_in_progress_ = true;
-  last_operation_ = WRITE;
   return ERR_IO_PENDING;
 }
 
diff --git a/net/base/file_stream_context_win.cc b/net/base/file_stream_context_win.cc
index cf4947f..55c9df0 100644
--- a/net/base/file_stream_context_win.cc
+++ b/net/base/file_stream_context_win.cc
@@ -38,7 +38,6 @@
 
 FileStream::Context::Context(const scoped_refptr<base::TaskRunner>& task_runner)
     : async_in_progress_(false),
-      last_operation_(NONE),
       orphaned_(false),
       task_runner_(task_runner),
       async_read_initiated_(false),
@@ -50,7 +49,6 @@
                              const scoped_refptr<base::TaskRunner>& task_runner)
     : file_(std::move(file)),
       async_in_progress_(false),
-      last_operation_(NONE),
       orphaned_(false),
       task_runner_(task_runner),
       async_read_initiated_(false),
@@ -69,13 +67,12 @@
 int FileStream::Context::Read(IOBuffer* buf,
                               int buf_len,
                               CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
   DCHECK(!async_read_initiated_);
   DCHECK(!async_read_completed_);
   DCHECK(!io_complete_for_read_received_);
 
-  last_operation_ = READ;
   IOCompletionIsPending(std::move(callback), buf);
 
   async_read_initiated_ = true;
@@ -92,9 +89,8 @@
 int FileStream::Context::Write(IOBuffer* buf,
                                int buf_len,
                                CompletionOnceCallback callback) {
-  CheckNoAsyncInProgress();
+  DCHECK(!async_in_progress_);
 
-  last_operation_ = WRITE;
   result_ = 0;
 
   DWORD bytes_written = 0;
@@ -142,10 +138,8 @@
   DCHECK(!callback_.is_null());
   DCHECK(async_in_progress_);
 
-  if (!async_read_initiated_) {
-    last_operation_ = NONE;
+  if (!async_read_initiated_)
     async_in_progress_ = false;
-  }
 
   if (orphaned_) {
     io_complete_for_read_received_ = true;
@@ -185,7 +179,6 @@
     async_read_initiated_ = false;
     io_complete_for_read_received_ = false;
     async_read_completed_ = false;
-    last_operation_ = NONE;
     async_in_progress_ = false;
   }
   scoped_refptr<IOBuffer> temp_buf = in_flight_buf_;
@@ -194,7 +187,6 @@
 }
 
 void FileStream::Context::DeleteOrphanedContext() {
-  last_operation_ = NONE;
   async_in_progress_ = false;
   callback_.Reset();
   in_flight_buf_ = NULL;
diff --git a/net/cert/cert_database_nss.cc b/net/cert/cert_database_nss.cc
index 403ffbe..832f901 100644
--- a/net/cert/cert_database_nss.cc
+++ b/net/cert/cert_database_nss.cc
@@ -5,13 +5,11 @@
 #include "net/cert/cert_database.h"
 
 #include "base/observer_list_threadsafe.h"
-#include "crypto/nss_util.h"
 
 namespace net {
 
 CertDatabase::CertDatabase()
     : observer_list_(new base::ObserverListThreadSafe<Observer>) {
-  crypto::EnsureNSSInit();
 }
 
 CertDatabase::~CertDatabase() = default;
diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc
index a36d647e3..77a6433 100644
--- a/net/cert/nss_cert_database.cc
+++ b/net/cert/nss_cert_database.cc
@@ -74,7 +74,6 @@
       weak_factory_(this) {
   CHECK(public_slot_);
 
-  // This also makes sure that NSS has been initialized.
   CertDatabase* cert_db = CertDatabase::GetInstance();
   cert_notification_forwarder_.reset(new CertNotificationForwarder(cert_db));
   AddObserver(cert_notification_forwarder_.get());
diff --git a/net/cert/nss_cert_database_unittest.cc b/net/cert/nss_cert_database_unittest.cc
index 7781ea4..5c1ebab0 100644
--- a/net/cert/nss_cert_database_unittest.cc
+++ b/net/cert/nss_cert_database_unittest.cc
@@ -124,7 +124,10 @@
   }
 
   std::unique_ptr<NSSCertDatabase> cert_db_;
-  const CertificateList empty_cert_list_;
+  // When building with libstdc++, |empty_cert_list_| does not have a default
+  // constructor.  Initialize it explicitly so that CertDatabaseNSSTest gets a
+  // default constructor.
+  const CertificateList empty_cert_list_ = CertificateList();
   crypto::ScopedTestNSSDB test_nssdb_;
   crypto::ScopedPK11Slot public_slot_;
 };
diff --git a/net/data/proxy_resolver_v8_unittest/pac_library_unittest.js b/net/data/proxy_resolver_v8_unittest/pac_library_unittest.js
index fdd036a2..f01a01e 100644
--- a/net/data/proxy_resolver_v8_unittest/pac_library_unittest.js
+++ b/net/data/proxy_resolver_v8_unittest/pac_library_unittest.js
@@ -258,9 +258,14 @@
   t.expectEquals(true, dateRange(3, "MAR"));
   MockDate.setCurrent("Mar 03 2014");
   t.expectEquals(true, dateRange(3, "MAR"));
-  // TODO(eroman):
-  //t.expectEquals(false, dateRange(2, "MAR"));
-  //t.expectEquals(false, dateRange(3, "JAN"));
+
+  // It is unclear what the intent of (day, month) is; the Netscape code
+  // ends up returning true for any combination (https://crbug.com/827292).
+  //
+  // This seems wrong, but in the spirit of bug-for-bug compatibility document
+  // that behavior through tests :(
+  t.expectEquals(true, dateRange(2, "MAR"));
+  t.expectEquals(true, dateRange(3, "JAN"));
 
   // dateRange(day, month, year)
   MockDate.setCurrent("Mar 03 2009");
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h
index 9ad57b9..74a20838 100644
--- a/net/http/http_network_transaction.h
+++ b/net/http/http_network_transaction.h
@@ -296,8 +296,6 @@
   // Returns true if this transaction is for a WebSocket handshake
   bool ForWebSocketHandshake() const;
 
-  void SetStream(HttpStream* stream);
-
   void CopyConnectionAttemptsFromStreamRequest();
 
   // Returns true if response "Content-Encoding" headers respect
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index e1bb8dcf..a4b3c98 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -12207,9 +12207,10 @@
 
   TestNetLog net_log;
 
-  session_deps_.proxy_resolution_service = std::make_unique<ProxyResolutionService>(
-      std::move(proxy_config_service), std::move(proxy_resolver_factory),
-      &net_log);
+  session_deps_.proxy_resolution_service =
+      std::make_unique<ProxyResolutionService>(
+          std::move(proxy_config_service), std::move(proxy_resolver_factory),
+          &net_log);
 
   session_deps_.net_log = &net_log;
 
@@ -13334,7 +13335,8 @@
           ProxyResolutionService::CreateFixed(test_config.proxy_url,
                                               TRAFFIC_ANNOTATION_FOR_TESTS);
     } else {
-      session_deps_.proxy_resolution_service = ProxyResolutionService::CreateDirect();
+      session_deps_.proxy_resolution_service =
+          ProxyResolutionService::CreateDirect();
     }
 
     HttpRequestInfo request;
@@ -13427,7 +13429,8 @@
   HttpAuthHandlerMock::Factory* auth_factory(
       new HttpAuthHandlerMock::Factory());
   session_deps_.http_auth_handler_factory.reset(auth_factory);
-  session_deps_.proxy_resolution_service = ProxyResolutionService::CreateDirect();
+  session_deps_.proxy_resolution_service =
+      ProxyResolutionService::CreateDirect();
   session_deps_.host_resolver->rules()->AddRule("www.example.com", "10.0.0.1");
   session_deps_.host_resolver->set_synchronous_mode(true);
 
@@ -15774,10 +15777,9 @@
   // Use a separate test instance for the separate SpdySession that will be
   // created.
   SpdyTestUtil spdy_util_2;
-  auto spdy1_data = std::make_unique<SequencedSocketData>(
-      spdy1_reads, arraysize(spdy1_reads), spdy1_writes,
-      arraysize(spdy1_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(spdy1_data.get());
+  SequencedSocketData spdy1_data(spdy1_reads, arraysize(spdy1_reads),
+                                 spdy1_writes, arraysize(spdy1_writes));
+  session_deps_.socket_factory->AddSocketDataProvider(&spdy1_data);
 
   SpdySerializedFrame host2_req(
       spdy_util_2.ConstructSpdyGet("https://www.b.com", 1, DEFAULT_PRIORITY));
@@ -15792,10 +15794,9 @@
       MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3),
   };
 
-  auto spdy2_data = std::make_unique<SequencedSocketData>(
-      spdy2_reads, arraysize(spdy2_reads), spdy2_writes,
-      arraysize(spdy2_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(spdy2_data.get());
+  SequencedSocketData spdy2_data(spdy2_reads, arraysize(spdy2_reads),
+                                 spdy2_writes, arraysize(spdy2_writes));
+  session_deps_.socket_factory->AddSocketDataProvider(&spdy2_data);
 
   MockWrite http_write[] = {
     MockWrite("GET / HTTP/1.1\r\n"
@@ -17169,9 +17170,6 @@
 }  // namespace
 
 TEST_F(HttpNetworkTransactionTest, CreateWebSocketHandshakeStream) {
-  // The same logic needs to be tested for both ws: and wss: schemes, but this
-  // test is already parameterised on NextProto, so it uses a loop to verify
-  // that the different schemes work.
   std::string test_cases[] = {"ws://www.example.org/",
                               "wss://www.example.org/"};
   for (size_t i = 0; i < arraysize(test_cases); ++i) {
diff --git a/net/http/http_stream_factory_impl_job.h b/net/http/http_stream_factory_impl_job.h
index 6c04cd6..cc5917e3 100644
--- a/net/http/http_stream_factory_impl_job.h
+++ b/net/http/http_stream_factory_impl_job.h
@@ -224,8 +224,6 @@
 
   std::unique_ptr<HttpStream> ReleaseStream() { return std::move(stream_); }
 
-  void SetStream(HttpStream* http_stream) { stream_.reset(http_stream); }
-
   std::unique_ptr<BidirectionalStreamImpl> ReleaseBidirectionalStream() {
     return std::move(bidirectional_stream_impl_);
   }
diff --git a/net/http/http_stream_factory_impl_job_controller_unittest.cc b/net/http/http_stream_factory_impl_job_controller_unittest.cc
index fe13823..ba5644a 100644
--- a/net/http/http_stream_factory_impl_job_controller_unittest.cc
+++ b/net/http/http_stream_factory_impl_job_controller_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "net/http/http_stream_factory_impl_job_controller.h"
 
+#include <algorithm>
+#include <list>
 #include <string>
 #include <utility>
 #include <vector>
@@ -162,6 +164,11 @@
   static void SetShouldReconsiderProxy(HttpStreamFactoryImpl::Job* job) {
     job->should_reconsider_proxy_ = true;
   }
+
+  static void SetStream(HttpStreamFactoryImpl::Job* job,
+                        std::unique_ptr<HttpStream> http_stream) {
+    job->stream_ = std::move(http_stream);
+  }
 };
 
 class JobControllerPeer {
@@ -234,7 +241,8 @@
       std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
           ProxyResolutionService::CreateFixedFromPacResult(
               "HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
-      session_deps_.proxy_resolution_service = std::move(proxy_resolution_service);
+      session_deps_.proxy_resolution_service =
+          std::move(proxy_resolution_service);
     }
     session_deps_.net_log = net_log_.bound().net_log();
     HttpNetworkSession::Params params =
@@ -432,10 +440,12 @@
     : public HttpStreamFactoryImplJobControllerTest,
       public ::testing::WithParamInterface<::testing::tuple<bool, int>> {
  public:
-  void Initialize(std::unique_ptr<ProxyResolutionService> proxy_resolution_service,
-                  std::unique_ptr<ProxyDelegate> proxy_delegate) {
+  void Initialize(
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service,
+      std::unique_ptr<ProxyDelegate> proxy_delegate) {
     session_deps_.proxy_delegate = std::move(proxy_delegate);
-    session_deps_.proxy_resolution_service = std::move(proxy_resolution_service);
+    session_deps_.proxy_resolution_service =
+        std::move(proxy_resolution_service);
     session_ = std::make_unique<HttpNetworkSession>(
         SpdySessionDependencies::CreateSessionParams(&session_deps_),
         SpdySessionDependencies::CreateSessionContext(&session_deps_));
@@ -480,7 +490,8 @@
   TestProxyDelegate* test_proxy_delegate_raw = test_proxy_delegate.get();
 
   // Before starting the test, verify that there are no proxies marked as bad.
-  ASSERT_TRUE(proxy_resolution_service->proxy_retry_info().empty()) << mock_error;
+  ASSERT_TRUE(proxy_resolution_service->proxy_retry_info().empty())
+      << mock_error;
 
   StaticSocketDataProvider socket_data_proxy_main_job;
   socket_data_proxy_main_job.set_connect_data(MockConnect(ASYNC, mock_error));
@@ -528,7 +539,8 @@
   request_info.method = "GET";
   request_info.url = GURL("http://www.example.com");
 
-  Initialize(std::move(proxy_resolution_service), std::move(test_proxy_delegate));
+  Initialize(std::move(proxy_resolution_service),
+             std::move(test_proxy_delegate));
   EXPECT_EQ(set_alternative_proxy_server,
             test_proxy_delegate_raw->alternative_proxy_server().is_quic());
 
@@ -582,7 +594,8 @@
   test_proxy_delegate->set_alternative_proxy_server(
       ProxyServer::FromPacString("QUIC myproxy.org:443"));
 
-  Initialize(std::move(proxy_resolution_service), std::move(test_proxy_delegate));
+  Initialize(std::move(proxy_resolution_service),
+             std::move(test_proxy_delegate));
 
   // Enable delayed TCP and set time delay for waiting job.
   QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory();
@@ -842,12 +855,12 @@
   EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
 
   // Make |alternative_job| succeed.
-  HttpStream* http_stream =
-      new HttpBasicStream(std::make_unique<ClientSocketHandle>(), false, false);
+  auto http_stream = std::make_unique<HttpBasicStream>(
+      std::make_unique<ClientSocketHandle>(), false, false);
+  EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, http_stream.get()));
 
-  EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, http_stream));
-
-  job_factory_.alternative_job()->SetStream(http_stream);
+  HttpStreamFactoryImplJobPeer::SetStream(job_factory_.alternative_job(),
+                                          std::move(http_stream));
   job_controller_->OnStreamReady(job_factory_.alternative_job(), SSLConfig());
 
   base::RunLoop().RunUntilIdle();
@@ -986,9 +999,10 @@
   EXPECT_TRUE(job_controller_->alternative_job());
 
   // Make |alternative_job| succeed.
-  HttpStream* http_stream =
-      new HttpBasicStream(std::make_unique<ClientSocketHandle>(), false, false);
-  job_factory_.alternative_job()->SetStream(http_stream);
+  auto http_stream = std::make_unique<HttpBasicStream>(
+      std::make_unique<ClientSocketHandle>(), false, false);
+  HttpStreamFactoryImplJobPeer::SetStream(job_factory_.alternative_job(),
+                                          std::move(http_stream));
   // This should not call request_delegate_::OnStreamReady.
   job_controller_->OnStreamReady(job_factory_.alternative_job(), SSLConfig());
   // Make sure that controller does not leak.
@@ -1029,12 +1043,12 @@
   base::RunLoop().RunUntilIdle();
 
   // Make |alternative_job| succeed.
-  HttpStream* http_stream =
-      new HttpBasicStream(std::make_unique<ClientSocketHandle>(), false, false);
+  auto http_stream = std::make_unique<HttpBasicStream>(
+      std::make_unique<ClientSocketHandle>(), false, false);
+  EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, http_stream.get()));
 
-  EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, http_stream));
-
-  job_factory_.alternative_job()->SetStream(http_stream);
+  HttpStreamFactoryImplJobPeer::SetStream(job_factory_.alternative_job(),
+                                          std::move(http_stream));
   job_controller_->OnStreamReady(job_factory_.alternative_job(), SSLConfig());
 
   // |alternative_job| succeeds and should report status to Request.
@@ -1164,12 +1178,14 @@
   job_controller_->GetLoadState();
 
   // |alternative_job| succeeds and should report status to Request.
-  HttpStream* http_stream =
-      new HttpBasicStream(std::make_unique<ClientSocketHandle>(), false, false);
-  job_factory_.alternative_job()->SetStream(http_stream);
+  auto http_stream = std::make_unique<HttpBasicStream>(
+      std::make_unique<ClientSocketHandle>(), false, false);
+  EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, http_stream.get()));
 
-  EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, http_stream));
+  HttpStreamFactoryImplJobPeer::SetStream(job_factory_.alternative_job(),
+                                          std::move(http_stream));
   job_controller_->OnStreamReady(job_factory_.alternative_job(), SSLConfig());
+
   request_.reset();
   EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
 }
@@ -1389,7 +1405,8 @@
       base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME);
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ProxyResolutionService::CreateDirect();
-  ProxyResolutionService* proxy_resolution_service_raw = proxy_resolution_service.get();
+  ProxyResolutionService* proxy_resolution_service_raw =
+      proxy_resolution_service.get();
   session_deps_.proxy_resolution_service = std::move(proxy_resolution_service);
 
   // Using hanging resolver will cause the alternative job to hang indefinitely.
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index 8a0d7968..b04ae54 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -885,6 +885,12 @@
   using CTRequirementLevel = RequireCTDelegate::CTRequirementLevel;
   std::string hostname = host_port_pair.host();
 
+  // CT is not required if the certificate does not chain to a publicly
+  // trusted root certificate. Testing can override this, as certain tests
+  // rely on using a non-publicly-trusted root.
+  if (!is_issued_by_known_root && g_ct_required_for_testing == 0)
+    return CT_NOT_REQUIRED;
+
   // A connection is considered compliant if it has sufficient SCTs or if the
   // build is outdated. Other statuses are not considered compliant; this
   // includes COMPLIANCE_DETAILS_NOT_AVAILABLE because compliance must have been
@@ -896,9 +902,9 @@
 
   // Check Expect-CT first so that other CT requirements do not prevent
   // Expect-CT reports from being sent.
+  bool required_via_expect_ct = false;
   ExpectCTState state;
-  if (is_issued_by_known_root && IsDynamicExpectCTEnabled() &&
-      GetDynamicExpectCTState(hostname, &state)) {
+  if (IsDynamicExpectCTEnabled() && GetDynamicExpectCTState(hostname, &state)) {
     UMA_HISTOGRAM_ENUMERATION(
         "Net.ExpectCTHeader.PolicyComplianceOnConnectionSetup",
         policy_compliance, ct::CTPolicyCompliance::CT_POLICY_MAX);
@@ -909,17 +915,27 @@
                                 served_certificate_chain,
                                 signed_certificate_timestamps);
     }
-    if (state.enforce)
-      return complies ? CT_REQUIREMENTS_MET : CT_REQUIREMENTS_NOT_MET;
+    required_via_expect_ct = state.enforce;
   }
 
   CTRequirementLevel ct_required = CTRequirementLevel::DEFAULT;
-  if (require_ct_delegate_)
+  if (require_ct_delegate_) {
+    // Allow the delegate to override the CT requirement state, including
+    // overriding any Expect-CT enforcement.
     ct_required = require_ct_delegate_->IsCTRequiredForHost(hostname);
-  if (ct_required != CTRequirementLevel::DEFAULT) {
-    if (ct_required == CTRequirementLevel::REQUIRED)
+  }
+  switch (ct_required) {
+    case CTRequirementLevel::REQUIRED:
       return complies ? CT_REQUIREMENTS_MET : CT_REQUIREMENTS_NOT_MET;
-    return CT_NOT_REQUIRED;
+    case CTRequirementLevel::NOT_REQUIRED:
+      return CT_NOT_REQUIRED;
+    case CTRequirementLevel::DEFAULT:
+      if (required_via_expect_ct) {
+        // If Expect-CT is set, short-circuit checking additional policies,
+        // since they will only enable CT requirement, not exclude from it.
+        return complies ? CT_REQUIREMENTS_MET : CT_REQUIREMENTS_NOT_MET;
+      }
+      break;
   }
 
   // Allow unittests to override the default result.
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc
index a09caf6..29e60ca 100644
--- a/net/http/transport_security_state_unittest.cc
+++ b/net/http/transport_security_state_unittest.cc
@@ -2224,6 +2224,9 @@
   hashes.push_back(
       HashValue(X509Certificate::CalculateFingerprint256(cert->cert_buffer())));
 
+  // If CT is required, then the requirements are not met if the CT policy
+  // wasn't met, but are met if the policy was met or the build was out of
+  // date.
   {
     TransportSecurityState state;
     const TransportSecurityState::CTRequirementsStatus original_status =
@@ -2276,6 +2279,8 @@
             ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
   }
 
+  // If CT is not required, then regardless of the CT state for the host,
+  // it should indicate CT is not required.
   {
     TransportSecurityState state;
     const TransportSecurityState::CTRequirementsStatus original_status =
@@ -2314,6 +2319,8 @@
             ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
   }
 
+  // If the Delegate is in the default state, then it should return the same
+  // result as if there was no delegate in the first place.
   {
     TransportSecurityState state;
     const TransportSecurityState::CTRequirementsStatus original_status =
@@ -2500,7 +2507,7 @@
       kFeatureName, base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get());
   scoped_feature_list.InitWithFeatureList(std::move(feature_list));
 
-  // It should fail if it doesn't comply with policy...
+  // It should fail if it doesn't comply with policy.
   EXPECT_EQ(TransportSecurityState::CT_REQUIREMENTS_NOT_MET,
             state.CheckCTRequirements(
                 HostPortPair("www.example.com", 443), true, hashes, cert.get(),
@@ -2508,7 +2515,7 @@
                 TransportSecurityState::DISABLE_EXPECT_CT_REPORTS,
                 ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
 
-  // ... and succeed if it does comply with policy ...
+  // It should succeed if it does comply with policy.
   EXPECT_EQ(TransportSecurityState::CT_REQUIREMENTS_MET,
             state.CheckCTRequirements(
                 HostPortPair("www.example.com", 443), true, hashes, cert.get(),
@@ -2516,13 +2523,21 @@
                 TransportSecurityState::DISABLE_EXPECT_CT_REPORTS,
                 ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS));
 
-  // ... or if the build is outdated.
+  // It should succeed if the build is outdated.
   EXPECT_EQ(TransportSecurityState::CT_REQUIREMENTS_MET,
             state.CheckCTRequirements(
                 HostPortPair("www.example.com", 443), true, hashes, cert.get(),
                 cert.get(), SignedCertificateTimestampAndStatusList(),
                 TransportSecurityState::DISABLE_EXPECT_CT_REPORTS,
                 ct::CTPolicyCompliance::CT_POLICY_BUILD_NOT_TIMELY));
+
+  // It should succeed if it was a locally-trusted CA.
+  EXPECT_EQ(TransportSecurityState::CT_NOT_REQUIRED,
+            state.CheckCTRequirements(
+                HostPortPair("www.example.com", 443), false, hashes, cert.get(),
+                cert.get(), SignedCertificateTimestampAndStatusList(),
+                TransportSecurityState::DISABLE_EXPECT_CT_REPORTS,
+                ct::CTPolicyCompliance::CT_POLICY_BUILD_NOT_TIMELY));
 }
 
 // Tests that Certificate Transparency is required for all of the Symantec
@@ -3121,6 +3136,62 @@
   EXPECT_EQ(sct_list[0].sct, reporter.signed_certificate_timestamps()[0].sct);
 }
 
+// Tests that for a host that explicitly disabled CT by delegate and is also
+// Expect-CT-enabled, CheckCTRequirements() sends reports.
+TEST_F(TransportSecurityStateTest,
+       CheckCTRequirementsWithExpectCTAndDelegateDisables) {
+  using ::testing::_;
+  using ::testing::Return;
+  using CTRequirementLevel =
+      TransportSecurityState::RequireCTDelegate::CTRequirementLevel;
+
+  const base::Time current_time(base::Time::Now());
+  const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
+  SignedCertificateTimestampAndStatusList sct_list;
+  MakeTestSCTAndStatus(ct::SignedCertificateTimestamp::SCT_EMBEDDED, "test_log",
+                       std::string(), std::string(), base::Time::Now(),
+                       ct::SCT_STATUS_INVALID_SIGNATURE, &sct_list);
+
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(
+      TransportSecurityState::kDynamicExpectCTFeature);
+
+  TransportSecurityState state;
+  MockExpectCTReporter reporter;
+  state.SetExpectCTReporter(&reporter);
+  state.AddExpectCT("example.test", expiry, false /* enforce */,
+                    GURL("https://example-report.test"));
+
+  // A connection to an Expect-CT host, which is exempted from the CT
+  // requirements by the delegate, should be reported but not closed.
+  MockRequireCTDelegate never_require_delegate;
+  EXPECT_CALL(never_require_delegate, IsCTRequiredForHost(_))
+      .WillRepeatedly(Return(CTRequirementLevel::NOT_REQUIRED));
+  state.SetRequireCTDelegate(&never_require_delegate);
+  EXPECT_EQ(TransportSecurityState::CT_NOT_REQUIRED,
+            state.CheckCTRequirements(
+                HostPortPair("example.test", 443), true, HashValueVector(),
+                cert1.get(), cert2.get(), sct_list,
+                TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+                ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
+  EXPECT_EQ(1u, reporter.num_failures());
+  EXPECT_EQ("example.test", reporter.host_port_pair().host());
+  EXPECT_EQ(443, reporter.host_port_pair().port());
+  EXPECT_EQ(expiry, reporter.expiration());
+  EXPECT_EQ(cert1.get(), reporter.validated_certificate_chain());
+  EXPECT_EQ(cert2.get(), reporter.served_certificate_chain());
+  EXPECT_EQ(sct_list.size(), reporter.signed_certificate_timestamps().size());
+  EXPECT_EQ(sct_list[0].status,
+            reporter.signed_certificate_timestamps()[0].status);
+  EXPECT_EQ(sct_list[0].sct, reporter.signed_certificate_timestamps()[0].sct);
+}
+
 // Tests that the dynamic Expect-CT UMA histogram is recorded correctly.
 TEST_F(TransportSecurityStateTest, DynamicExpectCTUMA) {
   const char kHistogramName[] = "Net.ExpectCTHeader.ParseSuccess";
diff --git a/net/network_error_logging/network_error_logging_service.cc b/net/network_error_logging/network_error_logging_service.cc
index b838000..6fdbcce 100644
--- a/net/network_error_logging/network_error_logging_service.cc
+++ b/net/network_error_logging/network_error_logging_service.cc
@@ -118,11 +118,6 @@
   return request.status_code >= 400 && request.status_code < 600;
 }
 
-bool RequestWasSuccessful(
-    const NetworkErrorLoggingService::RequestDetails& request) {
-  return request.type == OK && !IsHttpError(request);
-}
-
 enum class HeaderOutcome {
   DISCARDED_NO_NETWORK_ERROR_LOGGING_SERVICE = 0,
   DISCARDED_INVALID_SSL_INFO = 1,
@@ -234,28 +229,35 @@
       return;
     }
 
-    std::string type_string;
-    if (!GetTypeFromNetError(details.type, &type_string)) {
-      RecordRequestOutcome(RequestOutcome::DISCARDED_UNMAPPED_ERROR);
-      return;
-    }
-
+    Error type = details.type;
     // It is expected for Reporting uploads to terminate with ERR_ABORTED, since
     // the ReportingUploader cancels them after receiving the response code and
     // headers.
-    //
-    // (This check would go earlier, but the histogram bucket will be more
-    // meaningful if it only includes reports that otherwise could have been
-    // uploaded.)
-    if (details.is_reporting_upload && details.type == ERR_ABORTED) {
-      RecordRequestOutcome(RequestOutcome::DISCARDED_REPORTING_UPLOAD);
+    if (details.reporting_upload_depth > 0 && type == ERR_ABORTED) {
+      // TODO(juliatuttle): Modify ReportingUploader to drain successful uploads
+      // instead of aborting them, so NEL can properly report on aborted
+      // requests.
+      type = OK;
+    }
+
+    std::string type_string;
+    if (!GetTypeFromNetError(type, &type_string)) {
+      RecordRequestOutcome(RequestOutcome::DISCARDED_UNMAPPED_ERROR);
       return;
     }
 
     if (IsHttpError(details))
       type_string = kHttpErrorType;
 
-    bool success = RequestWasSuccessful(details);
+    // This check would go earlier, but the histogram bucket will be more
+    // meaningful if it only includes reports that otherwise could have been
+    // uploaded.
+    if (details.reporting_upload_depth > kMaxNestedReportDepth) {
+      RecordRequestOutcome(RequestOutcome::DISCARDED_REPORTING_UPLOAD);
+      return;
+    }
+
+    bool success = (type == OK) && !IsHttpError(details);
     double sampling_fraction =
         success ? policy->success_fraction : policy->failure_fraction;
     if (base::RandDouble() >= sampling_fraction) {
@@ -267,7 +269,8 @@
 
     reporting_service_->QueueReport(
         details.uri, policy->report_to, kReportType,
-        CreateReportBody(type_string, sampling_fraction, details));
+        CreateReportBody(type_string, sampling_fraction, details),
+        details.reporting_upload_depth);
     RecordRequestOutcome(RequestOutcome::QUEUED);
   }
 
@@ -500,6 +503,15 @@
 const char NetworkErrorLoggingService::kHeaderName[] = "NEL";
 
 const char NetworkErrorLoggingService::kReportType[] = "network-error";
+
+// Allow NEL reports on regular requests, plus NEL reports on Reporting uploads
+// containing only regular requests, but do not allow NEL reports on Reporting
+// uploads containing Reporting uploads.
+//
+// This prevents origins from building purposefully-broken Reporting endpoints
+// that generate new NEL reports to bypass the age limit on Reporting reports.
+const int NetworkErrorLoggingService::kMaxNestedReportDepth = 1;
+
 const char NetworkErrorLoggingService::kUriKey[] = "uri";
 const char NetworkErrorLoggingService::kReferrerKey[] = "referrer";
 const char NetworkErrorLoggingService::kSamplingFractionKey[] =
diff --git a/net/network_error_logging/network_error_logging_service.h b/net/network_error_logging/network_error_logging_service.h
index c41ae83..e63ece2 100644
--- a/net/network_error_logging/network_error_logging_service.h
+++ b/net/network_error_logging/network_error_logging_service.h
@@ -56,13 +56,22 @@
     base::TimeDelta elapsed_time;
     Error type;
 
-    bool is_reporting_upload;
+    // Upload nesting depth of this request.
+    //
+    // If the request is not a Reporting upload, the depth is 0.
+    //
+    // If the request is a Reporting upload, the depth is the max of the depth
+    // of the requests reported within it plus 1. (Non-NEL reports are
+    // considered to have depth 0.)
+    int reporting_upload_depth;
   };
 
   static const char kHeaderName[];
 
   static const char kReportType[];
 
+  static const int kMaxNestedReportDepth;
+
   // Keys for data included in report bodies. Exposed for tests.
 
   static const char kUriKey[];
diff --git a/net/network_error_logging/network_error_logging_service_unittest.cc b/net/network_error_logging/network_error_logging_service_unittest.cc
index 0cc3ab42..79d9681 100644
--- a/net/network_error_logging/network_error_logging_service_unittest.cc
+++ b/net/network_error_logging/network_error_logging_service_unittest.cc
@@ -35,13 +35,19 @@
         : url(other.url),
           group(other.group),
           type(other.type),
-          body(std::move(other.body)) {}
+          body(std::move(other.body)),
+          depth(other.depth) {}
 
     Report(const GURL& url,
            const std::string& group,
            const std::string& type,
-           std::unique_ptr<const base::Value> body)
-        : url(url), group(group), type(type), body(std::move(body)) {}
+           std::unique_ptr<const base::Value> body,
+           int depth)
+        : url(url),
+          group(group),
+          type(type),
+          body(std::move(body)),
+          depth(depth) {}
 
     ~Report() = default;
 
@@ -49,6 +55,7 @@
     std::string group;
     std::string type;
     std::unique_ptr<const base::Value> body;
+    int depth;
 
    private:
     DISALLOW_COPY(Report);
@@ -65,8 +72,9 @@
   void QueueReport(const GURL& url,
                    const std::string& group,
                    const std::string& type,
-                   std::unique_ptr<const base::Value> body) override {
-    reports_.push_back(Report(url, group, type, std::move(body)));
+                   std::unique_ptr<const base::Value> body,
+                   int depth) override {
+    reports_.push_back(Report(url, group, type, std::move(body), depth));
   }
 
   void ProcessHeader(const GURL& url,
@@ -80,9 +88,9 @@
     NOTREACHED();
   }
 
-  bool RequestIsUpload(const URLRequest& request) override {
+  int GetUploadDepth(const URLRequest& request) override {
     NOTREACHED();
-    return true;
+    return 0;
   }
 
   const ReportingPolicy& GetPolicy() const override {
@@ -130,7 +138,7 @@
     details.status_code = status_code;
     details.elapsed_time = base::TimeDelta::FromSeconds(1);
     details.type = error_type;
-    details.is_reporting_upload = false;
+    details.reporting_upload_depth = 0;
 
     return details;
   }
@@ -240,6 +248,7 @@
   EXPECT_EQ(kUrl_, reports()[0].url);
   EXPECT_EQ(kGroup_, reports()[0].group);
   EXPECT_EQ(kType_, reports()[0].type);
+  EXPECT_EQ(0, reports()[0].depth);
 
   const base::DictionaryValue* body;
   ASSERT_TRUE(reports()[0].body->GetAsDictionary(&body));
@@ -273,6 +282,7 @@
   EXPECT_EQ(kUrl_, reports()[0].url);
   EXPECT_EQ(kGroup_, reports()[0].group);
   EXPECT_EQ(kType_, reports()[0].type);
+  EXPECT_EQ(0, reports()[0].depth);
 
   const base::DictionaryValue* body;
   ASSERT_TRUE(reports()[0].body->GetAsDictionary(&body));
@@ -306,6 +316,7 @@
   EXPECT_EQ(kUrl_, reports()[0].url);
   EXPECT_EQ(kGroup_, reports()[0].group);
   EXPECT_EQ(kType_, reports()[0].type);
+  EXPECT_EQ(0, reports()[0].depth);
 
   const base::DictionaryValue* body;
   ASSERT_TRUE(reports()[0].body->GetAsDictionary(&body));
@@ -508,5 +519,31 @@
   ASSERT_EQ(1u, reports().size());
 }
 
+TEST_F(NetworkErrorLoggingServiceTest, Nested) {
+  service()->OnHeader(kOrigin_, kHeader_);
+
+  NetworkErrorLoggingService::RequestDetails details =
+      MakeRequestDetails(kUrl_, ERR_CONNECTION_REFUSED);
+  details.reporting_upload_depth =
+      NetworkErrorLoggingService::kMaxNestedReportDepth;
+  service()->OnRequest(details);
+
+  ASSERT_EQ(1u, reports().size());
+  EXPECT_EQ(NetworkErrorLoggingService::kMaxNestedReportDepth,
+            reports()[0].depth);
+}
+
+TEST_F(NetworkErrorLoggingServiceTest, NestedTooDeep) {
+  service()->OnHeader(kOrigin_, kHeader_);
+
+  NetworkErrorLoggingService::RequestDetails details =
+      MakeRequestDetails(kUrl_, ERR_CONNECTION_REFUSED);
+  details.reporting_upload_depth =
+      NetworkErrorLoggingService::kMaxNestedReportDepth + 1;
+  service()->OnRequest(details);
+
+  EXPECT_TRUE(reports().empty());
+}
+
 }  // namespace
 }  // namespace net
diff --git a/net/reporting/reporting_browsing_data_remover_unittest.cc b/net/reporting/reporting_browsing_data_remover_unittest.cc
index 3d8d10d81..7e720e98 100644
--- a/net/reporting/reporting_browsing_data_remover_unittest.cc
+++ b/net/reporting/reporting_browsing_data_remover_unittest.cc
@@ -41,7 +41,7 @@
 
   void AddReport(const GURL& url) {
     cache()->AddReport(url, kGroup_, kType_,
-                       std::make_unique<base::DictionaryValue>(),
+                       std::make_unique<base::DictionaryValue>(), 0,
                        tick_clock()->NowTicks(), 0);
   }
 
diff --git a/net/reporting/reporting_cache.cc b/net/reporting/reporting_cache.cc
index 14a61c2..4d4a1d0 100644
--- a/net/reporting/reporting_cache.cc
+++ b/net/reporting/reporting_cache.cc
@@ -67,10 +67,11 @@
                  const std::string& group,
                  const std::string& type,
                  std::unique_ptr<const base::Value> body,
+                 int depth,
                  base::TimeTicks queued,
                  int attempts) override {
     auto report = std::make_unique<ReportingReport>(
-        url, group, type, std::move(body), queued, attempts);
+        url, group, type, std::move(body), depth, queued, attempts);
 
     auto inserted =
         reports_.insert(std::make_pair(report.get(), std::move(report)));
diff --git a/net/reporting/reporting_cache.h b/net/reporting/reporting_cache.h
index e948748..a395f7f 100644
--- a/net/reporting/reporting_cache.h
+++ b/net/reporting/reporting_cache.h
@@ -47,6 +47,7 @@
                          const std::string& group,
                          const std::string& type,
                          std::unique_ptr<const base::Value> body,
+                         int depth,
                          base::TimeTicks queued,
                          int attempts) = 0;
 
diff --git a/net/reporting/reporting_cache_unittest.cc b/net/reporting/reporting_cache_unittest.cc
index 6e447fcf..de65ee4 100644
--- a/net/reporting/reporting_cache_unittest.cc
+++ b/net/reporting/reporting_cache_unittest.cc
@@ -94,7 +94,7 @@
   EXPECT_TRUE(reports.empty());
 
   cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                     std::make_unique<base::DictionaryValue>(), kNow_, 0);
+                     std::make_unique<base::DictionaryValue>(), 0, kNow_, 0);
   EXPECT_EQ(1, observer()->cache_update_count());
 
   cache()->GetReports(&reports);
@@ -128,9 +128,9 @@
 
 TEST_F(ReportingCacheTest, RemoveAllReports) {
   cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                     std::make_unique<base::DictionaryValue>(), kNow_, 0);
+                     std::make_unique<base::DictionaryValue>(), 0, kNow_, 0);
   cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                     std::make_unique<base::DictionaryValue>(), kNow_, 0);
+                     std::make_unique<base::DictionaryValue>(), 0, kNow_, 0);
   EXPECT_EQ(2, observer()->cache_update_count());
 
   std::vector<const ReportingReport*> reports;
@@ -146,7 +146,7 @@
 
 TEST_F(ReportingCacheTest, RemovePendingReports) {
   cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                     std::make_unique<base::DictionaryValue>(), kNow_, 0);
+                     std::make_unique<base::DictionaryValue>(), 0, kNow_, 0);
   EXPECT_EQ(1, observer()->cache_update_count());
 
   std::vector<const ReportingReport*> reports;
@@ -177,7 +177,7 @@
 
 TEST_F(ReportingCacheTest, RemoveAllPendingReports) {
   cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                     std::make_unique<base::DictionaryValue>(), kNow_, 0);
+                     std::make_unique<base::DictionaryValue>(), 0, kNow_, 0);
   EXPECT_EQ(1, observer()->cache_update_count());
 
   std::vector<const ReportingReport*> reports;
@@ -410,7 +410,7 @@
   // Enqueue the maximum number of reports, spaced apart in time.
   for (size_t i = 0; i < max_report_count; ++i) {
     cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                       std::make_unique<base::DictionaryValue>(),
+                       std::make_unique<base::DictionaryValue>(), 0,
                        tick_clock()->NowTicks(), 0);
     tick_clock()->Advance(base::TimeDelta::FromMinutes(1));
   }
@@ -418,7 +418,7 @@
 
   // Add one more report to force the cache to evict one.
   cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                     std::make_unique<base::DictionaryValue>(), kNow_, 0);
+                     std::make_unique<base::DictionaryValue>(), 0, kNow_, 0);
 
   // Make sure the cache evicted a report to make room for the new one, and make
   // sure the report evicted was the earliest-queued one.
@@ -438,7 +438,7 @@
   // Enqueue the maximum number of reports, spaced apart in time.
   for (size_t i = 0; i < max_report_count; ++i) {
     cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                       std::make_unique<base::DictionaryValue>(),
+                       std::make_unique<base::DictionaryValue>(), 0,
                        tick_clock()->NowTicks(), 0);
     tick_clock()->Advance(base::TimeDelta::FromMinutes(1));
   }
@@ -452,7 +452,7 @@
   // Add one more report to force the cache to evict one. Since the cache has
   // only pending reports, it will be forced to evict the *new* report!
   cache()->AddReport(kUrl1_, kGroup1_, kType_,
-                     std::make_unique<base::DictionaryValue>(), kNow_, 0);
+                     std::make_unique<base::DictionaryValue>(), 0, kNow_, 0);
 
   // Make sure the cache evicted a report, and make sure the report evicted was
   // the new, non-pending one.
diff --git a/net/reporting/reporting_delivery_agent.cc b/net/reporting/reporting_delivery_agent.cc
index 7a3ab2e..7419430 100644
--- a/net/reporting/reporting_delivery_agent.cc
+++ b/net/reporting/reporting_delivery_agent.cc
@@ -180,11 +180,16 @@
       std::string json;
       SerializeReports(reports, tick_clock()->NowTicks(), &json);
 
-      for (const ReportingReport* report : reports)
+      int max_depth = 0;
+      for (const ReportingReport* report : reports) {
         undelivered_reports.erase(report);
+        if (report->depth > max_depth)
+          max_depth = report->depth;
+      }
 
+      // TODO: Calculate actual max depth.
       uploader()->StartUpload(
-          endpoint, json,
+          endpoint, json, max_depth,
           base::BindOnce(
               &ReportingDeliveryAgentImpl::OnUploadComplete,
               weak_factory_.GetWeakPtr(),
diff --git a/net/reporting/reporting_delivery_agent_unittest.cc b/net/reporting/reporting_delivery_agent_unittest.cc
index c5b1a418..afd1f89 100644
--- a/net/reporting/reporting_delivery_agent_unittest.cc
+++ b/net/reporting/reporting_delivery_agent_unittest.cc
@@ -64,7 +64,7 @@
   body.SetString("key", "value");
 
   SetClient(kOrigin_, kEndpoint_, kGroup_);
-  cache()->AddReport(kUrl_, kGroup_, kType_, body.CreateDeepCopy(),
+  cache()->AddReport(kUrl_, kGroup_, kType_, body.CreateDeepCopy(), 0,
                      tick_clock()->NowTicks(), 0);
 
   tick_clock()->Advance(base::TimeDelta::FromMilliseconds(kAgeMillis));
@@ -103,7 +103,7 @@
 TEST_F(ReportingDeliveryAgentTest, FailedUpload) {
   SetClient(kOrigin_, kEndpoint_, kGroup_);
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -137,7 +137,7 @@
   body.SetString("key", "value");
 
   SetClient(kOrigin_, kEndpoint_, kGroup_);
-  cache()->AddReport(kUrl_, kGroup_, kType_, body.CreateDeepCopy(),
+  cache()->AddReport(kUrl_, kGroup_, kType_, body.CreateDeepCopy(), 0,
                      tick_clock()->NowTicks(), 0);
 
   tick_clock()->Advance(base::TimeDelta::FromMilliseconds(kAgeMillis));
@@ -165,7 +165,7 @@
   ASSERT_TRUE(FindClientInCache(cache(), kDifferentOrigin, kEndpoint_));
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -194,7 +194,7 @@
 TEST_F(ReportingDeliveryAgentTest, ConcurrentRemove) {
   SetClient(kOrigin_, kEndpoint_, kGroup_);
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -233,7 +233,7 @@
 
   SetClient(kOrigin_, kEndpoint_, kGroup_);
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -277,10 +277,10 @@
   SetClient(kDifferentOrigin, kEndpoint_, kGroup_);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   cache()->AddReport(kDifferentUrl, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -303,7 +303,7 @@
   SetClient(kDifferentOrigin, kEndpoint_, kGroup_);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -311,7 +311,7 @@
   EXPECT_EQ(1u, pending_uploads().size());
 
   cache()->AddReport(kDifferentUrl, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -339,7 +339,7 @@
   SetClient(kOrigin_, kDifferentEndpoint, kGroup_);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -347,7 +347,7 @@
   EXPECT_EQ(1u, pending_uploads().size());
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
@@ -375,10 +375,10 @@
   SetClient(kOrigin_, kDifferentEndpoint, kDifferentGroup);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   cache()->AddReport(kUrl_, kDifferentGroup, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(delivery_timer()->IsRunning());
diff --git a/net/reporting/reporting_garbage_collector_unittest.cc b/net/reporting/reporting_garbage_collector_unittest.cc
index 3aac7abf..5ae177b 100644
--- a/net/reporting/reporting_garbage_collector_unittest.cc
+++ b/net/reporting/reporting_garbage_collector_unittest.cc
@@ -41,7 +41,7 @@
   EXPECT_FALSE(garbage_collection_timer()->IsRunning());
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   EXPECT_TRUE(garbage_collection_timer()->IsRunning());
@@ -53,7 +53,7 @@
 
 TEST_F(ReportingGarbageCollectorTest, Report) {
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   garbage_collection_timer()->Fire();
 
@@ -62,7 +62,7 @@
 
 TEST_F(ReportingGarbageCollectorTest, ExpiredReport) {
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   tick_clock()->Advance(2 * policy().max_report_age);
   garbage_collection_timer()->Fire();
@@ -72,7 +72,7 @@
 
 TEST_F(ReportingGarbageCollectorTest, FailedReport) {
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
 
   std::vector<const ReportingReport*> reports;
diff --git a/net/reporting/reporting_network_change_observer_unittest.cc b/net/reporting/reporting_network_change_observer_unittest.cc
index ae35fbda8..db1aabc 100644
--- a/net/reporting/reporting_network_change_observer_unittest.cc
+++ b/net/reporting/reporting_network_change_observer_unittest.cc
@@ -65,7 +65,7 @@
   UsePolicy(new_policy);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   SetClient();
   ASSERT_EQ(1u, report_count());
@@ -84,7 +84,7 @@
   UsePolicy(new_policy);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   SetClient();
   ASSERT_EQ(1u, report_count());
@@ -103,7 +103,7 @@
   UsePolicy(new_policy);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   SetClient();
   ASSERT_EQ(1u, report_count());
@@ -122,7 +122,7 @@
   UsePolicy(new_policy);
 
   cache()->AddReport(kUrl_, kGroup_, kType_,
-                     std::make_unique<base::DictionaryValue>(),
+                     std::make_unique<base::DictionaryValue>(), 0,
                      tick_clock()->NowTicks(), 0);
   SetClient();
   ASSERT_EQ(1u, report_count());
diff --git a/net/reporting/reporting_report.cc b/net/reporting/reporting_report.cc
index 2a594841..c6dd8204 100644
--- a/net/reporting/reporting_report.cc
+++ b/net/reporting/reporting_report.cc
@@ -28,12 +28,14 @@
                                  const std::string& group,
                                  const std::string& type,
                                  std::unique_ptr<const base::Value> body,
+                                 int depth,
                                  base::TimeTicks queued,
                                  int attempts)
     : url(url),
       group(group),
       type(type),
       body(std::move(body)),
+      depth(depth),
       queued(queued),
       attempts(attempts),
       outcome(Outcome::UNKNOWN),
diff --git a/net/reporting/reporting_report.h b/net/reporting/reporting_report.h
index e7fba5d..196be9e 100644
--- a/net/reporting/reporting_report.h
+++ b/net/reporting/reporting_report.h
@@ -41,6 +41,7 @@
                   const std::string& group,
                   const std::string& type,
                   std::unique_ptr<const base::Value> body,
+                  int depth,
                   base::TimeTicks queued,
                   int attempts);
   ~ReportingReport();
@@ -64,6 +65,11 @@
   // The body of the report. (Included in the delivered report.)
   std::unique_ptr<const base::Value> body;
 
+  // How many uploads deep the related request was: 0 if the related request was
+  // not an upload (or there was no related request), or n+1 if it was an upload
+  // reporting on requests of at most depth n.
+  int depth;
+
   // When the report was queued. (Included in the delivered report as an age
   // relative to the time of the delivery attempt.)
   base::TimeTicks queued;
diff --git a/net/reporting/reporting_service.cc b/net/reporting/reporting_service.cc
index 24be577..ce1efb0 100644
--- a/net/reporting/reporting_service.cc
+++ b/net/reporting/reporting_service.cc
@@ -36,14 +36,15 @@
   void QueueReport(const GURL& url,
                    const std::string& group,
                    const std::string& type,
-                   std::unique_ptr<const base::Value> body) override {
+                   std::unique_ptr<const base::Value> body,
+                   int depth) override {
     DCHECK(context_);
     DCHECK(context_->delegate());
 
     if (!context_->delegate()->CanQueueReport(url::Origin::Create(url)))
       return;
 
-    context_->cache()->AddReport(url, group, type, std::move(body),
+    context_->cache()->AddReport(url, group, type, std::move(body), depth,
                                  context_->tick_clock()->NowTicks(), 0);
   }
 
@@ -64,8 +65,8 @@
         context_->cache(), data_type_mask, origin_filter);
   }
 
-  bool RequestIsUpload(const URLRequest& request) override {
-    return context_->uploader()->RequestIsUpload(request);
+  int GetUploadDepth(const URLRequest& request) override {
+    return context_->uploader()->GetUploadDepth(request);
   }
 
   const ReportingPolicy& GetPolicy() const override {
diff --git a/net/reporting/reporting_service.h b/net/reporting/reporting_service.h
index 37958702..b165cdcd 100644
--- a/net/reporting/reporting_service.h
+++ b/net/reporting/reporting_service.h
@@ -53,7 +53,8 @@
   virtual void QueueReport(const GURL& url,
                            const std::string& group,
                            const std::string& type,
-                           std::unique_ptr<const base::Value> body) = 0;
+                           std::unique_ptr<const base::Value> body,
+                           int depth) = 0;
 
   // Processes a Report-To header. |url| is the URL that originated the header;
   // |header_value| is the normalized value of the Report-To header.
@@ -66,9 +67,9 @@
       int data_type_mask,
       const base::RepeatingCallback<bool(const GURL&)>& origin_filter) = 0;
 
-  // Checks whether |request| is a Reporting upload, to avoid loops of reporting
-  // about report uploads.
-  virtual bool RequestIsUpload(const URLRequest& request) = 0;
+  // Checks how many uploads deep |request| is: 0 if it's not an upload, n+1 if
+  // it's an upload reporting on requests of at most depth n.
+  virtual int GetUploadDepth(const URLRequest& request) = 0;
 
   virtual const ReportingPolicy& GetPolicy() const = 0;
 
diff --git a/net/reporting/reporting_service_unittest.cc b/net/reporting/reporting_service_unittest.cc
index 6b9f303..c0dd7fe5 100644
--- a/net/reporting/reporting_service_unittest.cc
+++ b/net/reporting/reporting_service_unittest.cc
@@ -48,7 +48,7 @@
 
 TEST_F(ReportingServiceTest, QueueReport) {
   service()->QueueReport(kUrl_, kGroup_, kType_,
-                         std::make_unique<base::DictionaryValue>());
+                         std::make_unique<base::DictionaryValue>(), 0);
 
   std::vector<const ReportingReport*> reports;
   context()->cache()->GetReports(&reports);
diff --git a/net/reporting/reporting_test_util.cc b/net/reporting/reporting_test_util.cc
index e998b58..e87f889 100644
--- a/net/reporting/reporting_test_util.cc
+++ b/net/reporting/reporting_test_util.cc
@@ -46,7 +46,7 @@
 
   ~PendingUploadImpl() override = default;
 
-  // PendingUpload implementationP:
+  // PendingUpload implementation:
   const GURL& url() const override { return url_; }
   const std::string& json() const override { return json_; }
   std::unique_ptr<base::Value> GetValue() const override {
@@ -100,15 +100,16 @@
 
 void TestReportingUploader::StartUpload(const GURL& url,
                                         const std::string& json,
+                                        int max_depth,
                                         UploadCallback callback) {
   pending_uploads_.push_back(std::make_unique<PendingUploadImpl>(
       url, json, std::move(callback),
       base::BindOnce(&ErasePendingUpload, &pending_uploads_)));
 }
 
-bool TestReportingUploader::RequestIsUpload(const URLRequest& request) {
+int TestReportingUploader::GetUploadDepth(const URLRequest& request) {
   NOTIMPLEMENTED();
-  return true;
+  return 0;
 }
 
 TestReportingDelegate::TestReportingDelegate()
diff --git a/net/reporting/reporting_test_util.h b/net/reporting/reporting_test_util.h
index ff387ecf4..296827b 100644
--- a/net/reporting/reporting_test_util.h
+++ b/net/reporting/reporting_test_util.h
@@ -73,9 +73,10 @@
 
   void StartUpload(const GURL& url,
                    const std::string& json,
+                   int max_depth,
                    UploadCallback callback) override;
 
-  bool RequestIsUpload(const URLRequest& request) override;
+  int GetUploadDepth(const URLRequest& request) override;
 
  private:
   std::vector<std::unique_ptr<PendingUpload>> pending_uploads_;
diff --git a/net/reporting/reporting_uploader.cc b/net/reporting/reporting_uploader.cc
index 2353726..9cd1273 100644
--- a/net/reporting/reporting_uploader.cc
+++ b/net/reporting/reporting_uploader.cc
@@ -27,6 +27,10 @@
 class UploadUserData : public base::SupportsUserData::Data {
  public:
   static const void* const kUserDataKey;
+
+  UploadUserData(int depth) : depth(depth) {}
+
+  int depth;
 };
 
 // SetUserData needs a unique const void* to serve as the key, so create a const
@@ -77,6 +81,7 @@
 
   void StartUpload(const GURL& url,
                    const std::string& json,
+                   int max_depth,
                    UploadCallback callback) override {
     net::NetworkTrafficAnnotationTag traffic_annotation =
         net::DefineNetworkTrafficAnnotation("reporting", R"(
@@ -116,7 +121,7 @@
         ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
 
     request->SetUserData(UploadUserData::kUserDataKey,
-                         std::make_unique<UploadUserData>());
+                         std::make_unique<UploadUserData>(max_depth));
 
     // This inherently sets mode = "no-cors", but that doesn't matter, because
     // the origins that are included in the upload don't actually get to see
@@ -132,8 +137,10 @@
   }
 
   // static
-  bool RequestIsUpload(const net::URLRequest& request) override {
-    return request.GetUserData(UploadUserData::kUserDataKey);
+  int GetUploadDepth(const net::URLRequest& request) override {
+    UploadUserData* data = static_cast<UploadUserData*>(
+        request.GetUserData(UploadUserData::kUserDataKey));
+    return data ? data->depth + 1 : 0;
   }
 
   // URLRequest::Delegate implementation:
diff --git a/net/reporting/reporting_uploader.h b/net/reporting/reporting_uploader.h
index f6c65c7..b17c0c49 100644
--- a/net/reporting/reporting_uploader.h
+++ b/net/reporting/reporting_uploader.h
@@ -34,10 +34,11 @@
   // |url|, and calls |callback| when complete (whether successful or not).
   virtual void StartUpload(const GURL& url,
                            const std::string& json,
+                           int max_depth,
                            UploadCallback callback) = 0;
 
   // Returns whether |request| is an upload request sent by this uploader.
-  virtual bool RequestIsUpload(const URLRequest& request) = 0;
+  virtual int GetUploadDepth(const URLRequest& request) = 0;
 
   // Creates a real implementation of |ReportingUploader| that uploads reports
   // using |context|.
diff --git a/net/reporting/reporting_uploader_unittest.cc b/net/reporting/reporting_uploader_unittest.cc
index 9fcda4d..e417b08d 100644
--- a/net/reporting/reporting_uploader_unittest.cc
+++ b/net/reporting/reporting_uploader_unittest.cc
@@ -109,7 +109,8 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
+                         callback.callback());
   callback.WaitForCall();
 }
 
@@ -118,7 +119,8 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
+                         callback.callback());
   callback.WaitForCall();
 
   EXPECT_EQ(ReportingUploader::Outcome::SUCCESS, callback.outcome());
@@ -130,7 +132,7 @@
   ASSERT_TRUE(server_.ShutdownAndWaitUntilComplete());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(url, kUploadBody, callback.callback());
+  uploader_->StartUpload(url, kUploadBody, 0, callback.callback());
   callback.WaitForCall();
 
   EXPECT_EQ(ReportingUploader::Outcome::FAILURE, callback.outcome());
@@ -141,7 +143,8 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
+                         callback.callback());
   callback.WaitForCall();
 
   EXPECT_EQ(ReportingUploader::Outcome::FAILURE, callback.outcome());
@@ -153,7 +156,8 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
+                         callback.callback());
   callback.WaitForCall();
 
   EXPECT_EQ(ReportingUploader::Outcome::FAILURE, callback.outcome());
@@ -165,7 +169,8 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
+                         callback.callback());
   callback.WaitForCall();
 
   EXPECT_EQ(ReportingUploader::Outcome::REMOVE_ENDPOINT, callback.outcome());
@@ -207,7 +212,8 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
+                         callback.callback());
   callback.WaitForCall();
 
   EXPECT_TRUE(followed);
@@ -228,7 +234,8 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
+                         callback.callback());
   callback.WaitForCall();
 
   EXPECT_FALSE(followed);
@@ -254,7 +261,7 @@
   ASSERT_TRUE(cookie_callback.result());
 
   TestUploadCallback upload_callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
                          upload_callback.callback());
   upload_callback.WaitForCall();
 }
@@ -274,7 +281,7 @@
   ASSERT_TRUE(server_.Start());
 
   TestUploadCallback upload_callback;
-  uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+  uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
                          upload_callback.callback());
   upload_callback.WaitForCall();
 
@@ -312,7 +319,7 @@
 
   {
     TestUploadCallback callback;
-    uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+    uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
                            callback.callback());
     callback.WaitForCall();
   }
@@ -320,7 +327,7 @@
 
   {
     TestUploadCallback callback;
-    uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+    uploader_->StartUpload(server_.GetURL("/"), kUploadBody, 0,
                            callback.callback());
     callback.WaitForCall();
   }
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index b25448e..8895aa8 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -4,6 +4,8 @@
 
 #include "net/socket/client_socket_pool_manager.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
 #include "net/base/load_flags.h"
@@ -41,8 +43,8 @@
 // be the same as the limit for ws. Also note that Firefox uses a limit of 200.
 // See http://crbug.com/486800
 int g_max_sockets_per_group[] = {
-  6,  // NORMAL_SOCKET_POOL
-  255 // WEBSOCKET_SOCKET_POOL
+    6,   // NORMAL_SOCKET_POOL
+    255  // WEBSOCKET_SOCKET_POOL
 };
 
 static_assert(arraysize(g_max_sockets_per_group) ==
@@ -87,7 +89,7 @@
   scoped_refptr<SOCKSSocketParams> socks_params;
   std::unique_ptr<HostPortPair> proxy_host_port;
 
-  bool using_ssl = group_type == ClientSocketPoolManager::SSL_GROUP;
+  const bool using_ssl = group_type == ClientSocketPoolManager::SSL_GROUP;
   HostPortPair origin_host_port = endpoint;
 
   if (!using_ssl && session->params().testing_fixed_http_port != 0) {
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index 7c4108deb..91acc11 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -3796,6 +3796,10 @@
   cert_verifier_->AddResultForCert(server_cert.get(), verify_result, OK);
 
   // Set up the CT requirement and failure to comply.
+  base::ScopedClosureRunner cleanup(base::BindOnce(
+      &TransportSecurityState::SetShouldRequireCTForTesting, nullptr));
+  bool require_ct = true;
+  TransportSecurityState::SetShouldRequireCTForTesting(&require_ct);
   MockRequireCTDelegate require_ct_delegate;
   transport_security_state_->SetRequireCTDelegate(&require_ct_delegate);
   EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(_))
diff --git a/net/spdy/chromium/spdy_network_transaction_unittest.cc b/net/spdy/chromium/spdy_network_transaction_unittest.cc
index 9bd8130..f4b99e4 100644
--- a/net/spdy/chromium/spdy_network_transaction_unittest.cc
+++ b/net/spdy/chromium/spdy_network_transaction_unittest.cc
@@ -4613,10 +4613,9 @@
       CreateMockRead(resp, 3), CreateMockRead(body, 4),
       MockRead(ASYNC, 0, 0, 5),
   };
-  auto data = std::make_unique<SequencedSocketData>(reads, arraysize(reads),
-                                                    writes, arraysize(writes));
+  SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
 
-  helper.AddData(data.get());
+  helper.AddData(&data);
   TestCompletionCallback callback;
 
   int rv = trans->Start(&request_, callback.callback(), log_);
@@ -4723,8 +4722,8 @@
       MockRead(ASYNC, 0, 5)  // EOF
   };
 
-  auto data_proxy = std::make_unique<SequencedSocketData>(
-      reads2, arraysize(reads2), writes2, arraysize(writes2));
+  SequencedSocketData data_proxy(reads2, arraysize(reads2), writes2,
+                                 arraysize(writes2));
 
   // Create another request to www.example.org, but this time through a proxy.
   request_.method = "GET";
@@ -4736,7 +4735,7 @@
                                            std::move(session_deps_proxy));
 
   helper_proxy.RunPreTestSetup();
-  helper_proxy.AddData(data_proxy.get());
+  helper_proxy.AddData(&data_proxy);
 
   HttpNetworkTransaction* trans_proxy = helper_proxy.trans();
   TestCompletionCallback callback_proxy;
diff --git a/net/spdy/chromium/spdy_session.cc b/net/spdy/chromium/spdy_session.cc
index e129f268..7a89b55 100644
--- a/net/spdy/chromium/spdy_session.cc
+++ b/net/spdy/chromium/spdy_session.cc
@@ -25,8 +25,6 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "base/values.h"
-#include "crypto/ec_private_key.h"
-#include "crypto/ec_signature_creator.h"
 #include "net/base/url_util.h"
 #include "net/cert/asn1_util.h"
 #include "net/cert/cert_verify_result.h"
diff --git a/net/spdy/chromium/spdy_session.h b/net/spdy/chromium/spdy_session.h
index 47e25fa..54c16b44 100644
--- a/net/spdy/chromium/spdy_session.h
+++ b/net/spdy/chromium/spdy_session.h
@@ -53,6 +53,10 @@
 #include "url/gurl.h"
 #include "url/scheme_host_port.h"
 
+namespace crypto {
+class ECPrivateKey;
+}
+
 namespace net {
 
 namespace test {
diff --git a/net/spdy/chromium/spdy_session_pool.cc b/net/spdy/chromium/spdy_session_pool.cc
index c1134e66..b786ecfa 100644
--- a/net/spdy/chromium/spdy_session_pool.cc
+++ b/net/spdy/chromium/spdy_session_pool.cc
@@ -149,17 +149,10 @@
       net_log.AddEvent(
           NetLogEventType::HTTP2_SESSION_POOL_FOUND_EXISTING_SESSION,
           it->second->net_log().source().ToEventParametersCallback());
-    } else {
-      if (!enable_ip_based_pooling) {
-        // Remove session from available sessions and from aliases, and remove
-        // key from the session's pooled alias set, so that a new session can be
-        // created with this |key|.
-        it->second->RemovePooledAlias(key);
-        UnmapKey(key);
-        RemoveAliases(key);
-        return base::WeakPtr<SpdySession>();
-      }
+      return it->second;
+    }
 
+    if (enable_ip_based_pooling) {
       UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet",
                                 FOUND_EXISTING_FROM_IP_POOL,
                                 SPDY_SESSION_GET_MAX);
@@ -167,8 +160,16 @@
           NetLogEventType::
               HTTP2_SESSION_POOL_FOUND_EXISTING_SESSION_FROM_IP_POOL,
           it->second->net_log().source().ToEventParametersCallback());
+      return it->second;
     }
-    return it->second;
+
+    // Remove session from available sessions and from aliases, and remove
+    // key from the session's pooled alias set, so that a new session can be
+    // created with this |key|.
+    it->second->RemovePooledAlias(key);
+    UnmapKey(key);
+    RemoveAliases(key);
+    return base::WeakPtr<SpdySession>();
   }
 
   if (!enable_ip_based_pooling)
diff --git a/net/spdy/chromium/spdy_stream.cc b/net/spdy/chromium/spdy_stream.cc
index 98a526c..dee8a868f 100644
--- a/net/spdy/chromium/spdy_stream.cc
+++ b/net/spdy/chromium/spdy_stream.cc
@@ -733,6 +733,12 @@
   return session_->GetSSLInfo(ssl_info);
 }
 
+Error SpdyStream::GetTokenBindingSignature(crypto::ECPrivateKey* key,
+                                           TokenBindingType tb_type,
+                                           std::vector<uint8_t>* out) const {
+  return session_->GetTokenBindingSignature(key, tb_type, out);
+}
+
 bool SpdyStream::WasAlpnNegotiated() const {
   return session_->WasAlpnNegotiated();
 }
diff --git a/net/spdy/chromium/spdy_stream.h b/net/spdy/chromium/spdy_stream.h
index f1580c57..8095dc2c 100644
--- a/net/spdy/chromium/spdy_stream.h
+++ b/net/spdy/chromium/spdy_stream.h
@@ -28,9 +28,14 @@
 #include "net/spdy/core/spdy_protocol.h"
 #include "net/spdy/platform/api/spdy_string.h"
 #include "net/ssl/ssl_client_cert_type.h"
+#include "net/ssl/token_binding.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "url/gurl.h"
 
+namespace crypto {
+class ECPrivateKey;
+}
+
 namespace net {
 
 class IPEndPoint;
@@ -329,6 +334,13 @@
   // Fills SSL info in |ssl_info| and returns true when SSL is in use.
   bool GetSSLInfo(SSLInfo* ssl_info) const;
 
+  // Generates the signature used in Token Binding using |*key| and for a Token
+  // Binding of type |tb_type|, putting the signature in |*out|. Returns OK or
+  // ERR_FAILED.
+  Error GetTokenBindingSignature(crypto::ECPrivateKey* key,
+                                 TokenBindingType tb_type,
+                                 std::vector<uint8_t>* out) const;
+
   // Returns true if ALPN was negotiated for the underlying socket.
   bool WasAlpnNegotiated() const;
 
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
index 8e18063..335c87f 100644
--- a/net/url_request/url_request.cc
+++ b/net/url_request/url_request.cc
@@ -31,6 +31,7 @@
 #include "net/log/net_log.h"
 #include "net/log/net_log_event_type.h"
 #include "net/log/net_log_source_type.h"
+#include "net/socket/next_proto.h"
 #include "net/ssl/ssl_cert_request_info.h"
 #include "net/url_request/redirect_info.h"
 #include "net/url_request/redirect_util.h"
@@ -701,7 +702,7 @@
 }
 
 int URLRequest::DoCancel(int error, const SSLInfo& ssl_info) {
-  DCHECK(error < 0);
+  DCHECK_LT(error, 0);
   // If cancelled while calling a delegate, clear delegate info.
   if (calling_delegate_) {
     LogUnblocked();
@@ -1196,9 +1197,12 @@
       base::TimeTicks::Now() - load_timing_info_.request_start;
   details.type = status().ToNetError();
 
-  details.is_reporting_upload =
-      context()->reporting_service() &&
-      context()->reporting_service()->RequestIsUpload(*this);
+  if (context()->reporting_service()) {
+    details.reporting_upload_depth =
+        context()->reporting_service()->GetUploadDepth(*this);
+  } else {
+    details.reporting_upload_depth = 0;
+  }
 
   service->OnRequest(details);
 }
diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h
index 66255620..3a526cc8 100644
--- a/net/url_request/url_request_context_builder.h
+++ b/net/url_request/url_request_context_builder.h
@@ -39,7 +39,6 @@
 #include "net/proxy_resolution/proxy_config_service.h"
 #include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/quic/core/quic_packets.h"
-#include "net/socket/next_proto.h"
 #include "net/ssl/ssl_config_service.h"
 #include "net/url_request/url_request_job_factory.h"
 
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc
index 3ce02ad..7c601a7a 100644
--- a/net/url_request/url_request_http_job_unittest.cc
+++ b/net/url_request/url_request_http_job_unittest.cc
@@ -30,6 +30,7 @@
 #include "net/log/test_net_log_entry.h"
 #include "net/log/test_net_log_util.h"
 #include "net/net_buildflags.h"
+#include "net/socket/next_proto.h"
 #include "net/socket/socket_test_util.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/gtest_util.h"
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 023a29af..dc599e8 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -7116,7 +7116,8 @@
   void QueueReport(const GURL& url,
                    const std::string& group,
                    const std::string& type,
-                   std::unique_ptr<const base::Value> body) override {
+                   std::unique_ptr<const base::Value> body,
+                   int depth) override {
     NOTIMPLEMENTED();
   }
 
@@ -7131,9 +7132,9 @@
     NOTIMPLEMENTED();
   }
 
-  bool RequestIsUpload(const URLRequest& request) override {
+  int GetUploadDepth(const URLRequest& request) override {
     NOTIMPLEMENTED();
-    return true;
+    return 0;
   }
 
   const ReportingPolicy& GetPolicy() const override {
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc
index 8cf6c78..7bc25ed 100644
--- a/net/websockets/websocket_basic_handshake_stream.cc
+++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -32,6 +32,7 @@
 #include "net/http/http_status_code.h"
 #include "net/http/http_stream_parser.h"
 #include "net/socket/client_socket_handle.h"
+#include "net/socket/ssl_client_socket.h"
 #include "net/socket/websocket_transport_client_socket_pool.h"
 #include "net/websockets/websocket_basic_stream.h"
 #include "net/websockets/websocket_basic_stream_adapters.h"
@@ -334,8 +335,12 @@
     crypto::ECPrivateKey* key,
     TokenBindingType tb_type,
     std::vector<uint8_t>* out) {
-  NOTREACHED();
-  return ERR_NOT_IMPLEMENTED;
+  DCHECK(url_.SchemeIsCryptographic());
+
+  // Encrypted WebSocket must use an SSL socket.
+  StreamSocket* socket = state_.connection()->socket();
+  SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(socket);
+  return ssl_socket->GetTokenBindingSignature(key, tb_type, out);
 }
 
 void WebSocketBasicHandshakeStream::Drain(HttpNetworkSession* session) {
diff --git a/net/websockets/websocket_http2_handshake_stream.cc b/net/websockets/websocket_http2_handshake_stream.cc
index bd99b759..c7c5352 100644
--- a/net/websockets/websocket_http2_handshake_stream.cc
+++ b/net/websockets/websocket_http2_handshake_stream.cc
@@ -220,8 +220,7 @@
     crypto::ECPrivateKey* key,
     TokenBindingType tb_type,
     std::vector<uint8_t>* out) {
-  NOTREACHED();
-  return ERR_NOT_IMPLEMENTED;
+  return stream_->GetTokenBindingSignature(key, tb_type, out);
 }
 
 void WebSocketHttp2HandshakeStream::Drain(HttpNetworkSession* session) {
diff --git a/rlz/lib/financial_ping.cc b/rlz/lib/financial_ping.cc
index bf4ed584..e9adde4a 100644
--- a/rlz/lib/financial_ping.cc
+++ b/rlz/lib/financial_ping.cc
@@ -334,9 +334,10 @@
 }
 #endif
 
-bool FinancialPing::PingServer(const char* request, std::string* response) {
+FinancialPing::PingResponse FinancialPing::PingServer(const char* request,
+                                                      std::string* response) {
   if (!response)
-    return false;
+    return PING_FAILURE;
 
   response->clear();
 
@@ -346,14 +347,14 @@
                                              INTERNET_OPEN_TYPE_PRECONFIG,
                                              NULL, NULL, 0);
   if (!inet_handle)
-    return false;
+    return PING_FAILURE;
 
   // Open network connection.
   InternetHandle connection_handle = InternetConnectA(inet_handle,
       kFinancialServer, kFinancialPort, "", "", INTERNET_SERVICE_HTTP,
       INTERNET_FLAG_NO_CACHE_WRITE, 0);
   if (!connection_handle)
-    return false;
+    return PING_FAILURE;
 
   // Prepare the HTTP request.
   const DWORD kFlags = INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES |
@@ -362,14 +363,14 @@
       HttpOpenRequestA(connection_handle, "GET", request, NULL, NULL,
                        kFinancialPingResponseObjects, kFlags, NULL);
   if (!http_handle)
-    return false;
+    return PING_FAILURE;
 
   // Timeouts are probably:
   // INTERNET_OPTION_SEND_TIMEOUT, INTERNET_OPTION_RECEIVE_TIMEOUT
 
   // Send the HTTP request. Note: Fails if user is working in off-line mode.
   if (!HttpSendRequest(http_handle, NULL, 0, NULL, 0))
-    return false;
+    return PING_FAILURE;
 
   // Check the response status.
   DWORD status;
@@ -377,12 +378,12 @@
   if (!HttpQueryInfo(http_handle, HTTP_QUERY_STATUS_CODE |
                      HTTP_QUERY_FLAG_NUMBER, &status, &status_size, NULL) ||
       200 != status)
-    return false;
+    return PING_FAILURE;
 
   // Get the response text.
   std::unique_ptr<char[]> buffer(new char[kMaxPingResponseLength]);
   if (buffer.get() == NULL)
-    return false;
+    return PING_FAILURE;
 
   DWORD bytes_read = 0;
   while (InternetReadFile(http_handle, buffer.get(), kMaxPingResponseLength,
@@ -391,7 +392,7 @@
     bytes_read = 0;
   };
 
-  return true;
+  return PING_SUCCESSFUL;
 #else
   std::string url =
       base::StringPrintf("https://%s%s", kFinancialServer, request);
@@ -423,11 +424,17 @@
 
   base::subtle::Release_Store(&g_cancelShutdownCheck, 1);
 
-  if (!is_signaled || event->GetResponseCode() != 200)
-    return false;
+  if (!is_signaled)
+    return PING_FAILURE;
+
+  if (event->GetResponseCode() == net::URLFetcher::RESPONSE_CODE_INVALID) {
+    return PING_SHUTDOWN;
+  } else if (event->GetResponseCode() != 200) {
+    return PING_FAILURE;
+  }
 
   *response = event->TakeResponse();
-  return true;
+  return PING_SUCCESSFUL;
 #endif
 }
 
diff --git a/rlz/lib/financial_ping.h b/rlz/lib/financial_ping.h
index 35148d8..c3132ae 100644
--- a/rlz/lib/financial_ping.h
+++ b/rlz/lib/financial_ping.h
@@ -20,6 +20,13 @@
 
 class FinancialPing {
  public:
+  // Return values of the PingServer() method.
+  enum PingResponse {
+    PING_SUCCESSFUL,  // Ping sent and response processed successfully.
+    PING_FAILURE,     // Ping not sent.
+    PING_SHUTDOWN     // Ping not sent because chrome is shutting down.
+  };
+
   // Form the HTTP request to send to the PSO server.
   // Will look something like:
   // /pso/ping?as=swg&brand=GGLD&id=124&hl=en&
@@ -47,7 +54,7 @@
   static bool ClearLastPingTime(Product product);
 
   // Ping the financial server with request. Writes to RlzValueStore.
-  static bool PingServer(const char* request, std::string* response);
+  static PingResponse PingServer(const char* request, std::string* response);
 
   // Returns the time relative to a fixed point in the past in multiples of
   // 100 ns stepts. The point in the past is arbitrary but can't change, as the
diff --git a/rlz/lib/rlz_lib.cc b/rlz/lib/rlz_lib.cc
index 4902e14..493ae90 100644
--- a/rlz/lib/rlz_lib.cc
+++ b/rlz/lib/rlz_lib.cc
@@ -13,7 +13,9 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/syslog_logging.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
+#include "net/base/backoff_entry.h"
 #include "rlz/lib/assert.h"
 #include "rlz/lib/financial_ping.h"
 #include "rlz/lib/lib_values.h"
@@ -407,7 +409,11 @@
                        const char* product_lang,
                        bool exclude_machine_id,
                        const bool skip_time_check) {
-  // Create the financial ping request.
+  // Create the financial ping request.  To support ChromeOS retries, the
+  // same request needs to be sent out each time in order to preserve the
+  // machine id.  Not doing so could cause the RLZ server to over count
+  // ChromeOS machines under some network error conditions (for example,
+  // the request is properly received but the response it not).
   std::string request;
   if (!FinancialPing::FormRequest(product, access_points, product_signature,
                                   product_brand, product_id, product_lang,
@@ -418,29 +424,65 @@
   if (!FinancialPing::IsPingTime(product, skip_time_check))
     return false;
 
-#if defined(OS_CHROMEOS)
-  // Write to syslog that an RLZ ping is being attempted.  This is purposefully
-  // done via syslog so that admin and/or end users can monitor RLZ activity
-  // from this machine.  If RLZ is turned off in crosh, these messages will
-  // be absent.
-  SYSLOG(INFO) << "Attempting to send RLZ ping brand=" << product_brand;
-#endif
-
   // Send out the ping, update the last ping time irrespective of success.
   FinancialPing::UpdateLastPingTime(product);
   std::string response;
-  if (!FinancialPing::PingServer(request.c_str(), &response)) {
+
 #if defined(OS_CHROMEOS)
-    SYSLOG(INFO) << "Failed sending RLZ ping";
-#endif
+
+  const net::BackoffEntry::Policy policy = {
+      0,  // Number of initial errors to ignore.
+      base::TimeDelta::FromSeconds(5).InMilliseconds(),  // Initial delay.
+      2,    // Factor to increase delay.
+      0.1,  // Delay fuzzing.
+      base::TimeDelta::FromMinutes(5).InMilliseconds(),  // Maximum delay.
+      -1,  // Time to keep entries.  -1 == never discard.
+  };
+  net::BackoffEntry backoff(&policy);
+
+  const int kMaxRetryCount = 3;
+  FinancialPing::PingResponse res = FinancialPing::PING_FAILURE;
+  while (backoff.failure_count() < kMaxRetryCount) {
+    // Write to syslog that an RLZ ping is being attempted.  This is
+    // purposefully done via syslog so that admin and/or end users can monitor
+    // RLZ activity from this machine.  If RLZ is turned off in crosh, these
+    // messages will be absent.
+    SYSLOG(INFO) << "Attempting to send RLZ ping brand=" << product_brand;
+
+    res = FinancialPing::PingServer(request.c_str(), &response);
+    if (res != FinancialPing::PING_FAILURE)
+      break;
+
+    backoff.InformOfRequest(false);
+    if (backoff.ShouldRejectRequest()) {
+      SYSLOG(INFO) << "Failed sending RLZ ping - retrying in "
+                   << backoff.GetTimeUntilRelease().InSeconds() << " seconds";
+    }
+
+    base::PlatformThread::Sleep(backoff.GetTimeUntilRelease());
+  }
+
+  if (res != FinancialPing::PING_SUCCESSFUL) {
+    if (res == FinancialPing::PING_FAILURE) {
+      SYSLOG(INFO) << "Failed sending RLZ ping after " << kMaxRetryCount
+                   << " tries";
+    } else {  // res == FinancialPing::PING_SHUTDOWN
+      SYSLOG(INFO) << "Failed sending RLZ ping due to chrome shutdown";
+    }
     return false;
   }
 
-#if defined(OS_CHROMEOS)
   SYSLOG(INFO) << "Succeeded in sending RLZ ping";
+
+#else
+
+  FinancialPing::PingResponse res =
+      FinancialPing::PingServer(request.c_str(), &response);
+  if (res != FinancialPing::PING_SUCCESSFUL)
+    return false;
+
 #endif
 
-  // Parse the ping response - update RLZs, clear events.
   return ParsePingResponse(product, response.c_str());
 }
 
diff --git a/rlz/lib/rlz_lib_test.cc b/rlz/lib/rlz_lib_test.cc
index 060167c6..fd602880 100644
--- a/rlz/lib/rlz_lib_test.cc
+++ b/rlz/lib/rlz_lib_test.cc
@@ -20,16 +20,19 @@
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/posix/eintr_wrapper.h"
-#include "base/single_thread_task_runner.h"
+#include "base/strings/stringprintf.h"
 #include "base/test/scoped_task_environment.h"
 #include "build/build_config.h"
+#include "net/url_request/test_url_fetcher_factory.h"
 #include "rlz/lib/financial_ping.h"
+#include "rlz/lib/lib_values.h"
 #include "rlz/lib/net_response_check.h"
 #include "rlz/lib/rlz_lib.h"
 #include "rlz/lib/rlz_value_store.h"
 #include "rlz/test/rlz_test_helpers.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
 
 #if defined(OS_WIN)
 #include <Windows.h>
@@ -42,7 +45,6 @@
 #include "net/url_request/url_request_test_util.h"
 #endif
 
-
 class MachineDealCodeHelper
 #if defined(OS_WIN)
     : public rlz_lib::MachineDealCode
@@ -64,6 +66,37 @@
 
 class RlzLibTest : public RlzLibTestBase {
  protected:
+  void FakeGoodPingResponse(rlz_lib::Product product,
+                            const rlz_lib::AccessPoint* access_points,
+                            const char* product_signature,
+                            const char* product_brand,
+                            const char* product_id,
+                            const char* product_lang,
+                            bool exclude_machine_id,
+                            net::FakeURLFetcherFactory* factory) {
+    const char kGoodPingResponses[] =
+        "version: 3.0.914.7250\r\n"
+        "url: "
+        "http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
+        "launch-action: custom-action\r\n"
+        "launch-target: SearchWithGoogleUpdate.exe\r\n"
+        "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
+        "rlz: 1R1_____en__252\r\n"
+        "rlzXX: 1R1_____en__250\r\n"
+        "rlzT4  1T4_____en__251\r\n"
+        "rlzT4: 1T4_____en__252\r\n"
+        "rlz\r\n"
+        "crc32: D6FD55A3";
+    std::string request;
+    EXPECT_TRUE(rlz_lib::FinancialPing::FormRequest(
+        product, access_points, product_signature, product_brand, product_id,
+        product_lang, exclude_machine_id, &request));
+    GURL url = GURL(base::StringPrintf(
+        "https://%s%s", rlz_lib::kFinancialServer, request.c_str()));
+    factory->SetFakeResponse(url, kGoodPingResponses, net::HTTP_OK,
+                             net::URLRequestStatus::SUCCESS);
+  }
+
   base::test::ScopedTaskEnvironment scoped_task_environment_;
 };
 
@@ -455,9 +488,9 @@
 };
 
 TEST_F(RlzLibTest, SendFinancialPing) {
-  // We don't really check a value or result in this test. All this does is
-  // attempt to ping the financial server, which you can verify in Fiddler.
-  // TODO: Make this a measurable test.
+  // rlz_lib::SendFinancialPing fails when this is set.
+  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
+    return;
 
 #if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET)
 #if defined(OS_MACOSX)
@@ -495,10 +528,18 @@
     {rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT,
      rlz_lib::NO_ACCESS_POINT};
 
-  std::string request;
-  rlz_lib::SendFinancialPing(rlz_lib::TOOLBAR_NOTIFIER, points,
-      "swg", "GGLA", "SwgProductId1234", "en-UK", false,
-      /*skip_time_check=*/true);
+  // Excluding machine id from requests so that a stable URL is used and
+  // this test can use FakeURLFetcherFactory.
+  net::FakeURLFetcherFactory factory(nullptr);
+  FakeGoodPingResponse(rlz_lib::TOOLBAR_NOTIFIER, points, "swg", "GGLA",
+                       "SwgProductId1234", "en-UK",
+                       /* exclude_machine_id */ true, &factory);
+
+  EXPECT_TRUE(rlz_lib::SendFinancialPing(rlz_lib::TOOLBAR_NOTIFIER, points,
+                                         "swg", "GGLA", "SwgProductId1234",
+                                         "en-UK",
+                                         /* exclude_machine_id */ true,
+                                         /* skip_time_check */true));
 }
 
 #if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET)
diff --git a/sandbox/win/fuzzer/fuzzer_types.h b/sandbox/win/fuzzer/fuzzer_types.h
index 0b9dd14..f6a8d7d 100644
--- a/sandbox/win/fuzzer/fuzzer_types.h
+++ b/sandbox/win/fuzzer/fuzzer_types.h
@@ -14,7 +14,13 @@
 // captured by the fuzzing harness.
 
 // Disable exceptions.
+#if defined(__try)
+#undef __try
+#endif
 #define __try if(true)
+#if defined(__except)
+#undef __except
+#endif
 #define __except(...) if(false)
 
 // Windows types used in sandbox.
diff --git a/services/network/resource_scheduler.cc b/services/network/resource_scheduler.cc
index a05765a..de7b1a68 100644
--- a/services/network/resource_scheduler.cc
+++ b/services/network/resource_scheduler.cc
@@ -46,6 +46,12 @@
 const base::Feature kPrioritySupportedRequestsDelayable{
     "PrioritySupportedRequestsDelayable", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// When kSpdyProxiesRequestsDelayable is enabled, HTTP requests fetched from
+// a SPDY/QUIC/H2 proxies can be delayed by the ResourceScheduler just as
+// HTTP/1.1 resources are.
+const base::Feature kSpdyProxiesRequestsDelayable{
+    "SpdyProxiesRequestsDelayable", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // When enabled, low-priority H2 and QUIC requests are throttled, but only
 // when the parser is in head.
 const base::Feature kHeadPrioritySupportedRequestsDelayable{
@@ -399,7 +405,9 @@
  public:
   Client(const net::NetworkQualityEstimator* const network_quality_estimator,
          ResourceScheduler* resource_scheduler)
-      : deprecated_is_loaded_(false),
+      : spdy_proxy_requests_delayble_(
+            base::FeatureList::IsEnabled(kSpdyProxiesRequestsDelayable)),
+        deprecated_is_loaded_(false),
         deprecated_has_html_body_(false),
         using_spdy_proxy_(false),
         in_flight_delayable_count_(0),
@@ -507,6 +515,11 @@
   }
 
   void OnReceivedSpdyProxiedHttpResponse() {
+    // If the requests to SPDY/H2/QUIC proxies are delayable, then return
+    // immediately.
+    if (spdy_proxy_requests_delayble_)
+      return;
+
     if (!using_spdy_proxy_) {
       using_spdy_proxy_ = true;
       LoadAnyStartablePendingRequests(RequestStartTrigger::SPDY_PROXY_DETECTED);
@@ -960,6 +973,10 @@
     }
   }
 
+  // True if requests to SPDY/H2/QUIC proxies can be delayed by the
+  // ResourceScheduler just as HTTP/1.1 resources are.
+  const bool spdy_proxy_requests_delayble_;
+
   bool deprecated_is_loaded_;
   // Tracks if the main HTML parser has reached the body which marks the end of
   // layout-blocking resources.
diff --git a/services/network/resource_scheduler_unittest.cc b/services/network/resource_scheduler_unittest.cc
index a336ad70..3d3cc0de 100644
--- a/services/network/resource_scheduler_unittest.cc
+++ b/services/network/resource_scheduler_unittest.cc
@@ -2024,6 +2024,66 @@
       1);
 }
 
+TEST_F(ResourceSchedulerTest,
+       SpdyProxiesRequestsDelayableFeatureEnabled_DelaysSpdyProxyRequests) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitFromCommandLine("SpdyProxiesRequestsDelayable", "");
+  InitializeScheduler();
+
+  std::unique_ptr<TestRequest> high(
+      NewRequest("http://host/high", net::HIGHEST));
+  std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
+
+  std::unique_ptr<TestRequest> request(
+      NewRequest("http://host/req", net::IDLE));
+  EXPECT_FALSE(request->started());
+
+  scheduler()->OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(request->started());
+
+  // Low priority requests are not started even though the page is loaded from
+  // an H2 proxy.
+  std::unique_ptr<TestRequest> after(
+      NewRequest("http://host/after", net::IDLE));
+  EXPECT_FALSE(after->started());
+
+  // High priority requests should still be scheduled immediately.
+  std::unique_ptr<TestRequest> high_2(
+      NewRequest("http://host/high", net::HIGHEST));
+  EXPECT_TRUE(high_2->started());
+}
+
+TEST_F(
+    ResourceSchedulerTest,
+    SpdyProxiesRequestsDelayableFeatureDisabled_SpdyProxyRequestsScheduledImmediately) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitFromCommandLine("", "SpdyProxiesRequestsDelayable");
+  InitializeScheduler();
+
+  std::unique_ptr<TestRequest> high(
+      NewRequest("http://host/high", net::HIGHEST));
+  std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
+
+  std::unique_ptr<TestRequest> request(
+      NewRequest("http://host/req", net::IDLE));
+  EXPECT_FALSE(request->started());
+
+  scheduler()->OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(request->started());
+
+  // Low priority requests are started since the page is loaded from an H2
+  // proxy.
+  std::unique_ptr<TestRequest> after(
+      NewRequest("http://host/after", net::IDLE));
+  EXPECT_TRUE(after->started());
+
+  std::unique_ptr<TestRequest> high_2(
+      NewRequest("http://host/high", net::HIGHEST));
+  EXPECT_TRUE(high_2->started());
+}
+
 TEST_F(ResourceSchedulerTest, SchedulerEnabled) {
   std::unique_ptr<TestRequest> high(
       NewRequest("http://host/high", net::HIGHEST));
diff --git a/services/service_manager/sandbox/win/sandbox_win.cc b/services/service_manager/sandbox/win/sandbox_win.cc
index 1e42a87..50430a8e 100644
--- a/services/service_manager/sandbox/win/sandbox_win.cc
+++ b/services/service_manager/sandbox/win/sandbox_win.cc
@@ -12,7 +12,7 @@
 
 #include "base/command_line.h"
 #include "base/debug/activity_tracker.h"
-#include "base/debug/profiler.h"
+#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/hash.h"
@@ -774,11 +774,7 @@
 #if !defined(OFFICIAL_BUILD) && !defined(COMPONENT_BUILD)
   BOOL is_in_job = FALSE;
   CHECK(::IsProcessInJob(::GetCurrentProcess(), NULL, &is_in_job));
-  // In a Syzygy-profiled binary, instrumented for import profiling, this
-  // patch will end in infinite recursion on the attempted delegation to the
-  // original function.
-  if (!base::debug::IsBinaryInstrumented() && !is_in_job &&
-      !g_iat_patch_duplicate_handle.is_patched()) {
+  if (!is_in_job && !g_iat_patch_duplicate_handle.is_patched()) {
     HMODULE module = NULL;
     wchar_t module_name[MAX_PATH];
     CHECK(::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index 604cab9..e1d56946 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -640,14 +640,7 @@
     visibility = [ ":skia_opts" ]
   }
   skia_source_set("skia_opts_hsw") {
-    # SyzyAsan doesn't support the AVX2 and F16C instructions.
-    if (!is_syzyasan) {
-      sources = skia_opts.hsw_sources
-    } else {
-      sources = [
-        "ext/SkOpts_hsw_stub.cc",
-      ]
-    }
+    sources = skia_opts.hsw_sources
     if (!is_win) {
       cflags = [
         "-mavx2",
@@ -657,7 +650,7 @@
         "-mfma",
       ]
     }
-    if (is_win && !is_syzyasan) {
+    if (is_win) {
       cflags = [ "/arch:AVX2" ]
     }
     visibility = [ ":skia_opts" ]
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index 80c69d9..a95d7d01 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -4,7 +4,6 @@
       {
         "args": [
           "-v",
-          "--xvfb",
           "--browser=android-chromium"
         ],
         "isolate_name": "performance_test_suite",
@@ -452,7 +451,50 @@
       {
         "args": [
           "-v",
-          "--xvfb",
+          "--browser=release",
+          "--non-telemetry=true"
+        ],
+        "isolate_name": "load_library_perf_tests_v2",
+        "merge": {
+          "args": [
+            "--service-account-file",
+            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "load_library_perf_tests_v2",
+        "override_compile_targets": [
+          "load_library_perf_tests_v2"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:1626",
+              "os": "Mac-10.12",
+              "pool": "Chrome-perf-fyi"
+            }
+          ],
+          "expiration": 36000,
+          "hard_timeout": 36000,
+          "ignore_task_failure": false,
+          "io_timeout": 1800,
+          "shards": 1,
+          "upload_test_results": true
+        },
+        "trigger_script": {
+          "args": [
+            "--multiple-trigger-configs",
+            "[{\"id\": \"build195-a9\"}]",
+            "--multiple-dimension-script-verbose",
+            "True"
+          ],
+          "script": "//testing/trigger_scripts/perf_device_trigger.py"
+        }
+      },
+      {
+        "args": [
+          "-v",
           "--browser=release"
         ],
         "isolate_name": "performance_test_suite",
@@ -532,8 +574,8 @@
       {
         "args": [
           "-v",
-          "--xvfb",
           "--browser=reference",
+          "--xvfb",
           "--testing=true"
         ],
         "isolate_name": "telemetry_perf_tests_experimental",
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index fa7cb10..4e8d765 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -23229,28 +23229,6 @@
     "isolated_scripts": [
       {
         "args": [
-          "--shard-timeout=300"
-        ],
-        "isolate_name": "angle_perftests",
-        "name": "angle_perftests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "id": "build17-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 1200,
-          "upload_test_results": true
-        }
-      },
-      {
-        "args": [
           "blink_perf.bindings",
           "-v",
           "--upload-results",
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index 79d6ee50..7699c8f 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -894,13 +894,6 @@
       },
       {
         "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 2
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 98517ee..ae5a2bc 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1076,6 +1076,9 @@
       "../../tools/perf/run_benchmark",
     ],
   },
+  # Perf is in the middle of refactoring their recipe.  crbug.com/757933
+  # These isolates are the new targets for the refactor and will replace
+  # the old ones when migration is complete.
   "performance_test_suite": {
     "label": "//chrome/test:performance_test_suite",
     "type": "script",
@@ -1149,6 +1152,15 @@
       "--test-launcher-print-test-stdio=always"
     ],
   },
+  "load_library_perf_tests_v2": {
+    "label": "//chrome/test:load_library_perf_tests",
+    "type": "script",
+    "script": "//testing/scripts/run_performance_tests.py",
+    "args": [
+      "load_library_perf_tests",
+      "--test-launcher-print-test-stdio=always"
+    ],
+  },
   "tracing_perftests": {
     "label": "//components/tracing:tracing_perftests",
     "type": "script",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 4c429add..b1be0c2 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1912,6 +1912,8 @@
       'Chromium Win 10 GCE Tests',
       # chromium.memory
       'Linux TSan Tests',
+      # chromium.win; temporary, https://crbug.com/826735
+      'Win10 Tests x64',
     ],
     'modifications': {
       # chromium.clang
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/disable-blink-features=RootLayerScrolling b/third_party/WebKit/LayoutTests/FlagExpectations/disable-blink-features=RootLayerScrolling
index a62c534..59b5ede3 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/disable-blink-features=RootLayerScrolling
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/disable-blink-features=RootLayerScrolling
@@ -1847,7 +1847,6 @@
 crbug.com/626703 external/wpt/webaudio/the-audio-api/the-audioparam-interface/retrospective-setValueAtTime.html [ Timeout ]
 crbug.com/626703 external/wpt/webaudio/the-audio-api/the-audioparam-interface/retrospective-setValueCurveAtTime.html [ Timeout ]
 crbug.com/626703 external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html [ Timeout ]
-crbug.com/626703 [ Mac10.13 ] external/wpt/webauthn/interfaces.https.html [ Timeout ]
 crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setLocalDescription-rollback.html [ Timeout ]
 crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription.html [ Timeout ]
 crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 156d5d5e..e49ea559 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -251,7 +251,6 @@
 crbug.com/591099 editing/selection/transformed-selection-rects.html [ Failure ]
 crbug.com/591099 editing/selection/word-granularity.html [ Failure ]
 crbug.com/591099 editing/text-iterator/findString.html [ Timeout ]
-crbug.com/591099 editing/unsupported-content/list-delete-001.html [ Failure ]
 crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html [ Pass ]
 crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/test_hkdf.https.html [ Timeout ]
@@ -929,12 +928,10 @@
 crbug.com/591099 external/wpt/xhr/send-authentication-prompt-2-manual.htm [ Failure ]
 crbug.com/591099 fast/animation/scroll-animations/scrolltimeline-currenttime.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-clip-text.html [ Failure ]
-crbug.com/591099 fast/backgrounds/background-inherit-color-bug.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-leakage-transforms.html [ Failure ]
 crbug.com/591099 fast/backgrounds/border-radius-split-background-image.html [ Failure ]
 crbug.com/591099 fast/backgrounds/border-radius-split-background.html [ Failure ]
 crbug.com/591099 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure ]
-crbug.com/591099 fast/backgrounds/repeat/noRepeatCorrectClip.html [ Failure ]
 crbug.com/591099 fast/backgrounds/selection-background-color-of-image-list-style.html [ Failure ]
 crbug.com/591099 fast/backgrounds/selection-background-color-of-list-style.html [ Failure ]
 crbug.com/591099 fast/backgrounds/size/backgroundSize16.html [ Failure ]
@@ -974,15 +971,6 @@
 crbug.com/714962 fast/borders/border-image-outset-split-inline.html [ Failure ]
 crbug.com/714962 fast/borders/border-inner-bleed.html [ Failure ]
 crbug.com/714962 fast/borders/border-radius-inline-flow.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-canvas-all.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-canvas-border.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-canvas-padding.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-canvas-with-mask.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-canvas-with-shadow.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-canvas.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-video-ratio.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-video-shadow.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-mask-video.html [ Failure ]
 crbug.com/714962 fast/borders/border-radius-percent.html [ Failure ]
 crbug.com/714962 fast/borders/border-radius-split-inline.html [ Failure ]
 crbug.com/714962 fast/borders/border-styles-split.html [ Failure ]
@@ -1219,20 +1207,15 @@
 crbug.com/591099 fast/deprecated-flexbox/relpos-flex-item-with-percent-height-abspos-descendant.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/repaint-scrollbar.html [ Failure ]
 crbug.com/591099 fast/doctypes/001.html [ Failure ]
-crbug.com/591099 fast/doctypes/002.html [ Failure ]
 crbug.com/591099 fast/doctypes/003.html [ Failure ]
 crbug.com/591099 fast/doctypes/004.html [ Failure ]
 crbug.com/714962 fast/dom/Element/client-rect-list-argument.html [ Failure ]
 crbug.com/591099 fast/dom/Element/getBoundingClientRect.html [ Failure ]
 crbug.com/714962 fast/dom/Element/getClientRects.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLMeterElement/meter-boundary-values.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLMeterElement/meter-optimums.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element.html [ Failure ]
 crbug.com/714962 fast/dom/Range/getBoundingClientRect-linebreak-character.html [ Failure ]
 crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html [ Timeout ]
 crbug.com/591099 fast/dom/Window/window-lookup-precedence.html [ Timeout ]
 crbug.com/591099 fast/dom/Window/window-postmessage-clone-deep-array.html [ Failure ]
-crbug.com/591099 fast/dom/clone-node-dynamic-style.html [ Failure ]
 crbug.com/591099 fast/dom/domstring-attribute-reflection.html [ Timeout ]
 crbug.com/591099 fast/dom/element-attribute-js-null.html [ Timeout ]
 crbug.com/714962 fast/dom/elementFromPoint-relative-to-viewport.html [ Failure ]
@@ -1262,7 +1245,6 @@
 crbug.com/591099 fast/events/mouse-relative-position.html [ Failure ]
 crbug.com/591099 fast/events/mouseevent-getModifierState.html [ Timeout ]
 crbug.com/591099 fast/events/onclick-list-marker.html [ Failure ]
-crbug.com/591099 fast/events/pointer-events-2.html [ Failure ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Timeout ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture.html [ Timeout ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-event-properties.html [ Timeout ]
@@ -1288,7 +1270,6 @@
 crbug.com/714962 fast/forms/label/continous-click-on-label.html [ Failure ]
 crbug.com/591099 fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure Pass ]
 crbug.com/591099 fast/forms/long-text-in-input.html [ Crash Failure ]
-crbug.com/591099 fast/forms/placeholder-position.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-initial-position.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-style.html [ Failure ]
 crbug.com/591099 fast/forms/selection-direction.html [ Timeout ]
@@ -1300,7 +1281,6 @@
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html [ Timeout ]
 crbug.com/591099 fast/frames/iframe-with-frameborder.html [ Failure ]
 crbug.com/591099 fast/gradients/list-item-gradient.html [ Failure ]
-crbug.com/591099 fast/gradients/radial-centered.html [ Failure ]
 crbug.com/591099 fast/gradients/unprefixed-list-item-gradient.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-set-list-style-image.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-set-shape-outside.html [ Failure ]
@@ -1310,7 +1290,6 @@
 crbug.com/591099 fast/inline-block/contenteditable-baseline.html [ Failure ]
 crbug.com/714962 fast/inline-block/tricky-baseline.html [ Failure ]
 crbug.com/591099 fast/inline-block/vertical-align-top-and-bottom-2.html [ Failure ]
-crbug.com/591099 fast/inline/absolute-positioned-inline-in-centred-block.html [ Failure ]
 crbug.com/591099 fast/inline/bpm-inline-ancestors.html [ Failure ]
 crbug.com/714962 fast/inline/continuation-outlines-with-layers-2.html [ Failure ]
 crbug.com/591099 fast/inline/continuation-outlines-with-layers.html [ Failure ]
@@ -1330,15 +1309,12 @@
 crbug.com/591099 fast/js/dfg-arguments-alias-activation.html [ Timeout ]
 crbug.com/591099 fast/js/dfg-byte-array-put.html [ Timeout ]
 crbug.com/591099 fast/js/document-all-triggers-masquerades-watchpoint.html [ Timeout ]
-crbug.com/591099 fast/layers/scroll-rect-to-visible.html [ Failure ]
 crbug.com/591099 fast/layout/scroll-anchoring/fullscreen-crash.html [ Crash ]
 crbug.com/591099 fast/lists/001-vertical.html [ Failure ]
 crbug.com/591099 fast/lists/001.html [ Failure ]
-crbug.com/591099 fast/lists/002-vertical.html [ Failure ]
 crbug.com/591099 fast/lists/003-vertical.html [ Failure ]
 crbug.com/591099 fast/lists/003.html [ Failure ]
 crbug.com/591099 fast/lists/004.html [ Failure ]
-crbug.com/591099 fast/lists/005-vertical.html [ Failure ]
 crbug.com/591099 fast/lists/007-vertical.html [ Failure ]
 crbug.com/591099 fast/lists/008-vertical.html [ Failure ]
 crbug.com/591099 fast/lists/009-vertical.html [ Failure ]
@@ -1384,8 +1360,6 @@
 crbug.com/591099 fast/overflow/image-selection-highlight.html [ Failure ]
 crbug.com/714962 fast/overflow/line-clamp-hides-trailing-anchor.html [ Failure ]
 crbug.com/591099 fast/overflow/line-clamp.html [ Failure ]
-crbug.com/591099 fast/overflow/overflow-rtl-vertical.html [ Failure ]
-crbug.com/591099 fast/overflow/overflow-rtl.html [ Failure ]
 crbug.com/714962 fast/overflow/overflow-text-hit-testing.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-update-transform.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-with-local-background-attachment.html [ Failure ]
@@ -1452,7 +1426,6 @@
 crbug.com/591099 fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ]
 crbug.com/591099 fast/scrolling/scrollbar-tickmarks-hittest.html [ Pass ]
 crbug.com/591099 fast/selectors/038.html [ Failure ]
-crbug.com/591099 fast/selectors/166.html [ Failure ]
 crbug.com/591099 fast/selectors/167.html [ Failure ]
 crbug.com/591099 fast/selectors/167a.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius-001.html [ Failure ]
@@ -1525,39 +1498,10 @@
 crbug.com/591099 fast/sub-pixel/computedstylemargin.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/inline-block-with-padding.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ]
-crbug.com/591099 fast/table/018.html [ Failure ]
 crbug.com/591099 fast/table/032.html [ Failure ]
-crbug.com/714962 fast/table/040-vertical.html [ Failure ]
-crbug.com/714962 fast/table/040.html [ Failure ]
-crbug.com/714962 fast/table/absolute-table-at-bottom.html [ Failure ]
-crbug.com/714962 fast/table/backgr_border-table-cell.html [ Failure ]
-crbug.com/714962 fast/table/backgr_border-table-column-group.html [ Failure ]
-crbug.com/714962 fast/table/backgr_border-table-column.html [ Failure ]
-crbug.com/714962 fast/table/backgr_border-table-quirks.html [ Failure ]
-crbug.com/714962 fast/table/backgr_border-table-row-group.html [ Failure ]
-crbug.com/714962 fast/table/backgr_border-table-row.html [ Failure ]
-crbug.com/714962 fast/table/backgr_border-table.html [ Failure ]
-crbug.com/714962 fast/table/backgr_layers-hide.html [ Failure ]
-crbug.com/591099 fast/table/backgr_layers-opacity-collapsed-border.html [ Failure ]
-crbug.com/591099 fast/table/backgr_layers-opacity.html [ Failure ]
-crbug.com/591099 fast/table/backgr_layers-show-collapsed-border.html [ Failure ]
-crbug.com/591099 fast/table/backgr_layers-show.html [ Failure ]
-crbug.com/714962 fast/table/backgr_position-table-cell.html [ Failure ]
-crbug.com/714962 fast/table/backgr_position-table-column-group.html [ Failure ]
-crbug.com/714962 fast/table/backgr_position-table-column.html [ Failure ]
-crbug.com/714962 fast/table/backgr_position-table-row-group.html [ Failure ]
-crbug.com/714962 fast/table/backgr_position-table-row.html [ Failure ]
-crbug.com/714962 fast/table/backgr_position-table.html [ Failure ]
-crbug.com/714962 fast/table/backgr_simple-table-cell.html [ Failure ]
-crbug.com/714962 fast/table/backgr_simple-table-column-group.html [ Failure ]
-crbug.com/714962 fast/table/backgr_simple-table-column.html [ Failure ]
-crbug.com/714962 fast/table/backgr_simple-table-row-group.html [ Failure ]
-crbug.com/714962 fast/table/backgr_simple-table-row.html [ Failure ]
-crbug.com/714962 fast/table/backgr_simple-table.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/003-vertical.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/004-vertical.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/border-collapsing-head-foot-vertical.html [ Failure ]
-crbug.com/714962 fast/table/border-collapsing/border-collapsing-head-foot.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/composited-cell-collapsed-border.html [ Failure ]
 crbug.com/591099 fast/table/column-in-inline.html [ Failure ]
 crbug.com/591099 fast/table/dynamic-descendant-percentage-height.html [ Failure ]
@@ -1577,9 +1521,6 @@
 crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ]
 crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ]
 crbug.com/591099 fast/table/percent-widths-stretch-vertical.html [ Failure ]
-crbug.com/714962 fast/table/split-table-section-before-anonymous-block-2.html [ Failure ]
-crbug.com/714962 fast/table/split-table-section-before-anonymous-block-3.html [ Failure ]
-crbug.com/714962 fast/table/split-table-section-before-anonymous-block-4.html [ Failure ]
 crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ]
 crbug.com/591099 fast/table/unbreakable-images-quirk.html [ Failure ]
 crbug.com/591099 fast/table/vertical-align-baseline-readjust.html [ Failure ]
@@ -1746,9 +1687,6 @@
 crbug.com/591099 fast/writing-mode/text-combine-line-break.html [ Failure ]
 crbug.com/591099 fast/writing-mode/text-combine-various-fonts.html [ Failure ]
 crbug.com/591099 fast/writing-mode/vertical-lr-replaced-selection.html [ Failure ]
-crbug.com/591099 fonts/monospace.html [ Failure ]
-crbug.com/591099 fonts/sans-serif.html [ Failure ]
-crbug.com/591099 fonts/serif.html [ Failure ]
 crbug.com/591099 fragmentation/transformed-clip-before-second-column.html [ Failure ]
 crbug.com/591099 fullscreen/enter-exit-full-screen-hover.html [ Crash ]
 crbug.com/591099 fullscreen/full-screen-css.html [ Crash ]
@@ -1841,7 +1779,6 @@
 crbug.com/591099 ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling.htm [ Failure ]
 crbug.com/824918 ietestcenter/css3/multicolumn/column-width-applies-to-010.htm [ Failure ]
 crbug.com/714962 images/color-profile-background-clip-text.html [ Failure ]
-crbug.com/591099 images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/591099 images/color-profile-image-shape.html [ Failure ]
 crbug.com/591099 images/color-profile-munsell-adobe-to-srgb.html [ Failure ]
 crbug.com/591099 images/percent-height-image.html [ Failure ]
@@ -1966,16 +1903,6 @@
 crbug.com/591099 paint/invalidation/insert-frame.html [ Failure ]
 crbug.com/591099 paint/invalidation/invalidation-after-opacity-change-subtree.html [ Failure ]
 crbug.com/591099 paint/invalidation/invisible-objects.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-1.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-10.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-2.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-3.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-4.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-5.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-6.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-7.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-8.html [ Failure ]
-crbug.com/591099 paint/invalidation/line-flow-with-floats-9.html [ Failure ]
 crbug.com/591099 paint/invalidation/lines-with-layout-delta.html [ Failure ]
 crbug.com/591099 paint/invalidation/list-marker-2.html [ Failure ]
 crbug.com/591099 paint/invalidation/list-marker.html [ Failure ]
@@ -1995,7 +1922,6 @@
 crbug.com/591099 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/inline-focus.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/inline-outline-repaint-2.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/inline-outline-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/outline-change-continuations.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/outline-change-invalidation.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/outline-change-vertical-rl.html [ Failure ]
@@ -2052,7 +1978,6 @@
 crbug.com/591099 paint/invalidation/remove-block-after-layout.html [ Failure ]
 crbug.com/591099 paint/invalidation/remove-inline-after-layout.html [ Failure ]
 crbug.com/591099 paint/invalidation/remove-inline-layer-after-layout.html [ Crash ]
-crbug.com/714962 paint/invalidation/repaint-across-writing-mode-boundary.html [ Failure ]
 crbug.com/591099 paint/invalidation/repaint-descandant-on-ancestor-layer-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/resize-iframe-text.html [ Failure ]
 crbug.com/591099 paint/invalidation/ruby-flipped-blocks.html [ Failure ]
@@ -2143,7 +2068,6 @@
 crbug.com/591099 paint/invalidation/table/resize-table-repaint-percent-size-cell.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/resize-table-repaint-vertical-align-cell.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/resize-table-row-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/table-cell-collapsed-border.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/table-cell-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/table-collapsed-border.html [ Failure ]
@@ -2183,8 +2107,6 @@
 crbug.com/591099 paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers.html [ Failure ]
 crbug.com/591099 paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers.html [ Failure ]
 crbug.com/591099 paint/markers/first-letter.html [ Failure ]
-crbug.com/591099 paint/markers/inline-spelling-markers-hidpi-composited.html [ Failure ]
-crbug.com/591099 paint/markers/inline-spelling-markers-hidpi.html [ Failure ]
 crbug.com/591099 paint/markers/marker-early-break-bug.html [ Failure ]
 crbug.com/591099 paint/overflow/background-mask-should-be-recorded-full.html [ Failure ]
 crbug.com/591099 paint/overflow/composited-scroll-vertical-rl.html [ Failure ]
@@ -2245,13 +2167,9 @@
 crbug.com/591099 svg/custom/junk-data.svg [ Failure ]
 crbug.com/591099 svg/custom/load-non-wellformed.svg [ Failure ]
 crbug.com/591099 svg/custom/missing-xlink.svg [ Failure ]
-crbug.com/591099 svg/custom/no-inherited-dashed-stroke.xhtml [ Failure ]
 crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ]
-crbug.com/591099 svg/custom/object-sizing.xhtml [ Failure ]
 crbug.com/591099 svg/custom/path-bad-data.svg [ Failure ]
-crbug.com/591099 svg/custom/svg-fonts-in-html.html [ Failure ]
 crbug.com/591099 svg/custom/text-match-highlight.html [ Failure ]
-crbug.com/591099 svg/custom/transformed-text-pattern.html [ Failure ]
 crbug.com/591099 svg/custom/use-event-retargeting.html [ Failure ]
 crbug.com/591099 svg/custom/use-font-face-crash.svg [ Failure ]
 crbug.com/591099 svg/dom/svgangle-units.html [ Pass Timeout ]
@@ -2280,43 +2198,27 @@
 crbug.com/591099 svg/zoom/page/zoom-svg-through-object-with-percentage-size.xhtml [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug101674.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug110566.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug11384q.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug11384s.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug12008.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug126742.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug1271.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug131020-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug131020.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug131020_iframe.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug1318.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug133948.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug137388-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug137388-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug137388-3.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug139524-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug14159-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug149275-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug149275-2.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug17130-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug18440.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug219693-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug23235.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug2479-3.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug2479-4.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug27038-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2886-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug2962.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2973.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug30692.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug3191.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug32205-3.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug38916.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug4576.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug46480-1.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug46480-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug46623-1.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug46924.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug4803.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug50695-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug53690-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug55694.html [ Failure ]
@@ -2325,25 +2227,15 @@
 crbug.com/591099 tables/mozilla/bugs/bug5798.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug58402-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug641-2.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug82946-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug88035-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug88035-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug88524.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug9123-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug98196.html [ Failure ]
-crbug.com/591099 tables/mozilla/core/bloomberg.html [ Failure ]
 crbug.com/591099 tables/mozilla/core/table_heights.html [ Failure ]
-crbug.com/714962 tables/mozilla/other/test3.html [ Failure ]
-crbug.com/714962 tables/mozilla/other/test6.html [ Failure ]
-crbug.com/591099 tables/mozilla/other/wa_table_thtd_rowspan.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug1010.html [ Failure ]
 crbug.com/714962 tables/mozilla_expected_failures/bugs/bug1055-2.html [ Failure ]
-crbug.com/714962 tables/mozilla_expected_failures/bugs/bug1128.html [ Failure ]
-crbug.com/714962 tables/mozilla_expected_failures/bugs/bug32205-4.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug7113.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug85016.html [ Failure ]
-crbug.com/714962 tables/mozilla_expected_failures/bugs/bug91057.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/marvin/backgr_fixed-bg.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_bottom.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_hidden.html [ Failure ]
@@ -2367,7 +2259,6 @@
 crbug.com/591099 virtual/feature-policy-vibrate/ [ Skip ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-clip-text.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-group.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-shape.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-layer-filter.html [ Timeout ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-layer.html [ Failure ]
@@ -2399,7 +2290,6 @@
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouse-relative-position.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouseevent-getModifierState.html [ Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/onclick-list-marker.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointer-events-2.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture.html [ Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-preventdefault.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index cefca18..09cbda7 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1638,6 +1638,8 @@
 crbug.com/626703 external/wpt/html/semantics/document-metadata/the-link-element/link-load-error-events.https.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/webvr/idlharness.https.html [ Timeout ]
+crbug.com/626703 external/wpt/css/geometry/interfaces.worker.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-transitions/transition-property-017.html [ Skip ]
 crbug.com/626703 external/wpt/css/css-transitions/transition-property-030.html [ Skip ]
 crbug.com/626703 external/wpt/css/css-transitions/transition-property-015.html [ Skip ]
@@ -3318,6 +3320,9 @@
 crbug.com/816766 [ Mac ] fast/dom/Window/window-focus-self.html [ Failure Pass ]
 crbug.com/817167 http/tests/devtools/oopif/oopif-cookies-refresh.js [ Failure Timeout Pass ]
 
+# Simply remove this line when BigInts have landed in Chromium; ...-expected.txt is already correct.
+crbug.com/v8/6791 external/wpt/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html [ NeedsManualRebaseline ]
+
 # Sheriff 2018-03-01
 crbug.com/817678 [ Win ] http/tests/devtools/console/console-group-similar.js [ Failure Pass ]
 
@@ -3352,9 +3357,6 @@
 # Sheriff 2018-03-05
 crbug.com/818650 [ Linux ] fast/speech/scripted/speechrecognition-restart-onend.html [ Crash Pass ]
 
-# Sheriff 2018-03-07
-crbug.com/819778 [ Linux ] external/wpt/css/cssom-view/interfaces.html [ Pass Timeout ]
-
 # Sheriff 2018-03-22
 crbug.com/824775 [ Win Mac ] virtual/new-remote-playback-pipeline/media/controls/video-controls-with-cast-rendering.html [ Pass Failure ]
 crbug.com/824775 [ Win Mac ] media/controls/video-controls-with-cast-rendering.html [ Pass Failure ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index 4b5e8e5a..2a82142 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -5761,6 +5761,12 @@
      {}
     ]
    ],
+   "uievents/mouse/mouse_buttons_back_forward-manual.html": [
+    [
+     "/uievents/mouse/mouse_buttons_back_forward-manual.html",
+     {}
+    ]
+   ],
    "uievents/mouse/mouseevent_move_button-manual.html": [
     [
      "/uievents/mouse/mouseevent_move_button-manual.html",
@@ -97390,6 +97396,16 @@
      {}
     ]
    ],
+   "FileAPI/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "FileAPI/idlharness.worker-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "FileAPI/reading-data-section/support/blue-100x100.png": [
     [
      {}
@@ -97500,6 +97516,11 @@
      {}
     ]
    ],
+   "IndexedDB/interfaces.any-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "IndexedDB/interleaved-cursors-common.js": [
     [
      {}
@@ -97795,6 +97816,11 @@
      {}
     ]
    ],
+   "WebCryptoAPI/idlharness.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "WebCryptoAPI/idlharness.https.worker-expected.txt": [
     [
      {}
@@ -100630,11 +100656,21 @@
      {}
     ]
    ],
+   "cookie-store/idlharness.tentative-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "cookie-store/idlharness_serviceworker.js": [
     [
      {}
     ]
    ],
+   "cookie-store/idlharness_serviceworker.tentative.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "cookie-store/resources/cookie-store-tests.js": [
     [
      {}
@@ -101110,6 +101146,11 @@
      {}
     ]
    ],
+   "credential-management/idl.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "credential-management/passwordcredential-framed-get.sub.https-expected.txt": [
     [
      {}
@@ -118355,6 +118396,11 @@
      {}
     ]
    ],
+   "css/css-overflow/logical-overflow-001-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/css-overflow/reference/input-scrollable-region-001-ref.html": [
     [
      {}
@@ -135595,6 +135641,11 @@
      {}
     ]
    ],
+   "encrypted-media/idlharness.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "encrypted-media/polyfill/cast-polyfill.js": [
     [
      {}
@@ -136000,6 +136051,11 @@
      {}
     ]
    ],
+   "eventsource/interfaces-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "eventsource/resources/accept.event_stream": [
     [
      {}
@@ -137590,6 +137646,11 @@
      {}
     ]
    ],
+   "gamepad/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "generic-sensor/OWNERS": [
     [
      {}
@@ -137605,6 +137666,11 @@
      {}
     ]
    ],
+   "generic-sensor/idlharness.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "geolocation-API/OWNERS": [
     [
      {}
@@ -137740,6 +137806,11 @@
      {}
     ]
    ],
+   "gyroscope/idlharness.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "hr-time/OWNERS": [
     [
      {}
@@ -146180,6 +146251,11 @@
      {}
     ]
    ],
+   "html/semantics/document-metadata/the-link-element/resources/link-load-error-events.sub.js": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
     [
      {}
@@ -151095,6 +151171,11 @@
      {}
     ]
    ],
+   "input-events/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "interfaces/FileAPI.idl": [
     [
      {}
@@ -153030,6 +153111,11 @@
      {}
     ]
    ],
+   "orientation-sensor/idlharness.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "page-visibility/OWNERS": [
     [
      {}
@@ -153210,6 +153296,11 @@
      {}
     ]
    ],
+   "payment-request/interfaces.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "payment-request/payment-request-abort-method.https-expected.txt": [
     [
      {}
@@ -153305,11 +153396,21 @@
      {}
     ]
    ],
+   "pointerevents/extension/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt": [
     [
      {}
     ]
    ],
+   "pointerevents/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "pointerevents/pointerevent_styles.css": [
     [
      {}
@@ -153520,6 +153621,11 @@
      {}
     ]
    ],
+   "presentation-api/controlling-ua/idlharness.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "presentation-api/controlling-ua/support/iframe.html": [
     [
      {}
@@ -156250,6 +156356,11 @@
      {}
     ]
    ],
+   "remote-playback/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "requestidlecallback/OWNERS": [
     [
      {}
@@ -156500,6 +156611,11 @@
      {}
     ]
    ],
+   "screen-orientation/interfaces-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "screen-orientation/orientation-reading-expected.txt": [
     [
      {}
@@ -160365,6 +160481,11 @@
      {}
     ]
    ],
+   "uievents/interfaces-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "uievents/keyboard/README.md": [
     [
      {}
@@ -161220,6 +161341,11 @@
      {}
     ]
    ],
+   "web-animations/interfaces/AnimationPlaybackEvent/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "web-animations/interfaces/Document/getAnimations-expected.txt": [
     [
      {}
@@ -161670,6 +161796,11 @@
      {}
     ]
    ],
+   "webaudio/the-audio-api/the-delaynode-interface/idl-test-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "webaudio/the-audio-api/the-dynamicscompressornode-interface/.gitkeep": [
     [
      {}
@@ -161810,6 +161941,16 @@
      {}
     ]
    ],
+   "webauthn/interfaces.https.any-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "webauthn/interfaces.https.any.worker-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "webmessaging/MessageEvent-trusted-worker.js": [
     [
      {}
@@ -162200,7 +162341,7 @@
      {}
     ]
    ],
-   "webrtc/RTCRtpReceiver-getStats-expected.txt": [
+   "webrtc/RTCRtpReceiver-getStats.https-expected.txt": [
     [
      {}
     ]
@@ -165670,6 +165811,11 @@
      {}
     ]
    ],
+   "xhr/interfaces-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "xhr/no-utf16-json-expected.txt": [
     [
      {}
@@ -181403,6 +181549,12 @@
      {}
     ]
    ],
+   "css/css-overflow/logical-overflow-001.html": [
+    [
+     "/css/css-overflow/logical-overflow-001.html",
+     {}
+    ]
+   ],
    "css/css-position/position-sticky-bottom.html": [
     [
      "/css/css-position/position-sticky-bottom.html",
@@ -183959,6 +184111,12 @@
      {}
     ]
    ],
+   "css/css-transitions/transition-background-position-with-edge-offset.html": [
+    [
+     "/css/css-transitions/transition-background-position-with-edge-offset.html",
+     {}
+    ]
+   ],
    "css/css-transitions/transition-delay-001.html": [
     [
      "/css/css-transitions/transition-delay-001.html",
@@ -184955,6 +185113,12 @@
      {}
     ]
    ],
+   "css/css-typed-om/the-stylepropertymap/properties/marker.html": [
+    [
+     "/css/css-typed-om/the-stylepropertymap/properties/marker.html",
+     {}
+    ]
+   ],
    "css/css-typed-om/the-stylepropertymap/properties/mask-image.html": [
     [
      "/css/css-typed-om/the-stylepropertymap/properties/mask-image.html",
@@ -197195,6 +197359,18 @@
      {}
     ]
    ],
+   "html/semantics/document-metadata/the-link-element/link-load-error-events.html": [
+    [
+     "/html/semantics/document-metadata/the-link-element/link-load-error-events.html",
+     {}
+    ]
+   ],
+   "html/semantics/document-metadata/the-link-element/link-load-error-events.https.html": [
+    [
+     "/html/semantics/document-metadata/the-link-element/link-load-error-events.https.html",
+     {}
+    ]
+   ],
    "html/semantics/document-metadata/the-link-element/link-load-event.html": [
     [
      "/html/semantics/document-metadata/the-link-element/link-load-event.html",
@@ -232177,9 +232353,13 @@
      {}
     ]
    ],
-   "webauthn/interfaces.https.html": [
+   "webauthn/interfaces.https.any.js": [
     [
-     "/webauthn/interfaces.https.html",
+     "/webauthn/interfaces.https.any.html",
+     {}
+    ],
+    [
+     "/webauthn/interfaces.https.any.worker.html",
      {}
     ]
    ],
@@ -233163,9 +233343,9 @@
      {}
     ]
    ],
-   "webrtc/RTCRtpReceiver-getStats.html": [
+   "webrtc/RTCRtpReceiver-getStats.https.html": [
     [
-     "/webrtc/RTCRtpReceiver-getStats.html",
+     "/webrtc/RTCRtpReceiver-getStats.https.html",
      {}
     ]
    ],
@@ -248660,10 +248840,18 @@
    "93903b4f58bc215ea2a67fc6d281593ec5ce79e9",
    "testharness"
   ],
+  "FileAPI/idlharness-expected.txt": [
+   "13cc77e1a73be6777cea4dc1b9c3878c8160e09b",
+   "support"
+  ],
   "FileAPI/idlharness.html": [
    "b12d3e9d4d69b4b922f8fb588f94db7bbdacbef9",
    "testharness"
   ],
+  "FileAPI/idlharness.worker-expected.txt": [
+   "627f67c566160182b079bf4363df1b0590fcd15f",
+   "support"
+  ],
   "FileAPI/idlharness.worker.js": [
    "cda6c4911582d2cd707598bbb7be17400eab2517",
    "testharness"
@@ -250048,6 +250236,10 @@
    "251a828d333bdd3face9d20a2a28ddf0c0ffeb49",
    "testharness"
   ],
+  "IndexedDB/interfaces.any-expected.txt": [
+   "036ceb7629fed15ded127cb893d50e357dd75787",
+   "support"
+  ],
   "IndexedDB/interfaces.any.js": [
    "ae562d6b568c1005c5eef5a230b8869729719dff",
    "testharness"
@@ -250760,12 +250952,16 @@
    "44475110f616c78bc04b93246f015e7a83e78fa7",
    "testharness"
   ],
+  "WebCryptoAPI/idlharness.https-expected.txt": [
+   "27651d6c7ff1fa03ba9ba4b07211c104b2ed83f9",
+   "support"
+  ],
   "WebCryptoAPI/idlharness.https.html": [
    "a0ac6f063c49d9c14b614dee18b681968eee05ad",
    "testharness"
   ],
   "WebCryptoAPI/idlharness.https.worker-expected.txt": [
-   "def2339796f4c477abc401f32315d528765383be",
+   "3d7063364c72b413f4b903e20f37c429d81eec40",
    "support"
   ],
   "WebCryptoAPI/idlharness.https.worker.js": [
@@ -251105,7 +251301,7 @@
    "support"
   ],
   "accelerometer/idlharness.https-expected.txt": [
-   "41c6d2c3d9b32694e4256220daa4ec9fa92a1d5b",
+   "4f382b047c5335197d23f221816b5540932cb5b2",
    "support"
   ],
   "accelerometer/idlharness.https.html": [
@@ -251837,7 +252033,7 @@
    "support"
   ],
   "background-fetch/interfaces-worker.https-expected.txt": [
-   "472a8ea0508cf94040e3a123395a463cf5538353",
+   "01c41d846ed6fa1003c4f4b3ddfd7ee6dc18ee0f",
    "support"
   ],
   "background-fetch/interfaces-worker.https.html": [
@@ -251849,7 +252045,7 @@
    "testharness"
   ],
   "background-fetch/interfaces.worker-expected.txt": [
-   "db5baa6abbe13cb1d79f2624265fe6d09f215f81",
+   "61ae495166908fd03d1519d9c474e90f4e4765c1",
    "support"
   ],
   "background-fetch/interfaces.worker.js": [
@@ -252889,7 +253085,7 @@
    "support"
   ],
   "clipboard-apis/async-interfaces.https-expected.txt": [
-   "cc28a931a8cf5e62b2f83f4f3ace508677499749",
+   "c5846b388109533fbc7aad25a398588647bc292c",
    "support"
   ],
   "clipboard-apis/async-interfaces.https.html": [
@@ -255888,6 +256084,10 @@
    "11c763dd1b7b3a1bff14b9f65538fb33ca97b81b",
    "testharness"
   ],
+  "cookie-store/idlharness.tentative-expected.txt": [
+   "a1b40c7385f63f6437d32e42461b7be4dc246f7f",
+   "support"
+  ],
   "cookie-store/idlharness.tentative.html": [
    "8654087597cc0c11b880b0144897dab26691d12a",
    "testharness"
@@ -255896,6 +256096,10 @@
    "aceb00f593b0447853fa70c8c971902cf02a164b",
    "support"
   ],
+  "cookie-store/idlharness_serviceworker.tentative.https-expected.txt": [
+   "cefda57ea727b88103b93ddb2189f6109f4fd574",
+   "support"
+  ],
   "cookie-store/idlharness_serviceworker.tentative.https.html": [
    "0c8a1302ab1839cab71c87db2bda1ca6abcb6a23",
    "testharness"
@@ -256512,6 +256716,10 @@
    "561636e62d50da2d14e50516c62cbaea1c5bb924",
    "testharness"
   ],
+  "credential-management/idl.https-expected.txt": [
+   "8172bd82138e9597037a4fcc72b31116ca8ddc75",
+   "support"
+  ],
   "credential-management/idl.https.html": [
    "e9a108beef51c52bbaaf2e53371aec57e69541c0",
    "testharness"
@@ -290040,6 +290248,14 @@
    "f51bc673da28b0471018cdf945b4449ab00ce717",
    "reftest"
   ],
+  "css/css-overflow/logical-overflow-001-expected.txt": [
+   "4663a5557e1d2b9cf4763ff36bb0061869b1328c",
+   "support"
+  ],
+  "css/css-overflow/logical-overflow-001.html": [
+   "2fe3c96c09faaa25baa2d7e88215a2ccd47e9381",
+   "testharness"
+  ],
   "css/css-overflow/reference/input-scrollable-region-001-ref.html": [
    "31e24bb1a2cb6f42703cc05e055fcb345c770a22",
    "support"
@@ -305084,6 +305300,10 @@
    "2068fe442683e6242633527409c89940d4e04bda",
    "testharness"
   ],
+  "css/css-transitions/transition-background-position-with-edge-offset.html": [
+   "00d397eb8f6eba4e3f34c03d7af23e056953e2ef",
+   "testharness"
+  ],
   "css/css-transitions/transition-delay-000.html": [
    "ad61ec6800863b60d7d392fc0666332673319209",
    "manual"
@@ -305825,7 +306045,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/background-expected.txt": [
-   "771f6b1bfe094fa98635bd8e9da22fd7835a75e6",
+   "2678d8c6a0464fa6ce365f81fcbd81d5b8d3aa6f",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/background-image.html": [
@@ -305869,7 +306089,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/break-expected.txt": [
-   "25746072733046110fedd82691cb16c883665258",
+   "9a8a88f3b60ba9d731e1816bb3c3a769f4357905",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/break.html": [
@@ -305925,7 +306145,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/flex-basis-expected.txt": [
-   "d68571702188ba3bf28ea394e618f7ff0d8fe5d8",
+   "b2bf34ab42aa154894eb40dc5a3e58f137459ae1",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/flex-basis.html": [
@@ -305965,7 +306185,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-language-override-expected.txt": [
-   "1ef9ac7d0bd41d1b2cb5246a6969be839c8eb77d",
+   "59ffb7920ddeeb2b8595b5fea5dd320085c12b0e",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-language-override.html": [
@@ -305973,7 +306193,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt": [
-   "2ea2f2b21839818a86600f942f5caef0cd2dd3c9",
+   "678282ff775bfaf48f96b73925ba9fc3e938493c",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing.html": [
@@ -305981,7 +306201,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-palette-expected.txt": [
-   "873257b774e6ce5e2120695c497da0dea941baef",
+   "a12c3242888ed3152ce24f82a7678d7d214e2602",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-palette.html": [
@@ -305989,7 +306209,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-presentation-expected.txt": [
-   "620e30bc90d63e01da9d55a8f1d40014937213eb",
+   "8c6dc676d593cfb5d1b86d70b7eb1d4bf92a1e18",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-presentation.html": [
@@ -306001,7 +306221,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-size-expected.txt": [
-   "93cf46c3f4a7e14679daee7b0725abd76c6af6ac",
+   "7199fdfa6f0559e3bb92c3cdb5a93e31d6f31b23",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-size.html": [
@@ -306009,7 +306229,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-stretch-expected.txt": [
-   "47b680cac637feec0057efcce618d1f027797a07",
+   "ce411f253e6c8b2872d5a20e74d417ffbd9f5587",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-stretch.html": [
@@ -306017,7 +306237,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-style-expected.txt": [
-   "adde13fbe15543229a79de34d2c1e58369bd102e",
+   "f51e7f0bff63be8c8eee471953b935ca4eab2e6f",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-style.html": [
@@ -306025,7 +306245,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-synthesis-expected.txt": [
-   "6e9f8092f2396dfd8c900ce77aafc240bbe23d8b",
+   "a593ae0e8a3f8e0df2303b61b59c0bbd9194ae85",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-synthesis.html": [
@@ -306033,7 +306253,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-variant-alternates-expected.txt": [
-   "1619f7d2402cdd1f64d21d3a4201acb019f291cf",
+   "dba98f248c2860fba2db9eb4966cd65767887e5d",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-variant-alternates.html": [
@@ -306041,7 +306261,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-variant-emoji-expected.txt": [
-   "ecddc70a6de41087d76f49371a2495010b00115e",
+   "5d0bf66e0005650cdf47deb462aa73d9dbed9c29",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-variant-emoji.html": [
@@ -306057,7 +306277,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt": [
-   "3a608fb1d954b478d7e61f726cdf0582e39b72d3",
+   "48ca2e6c7e9fd594328b7490ad18a5a65c8c1902",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/font-weight.html": [
@@ -306089,7 +306309,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/line-height-expected.txt": [
-   "f46974abde4d36fc7afd5dbf6197dac24b961663",
+   "022684735db5c3aaee60fc3c340864d583b120ba",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/line-height.html": [
@@ -306105,15 +306325,19 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/margin-expected.txt": [
-   "34edfa4b71e939ffafb463d8ae418f70e88ab22b",
+   "418a278215425057cd7b158dd2f0d143a8615628",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/margin.html": [
    "268e2a2844439f1175199034d89d60a56e0e11fd",
    "testharness"
   ],
+  "css/css-typed-om/the-stylepropertymap/properties/marker.html": [
+   "cbf331428f094497d098ca75f6a5437a57812640",
+   "testharness"
+  ],
   "css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt": [
-   "f977ec97eee04c0ec4131b31678c586a08e0a49a",
+   "0cc719048e458d2454d85d9ce9a6e197148ca07b",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/mask-image.html": [
@@ -306165,7 +306389,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/outline-style-expected.txt": [
-   "ebbb742a8765ef6d5216783d9c0e01f6ac3b8081",
+   "981154baad2963b7ab6e06e1950e1d3511878532",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/outline-style.html": [
@@ -306177,7 +306401,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/overflow-expected.txt": [
-   "98486e3f5c08e26ae1eeee5e03b05d2a60376115",
+   "b3092b55eea27cd358380db1127a688bf7c40724",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/overflow.html": [
@@ -306205,7 +306429,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js": [
-   "ca6f58ecbab01ee294f4388b456b3b1bdd7a4629",
+   "7dad4e140a70b28cde65ff1c23c5f843223eee6f",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/right.html": [
@@ -306221,7 +306445,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt": [
-   "fda10e01b3af2298d545ebcfb5e3c77ed91c8932",
+   "db3780a372263495200ba69d978c60d43ccb2aa1",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/shape-outside.html": [
@@ -306241,7 +306465,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-decoration-line-expected.txt": [
-   "5f695ae94cc887587182a4ae0cdcc4a000090cc0",
+   "ab2faf1d519b3fad46aa6eb11a623d54c9ee9191",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-decoration-line.html": [
@@ -306249,7 +306473,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-expected.txt": [
-   "355f299d6bd2dbefa73f2d3f511d20b5d33e8006",
+   "b77aafbe21874ecb5e5bfe1c2c60b410e9d37afe",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-ink.html": [
@@ -306265,7 +306489,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-decoration-width-expected.txt": [
-   "4f8beb57992112f1504659fc95a3aac2024326fb",
+   "72c8831b783d79b5fef43f3221461bbac76cf097",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-decoration-width.html": [
@@ -306277,7 +306501,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color-expected.txt": [
-   "9e23026ac8a8e6b0a83b1c29a112e6f267628f52",
+   "1c109f27ed4ef58da4ba6a95232e70988704b712",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html": [
@@ -306289,7 +306513,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt": [
-   "da44563b7092e2a81fdf8f40ba9d7d3cd4b0e753",
+   "3999d23023fb88ad5e47879574f7b3bd92d91528",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-transform.html": [
@@ -306309,7 +306533,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/transition-duration-expected.txt": [
-   "69d85ff69049f1fa911a62abdb2b3dc56b767250",
+   "60a22b93b6aaa2942c8749a86a85b1bd7c2833fa",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/transition-duration.html": [
@@ -306337,7 +306561,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/writing-mode-expected.txt": [
-   "d9b05e44230fc60cb0e8e3a7ec4bc6b12fda999d",
+   "44d90fb5d8c6dcbf82cfe7b99baf554fb6195ba8",
    "support"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/writing-mode.html": [
@@ -315537,7 +315761,7 @@
    "support"
   ],
   "css/cssom-view/interfaces-expected.txt": [
-   "6ab8c24a3f4536d859b08889dd6e851e2e0670a8",
+   "773c6b5d77ccdd1ce583e9f0b619d5ceffd6408a",
    "support"
   ],
   "css/cssom-view/interfaces.html": [
@@ -316045,7 +316269,7 @@
    "testharness"
   ],
   "css/cssom/interfaces-expected.txt": [
-   "ceb2d0acbc844494a42404ecd00ea5cae5fd6d8a",
+   "773c6b5d77ccdd1ce583e9f0b619d5ceffd6408a",
    "support"
   ],
   "css/cssom/interfaces.html": [
@@ -316469,7 +316693,7 @@
    "testharness"
   ],
   "css/geometry/interfaces-expected.txt": [
-   "46946f98191087f9eb76fdbc2cb27ade9fdfbac0",
+   "d62fcc71138254b62856358a6dec56fe607311d0",
    "support"
   ],
   "css/geometry/interfaces.html": [
@@ -316493,7 +316717,7 @@
    "support"
   ],
   "css/geometry/support/interfaces.js": [
-   "13d88ccf8c2f03db7e1db7f6fc704ba46a06e0e1",
+   "588093d88e2aa43a81a11baf0cd154a8fa202788",
    "support"
   ],
   "css/mediaqueries/OWNERS": [
@@ -325716,6 +325940,10 @@
    "d7627e2017ae8ac994a6bc8a2a00df0dd2332c59",
    "testharness"
   ],
+  "encrypted-media/idlharness.https-expected.txt": [
+   "9e06f47e95f8581bd9abf9275fe322bbb51c1194",
+   "support"
+  ],
   "encrypted-media/idlharness.https.html": [
    "49b0c8508501b73ba979f7c86ebcc40de0073caf",
    "testharness"
@@ -326300,6 +326528,10 @@
    "150899caa81465d6ee79b0f190225e477e852944",
    "testharness"
   ],
+  "eventsource/interfaces-expected.txt": [
+   "c3d6c4f51886f3b08daf719838430c0d9858fcc5",
+   "support"
+  ],
   "eventsource/interfaces.html": [
    "118139dd2e6054a5753ade00c71ecf1093c03781",
    "testharness"
@@ -328652,6 +328884,10 @@
    "77a312f39cbdbeadddf4e7ac9934e27abe511e84",
    "support"
   ],
+  "gamepad/idlharness-expected.txt": [
+   "370e0e857cd4df7ebd09c0fbc3de88c891d59280",
+   "support"
+  ],
   "gamepad/idlharness.html": [
    "302f0796746f252a1a851d306d7e96cf86d7d402",
    "testharness"
@@ -328672,6 +328908,10 @@
    "6364f1838215eaafd91b86690039da41d4c19cd1",
    "support"
   ],
+  "generic-sensor/idlharness.https-expected.txt": [
+   "f7b256c362df5a30ca519b58b390fe860be96513",
+   "support"
+  ],
   "generic-sensor/idlharness.https.html": [
    "02c734b907075c8abb7504fc7e2b93730ac80a0c",
    "testharness"
@@ -328825,7 +329065,7 @@
    "testharness"
   ],
   "geolocation-sensor/idlharness.https-expected.txt": [
-   "3ccdd01ebad5cfb84b848080fbd221599d85af04",
+   "ccbe30fcb2f270cc9d8e5ffa27fea197536d19a2",
    "support"
   ],
   "geolocation-sensor/idlharness.https.html": [
@@ -328932,6 +329172,10 @@
    "4f1c57a6bfbceaea2e725ce40ab449b5a687d611",
    "support"
   ],
+  "gyroscope/idlharness.https-expected.txt": [
+   "899f23ff47215e215bb169b2612e1011abad999b",
+   "support"
+  ],
   "gyroscope/idlharness.https.html": [
    "c6c627cc2e250664e174edf90aa9b402ea5c0500",
    "testharness"
@@ -328945,7 +329189,7 @@
    "testharness"
   ],
   "hr-time/idlharness-expected.txt": [
-   "e064a696afab015c130966f2d5a389572f978543",
+   "6f8bd60ab137f43a835e2b625a56de1530c4d958",
    "support"
   ],
   "hr-time/idlharness.html": [
@@ -339188,8 +339432,16 @@
    "1ffdecee25d1f3819f3f67241c3f0746bedbcf97",
    "testharness"
   ],
+  "html/semantics/document-metadata/the-link-element/link-load-error-events.html": [
+   "8835935f157e5c227a8ce62f1a4fafcb46c50914",
+   "testharness"
+  ],
+  "html/semantics/document-metadata/the-link-element/link-load-error-events.https.html": [
+   "8835935f157e5c227a8ce62f1a4fafcb46c50914",
+   "testharness"
+  ],
   "html/semantics/document-metadata/the-link-element/link-load-event.html": [
-   "a1a8b7b20492b7fef977f7734425f9cf55322f2a",
+   "628527090c78d90d831cb80ea8eee7ffa66722f5",
    "testharness"
   ],
   "html/semantics/document-metadata/the-link-element/link-rellist.html": [
@@ -339216,6 +339468,10 @@
    "04a3a89fe805fc930dc3adfa3a4134b950779697",
    "support"
   ],
+  "html/semantics/document-metadata/the-link-element/resources/link-load-error-events.sub.js": [
+   "0c45045a1db6958751dfe112aa3234ca936263e7",
+   "support"
+  ],
   "html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
    "2829167c82bafef6cfea06071007a231aa4277f6",
    "support"
@@ -348732,6 +348988,10 @@
    "9ebd0fb0f1eae3b8b1c53e25fdb15f80c34251e2",
    "support"
   ],
+  "input-events/idlharness-expected.txt": [
+   "42960f6e66f255dcd48ab66e5cb3dfc97ba9e2d3",
+   "support"
+  ],
   "input-events/idlharness.html": [
    "cd25518dd402033694667ccd1982fd3b85faa412",
    "testharness"
@@ -348841,7 +349101,7 @@
    "support"
   ],
   "interfaces/geometry.idl": [
-   "dea55d151bd19d342f9b28bb2f11e5108ab970ff",
+   "9aae8525ee6b27797783495e8d918892ee857a78",
    "support"
   ],
   "interfaces/gyroscope.idl": [
@@ -348937,7 +349197,7 @@
    "support"
   ],
   "interfaces/webauthn.idl": [
-   "77076f0828383c0f48f36131a81b25186622b3a3",
+   "1ae8b428644479b352fd5b1996677fd4dcdbb84b",
    "support"
   ],
   "interfaces/webidl.idl": [
@@ -348945,7 +349205,7 @@
    "support"
   ],
   "interfaces/webrtc-pc.idl": [
-   "f3bcd13429b9ab477f7b2422fa4e3ede0bfac88a",
+   "a631e2e0ea0f451c64b5d5f74fe7cbeafc231b8e",
    "support"
   ],
   "interfaces/webusb.idl": [
@@ -349253,7 +349513,7 @@
    "support"
   ],
   "magnetometer/idlharness.https-expected.txt": [
-   "1a7613a0efc56736823db66dc17ca111c5799855",
+   "58e6fe3f6eb2c1aaa6c375594ccb1e22371e4d0c",
    "support"
   ],
   "magnetometer/idlharness.https.html": [
@@ -349917,7 +350177,7 @@
    "support"
   ],
   "mediacapture-record/idlharness-expected.txt": [
-   "4047129823877b8386e21cf3c290c4abf8596597",
+   "54dd192b969fd8753b0addcb89a4280679a18eaa",
    "support"
   ],
   "mediacapture-record/idlharness.html": [
@@ -349965,7 +350225,7 @@
    "testharness"
   ],
   "mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt": [
-   "67c20a2d57949e965b2680db32d10b287f44b393",
+   "f84b5bb360d9fc05466ffd7858365b3d371082e2",
    "support"
   ],
   "mediacapture-streams/MediaDevices-IDL-enumerateDevices.html": [
@@ -351669,7 +351929,7 @@
    "support"
   ],
   "navigation-timing/nav2_idlharness-expected.txt": [
-   "5ae0a0da40fe33e7b09d2b4d4143b733287b8c1d",
+   "50fd86822d1d0b867ada1e711220a768bccee47b",
    "support"
   ],
   "navigation-timing/nav2_idlharness.html": [
@@ -357993,7 +358253,7 @@
    "manual"
   ],
   "orientation-event/idlharness-expected.txt": [
-   "7edbcf0e70f0ee23e9650ff7d5caaf2120eb099e",
+   "0ec1aedc1c570405e398ab5f803b94685ac64d9e",
    "support"
   ],
   "orientation-event/idlharness.html": [
@@ -358140,6 +358400,10 @@
    "e6e93a77c618e8477d79f6cf1ff05d0f5865821c",
    "support"
   ],
+  "orientation-sensor/idlharness.https-expected.txt": [
+   "9f952dd1704fae3cf238d8d6d194ba5a3528c4bd",
+   "support"
+  ],
   "orientation-sensor/idlharness.https.html": [
    "05a95e835ce72800601fcd18007eaec0c05dc79a",
    "testharness"
@@ -358329,7 +358593,7 @@
    "testharness"
   ],
   "payment-handler/interfaces.https.any.worker-expected.txt": [
-   "b9567acc565acb84bb9ef84eb13b1f7f9671fcc8",
+   "cdee73bacd9e8d519238b6825d4d626690dfc183",
    "support"
   ],
   "payment-handler/manifest.json": [
@@ -358508,6 +358772,10 @@
    "6695acdcd1647fdd37702a7f63658dcd50f25596",
    "testharness"
   ],
+  "payment-request/interfaces.https-expected.txt": [
+   "1899cd9e98dc41dd28afea1159fc9f76a2bc2d05",
+   "support"
+  ],
   "payment-request/interfaces.https.html": [
    "d269e8378f2a84ba96c981536667817e0db9e2d1",
    "testharness"
@@ -358649,11 +358917,11 @@
    "manual"
   ],
   "payment-request/show-method-optional-promise-rejects-manual.https.html": [
-   "62542519059ab38ee0753deff5e7e6e587f8adbf",
+   "a8dde7fa5b501688a51f23b330e4cd25273a6146",
    "manual"
   ],
   "payment-request/show-method-optional-promise-resolves-manual.https.html": [
-   "a07f98e117bce1f040c5e62ef3acbd2ef7475338",
+   "a19166fd1366f8510bec53b4e9fc1033a129c44b",
    "manual"
   ],
   "payment-request/show-method-postmessage-iframe.html": [
@@ -358804,6 +359072,10 @@
    "cba44e2dd2a3c54106bfecc6cdd407643e2ba995",
    "manual"
   ],
+  "pointerevents/extension/idlharness-expected.txt": [
+   "db9332073e09350381d96d29805008f95a1012f8",
+   "support"
+  ],
   "pointerevents/extension/idlharness.html": [
    "83ee5397ece0126d71c235cecb554b024e3515d1",
    "testharness"
@@ -358824,6 +359096,10 @@
    "1eb570dbed48373f9e840b7694b774448b689879",
    "manual"
   ],
+  "pointerevents/idlharness-expected.txt": [
+   "db9332073e09350381d96d29805008f95a1012f8",
+   "support"
+  ],
   "pointerevents/idlharness.html": [
    "7db1757e519a8ebb9123dd150f17bf5c6f23e311",
    "testharness"
@@ -359129,7 +359405,7 @@
    "testharness"
   ],
   "pointerlock/idlharness-expected.txt": [
-   "811731b5abff0df19717051ac394eb3e55c83cbe",
+   "a5f5e073e22b8e8400bac62fd5735dca2f2655b7",
    "support"
   ],
   "pointerlock/idlharness.html": [
@@ -359456,6 +359732,10 @@
    "11e15b88340283729db286677cdf66e2eca8efe5",
    "testharness"
   ],
+  "presentation-api/controlling-ua/idlharness.https-expected.txt": [
+   "50798928bacf3d8fb84525fc1018b7749f9e7569",
+   "support"
+  ],
   "presentation-api/controlling-ua/idlharness.https.html": [
    "2c04fce046431ca8e3ddb3eee5428ac99e4c217a",
    "testharness"
@@ -367128,6 +367408,10 @@
    "2779fd2a3bd27a011e8ba20dd6fb214978d8a54c",
    "testharness"
   ],
+  "remote-playback/idlharness-expected.txt": [
+   "c0e20d462dae77394b827c168b2c0ec5a522f65d",
+   "support"
+  ],
   "remote-playback/idlharness.html": [
    "70cfb1603b69e1daff48682cf41e746221158a55",
    "testharness"
@@ -367548,6 +367832,10 @@
    "970c0e5b33815109f17231ffeaf4cea22cf9096c",
    "support"
   ],
+  "screen-orientation/interfaces-expected.txt": [
+   "9579e302e223e4556789c7e26e1b165dab156655",
+   "support"
+  ],
   "screen-orientation/interfaces.html": [
    "d54475008731fafd00c3cae73f11eac94dba0883",
    "testharness"
@@ -367837,7 +368125,7 @@
    "testharness"
   ],
   "selection/interfaces-expected.txt": [
-   "3a228ece24f5df5e9421d35f981ac3fc0e96b3a8",
+   "036ceb7629fed15ded127cb893d50e357dd75787",
    "support"
   ],
   "selection/interfaces.html": [
@@ -369201,11 +369489,11 @@
    "testharness"
   ],
   "service-workers/service-worker/fetch-event.https-expected.txt": [
-   "69e228db59d2442da8d5f20887cf91cc93162225",
+   "a328205d8a37580c329ff5958db6738eac440647",
    "support"
   ],
   "service-workers/service-worker/fetch-event.https.html": [
-   "9d365e1960c873a48cf5378cda7615cbef49f5cd",
+   "1a7e0410ef0e486738ca7c76542c2612228d5bd2",
    "testharness"
   ],
   "service-workers/service-worker/fetch-frame-resource.https.html": [
@@ -370101,7 +370389,7 @@
    "support"
   ],
   "service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html": [
-   "2879ba75fc0135aa9220f5eb5d7e00b8bcf1cbcc",
+   "4d7489b889c98bd66b40369e2d4ed56355ada6ae",
    "support"
   ],
   "service-workers/service-worker/resources/fetch-request-xhr-sync-iframe.html": [
@@ -373644,6 +373932,10 @@
    "551486b9882d33a0ce31740809eaec0352403d69",
    "manual"
   ],
+  "uievents/interfaces-expected.txt": [
+   "036ceb7629fed15ded127cb893d50e357dd75787",
+   "support"
+  ],
   "uievents/interfaces.html": [
    "e755618e522288e9bf6dc4fc592fd6658dc97aba",
    "testharness"
@@ -373956,6 +374248,10 @@
    "4e96209d99278b974347c6bd636454b0e7daf3c4",
    "manual"
   ],
+  "uievents/mouse/mouse_buttons_back_forward-manual.html": [
+   "1688ee49394e0d96b0af131faeccc175b1723a8e",
+   "manual"
+  ],
   "uievents/mouse/mouseevent_move_button-manual.html": [
    "9cc673035fef3c2e8677e8d6679babfe8a1af854",
    "manual"
@@ -374936,6 +375232,10 @@
    "5aff03b7fa469e5ec0dc02a389eca963ae24b470",
    "testharness"
   ],
+  "web-animations/interfaces/AnimationPlaybackEvent/idlharness-expected.txt": [
+   "3f93bbb0ef59a8c2316d62bd08b0b5754e80eefc",
+   "support"
+  ],
   "web-animations/interfaces/AnimationPlaybackEvent/idlharness.html": [
    "d9fc177ebbc3fa0317125912e38a4bfd65f727c8",
    "testharness"
@@ -374981,7 +375281,7 @@
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/idlharness-expected.txt": [
-   "2275f35927d277133447e28a425d4688b19d3cac",
+   "4424d384d87460f1ab0d90d1062ef14e390beee9",
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/idlharness.html": [
@@ -375409,7 +375709,7 @@
    "testharness"
   ],
   "webaudio/idlharness.https-expected.txt": [
-   "1ad2034c399d7c58f8fb1ef6b3de6514c690062a",
+   "773c6b5d77ccdd1ce583e9f0b619d5ceffd6408a",
    "support"
   ],
   "webaudio/idlharness.https.html": [
@@ -375772,6 +376072,10 @@
    "622ca5f882644f183674cc07e55a69e63e5c85d9",
    "testharness"
   ],
+  "webaudio/the-audio-api/the-delaynode-interface/idl-test-expected.txt": [
+   "c7a6109166d21642ce78f02c5cc9894cc46c9081",
+   "support"
+  ],
   "webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [
    "8507a293b696d2d3fc51b429864373606a75eeb6",
    "testharness"
@@ -376080,10 +376384,18 @@
    "472ce38374096ae334fe7a6b0a58457654ce3a77",
    "support"
   ],
-  "webauthn/interfaces.https.html": [
-   "80609bdf53a5919205b235549cd57a859e56ee3b",
+  "webauthn/interfaces.https.any-expected.txt": [
+   "f39185387c83401eb66a92d25e361db9b96e771e",
+   "support"
+  ],
+  "webauthn/interfaces.https.any.js": [
+   "bc3e3c5a85f068efa88c4ed256cc2d270c8eca0f",
    "testharness"
   ],
+  "webauthn/interfaces.https.any.worker-expected.txt": [
+   "f39185387c83401eb66a92d25e361db9b96e771e",
+   "support"
+  ],
   "webauthn/securecontext.http.html": [
    "7abf48e74debed79578e39934d1b84655731a3ea",
    "testharness"
@@ -376953,11 +377265,11 @@
    "testharness"
   ],
   "webrtc/RTCPeerConnection-track-stats.https-expected.txt": [
-   "23ff9a6677c7df017a8ce070c241bfe20c39c553",
+   "0125406c581e8a3a0f309575374ff6e26a83d947",
    "support"
   ],
   "webrtc/RTCPeerConnection-track-stats.https.html": [
-   "92fbaf0f4c596222975edae433725d616dac6082",
+   "55ab0ca3d364b020320fa45a14e50d2897dda13a",
    "testharness"
   ],
   "webrtc/RTCPeerConnectionIceEvent-constructor-expected.txt": [
@@ -377048,12 +377360,12 @@
    "ed910cbe15534cae43b79cc008395bd62fbd0637",
    "testharness"
   ],
-  "webrtc/RTCRtpReceiver-getStats-expected.txt": [
-   "b8677b6ab1d9821d7d8a6a9e7faac7dc2f2c2cfa",
+  "webrtc/RTCRtpReceiver-getStats.https-expected.txt": [
+   "0010ed8df781c7e073669bba0552e325812a6d80",
    "support"
   ],
-  "webrtc/RTCRtpReceiver-getStats.html": [
-   "f00accac88efd9108078b0a3d72751a44f108864",
+  "webrtc/RTCRtpReceiver-getStats.https.html": [
+   "a74bf84faa66028f23c5c0de8ea7b1e89aeed98b",
    "testharness"
   ],
   "webrtc/RTCRtpReceiver-getSynchronizationSources.https-expected.txt": [
@@ -377073,11 +377385,11 @@
    "testharness"
   ],
   "webrtc/RTCRtpSender-getStats.https-expected.txt": [
-   "e733e39c0724de346015e88154c1080760e2ba88",
+   "c8fcb6afd6d9a6e5f08ec8ebc3ad350bc397f4ae",
    "support"
   ],
   "webrtc/RTCRtpSender-getStats.https.html": [
-   "5c480c0d64de4e3ee041b95e5ccaec6264b878b8",
+   "64c4424e36c566294a317fb423eb02e97a9ebbca",
    "testharness"
   ],
   "webrtc/RTCRtpSender-replaceTrack-expected.txt": [
@@ -377181,11 +377493,11 @@
    "support"
   ],
   "webrtc/interfaces.https-expected.txt": [
-   "215189f2052cb1f913baf31c5d319969fd6a8a58",
+   "31fd6cb35abfe55e6db83f072e28fd8c599de714",
    "support"
   ],
   "webrtc/interfaces.https.html": [
-   "efd0c4a62b9c90f27da1188c30e4503755e7f8d2",
+   "ef5a449587001f2bdfe82dad68920972f2aeafb1",
    "testharness"
   ],
   "webrtc/no-media-call.html": [
@@ -378773,7 +379085,7 @@
    "testharness"
   ],
   "webvtt/api/interfaces-expected.txt": [
-   "ebae03a9d2159f3449a8a81ababf876d1c3f9fb4",
+   "c2a27000442469b541ea51990cb8294969905e59",
    "support"
   ],
   "webvtt/api/interfaces.html": [
@@ -381985,7 +382297,7 @@
    "testharness"
   ],
   "workers/interfaces.worker-expected.txt": [
-   "a4e134d3b621fcb6d43e21e1e36590a2ded8030c",
+   "bc17bde851e173eb64d97da90ef9e445951b2055",
    "support"
   ],
   "workers/interfaces.worker.js": [
@@ -383388,6 +383700,10 @@
    "1cb82348a9d6f3be34da762267cce7389f715f7c",
    "testharness"
   ],
+  "xhr/interfaces-expected.txt": [
+   "036ceb7629fed15ded127cb893d50e357dd75787",
+   "support"
+  ],
   "xhr/interfaces.html": [
    "eb4babf67805d1d65bcbc44c6dcc1cb3ca793695",
    "testharness"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness-expected.txt
new file mode 100644
index 0000000..f7b403c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL File API automated IDL tests Uncaught FilePropertyBag inherits BlobPropertyBag, but FilePropertyBag is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness.worker-expected.txt
new file mode 100644
index 0000000..208973bc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/FileAPI/idlharness.worker-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Untitled Uncaught FilePropertyBag inherits BlobPropertyBag, but FilePropertyBag is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.any-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.any-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https-expected.txt
new file mode 100644
index 0000000..e12f54f7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL IDL check of WebCrypto Uncaught RsaKeyGenParams inherits Algorithm, but RsaKeyGenParams is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.worker-expected.txt
index a83da9a..079e704 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.worker-expected.txt
@@ -1,91 +1,4 @@
 This is a testharness.js-based test.
-PASS Window interface: existence and properties of interface object
-FAIL ArrayBuffer interface: existence and properties of interface object assert_false: expected false got true
-PASS ArrayBufferView interface: existence and properties of interface object
-PASS Crypto interface: existence and properties of interface object
-PASS Crypto interface object length
-PASS Crypto interface object name
-PASS Crypto interface: existence and properties of interface prototype object
-PASS Crypto interface: existence and properties of interface prototype object's "constructor" property
-PASS Crypto interface: existence and properties of interface prototype object's @@unscopables property
-PASS Crypto interface: attribute subtle
-PASS Unscopable handled correctly for subtle property on Crypto
-PASS Crypto interface: operation getRandomValues(ArrayBufferView)
-PASS Unscopable handled correctly for getRandomValues(ArrayBufferView) on Crypto
-PASS Crypto must be primary interface of crypto
-PASS Stringification of crypto
-PASS Crypto interface: crypto must inherit property "subtle" with the proper type
-PASS Crypto interface: crypto must inherit property "getRandomValues(ArrayBufferView)" with the proper type
-PASS Crypto interface: calling getRandomValues(ArrayBufferView) on crypto with too few arguments must throw TypeError
-PASS CryptoKey interface: existence and properties of interface object
-PASS CryptoKey interface object length
-PASS CryptoKey interface object name
-PASS CryptoKey interface: existence and properties of interface prototype object
-PASS CryptoKey interface: existence and properties of interface prototype object's "constructor" property
-PASS CryptoKey interface: existence and properties of interface prototype object's @@unscopables property
-PASS CryptoKey interface: attribute type
-PASS Unscopable handled correctly for type property on CryptoKey
-PASS CryptoKey interface: attribute extractable
-PASS Unscopable handled correctly for extractable property on CryptoKey
-PASS CryptoKey interface: attribute algorithm
-PASS Unscopable handled correctly for algorithm property on CryptoKey
-PASS CryptoKey interface: attribute usages
-PASS Unscopable handled correctly for usages property on CryptoKey
-PASS SubtleCrypto interface: existence and properties of interface object
-PASS SubtleCrypto interface object length
-PASS SubtleCrypto interface object name
-PASS SubtleCrypto interface: existence and properties of interface prototype object
-PASS SubtleCrypto interface: existence and properties of interface prototype object's "constructor" property
-PASS SubtleCrypto interface: existence and properties of interface prototype object's @@unscopables property
-PASS SubtleCrypto interface: operation encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)
-PASS Unscopable handled correctly for encrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on SubtleCrypto
-PASS SubtleCrypto interface: operation decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)
-PASS Unscopable handled correctly for decrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on SubtleCrypto
-PASS SubtleCrypto interface: operation sign(AlgorithmIdentifier, CryptoKey, BufferSource)
-PASS Unscopable handled correctly for sign(AlgorithmIdentifier, CryptoKey, BufferSource) on SubtleCrypto
-PASS SubtleCrypto interface: operation verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)
-PASS Unscopable handled correctly for verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource) on SubtleCrypto
-PASS SubtleCrypto interface: operation digest(AlgorithmIdentifier, BufferSource)
-PASS Unscopable handled correctly for digest(AlgorithmIdentifier, BufferSource) on SubtleCrypto
-PASS SubtleCrypto interface: operation generateKey(AlgorithmIdentifier, boolean, [object Object])
-PASS Unscopable handled correctly for generateKey(AlgorithmIdentifier, boolean, [object Object]) on SubtleCrypto
-PASS SubtleCrypto interface: operation deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object])
-PASS Unscopable handled correctly for deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object]) on SubtleCrypto
-PASS SubtleCrypto interface: operation deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)
-PASS Unscopable handled correctly for deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long) on SubtleCrypto
-PASS SubtleCrypto interface: operation importKey(KeyFormat, [object Object],[object Object], AlgorithmIdentifier, boolean, [object Object])
-PASS Unscopable handled correctly for importKey(KeyFormat, [object Object],[object Object], AlgorithmIdentifier, boolean, [object Object]) on SubtleCrypto
-PASS SubtleCrypto interface: operation exportKey(KeyFormat, CryptoKey)
-PASS Unscopable handled correctly for exportKey(KeyFormat, CryptoKey) on SubtleCrypto
-PASS SubtleCrypto interface: operation wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)
-PASS Unscopable handled correctly for wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier) on SubtleCrypto
-PASS SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object])
-PASS Unscopable handled correctly for unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object]) on SubtleCrypto
-PASS SubtleCrypto must be primary interface of crypto.subtle
-PASS Stringification of crypto.subtle
-PASS SubtleCrypto interface: crypto.subtle must inherit property "encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type
-PASS SubtleCrypto interface: calling encrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type
-PASS SubtleCrypto interface: calling decrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "sign(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type
-PASS SubtleCrypto interface: calling sign(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)" with the proper type
-PASS SubtleCrypto interface: calling verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "digest(AlgorithmIdentifier, BufferSource)" with the proper type
-PASS SubtleCrypto interface: calling digest(AlgorithmIdentifier, BufferSource) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "generateKey(AlgorithmIdentifier, boolean, [object Object])" with the proper type
-PASS SubtleCrypto interface: calling generateKey(AlgorithmIdentifier, boolean, [object Object]) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object])" with the proper type
-PASS SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object]) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)" with the proper type
-PASS SubtleCrypto interface: calling deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "importKey(KeyFormat, [object Object],[object Object], AlgorithmIdentifier, boolean, [object Object])" with the proper type
-PASS SubtleCrypto interface: calling importKey(KeyFormat, [object Object],[object Object], AlgorithmIdentifier, boolean, [object Object]) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "exportKey(KeyFormat, CryptoKey)" with the proper type
-PASS SubtleCrypto interface: calling exportKey(KeyFormat, CryptoKey) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)" with the proper type
-PASS SubtleCrypto interface: calling wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier) on crypto.subtle with too few arguments must throw TypeError
-PASS SubtleCrypto interface: crypto.subtle must inherit property "unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object])" with the proper type
-PASS SubtleCrypto interface: calling unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object]) on crypto.subtle with too few arguments must throw TypeError
+FAIL Untitled Uncaught RsaKeyGenParams inherits Algorithm, but RsaKeyGenParams is not an interface.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt
index 1911e73ae..d875b7d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/accelerometer/idlharness.https-expected.txt
@@ -1,89 +1,4 @@
 This is a testharness.js-based test.
-PASS Test IDL implementation of Accelerometer Sensor
-PASS Sensor interface: existence and properties of interface object
-PASS Sensor interface object length
-PASS Sensor interface object name
-PASS Sensor interface: existence and properties of interface prototype object
-PASS Sensor interface: existence and properties of interface prototype object's "constructor" property
-PASS Sensor interface: existence and properties of interface prototype object's @@unscopables property
-PASS Sensor interface: attribute activated
-PASS Unscopable handled correctly for activated property on Sensor
-PASS Sensor interface: attribute hasReading
-PASS Unscopable handled correctly for hasReading property on Sensor
-PASS Sensor interface: attribute timestamp
-PASS Unscopable handled correctly for timestamp property on Sensor
-PASS Sensor interface: operation start()
-PASS Unscopable handled correctly for start() on Sensor
-PASS Sensor interface: operation stop()
-PASS Unscopable handled correctly for stop() on Sensor
-PASS Sensor interface: attribute onreading
-PASS Unscopable handled correctly for onreading property on Sensor
-PASS Sensor interface: attribute onactivate
-PASS Unscopable handled correctly for onactivate property on Sensor
-PASS Sensor interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on Sensor
-PASS Accelerometer interface: existence and properties of interface object
-PASS Accelerometer interface object length
-PASS Accelerometer interface object name
-PASS Accelerometer interface: existence and properties of interface prototype object
-PASS Accelerometer interface: existence and properties of interface prototype object's "constructor" property
-PASS Accelerometer interface: existence and properties of interface prototype object's @@unscopables property
-PASS Accelerometer interface: attribute x
-PASS Unscopable handled correctly for x property on Accelerometer
-PASS Accelerometer interface: attribute y
-PASS Unscopable handled correctly for y property on Accelerometer
-PASS Accelerometer interface: attribute z
-PASS Unscopable handled correctly for z property on Accelerometer
-PASS Accelerometer must be primary interface of new Accelerometer();
-PASS Stringification of new Accelerometer();
-PASS Accelerometer interface: new Accelerometer(); must inherit property "x" with the proper type
-PASS Accelerometer interface: new Accelerometer(); must inherit property "y" with the proper type
-PASS Accelerometer interface: new Accelerometer(); must inherit property "z" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "activated" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "hasReading" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "timestamp" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "start()" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "stop()" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "onreading" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "onactivate" with the proper type
-PASS Sensor interface: new Accelerometer(); must inherit property "onerror" with the proper type
-PASS LinearAccelerationSensor interface: existence and properties of interface object
-PASS LinearAccelerationSensor interface object length
-PASS LinearAccelerationSensor interface object name
-PASS LinearAccelerationSensor interface: existence and properties of interface prototype object
-PASS LinearAccelerationSensor interface: existence and properties of interface prototype object's "constructor" property
-PASS LinearAccelerationSensor interface: existence and properties of interface prototype object's @@unscopables property
-PASS LinearAccelerationSensor must be primary interface of new LinearAccelerationSensor();
-PASS Stringification of new LinearAccelerationSensor();
-PASS Accelerometer interface: new LinearAccelerationSensor(); must inherit property "x" with the proper type
-PASS Accelerometer interface: new LinearAccelerationSensor(); must inherit property "y" with the proper type
-PASS Accelerometer interface: new LinearAccelerationSensor(); must inherit property "z" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "activated" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "hasReading" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "timestamp" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "start()" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "stop()" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "onreading" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "onactivate" with the proper type
-PASS Sensor interface: new LinearAccelerationSensor(); must inherit property "onerror" with the proper type
-FAIL GravitySensor interface: existence and properties of interface object assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing
-FAIL GravitySensor interface object length assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing
-FAIL GravitySensor interface object name assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing
-FAIL GravitySensor interface: existence and properties of interface prototype object assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing
-FAIL GravitySensor interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing
-FAIL GravitySensor interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "GravitySensor" expected property "GravitySensor" missing
-FAIL GravitySensor must be primary interface of new GravitySensor(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Stringification of new GravitySensor(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Accelerometer interface: new GravitySensor(); must inherit property "x" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Accelerometer interface: new GravitySensor(); must inherit property "y" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Accelerometer interface: new GravitySensor(); must inherit property "z" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "activated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "hasReading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "timestamp" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "start()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "stop()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "onreading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "onactivate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
-FAIL Sensor interface: new GravitySensor(); must inherit property "onerror" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GravitySensor is not defined"
+FAIL Test IDL implementation of Accelerometer Sensor promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt
index 9831c3d5..3ee21107 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt
@@ -1,124 +1,5 @@
 This is a testharness.js-based test.
 PASS Service Worker-scoped tests.
-PASS Exposed interfaces in a Service Worker.
-FAIL ServiceWorkerRegistration interface: existence and properties of interface object assert_false: expected false got true
-FAIL ServiceWorkerGlobalScope interface: attribute onbackgroundfetched assert_true: The prototype object must have a property "onbackgroundfetched" expected true got false
-PASS Unscopable handled correctly for onbackgroundfetched property on ServiceWorkerGlobalScope
-FAIL ServiceWorkerGlobalScope interface: attribute onbackgroundfetchfail assert_true: The prototype object must have a property "onbackgroundfetchfail" expected true got false
-PASS Unscopable handled correctly for onbackgroundfetchfail property on ServiceWorkerGlobalScope
-FAIL ServiceWorkerGlobalScope interface: attribute onbackgroundfetchabort assert_true: The prototype object must have a property "onbackgroundfetchabort" expected true got false
-PASS Unscopable handled correctly for onbackgroundfetchabort property on ServiceWorkerGlobalScope
-FAIL ServiceWorkerGlobalScope interface: attribute onbackgroundfetchclick assert_true: The prototype object must have a property "onbackgroundfetchclick" expected true got false
-PASS Unscopable handled correctly for onbackgroundfetchclick property on ServiceWorkerGlobalScope
-PASS BackgroundFetchManager interface: existence and properties of interface object
-PASS BackgroundFetchManager interface object length
-PASS BackgroundFetchManager interface object name
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions)
-PASS Unscopable handled correctly for fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) on BackgroundFetchManager
-PASS BackgroundFetchManager interface: operation get(DOMString)
-PASS Unscopable handled correctly for get(DOMString) on BackgroundFetchManager
-PASS BackgroundFetchManager interface: operation getIds()
-PASS Unscopable handled correctly for getIds() on BackgroundFetchManager
-FAIL BackgroundFetchRegistration interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchRegistration interface object length
-PASS BackgroundFetchRegistration interface object name
-FAIL BackgroundFetchRegistration interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchRegistration interface: attribute id
-PASS Unscopable handled correctly for id property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute uploadTotal
-PASS Unscopable handled correctly for uploadTotal property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute uploaded
-PASS Unscopable handled correctly for uploaded property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute downloadTotal
-PASS Unscopable handled correctly for downloadTotal property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute downloaded
-PASS Unscopable handled correctly for downloaded property on BackgroundFetchRegistration
-FAIL BackgroundFetchRegistration interface: attribute activeFetches assert_true: The prototype object must have a property "activeFetches" expected true got false
-PASS Unscopable handled correctly for activeFetches property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute onprogress
-PASS Unscopable handled correctly for onprogress property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: operation abort()
-PASS Unscopable handled correctly for abort() on BackgroundFetchRegistration
-PASS BackgroundFetchFetch interface: existence and properties of interface object
-PASS BackgroundFetchFetch interface object length
-PASS BackgroundFetchFetch interface object name
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchFetch interface: attribute request
-PASS Unscopable handled correctly for request property on BackgroundFetchFetch
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface object length assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface object name assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: operation match(RequestInfo) assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-PASS Unscopable handled correctly for match(RequestInfo) on BackgroundFetchActiveFetches
-FAIL BackgroundFetchActiveFetches interface: operation values() assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-PASS Unscopable handled correctly for values() on BackgroundFetchActiveFetches
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface object length assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface object name assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: attribute responseReady assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-PASS Unscopable handled correctly for responseReady property on BackgroundFetchActiveFetch
-FAIL BackgroundFetchEvent interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchEvent interface object length
-PASS BackgroundFetchEvent interface object name
-FAIL BackgroundFetchEvent interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchEvent interface: attribute id
-PASS Unscopable handled correctly for id property on BackgroundFetchEvent
-FAIL BackgroundFetchSettledEvent interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchSettledEvent" expected property "BackgroundFetchSettledEvent" missing
-FAIL BackgroundFetchSettledEvent interface object length assert_own_property: self does not have own property "BackgroundFetchSettledEvent" expected property "BackgroundFetchSettledEvent" missing
-FAIL BackgroundFetchSettledEvent interface object name assert_own_property: self does not have own property "BackgroundFetchSettledEvent" expected property "BackgroundFetchSettledEvent" missing
-FAIL BackgroundFetchSettledEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchSettledEvent" expected property "BackgroundFetchSettledEvent" missing
-FAIL BackgroundFetchSettledEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchSettledEvent" expected property "BackgroundFetchSettledEvent" missing
-FAIL BackgroundFetchSettledEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchSettledEvent" expected property "BackgroundFetchSettledEvent" missing
-FAIL BackgroundFetchSettledEvent interface: attribute fetches assert_own_property: self does not have own property "BackgroundFetchSettledEvent" expected property "BackgroundFetchSettledEvent" missing
-PASS Unscopable handled correctly for fetches property on BackgroundFetchSettledEvent
-FAIL BackgroundFetchSettledFetches interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-FAIL BackgroundFetchSettledFetches interface object length assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-FAIL BackgroundFetchSettledFetches interface object name assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-FAIL BackgroundFetchSettledFetches interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-FAIL BackgroundFetchSettledFetches interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-FAIL BackgroundFetchSettledFetches interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-FAIL BackgroundFetchSettledFetches interface: operation match(RequestInfo) assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-PASS Unscopable handled correctly for match(RequestInfo) on BackgroundFetchSettledFetches
-FAIL BackgroundFetchSettledFetches interface: operation values() assert_own_property: self does not have own property "BackgroundFetchSettledFetches" expected property "BackgroundFetchSettledFetches" missing
-PASS Unscopable handled correctly for values() on BackgroundFetchSettledFetches
-PASS BackgroundFetchSettledFetch interface: existence and properties of interface object
-FAIL BackgroundFetchSettledFetch interface object length assert_equals: wrong value for BackgroundFetchSettledFetch.length expected 0 but got 2
-PASS BackgroundFetchSettledFetch interface object name
-PASS BackgroundFetchSettledFetch interface: existence and properties of interface prototype object
-PASS BackgroundFetchSettledFetch interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchSettledFetch interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchSettledFetch interface: attribute response
-PASS Unscopable handled correctly for response property on BackgroundFetchSettledFetch
-FAIL BackgroundFetchUpdateEvent interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchUpdateEvent" expected property "BackgroundFetchUpdateEvent" missing
-FAIL BackgroundFetchUpdateEvent interface object length assert_own_property: self does not have own property "BackgroundFetchUpdateEvent" expected property "BackgroundFetchUpdateEvent" missing
-FAIL BackgroundFetchUpdateEvent interface object name assert_own_property: self does not have own property "BackgroundFetchUpdateEvent" expected property "BackgroundFetchUpdateEvent" missing
-FAIL BackgroundFetchUpdateEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchUpdateEvent" expected property "BackgroundFetchUpdateEvent" missing
-FAIL BackgroundFetchUpdateEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchUpdateEvent" expected property "BackgroundFetchUpdateEvent" missing
-FAIL BackgroundFetchUpdateEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchUpdateEvent" expected property "BackgroundFetchUpdateEvent" missing
-FAIL BackgroundFetchUpdateEvent interface: operation updateUI(DOMString) assert_own_property: self does not have own property "BackgroundFetchUpdateEvent" expected property "BackgroundFetchUpdateEvent" missing
-PASS Unscopable handled correctly for updateUI(DOMString) on BackgroundFetchUpdateEvent
-PASS BackgroundFetchClickEvent interface: existence and properties of interface object
-PASS BackgroundFetchClickEvent interface object length
-PASS BackgroundFetchClickEvent interface object name
-FAIL BackgroundFetchClickEvent interface: existence and properties of interface prototype object Cannot read property 'has_stringifier' of undefined
-PASS BackgroundFetchClickEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchClickEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchClickEvent interface: attribute state
-PASS Unscopable handled correctly for state property on BackgroundFetchClickEvent
+FAIL Exposed interfaces in a Service Worker. promise_test: Unhandled rejection with value: object "BackgroundFetchRegistration inherits EventTarget, but EventTarget is undefined."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt
index 8340efd..e9ff166 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt
@@ -1,73 +1,4 @@
 This is a testharness.js-based test.
-Found 69 tests; 50 PASS, 19 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Exposed interfaces in a Service Worker.
-FAIL ServiceWorkerRegistration interface: existence and properties of interface object assert_false: expected false got true
-PASS ServiceWorkerGlobalScope interface: existence and properties of interface object
-PASS BackgroundFetchManager interface: existence and properties of interface object
-PASS BackgroundFetchManager interface object length
-PASS BackgroundFetchManager interface object name
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions)
-PASS Unscopable handled correctly for fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) on BackgroundFetchManager
-PASS BackgroundFetchManager interface: operation get(DOMString)
-PASS Unscopable handled correctly for get(DOMString) on BackgroundFetchManager
-PASS BackgroundFetchManager interface: operation getIds()
-PASS Unscopable handled correctly for getIds() on BackgroundFetchManager
-FAIL BackgroundFetchRegistration interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchRegistration interface object length
-PASS BackgroundFetchRegistration interface object name
-FAIL BackgroundFetchRegistration interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchRegistration interface: attribute id
-PASS Unscopable handled correctly for id property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute uploadTotal
-PASS Unscopable handled correctly for uploadTotal property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute uploaded
-PASS Unscopable handled correctly for uploaded property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute downloadTotal
-PASS Unscopable handled correctly for downloadTotal property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute downloaded
-PASS Unscopable handled correctly for downloaded property on BackgroundFetchRegistration
-FAIL BackgroundFetchRegistration interface: attribute activeFetches assert_true: The prototype object must have a property "activeFetches" expected true got false
-PASS Unscopable handled correctly for activeFetches property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute onprogress
-PASS Unscopable handled correctly for onprogress property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: operation abort()
-PASS Unscopable handled correctly for abort() on BackgroundFetchRegistration
-PASS BackgroundFetchFetch interface: existence and properties of interface object
-PASS BackgroundFetchFetch interface object length
-PASS BackgroundFetchFetch interface object name
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchFetch interface: attribute request
-PASS Unscopable handled correctly for request property on BackgroundFetchFetch
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface object length assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface object name assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: operation match(RequestInfo) assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-PASS Unscopable handled correctly for match(RequestInfo) on BackgroundFetchActiveFetches
-FAIL BackgroundFetchActiveFetches interface: operation values() assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-PASS Unscopable handled correctly for values() on BackgroundFetchActiveFetches
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface object length assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface object name assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: attribute responseReady assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-PASS Unscopable handled correctly for responseReady property on BackgroundFetchActiveFetch
-PASS BackgroundFetchEvent interface: existence and properties of interface object
-PASS BackgroundFetchSettledEvent interface: existence and properties of interface object
-PASS BackgroundFetchSettledFetches interface: existence and properties of interface object
-PASS BackgroundFetchSettledFetch interface: existence and properties of interface object
-PASS BackgroundFetchUpdateEvent interface: existence and properties of interface object
-PASS BackgroundFetchClickEvent interface: existence and properties of interface object
+FAIL Exposed interfaces in a Service Worker. promise_test: Unhandled rejection with value: object "BackgroundFetchRegistration inherits EventTarget, but EventTarget is undefined."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https-expected.txt
index b31ecfc3..9fe093ef 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https-expected.txt
@@ -1,40 +1,4 @@
 This is a testharness.js-based test.
-PASS Test driver
-PASS Navigator interface: attribute clipboard
-PASS Unscopable handled correctly for clipboard property on Navigator
-PASS Navigator interface: navigator must inherit property "clipboard" with the proper type
-FAIL ClipboardEvent interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS ClipboardEvent interface object length
-PASS ClipboardEvent interface object name
-FAIL ClipboardEvent interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS ClipboardEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS ClipboardEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS ClipboardEvent interface: attribute clipboardData
-PASS Unscopable handled correctly for clipboardData property on ClipboardEvent
-PASS ClipboardEvent must be primary interface of new ClipboardEvent("x")
-FAIL Stringification of new ClipboardEvent("x") Cannot read property 'has_stringifier' of undefined
-PASS ClipboardEvent interface: new ClipboardEvent("x") must inherit property "clipboardData" with the proper type
-PASS Clipboard interface: existence and properties of interface object
-PASS Clipboard interface object length
-PASS Clipboard interface object name
-PASS Clipboard interface: existence and properties of interface prototype object
-PASS Clipboard interface: existence and properties of interface prototype object's "constructor" property
-PASS Clipboard interface: existence and properties of interface prototype object's @@unscopables property
-PASS Clipboard interface: operation read()
-PASS Unscopable handled correctly for read() on Clipboard
-PASS Clipboard interface: operation readText()
-PASS Unscopable handled correctly for readText() on Clipboard
-PASS Clipboard interface: operation write(DataTransfer)
-PASS Unscopable handled correctly for write(DataTransfer) on Clipboard
-PASS Clipboard interface: operation writeText(DOMString)
-PASS Unscopable handled correctly for writeText(DOMString) on Clipboard
-PASS Clipboard must be primary interface of navigator.clipboard
-PASS Stringification of navigator.clipboard
-PASS Clipboard interface: navigator.clipboard must inherit property "read()" with the proper type
-PASS Clipboard interface: navigator.clipboard must inherit property "readText()" with the proper type
-PASS Clipboard interface: navigator.clipboard must inherit property "write(DataTransfer)" with the proper type
-PASS Clipboard interface: calling write(DataTransfer) on navigator.clipboard with too few arguments must throw TypeError
-PASS Clipboard interface: navigator.clipboard must inherit property "writeText(DOMString)" with the proper type
-PASS Clipboard interface: calling writeText(DOMString) on navigator.clipboard with too few arguments must throw TypeError
+FAIL Test driver promise_test: Unhandled rejection with value: object "ClipboardEventInit inherits EventInit, but ClipboardEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/idlharness.tentative-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/idlharness.tentative-expected.txt
new file mode 100644
index 0000000..4033441d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/idlharness.tentative-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Interface test promise_test: Unhandled rejection with value: object "HTMLFormControlsCollection inherits HTMLCollection, but HTMLCollection is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookie-store/idlharness_serviceworker.tentative.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/idlharness_serviceworker.tentative.https-expected.txt
new file mode 100644
index 0000000..f239ff9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/cookie-store/idlharness_serviceworker.tentative.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Interface test promise_test: Unhandled rejection with value: object "CookieChangeEventInit inherits EventInit, but CookieChangeEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/credential-management/idl.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/credential-management/idl.https-expected.txt
new file mode 100644
index 0000000..6625e26c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/credential-management/idl.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Untitled Uncaught PasswordCredentialData inherits CredentialData, but PasswordCredentialData is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-overflow/logical-overflow-001-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-overflow/logical-overflow-001-expected.txt
new file mode 100644
index 0000000..7e887cf0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-overflow/logical-overflow-001-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL overflow-x matches overflow-inline, and overflow-y matches overflow-block when the element has a horizontal writing mode assert_equals: expected "scroll" but got "visible"
+FAIL overflow-y matches overflow-inline, and overflow-x matches overflow-block when the element has a vertical writing mode assert_equals: expected "hidden" but got "visible"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-overflow/logical-overflow-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-overflow/logical-overflow-001.html
new file mode 100644
index 0000000..15bf57f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-overflow/logical-overflow-001.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: flow-relative versions of overflow-x and -y</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-3/#logical">
+<link rel="help" href="https://drafts.csswg.org/css-logical/#box">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#d1, #d2 {
+  overflow-block: hidden;
+  overflow-inline: scroll
+}
+#d1 {
+  writing-mode: horizontal-tb;
+}
+#d2 {
+  writing-mode: vertical-rl;
+}
+
+</style>
+<body>
+  <div id="log"></div>
+
+  <div id=d1></div>
+  <div id=d2></div>
+
+  <script>
+    test(
+      function(){
+        var target = document.getElementById("d1");
+        assert_equals(getComputedStyle(target).overflowX, "scroll");
+        assert_equals(getComputedStyle(target).overflowY, "hidden");
+      }, "overflow-x matches overflow-inline, and overflow-y matches overflow-block when the element has a horizontal writing mode");
+    test(
+      function(){
+        var target = document.getElementById("d2");
+        assert_equals(getComputedStyle(target).overflowX, "hidden");
+        assert_equals(getComputedStyle(target).overflowY, "scroll");
+      }, "overflow-y matches overflow-inline, and overflow-x matches overflow-block when the element has a vertical writing mode");
+  </script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt
index 3514a3c4..a4d96d9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/cssom-view/interfaces-expected.txt
@@ -1,389 +1,4 @@
 This is a testharness.js-based test.
-Found 385 tests; 310 PASS, 75 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Test driver
-PASS HTMLElement interface: attribute offsetParent
-PASS Unscopable handled correctly for offsetParent property on HTMLElement
-PASS HTMLElement interface: attribute offsetTop
-PASS Unscopable handled correctly for offsetTop property on HTMLElement
-PASS HTMLElement interface: attribute offsetLeft
-PASS Unscopable handled correctly for offsetLeft property on HTMLElement
-PASS HTMLElement interface: attribute offsetWidth
-PASS Unscopable handled correctly for offsetWidth property on HTMLElement
-PASS HTMLElement interface: attribute offsetHeight
-PASS Unscopable handled correctly for offsetHeight property on HTMLElement
-PASS HTMLElement interface: document.createElement('div') must inherit property "offsetParent" with the proper type
-PASS HTMLElement interface: document.createElement('div') must inherit property "offsetTop" with the proper type
-PASS HTMLElement interface: document.createElement('div') must inherit property "offsetLeft" with the proper type
-PASS HTMLElement interface: document.createElement('div') must inherit property "offsetWidth" with the proper type
-PASS HTMLElement interface: document.createElement('div') must inherit property "offsetHeight" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "getClientRects()" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "getBoundingClientRect()" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "scrollIntoView([object Object],[object Object])" with the proper type
-PASS Element interface: calling scrollIntoView([object Object],[object Object]) on document.createElement('div') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('div') must inherit property "scroll(ScrollToOptions)" with the proper type
-PASS Element interface: calling scroll(ScrollToOptions) on document.createElement('div') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('div') must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scroll(unrestricted double, unrestricted double) on document.createElement('div') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('div') must inherit property "scrollTo(ScrollToOptions)" with the proper type
-PASS Element interface: calling scrollTo(ScrollToOptions) on document.createElement('div') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('div') must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scrollTo(unrestricted double, unrestricted double) on document.createElement('div') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('div') must inherit property "scrollBy(ScrollToOptions)" with the proper type
-PASS Element interface: calling scrollBy(ScrollToOptions) on document.createElement('div') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('div') must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scrollBy(unrestricted double, unrestricted double) on document.createElement('div') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('div') must inherit property "scrollTop" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "scrollLeft" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "scrollWidth" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "scrollHeight" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "clientTop" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "clientLeft" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "clientWidth" with the proper type
-PASS Element interface: document.createElement('div') must inherit property "clientHeight" with the proper type
-FAIL Element interface: document.createElement('div') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Element interface: document.createElement('div') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Element interface: document.createElement('div') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Element interface: document.createElement('div') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain
-FAIL Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain
-PASS HTMLImageElement interface: attribute x
-PASS Unscopable handled correctly for x property on HTMLImageElement
-PASS HTMLImageElement interface: attribute y
-PASS Unscopable handled correctly for y property on HTMLImageElement
-PASS HTMLImageElement interface: document.createElement('img') must inherit property "x" with the proper type
-PASS HTMLImageElement interface: document.createElement('img') must inherit property "y" with the proper type
-PASS HTMLElement interface: document.createElement('img') must inherit property "offsetParent" with the proper type
-PASS HTMLElement interface: document.createElement('img') must inherit property "offsetTop" with the proper type
-PASS HTMLElement interface: document.createElement('img') must inherit property "offsetLeft" with the proper type
-PASS HTMLElement interface: document.createElement('img') must inherit property "offsetWidth" with the proper type
-PASS HTMLElement interface: document.createElement('img') must inherit property "offsetHeight" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "getClientRects()" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "getBoundingClientRect()" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "scrollIntoView([object Object],[object Object])" with the proper type
-PASS Element interface: calling scrollIntoView([object Object],[object Object]) on document.createElement('img') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('img') must inherit property "scroll(ScrollToOptions)" with the proper type
-PASS Element interface: calling scroll(ScrollToOptions) on document.createElement('img') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('img') must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scroll(unrestricted double, unrestricted double) on document.createElement('img') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('img') must inherit property "scrollTo(ScrollToOptions)" with the proper type
-PASS Element interface: calling scrollTo(ScrollToOptions) on document.createElement('img') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('img') must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scrollTo(unrestricted double, unrestricted double) on document.createElement('img') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('img') must inherit property "scrollBy(ScrollToOptions)" with the proper type
-PASS Element interface: calling scrollBy(ScrollToOptions) on document.createElement('img') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('img') must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scrollBy(unrestricted double, unrestricted double) on document.createElement('img') with too few arguments must throw TypeError
-PASS Element interface: document.createElement('img') must inherit property "scrollTop" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "scrollLeft" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "scrollWidth" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "scrollHeight" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "clientTop" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "clientLeft" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "clientWidth" with the proper type
-PASS Element interface: document.createElement('img') must inherit property "clientHeight" with the proper type
-FAIL Element interface: document.createElement('img') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Element interface: document.createElement('img') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Element interface: document.createElement('img') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Element interface: document.createElement('img') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain
-FAIL Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain
-PASS Window interface: operation matchMedia(CSSOMString)
-PASS Unscopable handled correctly for matchMedia(CSSOMString) on Window
-PASS Window interface: attribute screen
-PASS Unscopable handled correctly for screen property on Window
-PASS Window interface: operation moveTo(long, long)
-PASS Unscopable handled correctly for moveTo(long, long) on Window
-PASS Window interface: operation moveBy(long, long)
-PASS Unscopable handled correctly for moveBy(long, long) on Window
-PASS Window interface: operation resizeTo(long, long)
-PASS Unscopable handled correctly for resizeTo(long, long) on Window
-PASS Window interface: operation resizeBy(long, long)
-PASS Unscopable handled correctly for resizeBy(long, long) on Window
-PASS Window interface: attribute innerWidth
-PASS Unscopable handled correctly for innerWidth property on Window
-PASS Window interface: attribute innerHeight
-PASS Unscopable handled correctly for innerHeight property on Window
-PASS Window interface: attribute scrollX
-PASS Unscopable handled correctly for scrollX property on Window
-PASS Window interface: attribute pageXOffset
-PASS Unscopable handled correctly for pageXOffset property on Window
-PASS Window interface: attribute scrollY
-PASS Unscopable handled correctly for scrollY property on Window
-PASS Window interface: attribute pageYOffset
-PASS Unscopable handled correctly for pageYOffset property on Window
-FAIL Window interface: operation scroll(ScrollToOptions) assert_equals: property has wrong .length expected 0 but got 2
-PASS Unscopable handled correctly for scroll(ScrollToOptions) on Window
-FAIL Window interface: operation scroll(unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 2
-PASS Unscopable handled correctly for scroll(unrestricted double, unrestricted double) on Window
-FAIL Window interface: operation scrollTo(ScrollToOptions) assert_equals: property has wrong .length expected 0 but got 2
-PASS Unscopable handled correctly for scrollTo(ScrollToOptions) on Window
-FAIL Window interface: operation scrollTo(unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 2
-PASS Unscopable handled correctly for scrollTo(unrestricted double, unrestricted double) on Window
-FAIL Window interface: operation scrollBy(ScrollToOptions) assert_equals: property has wrong .length expected 0 but got 2
-PASS Unscopable handled correctly for scrollBy(ScrollToOptions) on Window
-FAIL Window interface: operation scrollBy(unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 2
-PASS Unscopable handled correctly for scrollBy(unrestricted double, unrestricted double) on Window
-PASS Window interface: attribute screenX
-PASS Unscopable handled correctly for screenX property on Window
-PASS Window interface: attribute screenY
-PASS Unscopable handled correctly for screenY property on Window
-PASS Window interface: attribute outerWidth
-PASS Unscopable handled correctly for outerWidth property on Window
-PASS Window interface: attribute outerHeight
-PASS Unscopable handled correctly for outerHeight property on Window
-PASS Window interface: attribute devicePixelRatio
-PASS Unscopable handled correctly for devicePixelRatio property on Window
-PASS Window interface: window must inherit property "matchMedia(CSSOMString)" with the proper type
-PASS Window interface: calling matchMedia(CSSOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "screen" with the proper type
-PASS Window interface: window must inherit property "moveTo(long, long)" with the proper type
-PASS Window interface: calling moveTo(long, long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "moveBy(long, long)" with the proper type
-PASS Window interface: calling moveBy(long, long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "resizeTo(long, long)" with the proper type
-PASS Window interface: calling resizeTo(long, long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "resizeBy(long, long)" with the proper type
-PASS Window interface: calling resizeBy(long, long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "innerWidth" with the proper type
-PASS Window interface: window must inherit property "innerHeight" with the proper type
-PASS Window interface: window must inherit property "scrollX" with the proper type
-PASS Window interface: window must inherit property "pageXOffset" with the proper type
-PASS Window interface: window must inherit property "scrollY" with the proper type
-PASS Window interface: window must inherit property "pageYOffset" with the proper type
-PASS Window interface: window must inherit property "scroll(ScrollToOptions)" with the proper type
-PASS Window interface: calling scroll(ScrollToOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type
-PASS Window interface: calling scroll(unrestricted double, unrestricted double) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "scrollTo(ScrollToOptions)" with the proper type
-PASS Window interface: calling scrollTo(ScrollToOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type
-PASS Window interface: calling scrollTo(unrestricted double, unrestricted double) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "scrollBy(ScrollToOptions)" with the proper type
-PASS Window interface: calling scrollBy(ScrollToOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type
-PASS Window interface: calling scrollBy(unrestricted double, unrestricted double) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "screenX" with the proper type
-PASS Window interface: window must inherit property "screenY" with the proper type
-PASS Window interface: window must inherit property "outerWidth" with the proper type
-PASS Window interface: window must inherit property "outerHeight" with the proper type
-PASS Window interface: window must inherit property "devicePixelRatio" with the proper type
-PASS WorkerGlobalScope interface: existence and properties of interface object
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
-PASS SharedWorkerGlobalScope interface: existence and properties of interface object
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS WorkerLocation interface: existence and properties of interface object
-PASS Document interface: operation elementFromPoint(double, double)
-PASS Unscopable handled correctly for elementFromPoint(double, double) on Document
-PASS Document interface: operation elementsFromPoint(double, double)
-PASS Unscopable handled correctly for elementsFromPoint(double, double) on Document
-FAIL Document interface: operation caretPositionFromPoint(double, double) assert_own_property: interface prototype object missing non-static operation expected property "caretPositionFromPoint" missing
-PASS Unscopable handled correctly for caretPositionFromPoint(double, double) on Document
-PASS Document interface: attribute scrollingElement
-PASS Unscopable handled correctly for scrollingElement property on Document
-FAIL Document interface: operation getBoxQuads(BoxQuadOptions) assert_own_property: interface prototype object missing non-static operation expected property "getBoxQuads" missing
-PASS Unscopable handled correctly for getBoxQuads(BoxQuadOptions) on Document
-FAIL Document interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertQuadFromNode" missing
-PASS Unscopable handled correctly for convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on Document
-FAIL Document interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertRectFromNode" missing
-PASS Unscopable handled correctly for convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on Document
-FAIL Document interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertPointFromNode" missing
-PASS Unscopable handled correctly for convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on Document
-PASS Document interface: document must inherit property "elementFromPoint(double, double)" with the proper type
-PASS Document interface: calling elementFromPoint(double, double) on document with too few arguments must throw TypeError
-PASS Document interface: document must inherit property "elementsFromPoint(double, double)" with the proper type
-PASS Document interface: calling elementsFromPoint(double, double) on document with too few arguments must throw TypeError
-FAIL Document interface: document must inherit property "caretPositionFromPoint(double, double)" with the proper type assert_inherits: property "caretPositionFromPoint" not found in prototype chain
-FAIL Document interface: calling caretPositionFromPoint(double, double) on document with too few arguments must throw TypeError assert_inherits: property "caretPositionFromPoint" not found in prototype chain
-PASS Document interface: document must inherit property "scrollingElement" with the proper type
-FAIL Document interface: document must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Document interface: calling getBoxQuads(BoxQuadOptions) on document with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Document interface: document must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Document interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Document interface: document must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Document interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Document interface: document must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain
-FAIL Document interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain
-PASS Element interface: operation getClientRects()
-PASS Unscopable handled correctly for getClientRects() on Element
-PASS Element interface: operation getBoundingClientRect()
-PASS Unscopable handled correctly for getBoundingClientRect() on Element
-PASS Element interface: operation scrollIntoView([object Object],[object Object])
-PASS Unscopable handled correctly for scrollIntoView([object Object],[object Object]) on Element
-PASS Element interface: operation scroll(ScrollToOptions)
-PASS Unscopable handled correctly for scroll(ScrollToOptions) on Element
-PASS Element interface: operation scroll(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scroll(unrestricted double, unrestricted double) on Element
-PASS Element interface: operation scrollTo(ScrollToOptions)
-PASS Unscopable handled correctly for scrollTo(ScrollToOptions) on Element
-PASS Element interface: operation scrollTo(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scrollTo(unrestricted double, unrestricted double) on Element
-PASS Element interface: operation scrollBy(ScrollToOptions)
-PASS Unscopable handled correctly for scrollBy(ScrollToOptions) on Element
-PASS Element interface: operation scrollBy(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scrollBy(unrestricted double, unrestricted double) on Element
-PASS Element interface: attribute scrollTop
-PASS Unscopable handled correctly for scrollTop property on Element
-PASS Element interface: attribute scrollLeft
-PASS Unscopable handled correctly for scrollLeft property on Element
-PASS Element interface: attribute scrollWidth
-PASS Unscopable handled correctly for scrollWidth property on Element
-PASS Element interface: attribute scrollHeight
-PASS Unscopable handled correctly for scrollHeight property on Element
-PASS Element interface: attribute clientTop
-PASS Unscopable handled correctly for clientTop property on Element
-PASS Element interface: attribute clientLeft
-PASS Unscopable handled correctly for clientLeft property on Element
-PASS Element interface: attribute clientWidth
-PASS Unscopable handled correctly for clientWidth property on Element
-PASS Element interface: attribute clientHeight
-PASS Unscopable handled correctly for clientHeight property on Element
-FAIL Element interface: operation getBoxQuads(BoxQuadOptions) assert_own_property: interface prototype object missing non-static operation expected property "getBoxQuads" missing
-PASS Unscopable handled correctly for getBoxQuads(BoxQuadOptions) on Element
-FAIL Element interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertQuadFromNode" missing
-PASS Unscopable handled correctly for convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on Element
-FAIL Element interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertRectFromNode" missing
-PASS Unscopable handled correctly for convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on Element
-FAIL Element interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertPointFromNode" missing
-PASS Unscopable handled correctly for convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on Element
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "getClientRects()" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "getBoundingClientRect()" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollIntoView([object Object],[object Object])" with the proper type
-PASS Element interface: calling scrollIntoView([object Object],[object Object]) on document.createElementNS('x', 'y') with too few arguments must throw TypeError
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scroll(ScrollToOptions)" with the proper type
-PASS Element interface: calling scroll(ScrollToOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scroll(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scroll(unrestricted double, unrestricted double) on document.createElementNS('x', 'y') with too few arguments must throw TypeError
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollTo(ScrollToOptions)" with the proper type
-PASS Element interface: calling scrollTo(ScrollToOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollTo(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scrollTo(unrestricted double, unrestricted double) on document.createElementNS('x', 'y') with too few arguments must throw TypeError
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollBy(ScrollToOptions)" with the proper type
-PASS Element interface: calling scrollBy(ScrollToOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollBy(unrestricted double, unrestricted double)" with the proper type
-PASS Element interface: calling scrollBy(unrestricted double, unrestricted double) on document.createElementNS('x', 'y') with too few arguments must throw TypeError
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollTop" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollLeft" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollWidth" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "scrollHeight" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientTop" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientLeft" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientWidth" with the proper type
-PASS Element interface: document.createElementNS('x', 'y') must inherit property "clientHeight" with the proper type
-FAIL Element interface: document.createElementNS('x', 'y') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Element interface: document.createElementNS('x', 'y') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Element interface: document.createElementNS('x', 'y') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Element interface: document.createElementNS('x', 'y') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain
-FAIL Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain
-FAIL Text interface: operation getBoxQuads(BoxQuadOptions) assert_own_property: interface prototype object missing non-static operation expected property "getBoxQuads" missing
-PASS Unscopable handled correctly for getBoxQuads(BoxQuadOptions) on Text
-FAIL Text interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertQuadFromNode" missing
-PASS Unscopable handled correctly for convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on Text
-FAIL Text interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertRectFromNode" missing
-PASS Unscopable handled correctly for convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on Text
-FAIL Text interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) assert_own_property: interface prototype object missing non-static operation expected property "convertPointFromNode" missing
-PASS Unscopable handled correctly for convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on Text
-FAIL Text interface: document.createTextNode('x') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Text interface: calling getBoxQuads(BoxQuadOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "getBoxQuads" not found in prototype chain
-FAIL Text interface: document.createTextNode('x') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Text interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "convertQuadFromNode" not found in prototype chain
-FAIL Text interface: document.createTextNode('x') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Text interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "convertRectFromNode" not found in prototype chain
-FAIL Text interface: document.createTextNode('x') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type assert_inherits: property "convertPointFromNode" not found in prototype chain
-FAIL Text interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError assert_inherits: property "convertPointFromNode" not found in prototype chain
-PASS Range interface: operation getClientRects()
-PASS Unscopable handled correctly for getClientRects() on Range
-PASS Range interface: operation getBoundingClientRect()
-PASS Unscopable handled correctly for getBoundingClientRect() on Range
-PASS Range interface: new Range() must inherit property "getClientRects()" with the proper type
-PASS Range interface: new Range() must inherit property "getBoundingClientRect()" with the proper type
-PASS MediaQueryList interface: existence and properties of interface object
-PASS MediaQueryList interface object length
-PASS MediaQueryList interface object name
-PASS MediaQueryList interface: existence and properties of interface prototype object
-PASS MediaQueryList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaQueryList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaQueryList interface: attribute media
-PASS Unscopable handled correctly for media property on MediaQueryList
-PASS MediaQueryList interface: attribute matches
-PASS Unscopable handled correctly for matches property on MediaQueryList
-PASS MediaQueryList interface: operation addListener(EventListener)
-PASS Unscopable handled correctly for addListener(EventListener) on MediaQueryList
-PASS MediaQueryList interface: operation removeListener(EventListener)
-PASS Unscopable handled correctly for removeListener(EventListener) on MediaQueryList
-PASS MediaQueryList interface: attribute onchange
-PASS Unscopable handled correctly for onchange property on MediaQueryList
-PASS MediaQueryList must be primary interface of matchMedia('all')
-PASS Stringification of matchMedia('all')
-PASS MediaQueryList interface: matchMedia('all') must inherit property "media" with the proper type
-PASS MediaQueryList interface: matchMedia('all') must inherit property "matches" with the proper type
-PASS MediaQueryList interface: matchMedia('all') must inherit property "addListener(EventListener)" with the proper type
-PASS MediaQueryList interface: calling addListener(EventListener) on matchMedia('all') with too few arguments must throw TypeError
-PASS MediaQueryList interface: matchMedia('all') must inherit property "removeListener(EventListener)" with the proper type
-PASS MediaQueryList interface: calling removeListener(EventListener) on matchMedia('all') with too few arguments must throw TypeError
-PASS MediaQueryList interface: matchMedia('all') must inherit property "onchange" with the proper type
-PASS MediaQueryListEvent interface: existence and properties of interface object
-PASS MediaQueryListEvent interface object length
-PASS MediaQueryListEvent interface object name
-PASS MediaQueryListEvent interface: existence and properties of interface prototype object
-PASS MediaQueryListEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaQueryListEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaQueryListEvent interface: attribute media
-PASS Unscopable handled correctly for media property on MediaQueryListEvent
-PASS MediaQueryListEvent interface: attribute matches
-PASS Unscopable handled correctly for matches property on MediaQueryListEvent
-PASS MediaQueryListEvent must be primary interface of new MediaQueryListEvent('change')
-PASS Stringification of new MediaQueryListEvent('change')
-PASS MediaQueryListEvent interface: new MediaQueryListEvent('change') must inherit property "media" with the proper type
-PASS MediaQueryListEvent interface: new MediaQueryListEvent('change') must inherit property "matches" with the proper type
-PASS Screen interface: existence and properties of interface object
-PASS Screen interface object length
-PASS Screen interface object name
-PASS Screen interface: existence and properties of interface prototype object
-PASS Screen interface: existence and properties of interface prototype object's "constructor" property
-PASS Screen interface: existence and properties of interface prototype object's @@unscopables property
-PASS Screen interface: attribute availWidth
-PASS Unscopable handled correctly for availWidth property on Screen
-PASS Screen interface: attribute availHeight
-PASS Unscopable handled correctly for availHeight property on Screen
-PASS Screen interface: attribute width
-PASS Unscopable handled correctly for width property on Screen
-PASS Screen interface: attribute height
-PASS Unscopable handled correctly for height property on Screen
-PASS Screen interface: attribute colorDepth
-PASS Unscopable handled correctly for colorDepth property on Screen
-PASS Screen interface: attribute pixelDepth
-PASS Unscopable handled correctly for pixelDepth property on Screen
-PASS Screen must be primary interface of screen
-PASS Stringification of screen
-PASS Screen interface: screen must inherit property "availWidth" with the proper type
-PASS Screen interface: screen must inherit property "availHeight" with the proper type
-PASS Screen interface: screen must inherit property "width" with the proper type
-PASS Screen interface: screen must inherit property "height" with the proper type
-PASS Screen interface: screen must inherit property "colorDepth" with the proper type
-PASS Screen interface: screen must inherit property "pixelDepth" with the proper type
-FAIL CaretPosition interface: existence and properties of interface object assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-FAIL CaretPosition interface object length assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-FAIL CaretPosition interface object name assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-FAIL CaretPosition interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-FAIL CaretPosition interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-FAIL CaretPosition interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-FAIL CaretPosition interface: attribute offsetNode assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-PASS Unscopable handled correctly for offsetNode property on CaretPosition
-FAIL CaretPosition interface: attribute offset assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-PASS Unscopable handled correctly for offset property on CaretPosition
-FAIL CaretPosition interface: operation getClientRect() assert_own_property: self does not have own property "CaretPosition" expected property "CaretPosition" missing
-PASS Unscopable handled correctly for getClientRect() on CaretPosition
-FAIL CaretPosition must be primary interface of document.caretPositionFromPoint(5, 5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function"
-FAIL Stringification of document.caretPositionFromPoint(5, 5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function"
-FAIL CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "offsetNode" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function"
-FAIL CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "offset" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function"
-FAIL CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "getClientRect()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: document.caretPositionFromPoint is not a function"
+FAIL Test driver promise_test: Unhandled rejection with value: object "TrackEventInit inherits EventInit, but TrackEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
index 6c6c499..a4d96d9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
@@ -1,474 +1,4 @@
 This is a testharness.js-based test.
-Found 470 tests; 385 PASS, 85 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Test driver
-PASS HTMLElement interface: attribute style
-PASS Unscopable handled correctly for style property on HTMLElement
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement('unknownelement') must inherit property "style" with the proper type
-PASS HTMLLinkElement interface: attribute sheet
-PASS Unscopable handled correctly for sheet property on HTMLLinkElement
-PASS HTMLStyleElement interface: attribute sheet
-PASS Unscopable handled correctly for sheet property on HTMLStyleElement
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Unscopable handled correctly for getComputedStyle(Element, CSSOMString) on Window
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: existence and properties of interface object
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
-PASS SharedWorkerGlobalScope interface: existence and properties of interface object
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS WorkerLocation interface: existence and properties of interface object
-PASS Document interface: attribute styleSheets
-PASS Unscopable handled correctly for styleSheets property on Document
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ProcessingInstruction interface: attribute sheet
-PASS Unscopable handled correctly for sheet property on ProcessingInstruction
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-PASS SVGElement interface: attribute style
-PASS Unscopable handled correctly for style property on SVGElement
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-FAIL MediaList interface: existence and properties of interface prototype object assert_equals: prototype of MediaList.prototype is not Array.prototype expected [] but got object "[object Object]"
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS Unscopable handled correctly for mediaText property on MediaList
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS Unscopable handled correctly for length property on MediaList
-PASS MediaList interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on MediaList
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS Unscopable handled correctly for appendMedium(CSSOMString) on MediaList
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS Unscopable handled correctly for deleteMedium(CSSOMString) on MediaList
-PASS MediaList must be primary interface of style_element.sheet.media
-PASS Stringification of style_element.sheet.media
-PASS MediaList interface: style_element.sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: style_element.sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: style_element.sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on style_element.sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: style_element.sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on style_element.sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: style_element.sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on style_element.sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS Unscopable handled correctly for type property on StyleSheet
-PASS StyleSheet interface: attribute href
-PASS Unscopable handled correctly for href property on StyleSheet
-PASS StyleSheet interface: attribute ownerNode
-PASS Unscopable handled correctly for ownerNode property on StyleSheet
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS Unscopable handled correctly for parentStyleSheet property on StyleSheet
-PASS StyleSheet interface: attribute title
-PASS Unscopable handled correctly for title property on StyleSheet
-PASS StyleSheet interface: attribute media
-PASS Unscopable handled correctly for media property on StyleSheet
-PASS StyleSheet interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on StyleSheet
-PASS CSSStyleSheet interface: existence and properties of interface object
-FAIL CSSStyleSheet interface object length assert_equals: wrong value for CSSStyleSheet.length expected 0 but got 1
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS Unscopable handled correctly for ownerRule property on CSSStyleSheet
-PASS CSSStyleSheet interface: attribute cssRules
-PASS Unscopable handled correctly for cssRules property on CSSStyleSheet
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS Unscopable handled correctly for insertRule(CSSOMString, unsigned long) on CSSStyleSheet
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS Unscopable handled correctly for deleteRule(unsigned long) on CSSStyleSheet
-PASS CSSStyleSheet must be primary interface of style_element.sheet
-PASS Stringification of style_element.sheet
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on style_element.sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on style_element.sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: style_element.sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: style_element.sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: style_element.sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: style_element.sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: style_element.sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-FAIL StyleSheetList interface object length assert_equals: wrong value for StyleSheetList.length expected 0 but got 1
-PASS StyleSheetList interface object name
-FAIL StyleSheetList interface: existence and properties of interface prototype object assert_equals: prototype of StyleSheetList.prototype is not Array.prototype expected [] but got object "[object Object]"
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on StyleSheetList
-PASS StyleSheetList interface: attribute length
-PASS Unscopable handled correctly for length property on StyleSheetList
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-FAIL CSSRuleList interface: existence and properties of interface prototype object assert_equals: prototype of CSSRuleList.prototype is not Array.prototype expected [] but got object "[object Object]"
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on CSSRuleList
-PASS CSSRuleList interface: attribute length
-PASS Unscopable handled correctly for length property on CSSRuleList
-PASS CSSRuleList must be primary interface of style_element.sheet.cssRules
-PASS Stringification of style_element.sheet.cssRules
-PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on style_element.sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS Unscopable handled correctly for type property on CSSRule
-PASS CSSRule interface: attribute cssText
-PASS Unscopable handled correctly for cssText property on CSSRule
-PASS CSSRule interface: attribute parentRule
-PASS Unscopable handled correctly for parentRule property on CSSRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS Unscopable handled correctly for parentStyleSheet property on CSSRule
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS Unscopable handled correctly for selectorText property on CSSStyleRule
-PASS CSSStyleRule interface: attribute style
-PASS Unscopable handled correctly for style property on CSSStyleRule
-PASS CSSStyleRule must be primary interface of style_element.sheet.cssRules[4]
-PASS Stringification of style_element.sheet.cssRules[4]
-PASS CSSStyleRule interface: style_element.sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: style_element.sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: style_element.sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS Unscopable handled correctly for href property on CSSImportRule
-PASS CSSImportRule interface: attribute media
-PASS Unscopable handled correctly for media property on CSSImportRule
-PASS CSSImportRule interface: attribute styleSheet
-PASS Unscopable handled correctly for styleSheet property on CSSImportRule
-PASS CSSImportRule must be primary interface of style_element.sheet.cssRules[0]
-PASS Stringification of style_element.sheet.cssRules[0]
-PASS CSSImportRule interface: style_element.sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: style_element.sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: style_element.sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-PASS Unscopable handled correctly for cssRules property on CSSGroupingRule
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS Unscopable handled correctly for insertRule(CSSOMString, unsigned long) on CSSGroupingRule
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-PASS Unscopable handled correctly for deleteRule(unsigned long) on CSSGroupingRule
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS Unscopable handled correctly for selectorText property on CSSPageRule
-PASS CSSPageRule interface: attribute style
-PASS Unscopable handled correctly for style property on CSSPageRule
-PASS CSSPageRule must be primary interface of style_element.sheet.cssRules[2]
-PASS Stringification of style_element.sheet.cssRules[2]
-PASS CSSPageRule interface: style_element.sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: style_element.sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: style_element.sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: style_element.sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on style_element.sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: style_element.sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on style_element.sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: style_element.sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-PASS Unscopable handled correctly for name property on CSSMarginRule
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-PASS Unscopable handled correctly for style property on CSSMarginRule
-FAIL CSSMarginRule must be primary interface of style_element.sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of style_element.sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: style_element.sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS Unscopable handled correctly for namespaceURI property on CSSNamespaceRule
-PASS CSSNamespaceRule interface: attribute prefix
-PASS Unscopable handled correctly for prefix property on CSSNamespaceRule
-PASS CSSNamespaceRule must be primary interface of style_element.sheet.cssRules[1]
-PASS Stringification of style_element.sheet.cssRules[1]
-PASS CSSNamespaceRule interface: style_element.sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: style_element.sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: style_element.sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: style_element.sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS Unscopable handled correctly for cssText property on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: attribute length
-PASS Unscopable handled correctly for length property on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS Unscopable handled correctly for getPropertyValue(CSSOMString) on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS Unscopable handled correctly for getPropertyPriority(CSSOMString) on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS Unscopable handled correctly for setProperty(CSSOMString, CSSOMString, CSSOMString) on CSSStyleDeclaration
-FAIL CSSStyleDeclaration interface: operation setPropertyValue(CSSOMString, CSSOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyValue" missing
-PASS Unscopable handled correctly for setPropertyValue(CSSOMString, CSSOMString) on CSSStyleDeclaration
-FAIL CSSStyleDeclaration interface: operation setPropertyPriority(CSSOMString, CSSOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyPriority" missing
-PASS Unscopable handled correctly for setPropertyPriority(CSSOMString, CSSOMString) on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS Unscopable handled correctly for removeProperty(CSSOMString) on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS Unscopable handled correctly for parentRule property on CSSStyleDeclaration
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS Unscopable handled correctly for cssFloat property on CSSStyleDeclaration
-PASS CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[4].style
-PASS Stringification of style_element.sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[2].style
-PASS Stringification of style_element.sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of style_element.sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: style_element.sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-FAIL CSSStyleDeclaration interface: style_element.style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: style_element.style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-FAIL CSSStyleDeclaration interface: svg_element.style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: svg_element.style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-FAIL CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError assert_inherits: property "setPropertyValue" not found in prototype chain
-FAIL CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type assert_inherits: property "setPropertyPriority" not found in prototype chain
-FAIL CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError assert_inherits: property "setPropertyPriority" not found in prototype chain
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS interface: existence and properties of interface object
-PASS CSS interface object length
-PASS CSS interface object name
-PASS CSS interface: existence and properties of interface prototype object
-PASS CSS interface: existence and properties of interface prototype object's "constructor" property
-PASS CSS interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSS interface: operation escape(CSSOMString)
-PASS Unscopable handled correctly for escape(CSSOMString) on CSS
+FAIL Test driver promise_test: Unhandled rejection with value: object "TrackEventInit inherits EventInit, but TrackEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/geometry/interfaces-expected.txt
index 87bbfe9..21fd08b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry/interfaces-expected.txt
@@ -1,674 +1,4 @@
 This is a testharness.js-based test.
-Found 670 tests; 667 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Test driver
-PASS DOMPointReadOnly interface: existence and properties of interface object
-PASS DOMPointReadOnly interface object length
-PASS DOMPointReadOnly interface object name
-PASS DOMPointReadOnly interface: existence and properties of interface prototype object
-PASS DOMPointReadOnly interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMPointReadOnly interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMPointReadOnly interface: operation fromPoint(DOMPointInit)
-PASS Unscopable handled correctly for fromPoint(DOMPointInit) on DOMPointReadOnly
-PASS DOMPointReadOnly interface: attribute x
-PASS Unscopable handled correctly for x property on DOMPointReadOnly
-PASS DOMPointReadOnly interface: attribute y
-PASS Unscopable handled correctly for y property on DOMPointReadOnly
-PASS DOMPointReadOnly interface: attribute z
-PASS Unscopable handled correctly for z property on DOMPointReadOnly
-PASS DOMPointReadOnly interface: attribute w
-PASS Unscopable handled correctly for w property on DOMPointReadOnly
-PASS DOMPointReadOnly interface: operation matrixTransform(DOMMatrixInit)
-PASS Unscopable handled correctly for matrixTransform(DOMMatrixInit) on DOMPointReadOnly
-PASS DOMPointReadOnly must be primary interface of new DOMPointReadOnly()
-PASS Stringification of new DOMPointReadOnly()
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "fromPoint(DOMPointInit)" with the proper type
-PASS DOMPointReadOnly interface: calling fromPoint(DOMPointInit) on new DOMPointReadOnly() with too few arguments must throw TypeError
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "x" with the proper type
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "y" with the proper type
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "z" with the proper type
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "w" with the proper type
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "matrixTransform(DOMMatrixInit)" with the proper type
-PASS DOMPointReadOnly interface: calling matrixTransform(DOMMatrixInit) on new DOMPointReadOnly() with too few arguments must throw TypeError
-PASS DOMPoint interface: existence and properties of interface object
-PASS DOMPoint interface object length
-PASS DOMPoint interface object name
-FAIL DOMPoint interface: legacy window alias assert_equals: self.SVGPoint should be the same value as self.DOMPoint expected function "function DOMPoint() { [native code] }" but got function "function SVGPoint() { [native code] }"
-PASS DOMPoint interface: existence and properties of interface prototype object
-PASS DOMPoint interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMPoint interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMPoint interface: operation fromPoint(DOMPointInit)
-PASS Unscopable handled correctly for fromPoint(DOMPointInit) on DOMPoint
-PASS DOMPoint interface: attribute x
-PASS Unscopable handled correctly for x property on DOMPoint
-PASS DOMPoint interface: attribute y
-PASS Unscopable handled correctly for y property on DOMPoint
-PASS DOMPoint interface: attribute z
-PASS Unscopable handled correctly for z property on DOMPoint
-PASS DOMPoint interface: attribute w
-PASS Unscopable handled correctly for w property on DOMPoint
-PASS DOMPoint must be primary interface of new DOMPoint()
-PASS Stringification of new DOMPoint()
-PASS DOMPoint interface: new DOMPoint() must inherit property "fromPoint(DOMPointInit)" with the proper type
-PASS DOMPoint interface: calling fromPoint(DOMPointInit) on new DOMPoint() with too few arguments must throw TypeError
-PASS DOMPoint interface: new DOMPoint() must inherit property "x" with the proper type
-PASS DOMPoint interface: new DOMPoint() must inherit property "y" with the proper type
-PASS DOMPoint interface: new DOMPoint() must inherit property "z" with the proper type
-PASS DOMPoint interface: new DOMPoint() must inherit property "w" with the proper type
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "fromPoint(DOMPointInit)" with the proper type
-PASS DOMPointReadOnly interface: calling fromPoint(DOMPointInit) on new DOMPoint() with too few arguments must throw TypeError
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "x" with the proper type
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "y" with the proper type
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "z" with the proper type
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "w" with the proper type
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "matrixTransform(DOMMatrixInit)" with the proper type
-PASS DOMPointReadOnly interface: calling matrixTransform(DOMMatrixInit) on new DOMPoint() with too few arguments must throw TypeError
-PASS DOMRectReadOnly interface: existence and properties of interface object
-PASS DOMRectReadOnly interface object length
-PASS DOMRectReadOnly interface object name
-PASS DOMRectReadOnly interface: existence and properties of interface prototype object
-PASS DOMRectReadOnly interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMRectReadOnly interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMRectReadOnly interface: operation fromRect(DOMRectInit)
-PASS Unscopable handled correctly for fromRect(DOMRectInit) on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute x
-PASS Unscopable handled correctly for x property on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute y
-PASS Unscopable handled correctly for y property on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute width
-PASS Unscopable handled correctly for width property on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute height
-PASS Unscopable handled correctly for height property on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute top
-PASS Unscopable handled correctly for top property on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute right
-PASS Unscopable handled correctly for right property on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute bottom
-PASS Unscopable handled correctly for bottom property on DOMRectReadOnly
-PASS DOMRectReadOnly interface: attribute left
-PASS Unscopable handled correctly for left property on DOMRectReadOnly
-PASS DOMRectReadOnly must be primary interface of new DOMRectReadOnly()
-PASS Stringification of new DOMRectReadOnly()
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "fromRect(DOMRectInit)" with the proper type
-PASS DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRectReadOnly() with too few arguments must throw TypeError
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "x" with the proper type
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "y" with the proper type
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "width" with the proper type
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "height" with the proper type
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "top" with the proper type
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "right" with the proper type
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "bottom" with the proper type
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "left" with the proper type
-PASS DOMRect interface: existence and properties of interface object
-PASS DOMRect interface object length
-PASS DOMRect interface object name
-FAIL DOMRect interface: legacy window alias assert_equals: self.SVGRect should be the same value as self.DOMRect expected function "function DOMRect() { [native code] }" but got function "function SVGRect() { [native code] }"
-PASS DOMRect interface: existence and properties of interface prototype object
-PASS DOMRect interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMRect interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMRect interface: operation fromRect(DOMRectInit)
-PASS Unscopable handled correctly for fromRect(DOMRectInit) on DOMRect
-PASS DOMRect interface: attribute x
-PASS Unscopable handled correctly for x property on DOMRect
-PASS DOMRect interface: attribute y
-PASS Unscopable handled correctly for y property on DOMRect
-PASS DOMRect interface: attribute width
-PASS Unscopable handled correctly for width property on DOMRect
-PASS DOMRect interface: attribute height
-PASS Unscopable handled correctly for height property on DOMRect
-PASS DOMRect must be primary interface of new DOMRect()
-PASS Stringification of new DOMRect()
-PASS DOMRect interface: new DOMRect() must inherit property "fromRect(DOMRectInit)" with the proper type
-PASS DOMRect interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError
-PASS DOMRect interface: new DOMRect() must inherit property "x" with the proper type
-PASS DOMRect interface: new DOMRect() must inherit property "y" with the proper type
-PASS DOMRect interface: new DOMRect() must inherit property "width" with the proper type
-PASS DOMRect interface: new DOMRect() must inherit property "height" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "fromRect(DOMRectInit)" with the proper type
-PASS DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "x" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "y" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "width" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "height" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "top" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "right" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "bottom" with the proper type
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "left" with the proper type
-PASS Stringification of [object DOMRectList]
-PASS DOMRectList interface: [object DOMRectList] must inherit property "length" with the proper type
-PASS DOMRectList interface: [object DOMRectList] must inherit property "item(unsigned long)" with the proper type
-PASS DOMRectList interface: calling item(unsigned long) on [object DOMRectList] with too few arguments must throw TypeError
-PASS DOMQuad interface: existence and properties of interface object
-PASS DOMQuad interface object length
-PASS DOMQuad interface object name
-PASS DOMQuad interface: existence and properties of interface prototype object
-PASS DOMQuad interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMQuad interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMQuad interface: operation fromRect(DOMRectInit)
-PASS Unscopable handled correctly for fromRect(DOMRectInit) on DOMQuad
-PASS DOMQuad interface: operation fromQuad(DOMQuadInit)
-PASS Unscopable handled correctly for fromQuad(DOMQuadInit) on DOMQuad
-PASS DOMQuad interface: attribute p1
-PASS Unscopable handled correctly for p1 property on DOMQuad
-PASS DOMQuad interface: attribute p2
-PASS Unscopable handled correctly for p2 property on DOMQuad
-PASS DOMQuad interface: attribute p3
-PASS Unscopable handled correctly for p3 property on DOMQuad
-PASS DOMQuad interface: attribute p4
-PASS Unscopable handled correctly for p4 property on DOMQuad
-PASS DOMQuad interface: operation getBounds()
-PASS Unscopable handled correctly for getBounds() on DOMQuad
-PASS DOMQuad must be primary interface of new DOMQuad()
-PASS Stringification of new DOMQuad()
-PASS DOMQuad interface: new DOMQuad() must inherit property "fromRect(DOMRectInit)" with the proper type
-PASS DOMQuad interface: calling fromRect(DOMRectInit) on new DOMQuad() with too few arguments must throw TypeError
-PASS DOMQuad interface: new DOMQuad() must inherit property "fromQuad(DOMQuadInit)" with the proper type
-PASS DOMQuad interface: calling fromQuad(DOMQuadInit) on new DOMQuad() with too few arguments must throw TypeError
-PASS DOMQuad interface: new DOMQuad() must inherit property "p1" with the proper type
-PASS DOMQuad interface: new DOMQuad() must inherit property "p2" with the proper type
-PASS DOMQuad interface: new DOMQuad() must inherit property "p3" with the proper type
-PASS DOMQuad interface: new DOMQuad() must inherit property "p4" with the proper type
-PASS DOMQuad interface: new DOMQuad() must inherit property "getBounds()" with the proper type
-PASS DOMMatrixReadOnly interface: existence and properties of interface object
-PASS DOMMatrixReadOnly interface object length
-PASS DOMMatrixReadOnly interface object name
-PASS DOMMatrixReadOnly interface: existence and properties of interface prototype object
-PASS DOMMatrixReadOnly interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMMatrixReadOnly interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMMatrixReadOnly interface: operation fromMatrix(DOMMatrixInit)
-PASS Unscopable handled correctly for fromMatrix(DOMMatrixInit) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation fromFloat32Array(Float32Array)
-PASS Unscopable handled correctly for fromFloat32Array(Float32Array) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation fromFloat64Array(Float64Array)
-PASS Unscopable handled correctly for fromFloat64Array(Float64Array) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute a
-PASS Unscopable handled correctly for a property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute b
-PASS Unscopable handled correctly for b property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute c
-PASS Unscopable handled correctly for c property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute d
-PASS Unscopable handled correctly for d property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute e
-PASS Unscopable handled correctly for e property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute f
-PASS Unscopable handled correctly for f property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m11
-PASS Unscopable handled correctly for m11 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m12
-PASS Unscopable handled correctly for m12 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m13
-PASS Unscopable handled correctly for m13 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m14
-PASS Unscopable handled correctly for m14 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m21
-PASS Unscopable handled correctly for m21 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m22
-PASS Unscopable handled correctly for m22 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m23
-PASS Unscopable handled correctly for m23 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m24
-PASS Unscopable handled correctly for m24 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m31
-PASS Unscopable handled correctly for m31 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m32
-PASS Unscopable handled correctly for m32 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m33
-PASS Unscopable handled correctly for m33 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m34
-PASS Unscopable handled correctly for m34 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m41
-PASS Unscopable handled correctly for m41 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m42
-PASS Unscopable handled correctly for m42 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m43
-PASS Unscopable handled correctly for m43 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute m44
-PASS Unscopable handled correctly for m44 property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute is2D
-PASS Unscopable handled correctly for is2D property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: attribute isIdentity
-PASS Unscopable handled correctly for isIdentity property on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation translate(unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for translate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation rotate(unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rotate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation rotateFromVector(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rotateFromVector(unrestricted double, unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation skewX(unrestricted double)
-PASS Unscopable handled correctly for skewX(unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation skewY(unrestricted double)
-PASS Unscopable handled correctly for skewY(unrestricted double) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation multiply(DOMMatrixInit)
-PASS Unscopable handled correctly for multiply(DOMMatrixInit) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation flipX()
-PASS Unscopable handled correctly for flipX() on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation flipY()
-PASS Unscopable handled correctly for flipY() on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation inverse()
-PASS Unscopable handled correctly for inverse() on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation transformPoint(DOMPointInit)
-PASS Unscopable handled correctly for transformPoint(DOMPointInit) on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation toFloat32Array()
-PASS Unscopable handled correctly for toFloat32Array() on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: operation toFloat64Array()
-PASS Unscopable handled correctly for toFloat64Array() on DOMMatrixReadOnly
-PASS DOMMatrixReadOnly interface: stringifier
-PASS DOMMatrixReadOnly must be primary interface of new DOMMatrixReadOnly()
-PASS Stringification of new DOMMatrixReadOnly()
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat32Array(Float32Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat64Array(Float64Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "a" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "b" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "c" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "d" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "e" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "f" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m11" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m12" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m13" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m14" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m21" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m22" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m23" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m24" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m31" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m32" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m33" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m34" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m41" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m42" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m43" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m44" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "is2D" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "isIdentity" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewX(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewY(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "multiply(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipX()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipY()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "inverse()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "transformPoint(DOMPointInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat32Array()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat64Array()" with the proper type
-PASS DOMMatrixReadOnly must be primary interface of DOMMatrixReadOnly.fromMatrix({is2D: false})
-PASS Stringification of DOMMatrixReadOnly.fromMatrix({is2D: false})
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "a" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "b" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "c" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "d" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "e" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "f" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m11" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m12" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m13" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m14" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m21" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m22" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m23" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m24" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m31" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m32" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m33" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m34" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m41" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m42" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m43" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m44" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewX(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewY(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "multiply(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipX()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipY()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "inverse()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "transformPoint(DOMPointInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat32Array()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat64Array()" with the proper type
-PASS DOMMatrix interface: existence and properties of interface object
-PASS DOMMatrix interface object length
-PASS DOMMatrix interface object name
-FAIL DOMMatrix interface: legacy window alias assert_equals: self.SVGMatrix should be the same value as self.DOMMatrix expected function "function DOMMatrix() { [native code] }" but got function "function SVGMatrix() { [native code] }"
-PASS DOMMatrix interface: existence and properties of interface prototype object
-PASS DOMMatrix interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMMatrix interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMMatrix interface: operation fromMatrix(DOMMatrixInit)
-PASS Unscopable handled correctly for fromMatrix(DOMMatrixInit) on DOMMatrix
-PASS DOMMatrix interface: operation fromFloat32Array(Float32Array)
-PASS Unscopable handled correctly for fromFloat32Array(Float32Array) on DOMMatrix
-PASS DOMMatrix interface: operation fromFloat64Array(Float64Array)
-PASS Unscopable handled correctly for fromFloat64Array(Float64Array) on DOMMatrix
-PASS DOMMatrix interface: attribute a
-PASS Unscopable handled correctly for a property on DOMMatrix
-PASS DOMMatrix interface: attribute b
-PASS Unscopable handled correctly for b property on DOMMatrix
-PASS DOMMatrix interface: attribute c
-PASS Unscopable handled correctly for c property on DOMMatrix
-PASS DOMMatrix interface: attribute d
-PASS Unscopable handled correctly for d property on DOMMatrix
-PASS DOMMatrix interface: attribute e
-PASS Unscopable handled correctly for e property on DOMMatrix
-PASS DOMMatrix interface: attribute f
-PASS Unscopable handled correctly for f property on DOMMatrix
-PASS DOMMatrix interface: attribute m11
-PASS Unscopable handled correctly for m11 property on DOMMatrix
-PASS DOMMatrix interface: attribute m12
-PASS Unscopable handled correctly for m12 property on DOMMatrix
-PASS DOMMatrix interface: attribute m13
-PASS Unscopable handled correctly for m13 property on DOMMatrix
-PASS DOMMatrix interface: attribute m14
-PASS Unscopable handled correctly for m14 property on DOMMatrix
-PASS DOMMatrix interface: attribute m21
-PASS Unscopable handled correctly for m21 property on DOMMatrix
-PASS DOMMatrix interface: attribute m22
-PASS Unscopable handled correctly for m22 property on DOMMatrix
-PASS DOMMatrix interface: attribute m23
-PASS Unscopable handled correctly for m23 property on DOMMatrix
-PASS DOMMatrix interface: attribute m24
-PASS Unscopable handled correctly for m24 property on DOMMatrix
-PASS DOMMatrix interface: attribute m31
-PASS Unscopable handled correctly for m31 property on DOMMatrix
-PASS DOMMatrix interface: attribute m32
-PASS Unscopable handled correctly for m32 property on DOMMatrix
-PASS DOMMatrix interface: attribute m33
-PASS Unscopable handled correctly for m33 property on DOMMatrix
-PASS DOMMatrix interface: attribute m34
-PASS Unscopable handled correctly for m34 property on DOMMatrix
-PASS DOMMatrix interface: attribute m41
-PASS Unscopable handled correctly for m41 property on DOMMatrix
-PASS DOMMatrix interface: attribute m42
-PASS Unscopable handled correctly for m42 property on DOMMatrix
-PASS DOMMatrix interface: attribute m43
-PASS Unscopable handled correctly for m43 property on DOMMatrix
-PASS DOMMatrix interface: attribute m44
-PASS Unscopable handled correctly for m44 property on DOMMatrix
-PASS DOMMatrix interface: operation multiplySelf(DOMMatrixInit)
-PASS Unscopable handled correctly for multiplySelf(DOMMatrixInit) on DOMMatrix
-PASS DOMMatrix interface: operation preMultiplySelf(DOMMatrixInit)
-PASS Unscopable handled correctly for preMultiplySelf(DOMMatrixInit) on DOMMatrix
-PASS DOMMatrix interface: operation translateSelf(unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for translateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation rotateSelf(unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rotateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation rotateFromVectorSelf(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rotateFromVectorSelf(unrestricted double, unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation skewXSelf(unrestricted double)
-PASS Unscopable handled correctly for skewXSelf(unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation skewYSelf(unrestricted double)
-PASS Unscopable handled correctly for skewYSelf(unrestricted double) on DOMMatrix
-PASS DOMMatrix interface: operation invertSelf()
-PASS Unscopable handled correctly for invertSelf() on DOMMatrix
-PASS DOMMatrix interface: operation setMatrixValue(DOMString)
-PASS Unscopable handled correctly for setMatrixValue(DOMString) on DOMMatrix
-PASS DOMMatrix must be primary interface of new DOMMatrix()
-PASS Stringification of new DOMMatrix()
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type
-PASS DOMMatrix interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat32Array(Float32Array)" with the proper type
-PASS DOMMatrix interface: calling fromFloat32Array(Float32Array) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat64Array(Float64Array)" with the proper type
-PASS DOMMatrix interface: calling fromFloat64Array(Float64Array) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "a" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "b" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "c" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "d" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "e" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "f" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m11" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m12" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m13" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m14" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m21" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m22" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m23" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m24" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m31" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m32" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m33" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m34" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m41" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m42" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m43" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m44" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "multiplySelf(DOMMatrixInit)" with the proper type
-PASS DOMMatrix interface: calling multiplySelf(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "preMultiplySelf(DOMMatrixInit)" with the proper type
-PASS DOMMatrix interface: calling preMultiplySelf(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "translateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling translateSelf(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling rotateSelf(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateFromVectorSelf(unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewXSelf(unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling skewXSelf(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewYSelf(unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling skewYSelf(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "invertSelf()" with the proper type
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "setMatrixValue(DOMString)" with the proper type
-PASS DOMMatrix interface: calling setMatrixValue(DOMString) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat32Array(Float32Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat64Array(Float64Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "a" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "b" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "c" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "d" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "e" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "f" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m11" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m12" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m13" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m14" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m21" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m22" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m23" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m24" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m31" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m32" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m33" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m34" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m41" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m42" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m43" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m44" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "is2D" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "isIdentity" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewX(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewY(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "multiply(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipX()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipY()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "inverse()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "transformPoint(DOMPointInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on new DOMMatrix() with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat32Array()" with the proper type
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat64Array()" with the proper type
-PASS DOMMatrix must be primary interface of DOMMatrix.fromMatrix({is2D: false})
-PASS Stringification of DOMMatrix.fromMatrix({is2D: false})
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type
-PASS DOMMatrix interface: calling fromMatrix(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type
-PASS DOMMatrix interface: calling fromFloat32Array(Float32Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type
-PASS DOMMatrix interface: calling fromFloat64Array(Float64Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiplySelf(DOMMatrixInit)" with the proper type
-PASS DOMMatrix interface: calling multiplySelf(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "preMultiplySelf(DOMMatrixInit)" with the proper type
-PASS DOMMatrix interface: calling preMultiplySelf(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling translateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling rotateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVectorSelf(unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewXSelf(unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling skewXSelf(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewYSelf(unrestricted double)" with the proper type
-PASS DOMMatrix interface: calling skewYSelf(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "invertSelf()" with the proper type
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "setMatrixValue(DOMString)" with the proper type
-PASS DOMMatrix interface: calling setMatrixValue(DOMString) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type
-PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewX(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewY(unrestricted double)" with the proper type
-PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiply(DOMMatrixInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipX()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipY()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "inverse()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "transformPoint(DOMPointInit)" with the proper type
-PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat32Array()" with the proper type
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat64Array()" with the proper type
+FAIL Test driver promise_test: Unhandled rejection with value: object "DOMMatrixInit inherits DOMMatrix2DInit, but DOMMatrixInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry/support/interfaces.js b/third_party/WebKit/LayoutTests/external/wpt/css/geometry/support/interfaces.js
index e5955d1..3dca695 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry/support/interfaces.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry/support/interfaces.js
@@ -19,6 +19,8 @@
     DOMMatrixReadOnly: ["new DOMMatrixReadOnly()", "DOMMatrixReadOnly.fromMatrix({is2D: false})"],
     DOMMatrix: ["new DOMMatrix()", "DOMMatrix.fromMatrix({is2D: false})"],
   });
+  idlArray.prevent_multiple_testing("DOMMatrixReadOnly");
+  idlArray.prevent_multiple_testing("DOMMatrix");
   idlArray.test();
   done();
 }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/idlharness.https-expected.txt
new file mode 100644
index 0000000..0164d6b7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/encrypted-media/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Encrypted Media Extentions IDL test MediaKeyMessageEventInit inherits EventInit, but MediaKeyMessageEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/eventsource/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/eventsource/interfaces-expected.txt
new file mode 100644
index 0000000..4b239c36
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/eventsource/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL EventSource IDL tests Uncaught AddEventListenerOptions inherits EventListenerOptions, but AddEventListenerOptions is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/gamepad/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/gamepad/idlharness-expected.txt
new file mode 100644
index 0000000..9e17044
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/gamepad/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test IDL implementation of Gamepad API promise_test: Unhandled rejection with value: object "GamepadEventInit inherits EventInit, but GamepadEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/generic-sensor/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/generic-sensor/idlharness.https-expected.txt
new file mode 100644
index 0000000..4fed940
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/generic-sensor/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test IDL implementation of Generic Sensor promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/geolocation-sensor/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/geolocation-sensor/idlharness.https-expected.txt
index 03447b6..fb7c6373 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/geolocation-sensor/idlharness.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/geolocation-sensor/idlharness.https-expected.txt
@@ -1,67 +1,4 @@
 This is a testharness.js-based test.
-PASS Test IDL implementation of Geolocation Sensor
-PASS Sensor interface: existence and properties of interface object
-PASS Sensor interface object length
-PASS Sensor interface object name
-PASS Sensor interface: existence and properties of interface prototype object
-PASS Sensor interface: existence and properties of interface prototype object's "constructor" property
-PASS Sensor interface: existence and properties of interface prototype object's @@unscopables property
-PASS Sensor interface: attribute activated
-PASS Unscopable handled correctly for activated property on Sensor
-PASS Sensor interface: attribute hasReading
-PASS Unscopable handled correctly for hasReading property on Sensor
-PASS Sensor interface: attribute timestamp
-PASS Unscopable handled correctly for timestamp property on Sensor
-PASS Sensor interface: operation start()
-PASS Unscopable handled correctly for start() on Sensor
-PASS Sensor interface: operation stop()
-PASS Unscopable handled correctly for stop() on Sensor
-PASS Sensor interface: attribute onreading
-PASS Unscopable handled correctly for onreading property on Sensor
-PASS Sensor interface: attribute onactivate
-PASS Unscopable handled correctly for onactivate property on Sensor
-PASS Sensor interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on Sensor
-FAIL GeolocationSensor interface: existence and properties of interface object assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-FAIL GeolocationSensor interface object length assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-FAIL GeolocationSensor interface object name assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-FAIL GeolocationSensor interface: existence and properties of interface prototype object assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-FAIL GeolocationSensor interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-FAIL GeolocationSensor interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-FAIL GeolocationSensor interface: operation read(ReadOptions) assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for read(ReadOptions) on GeolocationSensor
-FAIL GeolocationSensor interface: attribute latitude assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for latitude property on GeolocationSensor
-FAIL GeolocationSensor interface: attribute longitude assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for longitude property on GeolocationSensor
-FAIL GeolocationSensor interface: attribute altitude assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for altitude property on GeolocationSensor
-FAIL GeolocationSensor interface: attribute accuracy assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for accuracy property on GeolocationSensor
-FAIL GeolocationSensor interface: attribute altitudeAccuracy assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for altitudeAccuracy property on GeolocationSensor
-FAIL GeolocationSensor interface: attribute heading assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for heading property on GeolocationSensor
-FAIL GeolocationSensor interface: attribute speed assert_own_property: self does not have own property "GeolocationSensor" expected property "GeolocationSensor" missing
-PASS Unscopable handled correctly for speed property on GeolocationSensor
-FAIL GeolocationSensor must be primary interface of new GeolocationSensor assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Stringification of new GeolocationSensor assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "read(ReadOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: calling read(ReadOptions) on new GeolocationSensor with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "latitude" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "longitude" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "altitude" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "accuracy" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "altitudeAccuracy" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "heading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL GeolocationSensor interface: new GeolocationSensor must inherit property "speed" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "activated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "hasReading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "timestamp" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "start()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "stop()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "onreading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "onactivate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
-FAIL Sensor interface: new GeolocationSensor must inherit property "onerror" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: GeolocationSensor is not defined"
+FAIL Test IDL implementation of Geolocation Sensor promise_test: Unhandled rejection with value: object "GeolocationSensorOptions inherits SensorOptions, but GeolocationSensorOptions is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/gyroscope/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/gyroscope/idlharness.https-expected.txt
new file mode 100644
index 0000000..7313a9c40
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/gyroscope/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test IDL implementation of Gyroscope Sensor promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
index 169a07f..7ca9b0d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
@@ -1,21 +1,4 @@
 This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "Error: undefined EventTarget not found (inherited by Performance)"
-FAIL Performance interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS Performance interface object length
-PASS Performance interface object name
-FAIL Performance interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS Performance interface: existence and properties of interface prototype object's "constructor" property
-PASS Performance interface: existence and properties of interface prototype object's @@unscopables property
-PASS Performance interface: operation now()
-PASS Unscopable handled correctly for now() on Performance
-PASS Performance interface: attribute timeOrigin
-PASS Unscopable handled correctly for timeOrigin property on Performance
-PASS Performance interface: operation toJSON()
-PASS Unscopable handled correctly for toJSON() on Performance
-PASS Performance must be primary interface of window.performance
-FAIL Stringification of window.performance Cannot read property 'has_stringifier' of undefined
-PASS Performance interface: window.performance must inherit property "now()" with the proper type
-PASS Performance interface: window.performance must inherit property "timeOrigin" with the proper type
-PASS Performance interface: window.performance must inherit property "toJSON()" with the proper type
+FAIL Test driver promise_test: Unhandled rejection with value: object "Performance inherits EventTarget, but EventTarget is undefined."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint-expected.txt
deleted file mode 100644
index 7e4e2b7..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL 2.7 Safe passing of structured data Uncaught SyntaxError: Invalid or unexpected token
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-error-events.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-error-events.html
new file mode 100644
index 0000000..e4f617d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-error-events.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="resources/link-load-error-events.sub.js"></script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-error-events.https.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-error-events.https.html
new file mode 100644
index 0000000..e4f617d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-error-events.https.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="resources/link-load-error-events.sub.js"></script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-event.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-event.html
index 6f6172a2..5412913 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-event.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-load-event.html
@@ -3,16 +3,15 @@
 <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-link-element">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<link href="style.css?pipe=trickle(d3)" rel="stylesheet" id="style_test"></link>
 <script>
 var saw_link_onload = false;
 var t = async_test("Check if the stylesheet's load event blocks the document load event");
-document.getElementById('style_test').onload = t.step_func(function() {
-  saw_link_onload = true;
-});
 window.addEventListener('load', t.step_func_done(function() {
   assert_true(saw_link_onload);
 }));
 </script>
+<link href="style.css?pipe=trickle(d3)" rel="stylesheet" id="style_test"
+      onload="t.step(function() { saw_link_onload = true; });"
+      onerror="t.step(function() { assert_unreached('Sheet should load OK'); });"></link>
 </head>
 </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/link-load-error-events.sub.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/link-load-error-events.sub.js
new file mode 100644
index 0000000..ac56a01
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/link-load-error-events.sub.js
@@ -0,0 +1,187 @@
+/**
+ * This is the guts of the load/error event tests for <link rel="stylesheet">.
+ *
+ * We have a list of tests each of which is an object containing: href value,
+ * expected load success boolean, test description.  Href values are set up in
+ * such a way that we guarantee that all stylesheet URLs are unique.  This
+ * avoids issues around caching of sheets based on URL.
+ */
+
+var isHttps = location.protocol == "https:";
+
+var tests = [
+  // Basic tests
+  {
+    href: existingSheet(),
+    success: true,
+    description: "Basic load of stylesheet",
+  },
+  {
+    href: nonexistentSheet(),
+    success: false,
+    description: "Attempted load of nonexistent stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("${existingSheet()}")`,
+    success: true,
+    description: "Import of stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("${nonexistentSheet()}")`,
+    success: false,
+    description: "Import of nonexistent stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("data:text/css,@import url('${existingSheet()}')")`,
+    success: true,
+    description: "Import of import of stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("data:text/css,@import url('${nonexistentSheet()}')")`,
+    success: false,
+    description: "Import of import of nonexistent stylesheet",
+  },
+
+  // Non-CSS-response tests.
+  {
+    href: makeUnique(""),
+    success: false,
+    description: "Load of non-CSS stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("${makeUnique("")}")`,
+    success: false,
+    description: "Import of non-CSS stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("data:text/css,@import url('${makeUnique("")}')")`,
+    success: false,
+    description: "Import of import of non-CSS stylesheet",
+  },
+
+  // http:// tests, to test what happens with mixed content blocking.
+  {
+    href: httpSheet(),
+    success: !isHttps,
+    description: "Load of http:// stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("${httpSheet()}")`,
+    success: !isHttps,
+    description: "Import of http:// stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("data:text/css,@import url('${httpSheet()}')")`,
+    success: !isHttps,
+    description: "Import of import of http:// stylesheet",
+  },
+
+  // https:// tests just as a control
+  {
+    href: httpsSheet(),
+    success: true,
+    description: "Load of https:// stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("${httpsSheet()}")`,
+    success: true,
+    description: "Import of https:// stylesheet",
+  },
+  {
+    href: `data:text/css,@import url("data:text/css,@import url('${httpsSheet()}')")`,
+    success: true,
+    description: "Import of import of https:// stylesheet",
+  },
+
+  // Tests with multiple imports some of which are slow and some are fast.
+  {
+    href: `data:text/css,@import url("${slowResponse(existingSheet())}"); @import url("${nonexistentSheet()}");`,
+    success: false,
+    description: "Slow successful import, fast failing import",
+  },
+  {
+    href: `data:text/css,@import url("${existingSheet()}"); @import url("${slowResponse(nonexistentSheet())}");`,
+    success: false,
+    description: "Fast successful import, slow failing import",
+  }
+];
+
+// Note: Here we really do need to use "let" at least for the href,
+// because we lazily evaluate it in the unreached cases.
+for (var test of tests) {
+  let {href, success, description} = test;
+  var t = async_test(description);
+  var link = document.createElement("link");
+  link.rel = "stylesheet";
+  if (success) {
+    link.onload = t.step_func_done(() => {});
+    link.onerror = t.step_func_done(() => assert_unreached(`error fired when load expected: ${href}`) );
+  } else {
+    link.onerror = t.step_func_done(() => {});
+    link.onload = t.step_func_done(() => assert_unreached(`load fired when error expected: ${href}`) );
+  }
+  link.href = href;
+  document.head.appendChild(link);
+}
+
+/* Utility function */
+function makeUnique(url) {
+  // Make sure we copy here, even if the thing coming in is a URL, so we don't
+  // mutate our caller's data.
+  url = new URL(url, location.href);
+  // We want to generate a unique URI to avoid the various caches browsers have
+  // for stylesheets.  We don't want to just use a counter, because that would
+  // not be robust to the test being reloaded or othewise run multiple times
+  // without a browser restart.  We don't want to use timstamps, because those
+  // are not likely to be unique across calls to this function, especially given
+  // the degraded timer resolution browsers have due to Spectre.
+  //
+  // So just fall back on Math.random() and assume it can't duplicate values.
+  url.searchParams.append("r", Math.random());
+  return url;
+}
+
+function existingSheet() {
+  return makeUnique("resources/good.css");
+}
+
+/**
+ * Function the add values to the "pipe" search param.  See
+ * http://wptserve.readthedocs.io/en/latest/pipes.html for why one would do
+ * this.  Because this param uses a weird '|'-separated syntax instead of just
+ * using multiple params with the same name, we need some manual code to munge
+ * the value properly.
+ */
+function addPipe(url, pipeVal) {
+  url = new URL(url, location.href);
+  var params = url.searchParams;
+  var oldVal = params.get("pipe");
+  if (oldVal) {
+    params.set("pipe", oldVal + "|" + pipeVal);
+  } else {
+    params.set("pipe", pipeVal);
+  }
+  return url;
+}
+
+function nonexistentSheet() {
+  return addPipe(existingSheet(), "status(404)");
+}
+
+function httpSheet() {
+  var url = existingSheet();
+  url.protocol = "http";
+  url.port = {{ports[http][0]}};
+  return url;
+}
+
+function httpsSheet() {
+  var url = existingSheet();
+  url.protocol = "https";
+  url.port = {{ports[https][0]}};
+  return url;
+}
+
+function slowResponse(url) {
+  return addPipe(url, "trickle(d1)");
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/input-events/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/input-events/idlharness-expected.txt
new file mode 100644
index 0000000..a65c27d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/input-events/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Input Event IDL tests Uncaught Partial dictionary InputEventInit with no original dictionary
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/geometry.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/geometry.idl
index 556e8a5..7ee2a5a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/geometry.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/geometry.idl
@@ -1,3 +1,7 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the Geometry Interfaces spec.
+// See https://drafts.fxtf.org/geometry/
+
 [Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
              optional unrestricted double z = 0, optional unrestricted double w = 1),
  Exposed=(Window,Worker),
@@ -12,7 +16,7 @@
 
     DOMPoint matrixTransform(optional DOMMatrixInit matrix);
 
-    [Default] toJSON();
+    [Default] object toJSON();
 };
 
 [Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
@@ -52,7 +56,7 @@
     readonly attribute unrestricted double bottom;
     readonly attribute unrestricted double left;
 
-    [Default] toJSON();
+    [Default] object toJSON();
 };
 
 [Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
@@ -76,8 +80,7 @@
     unrestricted double height = 0;
 };
 
-[NoInterfaceObject,
- LegacyArrayClass]
+[LegacyArrayClass]
 interface DOMRectList {
     readonly attribute unsigned long length;
     getter DOMRect? item(unsigned long index);
@@ -97,7 +100,7 @@
     [SameObject] readonly attribute DOMPoint p4;
     [NewObject] DOMRect getBounds();
 
-    [Default] toJSON();
+    [Default] object toJSON();
 };
 
 dictionary DOMQuadInit {
@@ -178,7 +181,7 @@
     [NewObject] Float64Array toFloat64Array();
 
     [Exposed=Window] stringifier;
-    [Default] toJSON();
+    [Default] object toJSON();
 };
 
 [Constructor(optional (DOMString or sequence<unrestricted double>) init),
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webauthn.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webauthn.idl
index dcd1f87..2d2ef507 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webauthn.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webauthn.idl
@@ -1,12 +1,16 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the Web Authentication spec.
+// See https://w3c.github.io/webauthn/
+
 [SecureContext, Exposed=Window]
 interface PublicKeyCredential : Credential {
     [SameObject] readonly attribute ArrayBuffer              rawId;
     [SameObject] readonly attribute AuthenticatorResponse    response;
-    AuthenticationExtensions getClientExtensionResults();
+    AuthenticationExtensionsClientOutputs getClientExtensionResults();
 };
 
 partial dictionary CredentialCreationOptions {
-    MakePublicKeyCredentialOptions      publicKey;
+    PublicKeyCredentialCreationOptions      publicKey;
 };
 
 partial dictionary CredentialRequestOptions {
@@ -31,7 +35,7 @@
 interface AuthenticatorAssertionResponse : AuthenticatorResponse {
     [SameObject] readonly attribute ArrayBuffer      authenticatorData;
     [SameObject] readonly attribute ArrayBuffer      signature;
-    [SameObject] readonly attribute ArrayBuffer      userHandle;
+    [SameObject] readonly attribute ArrayBuffer?     userHandle;
 };
 
 dictionary PublicKeyCredentialParameters {
@@ -39,7 +43,7 @@
     required COSEAlgorithmIdentifier      alg;
 };
 
-dictionary MakePublicKeyCredentialOptions {
+dictionary PublicKeyCredentialCreationOptions {
     required PublicKeyCredentialRpEntity         rp;
     required PublicKeyCredentialUserEntity       user;
 
@@ -50,7 +54,7 @@
     sequence<PublicKeyCredentialDescriptor>      excludeCredentials = [];
     AuthenticatorSelectionCriteria               authenticatorSelection;
     AttestationConveyancePreference              attestation = "none";
-    AuthenticationExtensions                     extensions;
+    AuthenticationExtensionsClientInputs         extensions;
 };
 
 dictionary PublicKeyCredentialEntity {
@@ -90,21 +94,31 @@
     USVString                            rpId;
     sequence<PublicKeyCredentialDescriptor> allowCredentials = [];
     UserVerificationRequirement          userVerification = "preferred";
-    AuthenticationExtensions             extensions;
+    AuthenticationExtensionsClientInputs extensions;
 };
 
-typedef record<DOMString, any>       AuthenticationExtensions;
+dictionary AuthenticationExtensionsClientInputs {
+};
+
+dictionary AuthenticationExtensionsClientOutputs {
+};
+
+typedef record<DOMString, DOMString> AuthenticationExtensionsAuthenticatorInputs;
 
 dictionary CollectedClientData {
     required DOMString           type;
     required DOMString           challenge;
     required DOMString           origin;
-    required DOMString           hashAlgorithm;
-    DOMString                    tokenBindingId;
-    AuthenticationExtensions     clientExtensions;
-    AuthenticationExtensions     authenticatorExtensions;
+    TokenBinding                 tokenBinding;
 };
 
+dictionary TokenBinding {
+    required TokenBindingStatus status;
+    DOMString id;
+};
+
+enum TokenBindingStatus { "present", "supported", "not-supported" };
+
 enum PublicKeyCredentialType {
     "public-key"
 };
@@ -129,6 +143,85 @@
     "discouraged"
 };
 
-typedef sequence<AAGUID>      AuthenticatorSelectionList;
+partial dictionary AuthenticationExtensionsClientInputs {
+  USVString appid;
+};
 
-typedef BufferSource      AAGUID;
\ No newline at end of file
+partial dictionary AuthenticationExtensionsClientOutputs {
+  boolean appid;
+};
+
+partial dictionary AuthenticationExtensionsClientInputs {
+  USVString txAuthSimple;
+};
+
+partial dictionary AuthenticationExtensionsClientOutputs {
+  USVString txAuthSimple;
+};
+
+dictionary txAuthGenericArg {
+    required USVString contentType;    // MIME-Type of the content, e.g., "image/png"
+    required ArrayBuffer content;
+};
+
+partial dictionary AuthenticationExtensionsClientInputs {
+  txAuthGenericArg txAuthGeneric;
+};
+
+partial dictionary AuthenticationExtensionsClientOutputs {
+  ArrayBuffer txAuthGeneric;
+};
+
+typedef sequence<AAGUID> AuthenticatorSelectionList;
+
+partial dictionary AuthenticationExtensionsClientInputs {
+  AuthenticatorSelectionList authnSel;
+};
+
+typedef BufferSource      AAGUID;
+
+partial dictionary AuthenticationExtensionsClientOutputs {
+  boolean authnSel;
+};
+
+partial dictionary AuthenticationExtensionsClientInputs {
+  boolean exts;
+};
+
+typedef sequence<USVString> AuthenticationExtensionsSupported;
+
+partial dictionary AuthenticationExtensionsClientOutputs {
+  AuthenticationExtensionsSupported exts;
+};
+
+partial dictionary AuthenticationExtensionsClientInputs {
+  boolean uvi;
+};
+
+partial dictionary AuthenticationExtensionsClientOutputs {
+  ArrayBuffer uvi;
+};
+
+partial dictionary AuthenticationExtensionsClientInputs {
+  boolean loc;
+};
+
+partial dictionary AuthenticationExtensionsClientOutputs {
+  Coordinates loc;
+};
+
+partial dictionary AuthenticationExtensionsClientInputs {
+  boolean uvm;
+};
+
+typedef sequence<unsigned long> UvmEntry;
+typedef sequence<UvmEntry> UvmEntries;
+
+partial dictionary AuthenticationExtensionsClientOutputs {
+  UvmEntries uvm;
+};
+
+dictionary authenticatorBiometricPerfBounds{
+    float FAR;
+    float FRR;
+    };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webrtc-pc.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webrtc-pc.idl
index d33562b6..fde2ba02 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webrtc-pc.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webrtc-pc.idl
@@ -1,15 +1,16 @@
-// IDL definition extracted from
-// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the WebRTC spec.
+// See https://w3c.github.io/webrtc-pc/
 
 dictionary RTCConfiguration {
-    sequence<RTCIceServer>   iceServers;
-    RTCIceTransportPolicy    iceTransportPolicy = "all";
-    RTCBundlePolicy          bundlePolicy = "balanced";
-    RTCRtcpMuxPolicy         rtcpMuxPolicy = "require";
-    DOMString                peerIdentity;
-    sequence<RTCCertificate> certificates;
-    [EnforceRange]
-    octet                    iceCandidatePoolSize = 0;
+             sequence<RTCIceServer>   iceServers;
+             RTCIceTransportPolicy    iceTransportPolicy = "all";
+             RTCBundlePolicy          bundlePolicy = "balanced";
+             RTCRtcpMuxPolicy         rtcpMuxPolicy = "require";
+             DOMString                peerIdentity;
+             sequence<RTCCertificate> certificates;
+             [EnforceRange]
+             octet                    iceCandidatePoolSize = 0;
 };
 
 enum RTCIceCredentialType {
@@ -18,14 +19,14 @@
 };
 
 dictionary RTCOAuthCredential {
-    required DOMString macKey;
-    required DOMString accessToken;
+    required DOMString        macKey;
+    required DOMString        accessToken;
 };
 
 dictionary RTCIceServer {
     required (DOMString or sequence<DOMString>) urls;
              DOMString                          username;
-             (DOMString or RTCOAuthCredential)  credential;
+             (DOMString or RTCOAuthCredential)     credential;
              RTCIceCredentialType               credentialType = "password";
 };
 
@@ -47,71 +48,16 @@
 };
 
 dictionary RTCOfferAnswerOptions {
-    boolean voiceActivityDetection = true;
+             boolean voiceActivityDetection = true;
 };
 
 dictionary RTCOfferOptions : RTCOfferAnswerOptions {
-    boolean iceRestart = false;
-    boolean offerToReceiveAudio;
-    boolean offerToReceiveVideo;
+             boolean iceRestart = false;
 };
 
-dictionary RTCAnswerOptions : RTCOfferAnswerOptions {
+          dictionary RTCAnswerOptions : RTCOfferAnswerOptions {
 };
 
-[Constructor(optional RTCConfiguration configuration)]
-interface RTCPeerConnection : EventTarget {
-    Promise<RTCSessionDescriptionInit> createOffer(optional RTCOfferOptions options);
-    Promise<RTCSessionDescriptionInit> createAnswer(optional RTCAnswerOptions options);
-    Promise<void>                      setLocalDescription(RTCSessionDescriptionInit description);
-    readonly attribute RTCSessionDescription? localDescription;
-    readonly attribute RTCSessionDescription? currentLocalDescription;
-    readonly attribute RTCSessionDescription? pendingLocalDescription;
-    Promise<void>                      setRemoteDescription(RTCSessionDescriptionInit description);
-    readonly attribute RTCSessionDescription? remoteDescription;
-    readonly attribute RTCSessionDescription? currentRemoteDescription;
-    readonly attribute RTCSessionDescription? pendingRemoteDescription;
-    Promise<void>                      addIceCandidate((RTCIceCandidateInit or RTCIceCandidate) candidate);
-    readonly attribute RTCSignalingState      signalingState;
-    readonly attribute RTCIceGatheringState   iceGatheringState;
-    readonly attribute RTCIceConnectionState  iceConnectionState;
-    readonly attribute RTCPeerConnectionState connectionState;
-    readonly attribute boolean?               canTrickleIceCandidates;
-    static sequence<RTCIceServer>      getDefaultIceServers();
-    RTCConfiguration                   getConfiguration();
-    void                               setConfiguration(RTCConfiguration configuration);
-    void                               close();
-             attribute EventHandler           onnegotiationneeded;
-             attribute EventHandler           onicecandidate;
-             attribute EventHandler           onicecandidateerror;
-             attribute EventHandler           onsignalingstatechange;
-             attribute EventHandler           oniceconnectionstatechange;
-             attribute EventHandler           onicegatheringstatechange;
-             attribute EventHandler           onconnectionstatechange;
-             attribute EventHandler           onfingerprintfailure;
-};
-
-partial interface RTCPeerConnection {
-    Promise<void> createOffer(RTCSessionDescriptionCallback successCallback,
-                              RTCPeerConnectionErrorCallback failureCallback,
-                              optional RTCOfferOptions options);
-    Promise<void> setLocalDescription(RTCSessionDescriptionInit description,
-                                      VoidFunction successCallback,
-                                      RTCPeerConnectionErrorCallback failureCallback);
-    Promise<void> createAnswer(RTCSessionDescriptionCallback successCallback,
-                               RTCPeerConnectionErrorCallback failureCallback);
-    Promise<void> setRemoteDescription(RTCSessionDescriptionInit description,
-                                       VoidFunction successCallback,
-                                       RTCPeerConnectionErrorCallback failureCallback);
-    Promise<void> addIceCandidate((RTCIceCandidateInit or RTCIceCandidate) candidate,
-                                  VoidFunction successCallback,
-                                  RTCPeerConnectionErrorCallback failureCallback);
-};
-
-callback RTCPeerConnectionErrorCallback = void (DOMException error);
-
-callback RTCSessionDescriptionCallback = void (RTCSessionDescriptionInit description);
-
 enum RTCSignalingState {
     "stable",
     "have-local-offer",
@@ -141,11 +87,59 @@
     "checking",
     "connected",
     "completed",
-    "failed",
     "disconnected",
+    "failed",
     "closed"
 };
 
+          [ Constructor (optional RTCConfiguration configuration), Exposed=Window]
+interface RTCPeerConnection : EventTarget  {
+    Promise<RTCSessionDescriptionInit> createOffer (optional RTCOfferOptions options);
+    Promise<RTCSessionDescriptionInit> createAnswer (optional RTCAnswerOptions options);
+    Promise<void>                      setLocalDescription (RTCSessionDescriptionInit description);
+    readonly        attribute RTCSessionDescription?    localDescription;
+    readonly        attribute RTCSessionDescription?    currentLocalDescription;
+    readonly        attribute RTCSessionDescription?    pendingLocalDescription;
+    Promise<void>                      setRemoteDescription (RTCSessionDescriptionInit description);
+    readonly        attribute RTCSessionDescription?    remoteDescription;
+    readonly        attribute RTCSessionDescription?    currentRemoteDescription;
+    readonly        attribute RTCSessionDescription?    pendingRemoteDescription;
+    Promise<void>                      addIceCandidate ((RTCIceCandidateInit or RTCIceCandidate) candidate);
+    readonly        attribute RTCSignalingState         signalingState;
+    readonly        attribute RTCIceGatheringState      iceGatheringState;
+    readonly        attribute RTCIceConnectionState     iceConnectionState;
+    readonly        attribute RTCPeerConnectionState    connectionState;
+    readonly        attribute boolean?                  canTrickleIceCandidates;
+    static sequence<RTCIceServer>      getDefaultIceServers ();
+    RTCConfiguration                   getConfiguration ();
+    void                               setConfiguration (RTCConfiguration configuration);
+    void                               close ();
+                    attribute EventHandler              onnegotiationneeded;
+                    attribute EventHandler              onicecandidate;
+                    attribute EventHandler              onicecandidateerror;
+                    attribute EventHandler              onsignalingstatechange;
+                    attribute EventHandler              oniceconnectionstatechange;
+                    attribute EventHandler              onicegatheringstatechange;
+                    attribute EventHandler              onconnectionstatechange;
+};
+
+partial interface RTCPeerConnection {
+    Promise<void> createOffer (RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback, optional RTCOfferOptions options);
+    Promise<void> setLocalDescription (RTCSessionDescriptionInit description, VoidFunction successCallback, RTCPeerConnectionErrorCallback failureCallback);
+    Promise<void> createAnswer (RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback);
+    Promise<void> setRemoteDescription (RTCSessionDescriptionInit description, VoidFunction successCallback, RTCPeerConnectionErrorCallback failureCallback);
+    Promise<void> addIceCandidate ((RTCIceCandidateInit or RTCIceCandidate) candidate, VoidFunction successCallback, RTCPeerConnectionErrorCallback failureCallback);
+};
+
+                callback RTCPeerConnectionErrorCallback = void (DOMException error);
+
+                callback RTCSessionDescriptionCallback = void (RTCSessionDescriptionInit description);
+
+partial dictionary RTCOfferOptions {
+            boolean offerToReceiveAudio;
+            boolean offerToReceiveVideo;
+          };
+
 enum RTCSdpType {
     "offer",
     "pranswer",
@@ -153,10 +147,10 @@
     "rollback"
 };
 
-[Constructor(RTCSessionDescriptionInit descriptionInitDict)]
+          [ Constructor (RTCSessionDescriptionInit descriptionInitDict), Exposed=Window]
 interface RTCSessionDescription {
-    readonly attribute RTCSdpType type;
-    readonly attribute DOMString  sdp;
+    readonly        attribute RTCSdpType type;
+    readonly        attribute DOMString  sdp;
     [Default] object toJSON();
 };
 
@@ -165,30 +159,30 @@
              DOMString  sdp = "";
 };
 
-[Constructor(optional RTCIceCandidateInit candidateInitDict)]
+          [ Constructor (optional RTCIceCandidateInit candidateInitDict), Exposed=Window]
 interface RTCIceCandidate {
-    readonly attribute DOMString               candidate;
-    readonly attribute DOMString?              sdpMid;
-    readonly attribute unsigned short?         sdpMLineIndex;
-    readonly attribute DOMString?              foundation;
-    readonly attribute RTCIceComponent?        component;
-    readonly attribute unsigned long?          priority;
-    readonly attribute DOMString?              ip;
-    readonly attribute RTCIceProtocol?         protocol;
-    readonly attribute unsigned short?         port;
-    readonly attribute RTCIceCandidateType?    type;
-    readonly attribute RTCIceTcpCandidateType? tcpType;
-    readonly attribute DOMString?              relatedAddress;
-    readonly attribute unsigned short?         relatedPort;
-    readonly attribute DOMString?              usernameFragment;
+    readonly        attribute DOMString               candidate;
+    readonly        attribute DOMString?              sdpMid;
+    readonly        attribute unsigned short?         sdpMLineIndex;
+    readonly        attribute DOMString?              foundation;
+    readonly        attribute RTCIceComponent?        component;
+    readonly        attribute unsigned long?          priority;
+    readonly        attribute DOMString?              ip;
+    readonly        attribute RTCIceProtocol?         protocol;
+    readonly        attribute unsigned short?         port;
+    readonly        attribute RTCIceCandidateType?    type;
+    readonly        attribute RTCIceTcpCandidateType? tcpType;
+    readonly        attribute DOMString?              relatedAddress;
+    readonly        attribute unsigned short?         relatedPort;
+    readonly        attribute DOMString?              usernameFragment;
     RTCIceCandidateInit toJSON();
 };
 
 dictionary RTCIceCandidateInit {
-    DOMString       candidate = "";
-    DOMString?      sdpMid = null;
-    unsigned short? sdpMLineIndex = null;
-    DOMString       usernameFragment;
+             DOMString       candidate = "";
+             DOMString?      sdpMid = null;
+             unsigned short? sdpMLineIndex = null;
+             DOMString       usernameFragment;
 };
 
 enum RTCIceProtocol {
@@ -209,29 +203,29 @@
     "relay"
 };
 
-[Constructor(DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict)]
+          [ Constructor (DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict), Exposed=Window]
 interface RTCPeerConnectionIceEvent : Event {
-    readonly attribute RTCIceCandidate? candidate;
-    readonly attribute DOMString?       url;
+    readonly        attribute RTCIceCandidate? candidate;
+    readonly        attribute DOMString?       url;
 };
 
-dictionary RTCPeerConnectionIceEventInit : EventInit {
-    RTCIceCandidate? candidate;
-    DOMString?       url;
+          dictionary RTCPeerConnectionIceEventInit : EventInit {
+             RTCIceCandidate? candidate;
+             DOMString?       url;
 };
 
-[Constructor(DOMString type, RTCPeerConnectionIceErrorEventInit eventInitDict)]
+          [ Constructor (DOMString type, RTCPeerConnectionIceErrorEventInit eventInitDict), Exposed=Window]
 interface RTCPeerConnectionIceErrorEvent : Event {
-    readonly attribute DOMString      hostCandidate;
-    readonly attribute DOMString      url;
-    readonly attribute unsigned short errorCode;
-    readonly attribute USVString      errorText;
+    readonly        attribute DOMString      hostCandidate;
+    readonly        attribute DOMString      url;
+    readonly        attribute unsigned short errorCode;
+    readonly        attribute USVString      errorText;
 };
 
-dictionary RTCPeerConnectionIceErrorEventInit : EventInit {
+          dictionary RTCPeerConnectionIceErrorEventInit : EventInit {
              DOMString      hostCandidate;
              DOMString      url;
-    required unsigned short errorCode;
+             required unsigned short errorCode;
              USVString      statusText;
 };
 
@@ -243,7 +237,7 @@
 };
 
 partial interface RTCPeerConnection {
-    static Promise<RTCCertificate> generateCertificate(AlgorithmIdentifier keygenAlgorithm);
+    static Promise<RTCCertificate> generateCertificate (AlgorithmIdentifier keygenAlgorithm);
 };
 
 dictionary RTCCertificateExpiration {
@@ -251,29 +245,26 @@
     DOMTimeStamp expires;
 };
 
-interface RTCCertificate {
-    readonly attribute DOMTimeStamp expires;
-    sequence<RTCDtlsFingerprint> getFingerprints();
-    // At risk due to lack of implementers' interest.
-    AlgorithmIdentifier          getAlgorithm();
+[Exposed=Window] interface RTCCertificate {
+    readonly        attribute DOMTimeStamp expires;
+    static sequence<AlgorithmIdentifier> getSupportedAlgorithms();
+    sequence<RTCDtlsFingerprint> getFingerprints ();
 };
 
 partial interface RTCPeerConnection {
-    sequence<RTCRtpSender>      getSenders();
-    sequence<RTCRtpReceiver>    getReceivers();
-    sequence<RTCRtpTransceiver> getTransceivers();
-    RTCRtpSender                addTrack(MediaStreamTrack track,
-                                         MediaStream... streams);
-    void                        removeTrack(RTCRtpSender sender);
-    RTCRtpTransceiver           addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
-                                               optional RTCRtpTransceiverInit init);
-    attribute EventHandler ontrack;
+    sequence<RTCRtpSender>      getSenders ();
+    sequence<RTCRtpReceiver>    getReceivers ();
+    sequence<RTCRtpTransceiver> getTransceivers ();
+    RTCRtpSender                addTrack (MediaStreamTrack track, MediaStream... streams);
+    void                        removeTrack (RTCRtpSender sender);
+    RTCRtpTransceiver           addTransceiver ((MediaStreamTrack or DOMString) trackOrKind, optional RTCRtpTransceiverInit init);
+                    attribute EventHandler ontrack;
 };
 
 dictionary RTCRtpTransceiverInit {
-    RTCRtpTransceiverDirection         direction = "sendrecv";
-    sequence<MediaStream>              streams;
-    sequence<RTCRtpEncodingParameters> sendEncodings;
+             RTCRtpTransceiverDirection         direction = "sendrecv";
+             sequence<MediaStream>              streams = [];
+             sequence<RTCRtpEncodingParameters> sendEncodings = [];
 };
 
 enum RTCRtpTransceiverDirection {
@@ -283,45 +274,42 @@
     "inactive"
 };
 
-interface RTCRtpSender {
-    readonly attribute MediaStreamTrack? track;
-    readonly attribute RTCDtlsTransport? transport;
-    readonly attribute RTCDtlsTransport? rtcpTransport;
-    // Feature at risk
-    static RTCRtpCapabilities getCapabilities(DOMString kind);
-    Promise<void>           setParameters(optional RTCRtpParameters parameters);
-    RTCRtpParameters        getParameters();
-    Promise<void>           replaceTrack(MediaStreamTrack withTrack);
-    Promise<RTCStatsReport> getStats();
+[Exposed=Window] interface RTCRtpSender {
+    readonly        attribute MediaStreamTrack? track;
+    readonly        attribute RTCDtlsTransport?  transport;
+    readonly        attribute RTCDtlsTransport? rtcpTransport;
+    static RTCRtpCapabilities getCapabilities (DOMString kind);
+    Promise<void>             setParameters (optional RTCRtpParameters parameters);
+    RTCRtpParameters          getParameters ();
+    Promise<void>             replaceTrack (MediaStreamTrack? withTrack);
+    Promise<RTCStatsReport>   getStats();
 };
 
 dictionary RTCRtpParameters {
-    DOMString                                 transactionId;
-    sequence<RTCRtpEncodingParameters>        encodings;
-    sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
-    RTCRtcpParameters                         rtcp;
-    sequence<RTCRtpCodecParameters>           codecs;
-    RTCDegradationPreference                  degradationPreference;
+             DOMString                                 transactionId;
+             sequence<RTCRtpEncodingParameters>        encodings;
+             sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+             RTCRtcpParameters                         rtcp;
+             sequence<RTCRtpCodecParameters>           codecs;
+             RTCDegradationPreference                  degradationPreference;
 };
 
 dictionary RTCRtpEncodingParameters {
-    unsigned long       ssrc;
-    RTCRtpRtxParameters rtx;
-    RTCRtpFecParameters fec;
-    RTCDtxStatus        dtx;
-    boolean             active;
-    RTCPriorityType     priority;
-    unsigned long       ptime;
-    unsigned long       maxBitrate;
-    double              maxFramerate;
-    DOMString           rid;
-    double              scaleResolutionDownBy;
+             octet               codecPayloadType;
+             RTCDtxStatus        dtx;
+             boolean             active = true;
+             RTCPriorityType     priority = "low";
+             unsigned long       ptime;
+             unsigned long       maxBitrate;
+             double              maxFramerate;
+             DOMString           rid;
+             double              scaleResolutionDownBy;
 };
 
 enum RTCDtxStatus {
-    "disabled",
-    "enabled"
-};
+         "disabled",
+         "enabled"
+         };
 
 enum RTCDegradationPreference {
     "maintain-framerate",
@@ -329,93 +317,81 @@
     "balanced"
 };
 
-dictionary RTCRtpRtxParameters {
-    unsigned long ssrc;
-};
-
-dictionary RTCRtpFecParameters {
-    unsigned long ssrc;
-};
-
 dictionary RTCRtcpParameters {
-    DOMString cname;
-    boolean   reducedSize;
+             DOMString cname;
+             boolean   reducedSize;
 };
 
 dictionary RTCRtpHeaderExtensionParameters {
-    DOMString      uri;
-    unsigned short id;
-    boolean        encrypted;
+             DOMString      uri;
+             unsigned short id;
+             boolean        encrypted;
 };
 
 dictionary RTCRtpCodecParameters {
-    unsigned short payloadType;
-    DOMString      mimeType;
-    unsigned long  clockRate;
-    unsigned short channels;
-    DOMString      sdpFmtpLine;
+             octet          payloadType;
+             DOMString      mimeType;
+             unsigned long  clockRate;
+             unsigned short channels;
+             DOMString      sdpFmtpLine;
 };
 
 dictionary RTCRtpCapabilities {
-    sequence<RTCRtpCodecCapability>           codecs;
-    sequence<RTCRtpHeaderExtensionCapability> headerExtensions;
+             sequence<RTCRtpCodecCapability>           codecs;
+             sequence<RTCRtpHeaderExtensionCapability> headerExtensions;
 };
 
 dictionary RTCRtpCodecCapability {
-    DOMString      mimeType;
-    unsigned long  clockRate;
-    unsigned short channels;
-    DOMString      sdpFmtpLine;
+             DOMString mimeType;
+             unsigned long  clockRate;
+             unsigned short channels;
+             DOMString      sdpFmtpLine;
 };
 
 dictionary RTCRtpHeaderExtensionCapability {
-    DOMString uri;
+             DOMString uri;
 };
 
-interface RTCRtpReceiver {
-    readonly attribute MediaStreamTrack  track;
-    readonly attribute RTCDtlsTransport? transport;
-    readonly attribute RTCDtlsTransport? rtcpTransport;
-    // Feature at risk
-    static RTCRtpCapabilities             getCapabilities(DOMString kind);
-    RTCRtpParameters                      getParameters();
-    sequence<RTCRtpContributingSource>    getContributingSources();
-    sequence<RTCRtpSynchronizationSource> getSynchronizationSources();
-    Promise<RTCStatsReport>               getStats();
+[Exposed=Window] interface RTCRtpReceiver {
+    readonly        attribute MediaStreamTrack  track;
+    readonly        attribute RTCDtlsTransport? transport;
+    readonly        attribute RTCDtlsTransport? rtcpTransport;
+    static RTCRtpCapabilities          getCapabilities (DOMString kind);
+    RTCRtpParameters                   getParameters ();
+    sequence<RTCRtpContributingSource>    getContributingSources ();
+    sequence<RTCRtpSynchronizationSource> getSynchronizationSources ();
+    Promise<RTCStatsReport>   getStats();
 };
 
-interface RTCRtpContributingSource {
-    readonly attribute DOMHighResTimeStamp timestamp;
-    readonly attribute unsigned long       source;
-    readonly attribute byte?               audioLevel;
+dictionary RTCRtpContributingSource {
+    required DOMHighResTimeStamp timestamp;
+    required unsigned long       source;
+             double              audioLevel;
 };
 
-interface RTCRtpSynchronizationSource {
-    readonly attribute DOMHighResTimeStamp timestamp;
-    readonly attribute unsigned long       source;
-    readonly attribute byte                audioLevel;
-    readonly attribute boolean?            voiceActivityFlag;
+dictionary RTCRtpSynchronizationSource : RTCRtpContributingSource {
+    boolean voiceActivityFlag;
 };
 
-interface RTCRtpTransceiver {
-    readonly attribute DOMString?                  mid;
+[Exposed=Window] interface RTCRtpTransceiver {
+    readonly        attribute DOMString?                  mid;
     [SameObject]
-    readonly attribute RTCRtpSender                sender;
+    readonly        attribute RTCRtpSender                sender;
     [SameObject]
-    readonly attribute RTCRtpReceiver              receiver;
-    readonly attribute boolean                     stopped;
-    readonly attribute RTCRtpTransceiverDirection  direction;
-    readonly attribute RTCRtpTransceiverDirection? currentDirection;
-    void setDirection(RTCRtpTransceiverDirection direction);
-    void stop();
-    void setCodecPreferences(sequence<RTCRtpCodecCapability> codecs);
+    readonly        attribute RTCRtpReceiver              receiver;
+    readonly        attribute boolean                     stopped;
+                    attribute RTCRtpTransceiverDirection  direction;
+    readonly        attribute RTCRtpTransceiverDirection? currentDirection;
+    void stop ();
+    void setCodecPreferences (sequence<RTCRtpCodecCapability> codecs);
 };
 
-interface RTCDtlsTransport {
-    readonly attribute RTCIceTransport       transport;
-    readonly attribute RTCDtlsTransportState state;
-    sequence<ArrayBuffer> getRemoteCertificates();
-             attribute EventHandler          onstatechange;
+[Exposed=Window] interface RTCDtlsTransport : EventTarget {
+    readonly        attribute RTCIceTransport       transport;
+    readonly        attribute RTCDtlsTransportState state;
+    sequence<ArrayBuffer> getRemoteCertificates ();
+                    attribute EventHandler          onstatechange;
+                    attribute EventHandler          onerror;
 };
 
 enum RTCDtlsTransportState {
@@ -427,33 +403,33 @@
 };
 
 dictionary RTCDtlsFingerprint {
-    DOMString algorithm;
-    DOMString value;
+             DOMString algorithm;
+             DOMString value;
 };
 
-interface RTCIceTransport {
-    readonly attribute RTCIceRole           role;
-    readonly attribute RTCIceComponent      component;
-    readonly attribute RTCIceTransportState state;
-    readonly attribute RTCIceGathererState  gatheringState;
-    sequence<RTCIceCandidate> getLocalCandidates();
-    sequence<RTCIceCandidate> getRemoteCandidates();
-    RTCIceCandidatePair?      getSelectedCandidatePair();
-    RTCIceParameters?         getLocalParameters();
-    RTCIceParameters?         getRemoteParameters();
-             attribute EventHandler         onstatechange;
-             attribute EventHandler         ongatheringstatechange;
-             attribute EventHandler         onselectedcandidatepairchange;
+[Exposed=Window] interface RTCIceTransport : EventTarget {
+    readonly        attribute RTCIceRole           role;
+    readonly        attribute RTCIceComponent      component;
+    readonly        attribute RTCIceTransportState state;
+    readonly        attribute RTCIceGathererState gatheringState;
+    sequence<RTCIceCandidate> getLocalCandidates ();
+    sequence<RTCIceCandidate> getRemoteCandidates ();
+    RTCIceCandidatePair?      getSelectedCandidatePair ();
+    RTCIceParameters?         getLocalParameters ();
+    RTCIceParameters?         getRemoteParameters ();
+                    attribute EventHandler         onstatechange;
+                    attribute EventHandler         ongatheringstatechange;
+                    attribute EventHandler         onselectedcandidatepairchange;
 };
 
 dictionary RTCIceParameters {
-    DOMString usernameFragment;
-    DOMString password;
+             DOMString usernameFragment;
+             DOMString password;
 };
 
 dictionary RTCIceCandidatePair {
-    RTCIceCandidate local;
-    RTCIceCandidate remote;
+             RTCIceCandidate local;
+             RTCIceCandidate remote;
 };
 
 enum RTCIceGathererState {
@@ -467,8 +443,8 @@
     "checking",
     "connected",
     "completed",
-    "failed",
     "disconnected",
+    "failed",
     "closed"
 };
 
@@ -482,13 +458,13 @@
     "rtcp"
 };
 
-[Constructor(DOMString type, RTCTrackEventInit eventInitDict)]
+        [ Constructor (DOMString type, RTCTrackEventInit eventInitDict), Exposed=Window]
 interface RTCTrackEvent : Event {
-    readonly attribute RTCRtpReceiver           receiver;
-    readonly attribute MediaStreamTrack         track;
+    readonly        attribute RTCRtpReceiver           receiver;
+    readonly        attribute MediaStreamTrack         track;
     [SameObject]
-    readonly attribute FrozenArray<MediaStream> streams;
-    readonly attribute RTCRtpTransceiver        transceiver;
+    readonly        attribute FrozenArray<MediaStream> streams;
+    readonly        attribute RTCRtpTransceiver        transceiver;
 };
 
 dictionary RTCTrackEventInit : EventInit {
@@ -499,51 +475,59 @@
 };
 
 partial interface RTCPeerConnection {
-    readonly attribute RTCSctpTransport? sctp;
-    RTCDataChannel createDataChannel(USVString label,
-                                     optional RTCDataChannelInit dataChannelDict);
-             attribute EventHandler      ondatachannel;
+    readonly        attribute RTCSctpTransport? sctp;
+    RTCDataChannel createDataChannel (USVString label, optional RTCDataChannelInit dataChannelDict);
+                    attribute EventHandler      ondatachannel;
 };
 
-interface RTCSctpTransport {
-    readonly attribute RTCDtlsTransport transport;
-    readonly attribute unrestricted double maxMessageSize;
+[Exposed=Window] interface RTCSctpTransport {
+    readonly        attribute RTCDtlsTransport transport;
+    readonly        attribute RTCSctpTransportState state;
+    readonly        attribute unrestricted double maxMessageSize;
+                    attribute EventHandler     onstatechange;
 };
 
-interface RTCDataChannel : EventTarget {
-    readonly attribute USVString           label;
-    readonly attribute boolean             ordered;
-    readonly attribute unsigned short?     maxPacketLifeTime;
-    readonly attribute unsigned short?     maxRetransmits;
-    readonly attribute USVString           protocol;
-    readonly attribute boolean             negotiated;
-    readonly attribute unsigned short?     id;
-    readonly attribute RTCPriorityType     priority;
-    readonly attribute RTCDataChannelState readyState;
-    readonly attribute unsigned long       bufferedAmount;
-             attribute unsigned long       bufferedAmountLowThreshold;
-             attribute EventHandler        onopen;
-             attribute EventHandler        onbufferedamountlow;
-             attribute EventHandler        onerror;
-             attribute EventHandler        onclose;
-    void close();
-             attribute EventHandler        onmessage;
-             attribute DOMString           binaryType;
-    void send(USVString data);
-    void send(Blob data);
-    void send(ArrayBuffer data);
-    void send(ArrayBufferView data);
+enum RTCSctpTransportState {
+    "new",
+    "connecting",
+    "connected",
+    "closed"
+};
+
+[Exposed=Window] interface RTCDataChannel : EventTarget {
+    readonly        attribute USVString           label;
+    readonly        attribute boolean             ordered;
+    readonly        attribute unsigned short?     maxPacketLifeTime;
+    readonly        attribute unsigned short?     maxRetransmits;
+    readonly        attribute USVString           protocol;
+    readonly        attribute boolean             negotiated;
+    readonly        attribute unsigned short?     id;
+    readonly        attribute RTCPriorityType     priority;
+    readonly        attribute RTCDataChannelState readyState;
+    readonly        attribute unsigned long       bufferedAmount;
+                    attribute unsigned long       bufferedAmountLowThreshold;
+                    attribute EventHandler        onopen;
+                    attribute EventHandler        onbufferedamountlow;
+                    attribute EventHandler        onerror;
+                    attribute EventHandler        onclose;
+    void close ();
+                    attribute EventHandler        onmessage;
+                    attribute DOMString           binaryType;
+    void send (USVString data);
+    void send (Blob data);
+    void send (ArrayBuffer data);
+    void send (ArrayBufferView data);
 };
 
 dictionary RTCDataChannelInit {
-    boolean         ordered = true;
-    unsigned short  maxPacketLifeTime;
-    unsigned short  maxRetransmits;
-    USVString       protocol = "";
-    boolean         negotiated = false;
-    [EnforceRange]
-    unsigned short  id;
-    RTCPriorityType priority = "low";
+             boolean         ordered = true;
+             unsigned short  maxPacketLifeTime;
+             unsigned short  maxRetransmits;
+             USVString       protocol = "";
+             boolean         negotiated = false;
+             [EnforceRange]
+             unsigned short  id;
+             RTCPriorityType priority = "low";
 };
 
 enum RTCDataChannelState {
@@ -553,59 +537,64 @@
     "closed"
 };
 
-[Constructor(DOMString type, RTCDataChannelEventInit eventInitDict)]
+        [ Constructor (DOMString type, RTCDataChannelEventInit eventInitDict), Exposed=Window]
 interface RTCDataChannelEvent : Event {
-    readonly attribute RTCDataChannel channel;
+    readonly        attribute RTCDataChannel channel;
 };
 
 dictionary RTCDataChannelEventInit : EventInit {
-    required RTCDataChannel channel;
+             required RTCDataChannel channel;
 };
 
 partial interface RTCRtpSender {
-    readonly attribute RTCDTMFSender? dtmf;
+    readonly        attribute RTCDTMFSender? dtmf;
 };
 
-interface RTCDTMFSender : EventTarget {
-    void insertDTMF(DOMString tones,
-                    optional unsigned long duration = 100,
-                    optional unsigned long interToneGap = 70);
-             attribute EventHandler ontonechange;
-    readonly attribute DOMString    toneBuffer;
+[Exposed=Window] interface RTCDTMFSender : EventTarget {
+    void insertDTMF (DOMString tones, optional unsigned long duration = 100, optional unsigned long interToneGap = 70);
+                    attribute EventHandler ontonechange;
+    readonly        attribute boolean      canInsertDTMF;
+    readonly        attribute DOMString    toneBuffer;
 };
 
-[Constructor(DOMString type, RTCDTMFToneChangeEventInit eventInitDict)]
+        [ Constructor (DOMString type, RTCDTMFToneChangeEventInit eventInitDict), Exposed=Window]
 interface RTCDTMFToneChangeEvent : Event {
-    readonly attribute DOMString tone;
+    readonly        attribute DOMString tone;
 };
 
 dictionary RTCDTMFToneChangeEventInit : EventInit {
-    required DOMString tone;
+             required DOMString tone;
 };
 
 partial interface RTCPeerConnection {
-    Promise<RTCStatsReport> getStats(optional MediaStreamTrack? selector = null);
-};
+    Promise<RTCStatsReport> getStats (optional MediaStreamTrack? selector = null);
+    attribute EventHandler onstatsended;
+          };
 
-interface RTCStatsReport {
+[Exposed=Window] interface RTCStatsReport {
     readonly maplike<DOMString, object>;
 };
 
 dictionary RTCStats {
-    DOMHighResTimeStamp timestamp;
-    RTCStatsType        type;
-    DOMString           id;
+             required DOMHighResTimeStamp timestamp;
+             required RTCStatsType        type;
+             required DOMString           id;
 };
 
-[Global,
- Exposed=RTCIdentityProviderGlobalScope]
+[ Constructor (DOMString type, RTCStatsEventInit
+          eventInitDict), Exposed=Window]
+          interface RTCStatsEvent : Event {
+            readonly attribute RTCStatsReport report;
+          };
+
+[Global, Exposed=RTCIdentityProviderGlobalScope]
 interface RTCIdentityProviderGlobalScope : WorkerGlobalScope {
-    readonly attribute RTCIdentityProviderRegistrar rtcIdentityProvider;
+    readonly        attribute RTCIdentityProviderRegistrar rtcIdentityProvider;
 };
 
 [Exposed=RTCIdentityProviderGlobalScope]
 interface RTCIdentityProviderRegistrar {
-    void register(RTCIdentityProvider idp);
+    void register (RTCIdentityProvider idp);
 };
 
 dictionary RTCIdentityProvider {
@@ -613,12 +602,11 @@
     required ValidateAssertionCallback validateAssertion;
 };
 
-callback GenerateAssertionCallback = Promise<RTCIdentityAssertionResult> (DOMString contents,
-                                                                          DOMString origin,
-                                                                          RTCIdentityProviderOptions options);
+          callback GenerateAssertionCallback = Promise<RTCIdentityAssertionResult>
+          (DOMString contents, DOMString origin, RTCIdentityProviderOptions options);
 
-callback ValidateAssertionCallback = Promise<RTCIdentityValidationResult> (DOMString assertion,
-                                                                           DOMString origin);
+          callback ValidateAssertionCallback = Promise<RTCIdentityValidationResult>
+          (DOMString assertion, DOMString origin);
 
 dictionary RTCIdentityAssertionResult {
     required RTCIdentityProviderDetails idp;
@@ -636,12 +624,11 @@
 };
 
 partial interface RTCPeerConnection {
-    void               setIdentityProvider(DOMString provider,
-                                           optional RTCIdentityProviderOptions options);
-    Promise<DOMString> getIdentityAssertion();
-    readonly attribute Promise<RTCIdentityAssertion> peerIdentity;
-    readonly attribute DOMString?                    idpLoginUrl;
-    readonly attribute DOMString?                    idpErrorInfo;
+    void               setIdentityProvider (DOMString provider, optional RTCIdentityProviderOptions options);
+    Promise<DOMString> getIdentityAssertion ();
+    readonly        attribute Promise<RTCIdentityAssertion> peerIdentity;
+    readonly        attribute DOMString?                    idpLoginUrl;
+    readonly        attribute DOMString?                    idpErrorInfo;
 };
 
 dictionary RTCIdentityProviderOptions {
@@ -650,41 +637,45 @@
     DOMString peerIdentity;
 };
 
-[Constructor(DOMString idp, DOMString name)]
+[Constructor(DOMString idp, DOMString name), Exposed=Window]
 interface RTCIdentityAssertion {
     attribute DOMString idp;
     attribute DOMString name;
 };
 
 partial dictionary MediaStreamConstraints {
-    DOMString peerIdentity;
+             DOMString peerIdentity;
 };
 
 partial interface MediaStreamTrack {
-    readonly attribute boolean      isolated;
-             attribute EventHandler onisolationchange;
+    readonly        attribute boolean      isolated;
+                    attribute EventHandler onisolationchange;
 };
 
 enum RTCErrorDetailType {
-    "data-channel-failure",
-    "idp-bad-script-failure",
-    "idp-execution-failure",
-    "idp-load-failure",
-    "idp-need-login",
-    "idp-timeout",
-    "idp-tls-failure",
-    "idp-token-expired",
-    "idp-token-invalid",
-    "sctp-failure",
-    "sdp-syntax-error"
-};
+              "data-channel-failure",
+              "dtls-failure",
+              "fingerprint-failure",
+              "idp-bad-script-failure",
+              "idp-execution-failure",
+              "idp-load-failure",
+              "idp-need-login",
+              "idp-timeout",
+              "idp-tls-failure",
+              "idp-token-expired",
+              "idp-token-invalid",
+              "sctp-failure",
+              "sdp-syntax-error",
+              "hardware-encoder-not-available",
+              "hardware-encoder-error"
+          };
 
 [Exposed=Window,
- Constructor(DOMString type, RTCErrorEventInit eventInitDict)]
+ Constructor (DOMString type, RTCErrorEventInit eventInitDict)]
 interface RTCErrorEvent : Event {
-    readonly attribute RTCError? error;
+    readonly        attribute RTCError? error;
 };
 
 dictionary RTCErrorEventInit : EventInit {
-    RTCError? error = null;
+             RTCError? error = null;
 };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt
index 49822f4..8d6a497 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/magnetometer/idlharness.https-expected.txt
@@ -1,85 +1,4 @@
 This is a testharness.js-based test.
-PASS Test IDL implementation of Magnetometer Sensor
-PASS Sensor interface: existence and properties of interface object
-PASS Sensor interface object length
-PASS Sensor interface object name
-PASS Sensor interface: existence and properties of interface prototype object
-PASS Sensor interface: existence and properties of interface prototype object's "constructor" property
-PASS Sensor interface: existence and properties of interface prototype object's @@unscopables property
-PASS Sensor interface: attribute activated
-PASS Unscopable handled correctly for activated property on Sensor
-PASS Sensor interface: attribute hasReading
-PASS Unscopable handled correctly for hasReading property on Sensor
-PASS Sensor interface: attribute timestamp
-PASS Unscopable handled correctly for timestamp property on Sensor
-PASS Sensor interface: operation start()
-PASS Unscopable handled correctly for start() on Sensor
-PASS Sensor interface: operation stop()
-PASS Unscopable handled correctly for stop() on Sensor
-PASS Sensor interface: attribute onreading
-PASS Unscopable handled correctly for onreading property on Sensor
-PASS Sensor interface: attribute onactivate
-PASS Unscopable handled correctly for onactivate property on Sensor
-PASS Sensor interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on Sensor
-PASS Magnetometer interface: existence and properties of interface object
-PASS Magnetometer interface object length
-PASS Magnetometer interface object name
-PASS Magnetometer interface: existence and properties of interface prototype object
-PASS Magnetometer interface: existence and properties of interface prototype object's "constructor" property
-PASS Magnetometer interface: existence and properties of interface prototype object's @@unscopables property
-PASS Magnetometer interface: attribute x
-PASS Unscopable handled correctly for x property on Magnetometer
-PASS Magnetometer interface: attribute y
-PASS Unscopable handled correctly for y property on Magnetometer
-PASS Magnetometer interface: attribute z
-PASS Unscopable handled correctly for z property on Magnetometer
-PASS Magnetometer must be primary interface of new Magnetometer();
-PASS Stringification of new Magnetometer();
-PASS Magnetometer interface: new Magnetometer(); must inherit property "x" with the proper type
-PASS Magnetometer interface: new Magnetometer(); must inherit property "y" with the proper type
-PASS Magnetometer interface: new Magnetometer(); must inherit property "z" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "activated" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "hasReading" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "timestamp" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "start()" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "stop()" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "onreading" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "onactivate" with the proper type
-PASS Sensor interface: new Magnetometer(); must inherit property "onerror" with the proper type
-FAIL UncalibratedMagnetometer interface: existence and properties of interface object assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-FAIL UncalibratedMagnetometer interface object length assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-FAIL UncalibratedMagnetometer interface object name assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-FAIL UncalibratedMagnetometer interface: existence and properties of interface prototype object assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-FAIL UncalibratedMagnetometer interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-FAIL UncalibratedMagnetometer interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-FAIL UncalibratedMagnetometer interface: attribute x assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-PASS Unscopable handled correctly for x property on UncalibratedMagnetometer
-FAIL UncalibratedMagnetometer interface: attribute y assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-PASS Unscopable handled correctly for y property on UncalibratedMagnetometer
-FAIL UncalibratedMagnetometer interface: attribute z assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-PASS Unscopable handled correctly for z property on UncalibratedMagnetometer
-FAIL UncalibratedMagnetometer interface: attribute xBias assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-PASS Unscopable handled correctly for xBias property on UncalibratedMagnetometer
-FAIL UncalibratedMagnetometer interface: attribute yBias assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-PASS Unscopable handled correctly for yBias property on UncalibratedMagnetometer
-FAIL UncalibratedMagnetometer interface: attribute zBias assert_own_property: self does not have own property "UncalibratedMagnetometer" expected property "UncalibratedMagnetometer" missing
-PASS Unscopable handled correctly for zBias property on UncalibratedMagnetometer
-FAIL UncalibratedMagnetometer must be primary interface of new UncalibratedMagnetometer(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Stringification of new UncalibratedMagnetometer(); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "x" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "y" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "z" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "xBias" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "yBias" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL UncalibratedMagnetometer interface: new UncalibratedMagnetometer(); must inherit property "zBias" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "activated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "hasReading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "timestamp" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "start()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "stop()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "onreading" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "onactivate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
-FAIL Sensor interface: new UncalibratedMagnetometer(); must inherit property "onerror" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: UncalibratedMagnetometer is not defined"
+FAIL Test IDL implementation of Magnetometer Sensor promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt
index cfb7068..a049e00 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt
@@ -1,83 +1,4 @@
 This is a testharness.js-based test.
-Found 79 tests; 72 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS MediaRecorder interface: existence and properties of interface object
-PASS MediaRecorder interface object length
-PASS MediaRecorder interface object name
-PASS MediaRecorder interface: existence and properties of interface prototype object
-PASS MediaRecorder interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaRecorder interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaRecorder interface: attribute stream
-PASS Unscopable handled correctly for stream property on MediaRecorder
-PASS MediaRecorder interface: attribute mimeType
-PASS Unscopable handled correctly for mimeType property on MediaRecorder
-PASS MediaRecorder interface: attribute state
-PASS Unscopable handled correctly for state property on MediaRecorder
-PASS MediaRecorder interface: attribute onstart
-PASS Unscopable handled correctly for onstart property on MediaRecorder
-PASS MediaRecorder interface: attribute onstop
-PASS Unscopable handled correctly for onstop property on MediaRecorder
-PASS MediaRecorder interface: attribute ondataavailable
-PASS Unscopable handled correctly for ondataavailable property on MediaRecorder
-PASS MediaRecorder interface: attribute onpause
-PASS Unscopable handled correctly for onpause property on MediaRecorder
-PASS MediaRecorder interface: attribute onresume
-PASS Unscopable handled correctly for onresume property on MediaRecorder
-PASS MediaRecorder interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on MediaRecorder
-PASS MediaRecorder interface: attribute videoBitsPerSecond
-PASS Unscopable handled correctly for videoBitsPerSecond property on MediaRecorder
-PASS MediaRecorder interface: attribute audioBitsPerSecond
-PASS Unscopable handled correctly for audioBitsPerSecond property on MediaRecorder
-PASS MediaRecorder interface: operation start(long)
-PASS Unscopable handled correctly for start(long) on MediaRecorder
-PASS MediaRecorder interface: operation stop()
-PASS Unscopable handled correctly for stop() on MediaRecorder
-PASS MediaRecorder interface: operation pause()
-PASS Unscopable handled correctly for pause() on MediaRecorder
-PASS MediaRecorder interface: operation resume()
-PASS Unscopable handled correctly for resume() on MediaRecorder
-PASS MediaRecorder interface: operation requestData()
-PASS Unscopable handled correctly for requestData() on MediaRecorder
-PASS MediaRecorder interface: operation isTypeSupported(DOMString)
-PASS Unscopable handled correctly for isTypeSupported(DOMString) on MediaRecorder
-PASS MediaRecorder must be primary interface of [object MediaRecorder]
-PASS Stringification of [object MediaRecorder]
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stream" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "mimeType" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "state" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstart" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstop" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "ondataavailable" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onpause" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onresume" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onerror" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "videoBitsPerSecond" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "audioBitsPerSecond" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "start(long)" with the proper type
-PASS MediaRecorder interface: calling start(long) on [object MediaRecorder] with too few arguments must throw TypeError
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stop()" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "pause()" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "resume()" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "requestData()" with the proper type
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "isTypeSupported(DOMString)" with the proper type
-PASS MediaRecorder interface: calling isTypeSupported(DOMString) on [object MediaRecorder] with too few arguments must throw TypeError
-PASS BlobEvent interface: existence and properties of interface object
-PASS BlobEvent interface object length
-PASS BlobEvent interface object name
-PASS BlobEvent interface: existence and properties of interface prototype object
-PASS BlobEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS BlobEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS BlobEvent interface: attribute data
-PASS Unscopable handled correctly for data property on BlobEvent
-PASS BlobEvent interface: attribute timecode
-PASS Unscopable handled correctly for timecode property on BlobEvent
-FAIL MediaRecorderErrorEvent interface: existence and properties of interface object assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing
-FAIL MediaRecorderErrorEvent interface object length assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing
-FAIL MediaRecorderErrorEvent interface object name assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing
-FAIL MediaRecorderErrorEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing
-FAIL MediaRecorderErrorEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing
-FAIL MediaRecorderErrorEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing
-FAIL MediaRecorderErrorEvent interface: attribute error assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing
-PASS Unscopable handled correctly for error property on MediaRecorderErrorEvent
+FAIL Media Recorder IDL test Uncaught MediaRecorderErrorEventInit inherits EventInit, but MediaRecorderErrorEventInit is not an interface.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt
index a882132..37e0e3e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt
@@ -1,138 +1,4 @@
 This is a testharness.js-based test.
-Found 134 tests; 126 PASS, 8 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Test MediaDevices.enumerateDevices call and result. Types only.
-PASS Navigator interface: attribute mediaDevices
-PASS Unscopable handled correctly for mediaDevices property on Navigator
-PASS Navigator interface: operation getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback)
-PASS Unscopable handled correctly for getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) on Navigator
-PASS MediaStream interface: existence and properties of interface object
-PASS MediaStream interface object length
-PASS MediaStream interface object name
-PASS MediaStream interface: existence and properties of interface prototype object
-PASS MediaStream interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStream interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStream interface: attribute id
-PASS Unscopable handled correctly for id property on MediaStream
-PASS MediaStream interface: operation getAudioTracks()
-PASS Unscopable handled correctly for getAudioTracks() on MediaStream
-PASS MediaStream interface: operation getVideoTracks()
-PASS Unscopable handled correctly for getVideoTracks() on MediaStream
-PASS MediaStream interface: operation getTracks()
-PASS Unscopable handled correctly for getTracks() on MediaStream
-PASS MediaStream interface: operation getTrackById(DOMString)
-PASS Unscopable handled correctly for getTrackById(DOMString) on MediaStream
-PASS MediaStream interface: operation addTrack(MediaStreamTrack)
-PASS Unscopable handled correctly for addTrack(MediaStreamTrack) on MediaStream
-PASS MediaStream interface: operation removeTrack(MediaStreamTrack)
-PASS Unscopable handled correctly for removeTrack(MediaStreamTrack) on MediaStream
-PASS MediaStream interface: operation clone()
-PASS Unscopable handled correctly for clone() on MediaStream
-PASS MediaStream interface: attribute active
-PASS Unscopable handled correctly for active property on MediaStream
-PASS MediaStream interface: attribute onaddtrack
-PASS Unscopable handled correctly for onaddtrack property on MediaStream
-PASS MediaStream interface: attribute onremovetrack
-PASS Unscopable handled correctly for onremovetrack property on MediaStream
-PASS MediaStreamTrack interface: existence and properties of interface object
-PASS MediaStreamTrack interface object length
-PASS MediaStreamTrack interface object name
-PASS MediaStreamTrack interface: existence and properties of interface prototype object
-PASS MediaStreamTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStreamTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStreamTrack interface: attribute kind
-PASS Unscopable handled correctly for kind property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute id
-PASS Unscopable handled correctly for id property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute label
-PASS Unscopable handled correctly for label property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute enabled
-PASS Unscopable handled correctly for enabled property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute muted
-PASS Unscopable handled correctly for muted property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onmute
-PASS Unscopable handled correctly for onmute property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onunmute
-PASS Unscopable handled correctly for onunmute property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onended
-PASS Unscopable handled correctly for onended property on MediaStreamTrack
-PASS MediaStreamTrack interface: operation clone()
-PASS Unscopable handled correctly for clone() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation stop()
-PASS Unscopable handled correctly for stop() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getCapabilities()
-PASS Unscopable handled correctly for getCapabilities() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getConstraints()
-PASS Unscopable handled correctly for getConstraints() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getSettings()
-PASS Unscopable handled correctly for getSettings() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation applyConstraints(MediaTrackConstraints)
-PASS Unscopable handled correctly for applyConstraints(MediaTrackConstraints) on MediaStreamTrack
-FAIL MediaStreamTrack interface: attribute onoverconstrained assert_true: The prototype object must have a property "onoverconstrained" expected true got false
-PASS Unscopable handled correctly for onoverconstrained property on MediaStreamTrack
-PASS MediaStreamTrackEvent interface: existence and properties of interface object
-PASS MediaStreamTrackEvent interface object length
-PASS MediaStreamTrackEvent interface object name
-PASS MediaStreamTrackEvent interface: existence and properties of interface prototype object
-PASS MediaStreamTrackEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStreamTrackEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStreamTrackEvent interface: attribute track
-PASS Unscopable handled correctly for track property on MediaStreamTrackEvent
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface object assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface object length assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface object name assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: attribute error assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-PASS Unscopable handled correctly for error property on OverconstrainedErrorEvent
-PASS MediaDevices interface: existence and properties of interface object
-PASS MediaDevices interface object length
-PASS MediaDevices interface object name
-PASS MediaDevices interface: existence and properties of interface prototype object
-PASS MediaDevices interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaDevices interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaDevices interface: attribute ondevicechange
-PASS Unscopable handled correctly for ondevicechange property on MediaDevices
-PASS MediaDevices interface: operation enumerateDevices()
-PASS Unscopable handled correctly for enumerateDevices() on MediaDevices
-PASS MediaDevices interface: operation getSupportedConstraints()
-PASS Unscopable handled correctly for getSupportedConstraints() on MediaDevices
-PASS MediaDevices interface: operation getUserMedia(MediaStreamConstraints)
-PASS Unscopable handled correctly for getUserMedia(MediaStreamConstraints) on MediaDevices
-PASS MediaDeviceInfo interface: existence and properties of interface object
-PASS MediaDeviceInfo interface object length
-PASS MediaDeviceInfo interface object name
-PASS MediaDeviceInfo interface: existence and properties of interface prototype object
-PASS MediaDeviceInfo interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaDeviceInfo interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaDeviceInfo interface: attribute deviceId
-PASS Unscopable handled correctly for deviceId property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: attribute kind
-PASS Unscopable handled correctly for kind property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: attribute label
-PASS Unscopable handled correctly for label property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: attribute groupId
-PASS Unscopable handled correctly for groupId property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: operation toJSON()
-PASS Unscopable handled correctly for toJSON() on MediaDeviceInfo
-PASS InputDeviceInfo interface: existence and properties of interface object
-PASS InputDeviceInfo interface object length
-PASS InputDeviceInfo interface object name
-PASS InputDeviceInfo interface: existence and properties of interface prototype object
-PASS InputDeviceInfo interface: existence and properties of interface prototype object's "constructor" property
-PASS InputDeviceInfo interface: existence and properties of interface prototype object's @@unscopables property
-PASS InputDeviceInfo interface: operation getCapabilities()
-PASS Unscopable handled correctly for getCapabilities() on InputDeviceInfo
-PASS InputDeviceInfo must be primary interface of [object InputDeviceInfo]
-PASS Stringification of [object InputDeviceInfo]
-PASS InputDeviceInfo interface: [object InputDeviceInfo] must inherit property "getCapabilities()" with the proper type
-PASS MediaDeviceInfo interface: [object InputDeviceInfo] must inherit property "deviceId" with the proper type
-PASS MediaDeviceInfo interface: [object InputDeviceInfo] must inherit property "kind" with the proper type
-PASS MediaDeviceInfo interface: [object InputDeviceInfo] must inherit property "label" with the proper type
-PASS MediaDeviceInfo interface: [object InputDeviceInfo] must inherit property "groupId" with the proper type
-PASS MediaDeviceInfo interface: [object InputDeviceInfo] must inherit property "toJSON()" with the proper type
-PASS Test default toJSON operation of InputDeviceInfo
+FAIL Test MediaDevices.enumerateDevices call and result. Types only. promise_test: Unhandled rejection with value: object "MediaTrackConstraints inherits MediaTrackConstraintSet, but MediaTrackConstraints is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt
index 2851111..cf7fcfb 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt
@@ -1,31 +1,4 @@
 This is a testharness.js-based test.
-PASS PerformanceNavigationTiming interface: existence and properties of interface object
-PASS PerformanceNavigationTiming interface object length
-PASS PerformanceNavigationTiming interface object name
-FAIL PerformanceNavigationTiming interface: existence and properties of interface prototype object Cannot read property 'has_stringifier' of undefined
-PASS PerformanceNavigationTiming interface: existence and properties of interface prototype object's "constructor" property
-PASS PerformanceNavigationTiming interface: existence and properties of interface prototype object's @@unscopables property
-PASS PerformanceNavigationTiming interface: attribute unloadEventStart
-PASS Unscopable handled correctly for unloadEventStart property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute unloadEventEnd
-PASS Unscopable handled correctly for unloadEventEnd property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute domInteractive
-PASS Unscopable handled correctly for domInteractive property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute domContentLoadedEventStart
-PASS Unscopable handled correctly for domContentLoadedEventStart property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute domContentLoadedEventEnd
-PASS Unscopable handled correctly for domContentLoadedEventEnd property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute domComplete
-PASS Unscopable handled correctly for domComplete property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute loadEventStart
-PASS Unscopable handled correctly for loadEventStart property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute loadEventEnd
-PASS Unscopable handled correctly for loadEventEnd property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute type
-PASS Unscopable handled correctly for type property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: attribute redirectCount
-PASS Unscopable handled correctly for redirectCount property on PerformanceNavigationTiming
-PASS PerformanceNavigationTiming interface: operation toJSON()
-PASS Unscopable handled correctly for toJSON() on PerformanceNavigationTiming
+FAIL Navigation Timing 2 IDL tests Uncaught PerformanceResourceTiming inherits PerformanceEntry, but PerformanceEntry is undefined.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt
index 31e9ba4..1a0f52d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt
@@ -1,47 +1,4 @@
 This is a testharness.js-based test.
-FAIL Window interface: attribute ondeviceorientation assert_true: The prototype object must have a property "ondeviceorientation" expected true got false
-PASS Unscopable handled correctly for ondeviceorientation property on Window
-FAIL Window interface: attribute ondevicemotion assert_true: The prototype object must have a property "ondevicemotion" expected true got false
-PASS Unscopable handled correctly for ondevicemotion property on Window
-PASS DeviceOrientationEvent interface: existence and properties of interface object
-PASS DeviceOrientationEvent interface object length
-PASS DeviceOrientationEvent interface object name
-PASS DeviceOrientationEvent interface: existence and properties of interface prototype object
-PASS DeviceOrientationEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS DeviceOrientationEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS DeviceOrientationEvent interface: attribute alpha
-PASS Unscopable handled correctly for alpha property on DeviceOrientationEvent
-PASS DeviceOrientationEvent interface: attribute beta
-PASS Unscopable handled correctly for beta property on DeviceOrientationEvent
-PASS DeviceOrientationEvent interface: attribute gamma
-PASS Unscopable handled correctly for gamma property on DeviceOrientationEvent
-PASS DeviceOrientationEvent interface: attribute absolute
-PASS Unscopable handled correctly for absolute property on DeviceOrientationEvent
-PASS DeviceOrientationEvent must be primary interface of new DeviceOrientationEvent("foo")
-PASS Stringification of new DeviceOrientationEvent("foo")
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "alpha" with the proper type
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "beta" with the proper type
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "gamma" with the proper type
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "absolute" with the proper type
-PASS DeviceMotionEvent interface: existence and properties of interface object
-PASS DeviceMotionEvent interface object length
-PASS DeviceMotionEvent interface object name
-PASS DeviceMotionEvent interface: existence and properties of interface prototype object
-PASS DeviceMotionEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS DeviceMotionEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS DeviceMotionEvent interface: attribute acceleration
-PASS Unscopable handled correctly for acceleration property on DeviceMotionEvent
-PASS DeviceMotionEvent interface: attribute accelerationIncludingGravity
-PASS Unscopable handled correctly for accelerationIncludingGravity property on DeviceMotionEvent
-PASS DeviceMotionEvent interface: attribute rotationRate
-PASS Unscopable handled correctly for rotationRate property on DeviceMotionEvent
-PASS DeviceMotionEvent interface: attribute interval
-PASS Unscopable handled correctly for interval property on DeviceMotionEvent
-PASS DeviceMotionEvent must be primary interface of new DeviceMotionEvent("foo")
-PASS Stringification of new DeviceMotionEvent("foo")
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "acceleration" with the proper type
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "accelerationIncludingGravity" with the proper type
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "rotationRate" with the proper type
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "interval" with the proper type
+FAIL DeviceOrientation Event IDL tests Uncaught DeviceOrientationEventInit inherits EventInit, but DeviceOrientationEventInit is not an interface.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/orientation-sensor/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/orientation-sensor/idlharness.https-expected.txt
new file mode 100644
index 0000000..0953597e8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/orientation-sensor/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test IDL implementation of Orientation Sensor promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any.worker-expected.txt
index 572c566..81630dd 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any.worker-expected.txt
@@ -1,33 +1,4 @@
 This is a testharness.js-based test.
-PASS Payment handler interfaces.
-FAIL PaymentManager interface: existence and properties of interface object assert_own_property: self does not have own property "PaymentManager" expected property "PaymentManager" missing
-FAIL PaymentManager interface object length assert_own_property: self does not have own property "PaymentManager" expected property "PaymentManager" missing
-FAIL PaymentManager interface object name assert_own_property: self does not have own property "PaymentManager" expected property "PaymentManager" missing
-FAIL PaymentManager interface: existence and properties of interface prototype object assert_own_property: self does not have own property "PaymentManager" expected property "PaymentManager" missing
-FAIL PaymentManager interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "PaymentManager" expected property "PaymentManager" missing
-FAIL PaymentManager interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "PaymentManager" expected property "PaymentManager" missing
-FAIL PaymentManager interface: attribute instruments assert_own_property: self does not have own property "PaymentManager" expected property "PaymentManager" missing
-PASS Unscopable handled correctly for instruments property on PaymentManager
-FAIL PaymentManager interface: member requestPermission Cannot use 'in' operator to search for 'requestPermission' in undefined
-PASS PaymentInstruments interface: existence and properties of interface object
-PASS PaymentInstruments interface object length
-PASS PaymentInstruments interface object name
-PASS PaymentInstruments interface: existence and properties of interface prototype object
-PASS PaymentInstruments interface: existence and properties of interface prototype object's "constructor" property
-PASS PaymentInstruments interface: existence and properties of interface prototype object's @@unscopables property
-PASS PaymentInstruments interface: operation delete(DOMString)
-PASS Unscopable handled correctly for delete(DOMString) on PaymentInstruments
-PASS PaymentInstruments interface: operation get(DOMString)
-PASS Unscopable handled correctly for get(DOMString) on PaymentInstruments
-PASS PaymentInstruments interface: operation keys()
-PASS Unscopable handled correctly for keys() on PaymentInstruments
-PASS PaymentInstruments interface: operation has(DOMString)
-PASS Unscopable handled correctly for has(DOMString) on PaymentInstruments
-PASS PaymentInstruments interface: operation set(DOMString, PaymentInstrument)
-PASS Unscopable handled correctly for set(DOMString, PaymentInstrument) on PaymentInstruments
-PASS PaymentInstruments interface: operation clear()
-PASS Unscopable handled correctly for clear() on PaymentInstruments
-PASS CanMakePaymentEvent interface: existence and properties of interface object
-PASS PaymentRequestEvent interface: existence and properties of interface object
+FAIL Payment handler interfaces. promise_test: Unhandled rejection with value: object "CanMakePaymentEvent inherits ExtendableEvent, but ExtendableEvent is undefined."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt
new file mode 100644
index 0000000..0b23208
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Setup for Payment Request API IDL tests. promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-rejects-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-rejects-manual.https.html
index 20d8d2d..ab89d7e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-rejects-manual.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-rejects-manual.https.html
@@ -220,7 +220,7 @@
     });
     testBadUpdate(this.textContent, badDetails, new RangeError());
   ">
-  Updating with a displayItem with an invalid currency results in TypeError.
+  Updating with a displayItem with an invalid currency results in RangeError.
   </button></li>
 
   <li><button onclick="
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-resolves-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-resolves-manual.https.html
index 777910c..623db153 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-resolves-manual.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/show-method-optional-promise-resolves-manual.https.html
@@ -181,7 +181,7 @@
     const request = new PaymentRequest(validMethods, failDetails, options);
     const detailsPromise = Promise.resolve(details);
     const acceptPromise = request.show(detailsPromise);
-    assert_equals(request.id, "this cant be changed", "id must never change.");
+    assert_equals(request.id, "this cannot be changed", "id must never change.");
     await promise_rejects(
       t,
       "AbortError",
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/extension/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/extension/idlharness-expected.txt
new file mode 100644
index 0000000..f8ba2964
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/extension/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL idlharness test Uncaught PointerEventInit inherits MouseEventInit, but PointerEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness-expected.txt
new file mode 100644
index 0000000..f8ba2964
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL idlharness test Uncaught PointerEventInit inherits MouseEventInit, but PointerEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt
index 78ee28d..448093b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt
@@ -1,26 +1,4 @@
 This is a testharness.js-based test.
-PASS Element interface: operation requestPointerLock()
-PASS Unscopable handled correctly for requestPointerLock() on Element
-PASS Element interface: window.document.documentElement must inherit property "requestPointerLock()" with the proper type
-PASS Document interface: attribute onpointerlockchange
-PASS Unscopable handled correctly for onpointerlockchange property on Document
-PASS Document interface: attribute onpointerlockerror
-PASS Unscopable handled correctly for onpointerlockerror property on Document
-PASS Document interface: attribute pointerLockElement
-PASS Unscopable handled correctly for pointerLockElement property on Document
-PASS Document interface: operation exitPointerLock()
-PASS Unscopable handled correctly for exitPointerLock() on Document
-FAIL Document interface: window.document must inherit property "onpointerlockchange" with the proper type Unrecognized type EventHandler
-FAIL Document interface: window.document must inherit property "onpointerlockerror" with the proper type Unrecognized type EventHandler
-PASS Document interface: window.document must inherit property "pointerLockElement" with the proper type
-PASS Document interface: window.document must inherit property "exitPointerLock()" with the proper type
-PASS MouseEvent interface: attribute movementX
-PASS Unscopable handled correctly for movementX property on MouseEvent
-PASS MouseEvent interface: attribute movementY
-PASS Unscopable handled correctly for movementY property on MouseEvent
-PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementX" with the proper type
-PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementY" with the proper type
-PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementX" with the proper type
-PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementY" with the proper type
+FAIL Pointer Lock IDL tests Uncaught Partial dictionary MouseEventInit with no original dictionary
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/presentation-api/controlling-ua/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/presentation-api/controlling-ua/idlharness.https-expected.txt
new file mode 100644
index 0000000..8e49b7e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/presentation-api/controlling-ua/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Presentation API IDL tests for Controlling User Agent Uncaught PresentationConnectionAvailableEventInit inherits EventInit, but PresentationConnectionAvailableEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/remote-playback/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/remote-playback/idlharness-expected.txt
new file mode 100644
index 0000000..bee9d11
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/remote-playback/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "HTMLMediaElement inherits HTMLElement, but HTMLElement is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
index fee33fd1..0c459c9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
@@ -123,6 +123,28 @@
 })();
 //@}
 
+/// IdlHarnessError ///
+// Entry point
+self.IdlHarnessError = function(message)
+//@{
+{
+    /**
+     * Message to be printed as the error's toString invocation.
+     */
+    this.message = message;
+};
+
+IdlHarnessError.prototype = Object.create(Error.prototype);
+
+//@}
+IdlHarnessError.prototype.toString = function()
+//@{
+{
+    return this.message;
+};
+
+//@}
+
 /// IdlArray ///
 // Entry point
 self.IdlArray = function()
@@ -217,7 +239,7 @@
 
     if (options && options.only && options.except)
     {
-        throw "The only and except options can't be used together."
+        throw new IdlHarnessError("The only and except options can't be used together.");
     }
 
     function should_skip(name)
@@ -235,7 +257,7 @@
 
     parsed_idls.forEach(function(parsed_idl)
     {
-        if (parsed_idl.type == "interface" && parsed_idl.partial)
+        if (parsed_idl.partial && ["interface", "dictionary"].includes(parsed_idl.type))
         {
             if (should_skip(parsed_idl.name))
             {
@@ -280,7 +302,7 @@
         }
         if (parsed_idl.name in this.members)
         {
-            throw "Duplicate identifier " + parsed_idl.name;
+            throw new IdlHarnessError("Duplicate identifier " + parsed_idl.name);
         }
         switch(parsed_idl.type)
         {
@@ -374,7 +396,7 @@
         ret = ret.concat(this.recursively_get_implements(ret[i]));
         if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i]))
         {
-            throw "Circular implements statements involving " + ret[i];
+            throw new IdlHarnessError("Circular implements statements involving " + ret[i]);
         }
     }
     return ret;
@@ -404,7 +426,7 @@
         ret = ret.concat(this.recursively_get_includes(ret[i]));
         if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i]))
         {
-            throw "Circular includes statements involving " + ret[i];
+            throw new IdlHarnessError("Circular includes statements involving " + ret[i]);
         }
     }
     return ret;
@@ -533,7 +555,7 @@
 function exposure_set(object, default_set) {
     var exposed = object.extAttrs.filter(function(a) { return a.name == "Exposed" });
     if (exposed.length > 1 || exposed.length < 0) {
-        throw "Unexpected Exposed extended attributes on " + memberName + ": " + exposed;
+        throw new IdlHarnessError("Unexpected Exposed extended attributes on " + memberName + ": " + exposed);
     }
 
     if (exposed.length === 0) {
@@ -567,7 +589,34 @@
         return globals.indexOf("Worker") >= 0 ||
                globals.indexOf("ServiceWorker") >= 0;
     }
-    throw "Unexpected global object";
+    throw new IdlHarnessError("Unexpected global object");
+}
+
+//@}
+/**
+ * Asserts that the given error message is thrown for the given function.
+ * @param {string|IdlHarnessError} error Expected Error message.
+ * @param {Function} idlArrayFunc Function operating on an IdlArray that should throw.
+ */
+IdlArray.prototype.assert_throws = function(error, idlArrayFunc)
+//@{
+{
+    try {
+        idlArrayFunc.call(this, this);
+    } catch (e) {
+        if (e instanceof AssertionError) {
+            throw e;
+        }
+        // Assertions for behaviour of the idlharness.js engine.
+        if (error instanceof IdlHarnessError) {
+            error = error.message;
+        }
+        if (e.message !== error) {
+            throw new IdlHarnessError(`${idlArrayFunc} threw "${e}", not the expected IdlHarnessError "${error}"`);
+        }
+        return;
+    }
+    throw new IdlHarnessError(`${idlArrayFunc} did not throw the expected IdlHarnessError`);
 }
 
 //@}
@@ -581,9 +630,10 @@
     this.partials.forEach(function(parsed_idl)
     {
         if (!(parsed_idl.name in this.members)
-        || !(this.members[parsed_idl.name] instanceof IdlInterface))
+            || !(this.members[parsed_idl.name] instanceof IdlInterface
+                 || this.members[parsed_idl.name] instanceof IdlDictionary))
         {
-            throw "Partial interface " + parsed_idl.name + " with no original interface";
+            throw new IdlHarnessError(`Partial ${parsed_idl.type} ${parsed_idl.name} with no original ${parsed_idl.type}`);
         }
         if (parsed_idl.extAttrs)
         {
@@ -633,6 +683,16 @@
     }
     this["includes"] = {};
 
+    // Assert B defined for A : B
+    for (var member of Object.values(this.members).filter(m => m.base)) {
+        let lhs = member.name;
+        let rhs = member.base;
+        if (!(lhs in this.members)) throw new IdlHarnessError(`${lhs} inherits ${rhs}, but ${lhs} is undefined.`);
+        if (!(this.members[lhs] instanceof IdlInterface)) throw new IdlHarnessError(`${lhs} inherits ${rhs}, but ${lhs} is not an interface.`);
+        if (!(rhs in this.members)) throw new IdlHarnessError(`${lhs} inherits ${rhs}, but ${rhs} is undefined.`);
+        if (!(this.members[rhs] instanceof IdlInterface)) throw new IdlHarnessError(`${lhs} inherits ${rhs}, but ${rhs} is not an interface.`);
+    }
+
     Object.getOwnPropertyNames(this.members).forEach(function(memberName) {
         var member = this.members[memberName];
         if (!(member instanceof IdlInterface)) {
@@ -848,7 +908,7 @@
 
     if (!(type in this.members))
     {
-        throw "Unrecognized type " + type;
+        throw new IdlHarnessError("Unrecognized type " + type);
     }
 
     if (this.members[type] instanceof IdlInterface)
@@ -876,7 +936,7 @@
     }
     else
     {
-        throw "Type " + type + " isn't an interface or dictionary";
+        throw new IdlHarnessError("Type " + type + " isn't an interface or dictionary");
     }
 };
 //@}
@@ -1345,13 +1405,13 @@
         {
             var aliasAttrs = this.extAttrs.filter(function(o) { return o.name === "LegacyWindowAlias"; });
             if (aliasAttrs.length > 1) {
-                throw "Invalid IDL: multiple LegacyWindowAlias extended attributes on " + this.name;
+                throw new IdlHarnessError("Invalid IDL: multiple LegacyWindowAlias extended attributes on " + this.name);
             }
             if (this.is_callback()) {
-                throw "Invalid IDL: LegacyWindowAlias extended attribute on non-interface " + this.name;
+                throw new IdlHarnessError("Invalid IDL: LegacyWindowAlias extended attribute on non-interface " + this.name);
             }
             if (this.exposureSet.indexOf("Window") === -1) {
-                throw "Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " which is not exposed in Window";
+                throw new IdlHarnessError("Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " which is not exposed in Window");
             }
             // TODO: when testing of [NoInterfaceObject] interfaces is supported,
             // check that it's not specified together with LegacyWindowAlias.
@@ -1360,7 +1420,7 @@
 
             var rhs = aliasAttrs[0].rhs;
             if (!rhs) {
-                throw "Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " without identifier";
+                throw new IdlHarnessError("Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " without identifier");
             }
             var aliases;
             if (rhs.type === "identifier-list") {
@@ -1733,7 +1793,7 @@
 //@{
 {
     if (!this.has_constants()) {
-        throw "Internal error: test_member_const called without any constants";
+        throw new IdlHarnessError("Internal error: test_member_const called without any constants");
     }
 
     test(function()
@@ -2289,7 +2349,7 @@
     {
         if (!(current_interface.name in this.array.members))
         {
-            throw "Interface " + current_interface.name + " not found (inherited by " + this.name + ")";
+            throw new IdlHarnessError("Interface " + current_interface.name + " not found (inherited by " + this.name + ")");
         }
         if (current_interface.prevent_multiple_testing && current_interface.already_tested)
         {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js
index 23b8651..86ecc1b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js
@@ -1247,6 +1247,13 @@
     }
     expose(assert_readonly, "assert_readonly");
 
+    /**
+     * Assert an Exception with the expected code is thrown.
+     *
+     * @param {object|number|string} code The expected exception code.
+     * @param {Function} func Function which should throw.
+     * @param {string} description Error description for the case that the error is not thrown.
+     */
     function assert_throws(code, func, description)
     {
         try {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/screen-orientation/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/screen-orientation/interfaces-expected.txt
new file mode 100644
index 0000000..87a7cf6f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/screen-orientation/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test IDL implementation of Screen Orientation API promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt
index db256ea..bc6c479 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/interfaces-expected.txt
@@ -1,107 +1,4 @@
 This is a testharness.js-based test.
-Found 103 tests; 99 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Test driver
-PASS Document interface: operation getSelection()
-PASS Unscopable handled correctly for getSelection() on Document
-PASS Document interface: attribute onselectstart
-PASS Unscopable handled correctly for onselectstart property on Document
-PASS Document interface: attribute onselectionchange
-PASS Unscopable handled correctly for onselectionchange property on Document
-FAIL HTMLElement interface: attribute onselectstart assert_own_property: expected property "onselectstart" missing
-PASS Unscopable handled correctly for onselectstart property on HTMLElement
-FAIL HTMLElement interface: attribute onselectionchange assert_true: The prototype object must have a property "onselectionchange" expected true got false
-PASS Unscopable handled correctly for onselectionchange property on HTMLElement
-PASS Window interface: operation getSelection()
-PASS Unscopable handled correctly for getSelection() on Window
-FAIL Window interface: attribute onselectstart assert_own_property: The global object must have a property "onselectstart" expected property "onselectstart" missing
-PASS Unscopable handled correctly for onselectstart property on Window
-FAIL Window interface: attribute onselectionchange assert_own_property: The global object must have a property "onselectionchange" expected property "onselectionchange" missing
-PASS Unscopable handled correctly for onselectionchange property on Window
-PASS WorkerGlobalScope interface: existence and properties of interface object
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
-PASS SharedWorkerGlobalScope interface: existence and properties of interface object
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS WorkerLocation interface: existence and properties of interface object
-PASS Selection interface: existence and properties of interface object
-PASS Selection interface object length
-PASS Selection interface object name
-PASS Selection interface: existence and properties of interface prototype object
-PASS Selection interface: existence and properties of interface prototype object's "constructor" property
-PASS Selection interface: existence and properties of interface prototype object's @@unscopables property
-PASS Selection interface: attribute anchorNode
-PASS Unscopable handled correctly for anchorNode property on Selection
-PASS Selection interface: attribute anchorOffset
-PASS Unscopable handled correctly for anchorOffset property on Selection
-PASS Selection interface: attribute focusNode
-PASS Unscopable handled correctly for focusNode property on Selection
-PASS Selection interface: attribute focusOffset
-PASS Unscopable handled correctly for focusOffset property on Selection
-PASS Selection interface: attribute isCollapsed
-PASS Unscopable handled correctly for isCollapsed property on Selection
-PASS Selection interface: attribute rangeCount
-PASS Unscopable handled correctly for rangeCount property on Selection
-PASS Selection interface: attribute type
-PASS Unscopable handled correctly for type property on Selection
-PASS Selection interface: operation getRangeAt(unsigned long)
-PASS Unscopable handled correctly for getRangeAt(unsigned long) on Selection
-PASS Selection interface: operation addRange(Range)
-PASS Unscopable handled correctly for addRange(Range) on Selection
-PASS Selection interface: operation removeRange(Range)
-PASS Unscopable handled correctly for removeRange(Range) on Selection
-PASS Selection interface: operation removeAllRanges()
-PASS Unscopable handled correctly for removeAllRanges() on Selection
-PASS Selection interface: operation empty()
-PASS Unscopable handled correctly for empty() on Selection
-PASS Selection interface: operation collapse(Node, unsigned long)
-PASS Unscopable handled correctly for collapse(Node, unsigned long) on Selection
-PASS Selection interface: operation setPosition(Node, unsigned long)
-PASS Unscopable handled correctly for setPosition(Node, unsigned long) on Selection
-PASS Selection interface: operation collapseToStart()
-PASS Unscopable handled correctly for collapseToStart() on Selection
-PASS Selection interface: operation collapseToEnd()
-PASS Unscopable handled correctly for collapseToEnd() on Selection
-PASS Selection interface: operation extend(Node, unsigned long)
-PASS Unscopable handled correctly for extend(Node, unsigned long) on Selection
-PASS Selection interface: operation setBaseAndExtent(Node, unsigned long, Node, unsigned long)
-PASS Unscopable handled correctly for setBaseAndExtent(Node, unsigned long, Node, unsigned long) on Selection
-PASS Selection interface: operation selectAllChildren(Node)
-PASS Unscopable handled correctly for selectAllChildren(Node) on Selection
-PASS Selection interface: operation deleteFromDocument()
-PASS Unscopable handled correctly for deleteFromDocument() on Selection
-PASS Selection interface: operation containsNode(Node, boolean)
-PASS Unscopable handled correctly for containsNode(Node, boolean) on Selection
-PASS Selection interface: stringifier
-PASS Selection must be primary interface of getSelection()
-PASS Stringification of getSelection()
-PASS Selection interface: getSelection() must inherit property "anchorNode" with the proper type
-PASS Selection interface: getSelection() must inherit property "anchorOffset" with the proper type
-PASS Selection interface: getSelection() must inherit property "focusNode" with the proper type
-PASS Selection interface: getSelection() must inherit property "focusOffset" with the proper type
-PASS Selection interface: getSelection() must inherit property "isCollapsed" with the proper type
-PASS Selection interface: getSelection() must inherit property "rangeCount" with the proper type
-PASS Selection interface: getSelection() must inherit property "type" with the proper type
-PASS Selection interface: getSelection() must inherit property "getRangeAt(unsigned long)" with the proper type
-PASS Selection interface: calling getRangeAt(unsigned long) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "addRange(Range)" with the proper type
-PASS Selection interface: calling addRange(Range) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "removeRange(Range)" with the proper type
-PASS Selection interface: calling removeRange(Range) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "removeAllRanges()" with the proper type
-PASS Selection interface: getSelection() must inherit property "empty()" with the proper type
-PASS Selection interface: getSelection() must inherit property "collapse(Node, unsigned long)" with the proper type
-PASS Selection interface: calling collapse(Node, unsigned long) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "setPosition(Node, unsigned long)" with the proper type
-PASS Selection interface: calling setPosition(Node, unsigned long) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "collapseToStart()" with the proper type
-PASS Selection interface: getSelection() must inherit property "collapseToEnd()" with the proper type
-PASS Selection interface: getSelection() must inherit property "extend(Node, unsigned long)" with the proper type
-PASS Selection interface: calling extend(Node, unsigned long) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "setBaseAndExtent(Node, unsigned long, Node, unsigned long)" with the proper type
-PASS Selection interface: calling setBaseAndExtent(Node, unsigned long, Node, unsigned long) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "selectAllChildren(Node)" with the proper type
-PASS Selection interface: calling selectAllChildren(Node) on getSelection() with too few arguments must throw TypeError
-PASS Selection interface: getSelection() must inherit property "deleteFromDocument()" with the proper type
-PASS Selection interface: getSelection() must inherit property "containsNode(Node, boolean)" with the proper type
-PASS Selection interface: calling containsNode(Node, boolean) on getSelection() with too few arguments must throw TypeError
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt
index 8a9c737..aacfaa7 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt
@@ -1,6 +1,7 @@
 This is a testharness.js-based test.
 PASS Service Worker headers in the request of a fetch event
 PASS Service Worker responds to fetch event with string
+PASS Service Worker responds to fetch event using request fragment with string
 PASS Service Worker responds to fetch event with blob body
 PASS Service Worker responds to fetch event with the referrer URL
 PASS Service Worker responds to fetch event with an existing client id
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https.html
index 9fef304..12b09321 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-event.https.html
@@ -59,6 +59,30 @@
   }, 'Service Worker responds to fetch event with string');
 
 async_test(function(t) {
+    var scope = 'resources/simple.html?string';
+    var frame;
+    service_worker_unregister_and_register(t, worker, scope)
+      .then(function(reg) {
+          return wait_for_state(t, reg.installing, 'activated');
+        })
+      .then(function() { return with_iframe(scope) })
+      .then(function(f) {
+        frame = f;
+        return frame.contentWindow.fetch(scope + "#foo")
+      })
+      .then(function(response) { return response.text() })
+      .then(function(text) {
+          assert_equals(
+            text,
+            'Test string',
+            'Service Worker should respond to fetch with a test string');
+          frame.remove();
+          return service_worker_unregister_and_done(t, scope);
+        })
+      .catch(unreached_rejection(t));
+  }, 'Service Worker responds to fetch event using request fragment with string');
+
+async_test(function(t) {
     var scope = 'resources/simple.html?blob';
     service_worker_unregister_and_register(t, worker, scope)
       .then(function(reg) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/uievents/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/uievents/interfaces-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/uievents/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationPlaybackEvent/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationPlaybackEvent/idlharness-expected.txt
new file mode 100644
index 0000000..a4ea3fc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationPlaybackEvent/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL AnimationPlaybackEvent interface. promise_test: Unhandled rejection with value: object "AnimationPlaybackEventInit inherits EventInit, but AnimationPlaybackEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt
index ff09919..c7055c86 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt
@@ -1,28 +1,4 @@
 This is a testharness.js-based test.
-PASS KeyframeEffect interface.
-PASS KeyframeEffect interface: existence and properties of interface object
-PASS KeyframeEffect interface object length
-PASS KeyframeEffect interface object name
-PASS KeyframeEffect interface: existence and properties of interface prototype object
-PASS KeyframeEffect interface: existence and properties of interface prototype object's "constructor" property
-PASS KeyframeEffect interface: existence and properties of interface prototype object's @@unscopables property
-FAIL KeyframeEffect interface: attribute target assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
-PASS Unscopable handled correctly for target property on KeyframeEffect
-FAIL KeyframeEffect interface: attribute iterationComposite assert_true: The prototype object must have a property "iterationComposite" expected true got false
-PASS Unscopable handled correctly for iterationComposite property on KeyframeEffect
-PASS KeyframeEffect interface: attribute composite
-PASS Unscopable handled correctly for composite property on KeyframeEffect
-PASS KeyframeEffect interface: operation getKeyframes()
-PASS Unscopable handled correctly for getKeyframes() on KeyframeEffect
-PASS KeyframeEffect interface: operation setKeyframes(object)
-PASS Unscopable handled correctly for setKeyframes(object) on KeyframeEffect
-PASS KeyframeEffect must be primary interface of new KeyframeEffect(null, null)
-PASS Stringification of new KeyframeEffect(null, null)
-PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "target" with the proper type
-FAIL KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "iterationComposite" with the proper type assert_inherits: property "iterationComposite" not found in prototype chain
-PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "composite" with the proper type
-PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "getKeyframes()" with the proper type
-PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "setKeyframes(object)" with the proper type
-PASS KeyframeEffect interface: calling setKeyframes(object) on new KeyframeEffect(null, null) with too few arguments must throw TypeError
+FAIL KeyframeEffect interface. promise_test: Unhandled rejection with value: object "ComputedEffectTiming inherits EffectTiming, but ComputedEffectTiming is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt
index 18ece05..a4d96d9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt
@@ -1,1284 +1,4 @@
 This is a testharness.js-based test.
-PASS Test driver
-PASS WorkerGlobalScope interface: existence and properties of interface object
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
-PASS SharedWorkerGlobalScope interface: existence and properties of interface object
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS WorkerLocation interface: existence and properties of interface object
-PASS BaseAudioContext interface: existence and properties of interface object
-PASS BaseAudioContext interface object length
-PASS BaseAudioContext interface object name
-PASS BaseAudioContext interface: existence and properties of interface prototype object
-PASS BaseAudioContext interface: existence and properties of interface prototype object's "constructor" property
-PASS BaseAudioContext interface: existence and properties of interface prototype object's @@unscopables property
-PASS BaseAudioContext interface: attribute destination
-PASS Unscopable handled correctly for destination property on BaseAudioContext
-PASS BaseAudioContext interface: attribute sampleRate
-PASS Unscopable handled correctly for sampleRate property on BaseAudioContext
-PASS BaseAudioContext interface: attribute currentTime
-PASS Unscopable handled correctly for currentTime property on BaseAudioContext
-PASS BaseAudioContext interface: attribute listener
-PASS Unscopable handled correctly for listener property on BaseAudioContext
-PASS BaseAudioContext interface: attribute state
-PASS Unscopable handled correctly for state property on BaseAudioContext
-PASS BaseAudioContext interface: attribute audioWorklet
-PASS Unscopable handled correctly for audioWorklet property on BaseAudioContext
-PASS BaseAudioContext interface: operation resume()
-PASS Unscopable handled correctly for resume() on BaseAudioContext
-PASS BaseAudioContext interface: attribute onstatechange
-PASS Unscopable handled correctly for onstatechange property on BaseAudioContext
-PASS BaseAudioContext interface: operation createBuffer(unsigned long, unsigned long, float)
-PASS Unscopable handled correctly for createBuffer(unsigned long, unsigned long, float) on BaseAudioContext
-PASS BaseAudioContext interface: operation decodeAudioData(ArrayBuffer, DecodeSuccessCallback, DecodeErrorCallback)
-PASS Unscopable handled correctly for decodeAudioData(ArrayBuffer, DecodeSuccessCallback, DecodeErrorCallback) on BaseAudioContext
-PASS BaseAudioContext interface: operation createBufferSource()
-PASS Unscopable handled correctly for createBufferSource() on BaseAudioContext
-PASS BaseAudioContext interface: operation createConstantSource()
-PASS Unscopable handled correctly for createConstantSource() on BaseAudioContext
-PASS BaseAudioContext interface: operation createScriptProcessor(unsigned long, unsigned long, unsigned long)
-PASS Unscopable handled correctly for createScriptProcessor(unsigned long, unsigned long, unsigned long) on BaseAudioContext
-PASS BaseAudioContext interface: operation createAnalyser()
-PASS Unscopable handled correctly for createAnalyser() on BaseAudioContext
-PASS BaseAudioContext interface: operation createGain()
-PASS Unscopable handled correctly for createGain() on BaseAudioContext
-PASS BaseAudioContext interface: operation createDelay(double)
-PASS Unscopable handled correctly for createDelay(double) on BaseAudioContext
-PASS BaseAudioContext interface: operation createBiquadFilter()
-PASS Unscopable handled correctly for createBiquadFilter() on BaseAudioContext
-PASS BaseAudioContext interface: operation createIIRFilter([object Object], [object Object])
-PASS Unscopable handled correctly for createIIRFilter([object Object], [object Object]) on BaseAudioContext
-PASS BaseAudioContext interface: operation createWaveShaper()
-PASS Unscopable handled correctly for createWaveShaper() on BaseAudioContext
-PASS BaseAudioContext interface: operation createPanner()
-PASS Unscopable handled correctly for createPanner() on BaseAudioContext
-PASS BaseAudioContext interface: operation createStereoPanner()
-PASS Unscopable handled correctly for createStereoPanner() on BaseAudioContext
-PASS BaseAudioContext interface: operation createConvolver()
-PASS Unscopable handled correctly for createConvolver() on BaseAudioContext
-PASS BaseAudioContext interface: operation createChannelSplitter(unsigned long)
-PASS Unscopable handled correctly for createChannelSplitter(unsigned long) on BaseAudioContext
-PASS BaseAudioContext interface: operation createChannelMerger(unsigned long)
-PASS Unscopable handled correctly for createChannelMerger(unsigned long) on BaseAudioContext
-PASS BaseAudioContext interface: operation createDynamicsCompressor()
-PASS Unscopable handled correctly for createDynamicsCompressor() on BaseAudioContext
-PASS BaseAudioContext interface: operation createOscillator()
-PASS Unscopable handled correctly for createOscillator() on BaseAudioContext
-PASS BaseAudioContext interface: operation createPeriodicWave([object Object], [object Object], PeriodicWaveConstraints)
-PASS Unscopable handled correctly for createPeriodicWave([object Object], [object Object], PeriodicWaveConstraints) on BaseAudioContext
-PASS AudioContext interface: existence and properties of interface object
-PASS AudioContext interface object length
-PASS AudioContext interface object name
-PASS AudioContext interface: existence and properties of interface prototype object
-PASS AudioContext interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioContext interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioContext interface: attribute baseLatency
-PASS Unscopable handled correctly for baseLatency property on AudioContext
-FAIL AudioContext interface: attribute outputLatency assert_true: The prototype object must have a property "outputLatency" expected true got false
-PASS Unscopable handled correctly for outputLatency property on AudioContext
-PASS AudioContext interface: operation getOutputTimestamp()
-PASS Unscopable handled correctly for getOutputTimestamp() on AudioContext
-PASS AudioContext interface: operation suspend()
-PASS Unscopable handled correctly for suspend() on AudioContext
-PASS AudioContext interface: operation close()
-PASS Unscopable handled correctly for close() on AudioContext
-FAIL AudioContext interface: operation createMediaElementSource(HTMLMediaElement) assert_own_property: interface prototype object missing non-static operation expected property "createMediaElementSource" missing
-PASS Unscopable handled correctly for createMediaElementSource(HTMLMediaElement) on AudioContext
-FAIL AudioContext interface: operation createMediaStreamSource(MediaStream) assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamSource" missing
-PASS Unscopable handled correctly for createMediaStreamSource(MediaStream) on AudioContext
-FAIL AudioContext interface: operation createMediaStreamTrackSource(MediaStreamTrack) assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamTrackSource" missing
-PASS Unscopable handled correctly for createMediaStreamTrackSource(MediaStreamTrack) on AudioContext
-FAIL AudioContext interface: operation createMediaStreamDestination() assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamDestination" missing
-PASS Unscopable handled correctly for createMediaStreamDestination() on AudioContext
-PASS AudioContext must be primary interface of [object AudioContext]
-PASS Stringification of [object AudioContext]
-PASS AudioContext interface: [object AudioContext] must inherit property "baseLatency" with the proper type
-FAIL AudioContext interface: [object AudioContext] must inherit property "outputLatency" with the proper type assert_inherits: property "outputLatency" not found in prototype chain
-PASS AudioContext interface: [object AudioContext] must inherit property "getOutputTimestamp()" with the proper type
-PASS AudioContext interface: [object AudioContext] must inherit property "suspend()" with the proper type
-PASS AudioContext interface: [object AudioContext] must inherit property "close()" with the proper type
-PASS AudioContext interface: [object AudioContext] must inherit property "createMediaElementSource(HTMLMediaElement)" with the proper type
-PASS AudioContext interface: calling createMediaElementSource(HTMLMediaElement) on [object AudioContext] with too few arguments must throw TypeError
-PASS AudioContext interface: [object AudioContext] must inherit property "createMediaStreamSource(MediaStream)" with the proper type
-PASS AudioContext interface: calling createMediaStreamSource(MediaStream) on [object AudioContext] with too few arguments must throw TypeError
-FAIL AudioContext interface: [object AudioContext] must inherit property "createMediaStreamTrackSource(MediaStreamTrack)" with the proper type assert_inherits: property "createMediaStreamTrackSource" not found in prototype chain
-FAIL AudioContext interface: calling createMediaStreamTrackSource(MediaStreamTrack) on [object AudioContext] with too few arguments must throw TypeError assert_inherits: property "createMediaStreamTrackSource" not found in prototype chain
-PASS AudioContext interface: [object AudioContext] must inherit property "createMediaStreamDestination()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "destination" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "sampleRate" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "currentTime" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "listener" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "state" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "audioWorklet" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "resume()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "onstatechange" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createBuffer(unsigned long, unsigned long, float)" with the proper type
-PASS BaseAudioContext interface: calling createBuffer(unsigned long, unsigned long, float) on [object AudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "decodeAudioData(ArrayBuffer, DecodeSuccessCallback, DecodeErrorCallback)" with the proper type
-PASS BaseAudioContext interface: calling decodeAudioData(ArrayBuffer, DecodeSuccessCallback, DecodeErrorCallback) on [object AudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createBufferSource()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createConstantSource()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createScriptProcessor(unsigned long, unsigned long, unsigned long)" with the proper type
-PASS BaseAudioContext interface: calling createScriptProcessor(unsigned long, unsigned long, unsigned long) on [object AudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createAnalyser()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createGain()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createDelay(double)" with the proper type
-PASS BaseAudioContext interface: calling createDelay(double) on [object AudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createBiquadFilter()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createIIRFilter([object Object], [object Object])" with the proper type
-PASS BaseAudioContext interface: calling createIIRFilter([object Object], [object Object]) on [object AudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createWaveShaper()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createPanner()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createStereoPanner()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createConvolver()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createChannelSplitter(unsigned long)" with the proper type
-PASS BaseAudioContext interface: calling createChannelSplitter(unsigned long) on [object AudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createChannelMerger(unsigned long)" with the proper type
-PASS BaseAudioContext interface: calling createChannelMerger(unsigned long) on [object AudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createDynamicsCompressor()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createOscillator()" with the proper type
-PASS BaseAudioContext interface: [object AudioContext] must inherit property "createPeriodicWave([object Object], [object Object], PeriodicWaveConstraints)" with the proper type
-PASS BaseAudioContext interface: calling createPeriodicWave([object Object], [object Object], PeriodicWaveConstraints) on [object AudioContext] with too few arguments must throw TypeError
-PASS OfflineAudioContext interface: existence and properties of interface object
-PASS OfflineAudioContext interface object length
-PASS OfflineAudioContext interface object name
-PASS OfflineAudioContext interface: existence and properties of interface prototype object
-PASS OfflineAudioContext interface: existence and properties of interface prototype object's "constructor" property
-PASS OfflineAudioContext interface: existence and properties of interface prototype object's @@unscopables property
-PASS OfflineAudioContext interface: operation startRendering()
-PASS Unscopable handled correctly for startRendering() on OfflineAudioContext
-PASS OfflineAudioContext interface: operation suspend(double)
-PASS Unscopable handled correctly for suspend(double) on OfflineAudioContext
-PASS OfflineAudioContext interface: attribute length
-PASS Unscopable handled correctly for length property on OfflineAudioContext
-PASS OfflineAudioContext interface: attribute oncomplete
-PASS Unscopable handled correctly for oncomplete property on OfflineAudioContext
-PASS OfflineAudioContext must be primary interface of [object OfflineAudioContext]
-PASS Stringification of [object OfflineAudioContext]
-PASS OfflineAudioContext interface: [object OfflineAudioContext] must inherit property "startRendering()" with the proper type
-PASS OfflineAudioContext interface: [object OfflineAudioContext] must inherit property "suspend(double)" with the proper type
-PASS OfflineAudioContext interface: calling suspend(double) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS OfflineAudioContext interface: [object OfflineAudioContext] must inherit property "length" with the proper type
-PASS OfflineAudioContext interface: [object OfflineAudioContext] must inherit property "oncomplete" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "destination" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "sampleRate" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "currentTime" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "listener" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "state" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "audioWorklet" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "resume()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "onstatechange" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createBuffer(unsigned long, unsigned long, float)" with the proper type
-PASS BaseAudioContext interface: calling createBuffer(unsigned long, unsigned long, float) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "decodeAudioData(ArrayBuffer, DecodeSuccessCallback, DecodeErrorCallback)" with the proper type
-PASS BaseAudioContext interface: calling decodeAudioData(ArrayBuffer, DecodeSuccessCallback, DecodeErrorCallback) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createBufferSource()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createConstantSource()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createScriptProcessor(unsigned long, unsigned long, unsigned long)" with the proper type
-PASS BaseAudioContext interface: calling createScriptProcessor(unsigned long, unsigned long, unsigned long) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createAnalyser()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createGain()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createDelay(double)" with the proper type
-PASS BaseAudioContext interface: calling createDelay(double) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createBiquadFilter()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createIIRFilter([object Object], [object Object])" with the proper type
-PASS BaseAudioContext interface: calling createIIRFilter([object Object], [object Object]) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createWaveShaper()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createPanner()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createStereoPanner()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createConvolver()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createChannelSplitter(unsigned long)" with the proper type
-PASS BaseAudioContext interface: calling createChannelSplitter(unsigned long) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createChannelMerger(unsigned long)" with the proper type
-PASS BaseAudioContext interface: calling createChannelMerger(unsigned long) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createDynamicsCompressor()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createOscillator()" with the proper type
-PASS BaseAudioContext interface: [object OfflineAudioContext] must inherit property "createPeriodicWave([object Object], [object Object], PeriodicWaveConstraints)" with the proper type
-PASS BaseAudioContext interface: calling createPeriodicWave([object Object], [object Object], PeriodicWaveConstraints) on [object OfflineAudioContext] with too few arguments must throw TypeError
-PASS OfflineAudioCompletionEvent interface: existence and properties of interface object
-PASS OfflineAudioCompletionEvent interface object length
-PASS OfflineAudioCompletionEvent interface object name
-PASS OfflineAudioCompletionEvent interface: existence and properties of interface prototype object
-PASS OfflineAudioCompletionEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS OfflineAudioCompletionEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS OfflineAudioCompletionEvent interface: attribute renderedBuffer
-PASS Unscopable handled correctly for renderedBuffer property on OfflineAudioCompletionEvent
-PASS OfflineAudioCompletionEvent must be primary interface of [object OfflineAudioCompletionEvent]
-PASS Stringification of [object OfflineAudioCompletionEvent]
-PASS OfflineAudioCompletionEvent interface: [object OfflineAudioCompletionEvent] must inherit property "renderedBuffer" with the proper type
-PASS AudioBuffer interface: existence and properties of interface object
-PASS AudioBuffer interface object length
-PASS AudioBuffer interface object name
-PASS AudioBuffer interface: existence and properties of interface prototype object
-PASS AudioBuffer interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioBuffer interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioBuffer interface: attribute sampleRate
-PASS Unscopable handled correctly for sampleRate property on AudioBuffer
-PASS AudioBuffer interface: attribute length
-PASS Unscopable handled correctly for length property on AudioBuffer
-PASS AudioBuffer interface: attribute duration
-PASS Unscopable handled correctly for duration property on AudioBuffer
-PASS AudioBuffer interface: attribute numberOfChannels
-PASS Unscopable handled correctly for numberOfChannels property on AudioBuffer
-PASS AudioBuffer interface: operation getChannelData(unsigned long)
-PASS Unscopable handled correctly for getChannelData(unsigned long) on AudioBuffer
-PASS AudioBuffer interface: operation copyFromChannel(Float32Array, unsigned long, unsigned long)
-PASS Unscopable handled correctly for copyFromChannel(Float32Array, unsigned long, unsigned long) on AudioBuffer
-PASS AudioBuffer interface: operation copyToChannel(Float32Array, unsigned long, unsigned long)
-PASS Unscopable handled correctly for copyToChannel(Float32Array, unsigned long, unsigned long) on AudioBuffer
-PASS AudioBuffer must be primary interface of [object AudioBuffer]
-PASS Stringification of [object AudioBuffer]
-PASS AudioBuffer interface: [object AudioBuffer] must inherit property "sampleRate" with the proper type
-PASS AudioBuffer interface: [object AudioBuffer] must inherit property "length" with the proper type
-PASS AudioBuffer interface: [object AudioBuffer] must inherit property "duration" with the proper type
-PASS AudioBuffer interface: [object AudioBuffer] must inherit property "numberOfChannels" with the proper type
-PASS AudioBuffer interface: [object AudioBuffer] must inherit property "getChannelData(unsigned long)" with the proper type
-PASS AudioBuffer interface: calling getChannelData(unsigned long) on [object AudioBuffer] with too few arguments must throw TypeError
-PASS AudioBuffer interface: [object AudioBuffer] must inherit property "copyFromChannel(Float32Array, unsigned long, unsigned long)" with the proper type
-PASS AudioBuffer interface: calling copyFromChannel(Float32Array, unsigned long, unsigned long) on [object AudioBuffer] with too few arguments must throw TypeError
-PASS AudioBuffer interface: [object AudioBuffer] must inherit property "copyToChannel(Float32Array, unsigned long, unsigned long)" with the proper type
-PASS AudioBuffer interface: calling copyToChannel(Float32Array, unsigned long, unsigned long) on [object AudioBuffer] with too few arguments must throw TypeError
-PASS AudioNode interface: existence and properties of interface object
-PASS AudioNode interface object length
-PASS AudioNode interface object name
-PASS AudioNode interface: existence and properties of interface prototype object
-PASS AudioNode interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioNode interface: operation connect(AudioNode, unsigned long, unsigned long)
-PASS Unscopable handled correctly for connect(AudioNode, unsigned long, unsigned long) on AudioNode
-PASS AudioNode interface: operation connect(AudioParam, unsigned long)
-PASS Unscopable handled correctly for connect(AudioParam, unsigned long) on AudioNode
-PASS AudioNode interface: operation disconnect()
-PASS Unscopable handled correctly for disconnect() on AudioNode
-PASS AudioNode interface: operation disconnect(unsigned long)
-PASS Unscopable handled correctly for disconnect(unsigned long) on AudioNode
-PASS AudioNode interface: operation disconnect(AudioNode)
-PASS Unscopable handled correctly for disconnect(AudioNode) on AudioNode
-PASS AudioNode interface: operation disconnect(AudioNode, unsigned long)
-PASS Unscopable handled correctly for disconnect(AudioNode, unsigned long) on AudioNode
-PASS AudioNode interface: operation disconnect(AudioNode, unsigned long, unsigned long)
-PASS Unscopable handled correctly for disconnect(AudioNode, unsigned long, unsigned long) on AudioNode
-PASS AudioNode interface: operation disconnect(AudioParam)
-PASS Unscopable handled correctly for disconnect(AudioParam) on AudioNode
-PASS AudioNode interface: operation disconnect(AudioParam, unsigned long)
-PASS Unscopable handled correctly for disconnect(AudioParam, unsigned long) on AudioNode
-PASS AudioNode interface: attribute context
-PASS Unscopable handled correctly for context property on AudioNode
-PASS AudioNode interface: attribute numberOfInputs
-PASS Unscopable handled correctly for numberOfInputs property on AudioNode
-PASS AudioNode interface: attribute numberOfOutputs
-PASS Unscopable handled correctly for numberOfOutputs property on AudioNode
-PASS AudioNode interface: attribute channelCount
-PASS Unscopable handled correctly for channelCount property on AudioNode
-PASS AudioNode interface: attribute channelCountMode
-PASS Unscopable handled correctly for channelCountMode property on AudioNode
-PASS AudioNode interface: attribute channelInterpretation
-PASS Unscopable handled correctly for channelInterpretation property on AudioNode
-PASS AudioParam interface: existence and properties of interface object
-PASS AudioParam interface object length
-PASS AudioParam interface object name
-PASS AudioParam interface: existence and properties of interface prototype object
-PASS AudioParam interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioParam interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioParam interface: attribute value
-PASS Unscopable handled correctly for value property on AudioParam
-PASS AudioParam interface: attribute defaultValue
-PASS Unscopable handled correctly for defaultValue property on AudioParam
-PASS AudioParam interface: attribute minValue
-PASS Unscopable handled correctly for minValue property on AudioParam
-PASS AudioParam interface: attribute maxValue
-PASS Unscopable handled correctly for maxValue property on AudioParam
-PASS AudioParam interface: operation setValueAtTime(float, double)
-PASS Unscopable handled correctly for setValueAtTime(float, double) on AudioParam
-PASS AudioParam interface: operation linearRampToValueAtTime(float, double)
-PASS Unscopable handled correctly for linearRampToValueAtTime(float, double) on AudioParam
-PASS AudioParam interface: operation exponentialRampToValueAtTime(float, double)
-PASS Unscopable handled correctly for exponentialRampToValueAtTime(float, double) on AudioParam
-PASS AudioParam interface: operation setTargetAtTime(float, double, float)
-PASS Unscopable handled correctly for setTargetAtTime(float, double, float) on AudioParam
-PASS AudioParam interface: operation setValueCurveAtTime([object Object], double, double)
-PASS Unscopable handled correctly for setValueCurveAtTime([object Object], double, double) on AudioParam
-PASS AudioParam interface: operation cancelScheduledValues(double)
-PASS Unscopable handled correctly for cancelScheduledValues(double) on AudioParam
-PASS AudioParam interface: operation cancelAndHoldAtTime(double)
-PASS Unscopable handled correctly for cancelAndHoldAtTime(double) on AudioParam
-PASS AudioParam must be primary interface of [object AudioParam]
-PASS Stringification of [object AudioParam]
-PASS AudioParam interface: [object AudioParam] must inherit property "value" with the proper type
-PASS AudioParam interface: [object AudioParam] must inherit property "defaultValue" with the proper type
-PASS AudioParam interface: [object AudioParam] must inherit property "minValue" with the proper type
-PASS AudioParam interface: [object AudioParam] must inherit property "maxValue" with the proper type
-PASS AudioParam interface: [object AudioParam] must inherit property "setValueAtTime(float, double)" with the proper type
-PASS AudioParam interface: calling setValueAtTime(float, double) on [object AudioParam] with too few arguments must throw TypeError
-PASS AudioParam interface: [object AudioParam] must inherit property "linearRampToValueAtTime(float, double)" with the proper type
-PASS AudioParam interface: calling linearRampToValueAtTime(float, double) on [object AudioParam] with too few arguments must throw TypeError
-PASS AudioParam interface: [object AudioParam] must inherit property "exponentialRampToValueAtTime(float, double)" with the proper type
-PASS AudioParam interface: calling exponentialRampToValueAtTime(float, double) on [object AudioParam] with too few arguments must throw TypeError
-PASS AudioParam interface: [object AudioParam] must inherit property "setTargetAtTime(float, double, float)" with the proper type
-PASS AudioParam interface: calling setTargetAtTime(float, double, float) on [object AudioParam] with too few arguments must throw TypeError
-PASS AudioParam interface: [object AudioParam] must inherit property "setValueCurveAtTime([object Object], double, double)" with the proper type
-PASS AudioParam interface: calling setValueCurveAtTime([object Object], double, double) on [object AudioParam] with too few arguments must throw TypeError
-PASS AudioParam interface: [object AudioParam] must inherit property "cancelScheduledValues(double)" with the proper type
-PASS AudioParam interface: calling cancelScheduledValues(double) on [object AudioParam] with too few arguments must throw TypeError
-PASS AudioParam interface: [object AudioParam] must inherit property "cancelAndHoldAtTime(double)" with the proper type
-PASS AudioParam interface: calling cancelAndHoldAtTime(double) on [object AudioParam] with too few arguments must throw TypeError
-PASS AudioScheduledSourceNode interface: existence and properties of interface object
-PASS AudioScheduledSourceNode interface object length
-PASS AudioScheduledSourceNode interface object name
-PASS AudioScheduledSourceNode interface: existence and properties of interface prototype object
-PASS AudioScheduledSourceNode interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioScheduledSourceNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioScheduledSourceNode interface: attribute onended
-PASS Unscopable handled correctly for onended property on AudioScheduledSourceNode
-PASS AudioScheduledSourceNode interface: operation start(double)
-PASS Unscopable handled correctly for start(double) on AudioScheduledSourceNode
-PASS AudioScheduledSourceNode interface: operation stop(double)
-PASS Unscopable handled correctly for stop(double) on AudioScheduledSourceNode
-PASS AnalyserNode interface: existence and properties of interface object
-PASS AnalyserNode interface object length
-PASS AnalyserNode interface object name
-PASS AnalyserNode interface: existence and properties of interface prototype object
-PASS AnalyserNode interface: existence and properties of interface prototype object's "constructor" property
-PASS AnalyserNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS AnalyserNode interface: operation getFloatFrequencyData(Float32Array)
-PASS Unscopable handled correctly for getFloatFrequencyData(Float32Array) on AnalyserNode
-PASS AnalyserNode interface: operation getByteFrequencyData(Uint8Array)
-PASS Unscopable handled correctly for getByteFrequencyData(Uint8Array) on AnalyserNode
-PASS AnalyserNode interface: operation getFloatTimeDomainData(Float32Array)
-PASS Unscopable handled correctly for getFloatTimeDomainData(Float32Array) on AnalyserNode
-PASS AnalyserNode interface: operation getByteTimeDomainData(Uint8Array)
-PASS Unscopable handled correctly for getByteTimeDomainData(Uint8Array) on AnalyserNode
-PASS AnalyserNode interface: attribute fftSize
-PASS Unscopable handled correctly for fftSize property on AnalyserNode
-PASS AnalyserNode interface: attribute frequencyBinCount
-PASS Unscopable handled correctly for frequencyBinCount property on AnalyserNode
-PASS AnalyserNode interface: attribute minDecibels
-PASS Unscopable handled correctly for minDecibels property on AnalyserNode
-PASS AnalyserNode interface: attribute maxDecibels
-PASS Unscopable handled correctly for maxDecibels property on AnalyserNode
-PASS AnalyserNode interface: attribute smoothingTimeConstant
-PASS Unscopable handled correctly for smoothingTimeConstant property on AnalyserNode
-PASS AnalyserNode must be primary interface of [object AnalyserNode]
-PASS Stringification of [object AnalyserNode]
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "getFloatFrequencyData(Float32Array)" with the proper type
-PASS AnalyserNode interface: calling getFloatFrequencyData(Float32Array) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "getByteFrequencyData(Uint8Array)" with the proper type
-PASS AnalyserNode interface: calling getByteFrequencyData(Uint8Array) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "getFloatTimeDomainData(Float32Array)" with the proper type
-PASS AnalyserNode interface: calling getFloatTimeDomainData(Float32Array) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "getByteTimeDomainData(Uint8Array)" with the proper type
-PASS AnalyserNode interface: calling getByteTimeDomainData(Uint8Array) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "fftSize" with the proper type
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "frequencyBinCount" with the proper type
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "minDecibels" with the proper type
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "maxDecibels" with the proper type
-PASS AnalyserNode interface: [object AnalyserNode] must inherit property "smoothingTimeConstant" with the proper type
-PASS AudioNode interface: [object AnalyserNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object AnalyserNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object AnalyserNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AnalyserNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object AnalyserNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object AnalyserNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object AnalyserNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object AnalyserNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object AnalyserNode] must inherit property "channelInterpretation" with the proper type
-PASS AudioBufferSourceNode interface: existence and properties of interface object
-PASS AudioBufferSourceNode interface object length
-PASS AudioBufferSourceNode interface object name
-PASS AudioBufferSourceNode interface: existence and properties of interface prototype object
-PASS AudioBufferSourceNode interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioBufferSourceNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioBufferSourceNode interface: attribute buffer
-PASS Unscopable handled correctly for buffer property on AudioBufferSourceNode
-PASS AudioBufferSourceNode interface: attribute playbackRate
-PASS Unscopable handled correctly for playbackRate property on AudioBufferSourceNode
-PASS AudioBufferSourceNode interface: attribute detune
-PASS Unscopable handled correctly for detune property on AudioBufferSourceNode
-PASS AudioBufferSourceNode interface: attribute loop
-PASS Unscopable handled correctly for loop property on AudioBufferSourceNode
-PASS AudioBufferSourceNode interface: attribute loopStart
-PASS Unscopable handled correctly for loopStart property on AudioBufferSourceNode
-PASS AudioBufferSourceNode interface: attribute loopEnd
-PASS Unscopable handled correctly for loopEnd property on AudioBufferSourceNode
-PASS AudioBufferSourceNode interface: operation start(double, double, double)
-PASS Unscopable handled correctly for start(double, double, double) on AudioBufferSourceNode
-FAIL AudioBufferSourceNode interface: operation stop(double) assert_own_property: interface prototype object missing non-static operation expected property "stop" missing
-PASS Unscopable handled correctly for stop(double) on AudioBufferSourceNode
-PASS AudioBufferSourceNode must be primary interface of [object AudioBufferSourceNode]
-PASS Stringification of [object AudioBufferSourceNode]
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "buffer" with the proper type
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "playbackRate" with the proper type
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "detune" with the proper type
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "loop" with the proper type
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "loopStart" with the proper type
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "loopEnd" with the proper type
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "start(double, double, double)" with the proper type
-PASS AudioBufferSourceNode interface: calling start(double, double, double) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioBufferSourceNode interface: [object AudioBufferSourceNode] must inherit property "stop(double)" with the proper type
-PASS AudioBufferSourceNode interface: calling stop(double) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioScheduledSourceNode interface: [object AudioBufferSourceNode] must inherit property "onended" with the proper type
-PASS AudioScheduledSourceNode interface: [object AudioBufferSourceNode] must inherit property "start(double)" with the proper type
-PASS AudioScheduledSourceNode interface: calling start(double) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioScheduledSourceNode interface: [object AudioBufferSourceNode] must inherit property "stop(double)" with the proper type
-PASS AudioScheduledSourceNode interface: calling stop(double) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object AudioBufferSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object AudioBufferSourceNode] must inherit property "channelInterpretation" with the proper type
-PASS AudioDestinationNode interface: existence and properties of interface object
-PASS AudioDestinationNode interface object length
-PASS AudioDestinationNode interface object name
-PASS AudioDestinationNode interface: existence and properties of interface prototype object
-PASS AudioDestinationNode interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioDestinationNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioDestinationNode interface: attribute maxChannelCount
-PASS Unscopable handled correctly for maxChannelCount property on AudioDestinationNode
-PASS AudioDestinationNode must be primary interface of [object AudioDestinationNode]
-PASS Stringification of [object AudioDestinationNode]
-PASS AudioDestinationNode interface: [object AudioDestinationNode] must inherit property "maxChannelCount" with the proper type
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object AudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object AudioDestinationNode] must inherit property "channelInterpretation" with the proper type
-PASS AudioListener interface: existence and properties of interface object
-PASS AudioListener interface object length
-PASS AudioListener interface object name
-PASS AudioListener interface: existence and properties of interface prototype object
-PASS AudioListener interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioListener interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioListener interface: attribute positionX
-PASS Unscopable handled correctly for positionX property on AudioListener
-PASS AudioListener interface: attribute positionY
-PASS Unscopable handled correctly for positionY property on AudioListener
-PASS AudioListener interface: attribute positionZ
-PASS Unscopable handled correctly for positionZ property on AudioListener
-PASS AudioListener interface: attribute forwardX
-PASS Unscopable handled correctly for forwardX property on AudioListener
-PASS AudioListener interface: attribute forwardY
-PASS Unscopable handled correctly for forwardY property on AudioListener
-PASS AudioListener interface: attribute forwardZ
-PASS Unscopable handled correctly for forwardZ property on AudioListener
-PASS AudioListener interface: attribute upX
-PASS Unscopable handled correctly for upX property on AudioListener
-PASS AudioListener interface: attribute upY
-PASS Unscopable handled correctly for upY property on AudioListener
-PASS AudioListener interface: attribute upZ
-PASS Unscopable handled correctly for upZ property on AudioListener
-PASS AudioListener interface: operation setPosition(float, float, float)
-PASS Unscopable handled correctly for setPosition(float, float, float) on AudioListener
-PASS AudioListener interface: operation setOrientation(float, float, float, float, float, float)
-PASS Unscopable handled correctly for setOrientation(float, float, float, float, float, float) on AudioListener
-PASS AudioListener must be primary interface of [object AudioListener]
-PASS Stringification of [object AudioListener]
-PASS AudioListener interface: [object AudioListener] must inherit property "positionX" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "positionY" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "positionZ" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "forwardX" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "forwardY" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "forwardZ" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "upX" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "upY" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "upZ" with the proper type
-PASS AudioListener interface: [object AudioListener] must inherit property "setPosition(float, float, float)" with the proper type
-PASS AudioListener interface: calling setPosition(float, float, float) on [object AudioListener] with too few arguments must throw TypeError
-PASS AudioListener interface: [object AudioListener] must inherit property "setOrientation(float, float, float, float, float, float)" with the proper type
-PASS AudioListener interface: calling setOrientation(float, float, float, float, float, float) on [object AudioListener] with too few arguments must throw TypeError
-PASS AudioProcessingEvent interface: existence and properties of interface object
-PASS AudioProcessingEvent interface object length
-PASS AudioProcessingEvent interface object name
-PASS AudioProcessingEvent interface: existence and properties of interface prototype object
-PASS AudioProcessingEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioProcessingEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioProcessingEvent interface: attribute playbackTime
-PASS Unscopable handled correctly for playbackTime property on AudioProcessingEvent
-PASS AudioProcessingEvent interface: attribute inputBuffer
-PASS Unscopable handled correctly for inputBuffer property on AudioProcessingEvent
-PASS AudioProcessingEvent interface: attribute outputBuffer
-PASS Unscopable handled correctly for outputBuffer property on AudioProcessingEvent
-PASS AudioProcessingEvent must be primary interface of [object AudioProcessingEvent]
-PASS Stringification of [object AudioProcessingEvent]
-PASS AudioProcessingEvent interface: [object AudioProcessingEvent] must inherit property "playbackTime" with the proper type
-PASS AudioProcessingEvent interface: [object AudioProcessingEvent] must inherit property "inputBuffer" with the proper type
-PASS AudioProcessingEvent interface: [object AudioProcessingEvent] must inherit property "outputBuffer" with the proper type
-PASS BiquadFilterNode interface: existence and properties of interface object
-PASS BiquadFilterNode interface object length
-PASS BiquadFilterNode interface object name
-PASS BiquadFilterNode interface: existence and properties of interface prototype object
-PASS BiquadFilterNode interface: existence and properties of interface prototype object's "constructor" property
-PASS BiquadFilterNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS BiquadFilterNode interface: attribute type
-PASS Unscopable handled correctly for type property on BiquadFilterNode
-PASS BiquadFilterNode interface: attribute frequency
-PASS Unscopable handled correctly for frequency property on BiquadFilterNode
-PASS BiquadFilterNode interface: attribute detune
-PASS Unscopable handled correctly for detune property on BiquadFilterNode
-PASS BiquadFilterNode interface: attribute Q
-PASS Unscopable handled correctly for Q property on BiquadFilterNode
-PASS BiquadFilterNode interface: attribute gain
-PASS Unscopable handled correctly for gain property on BiquadFilterNode
-PASS BiquadFilterNode interface: operation getFrequencyResponse(Float32Array, Float32Array, Float32Array)
-PASS Unscopable handled correctly for getFrequencyResponse(Float32Array, Float32Array, Float32Array) on BiquadFilterNode
-PASS BiquadFilterNode must be primary interface of [object BiquadFilterNode]
-PASS Stringification of [object BiquadFilterNode]
-PASS BiquadFilterNode interface: [object BiquadFilterNode] must inherit property "type" with the proper type
-PASS BiquadFilterNode interface: [object BiquadFilterNode] must inherit property "frequency" with the proper type
-PASS BiquadFilterNode interface: [object BiquadFilterNode] must inherit property "detune" with the proper type
-PASS BiquadFilterNode interface: [object BiquadFilterNode] must inherit property "Q" with the proper type
-PASS BiquadFilterNode interface: [object BiquadFilterNode] must inherit property "gain" with the proper type
-PASS BiquadFilterNode interface: [object BiquadFilterNode] must inherit property "getFrequencyResponse(Float32Array, Float32Array, Float32Array)" with the proper type
-PASS BiquadFilterNode interface: calling getFrequencyResponse(Float32Array, Float32Array, Float32Array) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object BiquadFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object BiquadFilterNode] must inherit property "channelInterpretation" with the proper type
-PASS ChannelMergerNode interface: existence and properties of interface object
-PASS ChannelMergerNode interface object length
-PASS ChannelMergerNode interface object name
-PASS ChannelMergerNode interface: existence and properties of interface prototype object
-PASS ChannelMergerNode interface: existence and properties of interface prototype object's "constructor" property
-PASS ChannelMergerNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS ChannelMergerNode must be primary interface of [object ChannelMergerNode]
-PASS Stringification of [object ChannelMergerNode]
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object ChannelMergerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object ChannelMergerNode] must inherit property "channelInterpretation" with the proper type
-PASS ChannelSplitterNode interface: existence and properties of interface object
-PASS ChannelSplitterNode interface object length
-PASS ChannelSplitterNode interface object name
-PASS ChannelSplitterNode interface: existence and properties of interface prototype object
-PASS ChannelSplitterNode interface: existence and properties of interface prototype object's "constructor" property
-PASS ChannelSplitterNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS ChannelSplitterNode must be primary interface of [object ChannelSplitterNode]
-PASS Stringification of [object ChannelSplitterNode]
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object ChannelSplitterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object ChannelSplitterNode] must inherit property "channelInterpretation" with the proper type
-PASS ConstantSourceNode interface: existence and properties of interface object
-PASS ConstantSourceNode interface object length
-PASS ConstantSourceNode interface object name
-PASS ConstantSourceNode interface: existence and properties of interface prototype object
-PASS ConstantSourceNode interface: existence and properties of interface prototype object's "constructor" property
-PASS ConstantSourceNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS ConstantSourceNode interface: attribute offset
-PASS Unscopable handled correctly for offset property on ConstantSourceNode
-PASS ConstantSourceNode must be primary interface of [object ConstantSourceNode]
-PASS Stringification of [object ConstantSourceNode]
-PASS ConstantSourceNode interface: [object ConstantSourceNode] must inherit property "offset" with the proper type
-PASS AudioScheduledSourceNode interface: [object ConstantSourceNode] must inherit property "onended" with the proper type
-PASS AudioScheduledSourceNode interface: [object ConstantSourceNode] must inherit property "start(double)" with the proper type
-PASS AudioScheduledSourceNode interface: calling start(double) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioScheduledSourceNode interface: [object ConstantSourceNode] must inherit property "stop(double)" with the proper type
-PASS AudioScheduledSourceNode interface: calling stop(double) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object ConstantSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object ConstantSourceNode] must inherit property "channelInterpretation" with the proper type
-PASS ConvolverNode interface: existence and properties of interface object
-PASS ConvolverNode interface object length
-PASS ConvolverNode interface object name
-PASS ConvolverNode interface: existence and properties of interface prototype object
-PASS ConvolverNode interface: existence and properties of interface prototype object's "constructor" property
-PASS ConvolverNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS ConvolverNode interface: attribute buffer
-PASS Unscopable handled correctly for buffer property on ConvolverNode
-PASS ConvolverNode interface: attribute normalize
-PASS Unscopable handled correctly for normalize property on ConvolverNode
-PASS ConvolverNode must be primary interface of [object ConvolverNode]
-PASS Stringification of [object ConvolverNode]
-PASS ConvolverNode interface: [object ConvolverNode] must inherit property "buffer" with the proper type
-PASS ConvolverNode interface: [object ConvolverNode] must inherit property "normalize" with the proper type
-PASS AudioNode interface: [object ConvolverNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object ConvolverNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object ConvolverNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ConvolverNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object ConvolverNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object ConvolverNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object ConvolverNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object ConvolverNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object ConvolverNode] must inherit property "channelInterpretation" with the proper type
-PASS DelayNode interface: existence and properties of interface object
-PASS DelayNode interface object length
-PASS DelayNode interface object name
-PASS DelayNode interface: existence and properties of interface prototype object
-PASS DelayNode interface: existence and properties of interface prototype object's "constructor" property
-PASS DelayNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS DelayNode interface: attribute delayTime
-PASS Unscopable handled correctly for delayTime property on DelayNode
-PASS DelayNode must be primary interface of [object DelayNode]
-PASS Stringification of [object DelayNode]
-PASS DelayNode interface: [object DelayNode] must inherit property "delayTime" with the proper type
-PASS AudioNode interface: [object DelayNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object DelayNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object DelayNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DelayNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object DelayNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object DelayNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object DelayNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object DelayNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object DelayNode] must inherit property "channelInterpretation" with the proper type
-PASS DynamicsCompressorNode interface: existence and properties of interface object
-PASS DynamicsCompressorNode interface object length
-PASS DynamicsCompressorNode interface object name
-PASS DynamicsCompressorNode interface: existence and properties of interface prototype object
-PASS DynamicsCompressorNode interface: existence and properties of interface prototype object's "constructor" property
-PASS DynamicsCompressorNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS DynamicsCompressorNode interface: attribute threshold
-PASS Unscopable handled correctly for threshold property on DynamicsCompressorNode
-PASS DynamicsCompressorNode interface: attribute knee
-PASS Unscopable handled correctly for knee property on DynamicsCompressorNode
-PASS DynamicsCompressorNode interface: attribute ratio
-PASS Unscopable handled correctly for ratio property on DynamicsCompressorNode
-PASS DynamicsCompressorNode interface: attribute reduction
-PASS Unscopable handled correctly for reduction property on DynamicsCompressorNode
-PASS DynamicsCompressorNode interface: attribute attack
-PASS Unscopable handled correctly for attack property on DynamicsCompressorNode
-PASS DynamicsCompressorNode interface: attribute release
-PASS Unscopable handled correctly for release property on DynamicsCompressorNode
-PASS DynamicsCompressorNode must be primary interface of [object DynamicsCompressorNode]
-PASS Stringification of [object DynamicsCompressorNode]
-PASS DynamicsCompressorNode interface: [object DynamicsCompressorNode] must inherit property "threshold" with the proper type
-PASS DynamicsCompressorNode interface: [object DynamicsCompressorNode] must inherit property "knee" with the proper type
-PASS DynamicsCompressorNode interface: [object DynamicsCompressorNode] must inherit property "ratio" with the proper type
-PASS DynamicsCompressorNode interface: [object DynamicsCompressorNode] must inherit property "reduction" with the proper type
-PASS DynamicsCompressorNode interface: [object DynamicsCompressorNode] must inherit property "attack" with the proper type
-PASS DynamicsCompressorNode interface: [object DynamicsCompressorNode] must inherit property "release" with the proper type
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object DynamicsCompressorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object DynamicsCompressorNode] must inherit property "channelInterpretation" with the proper type
-PASS GainNode interface: existence and properties of interface object
-PASS GainNode interface object length
-PASS GainNode interface object name
-PASS GainNode interface: existence and properties of interface prototype object
-PASS GainNode interface: existence and properties of interface prototype object's "constructor" property
-PASS GainNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS GainNode interface: attribute gain
-PASS Unscopable handled correctly for gain property on GainNode
-PASS GainNode must be primary interface of [object GainNode]
-PASS Stringification of [object GainNode]
-PASS GainNode interface: [object GainNode] must inherit property "gain" with the proper type
-PASS AudioNode interface: [object GainNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object GainNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object GainNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object GainNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object GainNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object GainNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object GainNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object GainNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object GainNode] must inherit property "channelInterpretation" with the proper type
-PASS IIRFilterNode interface: existence and properties of interface object
-PASS IIRFilterNode interface object length
-PASS IIRFilterNode interface object name
-PASS IIRFilterNode interface: existence and properties of interface prototype object
-PASS IIRFilterNode interface: existence and properties of interface prototype object's "constructor" property
-PASS IIRFilterNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS IIRFilterNode interface: operation getFrequencyResponse(Float32Array, Float32Array, Float32Array)
-PASS Unscopable handled correctly for getFrequencyResponse(Float32Array, Float32Array, Float32Array) on IIRFilterNode
-PASS IIRFilterNode must be primary interface of [object IIRFilterNode]
-PASS Stringification of [object IIRFilterNode]
-PASS IIRFilterNode interface: [object IIRFilterNode] must inherit property "getFrequencyResponse(Float32Array, Float32Array, Float32Array)" with the proper type
-PASS IIRFilterNode interface: calling getFrequencyResponse(Float32Array, Float32Array, Float32Array) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object IIRFilterNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object IIRFilterNode] must inherit property "channelInterpretation" with the proper type
-PASS MediaElementAudioSourceNode interface: existence and properties of interface object
-PASS MediaElementAudioSourceNode interface object length
-PASS MediaElementAudioSourceNode interface object name
-PASS MediaElementAudioSourceNode interface: existence and properties of interface prototype object
-PASS MediaElementAudioSourceNode interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaElementAudioSourceNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaElementAudioSourceNode interface: attribute mediaElement
-PASS Unscopable handled correctly for mediaElement property on MediaElementAudioSourceNode
-PASS MediaElementAudioSourceNode must be primary interface of [object MediaElementAudioSourceNode]
-PASS Stringification of [object MediaElementAudioSourceNode]
-PASS MediaElementAudioSourceNode interface: [object MediaElementAudioSourceNode] must inherit property "mediaElement" with the proper type
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object MediaElementAudioSourceNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object MediaElementAudioSourceNode] must inherit property "channelInterpretation" with the proper type
-PASS MediaStreamAudioDestinationNode interface: existence and properties of interface object
-PASS MediaStreamAudioDestinationNode interface object length
-PASS MediaStreamAudioDestinationNode interface object name
-PASS MediaStreamAudioDestinationNode interface: existence and properties of interface prototype object
-PASS MediaStreamAudioDestinationNode interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStreamAudioDestinationNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStreamAudioDestinationNode interface: attribute stream
-PASS Unscopable handled correctly for stream property on MediaStreamAudioDestinationNode
-PASS MediaStreamAudioDestinationNode must be primary interface of [object MediaStreamAudioDestinationNode]
-PASS Stringification of [object MediaStreamAudioDestinationNode]
-PASS MediaStreamAudioDestinationNode interface: [object MediaStreamAudioDestinationNode] must inherit property "stream" with the proper type
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object MediaStreamAudioDestinationNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object MediaStreamAudioDestinationNode] must inherit property "channelInterpretation" with the proper type
-PASS MediaStreamAudioSourceNode interface: existence and properties of interface object
-PASS MediaStreamAudioSourceNode interface object length
-PASS MediaStreamAudioSourceNode interface object name
-PASS MediaStreamAudioSourceNode interface: existence and properties of interface prototype object
-PASS MediaStreamAudioSourceNode interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStreamAudioSourceNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStreamAudioSourceNode interface: attribute mediaStream
-PASS Unscopable handled correctly for mediaStream property on MediaStreamAudioSourceNode
-FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface object assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
-FAIL MediaStreamTrackAudioSourceNode interface object length assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
-FAIL MediaStreamTrackAudioSourceNode interface object name assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
-FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
-FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
-FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
-PASS OscillatorNode interface: existence and properties of interface object
-PASS OscillatorNode interface object length
-PASS OscillatorNode interface object name
-PASS OscillatorNode interface: existence and properties of interface prototype object
-PASS OscillatorNode interface: existence and properties of interface prototype object's "constructor" property
-PASS OscillatorNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS OscillatorNode interface: attribute type
-PASS Unscopable handled correctly for type property on OscillatorNode
-PASS OscillatorNode interface: attribute frequency
-PASS Unscopable handled correctly for frequency property on OscillatorNode
-PASS OscillatorNode interface: attribute detune
-PASS Unscopable handled correctly for detune property on OscillatorNode
-PASS OscillatorNode interface: operation setPeriodicWave(PeriodicWave)
-PASS Unscopable handled correctly for setPeriodicWave(PeriodicWave) on OscillatorNode
-PASS OscillatorNode must be primary interface of [object OscillatorNode]
-PASS Stringification of [object OscillatorNode]
-PASS OscillatorNode interface: [object OscillatorNode] must inherit property "type" with the proper type
-PASS OscillatorNode interface: [object OscillatorNode] must inherit property "frequency" with the proper type
-PASS OscillatorNode interface: [object OscillatorNode] must inherit property "detune" with the proper type
-PASS OscillatorNode interface: [object OscillatorNode] must inherit property "setPeriodicWave(PeriodicWave)" with the proper type
-PASS OscillatorNode interface: calling setPeriodicWave(PeriodicWave) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioScheduledSourceNode interface: [object OscillatorNode] must inherit property "onended" with the proper type
-PASS AudioScheduledSourceNode interface: [object OscillatorNode] must inherit property "start(double)" with the proper type
-PASS AudioScheduledSourceNode interface: calling start(double) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioScheduledSourceNode interface: [object OscillatorNode] must inherit property "stop(double)" with the proper type
-PASS AudioScheduledSourceNode interface: calling stop(double) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object OscillatorNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object OscillatorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object OscillatorNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object OscillatorNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object OscillatorNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object OscillatorNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object OscillatorNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object OscillatorNode] must inherit property "channelInterpretation" with the proper type
-PASS PannerNode interface: existence and properties of interface object
-PASS PannerNode interface object length
-PASS PannerNode interface object name
-PASS PannerNode interface: existence and properties of interface prototype object
-PASS PannerNode interface: existence and properties of interface prototype object's "constructor" property
-PASS PannerNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS PannerNode interface: attribute panningModel
-PASS Unscopable handled correctly for panningModel property on PannerNode
-PASS PannerNode interface: attribute positionX
-PASS Unscopable handled correctly for positionX property on PannerNode
-PASS PannerNode interface: attribute positionY
-PASS Unscopable handled correctly for positionY property on PannerNode
-PASS PannerNode interface: attribute positionZ
-PASS Unscopable handled correctly for positionZ property on PannerNode
-PASS PannerNode interface: attribute orientationX
-PASS Unscopable handled correctly for orientationX property on PannerNode
-PASS PannerNode interface: attribute orientationY
-PASS Unscopable handled correctly for orientationY property on PannerNode
-PASS PannerNode interface: attribute orientationZ
-PASS Unscopable handled correctly for orientationZ property on PannerNode
-PASS PannerNode interface: attribute distanceModel
-PASS Unscopable handled correctly for distanceModel property on PannerNode
-PASS PannerNode interface: attribute refDistance
-PASS Unscopable handled correctly for refDistance property on PannerNode
-PASS PannerNode interface: attribute maxDistance
-PASS Unscopable handled correctly for maxDistance property on PannerNode
-PASS PannerNode interface: attribute rolloffFactor
-PASS Unscopable handled correctly for rolloffFactor property on PannerNode
-PASS PannerNode interface: attribute coneInnerAngle
-PASS Unscopable handled correctly for coneInnerAngle property on PannerNode
-PASS PannerNode interface: attribute coneOuterAngle
-PASS Unscopable handled correctly for coneOuterAngle property on PannerNode
-PASS PannerNode interface: attribute coneOuterGain
-PASS Unscopable handled correctly for coneOuterGain property on PannerNode
-PASS PannerNode interface: operation setPosition(float, float, float)
-PASS Unscopable handled correctly for setPosition(float, float, float) on PannerNode
-PASS PannerNode interface: operation setOrientation(float, float, float)
-PASS Unscopable handled correctly for setOrientation(float, float, float) on PannerNode
-PASS PannerNode must be primary interface of [object PannerNode]
-PASS Stringification of [object PannerNode]
-PASS PannerNode interface: [object PannerNode] must inherit property "panningModel" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "positionX" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "positionY" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "positionZ" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "orientationX" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "orientationY" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "orientationZ" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "distanceModel" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "refDistance" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "maxDistance" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "rolloffFactor" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "coneInnerAngle" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "coneOuterAngle" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "coneOuterGain" with the proper type
-PASS PannerNode interface: [object PannerNode] must inherit property "setPosition(float, float, float)" with the proper type
-PASS PannerNode interface: calling setPosition(float, float, float) on [object PannerNode] with too few arguments must throw TypeError
-PASS PannerNode interface: [object PannerNode] must inherit property "setOrientation(float, float, float)" with the proper type
-PASS PannerNode interface: calling setOrientation(float, float, float) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object PannerNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object PannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object PannerNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object PannerNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object PannerNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object PannerNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object PannerNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object PannerNode] must inherit property "channelInterpretation" with the proper type
-PASS PeriodicWave interface: existence and properties of interface object
-PASS PeriodicWave interface object length
-PASS PeriodicWave interface object name
-PASS PeriodicWave interface: existence and properties of interface prototype object
-PASS PeriodicWave interface: existence and properties of interface prototype object's "constructor" property
-PASS PeriodicWave interface: existence and properties of interface prototype object's @@unscopables property
-PASS PeriodicWave must be primary interface of [object PeriodicWave]
-PASS Stringification of [object PeriodicWave]
-PASS ScriptProcessorNode interface: existence and properties of interface object
-PASS ScriptProcessorNode interface object length
-PASS ScriptProcessorNode interface object name
-PASS ScriptProcessorNode interface: existence and properties of interface prototype object
-PASS ScriptProcessorNode interface: existence and properties of interface prototype object's "constructor" property
-PASS ScriptProcessorNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS ScriptProcessorNode interface: attribute onaudioprocess
-PASS Unscopable handled correctly for onaudioprocess property on ScriptProcessorNode
-PASS ScriptProcessorNode interface: attribute bufferSize
-PASS Unscopable handled correctly for bufferSize property on ScriptProcessorNode
-PASS ScriptProcessorNode must be primary interface of [object ScriptProcessorNode]
-PASS Stringification of [object ScriptProcessorNode]
-PASS ScriptProcessorNode interface: [object ScriptProcessorNode] must inherit property "onaudioprocess" with the proper type
-PASS ScriptProcessorNode interface: [object ScriptProcessorNode] must inherit property "bufferSize" with the proper type
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object ScriptProcessorNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object ScriptProcessorNode] must inherit property "channelInterpretation" with the proper type
-PASS StereoPannerNode interface: existence and properties of interface object
-PASS StereoPannerNode interface object length
-PASS StereoPannerNode interface object name
-PASS StereoPannerNode interface: existence and properties of interface prototype object
-PASS StereoPannerNode interface: existence and properties of interface prototype object's "constructor" property
-PASS StereoPannerNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS StereoPannerNode interface: attribute pan
-PASS Unscopable handled correctly for pan property on StereoPannerNode
-PASS StereoPannerNode must be primary interface of [object StereoPannerNode]
-PASS Stringification of [object StereoPannerNode]
-PASS StereoPannerNode interface: [object StereoPannerNode] must inherit property "pan" with the proper type
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object StereoPannerNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object StereoPannerNode] must inherit property "channelInterpretation" with the proper type
-PASS WaveShaperNode interface: existence and properties of interface object
-PASS WaveShaperNode interface object length
-PASS WaveShaperNode interface object name
-PASS WaveShaperNode interface: existence and properties of interface prototype object
-PASS WaveShaperNode interface: existence and properties of interface prototype object's "constructor" property
-PASS WaveShaperNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS WaveShaperNode interface: attribute curve
-PASS Unscopable handled correctly for curve property on WaveShaperNode
-PASS WaveShaperNode interface: attribute oversample
-PASS Unscopable handled correctly for oversample property on WaveShaperNode
-PASS WaveShaperNode must be primary interface of [object WaveShaperNode]
-PASS Stringification of [object WaveShaperNode]
-PASS WaveShaperNode interface: [object WaveShaperNode] must inherit property "curve" with the proper type
-PASS WaveShaperNode interface: [object WaveShaperNode] must inherit property "oversample" with the proper type
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object WaveShaperNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object WaveShaperNode] must inherit property "channelInterpretation" with the proper type
-PASS AudioWorklet interface: existence and properties of interface object
-PASS AudioWorklet interface object length
-PASS AudioWorklet interface object name
-PASS AudioWorklet interface: existence and properties of interface prototype object
-PASS AudioWorklet interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioWorklet interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioWorklet must be primary interface of [object AudioWorklet]
-PASS Stringification of [object AudioWorklet]
-PASS AudioWorkletGlobalScope interface: existence and properties of interface object
-PASS AudioParamMap interface: existence and properties of interface object
-PASS AudioParamMap interface object length
-PASS AudioParamMap interface object name
-PASS AudioParamMap interface: existence and properties of interface prototype object
-PASS AudioParamMap interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioParamMap interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioParamMap must be primary interface of [object AudioParamMap]
-PASS Stringification of [object AudioParamMap]
-PASS AudioWorkletNode interface: existence and properties of interface object
-PASS AudioWorkletNode interface object length
-PASS AudioWorkletNode interface object name
-PASS AudioWorkletNode interface: existence and properties of interface prototype object
-PASS AudioWorkletNode interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioWorkletNode interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioWorkletNode interface: attribute parameters
-PASS Unscopable handled correctly for parameters property on AudioWorkletNode
-PASS AudioWorkletNode interface: attribute port
-PASS Unscopable handled correctly for port property on AudioWorkletNode
-FAIL AudioWorkletNode interface: attribute processorState assert_true: The prototype object must have a property "processorState" expected true got false
-PASS Unscopable handled correctly for processorState property on AudioWorkletNode
-FAIL AudioWorkletNode interface: attribute onprocessorstatechange assert_true: The prototype object must have a property "onprocessorstatechange" expected true got false
-PASS Unscopable handled correctly for onprocessorstatechange property on AudioWorkletNode
-PASS AudioWorkletNode must be primary interface of [object AudioWorkletNode]
-PASS Stringification of [object AudioWorkletNode]
-PASS AudioWorkletNode interface: [object AudioWorkletNode] must inherit property "parameters" with the proper type
-PASS AudioWorkletNode interface: [object AudioWorkletNode] must inherit property "port" with the proper type
-FAIL AudioWorkletNode interface: [object AudioWorkletNode] must inherit property "processorState" with the proper type assert_inherits: property "processorState" not found in prototype chain
-FAIL AudioWorkletNode interface: [object AudioWorkletNode] must inherit property "onprocessorstatechange" with the proper type assert_inherits: property "onprocessorstatechange" not found in prototype chain
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "connect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioNode, unsigned long, unsigned long) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "connect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling connect(AudioParam, unsigned long) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "disconnect()" with the proper type
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "disconnect(unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(unsigned long) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "disconnect(AudioNode)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "disconnect(AudioParam)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
-PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on [object AudioWorkletNode] with too few arguments must throw TypeError
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "context" with the proper type
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "numberOfInputs" with the proper type
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "numberOfOutputs" with the proper type
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "channelCount" with the proper type
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "channelCountMode" with the proper type
-PASS AudioNode interface: [object AudioWorkletNode] must inherit property "channelInterpretation" with the proper type
-PASS AudioWorkletProcessor interface: existence and properties of interface object
+FAIL Test driver promise_test: Unhandled rejection with value: object "TrackEventInit inherits EventInit, but TrackEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-delaynode-interface/idl-test-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-delaynode-interface/idl-test-expected.txt
new file mode 100644
index 0000000..522b6a7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-delaynode-interface/idl-test-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL DelayNode IDL Test Uncaught DelayOptions inherits AudioNodeOptions, but DelayOptions is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any-expected.txt
new file mode 100644
index 0000000..cb3c9afb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL WebAuthn interfaces. promise_test: Unhandled rejection with value: object "PublicKeyCredential inherits Credential, but Credential is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any.js
new file mode 100644
index 0000000..bd5f9dc4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any.js
@@ -0,0 +1,30 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+if (self.importScripts) {
+  importScripts('/resources/testharness.js');
+  importScripts('/resources/WebIDLParser.js', '/resources/idlharness.js');
+}
+
+// https://w3c.github.io/webauthn/
+
+promise_test(async () => {
+  const webauthnIdl = await fetch('/interfaces/webauthn.idl').then(r => r.text());
+
+  const idlArray = new IdlArray();
+  idlArray.add_idls(webauthnIdl);
+
+  // static IDL tests
+  idlArray.add_untested_idls('interface CredentialCreationOptions {};');
+  idlArray.add_untested_idls('interface CredentialRequestOptions {};');
+  idlArray.add_untested_idls("interface Navigator { };");
+  // TODO: change to "tested" for real browsers?
+  idlArray.add_untested_idls("partial interface Navigator { readonly attribute WebAuthentication authentication; };");
+  idlArray.add_objects({
+    WebAuthentication: ["navigator.authentication"]
+  });
+  idlArray.test();
+  done();
+}, 'WebAuthn interfaces.');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any.worker-expected.txt
new file mode 100644
index 0000000..cb3c9afb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.any.worker-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL WebAuthn interfaces. promise_test: Unhandled rejection with value: object "PublicKeyCredential inherits Credential, but Credential is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.html
deleted file mode 100644
index c232659c..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/webauthn/interfaces.https.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn WebIDL Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<!-- for testing WebIDL -->
-<script src=/resources/WebIDLParser.js></script>
-<script src=/resources/idlharness.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    // loads an IDL file from the webserver
-    function fetchIdl(idlUrl) {
-        return new Promise(function(resolve, reject) {
-            if (typeof idlUrl !== "string") {
-                return reject("fetchIdl: expected argument to be URL string");
-            }
-            var request = new XMLHttpRequest();
-            request.open("GET", idlUrl);
-            request.send();
-            request.onload = function() {
-                var idls = request.responseText;
-                return resolve(idls);
-            };
-        });
-    }
-
-    // this does the real work of running the IDL tests
-    function runIdlTests(idls) {
-        return new Promise(function(resolve, reject) {
-            var idlArray = new window.IdlArray();
-
-            // static IDL tests
-            idlArray.add_untested_idls("interface Navigator { };");
-            // TODO: change to "tested" for real browsers?
-            idlArray.add_untested_idls("partial interface Navigator { readonly attribute WebAuthentication authentication; };");
-            idlArray.add_objects({
-                WebAuthentication: ["navigator.authentication"]
-            });
-
-            // run test WebIDL tests loaded from the idls file
-            idlArray.add_idls(idls);
-            return resolve(idlArray.test());
-        });
-    }
-
-    // test harness function
-    window.promise_test(function() {
-        return fetchIdl("/interfaces/webauthn.idl") // load the IDL file ...
-            .then(function(idls) {
-                return runIdlTests(idls); // ... then run the tests.
-            });
-    }, "Validate WebAuthn IDL");
-});
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt
index 4ef1e875..1aad4bf 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt
@@ -1,272 +1,23 @@
 This is a testharness.js-based test.
-FAIL Main test driver promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'constructor' of undefined"
+PASS Main test driver
 PASS Test driver for asyncInitCertificate
 FAIL Test driver for asyncInitTransports assert_unreached: Failed to run asyncInitTransports: ReferenceError: RTCSctpTransport is not defined Reached unreachable code
 PASS Test driver for asyncInitMediaStreamTrack
-FAIL MediaStreamTrack interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
+FAIL EventTarget interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function () { [native code] }" did not throw
+PASS EventTarget interface object length
+PASS EventTarget interface object name
+PASS EventTarget interface: existence and properties of interface prototype object
+PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property
+PASS EventTarget interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaStreamTrack interface: existence and properties of interface object
 PASS MediaStreamTrack interface object length
 PASS MediaStreamTrack interface object name
-FAIL MediaStreamTrack interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
+PASS MediaStreamTrack interface: existence and properties of interface prototype object
 PASS MediaStreamTrack interface: existence and properties of interface prototype object's "constructor" property
 PASS MediaStreamTrack interface: existence and properties of interface prototype object's @@unscopables property
-FAIL MediaStreamTrack interface: attribute isolated assert_true: The prototype object must have a property "isolated" expected true got false
-PASS Unscopable handled correctly for isolated property on MediaStreamTrack
-FAIL MediaStreamTrack interface: attribute onisolationchange assert_true: The prototype object must have a property "onisolationchange" expected true got false
-PASS Unscopable handled correctly for onisolationchange property on MediaStreamTrack
 PASS MediaStreamTrack must be primary interface of idlTestObjects.mediaStreamTrack
-FAIL Stringification of idlTestObjects.mediaStreamTrack Cannot read property 'has_stringifier' of undefined
-FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "isolated" with the proper type assert_inherits: property "isolated" not found in prototype chain
-FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "onisolationchange" with the proper type assert_inherits: property "onisolationchange" not found in prototype chain
+PASS Stringification of idlTestObjects.mediaStreamTrack
 FAIL MediaStreamTrack must be primary interface of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_idl_attribute: Expect pc to have addTransceiver() method property "addTransceiver" not found in prototype chain"
 FAIL Stringification of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_idl_attribute: Expect pc to have addTransceiver() method property "addTransceiver" not found in prototype chain"
-FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "isolated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_idl_attribute: Expect pc to have addTransceiver() method property "addTransceiver" not found in prototype chain"
-FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "onisolationchange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_idl_attribute: Expect pc to have addTransceiver() method property "addTransceiver" not found in prototype chain"
-FAIL RTCPeerConnection interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS RTCPeerConnection interface object length
-PASS RTCPeerConnection interface object name
-FAIL RTCPeerConnection interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS RTCPeerConnection interface: existence and properties of interface prototype object's "constructor" property
-PASS RTCPeerConnection interface: existence and properties of interface prototype object's @@unscopables property
-PASS RTCPeerConnection interface: operation createOffer(RTCOfferOptions)
-PASS Unscopable handled correctly for createOffer(RTCOfferOptions) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation createAnswer(RTCAnswerOptions)
-PASS Unscopable handled correctly for createAnswer(RTCAnswerOptions) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit)
-PASS Unscopable handled correctly for setLocalDescription(RTCSessionDescriptionInit) on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute localDescription
-PASS Unscopable handled correctly for localDescription property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute currentLocalDescription assert_true: The prototype object must have a property "currentLocalDescription" expected true got false
-PASS Unscopable handled correctly for currentLocalDescription property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute pendingLocalDescription assert_true: The prototype object must have a property "pendingLocalDescription" expected true got false
-PASS Unscopable handled correctly for pendingLocalDescription property on RTCPeerConnection
-PASS RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit)
-PASS Unscopable handled correctly for setRemoteDescription(RTCSessionDescriptionInit) on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute remoteDescription
-PASS Unscopable handled correctly for remoteDescription property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute currentRemoteDescription assert_true: The prototype object must have a property "currentRemoteDescription" expected true got false
-PASS Unscopable handled correctly for currentRemoteDescription property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute pendingRemoteDescription assert_true: The prototype object must have a property "pendingRemoteDescription" expected true got false
-PASS Unscopable handled correctly for pendingRemoteDescription property on RTCPeerConnection
-PASS RTCPeerConnection interface: operation addIceCandidate([object Object],[object Object])
-PASS Unscopable handled correctly for addIceCandidate([object Object],[object Object]) on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute signalingState
-PASS Unscopable handled correctly for signalingState property on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute iceGatheringState
-PASS Unscopable handled correctly for iceGatheringState property on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute iceConnectionState
-PASS Unscopable handled correctly for iceConnectionState property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute connectionState assert_true: The prototype object must have a property "connectionState" expected true got false
-PASS Unscopable handled correctly for connectionState property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute canTrickleIceCandidates assert_true: The prototype object must have a property "canTrickleIceCandidates" expected true got false
-PASS Unscopable handled correctly for canTrickleIceCandidates property on RTCPeerConnection
-FAIL RTCPeerConnection interface: operation getDefaultIceServers() assert_own_property: interface object missing static operation expected property "getDefaultIceServers" missing
-PASS Unscopable handled correctly for getDefaultIceServers() on RTCPeerConnection
-FAIL RTCPeerConnection interface: operation getConfiguration() assert_own_property: interface prototype object missing non-static operation expected property "getConfiguration" missing
-PASS Unscopable handled correctly for getConfiguration() on RTCPeerConnection
-PASS RTCPeerConnection interface: operation setConfiguration(RTCConfiguration)
-PASS Unscopable handled correctly for setConfiguration(RTCConfiguration) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation close()
-PASS Unscopable handled correctly for close() on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute onnegotiationneeded
-PASS Unscopable handled correctly for onnegotiationneeded property on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute onicecandidate
-PASS Unscopable handled correctly for onicecandidate property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute onicecandidateerror assert_true: The prototype object must have a property "onicecandidateerror" expected true got false
-PASS Unscopable handled correctly for onicecandidateerror property on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute onsignalingstatechange
-PASS Unscopable handled correctly for onsignalingstatechange property on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute oniceconnectionstatechange
-PASS Unscopable handled correctly for oniceconnectionstatechange property on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute onicegatheringstatechange
-PASS Unscopable handled correctly for onicegatheringstatechange property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute onconnectionstatechange assert_true: The prototype object must have a property "onconnectionstatechange" expected true got false
-PASS Unscopable handled correctly for onconnectionstatechange property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute onfingerprintfailure assert_true: The prototype object must have a property "onfingerprintfailure" expected true got false
-PASS Unscopable handled correctly for onfingerprintfailure property on RTCPeerConnection
-PASS RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions)
-PASS Unscopable handled correctly for createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)
-PASS Unscopable handled correctly for setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback)
-PASS Unscopable handled correctly for createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)
-PASS Unscopable handled correctly for setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback)
-PASS Unscopable handled correctly for addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation generateCertificate(AlgorithmIdentifier)
-PASS Unscopable handled correctly for generateCertificate(AlgorithmIdentifier) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation getSenders()
-PASS Unscopable handled correctly for getSenders() on RTCPeerConnection
-PASS RTCPeerConnection interface: operation getReceivers()
-PASS Unscopable handled correctly for getReceivers() on RTCPeerConnection
-FAIL RTCPeerConnection interface: operation getTransceivers() assert_own_property: interface prototype object missing non-static operation expected property "getTransceivers" missing
-PASS Unscopable handled correctly for getTransceivers() on RTCPeerConnection
-PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack, MediaStream)
-PASS Unscopable handled correctly for addTrack(MediaStreamTrack, MediaStream) on RTCPeerConnection
-PASS RTCPeerConnection interface: operation removeTrack(RTCRtpSender)
-PASS Unscopable handled correctly for removeTrack(RTCRtpSender) on RTCPeerConnection
-FAIL RTCPeerConnection interface: operation addTransceiver([object Object],[object Object], RTCRtpTransceiverInit) assert_own_property: interface prototype object missing non-static operation expected property "addTransceiver" missing
-PASS Unscopable handled correctly for addTransceiver([object Object],[object Object], RTCRtpTransceiverInit) on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute ontrack
-PASS Unscopable handled correctly for ontrack property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute sctp assert_true: The prototype object must have a property "sctp" expected true got false
-PASS Unscopable handled correctly for sctp property on RTCPeerConnection
-PASS RTCPeerConnection interface: operation createDataChannel(USVString, RTCDataChannelInit)
-PASS Unscopable handled correctly for createDataChannel(USVString, RTCDataChannelInit) on RTCPeerConnection
-PASS RTCPeerConnection interface: attribute ondatachannel
-PASS Unscopable handled correctly for ondatachannel property on RTCPeerConnection
-PASS RTCPeerConnection interface: operation getStats(MediaStreamTrack)
-PASS Unscopable handled correctly for getStats(MediaStreamTrack) on RTCPeerConnection
-FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString, RTCIdentityProviderOptions) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing
-PASS Unscopable handled correctly for setIdentityProvider(DOMString, RTCIdentityProviderOptions) on RTCPeerConnection
-FAIL RTCPeerConnection interface: operation getIdentityAssertion() assert_own_property: interface prototype object missing non-static operation expected property "getIdentityAssertion" missing
-PASS Unscopable handled correctly for getIdentityAssertion() on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute peerIdentity assert_true: The prototype object must have a property "peerIdentity" expected true got false
-PASS Unscopable handled correctly for peerIdentity property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute idpLoginUrl assert_true: The prototype object must have a property "idpLoginUrl" expected true got false
-PASS Unscopable handled correctly for idpLoginUrl property on RTCPeerConnection
-FAIL RTCPeerConnection interface: attribute idpErrorInfo assert_true: The prototype object must have a property "idpErrorInfo" expected true got false
-PASS Unscopable handled correctly for idpErrorInfo property on RTCPeerConnection
-PASS RTCPeerConnection must be primary interface of new RTCPeerConnection()
-FAIL Stringification of new RTCPeerConnection() Cannot read property 'has_stringifier' of undefined
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer(RTCOfferOptions)" with the proper type
-PASS RTCPeerConnection interface: calling createOffer(RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer(RTCAnswerOptions)" with the proper type
-PASS RTCPeerConnection interface: calling createAnswer(RTCAnswerOptions) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription(RTCSessionDescriptionInit)" with the proper type
-PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "localDescription" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentLocalDescription" with the proper type assert_inherits: property "currentLocalDescription" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingLocalDescription" with the proper type assert_inherits: property "pendingLocalDescription" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription(RTCSessionDescriptionInit)" with the proper type
-PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "remoteDescription" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentRemoteDescription" with the proper type assert_inherits: property "currentRemoteDescription" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingRemoteDescription" with the proper type assert_inherits: property "pendingRemoteDescription" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate([object Object],[object Object])" with the proper type
-PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object]) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "signalingState" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceGatheringState" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceConnectionState" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "connectionState" with the proper type assert_inherits: property "connectionState" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "canTrickleIceCandidates" with the proper type assert_inherits: property "canTrickleIceCandidates" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getDefaultIceServers()" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getConfiguration()" with the proper type assert_inherits: property "getConfiguration" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setConfiguration(RTCConfiguration)" with the proper type
-PASS RTCPeerConnection interface: calling setConfiguration(RTCConfiguration) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "close()" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onnegotiationneeded" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidate" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidateerror" with the proper type assert_inherits: property "onicecandidateerror" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onsignalingstatechange" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "oniceconnectionstatechange" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicegatheringstatechange" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onconnectionstatechange" with the proper type assert_inherits: property "onconnectionstatechange" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onfingerprintfailure" with the proper type assert_inherits: property "onfingerprintfailure" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions)" with the proper type
-PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type
-PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback)" with the proper type
-PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type
-PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type
-PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "generateCertificate(AlgorithmIdentifier)" with the proper type
-PASS RTCPeerConnection interface: calling generateCertificate(AlgorithmIdentifier) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getSenders()" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getReceivers()" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getTransceivers()" with the proper type assert_inherits: property "getTransceivers" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTrack(MediaStreamTrack, MediaStream)" with the proper type
-PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack, MediaStream) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "removeTrack(RTCRtpSender)" with the proper type
-PASS RTCPeerConnection interface: calling removeTrack(RTCRtpSender) on new RTCPeerConnection() with too few arguments must throw TypeError
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTransceiver([object Object],[object Object], RTCRtpTransceiverInit)" with the proper type assert_inherits: property "addTransceiver" not found in prototype chain
-FAIL RTCPeerConnection interface: calling addTransceiver([object Object],[object Object], RTCRtpTransceiverInit) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "addTransceiver" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ontrack" with the proper type
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "sctp" with the proper type assert_inherits: property "sctp" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createDataChannel(USVString, RTCDataChannelInit)" with the proper type
-PASS RTCPeerConnection interface: calling createDataChannel(USVString, RTCDataChannelInit) on new RTCPeerConnection() with too few arguments must throw TypeError
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ondatachannel" with the proper type
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getStats(MediaStreamTrack)" with the proper type
-PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack) on new RTCPeerConnection() with too few arguments must throw TypeError
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setIdentityProvider(DOMString, RTCIdentityProviderOptions)" with the proper type assert_inherits: property "setIdentityProvider" not found in prototype chain
-FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString, RTCIdentityProviderOptions) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getIdentityAssertion()" with the proper type assert_inherits: property "getIdentityAssertion" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "peerIdentity" with the proper type assert_inherits: property "peerIdentity" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpLoginUrl" with the proper type assert_inherits: property "idpLoginUrl" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpErrorInfo" with the proper type assert_inherits: property "idpErrorInfo" not found in prototype chain
-PASS RTCSessionDescription interface: existence and properties of interface object
-FAIL RTCSessionDescription interface object length assert_equals: wrong value for RTCSessionDescription.length expected 1 but got 0
-PASS RTCSessionDescription interface object name
-PASS RTCSessionDescription interface: existence and properties of interface prototype object
-PASS RTCSessionDescription interface: existence and properties of interface prototype object's "constructor" property
-PASS RTCSessionDescription interface: existence and properties of interface prototype object's @@unscopables property
-FAIL RTCSessionDescription interface: attribute type assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }"
-PASS Unscopable handled correctly for type property on RTCSessionDescription
-FAIL RTCSessionDescription interface: attribute sdp assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }"
-PASS Unscopable handled correctly for sdp property on RTCSessionDescription
-PASS RTCSessionDescription interface: operation toJSON()
-PASS Unscopable handled correctly for toJSON() on RTCSessionDescription
-PASS RTCSessionDescription must be primary interface of new RTCSessionDescription({ type: 'offer' })
-PASS Stringification of new RTCSessionDescription({ type: 'offer' })
-PASS RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "type" with the proper type
-FAIL RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "sdp" with the proper type assert_equals: expected "string" but got "object"
-PASS RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "toJSON()" with the proper type
-FAIL Test default toJSON operation of RTCSessionDescription assert_equals: expected "string" but got "object"
-PASS RTCIceCandidate interface: existence and properties of interface object
-FAIL RTCIceCandidate interface object length assert_equals: wrong value for RTCIceCandidate.length expected 0 but got 1
-PASS RTCIceCandidate interface object name
-PASS RTCIceCandidate interface: existence and properties of interface prototype object
-PASS RTCIceCandidate interface: existence and properties of interface prototype object's "constructor" property
-PASS RTCIceCandidate interface: existence and properties of interface prototype object's @@unscopables property
-FAIL RTCIceCandidate interface: attribute candidate assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }"
-PASS Unscopable handled correctly for candidate property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute sdpMid assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }"
-PASS Unscopable handled correctly for sdpMid property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute sdpMLineIndex assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }"
-PASS Unscopable handled correctly for sdpMLineIndex property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute foundation assert_true: The prototype object must have a property "foundation" expected true got false
-PASS Unscopable handled correctly for foundation property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute component assert_true: The prototype object must have a property "component" expected true got false
-PASS Unscopable handled correctly for component property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute priority assert_true: The prototype object must have a property "priority" expected true got false
-PASS Unscopable handled correctly for priority property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute ip assert_true: The prototype object must have a property "ip" expected true got false
-PASS Unscopable handled correctly for ip property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
-PASS Unscopable handled correctly for protocol property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
-PASS Unscopable handled correctly for port property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute type assert_true: The prototype object must have a property "type" expected true got false
-PASS Unscopable handled correctly for type property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute tcpType assert_true: The prototype object must have a property "tcpType" expected true got false
-PASS Unscopable handled correctly for tcpType property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute relatedAddress assert_true: The prototype object must have a property "relatedAddress" expected true got false
-PASS Unscopable handled correctly for relatedAddress property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute relatedPort assert_true: The prototype object must have a property "relatedPort" expected true got false
-PASS Unscopable handled correctly for relatedPort property on RTCIceCandidate
-FAIL RTCIceCandidate interface: attribute usernameFragment assert_true: The prototype object must have a property "usernameFragment" expected true got false
-PASS Unscopable handled correctly for usernameFragment property on RTCIceCandidate
-PASS RTCIceCandidate interface: operation toJSON()
-PASS Unscopable handled correctly for toJSON() on RTCIceCandidate
-FAIL RTCIceCandidate must be primary interface of new RTCIceCandidate({ sdpMid: 1 }) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL Stringification of new RTCIceCandidate({ sdpMid: 1 }) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "candidate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMid" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMLineIndex" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "foundation" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "component" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "priority" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ip" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "protocol" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "port" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "tcpType" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedAddress" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedPort" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "usernameFragment" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "toJSON()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html
index e6e6846..2cb1ecfa 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html
@@ -107,13 +107,20 @@
       }));
   }
 
-  // Main function to do the IDL test, using fetched IDL text
-  function doIdlTest(idlText) {
+  promise_test(async t => {
+    await asyncInit();
+
     const idlArray = new IdlArray();
 
+    let webrtcIdl = fetch('/interfaces/webrtc-pc.idl').then(r => r.text());
+    let mediacaptureMainIdl = fetch('/interfaces/mediacapture-main.idl').then(r => r.text());
+
+    idlArray.add_untested_idls(mediacaptureMainIdl, { only: ['MediaStreamConstraints'] });
+    idlArray.add_idls(webrtcIdl);
+
     idlArray.add_untested_idls('interface EventHandler {};');
+    idlArray.add_idls('interface EventTarget {};');
     idlArray.add_idls('interface MediaStreamTrack : EventTarget {};');
-    idlArray.add_idls(idlText);
 
     idlArray.add_objects({
       'RTCPeerConnection': [`new RTCPeerConnection()`],
@@ -159,13 +166,6 @@
     });
 
     idlArray.test();
-  }
-
-  promise_test(t => {
-    return asyncInit()
-    .then(() => fetch('/interfaces/webrtc-pc.idl'))
-    .then(response => response.text())
-    .then(doIdlTest);
   }, 'Main test driver');
 
   /*
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
index a3b921c..5688fe7 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
@@ -1,78 +1,4 @@
 This is a testharness.js-based test.
-Found 74 tests; 70 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS webvtt interfaces.
-PASS VTTCue interface: existence and properties of interface object
-PASS VTTCue interface object length
-PASS VTTCue interface object name
-PASS VTTCue interface: existence and properties of interface prototype object
-PASS VTTCue interface: existence and properties of interface prototype object's "constructor" property
-PASS VTTCue interface: existence and properties of interface prototype object's @@unscopables property
-PASS VTTCue interface: attribute region
-PASS Unscopable handled correctly for region property on VTTCue
-PASS VTTCue interface: attribute vertical
-PASS Unscopable handled correctly for vertical property on VTTCue
-PASS VTTCue interface: attribute snapToLines
-PASS Unscopable handled correctly for snapToLines property on VTTCue
-PASS VTTCue interface: attribute line
-PASS Unscopable handled correctly for line property on VTTCue
-FAIL VTTCue interface: attribute lineAlign assert_true: The prototype object must have a property "lineAlign" expected true got false
-PASS Unscopable handled correctly for lineAlign property on VTTCue
-PASS VTTCue interface: attribute position
-PASS Unscopable handled correctly for position property on VTTCue
-FAIL VTTCue interface: attribute positionAlign assert_true: The prototype object must have a property "positionAlign" expected true got false
-PASS Unscopable handled correctly for positionAlign property on VTTCue
-PASS VTTCue interface: attribute size
-PASS Unscopable handled correctly for size property on VTTCue
-PASS VTTCue interface: attribute align
-PASS Unscopable handled correctly for align property on VTTCue
-PASS VTTCue interface: attribute text
-PASS Unscopable handled correctly for text property on VTTCue
-PASS VTTCue interface: operation getCueAsHTML()
-PASS Unscopable handled correctly for getCueAsHTML() on VTTCue
-PASS VTTCue must be primary interface of new VTTCue(0, 0, "")
-PASS Stringification of new VTTCue(0, 0, "")
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "region" with the proper type
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "vertical" with the proper type
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "snapToLines" with the proper type
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "line" with the proper type
-FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "lineAlign" with the proper type assert_inherits: property "lineAlign" not found in prototype chain
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "position" with the proper type
-FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "positionAlign" with the proper type assert_inherits: property "positionAlign" not found in prototype chain
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "size" with the proper type
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "align" with the proper type
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "text" with the proper type
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "getCueAsHTML()" with the proper type
-PASS VTTRegion interface: existence and properties of interface object
-PASS VTTRegion interface object length
-PASS VTTRegion interface object name
-PASS VTTRegion interface: existence and properties of interface prototype object
-PASS VTTRegion interface: existence and properties of interface prototype object's "constructor" property
-PASS VTTRegion interface: existence and properties of interface prototype object's @@unscopables property
-PASS VTTRegion interface: attribute id
-PASS Unscopable handled correctly for id property on VTTRegion
-PASS VTTRegion interface: attribute width
-PASS Unscopable handled correctly for width property on VTTRegion
-PASS VTTRegion interface: attribute lines
-PASS Unscopable handled correctly for lines property on VTTRegion
-PASS VTTRegion interface: attribute regionAnchorX
-PASS Unscopable handled correctly for regionAnchorX property on VTTRegion
-PASS VTTRegion interface: attribute regionAnchorY
-PASS Unscopable handled correctly for regionAnchorY property on VTTRegion
-PASS VTTRegion interface: attribute viewportAnchorX
-PASS Unscopable handled correctly for viewportAnchorX property on VTTRegion
-PASS VTTRegion interface: attribute viewportAnchorY
-PASS Unscopable handled correctly for viewportAnchorY property on VTTRegion
-PASS VTTRegion interface: attribute scroll
-PASS Unscopable handled correctly for scroll property on VTTRegion
-PASS VTTRegion must be primary interface of new VTTRegion()
-PASS Stringification of new VTTRegion()
-PASS VTTRegion interface: new VTTRegion() must inherit property "id" with the proper type
-PASS VTTRegion interface: new VTTRegion() must inherit property "width" with the proper type
-PASS VTTRegion interface: new VTTRegion() must inherit property "lines" with the proper type
-PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorX" with the proper type
-PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorY" with the proper type
-PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorX" with the proper type
-PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorY" with the proper type
-PASS VTTRegion interface: new VTTRegion() must inherit property "scroll" with the proper type
+FAIL webvtt interfaces. promise_test: Unhandled rejection with value: object "AddEventListenerOptions inherits EventListenerOptions, but AddEventListenerOptions is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt
index 44a3e5fe..f3a140a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt
@@ -1,211 +1,4 @@
 This is a testharness.js-based test.
-Found 207 tests; 195 PASS, 12 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS EventTarget interface: existence and properties of interface object
-PASS EventTarget interface object length
-PASS EventTarget interface object name
-PASS EventTarget interface: existence and properties of interface prototype object
-PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property
-PASS EventTarget interface: existence and properties of interface prototype object's @@unscopables property
-PASS EventTarget interface: operation addEventListener(DOMString, EventListener, [object Object],[object Object])
-PASS Unscopable handled correctly for addEventListener(DOMString, EventListener, [object Object],[object Object]) on EventTarget
-PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object])
-PASS Unscopable handled correctly for removeEventListener(DOMString, EventListener, [object Object],[object Object]) on EventTarget
-PASS EventTarget interface: operation dispatchEvent(Event)
-PASS Unscopable handled correctly for dispatchEvent(Event) on EventTarget
-PASS EventListener interface: existence and properties of interface object
-PASS WorkerGlobalScope interface: existence and properties of interface object
-PASS WorkerGlobalScope interface object length
-PASS WorkerGlobalScope interface object name
-PASS WorkerGlobalScope interface: existence and properties of interface prototype object
-PASS WorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property
-PASS WorkerGlobalScope interface: existence and properties of interface prototype object's @@unscopables property
-PASS WorkerGlobalScope interface: attribute self
-PASS Unscopable handled correctly for self property on WorkerGlobalScope
-PASS WorkerGlobalScope interface: attribute location
-PASS Unscopable handled correctly for location property on WorkerGlobalScope
-PASS WorkerGlobalScope interface: attribute navigator
-PASS Unscopable handled correctly for navigator property on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation importScripts(USVString)
-PASS Unscopable handled correctly for importScripts(USVString) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on WorkerGlobalScope
-FAIL WorkerGlobalScope interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
-PASS Unscopable handled correctly for onlanguagechange property on WorkerGlobalScope
-FAIL WorkerGlobalScope interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
-PASS Unscopable handled correctly for onoffline property on WorkerGlobalScope
-FAIL WorkerGlobalScope interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
-PASS Unscopable handled correctly for ononline property on WorkerGlobalScope
-PASS WorkerGlobalScope interface: attribute onrejectionhandled
-PASS Unscopable handled correctly for onrejectionhandled property on WorkerGlobalScope
-PASS WorkerGlobalScope interface: attribute onunhandledrejection
-PASS Unscopable handled correctly for onunhandledrejection property on WorkerGlobalScope
-PASS WorkerGlobalScope interface: attribute origin
-PASS Unscopable handled correctly for origin property on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation btoa(DOMString)
-PASS Unscopable handled correctly for btoa(DOMString) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation atob(DOMString)
-PASS Unscopable handled correctly for atob(DOMString) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler, long, any)
-PASS Unscopable handled correctly for setTimeout(TimerHandler, long, any) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation clearTimeout(long)
-PASS Unscopable handled correctly for clearTimeout(long) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation setInterval(TimerHandler, long, any)
-PASS Unscopable handled correctly for setInterval(TimerHandler, long, any) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation clearInterval(long)
-PASS Unscopable handled correctly for clearInterval(long) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions)
-PASS Unscopable handled correctly for createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on WorkerGlobalScope
-PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)
-PASS Unscopable handled correctly for createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on WorkerGlobalScope
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
-PASS DedicatedWorkerGlobalScope interface object length
-PASS DedicatedWorkerGlobalScope interface object name
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface prototype object
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface prototype object's @@unscopables property
-FAIL DedicatedWorkerGlobalScope interface: attribute name assert_own_property: The global object must have a property "name" expected property "name" missing
-PASS Unscopable handled correctly for name property on DedicatedWorkerGlobalScope
-PASS DedicatedWorkerGlobalScope interface: operation postMessage(any, [object Object])
-PASS Unscopable handled correctly for postMessage(any, [object Object]) on DedicatedWorkerGlobalScope
-PASS DedicatedWorkerGlobalScope interface: operation close()
-PASS Unscopable handled correctly for close() on DedicatedWorkerGlobalScope
-PASS DedicatedWorkerGlobalScope interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on DedicatedWorkerGlobalScope
-PASS DedicatedWorkerGlobalScope interface: attribute onmessageerror
-PASS Unscopable handled correctly for onmessageerror property on DedicatedWorkerGlobalScope
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw
-PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS DedicatedWorkerGlobalScope must be primary interface of self
-PASS Stringification of self
-FAIL DedicatedWorkerGlobalScope interface: self must inherit property "name" with the proper type assert_own_property: expected property "name" missing
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage(any, [object Object])" with the proper type
-PASS DedicatedWorkerGlobalScope interface: calling postMessage(any, [object Object]) on self with too few arguments must throw TypeError
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "close()" with the proper type
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type
-PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type
-PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type
-PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type
-PASS WorkerGlobalScope interface: self must inherit property "importScripts(USVString)" with the proper type
-PASS WorkerGlobalScope interface: calling importScripts(USVString) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type
-FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type assert_inherits: property "onlanguagechange" not found in prototype chain
-FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type assert_inherits: property "onoffline" not found in prototype chain
-FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type assert_inherits: property "ononline" not found in prototype chain
-PASS WorkerGlobalScope interface: self must inherit property "onrejectionhandled" with the proper type
-PASS WorkerGlobalScope interface: self must inherit property "onunhandledrejection" with the proper type
-PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type
-PASS WorkerGlobalScope interface: self must inherit property "btoa(DOMString)" with the proper type
-PASS WorkerGlobalScope interface: calling btoa(DOMString) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "atob(DOMString)" with the proper type
-PASS WorkerGlobalScope interface: calling atob(DOMString) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "setTimeout(TimerHandler, long, any)" with the proper type
-PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler, long, any) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "clearTimeout(long)" with the proper type
-PASS WorkerGlobalScope interface: calling clearTimeout(long) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "setInterval(TimerHandler, long, any)" with the proper type
-PASS WorkerGlobalScope interface: calling setInterval(TimerHandler, long, any) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "clearInterval(long)" with the proper type
-PASS WorkerGlobalScope interface: calling clearInterval(long) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type
-PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on self with too few arguments must throw TypeError
-PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type
-PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on self with too few arguments must throw TypeError
-PASS EventTarget interface: self must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type
-PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self with too few arguments must throw TypeError
-PASS EventTarget interface: self must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type
-PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self with too few arguments must throw TypeError
-PASS EventTarget interface: self must inherit property "dispatchEvent(Event)" with the proper type
-PASS EventTarget interface: calling dispatchEvent(Event) on self with too few arguments must throw TypeError
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS WorkerNavigator interface object length
-PASS WorkerNavigator interface object name
-PASS WorkerNavigator interface: existence and properties of interface prototype object
-PASS WorkerNavigator interface: existence and properties of interface prototype object's "constructor" property
-PASS WorkerNavigator interface: existence and properties of interface prototype object's @@unscopables property
-PASS WorkerNavigator interface: attribute appCodeName
-PASS Unscopable handled correctly for appCodeName property on WorkerNavigator
-PASS WorkerNavigator interface: attribute appName
-PASS Unscopable handled correctly for appName property on WorkerNavigator
-PASS WorkerNavigator interface: attribute appVersion
-PASS Unscopable handled correctly for appVersion property on WorkerNavigator
-PASS WorkerNavigator interface: attribute platform
-PASS Unscopable handled correctly for platform property on WorkerNavigator
-PASS WorkerNavigator interface: attribute product
-PASS Unscopable handled correctly for product property on WorkerNavigator
-PASS WorkerNavigator interface: member productSub
-PASS WorkerNavigator interface: attribute userAgent
-PASS Unscopable handled correctly for userAgent property on WorkerNavigator
-PASS WorkerNavigator interface: member vendor
-PASS WorkerNavigator interface: member vendorSub
-FAIL WorkerNavigator interface: attribute language assert_true: The prototype object must have a property "language" expected true got false
-PASS Unscopable handled correctly for language property on WorkerNavigator
-FAIL WorkerNavigator interface: attribute languages assert_true: The prototype object must have a property "languages" expected true got false
-PASS Unscopable handled correctly for languages property on WorkerNavigator
-PASS WorkerNavigator interface: attribute onLine
-PASS Unscopable handled correctly for onLine property on WorkerNavigator
-PASS WorkerNavigator interface: attribute hardwareConcurrency
-PASS Unscopable handled correctly for hardwareConcurrency property on WorkerNavigator
-PASS WorkerNavigator must be primary interface of self.navigator
-PASS Stringification of self.navigator
-PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type
-PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type
-PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type
-PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type
-PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type
-PASS WorkerNavigator interface: self.navigator must not have property "productSub"
-PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type
-PASS WorkerNavigator interface: self.navigator must not have property "vendor"
-PASS WorkerNavigator interface: self.navigator must not have property "vendorSub"
-FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type assert_inherits: property "language" not found in prototype chain
-FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type assert_inherits: property "languages" not found in prototype chain
-PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type
-PASS WorkerNavigator interface: self.navigator must inherit property "hardwareConcurrency" with the proper type
-PASS WorkerLocation interface: existence and properties of interface object
-PASS WorkerLocation interface object length
-PASS WorkerLocation interface object name
-PASS WorkerLocation interface: existence and properties of interface prototype object
-PASS WorkerLocation interface: existence and properties of interface prototype object's "constructor" property
-PASS WorkerLocation interface: existence and properties of interface prototype object's @@unscopables property
-PASS WorkerLocation interface: attribute href
-PASS Unscopable handled correctly for href property on WorkerLocation
-PASS WorkerLocation interface: stringifier
-PASS WorkerLocation interface: attribute origin
-PASS Unscopable handled correctly for origin property on WorkerLocation
-PASS WorkerLocation interface: attribute protocol
-PASS Unscopable handled correctly for protocol property on WorkerLocation
-PASS WorkerLocation interface: attribute host
-PASS Unscopable handled correctly for host property on WorkerLocation
-PASS WorkerLocation interface: attribute hostname
-PASS Unscopable handled correctly for hostname property on WorkerLocation
-PASS WorkerLocation interface: attribute port
-PASS Unscopable handled correctly for port property on WorkerLocation
-PASS WorkerLocation interface: attribute pathname
-PASS Unscopable handled correctly for pathname property on WorkerLocation
-PASS WorkerLocation interface: attribute search
-PASS Unscopable handled correctly for search property on WorkerLocation
-PASS WorkerLocation interface: attribute hash
-PASS Unscopable handled correctly for hash property on WorkerLocation
-PASS WorkerLocation must be primary interface of self.location
-PASS Stringification of self.location
-PASS WorkerLocation interface: self.location must inherit property "href" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "origin" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "protocol" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "host" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "hostname" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "port" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "pathname" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "search" with the proper type
-PASS WorkerLocation interface: self.location must inherit property "hash" with the proper type
+FAIL Untitled Uncaught AddEventListenerOptions inherits EventListenerOptions, but AddEventListenerOptions is not an interface.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/xhr/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/xhr/interfaces-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/xhr/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.png
index f51b87b..f54f855 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.txt
index 7763e421..747f393 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/unsupported-content/list-delete-001-expected.txt
@@ -13,17 +13,17 @@
 EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
 layer at (0,0) size 800x600
   LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x417
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x417
-    LayoutNGBlockFlow {BODY} at (8,8) size 784x401
+layer at (0,0) size 800x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
       LayoutNGBlockFlow {DIV} at (0,0) size 784x241 [border: (4px solid #0000FF)]
         LayoutNGBlockFlow {DIV} at (20,20) size 744x69
           LayoutText {#text} at (0,0) size 59x26
             text run at (0,0) width 59: "Tests:"
-          LayoutBR {BR} at (58,0) size 0x0
+          LayoutBR {BR} at (59,0) size 0x0
           LayoutText {#text} at (0,27) size 658x20
             text run at (0,27) width 658: "Our ability to \"edit around\" content the HTML editing code does not yet handle very well."
-          LayoutBR {BR} at (657,27) size 0x0
+          LayoutBR {BR} at (658,27) size 0x0
           LayoutInline {I} at (0,0) size 99x20
             LayoutText {#text} at (0,48) size 99x20
               text run at (0,48) width 99: "For this test: "
@@ -50,7 +50,7 @@
           text run at (2,2) width 107: "beforeafter"
       LayoutBlockFlow {DIV} at (0,293) size 784x108
         LayoutBlockFlow {DIV} at (0,0) size 784x108 [border: (2px solid #FF0000)]
-          LayoutNGBlockFlow (anonymous) at (2,2) size 780x28
+          LayoutNGBlockFlow (anonymous) at (2,2) size 765x28
             LayoutText {#text} at (0,0) size 62x27
               text run at (0,0) width 62: "before"
           LayoutBlockFlow {UL} at (2,54) size 780x28
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.png
new file mode 100644
index 0000000..791d401
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.txt
new file mode 100644
index 0000000..283edb1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.txt
@@ -0,0 +1,81 @@
+layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1162
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 785x1162 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 785x1162.31
+    LayoutNGBlockFlow {BODY} at (8,8) size 769x1124.31
+      LayoutNGBlockFlow {DIV} at (72.91,0) size 623.19x478 [border: (4px solid #000000)]
+        LayoutNGBlockFlow {P} at (4,20) size 615.19x36
+          LayoutText {#text} at (0,0) size 580x36
+            text run at (0,0) width 580: "Affected Browsers: Safari 2.0, Windows Internet Explorer 6"
+            text run at (0,18) width 30: "SP2"
+        LayoutNGBlockFlow {P} at (4,90) size 615.19x54
+          LayoutText {#text} at (0,0) size 610x54
+            text run at (0,0) width 610: "Bug Description: On the Affected Browsers, if a rule sets the"
+            text run at (0,18) width 540: "'background-color' of an element, this color cannot be"
+            text run at (0,36) width 480: "overridden by 'background:inherit' declarations."
+        LayoutNGBlockFlow {P} at (4,178) size 615.19x90
+          LayoutText {#text} at (0,0) size 600x54
+            text run at (0,0) width 600: "Example: With the following code, the background color of H1"
+            text run at (0,18) width 560: "elements stays pink, no matter what background color the"
+            text run at (0,36) width 130: "parents have:"
+          LayoutBR {BR} at (130,36) size 0x0
+          LayoutText {#text} at (0,54) size 320x18
+            text run at (0,54) width 320: "  H1 { background-color: pink; }"
+          LayoutBR {BR} at (320,54) size 0x0
+          LayoutText {#text} at (0,72) size 290x18
+            text run at (0,72) width 290: "  H1 { background: inherit; }"
+        LayoutNGBlockFlow {P} at (4,302) size 615.19x54
+          LayoutText {#text} at (0,0) size 610x54
+            text run at (0,0) width 610: "Work-around: The 'background-color' can only be overridden by"
+            text run at (0,18) width 600: "another 'background-color' declaration, or by a 'background'"
+            text run at (0,36) width 380: "declaration that does specify a color."
+        LayoutNGBlockFlow (anonymous) at (4,382) size 615.19x20
+          LayoutText {#text} at (0,0) size 401x19
+            text run at (0,0) width 401: "This is in contradiction with the CSS2 specification which says:"
+        LayoutNGBlockFlow {UL} at (4,418) size 615.19x40
+          LayoutNGListItem {LI} at (40,0) size 575.19x40
+            LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+              LayoutText (anonymous) at (0,0) size 10x19
+                text run at (0,0) width 10: "\x{2022} "
+            LayoutText {#text} at (0,0) size 29x19
+              text run at (0,0) width 29: "The "
+            LayoutInline {A} at (0,0) size 81x19 [color=#0000EE]
+              LayoutText {#text} at (29,0) size 81x19
+                text run at (29,0) width 81: "'background'"
+            LayoutText {#text} at (110,0) size 563x39
+              text run at (110,0) width 453: " property first sets all the individual background properties to their initial"
+              text run at (0,20) width 373: "values, then assigns explicit values given in the declaration."
+      LayoutNGBlockFlow {DIV} at (72.91,508) size 623.19x616.31 [color=#008000] [bgcolor=#90EE90] [border: (4px solid #008000)]
+        LayoutNGBlockFlow (anonymous) at (4,4) size 615.19x20
+          LayoutText {#text} at (0,0) size 219x19
+            text run at (0,0) width 219: "This DIV has a green background."
+        LayoutNGBlockFlow {H1} at (61.52,45.44) size 500.14x156 [border: (4px solid #008000)]
+          LayoutText {#text} at (4,4) size 445x147
+            text run at (4,4) width 441: "This header should have a green"
+            text run at (4,41) width 418: "background (not pink) but the"
+            text run at (4,78) width 445: "inline style rule is ignored on the"
+            text run at (4,115) width 258: "Affected Browsers."
+        LayoutNGBlockFlow (anonymous) at (4,231.44) size 615.19x20
+          LayoutText {#text} at (0,0) size 157x19
+            text run at (0,0) width 157: "The DIV continues here."
+        LayoutNGBlockFlow {H1} at (61.52,272.88) size 500.14x156 [border: (4px solid #008000)]
+          LayoutText {#text} at (4,4) size 449x147
+            text run at (4,4) width 441: "This header should have a green"
+            text run at (4,41) width 418: "background (not pink) but the"
+            text run at (4,78) width 449: "!important rule is ignored on the"
+            text run at (4,115) width 258: "Affected Browsers."
+        LayoutNGBlockFlow (anonymous) at (4,458.88) size 615.19x20
+          LayoutText {#text} at (0,0) size 157x19
+            text run at (0,0) width 157: "The DIV continues here."
+        LayoutNGBlockFlow {H1} at (61.52,500.31) size 500.14x82 [color=#FF0000] [bgcolor=#FFC0CB] [border: (4px solid #FF0000)]
+          LayoutText {#text} at (4,4) size 485x73
+            text run at (4,4) width 485: "This header has a pink background"
+            text run at (4,41) width 219: "and that's good."
+layer at (85,80) size 615x2 clip at (0,0) size 0x0
+  LayoutNGBlockFlow {HR} at (4,72) size 615.19x2 [border: (1px inset #EEEEEE)]
+layer at (85,168) size 615x2 clip at (0,0) size 0x0
+  LayoutNGBlockFlow {HR} at (4,160) size 615.19x2 [border: (1px inset #EEEEEE)]
+layer at (85,292) size 615x2 clip at (0,0) size 0x0
+  LayoutNGBlockFlow {HR} at (4,284) size 615.19x2 [border: (1px inset #EEEEEE)]
+layer at (85,380) size 615x2 clip at (0,0) size 0x0
+  LayoutNGBlockFlow {HR} at (4,372) size 615.19x2 [border: (1px inset #EEEEEE)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/repeat/noRepeatCorrectClip-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/repeat/noRepeatCorrectClip-expected.png
new file mode 100644
index 0000000..3580f278
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/repeat/noRepeatCorrectClip-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/repeat/noRepeatCorrectClip-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/repeat/noRepeatCorrectClip-expected.txt
new file mode 100644
index 0000000..9ce850f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/repeat/noRepeatCorrectClip-expected.txt
@@ -0,0 +1,10 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x576
+      LayoutNGBlockFlow {UL} at (0,0) size 784x20
+        LayoutNGListItem {LI} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-all-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-all-expected.png
new file mode 100644
index 0000000..8fa80012
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-all-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-border-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-border-expected.png
new file mode 100644
index 0000000..38e9b30
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-border-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-expected.png
new file mode 100644
index 0000000..669c25f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-padding-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-padding-expected.png
new file mode 100644
index 0000000..b2e15ca6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-padding-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-with-mask-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-with-mask-expected.png
new file mode 100644
index 0000000..6c7deffd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-with-mask-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-with-shadow-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-with-shadow-expected.png
new file mode 100644
index 0000000..20fca7c9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-canvas-with-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-expected.png
new file mode 100644
index 0000000..990bd0b0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-ratio-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-ratio-expected.png
new file mode 100644
index 0000000..2bbb587
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-ratio-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-shadow-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-shadow-expected.png
new file mode 100644
index 0000000..5a9c62e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/borders/border-radius-mask-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/doctypes/002-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/doctypes/002-expected.png
new file mode 100644
index 0000000..c3a11f1f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/doctypes/002-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/doctypes/002-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/doctypes/002-expected.txt
new file mode 100644
index 0000000..d95adaa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/doctypes/002-expected.txt
@@ -0,0 +1,23 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x180
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x180
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x156
+      LayoutNGBlockFlow {DIV} at (0,0) size 784x100
+      LayoutNGBlockFlow (anonymous) at (0,100) size 784x20
+        LayoutText {#text} at (0,0) size 487x19
+          text run at (0,0) width 487: "This file has a doc type with no public identifier. We should be in strict mode."
+      LayoutNGBlockFlow {UL} at (0,136) size 784x20
+        LayoutNGListItem {LI} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutNGBlockFlow {UL} at (0,0) size 744x20
+            LayoutNGListItem {LI} at (40,0) size 704x20
+              LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+                LayoutText (anonymous) at (0,0) size 10x19
+                  text run at (0,0) width 10: "\x{25E6} "
+              LayoutText {#text} at (0,0) size 251x19
+                text run at (0,0) width 251: "Both bullets should be on the same line."
+layer at (8,8) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (8,8) size 80x80 [bgcolor=#008000]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.png
new file mode 100644
index 0000000..e27f0808
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.txt
new file mode 100644
index 0000000..07d13c71
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.txt
@@ -0,0 +1,237 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x576
+      LayoutNGBlockFlow {H1} at (0,0) size 784x37
+        LayoutText {#text} at (0,0) size 359x36
+          text run at (0,0) width 359: "Meters with border values"
+      LayoutNGBlockFlow {UL} at (0,58.44) size 784x300
+        LayoutNGListItem {LI} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 164x19
+            text run at (0,0) width 164: "min,low,optimal,high,max"
+        LayoutNGListItem {LI} at (40,20) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {B} at (0,0) size 8x19
+            LayoutText {#text} at (0,0) size 8x19
+              text run at (0,0) width 8: "9"
+          LayoutText {#text} at (8,0) size 107x19
+            text run at (8,0) width 107: "|10,20,30,40,50: "
+          LayoutBlockFlow {METER} at (115,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,40) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (0,0) size 16x19
+              text run at (0,0) width 16: "10"
+          LayoutText {#text} at (16,0) size 88x19
+            text run at (16,0) width 88: ",20,30,40,50: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,60) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 20x19
+            text run at (0,0) width 20: "10,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (20,0) size 16x19
+              text run at (20,0) width 16: "20"
+          LayoutText {#text} at (36,0) size 68x19
+            text run at (36,0) width 68: ",30,40,50: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 20x16
+          LayoutText {#text} at (184,0) size 110x19
+            text run at (184,0) width 110: "(should be green)"
+        LayoutNGListItem {LI} at (40,80) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 40x19
+            text run at (0,0) width 40: "10,20,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (40,0) size 16x19
+              text run at (40,0) width 16: "30"
+          LayoutText {#text} at (56,0) size 48x19
+            text run at (56,0) width 48: ",40,50: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 40x16
+          LayoutText {#text} at (184,0) size 110x19
+            text run at (184,0) width 110: "(should be green)"
+        LayoutNGListItem {LI} at (40,100) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 60x19
+            text run at (0,0) width 60: "10,20,30,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (60,0) size 16x19
+              text run at (60,0) width 16: "40"
+          LayoutText {#text} at (76,0) size 28x19
+            text run at (76,0) width 28: ",50: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 60x16
+          LayoutText {#text} at (184,0) size 110x19
+            text run at (184,0) width 110: "(should be green)"
+        LayoutNGListItem {LI} at (40,120) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 80x19
+            text run at (0,0) width 80: "10,20,30,40,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (80,0) size 16x19
+              text run at (80,0) width 16: "50"
+          LayoutText {#text} at (96,0) size 8x19
+            text run at (96,0) width 8: ": "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
+          LayoutText {#text} at (184,0) size 118x19
+            text run at (184,0) width 118: "(should be yellow)"
+        LayoutNGListItem {LI} at (40,140) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 99x19
+            text run at (0,0) width 99: "10,20,30,40,50|"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (99,0) size 16x19
+              text run at (99,0) width 16: "51"
+          LayoutText {#text} at (115,0) size 8x19
+            text run at (115,0) width 8: ": "
+          LayoutBlockFlow {METER} at (123,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
+          LayoutText {#text} at (203,0) size 118x19
+            text run at (203,0) width 118: "(should be yellow)"
+        LayoutNGListItem {LI} at (40,160) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 20x19
+            text run at (0,0) width 20: "10,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (20,0) size 16x19
+              text run at (20,0) width 16: "10"
+          LayoutText {#text} at (36,0) size 68x19
+            text run at (36,0) width 68: ",30,40,50: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,180) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 60x19
+            text run at (0,0) width 60: "10,20,30,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (60,0) size 16x19
+              text run at (60,0) width 16: "40"
+          LayoutText {#text} at (76,0) size 28x19
+            text run at (76,0) width 28: ",40: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
+          LayoutText {#text} at (184,0) size 110x19
+            text run at (184,0) width 110: "(should be green)"
+        LayoutNGListItem {LI} at (40,200) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {B} at (0,0) size 8x19
+            LayoutText {#text} at (0,0) size 8x19
+              text run at (0,0) width 8: "9"
+          LayoutText {#text} at (8,0) size 107x19
+            text run at (8,0) width 107: "|10,10,10,20,30: "
+          LayoutBlockFlow {METER} at (115,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,220) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 40x19
+            text run at (0,0) width 40: "10,10,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (40,0) size 16x19
+              text run at (40,0) width 16: "10"
+          LayoutText {#text} at (56,0) size 48x19
+            text run at (56,0) width 48: ",20,30: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,240) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 40x19
+            text run at (0,0) width 40: "10,20,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (40,0) size 16x19
+              text run at (40,0) width 16: "30"
+          LayoutText {#text} at (56,0) size 48x19
+            text run at (56,0) width 48: ",30,30: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
+          LayoutText {#text} at (184,0) size 110x19
+            text run at (184,0) width 110: "(should be green)"
+        LayoutNGListItem {LI} at (40,260) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 99x19
+            text run at (0,0) width 99: "10,20,30,30,30|"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (99,0) size 16x19
+              text run at (99,0) width 16: "31"
+          LayoutText {#text} at (115,0) size 8x19
+            text run at (115,0) width 8: ": "
+          LayoutBlockFlow {METER} at (123,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
+          LayoutText {#text} at (203,0) size 110x19
+            text run at (203,0) width 110: "(should be green)"
+        LayoutNGListItem {LI} at (40,280) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 40x19
+            text run at (0,0) width 40: "10,20,"
+          LayoutInline {B} at (0,0) size 16x19
+            LayoutText {#text} at (40,0) size 16x19
+              text run at (40,0) width 16: "20"
+          LayoutText {#text} at (56,0) size 48x19
+            text run at (56,0) width 48: ",20,30: "
+          LayoutBlockFlow {METER} at (104,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 40x16
+          LayoutText {#text} at (184,0) size 110x19
+            text run at (184,0) width 110: "(should be green)"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-optimums-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-optimums-expected.png
new file mode 100644
index 0000000..4facfbf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-optimums-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-optimums-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-optimums-expected.txt
new file mode 100644
index 0000000..9d528401
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-optimums-expected.txt
@@ -0,0 +1,173 @@
+layer at (0,0) size 800x600 scrollHeight 603
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x603 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x602.88
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x578.88
+      LayoutNGBlockFlow {H1} at (0,0) size 784x37
+        LayoutText {#text} at (0,0) size 419x36
+          text run at (0,0) width 419: "Meters with various optimums"
+      LayoutNGBlockFlow {P} at (0,58.44) size 784x20
+        LayoutText {#text} at (0,0) size 261x19
+          text run at (0,0) width 261: "(min=0, max=1000, low=300, high=600)"
+      LayoutNGBlockFlow {H2} at (0,98.34) size 784x27
+        LayoutText {#text} at (0,0) size 143x26
+          text run at (0,0) width 143: "optimum=450"
+      LayoutNGBlockFlow {UL} at (0,145.25) size 784x100
+        LayoutNGListItem {LI} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=150: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 20x16
+        LayoutNGListItem {LI} at (40,20) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=450: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 36x16
+        LayoutNGListItem {LI} at (40,40) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=750: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 60x16
+        LayoutNGListItem {LI} at (40,60) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 59x19
+            text run at (0,0) width 59: "value=0: "
+          LayoutBlockFlow {METER} at (59,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,80) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 83x19
+            text run at (0,0) width 83: "value=1000: "
+          LayoutBlockFlow {METER} at (83,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
+      LayoutNGBlockFlow {H2} at (0,265.16) size 784x27
+        LayoutText {#text} at (0,0) size 143x26
+          text run at (0,0) width 143: "optimum=150"
+      LayoutNGBlockFlow {UL} at (0,312.06) size 784x100
+        LayoutNGListItem {LI} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=150: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 20x16
+        LayoutNGListItem {LI} at (40,20) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=450: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 36x16
+        LayoutNGListItem {LI} at (40,40) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=750: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 60x16
+        LayoutNGListItem {LI} at (40,60) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 59x19
+            text run at (0,0) width 59: "value=0: "
+          LayoutBlockFlow {METER} at (59,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,80) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 83x19
+            text run at (0,0) width 83: "value=1000: "
+          LayoutBlockFlow {METER} at (83,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
+      LayoutNGBlockFlow {H2} at (0,431.97) size 784x27
+        LayoutText {#text} at (0,0) size 143x26
+          text run at (0,0) width 143: "optimum=750"
+      LayoutNGBlockFlow {UL} at (0,478.88) size 784x100
+        LayoutNGListItem {LI} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=150: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 20x16
+        LayoutNGListItem {LI} at (40,20) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=450: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 36x16
+        LayoutNGListItem {LI} at (40,40) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 75x19
+            text run at (0,0) width 75: "value=750: "
+          LayoutBlockFlow {METER} at (75,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 60x16
+        LayoutNGListItem {LI} at (40,60) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 59x19
+            text run at (0,0) width 59: "value=0: "
+          LayoutBlockFlow {METER} at (59,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 0x16
+        LayoutNGListItem {LI} at (40,80) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 83x19
+            text run at (0,0) width 83: "value=1000: "
+          LayoutBlockFlow {METER} at (83,2.19) size 80x16
+            LayoutBlockFlow {DIV} at (0,0) size 80x16
+              LayoutBlockFlow {DIV} at (0,0) size 80x16
+                LayoutBlockFlow {DIV} at (0,0) size 80x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element-expected.png
new file mode 100644
index 0000000..fb3a2b5f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element-expected.txt
new file mode 100644
index 0000000..d88ccf4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element-expected.txt
@@ -0,0 +1,86 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x576
+      LayoutNGBlockFlow {UL} at (0,0) size 784x183.63
+        LayoutNGListItem {LI} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 88x19
+            text run at (0,0) width 88: "Default style: "
+          LayoutBlockFlow {PROGRESS} at (88,2.19) size 160x16
+            LayoutBlockFlow {DIV} at (0,0) size 160x16
+              LayoutBlockFlow {DIV} at (0,0) size 160x16 [bgcolor=#808080]
+                LayoutBlockFlow {DIV} at (0,0) size 16x16 [bgcolor=#008000]
+        LayoutNGListItem {LI} at (40,20) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 95x19
+            text run at (0,0) width 95: "Progress style: "
+          LayoutBlockFlow {PROGRESS} at (95,2.19) size 160x16 [bgcolor=#0000FF] [border: (3px solid #000066)]
+            LayoutBlockFlow {DIV} at (3,3) size 154x10
+              LayoutBlockFlow {DIV} at (0,0) size 154x10
+                LayoutBlockFlow {DIV} at (0,0) size 30.80x10 [bgcolor=#008000]
+        LayoutNGListItem {LI} at (40,40) size 744x31.81
+          LayoutNGListMarker (anonymous) at (-18,11.81) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,11) size 133x20
+            text run at (0,11) width 133: "Progress style (size): "
+          LayoutBlockFlow {PROGRESS} at (133,0) size 300x30
+            LayoutBlockFlow {DIV} at (0,0) size 300x30
+              LayoutBlockFlow {DIV} at (0,0) size 300x30 [bgcolor=#808080]
+                LayoutBlockFlow {DIV} at (0,0) size 90x30 [bgcolor=#008000]
+        LayoutNGListItem {LI} at (40,71.81) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 64x19
+            text run at (0,0) width 64: "Bar style: "
+          LayoutBlockFlow {PROGRESS} at (64,2.19) size 160x16
+            LayoutBlockFlow {DIV} at (0,0) size 160x16
+              LayoutBlockFlow {DIV} at (0,0) size 160x16 [bgcolor=#FF0000] [border: (3px solid #990000)]
+                LayoutBlockFlow {DIV} at (3,3) size 61.59x10 [bgcolor=#008000]
+        LayoutNGListItem {LI} at (40,91.81) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 77x19
+            text run at (0,0) width 77: "Value style: "
+          LayoutBlockFlow {PROGRESS} at (77,2.19) size 160x16
+            LayoutBlockFlow {DIV} at (0,0) size 160x16
+              LayoutBlockFlow {DIV} at (0,0) size 160x16 [bgcolor=#808080]
+                LayoutBlockFlow {DIV} at (0,0) size 80x16 [bgcolor=#FFFF00] [border: (3px solid #999900)]
+        LayoutNGListItem {LI} at (40,111.81) size 744x31.81
+          LayoutNGListMarker (anonymous) at (-18,11.81) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,11) size 188x20
+            text run at (0,11) width 188: "Styling for all three elements: "
+          LayoutBlockFlow {PROGRESS} at (188,0) size 160x30 [bgcolor=#0000FF] [border: (3px solid #000066)]
+            LayoutBlockFlow {DIV} at (3,3) size 154x24
+              LayoutBlockFlow {DIV} at (0,0) size 154x24 [bgcolor=#FF0000] [border: (3px solid #990000)]
+                LayoutBlockFlow {DIV} at (3,3) size 88.80x18 [bgcolor=#FFFF00] [border: (3px solid #999900)]
+        LayoutNGListItem {LI} at (40,143.63) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 230x19
+            text run at (0,0) width 230: "Removing appearance dynamically: "
+          LayoutProgress {PROGRESS} at (230,2.19) size 160x16
+            LayoutBlockFlow {DIV} at (0,0) size 160x16
+              LayoutBlockFlow {DIV} at (0,0) size 160x16 [bgcolor=#808080]
+                LayoutBlockFlow {DIV} at (0,0) size 112x16 [bgcolor=#008000]
+        LayoutNGListItem {LI} at (40,163.63) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 272x19
+            text run at (0,0) width 272: "Giving progress style change dynamically: "
+          LayoutBlockFlow {PROGRESS} at (272,2.19) size 160x16 [bgcolor=#ADD8E6]
+            LayoutBlockFlow {DIV} at (0,0) size 160x16
+              LayoutBlockFlow {DIV} at (0,0) size 160x16
+                LayoutBlockFlow {DIV} at (0,0) size 128x16 [bgcolor=#008000]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.png
new file mode 100644
index 0000000..46dcc873
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.txt
new file mode 100644
index 0000000..a2da0592f1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.txt
@@ -0,0 +1,46 @@
+layer at (0,0) size 800x600 scrollWidth 838
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
+      LayoutNGBlockFlow {H1} at (0,0) size 784x37
+        LayoutText {#text} at (0,0) size 195x36
+          text run at (0,0) width 195: "Cloning nodes"
+      LayoutNGBlockFlow {DIV} at (0,58.44) size 784x40 [bgcolor=#FFFF00] [border: (2px ridge #EEEEEE)]
+        LayoutInline {SPAN} at (0,0) size 828x35
+          LayoutText {#text} at (2,2) size 60x35
+            text run at (2,2) width 60: "Bold"
+          LayoutInline {SPAN} at (0,0) size 708x35
+            LayoutText {#text} at (62,2) size 205x35
+              text run at (62,2) width 205: "Bold+Underline"
+            LayoutInline {SPAN} at (0,0) size 281x34
+              LayoutText {#text} at (267,2) size 281x34
+                text run at (267,2) width 281: "Bold+Underline+Italic"
+            LayoutText {#text} at (548,2) size 222x35
+              text run at (548,2) width 222: "Bold+Uunderline"
+          LayoutText {#text} at (770,2) size 60x35
+            text run at (770,2) width 60: "Bold"
+        LayoutText {#text} at (0,0) size 0x0
+      LayoutNGBlockFlow (anonymous) at (0,98.44) size 784x20
+        LayoutText {#text} at (0,0) size 189x19
+          text run at (0,0) width 189: "Cloned Node with deep=false"
+      LayoutNGBlockFlow {DIV} at (0,118.44) size 784x39 [bgcolor=#FFFF00] [border: (2px ridge #EEEEEE)]
+        LayoutBR {BR} at (2,2) size 0x0
+      LayoutNGBlockFlow (anonymous) at (0,157.44) size 784x20
+        LayoutText {#text} at (0,0) size 184x19
+          text run at (0,0) width 184: "Cloned Node with deep=true"
+      LayoutNGBlockFlow {DIV} at (0,177.44) size 784x40 [bgcolor=#FFFF00] [border: (2px ridge #EEEEEE)]
+        LayoutInline {SPAN} at (0,0) size 828x35
+          LayoutText {#text} at (2,2) size 60x35
+            text run at (2,2) width 60: "Bold"
+          LayoutInline {SPAN} at (0,0) size 708x35
+            LayoutText {#text} at (62,2) size 205x35
+              text run at (62,2) width 205: "Bold+Underline"
+            LayoutInline {SPAN} at (0,0) size 281x34
+              LayoutText {#text} at (267,2) size 281x34
+                text run at (267,2) width 281: "Bold+Underline+Italic"
+            LayoutText {#text} at (548,2) size 222x35
+              text run at (548,2) width 222: "Bold+Uunderline"
+          LayoutText {#text} at (770,2) size 60x35
+            text run at (770,2) width 60: "Bold"
+        LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.png
new file mode 100644
index 0000000..d26363c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.txt
new file mode 100644
index 0000000..b138d3f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.txt
@@ -0,0 +1,195 @@
+layer at (0,0) size 800x600 scrollHeight 640
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x176
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x175.88
+    LayoutNGBlockFlow {BODY} at (8,21.44) size 784x138.44
+      LayoutNGBlockFlow {H1} at (0,0) size 784x37
+        LayoutText {#text} at (0,0) size 753x36
+          text run at (0,0) width 753: "Testing the values of 'pointer-events' on HTML content"
+      LayoutNGBlockFlow {P} at (0,58.44) size 784x80
+        LayoutText {#text} at (0,0) size 777x79
+          text run at (0,0) width 777: "This test is expected to be run from within DumpRenderTree. If running manually, click on the elements in the first column,"
+          text run at (0,20) width 766: "making sure the actual result (3rd column) matches the expected result (2nd column). Repeat for click target (4th column),"
+          text run at (0,40) width 776: "expected result (5th column) and actual result (6th column). Note: You should click on a yellow inline element if one exists,"
+          text run at (0,60) width 198: "otherwise anywhere in the box."
+layer at (10,140) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,140) size 300x100
+layer at (10,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,140) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 71x39
+      text run at (0,0) width 49: "pointer-"
+      text run at (0,20) width 71: "events auto"
+layer at (110,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p1"
+layer at (210,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p1"
+layer at (10,240) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,240) size 300x100
+layer at (10,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,240) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 75x39
+      text run at (0,0) width 49: "pointer-"
+      text run at (0,20) width 75: "events none"
+layer at (110,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (210,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (10,340) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,340) size 300x100
+layer at (10,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,340) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 71x39
+      text run at (0,0) width 57: "siblings -"
+      text run at (0,20) width 71: "auto on top"
+layer at (10,340) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80
+layer at (110,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p4"
+layer at (210,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p4"
+layer at (10,440) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,440) size 300x100
+layer at (10,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,440) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 75x39
+      text run at (0,0) width 57: "siblings -"
+      text run at (0,20) width 75: "none on top"
+layer at (10,440) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80
+layer at (110,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p5"
+layer at (210,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p5"
+layer at (10,540) size 300x100 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (10,540) size 300x100
+layer at (10,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 80x39
+      text run at (0,0) width 80: "nested - auto"
+      text run at (0,20) width 32: "outer"
+layer at (110,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p7"
+layer at (210,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p7"
+layer at (340,140) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,140) size 300x100
+layer at (340,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,140) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 67x39
+      text run at (0,0) width 49: "nested -"
+      text run at (0,20) width 67: "none outer"
+layer at (440,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p10"
+layer at (540,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p10"
+layer at (340,240) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,240) size 300x100
+layer at (340,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,240) size 80x80
+  LayoutImage (positioned) {IMG} at (0,0) size 80x80
+layer at (440,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p11"
+layer at (540,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p11"
+layer at (340,340) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,340) size 300x100
+layer at (340,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,340) size 80x80
+  LayoutImage (positioned) {IMG} at (0,0) size 80x80
+layer at (440,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (540,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (340,440) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,440) size 300x100
+layer at (340,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,440) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutInline {SPAN} at (0,0) size 35x19 [bgcolor=#FFFF00]
+      LayoutText {#text} at (0,0) size 35x19
+        text run at (0,0) width 35: "inline"
+    LayoutText {#text} at (35,0) size 74x59
+      text run at (35,0) width 25: " has"
+      text run at (0,20) width 74: "auto, parent"
+      text run at (0,40) width 31: "none"
+layer at (440,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p14"
+layer at (540,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p14"
+layer at (340,540) size 300x100 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (340,540) size 300x100
+layer at (340,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutInline {SPAN} at (0,0) size 35x19 [bgcolor=#FFFF00]
+      LayoutText {#text} at (0,0) size 35x19
+        text run at (0,0) width 35: "inline"
+    LayoutText {#text} at (35,0) size 78x59
+      text run at (35,0) width 25: " has"
+      text run at (0,20) width 78: "none, parent"
+      text run at (0,40) width 27: "auto"
+layer at (440,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p15"
+layer at (540,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p15"
+caret: position 1 of child 0 {#text} of child 0 {SPAN} of child 1 {P} of child 1 {DIV} of child 23 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.png
index 10626c3..cfb1a48 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt
index c8bbf4c..d552a0c 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt
@@ -73,10 +73,10 @@
       text run at (0,0) width 66: "placeholder"
 layer at (108,33) size 90x16
   LayoutBlockFlow {DIV} at (2,3) size 90x16
-layer at (206,33) size 150x16
-  LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#757575]
-    LayoutText {#text} at (0,0) size 105x16
-      text run at (0,0) width 105: "\x{65E5}\x{672C}\x{8A9E}placeholder"
+layer at (206,31) size 150x19 backgroundClip at (206,32) size 150x18 clip at (206,32) size 150x18
+  LayoutBlockFlow {DIV} at (2,1) size 150x19 [color=#757575]
+    LayoutText {#text} at (0,2) size 105x16
+      text run at (0,2) width 105: "\x{65E5}\x{672C}\x{8A9E}placeholder"
 layer at (206,33) size 150x16
   LayoutBlockFlow {DIV} at (2,3) size 150x16
 layer at (23,55) size 138x16
@@ -117,8 +117,8 @@
   LayoutBlockFlow {DIV} at (5,6) size 173x17
 layer at (10,259) size 150x25
   LayoutBlockFlow {DIV} at (2,3) size 150x25
-    LayoutText {#text} at (0,4) size 32x16
-      text run at (0,4) width 32: "Value"
+    LayoutText {#text} at (0,4) size 33x16
+      text run at (0,4) width 33: "Value"
 layer at (168,263) size 150x16
   LayoutBlockFlow {DIV} at (2,7) size 150x16 [color=#757575]
     LayoutText {#text} at (0,0) size 66x16
@@ -145,8 +145,8 @@
   LayoutBlockFlow {DIV} at (2,4.50) size 150x16
 layer at (10,315) size 150x16
   LayoutBlockFlow {DIV} at (2,3) size 150x16
-    LayoutText {#text} at (59,0) size 32x16
-      text run at (59,0) width 32: "Value"
+    LayoutText {#text} at (58,0) size 34x16
+      text run at (58,0) width 34: "Value"
 layer at (168,315) size 150x16
   LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#757575]
     LayoutText {#text} at (42,0) size 66x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.png
new file mode 100644
index 0000000..7a527a98
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.txt
new file mode 100644
index 0000000..86876db
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.txt
@@ -0,0 +1,26 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
+      LayoutNGBlockFlow (anonymous) at (0,0) size 784x20
+        LayoutText {#text} at (0,0) size 633x19
+          text run at (0,0) width 633: "The test passes if all four boxes have a radial gradient that's green in the center and black at the edge."
+      LayoutNGBlockFlow {H1} at (0,41.44) size 784x37
+        LayoutText {#text} at (0,0) size 724x36
+          text run at (0,0) width 724: "Radial Gradients With One Center, Inner Radius > 0"
+      LayoutNGBlockFlow (anonymous) at (0,99.88) size 784x155
+        LayoutNGBlockFlow {DIV} at (0,0) size 150x150
+        LayoutText {#text} at (150,135) size 4x19
+          text run at (150,135) width 4: " "
+        LayoutNGBlockFlow {DIV} at (154,0) size 150x150
+        LayoutText {#text} at (0,0) size 0x0
+      LayoutNGBlockFlow {H1} at (0,276.31) size 784x37
+        LayoutText {#text} at (0,0) size 642x36
+          text run at (0,0) width 642: "Radial Gradients With One, Inner Radius == 0"
+      LayoutNGBlockFlow (anonymous) at (0,334.75) size 784x155
+        LayoutNGBlockFlow {DIV} at (0,0) size 150x150
+        LayoutText {#text} at (150,135) size 4x19
+          text run at (150,135) width 4: " "
+        LayoutNGBlockFlow {DIV} at (154,0) size 150x150
+        LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/absolute-positioned-inline-in-centred-block-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/absolute-positioned-inline-in-centred-block-expected.png
new file mode 100644
index 0000000..0c5fc7e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/absolute-positioned-inline-in-centred-block-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.png
new file mode 100644
index 0000000..69bcd5a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.txt
new file mode 100644
index 0000000..35a73ee6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.txt
@@ -0,0 +1,62 @@
+layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 13.00 scrollHeight 664
+  LayoutView at (0,0) size 800x600
+layer at (0,-13) size 785x664 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 785x664
+    LayoutNGBlockFlow {BODY} at (8,8) size 769x636
+      LayoutNGBlockFlow {P} at (0,0) size 769x40
+        LayoutText {#text} at (0,0) size 51x19
+          text run at (0,0) width 51: "Test for "
+        LayoutInline {I} at (0,0) size 742x39
+          LayoutInline {A} at (0,0) size 301x19 [color=#0000EE]
+            LayoutText {#text} at (51,0) size 301x19
+              text run at (51,0) width 301: "http://bugs.webkit.org/show_bug.cgi?id=14875"
+          LayoutText {#text} at (352,0) size 742x39
+            text run at (352,0) width 390: " Textarea with nowrap - left/right nav, Up/down nav both hide"
+            text run at (0,20) width 22: "text"
+        LayoutText {#text} at (22,20) size 4x19
+          text run at (22,20) width 4: "."
+      LayoutNGBlockFlow {P} at (0,56) size 769x20
+        LayoutText {#text} at (0,0) size 455x19
+          text run at (0,0) width 455: "The letter A should be fully visible in each one of the eight boxes below."
+layer at (28,91) size 150x50 clip at (28,91) size 150x35 scrollX 50.00 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,96) size 150x50
+    LayoutBlockFlow {DIV} at (0,0) size 200x20
+      LayoutText {#text} at (188,0) size 12x19
+        text run at (188,0) width 12: "A"
+layer at (28,161) size 160x50 clip at (38,161) size 150x35 scrollX 50.00 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,166) size 160x50 [border: none (10px solid #000000)]
+    LayoutBlockFlow {DIV} at (10,0) size 200x20
+      LayoutText {#text} at (188,0) size 12x19
+        text run at (188,0) width 12: "A"
+layer at (28,231) size 160x50 clip at (28,231) size 150x35 scrollX 50.00 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,236) size 160x50 [border: none (10px solid #000000) none]
+    LayoutBlockFlow {DIV} at (0,0) size 200x20
+      LayoutText {#text} at (188,0) size 12x19
+        text run at (188,0) width 12: "A"
+layer at (28,301) size 150x50 clip at (28,301) size 135x35 scrollX 65.00 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,306) size 150x50
+    LayoutBlockFlow {DIV} at (0,0) size 200x20
+      LayoutText {#text} at (188,0) size 12x19
+        text run at (188,0) width 12: "A"
+layer at (28,371) size 150x50 clip at (28,371) size 150x35 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,376) size 150x50
+    LayoutBlockFlow {DIV} at (0,0) size 200x20
+      LayoutText {#text} at (0,0) size 12x19
+        text run at (0,0) width 12: "A"
+layer at (28,441) size 160x50 clip at (38,441) size 150x35 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,446) size 160x50 [border: none (10px solid #000000)]
+    LayoutBlockFlow {DIV} at (10,0) size 200x20
+      LayoutText {#text} at (0,0) size 12x19
+        text run at (0,0) width 12: "A"
+layer at (28,511) size 160x50 clip at (28,511) size 150x35 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,516) size 160x50 [border: none (10px solid #000000) none]
+    LayoutBlockFlow {DIV} at (0,0) size 200x20
+      LayoutText {#text} at (0,0) size 12x19
+        text run at (0,0) width 12: "A"
+layer at (28,581) size 150x50 backgroundClip at (28,581) size 150x19 clip at (28,581) size 135x19 scrollWidth 200
+  LayoutBlockFlow {DIV} at (20,586) size 150x50
+    LayoutBlockFlow {DIV} at (0,0) size 200x20
+      LayoutText {#text} at (0,0) size 12x19
+        text run at (0,0) width 12: "A"
+caret: position 13 of child 0 {#text} of child 1 {DIV} of child 19 {DIV} of body
+scrolled to 0,13
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/lists/002-vertical-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/lists/002-vertical-expected.png
new file mode 100644
index 0000000..e887785
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/lists/002-vertical-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/lists/005-vertical-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/lists/005-vertical-expected.png
new file mode 100644
index 0000000..48616f4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/lists/005-vertical-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/overflow/overflow-rtl-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/overflow/overflow-rtl-expected.png
new file mode 100644
index 0000000..56b55ca2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/overflow/overflow-rtl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/overflow/overflow-rtl-vertical-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/overflow/overflow-rtl-vertical-expected.png
new file mode 100644
index 0000000..1223c991
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/overflow/overflow-rtl-vertical-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/166-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/166-expected.png
new file mode 100644
index 0000000..dec9576
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/166-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/166-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/166-expected.txt
new file mode 100644
index 0000000..fc81e869
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/166-expected.txt
@@ -0,0 +1,1707 @@
+layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3662
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 785x3662 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
+  LayoutNGBlockFlow {HTML} at (0,0) size 785x3661.50
+    LayoutNGBlockFlow {BODY} at (8,21.44) size 769x3624.06
+      LayoutNGBlockFlow {H1} at (0,0) size 769x37
+        LayoutText {#text} at (0,0) size 244x36
+          text run at (0,0) width 244: "HTML Test Index"
+      LayoutNGBlockFlow {P} at (0,58.44) size 769x20
+        LayoutText {#text} at (0,0) size 310x19
+          text run at (0,0) width 310: "The HTML tests are available in several variants."
+      LayoutNGBlockFlow {H2} at (0,98.34) size 769x27
+        LayoutText {#text} at (0,0) size 277x26
+          text run at (0,0) width 277: "Tests With Navigation Aids"
+      LayoutNGBlockFlow {P} at (0,145.25) size 769x40
+        LayoutText {#text} at (0,0) size 769x39
+          text run at (0,0) width 769: "Each category of test is available using several different harnesses. The name of the harness describes how the test markup"
+          text run at (0,20) width 659: "is contained within it, for example the Xlink embed case uses an XLink with the show axis set to embed."
+      LayoutNGBlockFlow {UL} at (0,201.25) size 769x200
+        LayoutNGListItem {LI} at (40,0) size 729x40
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 21x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 21x19
+              text run at (0,0) width 21: "full"
+          LayoutText {#text} at (21,0) size 8x19
+            text run at (21,0) width 8: ": "
+          LayoutInline {A} at (0,0) size 94x19 [color=#0000EE]
+            LayoutText {#text} at (29,0) size 94x19
+              text run at (29,0) width 94: "Self Contained"
+          LayoutText {#text} at (123,0) size 8x19
+            text run at (123,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 120x19 [color=#0000EE]
+            LayoutText {#text} at (131,0) size 120x19
+              text run at (131,0) width 120: "XHTML <iframe>"
+          LayoutText {#text} at (251,0) size 8x19
+            text run at (251,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 118x19 [color=#0000EE]
+            LayoutText {#text} at (259,0) size 118x19
+              text run at (259,0) width 118: "XHTML <object>"
+          LayoutText {#text} at (377,0) size 8x19
+            text run at (377,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 116x19 [color=#0000EE]
+            LayoutText {#text} at (385,0) size 116x19
+              text run at (385,0) width 116: "XHTML <frame>"
+          LayoutText {#text} at (501,0) size 8x19
+            text run at (501,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 108x19 [color=#0000EE]
+            LayoutText {#text} at (509,0) size 108x19
+              text run at (509,0) width 108: "HTML <iframe>"
+          LayoutText {#text} at (617,0) size 8x19
+            text run at (617,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 671x39 [color=#0000EE]
+            LayoutText {#text} at (625,0) size 671x39
+              text run at (625,0) width 46: "HTML"
+              text run at (0,20) width 56: "<object>"
+          LayoutText {#text} at (56,20) size 8x19
+            text run at (56,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 104x19 [color=#0000EE]
+            LayoutText {#text} at (64,20) size 104x19
+              text run at (64,20) width 104: "HTML <frame>"
+          LayoutText {#text} at (168,20) size 8x19
+            text run at (168,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 88x19 [color=#0000EE]
+            LayoutText {#text} at (176,20) size 88x19
+              text run at (176,20) width 88: "XLink embed"
+          LayoutText {#text} at (264,20) size 8x19
+            text run at (264,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 83x19 [color=#0000EE]
+            LayoutText {#text} at (272,20) size 83x19
+              text run at (272,20) width 83: "TNG Format"
+        LayoutNGListItem {LI} at (40,40) size 729x40
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 32x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 32x19
+              text run at (0,0) width 32: "static"
+          LayoutText {#text} at (32,0) size 8x19
+            text run at (32,0) width 8: ": "
+          LayoutInline {A} at (0,0) size 94x19 [color=#0000EE]
+            LayoutText {#text} at (40,0) size 94x19
+              text run at (40,0) width 94: "Self Contained"
+          LayoutText {#text} at (134,0) size 8x19
+            text run at (134,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 120x19 [color=#0000EE]
+            LayoutText {#text} at (142,0) size 120x19
+              text run at (142,0) width 120: "XHTML <iframe>"
+          LayoutText {#text} at (262,0) size 8x19
+            text run at (262,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 118x19 [color=#0000EE]
+            LayoutText {#text} at (270,0) size 118x19
+              text run at (270,0) width 118: "XHTML <object>"
+          LayoutText {#text} at (388,0) size 8x19
+            text run at (388,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 116x19 [color=#0000EE]
+            LayoutText {#text} at (396,0) size 116x19
+              text run at (396,0) width 116: "XHTML <frame>"
+          LayoutText {#text} at (512,0) size 8x19
+            text run at (512,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 108x19 [color=#0000EE]
+            LayoutText {#text} at (520,0) size 108x19
+              text run at (520,0) width 108: "HTML <iframe>"
+          LayoutText {#text} at (628,0) size 8x19
+            text run at (628,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 682x39 [color=#0000EE]
+            LayoutText {#text} at (636,0) size 682x39
+              text run at (636,0) width 46: "HTML"
+              text run at (0,20) width 56: "<object>"
+          LayoutText {#text} at (56,20) size 8x19
+            text run at (56,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 104x19 [color=#0000EE]
+            LayoutText {#text} at (64,20) size 104x19
+              text run at (64,20) width 104: "HTML <frame>"
+          LayoutText {#text} at (168,20) size 8x19
+            text run at (168,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 88x19 [color=#0000EE]
+            LayoutText {#text} at (176,20) size 88x19
+              text run at (176,20) width 88: "XLink embed"
+          LayoutText {#text} at (264,20) size 8x19
+            text run at (264,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 83x19 [color=#0000EE]
+            LayoutText {#text} at (272,20) size 83x19
+              text run at (272,20) width 83: "TNG Format"
+        LayoutNGListItem {LI} at (40,80) size 729x40
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 90x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 90x19
+              text run at (0,0) width 90: "history-related"
+          LayoutText {#text} at (90,0) size 8x19
+            text run at (90,0) width 8: ": "
+          LayoutInline {A} at (0,0) size 94x19 [color=#0000EE]
+            LayoutText {#text} at (98,0) size 94x19
+              text run at (98,0) width 94: "Self Contained"
+          LayoutText {#text} at (192,0) size 8x19
+            text run at (192,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 120x19 [color=#0000EE]
+            LayoutText {#text} at (200,0) size 120x19
+              text run at (200,0) width 120: "XHTML <iframe>"
+          LayoutText {#text} at (320,0) size 8x19
+            text run at (320,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 118x19 [color=#0000EE]
+            LayoutText {#text} at (328,0) size 118x19
+              text run at (328,0) width 118: "XHTML <object>"
+          LayoutText {#text} at (446,0) size 8x19
+            text run at (446,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 116x19 [color=#0000EE]
+            LayoutText {#text} at (454,0) size 116x19
+              text run at (454,0) width 116: "XHTML <frame>"
+          LayoutText {#text} at (570,0) size 8x19
+            text run at (570,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 108x19 [color=#0000EE]
+            LayoutText {#text} at (578,0) size 108x19
+              text run at (578,0) width 108: "HTML <iframe>"
+          LayoutText {#text} at (686,0) size 4x19
+            text run at (686,0) width 4: ","
+          LayoutInline {A} at (0,0) size 106x19 [color=#0000EE]
+            LayoutText {#text} at (0,20) size 106x19
+              text run at (0,20) width 106: "HTML <object>"
+          LayoutText {#text} at (106,20) size 8x19
+            text run at (106,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 104x19 [color=#0000EE]
+            LayoutText {#text} at (114,20) size 104x19
+              text run at (114,20) width 104: "HTML <frame>"
+          LayoutText {#text} at (218,20) size 8x19
+            text run at (218,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 88x19 [color=#0000EE]
+            LayoutText {#text} at (226,20) size 88x19
+              text run at (226,20) width 88: "XLink embed"
+          LayoutText {#text} at (314,20) size 8x19
+            text run at (314,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 83x19 [color=#0000EE]
+            LayoutText {#text} at (322,20) size 83x19
+              text run at (322,20) width 83: "TNG Format"
+        LayoutNGListItem {LI} at (40,120) size 729x40
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 65x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 65x19
+              text run at (0,0) width 65: "interactive"
+          LayoutText {#text} at (65,0) size 8x19
+            text run at (65,0) width 8: ": "
+          LayoutInline {A} at (0,0) size 94x19 [color=#0000EE]
+            LayoutText {#text} at (73,0) size 94x19
+              text run at (73,0) width 94: "Self Contained"
+          LayoutText {#text} at (167,0) size 8x19
+            text run at (167,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 120x19 [color=#0000EE]
+            LayoutText {#text} at (175,0) size 120x19
+              text run at (175,0) width 120: "XHTML <iframe>"
+          LayoutText {#text} at (295,0) size 8x19
+            text run at (295,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 118x19 [color=#0000EE]
+            LayoutText {#text} at (303,0) size 118x19
+              text run at (303,0) width 118: "XHTML <object>"
+          LayoutText {#text} at (421,0) size 8x19
+            text run at (421,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 116x19 [color=#0000EE]
+            LayoutText {#text} at (429,0) size 116x19
+              text run at (429,0) width 116: "XHTML <frame>"
+          LayoutText {#text} at (545,0) size 8x19
+            text run at (545,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 108x19 [color=#0000EE]
+            LayoutText {#text} at (553,0) size 108x19
+              text run at (553,0) width 108: "HTML <iframe>"
+          LayoutText {#text} at (661,0) size 8x19
+            text run at (661,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 715x39 [color=#0000EE]
+            LayoutText {#text} at (669,0) size 715x39
+              text run at (669,0) width 46: "HTML"
+              text run at (0,20) width 56: "<object>"
+          LayoutText {#text} at (56,20) size 8x19
+            text run at (56,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 104x19 [color=#0000EE]
+            LayoutText {#text} at (64,20) size 104x19
+              text run at (64,20) width 104: "HTML <frame>"
+          LayoutText {#text} at (168,20) size 8x19
+            text run at (168,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 88x19 [color=#0000EE]
+            LayoutText {#text} at (176,20) size 88x19
+              text run at (176,20) width 88: "XLink embed"
+          LayoutText {#text} at (264,20) size 8x19
+            text run at (264,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 83x19 [color=#0000EE]
+            LayoutText {#text} at (272,20) size 83x19
+              text run at (272,20) width 83: "TNG Format"
+        LayoutNGListItem {LI} at (40,160) size 729x40
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 54x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 54x19
+              text run at (0,0) width 54: "dynamic"
+          LayoutText {#text} at (54,0) size 8x19
+            text run at (54,0) width 8: ": "
+          LayoutInline {A} at (0,0) size 94x19 [color=#0000EE]
+            LayoutText {#text} at (62,0) size 94x19
+              text run at (62,0) width 94: "Self Contained"
+          LayoutText {#text} at (156,0) size 8x19
+            text run at (156,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 120x19 [color=#0000EE]
+            LayoutText {#text} at (164,0) size 120x19
+              text run at (164,0) width 120: "XHTML <iframe>"
+          LayoutText {#text} at (284,0) size 8x19
+            text run at (284,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 118x19 [color=#0000EE]
+            LayoutText {#text} at (292,0) size 118x19
+              text run at (292,0) width 118: "XHTML <object>"
+          LayoutText {#text} at (410,0) size 8x19
+            text run at (410,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 116x19 [color=#0000EE]
+            LayoutText {#text} at (418,0) size 116x19
+              text run at (418,0) width 116: "XHTML <frame>"
+          LayoutText {#text} at (534,0) size 8x19
+            text run at (534,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 108x19 [color=#0000EE]
+            LayoutText {#text} at (542,0) size 108x19
+              text run at (542,0) width 108: "HTML <iframe>"
+          LayoutText {#text} at (650,0) size 8x19
+            text run at (650,0) width 8: ", "
+          LayoutInline {A} at (0,0) size 704x39 [color=#0000EE]
+            LayoutText {#text} at (658,0) size 704x39
+              text run at (658,0) width 46: "HTML"
+              text run at (0,20) width 56: "<object>"
+          LayoutText {#text} at (56,20) size 8x19
+            text run at (56,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 104x19 [color=#0000EE]
+            LayoutText {#text} at (64,20) size 104x19
+              text run at (64,20) width 104: "HTML <frame>"
+          LayoutText {#text} at (168,20) size 8x19
+            text run at (168,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 88x19 [color=#0000EE]
+            LayoutText {#text} at (176,20) size 88x19
+              text run at (176,20) width 88: "XLink embed"
+          LayoutText {#text} at (264,20) size 8x19
+            text run at (264,20) width 8: ", "
+          LayoutInline {A} at (0,0) size 83x19 [color=#0000EE]
+            LayoutText {#text} at (272,20) size 83x19
+              text run at (272,20) width 83: "TNG Format"
+      LayoutNGBlockFlow {H2} at (0,421.16) size 769x27
+        LayoutText {#text} at (0,0) size 172x26
+          text run at (0,0) width 172: "Unadorned Tests"
+      LayoutNGBlockFlow {UL} at (0,468.06) size 769x3120
+        LayoutNGListItem {LI} at (40,0) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 122x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 122x19
+              text run at (0,0) width 122: "Groups of selectors"
+          LayoutText {#text} at (122,0) size 30x19
+            text run at (122,0) width 30: " (#1)"
+        LayoutNGListItem {LI} at (40,20) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 142x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 142x19
+              text run at (0,0) width 142: "Type element selectors"
+          LayoutText {#text} at (142,0) size 30x19
+            text run at (142,0) width 30: " (#2)"
+        LayoutNGListItem {LI} at (40,40) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 164x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 164x19
+              text run at (0,0) width 164: "Omitted universal selector"
+          LayoutText {#text} at (164,0) size 30x19
+            text run at (164,0) width 30: " (#4)"
+        LayoutNGListItem {LI} at (40,60) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 170x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 170x19
+              text run at (0,0) width 170: "Attribute existence selector"
+          LayoutText {#text} at (170,0) size 30x19
+            text run at (170,0) width 30: " (#5)"
+        LayoutNGListItem {LI} at (40,80) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 146x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 146x19
+              text run at (0,0) width 146: "Attribute value selector"
+          LayoutText {#text} at (146,0) size 30x19
+            text run at (146,0) width 30: " (#6)"
+        LayoutNGListItem {LI} at (40,100) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 178x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 178x19
+              text run at (0,0) width 178: "Attribute multivalue selector"
+          LayoutText {#text} at (178,0) size 30x19
+            text run at (178,0) width 30: " (#7)"
+        LayoutNGListItem {LI} at (40,120) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 178x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 178x19
+              text run at (0,0) width 178: "Attribute multivalue selector"
+          LayoutText {#text} at (178,0) size 38x19
+            text run at (178,0) width 38: " (#7b)"
+        LayoutNGListItem {LI} at (40,140) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 338x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 338x19
+              text run at (0,0) width 338: "Attribute value selectors (hyphen-separated attributes)"
+          LayoutText {#text} at (338,0) size 30x19
+            text run at (338,0) width 30: " (#8)"
+        LayoutNGListItem {LI} at (40,160) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 306x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 306x19
+              text run at (0,0) width 306: "Substring matching attribute selector (beginning)"
+          LayoutText {#text} at (306,0) size 30x19
+            text run at (306,0) width 30: " (#9)"
+        LayoutNGListItem {LI} at (40,180) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 266x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 266x19
+              text run at (0,0) width 266: "Substring matching attribute selector (end)"
+          LayoutText {#text} at (266,0) size 38x19
+            text run at (266,0) width 38: " (#10)"
+        LayoutNGListItem {LI} at (40,200) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 295x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 295x19
+              text run at (0,0) width 295: "Substring matching attribute selector (contains)"
+          LayoutText {#text} at (295,0) size 38x19
+            text run at (295,0) width 38: " (#11)"
+        LayoutNGListItem {LI} at (40,220) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 140x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 140x19
+              text run at (0,0) width 140: "Default attribute value"
+          LayoutText {#text} at (140,0) size 38x19
+            text run at (140,0) width 38: " (#12)"
+        LayoutNGListItem {LI} at (40,240) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 92x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 92x19
+              text run at (0,0) width 92: "Class selectors"
+          LayoutText {#text} at (92,0) size 38x19
+            text run at (92,0) width 38: " (#13)"
+        LayoutNGListItem {LI} at (40,260) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 178x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 178x19
+              text run at (0,0) width 178: "More than one class selector"
+          LayoutText {#text} at (178,0) size 38x19
+            text run at (178,0) width 38: " (#14)"
+        LayoutNGListItem {LI} at (40,280) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 75x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 75x19
+              text run at (0,0) width 75: "ID selectors"
+          LayoutText {#text} at (75,0) size 38x19
+            text run at (75,0) width 38: " (#15)"
+        LayoutNGListItem {LI} at (40,300) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 112x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 112x19
+              text run at (0,0) width 112: ":link pseudo-class"
+          LayoutText {#text} at (112,0) size 38x19
+            text run at (112,0) width 38: " (#16)"
+        LayoutNGListItem {LI} at (40,320) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 129x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 129x19
+              text run at (0,0) width 129: ":visited pseudo-class"
+          LayoutText {#text} at (129,0) size 38x19
+            text run at (129,0) width 38: " (#17)"
+        LayoutNGListItem {LI} at (40,340) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 124x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 124x19
+              text run at (0,0) width 124: ":hover pseudo-class"
+          LayoutText {#text} at (124,0) size 38x19
+            text run at (124,0) width 38: " (#18)"
+        LayoutNGListItem {LI} at (40,360) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 124x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 124x19
+              text run at (0,0) width 124: ":hover pseudo-class"
+          LayoutText {#text} at (124,0) size 46x19
+            text run at (124,0) width 46: " (#18b)"
+        LayoutNGListItem {LI} at (40,380) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 125x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 125x19
+              text run at (0,0) width 125: ":active pseudo-class"
+          LayoutText {#text} at (125,0) size 38x19
+            text run at (125,0) width 38: " (#19)"
+        LayoutNGListItem {LI} at (40,400) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 122x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 122x19
+              text run at (0,0) width 122: ":focus pseudo-class"
+          LayoutText {#text} at (122,0) size 38x19
+            text run at (122,0) width 38: " (#20)"
+        LayoutNGListItem {LI} at (40,420) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 123x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 123x19
+              text run at (0,0) width 123: ":target pseudo-class"
+          LayoutText {#text} at (123,0) size 38x19
+            text run at (123,0) width 38: " (#21)"
+        LayoutNGListItem {LI} at (40,440) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 123x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 123x19
+              text run at (0,0) width 123: ":target pseudo-class"
+          LayoutText {#text} at (123,0) size 46x19
+            text run at (123,0) width 46: " (#21b)"
+        LayoutNGListItem {LI} at (40,460) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 123x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 123x19
+              text run at (0,0) width 123: ":target pseudo-class"
+          LayoutText {#text} at (123,0) size 45x19
+            text run at (123,0) width 45: " (#21c)"
+        LayoutNGListItem {LI} at (40,480) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 125x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 125x19
+              text run at (0,0) width 125: ":lang() pseudo-class"
+          LayoutText {#text} at (125,0) size 38x19
+            text run at (125,0) width 38: " (#22)"
+        LayoutNGListItem {LI} at (40,500) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 137x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 137x19
+              text run at (0,0) width 137: ":enabled pseudo-class"
+          LayoutText {#text} at (137,0) size 38x19
+            text run at (137,0) width 38: " (#23)"
+        LayoutNGListItem {LI} at (40,520) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 140x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 140x19
+              text run at (0,0) width 140: ":disabled pseudo-class"
+          LayoutText {#text} at (140,0) size 38x19
+            text run at (140,0) width 38: " (#24)"
+        LayoutNGListItem {LI} at (40,540) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 140x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 140x19
+              text run at (0,0) width 140: ":checked pseudo-class"
+          LayoutText {#text} at (140,0) size 38x19
+            text run at (140,0) width 38: " (#25)"
+        LayoutNGListItem {LI} at (40,560) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 113x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 113x19
+              text run at (0,0) width 113: ":root pseudo-class"
+          LayoutText {#text} at (113,0) size 38x19
+            text run at (113,0) width 38: " (#27)"
+        LayoutNGListItem {LI} at (40,580) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 154x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 154x19
+              text run at (0,0) width 154: ":nth-child() pseudo-class"
+          LayoutText {#text} at (154,0) size 38x19
+            text run at (154,0) width 38: " (#28)"
+        LayoutNGListItem {LI} at (40,600) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 154x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 154x19
+              text run at (0,0) width 154: ":nth-child() pseudo-class"
+          LayoutText {#text} at (154,0) size 46x19
+            text run at (154,0) width 46: " (#28b)"
+        LayoutNGListItem {LI} at (40,620) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 180x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 180x19
+              text run at (0,0) width 180: ":nth-last-child() pseudo-class"
+          LayoutText {#text} at (180,0) size 38x19
+            text run at (180,0) width 38: " (#29)"
+        LayoutNGListItem {LI} at (40,640) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 180x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 180x19
+              text run at (0,0) width 180: ":nth-last-child() pseudo-class"
+          LayoutText {#text} at (180,0) size 46x19
+            text run at (180,0) width 46: " (#29b)"
+        LayoutNGListItem {LI} at (40,660) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 168x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 168x19
+              text run at (0,0) width 168: ":nth-of-type() pseudo-class"
+          LayoutText {#text} at (168,0) size 38x19
+            text run at (168,0) width 38: " (#30)"
+        LayoutNGListItem {LI} at (40,680) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 194x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 194x19
+              text run at (0,0) width 194: ":nth-last-of-type() pseudo-class"
+          LayoutText {#text} at (194,0) size 38x19
+            text run at (194,0) width 38: " (#31)"
+        LayoutNGListItem {LI} at (40,700) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 148x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 148x19
+              text run at (0,0) width 148: ":first-child pseudo-class"
+          LayoutText {#text} at (148,0) size 38x19
+            text run at (148,0) width 38: " (#32)"
+        LayoutNGListItem {LI} at (40,720) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 145x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 145x19
+              text run at (0,0) width 145: ":last-child pseudo-class"
+          LayoutText {#text} at (145,0) size 38x19
+            text run at (145,0) width 38: " (#33)"
+        LayoutNGListItem {LI} at (40,740) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 162x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 162x19
+              text run at (0,0) width 162: ":first-of-type pseudo-class"
+          LayoutText {#text} at (162,0) size 38x19
+            text run at (162,0) width 38: " (#34)"
+        LayoutNGListItem {LI} at (40,760) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 159x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 159x19
+              text run at (0,0) width 159: ":last-of-type pseudo-class"
+          LayoutText {#text} at (159,0) size 38x19
+            text run at (159,0) width 38: " (#35)"
+        LayoutNGListItem {LI} at (40,780) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 152x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 152x19
+              text run at (0,0) width 152: ":only-child pseudo-class"
+          LayoutText {#text} at (152,0) size 38x19
+            text run at (152,0) width 38: " (#36)"
+        LayoutNGListItem {LI} at (40,800) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 166x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 166x19
+              text run at (0,0) width 166: ":only-of-type pseudo-class"
+          LayoutText {#text} at (166,0) size 38x19
+            text run at (166,0) width 38: " (#37)"
+        LayoutNGListItem {LI} at (40,820) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 163x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 163x19
+              text run at (0,0) width 163: "::first-line pseudo-element"
+          LayoutText {#text} at (163,0) size 38x19
+            text run at (163,0) width 38: " (#38)"
+        LayoutNGListItem {LI} at (40,840) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 171x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 171x19
+              text run at (0,0) width 171: "::first-letter pseudo-element"
+          LayoutText {#text} at (171,0) size 38x19
+            text run at (171,0) width 38: " (#39)"
+        LayoutNGListItem {LI} at (40,860) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 358x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 358x19
+              text run at (0,0) width 358: "::first-letter pseudo-element with ::before pseudo-element"
+          LayoutText {#text} at (358,0) size 45x19
+            text run at (358,0) width 45: " (#39a)"
+        LayoutNGListItem {LI} at (40,880) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 358x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 358x19
+              text run at (0,0) width 358: "::first-letter pseudo-element with ::before pseudo-element"
+          LayoutText {#text} at (358,0) size 45x19
+            text run at (358,0) width 45: " (#39a)"
+        LayoutNGListItem {LI} at (40,900) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 171x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 171x19
+              text run at (0,0) width 171: "::first-letter pseudo-element"
+          LayoutText {#text} at (171,0) size 46x19
+            text run at (171,0) width 46: " (#39b)"
+        LayoutNGListItem {LI} at (40,920) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 166x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 166x19
+              text run at (0,0) width 166: "::selection pseudo-element"
+          LayoutText {#text} at (166,0) size 38x19
+            text run at (166,0) width 38: " (#40)"
+        LayoutNGListItem {LI} at (40,940) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 151x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 151x19
+              text run at (0,0) width 151: "::before pseudo-element"
+          LayoutText {#text} at (151,0) size 38x19
+            text run at (151,0) width 38: " (#41)"
+        LayoutNGListItem {LI} at (40,960) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 139x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 139x19
+              text run at (0,0) width 139: "::after pseudo-element"
+          LayoutText {#text} at (139,0) size 38x19
+            text run at (139,0) width 38: " (#42)"
+        LayoutNGListItem {LI} at (40,980) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 149x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 149x19
+              text run at (0,0) width 149: "Descendant combinator"
+          LayoutText {#text} at (149,0) size 38x19
+            text run at (149,0) width 38: " (#43)"
+        LayoutNGListItem {LI} at (40,1000) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 149x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 149x19
+              text run at (0,0) width 149: "Descendant combinator"
+          LayoutText {#text} at (149,0) size 46x19
+            text run at (149,0) width 46: " (#43b)"
+        LayoutNGListItem {LI} at (40,1020) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 110x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 110x19
+              text run at (0,0) width 110: "Child combinator"
+          LayoutText {#text} at (110,0) size 38x19
+            text run at (110,0) width 38: " (#44)"
+        LayoutNGListItem {LI} at (40,1040) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 110x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 110x19
+              text run at (0,0) width 110: "Child combinator"
+          LayoutText {#text} at (110,0) size 46x19
+            text run at (110,0) width 46: " (#44b)"
+        LayoutNGListItem {LI} at (40,1060) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 184x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 184x19
+              text run at (0,0) width 184: "Child combinator and classes"
+          LayoutText {#text} at (184,0) size 45x19
+            text run at (184,0) width 45: " (#44c)"
+        LayoutNGListItem {LI} at (40,1080) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 168x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 168x19
+              text run at (0,0) width 168: "Child combinatior and IDs"
+          LayoutText {#text} at (168,0) size 46x19
+            text run at (168,0) width 46: " (#44d)"
+        LayoutNGListItem {LI} at (40,1100) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 170x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 170x19
+              text run at (0,0) width 170: "Direct adjacent combinator"
+          LayoutText {#text} at (170,0) size 38x19
+            text run at (170,0) width 38: " (#45)"
+        LayoutNGListItem {LI} at (40,1120) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 170x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 170x19
+              text run at (0,0) width 170: "Direct adjacent combinator"
+          LayoutText {#text} at (170,0) size 46x19
+            text run at (170,0) width 46: " (#45b)"
+        LayoutNGListItem {LI} at (40,1140) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 244x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 244x19
+              text run at (0,0) width 244: "Direct adjacent combinator and classes"
+          LayoutText {#text} at (244,0) size 45x19
+            text run at (244,0) width 45: " (#45c)"
+        LayoutNGListItem {LI} at (40,1160) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 179x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 179x19
+              text run at (0,0) width 179: "Indirect adjacent combinator"
+          LayoutText {#text} at (179,0) size 38x19
+            text run at (179,0) width 38: " (#46)"
+        LayoutNGListItem {LI} at (40,1180) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 179x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 179x19
+              text run at (0,0) width 179: "Indirect adjacent combinator"
+          LayoutText {#text} at (179,0) size 46x19
+            text run at (179,0) width 46: " (#46b)"
+        LayoutNGListItem {LI} at (40,1200) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 393x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 393x19
+              text run at (0,0) width 393: "NEGATED substring matching attribute selector on beginning"
+          LayoutText {#text} at (393,0) size 38x19
+            text run at (393,0) width 38: " (#54)"
+        LayoutNGListItem {LI} at (40,1220) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 353x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 353x19
+              text run at (0,0) width 353: "NEGATED substring matching attribute selector on end"
+          LayoutText {#text} at (353,0) size 38x19
+            text run at (353,0) width 38: " (#55)"
+        LayoutNGListItem {LI} at (40,1240) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 373x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 373x19
+              text run at (0,0) width 373: "NEGATED substring matching attribute selector on middle"
+          LayoutText {#text} at (373,0) size 38x19
+            text run at (373,0) width 38: " (#56)"
+        LayoutNGListItem {LI} at (40,1260) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 309x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 309x19
+              text run at (0,0) width 309: "Default attribute value and negation pseudo-class"
+          LayoutText {#text} at (309,0) size 38x19
+            text run at (309,0) width 38: " (#58)"
+        LayoutNGListItem {LI} at (40,1280) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 162x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 162x19
+              text run at (0,0) width 162: "NEGATED class selector"
+          LayoutText {#text} at (162,0) size 38x19
+            text run at (162,0) width 38: " (#59)"
+        LayoutNGListItem {LI} at (40,1300) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 149x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 149x19
+              text run at (0,0) width 149: "NEGATED ID selector"
+          LayoutText {#text} at (149,0) size 38x19
+            text run at (149,0) width 38: " (#60)"
+        LayoutNGListItem {LI} at (40,1320) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 192x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 192x19
+              text run at (0,0) width 192: "NEGATED :link pseudo-class"
+          LayoutText {#text} at (192,0) size 38x19
+            text run at (192,0) width 38: " (#61)"
+        LayoutNGListItem {LI} at (40,1340) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 209x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 209x19
+              text run at (0,0) width 209: "NEGATED :visited pseudo-class"
+          LayoutText {#text} at (209,0) size 38x19
+            text run at (209,0) width 38: " (#62)"
+        LayoutNGListItem {LI} at (40,1360) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 204x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 204x19
+              text run at (0,0) width 204: "NEGATED :hover pseudo-class"
+          LayoutText {#text} at (204,0) size 38x19
+            text run at (204,0) width 38: " (#63)"
+        LayoutNGListItem {LI} at (40,1380) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 205x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 205x19
+              text run at (0,0) width 205: "NEGATED :active pseudo-class"
+          LayoutText {#text} at (205,0) size 38x19
+            text run at (205,0) width 38: " (#64)"
+        LayoutNGListItem {LI} at (40,1400) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 202x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 202x19
+              text run at (0,0) width 202: "NEGATED :focus pseudo-class"
+          LayoutText {#text} at (202,0) size 38x19
+            text run at (202,0) width 38: " (#65)"
+        LayoutNGListItem {LI} at (40,1420) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 203x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 203x19
+              text run at (0,0) width 203: "NEGATED :target pseudo-class"
+          LayoutText {#text} at (203,0) size 38x19
+            text run at (203,0) width 38: " (#66)"
+        LayoutNGListItem {LI} at (40,1440) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 203x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 203x19
+              text run at (0,0) width 203: "NEGATED :target pseudo-class"
+          LayoutText {#text} at (203,0) size 46x19
+            text run at (203,0) width 46: " (#66b)"
+        LayoutNGListItem {LI} at (40,1460) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 205x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 205x19
+              text run at (0,0) width 205: "NEGATED :lang() pseudo-class"
+          LayoutText {#text} at (205,0) size 38x19
+            text run at (205,0) width 38: " (#67)"
+        LayoutNGListItem {LI} at (40,1480) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 220x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 220x19
+              text run at (0,0) width 220: "NEGATED :checked pseudo-class"
+          LayoutText {#text} at (220,0) size 38x19
+            text run at (220,0) width 38: " (#70)"
+        LayoutNGListItem {LI} at (40,1500) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 193x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 193x19
+              text run at (0,0) width 193: "NEGATED :root pseudo-class"
+          LayoutText {#text} at (193,0) size 38x19
+            text run at (193,0) width 38: " (#72)"
+        LayoutNGListItem {LI} at (40,1520) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 193x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 193x19
+              text run at (0,0) width 193: "NEGATED :root pseudo-class"
+          LayoutText {#text} at (193,0) size 46x19
+            text run at (193,0) width 46: " (#72b)"
+        LayoutNGListItem {LI} at (40,1540) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 234x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 234x19
+              text run at (0,0) width 234: "NEGATED :nth-child() pseudo-class"
+          LayoutText {#text} at (234,0) size 38x19
+            text run at (234,0) width 38: " (#73)"
+        LayoutNGListItem {LI} at (40,1560) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 234x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 234x19
+              text run at (0,0) width 234: "NEGATED :nth-child() pseudo-class"
+          LayoutText {#text} at (234,0) size 46x19
+            text run at (234,0) width 46: " (#73b)"
+        LayoutNGListItem {LI} at (40,1580) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 260x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 260x19
+              text run at (0,0) width 260: "NEGATED :nth-last-child() pseudo-class"
+          LayoutText {#text} at (260,0) size 38x19
+            text run at (260,0) width 38: " (#74)"
+        LayoutNGListItem {LI} at (40,1600) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 260x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 260x19
+              text run at (0,0) width 260: "NEGATED :nth-last-child() pseudo-class"
+          LayoutText {#text} at (260,0) size 46x19
+            text run at (260,0) width 46: " (#74b)"
+        LayoutNGListItem {LI} at (40,1620) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 248x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 248x19
+              text run at (0,0) width 248: "NEGATED :nth-of-type() pseudo-class"
+          LayoutText {#text} at (248,0) size 38x19
+            text run at (248,0) width 38: " (#75)"
+        LayoutNGListItem {LI} at (40,1640) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 248x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 248x19
+              text run at (0,0) width 248: "NEGATED :nth-of-type() pseudo-class"
+          LayoutText {#text} at (248,0) size 46x19
+            text run at (248,0) width 46: " (#75b)"
+        LayoutNGListItem {LI} at (40,1660) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 274x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 274x19
+              text run at (0,0) width 274: "NEGATED :nth-last-of-type() pseudo-class"
+          LayoutText {#text} at (274,0) size 38x19
+            text run at (274,0) width 38: " (#76)"
+        LayoutNGListItem {LI} at (40,1680) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 274x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 274x19
+              text run at (0,0) width 274: "NEGATED :nth-last-of-type() pseudo-class"
+          LayoutText {#text} at (274,0) size 46x19
+            text run at (274,0) width 46: " (#76b)"
+        LayoutNGListItem {LI} at (40,1700) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 228x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 228x19
+              text run at (0,0) width 228: "NEGATED :first-child pseudo-class"
+          LayoutText {#text} at (228,0) size 38x19
+            text run at (228,0) width 38: " (#77)"
+        LayoutNGListItem {LI} at (40,1720) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 228x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 228x19
+              text run at (0,0) width 228: "NEGATED :first-child pseudo-class"
+          LayoutText {#text} at (228,0) size 46x19
+            text run at (228,0) width 46: " (#77b)"
+        LayoutNGListItem {LI} at (40,1740) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 225x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 225x19
+              text run at (0,0) width 225: "NEGATED :last-child pseudo-class"
+          LayoutText {#text} at (225,0) size 38x19
+            text run at (225,0) width 38: " (#78)"
+        LayoutNGListItem {LI} at (40,1760) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 225x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 225x19
+              text run at (0,0) width 225: "NEGATED :last-child pseudo-class"
+          LayoutText {#text} at (225,0) size 46x19
+            text run at (225,0) width 46: " (#78b)"
+        LayoutNGListItem {LI} at (40,1780) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 242x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 242x19
+              text run at (0,0) width 242: "NEGATED :first-of-type pseudo-class"
+          LayoutText {#text} at (242,0) size 38x19
+            text run at (242,0) width 38: " (#79)"
+        LayoutNGListItem {LI} at (40,1800) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 239x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 239x19
+              text run at (0,0) width 239: "NEGATED :last-of-type pseudo-class"
+          LayoutText {#text} at (239,0) size 38x19
+            text run at (239,0) width 38: " (#80)"
+        LayoutNGListItem {LI} at (40,1820) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 232x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 232x19
+              text run at (0,0) width 232: "NEGATED :only-child pseudo-class"
+          LayoutText {#text} at (232,0) size 38x19
+            text run at (232,0) width 38: " (#81)"
+        LayoutNGListItem {LI} at (40,1840) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 232x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 232x19
+              text run at (0,0) width 232: "NEGATED :only-child pseudo-class"
+          LayoutText {#text} at (232,0) size 46x19
+            text run at (232,0) width 46: " (#81b)"
+        LayoutNGListItem {LI} at (40,1860) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 246x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 246x19
+              text run at (0,0) width 246: "NEGATED :only-of-type pseudo-class"
+          LayoutText {#text} at (246,0) size 38x19
+            text run at (246,0) width 38: " (#82)"
+        LayoutNGListItem {LI} at (40,1880) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 246x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 246x19
+              text run at (0,0) width 246: "NEGATED :only-of-type pseudo-class"
+          LayoutText {#text} at (246,0) size 46x19
+            text run at (246,0) width 46: " (#82b)"
+        LayoutNGListItem {LI} at (40,1900) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 340x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 340x19
+              text run at (0,0) width 340: "Negation pseudo-class cannot be an argument of itself"
+          LayoutText {#text} at (340,0) size 38x19
+            text run at (340,0) width 38: " (#83)"
+        LayoutNGListItem {LI} at (40,1920) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 150x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 150x19
+              text run at (0,0) width 150: ":contains() pseudo-class"
+          LayoutText {#text} at (150,0) size 38x19
+            text run at (150,0) width 38: " (#84)"
+        LayoutNGListItem {LI} at (40,1940) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 150x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 150x19
+              text run at (0,0) width 150: ":contains() pseudo-class"
+          LayoutText {#text} at (150,0) size 46x19
+            text run at (150,0) width 46: " (#84b)"
+        LayoutNGListItem {LI} at (40,1960) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 230x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 230x19
+              text run at (0,0) width 230: "NEGATED :contains() pseudo-class"
+          LayoutText {#text} at (230,0) size 38x19
+            text run at (230,0) width 38: " (#85)"
+        LayoutNGListItem {LI} at (40,1980) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 441x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 441x19
+              text run at (0,0) width 441: "Nondeterministic matching of direct and indirect adjacent combinators"
+          LayoutText {#text} at (441,0) size 38x19
+            text run at (441,0) width 38: " (#87)"
+        LayoutNGListItem {LI} at (40,2000) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 441x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 441x19
+              text run at (0,0) width 441: "Nondeterministic matching of direct and indirect adjacent combinators"
+          LayoutText {#text} at (441,0) size 46x19
+            text run at (441,0) width 46: " (#87b)"
+        LayoutNGListItem {LI} at (40,2020) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 464x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 464x19
+              text run at (0,0) width 464: "Nondeterministic matching of descendant and direct adjacent combinators"
+          LayoutText {#text} at (464,0) size 38x19
+            text run at (464,0) width 38: " (#88)"
+        LayoutNGListItem {LI} at (40,2040) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 464x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 464x19
+              text run at (0,0) width 464: "Nondeterministic matching of descendant and direct adjacent combinators"
+          LayoutText {#text} at (464,0) size 46x19
+            text run at (464,0) width 46: " (#88b)"
+        LayoutNGListItem {LI} at (40,2060) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 360x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 360x19
+              text run at (0,0) width 360: "Simple combination of descendant and child combinators"
+          LayoutText {#text} at (360,0) size 38x19
+            text run at (360,0) width 38: " (#89)"
+        LayoutNGListItem {LI} at (40,2080) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 397x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 397x19
+              text run at (0,0) width 397: "Simple combination of direct and indirect adjacent combinators"
+          LayoutText {#text} at (397,0) size 38x19
+            text run at (397,0) width 38: " (#90)"
+        LayoutNGListItem {LI} at (40,2100) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 397x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 397x19
+              text run at (0,0) width 397: "Simple combination of direct and indirect adjacent combinators"
+          LayoutText {#text} at (397,0) size 46x19
+            text run at (397,0) width 46: " (#90b)"
+        LayoutNGListItem {LI} at (40,2120) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 286x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 286x19
+              text run at (0,0) width 286: "NEGATED :enabled:disabled pseudo-classes"
+          LayoutText {#text} at (286,0) size 46x19
+            text run at (286,0) width 46: " (#144)"
+        LayoutNGListItem {LI} at (40,2140) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 181x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 181x19
+              text run at (0,0) width 181: ":empty pseudo-class and text"
+          LayoutText {#text} at (181,0) size 46x19
+            text run at (181,0) width 46: " (#148)"
+        LayoutNGListItem {LI} at (40,2160) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 256x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 256x19
+              text run at (0,0) width 256: ":empty pseudo-class and empty elements"
+          LayoutText {#text} at (256,0) size 46x19
+            text run at (256,0) width 46: " (#149)"
+        LayoutNGListItem {LI} at (40,2180) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 256x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 256x19
+              text run at (0,0) width 256: ":empty pseudo-class and empty elements"
+          LayoutText {#text} at (256,0) size 54x19
+            text run at (256,0) width 54: " (#149b)"
+        LayoutNGListItem {LI} at (40,2200) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 228x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 228x19
+              text run at (0,0) width 228: ":empty pseudo-class and whitespace"
+          LayoutText {#text} at (228,0) size 46x19
+            text run at (228,0) width 46: " (#151)"
+        LayoutNGListItem {LI} at (40,2220) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 213x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 213x19
+              text run at (0,0) width 213: ":empty pseudo-class and elements"
+          LayoutText {#text} at (213,0) size 46x19
+            text run at (213,0) width 46: " (#152)"
+        LayoutNGListItem {LI} at (40,2240) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 46x19
+            text run at (121,0) width 46: " (#154)"
+        LayoutNGListItem {LI} at (40,2260) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 46x19
+            text run at (121,0) width 46: " (#155)"
+        LayoutNGListItem {LI} at (40,2280) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 53x19
+            text run at (121,0) width 53: " (#155a)"
+        LayoutNGListItem {LI} at (40,2300) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 54x19
+            text run at (121,0) width 54: " (#155b)"
+        LayoutNGListItem {LI} at (40,2320) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 53x19
+            text run at (121,0) width 53: " (#155c)"
+        LayoutNGListItem {LI} at (40,2340) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 54x19
+            text run at (121,0) width 54: " (#155d)"
+        LayoutNGListItem {LI} at (40,2360) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 46x19
+            text run at (121,0) width 46: " (#156)"
+        LayoutNGListItem {LI} at (40,2380) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 54x19
+            text run at (121,0) width 54: " (#156b)"
+        LayoutNGListItem {LI} at (40,2400) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 53x19
+            text run at (121,0) width 53: " (#156c)"
+        LayoutNGListItem {LI} at (40,2420) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 46x19
+            text run at (121,0) width 46: " (#157)"
+        LayoutNGListItem {LI} at (40,2440) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 121x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 121x19
+              text run at (0,0) width 121: "Syntax and parsing"
+          LayoutText {#text} at (121,0) size 46x19
+            text run at (121,0) width 46: " (#158)"
+        LayoutNGListItem {LI} at (40,2460) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 278x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 278x19
+              text run at (0,0) width 278: "Syntax and parsing of new pseudo-elements"
+          LayoutText {#text} at (278,0) size 46x19
+            text run at (278,0) width 46: " (#159)"
+        LayoutNGListItem {LI} at (40,2480) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 299x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 299x19
+              text run at (0,0) width 299: "Syntax and parsing of unknown pseudo-classes"
+          LayoutText {#text} at (299,0) size 46x19
+            text run at (299,0) width 46: " (#160)"
+        LayoutNGListItem {LI} at (40,2500) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 435x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 435x19
+              text run at (0,0) width 435: "Syntax and parsing of unknown pseudo-classes and pseudo-elements"
+          LayoutText {#text} at (435,0) size 46x19
+            text run at (435,0) width 46: " (#161)"
+        LayoutNGListItem {LI} at (40,2520) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 136x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 136x19
+              text run at (0,0) width 136: "Contextual ::selection"
+          LayoutText {#text} at (136,0) size 46x19
+            text run at (136,0) width 46: " (#162)"
+        LayoutNGListItem {LI} at (40,2540) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 129x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 129x19
+              text run at (0,0) width 129: "Contextual :contains"
+          LayoutText {#text} at (129,0) size 46x19
+            text run at (129,0) width 46: " (#163)"
+        LayoutNGListItem {LI} at (40,2560) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 137x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 137x19
+              text run at (0,0) width 137: ":focus with ::selection"
+          LayoutText {#text} at (137,0) size 46x19
+            text run at (137,0) width 46: " (#164)"
+        LayoutNGListItem {LI} at (40,2580) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 139x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 139x19
+              text run at (0,0) width 139: ":hover with ::selection"
+          LayoutText {#text} at (139,0) size 46x19
+            text run at (139,0) width 46: " (#165)"
+        LayoutNGListItem {LI} at (40,2600) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 168x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 168x19
+              text run at (0,0) width 168: ":first-letter with ::first-letter"
+          LayoutText {#text} at (168,0) size 46x19
+            text run at (168,0) width 46: " (#166)"
+        LayoutNGListItem {LI} at (40,2620) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 168x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 168x19
+              text run at (0,0) width 168: ":first-letter with ::first-letter"
+          LayoutText {#text} at (168,0) size 53x19
+            text run at (168,0) width 53: " (#166a)"
+        LayoutNGListItem {LI} at (40,2640) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 152x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 152x19
+              text run at (0,0) width 152: ":first-line with ::first-line"
+          LayoutText {#text} at (152,0) size 46x19
+            text run at (152,0) width 46: " (#167)"
+        LayoutNGListItem {LI} at (40,2660) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 152x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 152x19
+              text run at (0,0) width 152: ":first-line with ::first-line"
+          LayoutText {#text} at (152,0) size 53x19
+            text run at (152,0) width 53: " (#167a)"
+        LayoutNGListItem {LI} at (40,2680) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 128x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 128x19
+              text run at (0,0) width 128: ":before with ::before"
+          LayoutText {#text} at (128,0) size 46x19
+            text run at (128,0) width 46: " (#168)"
+        LayoutNGListItem {LI} at (40,2700) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 128x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 128x19
+              text run at (0,0) width 128: ":before with ::before"
+          LayoutText {#text} at (128,0) size 53x19
+            text run at (128,0) width 53: " (#168a)"
+        LayoutNGListItem {LI} at (40,2720) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 104x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 104x19
+              text run at (0,0) width 104: ":after with ::after"
+          LayoutText {#text} at (104,0) size 46x19
+            text run at (104,0) width 46: " (#169)"
+        LayoutNGListItem {LI} at (40,2740) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 104x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 104x19
+              text run at (0,0) width 104: ":after with ::after"
+          LayoutText {#text} at (104,0) size 53x19
+            text run at (104,0) width 53: " (#169a)"
+        LayoutNGListItem {LI} at (40,2760) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 153x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 153x19
+              text run at (0,0) width 153: "Long chains of selectors"
+          LayoutText {#text} at (153,0) size 46x19
+            text run at (153,0) width 46: " (#170)"
+        LayoutNGListItem {LI} at (40,2780) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 153x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 153x19
+              text run at (0,0) width 153: "Long chains of selectors"
+          LayoutText {#text} at (153,0) size 53x19
+            text run at (153,0) width 53: " (#170a)"
+        LayoutNGListItem {LI} at (40,2800) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 153x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 153x19
+              text run at (0,0) width 153: "Long chains of selectors"
+          LayoutText {#text} at (153,0) size 54x19
+            text run at (153,0) width 54: " (#170b)"
+        LayoutNGListItem {LI} at (40,2820) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 153x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 153x19
+              text run at (0,0) width 153: "Long chains of selectors"
+          LayoutText {#text} at (153,0) size 53x19
+            text run at (153,0) width 53: " (#170c)"
+        LayoutNGListItem {LI} at (40,2840) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 153x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 153x19
+              text run at (0,0) width 153: "Long chains of selectors"
+          LayoutText {#text} at (153,0) size 54x19
+            text run at (153,0) width 54: " (#170d)"
+        LayoutNGListItem {LI} at (40,2860) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 176x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 176x19
+              text run at (0,0) width 176: "Parsing: Numbers in classes"
+          LayoutText {#text} at (176,0) size 53x19
+            text run at (176,0) width 53: " (#175a)"
+        LayoutNGListItem {LI} at (40,2880) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 176x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 176x19
+              text run at (0,0) width 176: "Parsing: Numbers in classes"
+          LayoutText {#text} at (176,0) size 54x19
+            text run at (176,0) width 54: " (#175b)"
+        LayoutNGListItem {LI} at (40,2900) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 176x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 176x19
+              text run at (0,0) width 176: "Parsing: Numbers in classes"
+          LayoutText {#text} at (176,0) size 53x19
+            text run at (176,0) width 53: " (#175c)"
+        LayoutNGListItem {LI} at (40,2920) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 261x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 261x19
+              text run at (0,0) width 261: "NEGATED Dynamic handling of :empty"
+          LayoutText {#text} at (261,0) size 38x19
+            text run at (261,0) width 38: " (#d1)"
+        LayoutNGListItem {LI} at (40,2940) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 261x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 261x19
+              text run at (0,0) width 261: "NEGATED Dynamic handling of :empty"
+          LayoutText {#text} at (261,0) size 46x19
+            text run at (261,0) width 46: " (#d1b)"
+        LayoutNGListItem {LI} at (40,2960) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 215x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 215x19
+              text run at (0,0) width 215: "Dynamic handling of combinators"
+          LayoutText {#text} at (215,0) size 38x19
+            text run at (215,0) width 38: " (#d2)"
+        LayoutNGListItem {LI} at (40,2980) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 294x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 294x19
+              text run at (0,0) width 294: "Dynamic updating of :first-child and :last-child"
+          LayoutText {#text} at (294,0) size 38x19
+            text run at (294,0) width 38: " (#d4)"
+        LayoutNGListItem {LI} at (40,3000) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 89x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 89x19
+              text run at (0,0) width 89: ":indeterminate"
+          LayoutText {#text} at (89,0) size 38x19
+            text run at (89,0) width 38: " (#d5)"
+        LayoutNGListItem {LI} at (40,3020) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 176x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 176x19
+              text run at (0,0) width 176: ":indeterminate and :checked"
+          LayoutText {#text} at (176,0) size 45x19
+            text run at (176,0) width 45: " (#d5a)"
+        LayoutNGListItem {LI} at (40,3040) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 256x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 256x19
+              text run at (0,0) width 256: "NEGATED :indeterminate and :checked"
+          LayoutText {#text} at (256,0) size 46x19
+            text run at (256,0) width 46: " (#d5b)"
+        LayoutNGListItem {LI} at (40,3060) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 176x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 176x19
+              text run at (0,0) width 176: ":indeterminate and :checked"
+          LayoutText {#text} at (176,0) size 45x19
+            text run at (176,0) width 45: " (#d5c)"
+        LayoutNGListItem {LI} at (40,3080) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 181x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 181x19
+              text run at (0,0) width 181: ":indeterminate with :checked"
+          LayoutText {#text} at (181,0) size 46x19
+            text run at (181,0) width 46: " (#d5d)"
+        LayoutNGListItem {LI} at (40,3100) size 729x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutInline {A} at (0,0) size 261x19 [color=#0000EE]
+            LayoutText {#text} at (0,0) size 261x19
+              text run at (0,0) width 261: "NEGATED :indeterminate with :checked"
+          LayoutText {#text} at (261,0) size 45x19
+            text run at (261,0) width 45: " (#d5e)"
+      LayoutNGBlockFlow {P} at (0,3604.06) size 769x20
+        LayoutText {#text} at (0,0) size 60x19
+          text run at (0,0) width 60: "See also: "
+        LayoutInline {A} at (0,0) size 36x19 [color=#0000EE]
+          LayoutText {#text} at (60,0) size 36x19
+            text run at (60,0) width 36: "Index"
+        LayoutText {#text} at (96,0) size 8x19
+          text run at (96,0) width 8: ", "
+        LayoutInline {A} at (0,0) size 58x19 [color=#0000EE]
+          LayoutText {#text} at (104,0) size 58x19
+            text run at (104,0) width 58: "XHTML"
+        LayoutText {#text} at (162,0) size 8x19
+          text run at (162,0) width 8: ", "
+        LayoutInline {A} at (0,0) size 36x19 [color=#0000EE]
+          LayoutText {#text} at (170,0) size 36x19
+            text run at (170,0) width 36: "XML"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/018-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/018-expected.png
new file mode 100644
index 0000000..fe18aca
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/018-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/040-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/040-expected.png
new file mode 100644
index 0000000..ec9ddac
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/040-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/040-vertical-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/040-vertical-expected.png
new file mode 100644
index 0000000..e235fe3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/040-vertical-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/absolute-table-at-bottom-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/absolute-table-at-bottom-expected.png
index 9ff2e98..e392b0f 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/absolute-table-at-bottom-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/absolute-table-at-bottom-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-expected.png
new file mode 100644
index 0000000..3612c72a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-column-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-column-expected.png
new file mode 100644
index 0000000..bdd35e9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-column-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-expected.png
new file mode 100644
index 0000000..f6b4148
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-expected.png
new file mode 100644
index 0000000..555b582
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-expected.png
new file mode 100644
index 0000000..cc1e7c3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-row-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-row-expected.png
new file mode 100644
index 0000000..6bd1d14
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-row-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-expected.png
new file mode 100644
index 0000000..4ab8b6c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-hide-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-hide-expected.png
new file mode 100644
index 0000000..8cf8285
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-hide-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-collapsed-border-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-collapsed-border-expected.png
new file mode 100644
index 0000000..0a84067
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-expected.png
new file mode 100644
index 0000000..0a84067
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-show-collapsed-border-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-show-collapsed-border-expected.png
new file mode 100644
index 0000000..01b7a43
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-show-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-show-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-show-expected.png
new file mode 100644
index 0000000..33f7e915
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_layers-show-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-expected.png
new file mode 100644
index 0000000..79ac159
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-column-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-column-expected.png
new file mode 100644
index 0000000..42dbf99
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-column-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-expected.png
new file mode 100644
index 0000000..e3e0769
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-expected.png
new file mode 100644
index 0000000..029c176a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-row-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-row-expected.png
new file mode 100644
index 0000000..9d6b30d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-row-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-expected.png
new file mode 100644
index 0000000..1749323
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-expected.png
new file mode 100644
index 0000000..790f46db
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-expected.png
new file mode 100644
index 0000000..760427f3d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-expected.png
new file mode 100644
index 0000000..39d8dd0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-expected.png
new file mode 100644
index 0000000..cd27c3e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-expected.png
new file mode 100644
index 0000000..702872c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-expected.png
new file mode 100644
index 0000000..ae657be
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/border-collapsing/border-collapsing-head-foot-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/border-collapsing/border-collapsing-head-foot-expected.png
index ea2f874..f07d81b5 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/border-collapsing/border-collapsing-head-foot-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/border-collapsing/border-collapsing-head-foot-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-2-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-2-expected.png
new file mode 100644
index 0000000..65173ee
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-3-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-3-expected.png
new file mode 100644
index 0000000..48a9a29
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-4-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-4-expected.png
new file mode 100644
index 0000000..65173ee
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-4-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/monospace-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/monospace-expected.png
new file mode 100644
index 0000000..4610aa27
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/monospace-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/sans-serif-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/sans-serif-expected.png
new file mode 100644
index 0000000..733379ca
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/sans-serif-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/serif-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/serif-expected.png
new file mode 100644
index 0000000..984c6d9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fonts/serif-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.png
new file mode 100644
index 0000000..a38502c0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.txt
new file mode 100644
index 0000000..1ada1b7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.txt
@@ -0,0 +1,25 @@
+
+GRAYSCALE
+
+ 
+NONE
+
+ 
+BRIGHTNESS
+
+ 
+SATURATION
+
+ 
+SEPIA
+
+ 
+BLUR
+
+ 
+OPACITY
+
+ 
+BLUR+HUE
+
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.png
new file mode 100644
index 0000000..ec42bc1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.txt
new file mode 100644
index 0000000..a01a30b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.txt
@@ -0,0 +1,532 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 353, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [100, 244, 321, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [56, 444, 313, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 305, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 300, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 285, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [194, 184, 227, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 212, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [176, 364, 137, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 134, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 108, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 87, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) DIV id='pinkFloat'",
+          "rect": [378, 138, 70, 30],
+          "reason": "incremental"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 383, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 42, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [151, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [349, 424, 20, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "VerticalScrollbar",
+          "rect": [485, 0, 15, 600],
+          "reason": "scroll control"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "VerticalScrollbar",
+      "reason": "scroll control"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) DIV id='pinkFloat'",
+      "reason": "incremental"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.png
new file mode 100644
index 0000000..7e23df1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.txt
new file mode 100644
index 0000000..e366611
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.txt
@@ -0,0 +1,518 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [56, 464, 313, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 444, 285, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 212, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 374, 48, 64],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 42, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [349, 444, 20, 14],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.png
new file mode 100644
index 0000000..1531eca
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.txt
new file mode 100644
index 0000000..8e5567f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.txt
@@ -0,0 +1,523 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 585, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 565, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 545, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 525, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 345, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 325, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 305, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 285, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 265, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 225, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 205, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 465, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 485, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 425, 305, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 365, 302, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 405, 300, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 445, 287, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 245, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 185, 218, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 245, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 505, 146, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [283, 185, 138, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 385, 84, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 445, 68, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 365, 49, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 404, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 364, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [235, 183, 46, 13],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "VerticalScrollbar",
+          "rect": [485, 0, 15, 600],
+          "reason": "scroll control"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "VerticalScrollbar",
+      "reason": "scroll control"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.png
new file mode 100644
index 0000000..12f271f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.txt
new file mode 100644
index 0000000..c12f852
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.txt
@@ -0,0 +1,527 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 339, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 338, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 295, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 289, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 229, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [242, 444, 67, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [356, 423, 64, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [362, 404, 59, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [307, 444, 47, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.png
new file mode 100644
index 0000000..9e7628d5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.txt
new file mode 100644
index 0000000..dae59e4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.txt
@@ -0,0 +1,504 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 73, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.png
new file mode 100644
index 0000000..1d308d7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.txt
new file mode 100644
index 0000000..8fde828
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.txt
@@ -0,0 +1,522 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [49, 424, 321, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [49, 364, 316, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [49, 404, 298, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 232, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [49, 384, 84, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 73, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [245, 444, 67, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [311, 444, 59, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [350, 404, 19, 14],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.png
new file mode 100644
index 0000000..c6ff39e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.txt
new file mode 100644
index 0000000..9d6adbcc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.txt
@@ -0,0 +1,518 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 363, 48, 65],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [27, 367, 22, 12],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.png
new file mode 100644
index 0000000..2eec62e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.txt
new file mode 100644
index 0000000..23d6cd89
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.txt
@@ -0,0 +1,504 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 280, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [298, 444, 72, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.png
new file mode 100644
index 0000000..c2d77af
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.txt
new file mode 100644
index 0000000..3cf60cf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.txt
@@ -0,0 +1,518 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 424, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 364, 315, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 404, 294, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 168, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [252, 444, 118, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [330, 364, 91, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [184, 444, 70, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [311, 404, 59, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 46, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 384, 45, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.png
new file mode 100644
index 0000000..c3cc278
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.txt
new file mode 100644
index 0000000..8ec4dcae
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.txt
@@ -0,0 +1,518 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 74, 418, 526],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 584, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 564, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 544, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 524, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 344, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 324, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 304, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 224, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 204, 406, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 364, 401, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 355, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 284, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 264, 355, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 484, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 164, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 144, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 124, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 104, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 84, 354, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [56, 464, 313, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 424, 305, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 364, 302, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 404, 300, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 444, 287, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 444, 285, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 223, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 184, 220, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 212, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 244, 194, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [243, 244, 178, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [211, 244, 158, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 504, 146, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [281, 184, 140, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 137, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [65, 384, 84, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [302, 444, 68, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [371, 364, 49, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 383, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "subtree"
+        },
+        {
+          "object": "LayoutNGBlockFlow (floating) SPAN id='yellowFloat'",
+          "rect": [372, 243, 48, 49],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [14, 464, 42, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [238, 184, 41, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [349, 444, 20, 14],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='yellowFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='blueFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutNGBlockFlow (floating) SPAN id='greenFloat'",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-expected.png
new file mode 100644
index 0000000..98b5c88
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-expected.txt
new file mode 100644
index 0000000..f4f0f28
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-expected.txt
@@ -0,0 +1,268 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 114, 784, 46],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 114, 784, 46],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 52, 784, 46],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 52, 784, 46],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [104, 59, 662, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [104, 59, 662, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [103, 121, 631, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [103, 121, 631, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [191, 20, 325, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [191, 20, 325, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 79, 315, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 79, 315, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [74, 20, 117, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [74, 20, 117, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutInline SPAN id='test'",
+          "rect": [5, 173, 95, 45],
+          "reason": "geometry"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 141, 93, 14],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 141, 93, 14],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' '",
+          "rect": [8, 176, 89, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum'",
+          "rect": [8, 176, 89, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'dolor sit amet\u00A0'",
+          "rect": [8, 176, 89, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' '",
+          "rect": [8, 176, 88, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum'",
+          "rect": [8, 176, 88, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'dolor\u00A0'",
+          "rect": [8, 176, 88, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 59, 88, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 59, 88, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 121, 87, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [11, 121, 87, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 20, 61, 11],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPaintFragment",
+          "rect": [8, 20, 61, 11],
+          "reason": "disappeared"
+        },
+        {
+          "object": "Caret",
+          "rect": [45, 196, 1, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "NGPaintFragment",
+      "reason": "subtree"
+    },
+    {
+      "object": "LayoutBlockFlow DIV",
+      "reason": "geometry"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "geometry"
+    },
+    {
+      "object": "Caret",
+      "reason": "caret"
+    },
+    {
+      "object": "LayoutInline SPAN id='test'",
+      "reason": "geometry"
+    },
+    {
+      "object": "InlineFlowBox",
+      "reason": "geometry"
+    },
+    {
+      "object": "InlineFlowBox",
+      "reason": "geometry"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'Lorem ipsum'",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox ' '",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'dolor\u00A0'",
+      "reason": "full"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
new file mode 100644
index 0000000..01b096aa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt
new file mode 100644
index 0000000..7cef0b9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt
@@ -0,0 +1,35 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "NGPaintFragment",
+          "rect": [528, 79, 63, 219],
+          "reason": "selection"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "NGPaintFragment",
+      "reason": "selection"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png
new file mode 100644
index 0000000..236b096
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
new file mode 100644
index 0000000..921f55a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.txt
new file mode 100644
index 0000000..1789c8c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.txt
@@ -0,0 +1,33 @@
+layer at (0,0) size 1600x1200
+  LayoutView at (0,0) size 1600x1200
+layer at (0,0) size 1600x356
+  LayoutNGBlockFlow {HTML} at (0,0) size 1600x356
+    LayoutNGBlockFlow {BODY} at (16,16) size 1568x324
+      LayoutNGBlockFlow (anonymous) at (0,0) size 1568x37
+        LayoutText {#text} at (0,0) size 59x36
+          text run at (0,0) width 59: "LTR"
+      LayoutNGBlockFlow (anonymous) at (0,81) size 1568x37
+        LayoutText {#text} at (0,0) size 59x36
+          text run at (0,0) width 59: "RTL"
+      LayoutNGBlockFlow (anonymous) at (0,162) size 1568x37
+        LayoutText {#text} at (0,0) size 368x36
+          text run at (0,0) width 368: "LTR (text-overflow:ellipses)"
+      LayoutNGBlockFlow (anonymous) at (0,243) size 1568x37
+        LayoutText {#text} at (0,0) size 366x36
+          text run at (0,0) width 366: "RTL (text-overflow:ellipses)"
+layer at (16,53) size 404x44 clip at (18,55) size 400x40 scrollWidth 452
+  LayoutBlockFlow {DIV} at (0,37) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (2,2) size 451x36
+      text run at (2,2) width 451: "the the adlj adaasj sdklj. there there"
+layer at (16,134) size 404x44 clip at (18,136) size 400x40 scrollX 51.00 scrollWidth 451
+  LayoutBlockFlow {DIV} at (0,118) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (-49,2) size 451x36
+      text run at (-49,2) width 451 RTL override: "the the adlj adaasj sdklj. there there"
+layer at (16,215) size 404x44 clip at (18,217) size 400x40 scrollWidth 452
+  LayoutBlockFlow {DIV} at (0,199) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (2,2) size 451x36
+      text run at (2,2) width 451: "the the adlj adaasj sdklj. there there"
+layer at (16,296) size 404x44 clip at (18,298) size 400x40 scrollX 51.00 scrollWidth 451
+  LayoutBlockFlow {DIV} at (0,280) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (-49,2) size 451x36
+      text run at (-49,2) width 451 RTL override: "the the adlj adaasj sdklj. there there"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.png
new file mode 100644
index 0000000..e31a0879
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.txt
new file mode 100644
index 0000000..1789c8c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.txt
@@ -0,0 +1,33 @@
+layer at (0,0) size 1600x1200
+  LayoutView at (0,0) size 1600x1200
+layer at (0,0) size 1600x356
+  LayoutNGBlockFlow {HTML} at (0,0) size 1600x356
+    LayoutNGBlockFlow {BODY} at (16,16) size 1568x324
+      LayoutNGBlockFlow (anonymous) at (0,0) size 1568x37
+        LayoutText {#text} at (0,0) size 59x36
+          text run at (0,0) width 59: "LTR"
+      LayoutNGBlockFlow (anonymous) at (0,81) size 1568x37
+        LayoutText {#text} at (0,0) size 59x36
+          text run at (0,0) width 59: "RTL"
+      LayoutNGBlockFlow (anonymous) at (0,162) size 1568x37
+        LayoutText {#text} at (0,0) size 368x36
+          text run at (0,0) width 368: "LTR (text-overflow:ellipses)"
+      LayoutNGBlockFlow (anonymous) at (0,243) size 1568x37
+        LayoutText {#text} at (0,0) size 366x36
+          text run at (0,0) width 366: "RTL (text-overflow:ellipses)"
+layer at (16,53) size 404x44 clip at (18,55) size 400x40 scrollWidth 452
+  LayoutBlockFlow {DIV} at (0,37) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (2,2) size 451x36
+      text run at (2,2) width 451: "the the adlj adaasj sdklj. there there"
+layer at (16,134) size 404x44 clip at (18,136) size 400x40 scrollX 51.00 scrollWidth 451
+  LayoutBlockFlow {DIV} at (0,118) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (-49,2) size 451x36
+      text run at (-49,2) width 451 RTL override: "the the adlj adaasj sdklj. there there"
+layer at (16,215) size 404x44 clip at (18,217) size 400x40 scrollWidth 452
+  LayoutBlockFlow {DIV} at (0,199) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (2,2) size 451x36
+      text run at (2,2) width 451: "the the adlj adaasj sdklj. there there"
+layer at (16,296) size 404x44 clip at (18,298) size 400x40 scrollX 51.00 scrollWidth 451
+  LayoutBlockFlow {DIV} at (0,280) size 404x44 [border: (2px solid #000000)]
+    LayoutText {#text} at (-49,2) size 451x36
+      text run at (-49,2) width 451 RTL override: "the the adlj adaasj sdklj. there there"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.png
new file mode 100644
index 0000000..48e77d6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.txt
new file mode 100644
index 0000000..5a08201b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.txt
@@ -0,0 +1,15 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x169
+  LayoutNGBlockFlow {html} at (0,0) size 800x169
+    LayoutNGBlockFlow {body} at (8,8) size 784x153
+      LayoutNGBlockFlow {div} at (0,0) size 784x48 [border: (4px dotted #000000)]
+        LayoutText {#text} at (4,4) size 432x19
+          text run at (4,4) width 432: "The SVG rect below this should have a solid red stroke and blue fill."
+        LayoutBR {br} at (436,4) size 0x0
+        LayoutText {#text} at (4,24) size 305x19
+          text run at (4,24) width 305: "https://bugs.webkit.org/show_bug.cgi?id=25738"
+      LayoutNGBlockFlow (anonymous) at (0,48) size 784x105
+        LayoutSVGRoot {svg} at (0,0) size 100x100
+          LayoutSVGRect {rect} at (0,0) size 100x100 [stroke={[type=SOLID] [color=#FF0000] [stroke width=5.00]}] [fill={[type=SOLID] [color=#0000FF]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
+        LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/object-sizing-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/object-sizing-expected.png
new file mode 100644
index 0000000..e8148798
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/object-sizing-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/object-sizing-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/object-sizing-expected.txt
new file mode 100644
index 0000000..c4dabe80
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/object-sizing-expected.txt
@@ -0,0 +1,49 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x400
+  LayoutNGBlockFlow {html} at (0,0) size 800x399.81
+    LayoutNGBlockFlow {body} at (8,8) size 784x375.81
+      LayoutNGBlockFlow {div} at (0,0) size 784x213 [bgcolor=#008000]
+        LayoutText {#text} at (0,0) size 0x0
+      LayoutNGBlockFlow {p} at (0,229) size 208x20 [bgcolor=#0000FF]
+        LayoutText {#text} at (0,0) size 12x19
+          text run at (0,0) width 12: "hi"
+      LayoutNGBlockFlow {h2} at (0,268.91) size 784x27
+        LayoutText {#text} at (0,0) size 169x26
+          text run at (0,0) width 169: "Expected results"
+      LayoutNGBlockFlow {ul} at (0,315.81) size 784x60
+        LayoutNGListItem {li} at (40,0) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 29x19
+            text run at (0,0) width 29: "The "
+          LayoutInline {code} at (0,0) size 24x16
+            LayoutText {#text} at (29,3) size 24x16
+              text run at (29,3) width 24: "div"
+          LayoutText {#text} at (53,0) size 242x19
+            text run at (53,0) width 242: " containing the object appears in green"
+        LayoutNGListItem {li} at (40,20) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 29x19
+            text run at (0,0) width 29: "The "
+          LayoutInline {code} at (0,0) size 48x16
+            LayoutText {#text} at (29,3) size 48x16
+              text run at (29,3) width 48: "object"
+          LayoutText {#text} at (77,0) size 270x19
+            text run at (77,0) width 270: " appears in orange. Its height is set at 13em"
+        LayoutNGListItem {li} at (40,40) size 744x20
+          LayoutNGListMarker (anonymous) at (-18,0) size 10x20
+            LayoutText (anonymous) at (0,0) size 10x19
+              text run at (0,0) width 10: "\x{2022} "
+          LayoutText {#text} at (0,0) size 171x19
+            text run at (0,0) width 171: "The blue line is 13em wide"
+layer at (8,8) size 208x208
+  LayoutEmbeddedObject {object} at (0,0) size 208x208 [bgcolor=#FFA500]
+    layer at (0,0) size 208x208
+      LayoutView at (0,0) size 208x208
+    layer at (0,0) size 208x208
+      LayoutSVGRoot {svg} at (0,0) size 208x208
+        LayoutSVGEllipse {circle} at (5,5) size 40x40 [fill={[type=SOLID] [color=#FF0000]}] [cx=25.00] [cy=25.00] [r=20.00]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.png
new file mode 100644
index 0000000..a23f0a25
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.txt
new file mode 100644
index 0000000..0df7ffc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.txt
@@ -0,0 +1,89 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x518
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x517.53
+layer at (173,32) size 454x454
+  LayoutNGBlockFlow (relative positioned) {BODY} at (173.23,32) size 453.53x453.53 [color=#FFFFFF] [bgcolor=#DD6600]
+    LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+      LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+        LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+    LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+      LayoutInline {SPAN} at (0,0) size 0x0
+    LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+      LayoutInline {SPAN} at (0,0) size 0x0
+    LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+      LayoutInline {SPAN} at (0,0) size 0x0
+    LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+      LayoutInline {SPAN} at (0,0) size 0x0
+    LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+      LayoutInline {SPAN} at (0,0) size 0x0
+    LayoutNGBlockFlow {DIV} at (0,0) size 453.53x0
+      LayoutInline {SPAN} at (0,0) size 0x0
+layer at (173,47) size 454x190
+  LayoutNGBlockFlow (positioned) {H1} at (0,15.11) size 453.53x190 [color=#DD9955]
+    LayoutInline {SPAN} at (0,0) size 341x190
+      LayoutText {#text} at (63,0) size 341x190
+        text run at (63,0) width 327: "CSS ZEN"
+        text run at (56,95) width 341: "GARDEN"
+layer at (173,119) size 454x22
+  LayoutNGBlockFlow (positioned) {H2} at (0,87.47) size 453.53x22 [color=#EEFF00]
+    LayoutInline {SPAN} at (0,0) size 210x21
+      LayoutText {#text} at (122,0) size 116x21
+        text run at (122,0) width 116: "The Beauty of "
+      LayoutInline {ACRONYM} at (0,0) size 36x21
+        LayoutText {#text} at (237,0) size 36x21
+          text run at (237,0) width 36: "CSS"
+      LayoutText {#text} at (272,0) size 60x21
+        text run at (272,0) width 60: " Design"
+layer at (173,351) size 454x135
+  LayoutNGBlockFlow (positioned) {DIV} at (0,319.34) size 453.53x134.19
+    LayoutNGBlockFlow (anonymous) at (11.70,0) size 430.13x126
+      LayoutInline {P} at (0,0) size 431x28
+        LayoutInline {SPAN} at (0,0) size 431x28
+          LayoutText {#text} at (0,0) size 431x28
+            text run at (0,0) width 431: "Littering a dark and dreary road lay the past relics of browser-"
+            text run at (0,14) width 197: "specific tags, incompatible "
+          LayoutInline {ACRONYM} at (0,0) size 32x14
+            LayoutText {#text} at (196,14) size 32x14
+              text run at (196,14) width 32: "DOM"
+          LayoutText {#text} at (227,14) size 112x14
+            text run at (227,14) width 112: "s, and broken "
+          LayoutInline {ACRONYM} at (0,0) size 28x14
+            LayoutText {#text} at (338,14) size 28x14
+              text run at (338,14) width 28: "CSS"
+          LayoutText {#text} at (365,14) size 66x14
+            text run at (365,14) width 66: " support."
+      LayoutText {#text} at (0,0) size 0x0
+      LayoutInline {P} at (0,0) size 431x42
+        LayoutInline {SPAN} at (0,0) size 431x42
+          LayoutText {#text} at (0,28) size 431x42
+            text run at (0,28) width 431: "Today, we must clear the mind of past practices. Web"
+            text run at (0,42) width 431: "enlightenment has been achieved thanks to the tireless efforts"
+            text run at (0,56) width 101: "of folk like the "
+          LayoutInline {ACRONYM} at (0,0) size 33x14
+            LayoutText {#text} at (100,56) size 33x14
+              text run at (100,56) width 33: "W3C"
+          LayoutText {#text} at (132,56) size 9x14
+            text run at (132,56) width 9: ", "
+          LayoutInline {ACRONYM} at (0,0) size 41x14
+            LayoutText {#text} at (140,56) size 41x14
+              text run at (140,56) width 41: "WaSP"
+          LayoutText {#text} at (180,56) size 222x14
+            text run at (180,56) width 222: " and the major browser creators."
+      LayoutText {#text} at (401,56) size 5x14
+        text run at (401,56) width 5: " "
+      LayoutInline {P} at (0,0) size 431x70
+        LayoutInline {SPAN} at (0,0) size 431x70
+          LayoutText {#text} at (405,56) size 431x70
+            text run at (405,56) width 26: "The"
+            text run at (0,70) width 431: "css Zen Garden invites you to relax and meditate on the"
+            text run at (0,84) width 431: "important lessons of the masters. Begin to see with clarity."
+            text run at (0,98) width 431: "Learn to use the (yet to be) time-honored techniques in new"
+            text run at (0,112) width 350: "and invigorating fashion. Become one with the web."
+      LayoutText {#text} at (0,0) size 0x0
+layer at (321,234) size 307x81
+  LayoutNGBlockFlow (positioned) {H3} at (147.42,-117.41) size 306.11x81.53 [color=#CCCC77] [bgcolor=#888811] [border: (3.77px solid #888811) none (3.77px solid #888811)]
+    LayoutInline {SPAN} at (0,0) size 278x84
+      LayoutText {#text} at (45,-1) size 278x84
+        text run at (45,-1) width 231: "The Road to"
+        text run at (3,35) width 278: "Enlightenment"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.png
new file mode 100644
index 0000000..c004767
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.txt
new file mode 100644
index 0000000..e02f4344
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.txt
@@ -0,0 +1,17 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x241
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x241
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x225
+      LayoutText {#text} at (0,0) size 319x19
+        text run at (0,0) width 319: "This test passes if there is an A and a green square."
+      LayoutBR {BR} at (319,0) size 0x0
+      LayoutSVGRoot {svg} at (0,20) size 200x200
+        LayoutSVGHiddenContainer {defs} at (0,0) size 0x0
+          LayoutSVGResourcePattern {pattern} [id="pattern"] [patternUnits=userSpaceOnUse] [patternContentUnits=userSpaceOnUse] [patternTransform={m=((10.00,0.00)(0.00,10.00)) t=(0.00,0.00)}]
+            LayoutSVGContainer {g} at (0,40) size 100x70 [transform={m=((0.10,0.00)(0.00,0.10)) t=(0.00,0.00)}]
+              LayoutSVGRect {rect} at (55,55) size 45x45 [fill={[type=SOLID] [color=#008000]}] [x=55.00] [y=55.00] [width=45.00] [height=45.00]
+              LayoutSVGText {text} at (0,40) size 50x70 contains 1 chunk(s)
+                LayoutSVGInlineText {#text} at (0,40) size 50x70
+                  chunk 1 text run 1 at (0.00,100.00) startOffset 0 endOffset 1 width 40.00: "A"
+        LayoutSVGRect {rect} at (0,0) size 400x200 [fill={[type=PATTERN] [id="pattern"]}] [x=0.00] [y=0.00] [width=400.00] [height=200.00]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384q-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384q-expected.png
new file mode 100644
index 0000000..7d6f40ac
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384q-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384s-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384s-expected.png
new file mode 100644
index 0000000..f6ed40b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384s-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020_iframe-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020_iframe-expected.png
new file mode 100644
index 0000000..7f48cfb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020_iframe-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug1318-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug1318-expected.png
new file mode 100644
index 0000000..3e4e69a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug1318-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug139524-2-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug139524-2-expected.png
new file mode 100644
index 0000000..7129f6c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug139524-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug17130-1-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug17130-1-expected.png
index bd5f5ac7..39d9b91 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug17130-1-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug17130-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-3-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-3-expected.png
new file mode 100644
index 0000000..6dfbf18
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-4-expected.png
new file mode 100644
index 0000000..c7aebbdf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2962-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2962-expected.png
new file mode 100644
index 0000000..25c6726
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug2962-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug38916-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug38916-expected.png
new file mode 100644
index 0000000..fe7c8ba
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug38916-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug4576-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug4576-expected.png
new file mode 100644
index 0000000..f47a005
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug4576-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-1-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-1-expected.png
new file mode 100644
index 0000000..1f73763
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-2-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-2-expected.png
new file mode 100644
index 0000000..75cf839
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46623-1-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46623-1-expected.png
new file mode 100644
index 0000000..d0eac1cd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46623-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46924-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46924-expected.png
new file mode 100644
index 0000000..4f2d4d1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug46924-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug4803-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug4803-expected.png
new file mode 100644
index 0000000..1b2d2b1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug4803-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-1-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-1-expected.png
new file mode 100644
index 0000000..0a6b7ef
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug9123-1-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug9123-1-expected.png
new file mode 100644
index 0000000..59dba5c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug9123-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/core/bloomberg-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/core/bloomberg-expected.png
new file mode 100644
index 0000000..8f9a33d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/core/bloomberg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/test3-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/test3-expected.png
new file mode 100644
index 0000000..c2deb1d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/test3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/test6-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/test6-expected.png
new file mode 100644
index 0000000..b7b5945
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/test6-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/wa_table_thtd_rowspan-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
new file mode 100644
index 0000000..8e77ab1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1128-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1128-expected.png
new file mode 100644
index 0000000..09cae5f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1128-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug32205-4-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug32205-4-expected.png
new file mode 100644
index 0000000..23e00d2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug32205-4-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug91057-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug91057-expected.png
new file mode 100644
index 0000000..33bc838b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug91057-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/backgr_fixed-bg-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/backgr_fixed-bg-expected.png
new file mode 100644
index 0000000..f003b15
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/backgr_fixed-bg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
new file mode 100644
index 0000000..e90e6bfe
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.txt
new file mode 100644
index 0000000..1ada1b7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.txt
@@ -0,0 +1,25 @@
+
+GRAYSCALE
+
+ 
+NONE
+
+ 
+BRIGHTNESS
+
+ 
+SATURATION
+
+ 
+SEPIA
+
+ 
+BLUR
+
+ 
+OPACITY
+
+ 
+BLUR+HUE
+
+
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.png
new file mode 100644
index 0000000..d26363c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.txt
new file mode 100644
index 0000000..b138d3f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.txt
@@ -0,0 +1,195 @@
+layer at (0,0) size 800x600 scrollHeight 640
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x176
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x175.88
+    LayoutNGBlockFlow {BODY} at (8,21.44) size 784x138.44
+      LayoutNGBlockFlow {H1} at (0,0) size 784x37
+        LayoutText {#text} at (0,0) size 753x36
+          text run at (0,0) width 753: "Testing the values of 'pointer-events' on HTML content"
+      LayoutNGBlockFlow {P} at (0,58.44) size 784x80
+        LayoutText {#text} at (0,0) size 777x79
+          text run at (0,0) width 777: "This test is expected to be run from within DumpRenderTree. If running manually, click on the elements in the first column,"
+          text run at (0,20) width 766: "making sure the actual result (3rd column) matches the expected result (2nd column). Repeat for click target (4th column),"
+          text run at (0,40) width 776: "expected result (5th column) and actual result (6th column). Note: You should click on a yellow inline element if one exists,"
+          text run at (0,60) width 198: "otherwise anywhere in the box."
+layer at (10,140) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,140) size 300x100
+layer at (10,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,140) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 71x39
+      text run at (0,0) width 49: "pointer-"
+      text run at (0,20) width 71: "events auto"
+layer at (110,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p1"
+layer at (210,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p1"
+layer at (10,240) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,240) size 300x100
+layer at (10,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,240) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 75x39
+      text run at (0,0) width 49: "pointer-"
+      text run at (0,20) width 75: "events none"
+layer at (110,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (210,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (10,340) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,340) size 300x100
+layer at (10,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,340) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 71x39
+      text run at (0,0) width 57: "siblings -"
+      text run at (0,20) width 71: "auto on top"
+layer at (10,340) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80
+layer at (110,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p4"
+layer at (210,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p4"
+layer at (10,440) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (10,440) size 300x100
+layer at (10,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,440) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 75x39
+      text run at (0,0) width 57: "siblings -"
+      text run at (0,20) width 75: "none on top"
+layer at (10,440) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80
+layer at (110,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p5"
+layer at (210,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p5"
+layer at (10,540) size 300x100 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (10,540) size 300x100
+layer at (10,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (10,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 80x39
+      text run at (0,0) width 80: "nested - auto"
+      text run at (0,20) width 32: "outer"
+layer at (110,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p7"
+layer at (210,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 16x19
+      text run at (0,0) width 16: "p7"
+layer at (340,140) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,140) size 300x100
+layer at (340,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,140) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutText {#text} at (0,0) size 67x39
+      text run at (0,0) width 49: "nested -"
+      text run at (0,20) width 67: "none outer"
+layer at (440,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p10"
+layer at (540,140) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p10"
+layer at (340,240) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,240) size 300x100
+layer at (340,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,240) size 80x80
+  LayoutImage (positioned) {IMG} at (0,0) size 80x80
+layer at (440,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p11"
+layer at (540,240) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p11"
+layer at (340,340) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,340) size 300x100
+layer at (340,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,340) size 80x80
+  LayoutImage (positioned) {IMG} at (0,0) size 80x80
+layer at (440,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (540,340) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 31x19
+      text run at (0,0) width 31: "none"
+layer at (340,440) size 300x100
+  LayoutNGBlockFlow (positioned) {DIV} at (340,440) size 300x100
+layer at (340,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,440) size 80x80
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutInline {SPAN} at (0,0) size 35x19 [bgcolor=#FFFF00]
+      LayoutText {#text} at (0,0) size 35x19
+        text run at (0,0) width 35: "inline"
+    LayoutText {#text} at (35,0) size 74x59
+      text run at (35,0) width 25: " has"
+      text run at (0,20) width 74: "auto, parent"
+      text run at (0,40) width 31: "none"
+layer at (440,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p14"
+layer at (540,440) size 80x80
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p14"
+layer at (340,540) size 300x100 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (340,540) size 300x100
+layer at (340,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 80x80
+layer at (340,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {P} at (0,0) size 80x80 [bgcolor=#808080]
+    LayoutInline {SPAN} at (0,0) size 35x19 [bgcolor=#FFFF00]
+      LayoutText {#text} at (0,0) size 35x19
+        text run at (0,0) width 35: "inline"
+    LayoutText {#text} at (35,0) size 78x59
+      text run at (35,0) width 25: " has"
+      text run at (0,20) width 78: "none, parent"
+      text run at (0,40) width 27: "auto"
+layer at (440,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (100,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p15"
+layer at (540,540) size 80x80 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
+  LayoutNGBlockFlow (positioned) {DIV} at (200,0) size 80x80
+    LayoutText {#text} at (0,0) size 24x19
+      text run at (0,0) width 24: "p15"
+caret: position 1 of child 0 {#text} of child 0 {SPAN} of child 1 {P} of child 1 {DIV} of child 23 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html
index c743e3c..d6db6f5 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html
@@ -124,6 +124,13 @@
       navigator.credentials.create({ publicKey : MAKE_CREDENTIAL_OPTIONS}));
 }, "Verify that not supported error returned by mock is properly handled.");
 
+promise_test(t => {
+  mockAuthenticator.setAuthenticatorStatus(
+      webauth.mojom.AuthenticatorStatus.INVALID_STATE);
+  return promise_rejects(t, "InvalidStateError",
+    navigator.credentials.create({ publicKey : MAKE_CREDENTIAL_OPTIONS}));
+}, "Verify that InvalidState (duplicate registration) returned by mock is properly handled.");
+
 promise_test(_ => {
   mockAuthenticator.reset();
   mockAuthenticator.setDefaultsForSuccessfulMakeCredential();
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/editor/text-editor-selection-to-search.js b/third_party/WebKit/LayoutTests/http/tests/devtools/editor/text-editor-selection-to-search.js
index 4d4381d..4a490b4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/editor/text-editor-selection-to-search.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/editor/text-editor-selection-to-search.js
@@ -20,9 +20,9 @@
   async function step2() {
     panel.searchableView().showSearchField();
     TestRunner.addResult('Search controller: \'' + panel.searchableView()._searchInputElement.value + '\'');
-    var action = new Search.SearchView.ActionDelegate();
+    var action = new Sources.SearchSourcesView.ActionDelegate();
     await action._showSearch();
-    var searchView = /** @type {!Search.SearchView} */ (self.runtime.sharedInstance(Search.SearchView));
+    var searchView = /** @type {!Search.SearchView} */ (self.runtime.sharedInstance(Sources.SearchSourcesView));
     TestRunner.addResult('Advanced search controller: \'' + searchView._search.value + '\'');
     TestRunner.completeTest();
   }
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search-expected.txt
index b071943..95ca5715 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search-expected.txt
@@ -1,38 +1,38 @@
 Tests search in network requests
 
 Ignore case, regexp
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=0(1 match)
-     1request0-dosearch-doSearch-d.Search
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=2(1 match)
-     1request2-doSearch
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=3(1 match)
-     1request3-dosearch
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=4(1 match)
-     1request4-doSearch
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=5(1 match)
-     1request5-d.Search
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=6(1 match)
-     1request6-dosearch-doSearch
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=8(1 match)
-     1request8-doSearch
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=9(1 match)
-     1request9-dosearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=01
+  1request0-dosearch-doSearch-d.Search
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=21
+  1request2-doSearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=31
+  1request3-dosearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=41
+  1request4-doSearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=51
+  1request5-d.Search
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=61
+  1request6-dosearch-doSearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=81
+  1request8-doSearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=91
+  1request9-dosearch
 
 Ignore case, No regexp
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=0(1 match)
-     1request0-dosearch-doSearch-d.Search
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=5(1 match)
-     1request5-d.Search
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=01
+  1…earch-doSearch-d.Search
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=51
+  1request5-d.Search
 
 Case sensitive, regexp
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=0(1 match)
-     1request0-dosearch-doSearch-d.Search
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=3(1 match)
-     1request3-dosearch
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=6(1 match)
-     1request6-dosearch-doSearch
-  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=9(1 match)
-     1request9-dosearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=01
+  1request0-dosearch-doSearch-d.Search
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=31
+  1request3-dosearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=61
+  1request6-dosearch-doSearch
+  http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=91
+  1request9-dosearch
 
 Clicking on search result
 Selected tab: response, URL: http://127.0.0.1:8000/devtools/network/resources/echo-payload.php?n=9
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search.js b/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search.js
index 371714c..071d628 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/network/network-search.js
@@ -29,7 +29,7 @@
 
   async function search(label, isRegex, ignoreCase) {
     TestRunner.addResult(label);
-    const view = await Search.SearchView.openSearch('network.searchInNetwork', 'd.search');
+    const view = await Network.SearchNetworkView.openSearch('d.search');
     view._matchCaseButton.setToggled(!ignoreCase);
     view._regexButton.setToggled(isRegex);
     const promise = TestRunner.addSnifferPromise(view, '_searchFinished');
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/persistence/persistence-search-across-all-files.js b/third_party/WebKit/LayoutTests/http/tests/devtools/persistence/persistence-search-across-all-files.js
index 7c48245..65da981 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/persistence/persistence-search-across-all-files.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/persistence/persistence-search-across-all-files.js
@@ -35,7 +35,7 @@
   ]);
 
   function dumpSearchResults(next) {
-    var searchConfig = new Search.SearchConfig('sources.search-in-files', 'window.foo f:foo', true, false);
+    var searchConfig = new Search.SearchConfig('window.foo f:foo', true, false);
     SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
   }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/search/search-in-sourcemap.js b/third_party/WebKit/LayoutTests/http/tests/devtools/search/search-in-sourcemap.js
index dca148fb..2ede8288 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/search/search-in-sourcemap.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/search/search-in-sourcemap.js
@@ -19,12 +19,12 @@
 
   var query = 'color: blue';
   TestRunner.addResult('\nSearching for: "' + query + '"');
-  var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+  var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
   await new Promise(x => SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, x));
 
   var query = 'window.foo';
   TestRunner.addResult('\nSearching for: "' + query + '"');
-  var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+  var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
   await new Promise(x => SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, x));
 
   TestRunner.completeTest();
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-in-files.js b/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-in-files.js
index 108d643..30eee000 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-in-files.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-in-files.js
@@ -32,7 +32,6 @@
   }
 
   function onAllResourcesLoaded() {
-    UI.viewManager.showView('search.search');
     fs.reportCreated(fileSystemCreated);
 
     function fileSystemCreated() {
@@ -66,14 +65,14 @@
     function testIgnoreCase(next) {
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
     function testCaseSensitive(next) {
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, false, false);
+      var searchConfig = new Search.SearchConfig(query, false, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -81,7 +80,7 @@
       var query = 'searchTest' +
           'UniqueString' +
           ' file:html';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -89,7 +88,7 @@
       var query = 'file:js ' +
           'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -98,7 +97,7 @@
           'searchTest' +
           'UniqueString' +
           ' file:html';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -107,7 +106,7 @@
           'Unique' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -117,7 +116,7 @@
           'Unique' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -128,7 +127,7 @@
           ' space' +
           ' String' +
           ' file:search';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -139,7 +138,7 @@
           ' space' +
           ' String' +
           ' file:search file:html';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -149,7 +148,7 @@
           ' file:html ' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -160,7 +159,7 @@
           ' space' +
           ' String' +
           ' file:search';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -172,7 +171,7 @@
           ' space' +
           ' String' +
           ' file:search';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -180,7 +179,7 @@
       var query = 'searchTest' +
           'UniqueString' +
           ' file:search -file:js -file:css';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -190,7 +189,7 @@
           ' -file:css ' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -199,7 +198,7 @@
       var query = 'searchTest' +
           'Unique' +
           ' file:www';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, step2);
 
       function step2() {
@@ -207,7 +206,7 @@
         query = 'searchTest' +
             'Unique' +
             ' file:zzz';
-        searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+        searchConfig = new Search.SearchConfig(query, true, false);
         SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
       }
     },
@@ -229,7 +228,7 @@
           ' BAR');
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     }
   ];
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-many-projects.js b/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-many-projects.js
index bbf7559..b8fc0bc 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-many-projects.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope-many-projects.js
@@ -41,8 +41,6 @@
   }
 
   async function fileSystemCreated() {
-    UI.viewManager.showView('search.search');
-
     var uiSourceCodes = fileSystemUISourceCodes();
     for (var i = 0; i < uiSourceCodes.length; ++i) {
       if (uiSourceCodes[i].name() === 'search.js') {
@@ -80,7 +78,7 @@
     function testSearch(next) {
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -98,7 +96,7 @@
 
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, false);
+      var searchConfig = new Search.SearchConfig(query, true, false);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     }
   ];
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope.js b/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope.js
index b863994..bef94e9 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/search/sources-search-scope.js
@@ -10,7 +10,6 @@
   await TestRunner.showPanel('sources');
   await TestRunner.loadHTML(`<iframe src="resources/search.html"></iframe>`);
 
-  UI.viewManager.showView('search.search');
   var scope = new Sources.SourcesSearchScope();
   await Promise.all([
     TestRunner.waitForUISourceCode('search.html'),
@@ -22,7 +21,7 @@
     function testIgnoreCaseAndIgnoreDynamicScript(next) {
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -30,14 +29,14 @@
       Common.settingForTest('searchInAnonymousAndContentScripts').set(true);
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
     function testCaseSensitive(next) {
       var query = 'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, false /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, false /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -45,7 +44,7 @@
       var query = 'searchTest' +
           'UniqueString' +
           ' file:html';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -53,7 +52,7 @@
       var query = 'file:js ' +
           'searchTest' +
           'UniqueString';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -62,7 +61,7 @@
           'searchTest' +
           'UniqueString' +
           ' file:html';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -71,7 +70,7 @@
           'Unique' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -81,7 +80,7 @@
           'Unique' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -92,7 +91,7 @@
           ' space' +
           ' String' +
           ' file:search';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -103,7 +102,7 @@
           ' space' +
           ' String' +
           ' file:search file:html';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -113,7 +112,7 @@
           ' file:html' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -124,7 +123,7 @@
           ' space' +
           ' String' +
           ' file:search';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -136,7 +135,7 @@
           ' space' +
           ' String' +
           ' file:search';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -146,7 +145,7 @@
           ' -file:css' +
           ' space' +
           ' String';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
     },
 
@@ -155,7 +154,7 @@
       var query = 'searchTest' +
           'Unique' +
           ' file:127.0.0.1';
-      var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+      var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
       SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, step2);
 
       function step2() {
@@ -163,7 +162,7 @@
         query = 'searchTest' +
             'Unique' +
             ' file:128.0.0.1';
-        searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+        searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
         SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
       }
     },
@@ -179,7 +178,7 @@
             ' BAR');
         var query = 'searchTest' +
             'UniqueString';
-        var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true /* ignoreCase */, false /* isRegex */);
+        var searchConfig = new Search.SearchConfig(query, true /* ignoreCase */, false /* isRegex */);
         SourcesTestRunner.runSearchAndDumpResults(scope, searchConfig, next);
       }
     }
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/search-config.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/search-config.js
index 995a544c..3bf14ed8 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/search-config.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/search-config.js
@@ -7,7 +7,7 @@
   await TestRunner.showPanel('sources');
 
   function dumpParsedSearchQuery(query, isRegex) {
-    var searchConfig = new Search.SearchConfig('sources.search-in-files', query, true, isRegex);
+    var searchConfig = new Search.SearchConfig(query, true, isRegex);
     TestRunner.addResult('Dumping parsed search query [' + query + ']:');
     TestRunner.addResult(JSON.stringify(searchConfig.queries()));
   }
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope-expected.txt b/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope-expected.txt
index a0235af..d07266d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope-expected.txt
@@ -1,58 +1,37 @@
 CONSOLE MESSAGE: line 13: List all interfaces in the animation worklet global scope.
-CONSOLE MESSAGE: line 147: interface AnimationWorkletGlobalScope : WorkletGlobalScope
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface ByteLengthQueuingStrategy
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method size
-CONSOLE MESSAGE: line 147: interface CountQueuingStrategy
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method size
-CONSOLE MESSAGE: line 147: interface DataView
-CONSOLE MESSAGE: line 147:     getter buffer
-CONSOLE MESSAGE: line 147:     getter byteLength
-CONSOLE MESSAGE: line 147:     getter byteOffset
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getFloat32
-CONSOLE MESSAGE: line 147:     method getFloat64
-CONSOLE MESSAGE: line 147:     method getInt16
-CONSOLE MESSAGE: line 147:     method getInt32
-CONSOLE MESSAGE: line 147:     method getInt8
-CONSOLE MESSAGE: line 147:     method getUint16
-CONSOLE MESSAGE: line 147:     method getUint32
-CONSOLE MESSAGE: line 147:     method getUint8
-CONSOLE MESSAGE: line 147:     method setFloat32
-CONSOLE MESSAGE: line 147:     method setFloat64
-CONSOLE MESSAGE: line 147:     method setInt16
-CONSOLE MESSAGE: line 147:     method setInt32
-CONSOLE MESSAGE: line 147:     method setInt8
-CONSOLE MESSAGE: line 147:     method setUint16
-CONSOLE MESSAGE: line 147:     method setUint32
-CONSOLE MESSAGE: line 147:     method setUint8
-CONSOLE MESSAGE: line 147: interface EffectProxy
-CONSOLE MESSAGE: line 147:     getter localTime
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter localTime
-CONSOLE MESSAGE: line 147: interface ReadableStream
-CONSOLE MESSAGE: line 147:     getter locked
-CONSOLE MESSAGE: line 147:     method cancel
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getReader
-CONSOLE MESSAGE: line 147:     method pipeThrough
-CONSOLE MESSAGE: line 147:     method pipeTo
-CONSOLE MESSAGE: line 147:     method tee
-CONSOLE MESSAGE: line 147: interface TransformStream
-CONSOLE MESSAGE: line 147:     getter readable
-CONSOLE MESSAGE: line 147:     getter writable
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface WorkletGlobalScope
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface WritableStream
-CONSOLE MESSAGE: line 147:     getter locked
-CONSOLE MESSAGE: line 147:     method abort
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getWriter
-CONSOLE MESSAGE: line 147: global object
-CONSOLE MESSAGE: line 147:     attribute console
-CONSOLE MESSAGE: line 147:     method gc
-CONSOLE MESSAGE: line 147:     method registerAnimator
+CONSOLE MESSAGE: line 151: interface AnimationWorkletGlobalScope : WorkletGlobalScope
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface ByteLengthQueuingStrategy
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method size
+CONSOLE MESSAGE: line 151: interface CountQueuingStrategy
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method size
+CONSOLE MESSAGE: line 151: interface EffectProxy
+CONSOLE MESSAGE: line 151:     getter localTime
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter localTime
+CONSOLE MESSAGE: line 151: interface ReadableStream
+CONSOLE MESSAGE: line 151:     getter locked
+CONSOLE MESSAGE: line 151:     method cancel
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method getReader
+CONSOLE MESSAGE: line 151:     method pipeThrough
+CONSOLE MESSAGE: line 151:     method pipeTo
+CONSOLE MESSAGE: line 151:     method tee
+CONSOLE MESSAGE: line 151: interface TransformStream
+CONSOLE MESSAGE: line 151:     getter readable
+CONSOLE MESSAGE: line 151:     getter writable
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface WorkletGlobalScope
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface WritableStream
+CONSOLE MESSAGE: line 151:     getter locked
+CONSOLE MESSAGE: line 151:     method abort
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method getWriter
+CONSOLE MESSAGE: line 151: global object
+CONSOLE MESSAGE: line 151:     attribute console
+CONSOLE MESSAGE: line 151:     method gc
+CONSOLE MESSAGE: line 151:     method registerAnimator
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 14485d9..b08ff96 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -377,28 +377,6 @@
     method constructor
     method contains
     method item
-interface DataView
-    attribute @@toStringTag
-    getter buffer
-    getter byteLength
-    getter byteOffset
-    method constructor
-    method getFloat32
-    method getFloat64
-    method getInt16
-    method getInt32
-    method getInt8
-    method getUint16
-    method getUint32
-    method getUint8
-    method setFloat32
-    method setFloat64
-    method setInt16
-    method setInt32
-    method setInt8
-    method setUint16
-    method setUint32
-    method setUint8
 interface Event
     attribute @@toStringTag
     attribute AT_TARGET
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt b/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt
index e197e48..8c2a968 100644
--- a/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt
@@ -1,550 +1,508 @@
 CONSOLE MESSAGE: line 10: This test logs exposed APIs once from each PaintWorkletGlobalScope
-CONSOLE MESSAGE: line 147: interface ByteLengthQueuingStrategy
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method size
-CONSOLE MESSAGE: line 147: interface CSSImageValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSKeywordValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter value
-CONSOLE MESSAGE: line 147: interface CSSMathInvert : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathMax : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathMin : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathNegate : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathProduct : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathSum : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathValue : CSSNumericValue
-CONSOLE MESSAGE: line 147:     getter operator
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMatrixComponent : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter matrix
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter matrix
-CONSOLE MESSAGE: line 147: interface CSSNumericArray
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface CSSNumericValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     method add
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method div
-CONSOLE MESSAGE: line 147:     method equals
-CONSOLE MESSAGE: line 147:     method max
-CONSOLE MESSAGE: line 147:     method min
-CONSOLE MESSAGE: line 147:     method mul
-CONSOLE MESSAGE: line 147:     method sub
-CONSOLE MESSAGE: line 147:     method to
-CONSOLE MESSAGE: line 147:     method toSum
-CONSOLE MESSAGE: line 147:     method type
-CONSOLE MESSAGE: line 147: interface CSSPerspective : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter length
-CONSOLE MESSAGE: line 147: interface CSSPositionValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147: interface CSSRotate : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter angle
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     getter z
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter angle
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147:     setter z
-CONSOLE MESSAGE: line 147: interface CSSScale : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     getter z
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147:     setter z
-CONSOLE MESSAGE: line 147: interface CSSSkew : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter ax
-CONSOLE MESSAGE: line 147:     getter ay
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter ax
-CONSOLE MESSAGE: line 147:     setter ay
-CONSOLE MESSAGE: line 147: interface CSSStyleValue
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method toString
-CONSOLE MESSAGE: line 147: interface CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter is2D
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method toMatrix
-CONSOLE MESSAGE: line 147:     method toString
-CONSOLE MESSAGE: line 147:     setter is2D
-CONSOLE MESSAGE: line 147: interface CSSTransformValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter is2D
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method toMatrix
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface CSSTranslate : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     getter z
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147:     setter z
-CONSOLE MESSAGE: line 147: interface CSSUnitValue : CSSNumericValue
-CONSOLE MESSAGE: line 147:     getter unit
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter value
-CONSOLE MESSAGE: line 147: interface CSSUnparsedValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface CSSVariableReferenceValue
-CONSOLE MESSAGE: line 147:     getter fallback
-CONSOLE MESSAGE: line 147:     getter variable
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter variable
-CONSOLE MESSAGE: line 147: interface CountQueuingStrategy
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method size
-CONSOLE MESSAGE: line 147: interface DataView
-CONSOLE MESSAGE: line 147:     getter buffer
-CONSOLE MESSAGE: line 147:     getter byteLength
-CONSOLE MESSAGE: line 147:     getter byteOffset
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getFloat32
-CONSOLE MESSAGE: line 147:     method getFloat64
-CONSOLE MESSAGE: line 147:     method getInt16
-CONSOLE MESSAGE: line 147:     method getInt32
-CONSOLE MESSAGE: line 147:     method getInt8
-CONSOLE MESSAGE: line 147:     method getUint16
-CONSOLE MESSAGE: line 147:     method getUint32
-CONSOLE MESSAGE: line 147:     method getUint8
-CONSOLE MESSAGE: line 147:     method setFloat32
-CONSOLE MESSAGE: line 147:     method setFloat64
-CONSOLE MESSAGE: line 147:     method setInt16
-CONSOLE MESSAGE: line 147:     method setInt32
-CONSOLE MESSAGE: line 147:     method setInt8
-CONSOLE MESSAGE: line 147:     method setUint16
-CONSOLE MESSAGE: line 147:     method setUint32
-CONSOLE MESSAGE: line 147:     method setUint8
-CONSOLE MESSAGE: line 147: interface PaintRenderingContext2D
-CONSOLE MESSAGE: line 147:     getter currentTransform
-CONSOLE MESSAGE: line 147:     getter fillStyle
-CONSOLE MESSAGE: line 147:     getter filter
-CONSOLE MESSAGE: line 147:     getter globalAlpha
-CONSOLE MESSAGE: line 147:     getter globalCompositeOperation
-CONSOLE MESSAGE: line 147:     getter imageSmoothingEnabled
-CONSOLE MESSAGE: line 147:     getter imageSmoothingQuality
-CONSOLE MESSAGE: line 147:     getter lineCap
-CONSOLE MESSAGE: line 147:     getter lineDashOffset
-CONSOLE MESSAGE: line 147:     getter lineJoin
-CONSOLE MESSAGE: line 147:     getter lineWidth
-CONSOLE MESSAGE: line 147:     getter miterLimit
-CONSOLE MESSAGE: line 147:     getter shadowBlur
-CONSOLE MESSAGE: line 147:     getter shadowColor
-CONSOLE MESSAGE: line 147:     getter shadowOffsetX
-CONSOLE MESSAGE: line 147:     getter shadowOffsetY
-CONSOLE MESSAGE: line 147:     getter strokeStyle
-CONSOLE MESSAGE: line 147:     method arc
-CONSOLE MESSAGE: line 147:     method arcTo
-CONSOLE MESSAGE: line 147:     method beginPath
-CONSOLE MESSAGE: line 147:     method bezierCurveTo
-CONSOLE MESSAGE: line 147:     method clearRect
-CONSOLE MESSAGE: line 147:     method clip
-CONSOLE MESSAGE: line 147:     method closePath
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method createLinearGradient
-CONSOLE MESSAGE: line 147:     method createPattern
-CONSOLE MESSAGE: line 147:     method createRadialGradient
-CONSOLE MESSAGE: line 147:     method drawImage
-CONSOLE MESSAGE: line 147:     method ellipse
-CONSOLE MESSAGE: line 147:     method fill
-CONSOLE MESSAGE: line 147:     method fillRect
-CONSOLE MESSAGE: line 147:     method getLineDash
-CONSOLE MESSAGE: line 147:     method isPointInPath
-CONSOLE MESSAGE: line 147:     method isPointInStroke
-CONSOLE MESSAGE: line 147:     method lineTo
-CONSOLE MESSAGE: line 147:     method moveTo
-CONSOLE MESSAGE: line 147:     method quadraticCurveTo
-CONSOLE MESSAGE: line 147:     method rect
-CONSOLE MESSAGE: line 147:     method resetTransform
-CONSOLE MESSAGE: line 147:     method restore
-CONSOLE MESSAGE: line 147:     method rotate
-CONSOLE MESSAGE: line 147:     method save
-CONSOLE MESSAGE: line 147:     method scale
-CONSOLE MESSAGE: line 147:     method setLineDash
-CONSOLE MESSAGE: line 147:     method setTransform
-CONSOLE MESSAGE: line 147:     method stroke
-CONSOLE MESSAGE: line 147:     method strokeRect
-CONSOLE MESSAGE: line 147:     method transform
-CONSOLE MESSAGE: line 147:     method translate
-CONSOLE MESSAGE: line 147:     setter currentTransform
-CONSOLE MESSAGE: line 147:     setter fillStyle
-CONSOLE MESSAGE: line 147:     setter filter
-CONSOLE MESSAGE: line 147:     setter globalAlpha
-CONSOLE MESSAGE: line 147:     setter globalCompositeOperation
-CONSOLE MESSAGE: line 147:     setter imageSmoothingEnabled
-CONSOLE MESSAGE: line 147:     setter imageSmoothingQuality
-CONSOLE MESSAGE: line 147:     setter lineCap
-CONSOLE MESSAGE: line 147:     setter lineDashOffset
-CONSOLE MESSAGE: line 147:     setter lineJoin
-CONSOLE MESSAGE: line 147:     setter lineWidth
-CONSOLE MESSAGE: line 147:     setter miterLimit
-CONSOLE MESSAGE: line 147:     setter shadowBlur
-CONSOLE MESSAGE: line 147:     setter shadowColor
-CONSOLE MESSAGE: line 147:     setter shadowOffsetX
-CONSOLE MESSAGE: line 147:     setter shadowOffsetY
-CONSOLE MESSAGE: line 147:     setter strokeStyle
-CONSOLE MESSAGE: line 147: interface PaintSize
-CONSOLE MESSAGE: line 147:     getter height
-CONSOLE MESSAGE: line 147:     getter width
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface PaintWorkletGlobalScope : WorkletGlobalScope
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface Path2D
-CONSOLE MESSAGE: line 147:     method addPath
-CONSOLE MESSAGE: line 147:     method arc
-CONSOLE MESSAGE: line 147:     method arcTo
-CONSOLE MESSAGE: line 147:     method bezierCurveTo
-CONSOLE MESSAGE: line 147:     method closePath
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method ellipse
-CONSOLE MESSAGE: line 147:     method lineTo
-CONSOLE MESSAGE: line 147:     method moveTo
-CONSOLE MESSAGE: line 147:     method quadraticCurveTo
-CONSOLE MESSAGE: line 147:     method rect
-CONSOLE MESSAGE: line 147: interface ReadableStream
-CONSOLE MESSAGE: line 147:     getter locked
-CONSOLE MESSAGE: line 147:     method cancel
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getReader
-CONSOLE MESSAGE: line 147:     method pipeThrough
-CONSOLE MESSAGE: line 147:     method pipeTo
-CONSOLE MESSAGE: line 147:     method tee
-CONSOLE MESSAGE: line 147: interface StylePropertyMapReadOnly
-CONSOLE MESSAGE: line 147:     getter size
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method get
-CONSOLE MESSAGE: line 147:     method getAll
-CONSOLE MESSAGE: line 147:     method has
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface TransformStream
-CONSOLE MESSAGE: line 147:     getter readable
-CONSOLE MESSAGE: line 147:     getter writable
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface WorkletGlobalScope
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface WritableStream
-CONSOLE MESSAGE: line 147:     getter locked
-CONSOLE MESSAGE: line 147:     method abort
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getWriter
-CONSOLE MESSAGE: line 147: global object
-CONSOLE MESSAGE: line 147:     attribute console
-CONSOLE MESSAGE: line 147:     getter devicePixelRatio
-CONSOLE MESSAGE: line 147:     method gc
-CONSOLE MESSAGE: line 147:     method registerPaint
-CONSOLE MESSAGE: line 147: interface ByteLengthQueuingStrategy
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method size
-CONSOLE MESSAGE: line 147: interface CSSImageValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSKeywordValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter value
-CONSOLE MESSAGE: line 147: interface CSSMathInvert : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathMax : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathMin : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathNegate : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathProduct : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathSum : CSSMathValue
-CONSOLE MESSAGE: line 147:     getter values
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMathValue : CSSNumericValue
-CONSOLE MESSAGE: line 147:     getter operator
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface CSSMatrixComponent : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter matrix
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter matrix
-CONSOLE MESSAGE: line 147: interface CSSNumericArray
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface CSSNumericValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     method add
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method div
-CONSOLE MESSAGE: line 147:     method equals
-CONSOLE MESSAGE: line 147:     method max
-CONSOLE MESSAGE: line 147:     method min
-CONSOLE MESSAGE: line 147:     method mul
-CONSOLE MESSAGE: line 147:     method sub
-CONSOLE MESSAGE: line 147:     method to
-CONSOLE MESSAGE: line 147:     method toSum
-CONSOLE MESSAGE: line 147:     method type
-CONSOLE MESSAGE: line 147: interface CSSPerspective : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter length
-CONSOLE MESSAGE: line 147: interface CSSPositionValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147: interface CSSRotate : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter angle
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     getter z
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter angle
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147:     setter z
-CONSOLE MESSAGE: line 147: interface CSSScale : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     getter z
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147:     setter z
-CONSOLE MESSAGE: line 147: interface CSSSkew : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter ax
-CONSOLE MESSAGE: line 147:     getter ay
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter ax
-CONSOLE MESSAGE: line 147:     setter ay
-CONSOLE MESSAGE: line 147: interface CSSStyleValue
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method toString
-CONSOLE MESSAGE: line 147: interface CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter is2D
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method toMatrix
-CONSOLE MESSAGE: line 147:     method toString
-CONSOLE MESSAGE: line 147:     setter is2D
-CONSOLE MESSAGE: line 147: interface CSSTransformValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter is2D
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method toMatrix
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface CSSTranslate : CSSTransformComponent
-CONSOLE MESSAGE: line 147:     getter x
-CONSOLE MESSAGE: line 147:     getter y
-CONSOLE MESSAGE: line 147:     getter z
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter x
-CONSOLE MESSAGE: line 147:     setter y
-CONSOLE MESSAGE: line 147:     setter z
-CONSOLE MESSAGE: line 147: interface CSSUnitValue : CSSNumericValue
-CONSOLE MESSAGE: line 147:     getter unit
-CONSOLE MESSAGE: line 147:     getter value
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter value
-CONSOLE MESSAGE: line 147: interface CSSUnparsedValue : CSSStyleValue
-CONSOLE MESSAGE: line 147:     getter length
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface CSSVariableReferenceValue
-CONSOLE MESSAGE: line 147:     getter fallback
-CONSOLE MESSAGE: line 147:     getter variable
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     setter variable
-CONSOLE MESSAGE: line 147: interface CountQueuingStrategy
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method size
-CONSOLE MESSAGE: line 147: interface DataView
-CONSOLE MESSAGE: line 147:     getter buffer
-CONSOLE MESSAGE: line 147:     getter byteLength
-CONSOLE MESSAGE: line 147:     getter byteOffset
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getFloat32
-CONSOLE MESSAGE: line 147:     method getFloat64
-CONSOLE MESSAGE: line 147:     method getInt16
-CONSOLE MESSAGE: line 147:     method getInt32
-CONSOLE MESSAGE: line 147:     method getInt8
-CONSOLE MESSAGE: line 147:     method getUint16
-CONSOLE MESSAGE: line 147:     method getUint32
-CONSOLE MESSAGE: line 147:     method getUint8
-CONSOLE MESSAGE: line 147:     method setFloat32
-CONSOLE MESSAGE: line 147:     method setFloat64
-CONSOLE MESSAGE: line 147:     method setInt16
-CONSOLE MESSAGE: line 147:     method setInt32
-CONSOLE MESSAGE: line 147:     method setInt8
-CONSOLE MESSAGE: line 147:     method setUint16
-CONSOLE MESSAGE: line 147:     method setUint32
-CONSOLE MESSAGE: line 147:     method setUint8
-CONSOLE MESSAGE: line 147: interface PaintRenderingContext2D
-CONSOLE MESSAGE: line 147:     getter currentTransform
-CONSOLE MESSAGE: line 147:     getter fillStyle
-CONSOLE MESSAGE: line 147:     getter filter
-CONSOLE MESSAGE: line 147:     getter globalAlpha
-CONSOLE MESSAGE: line 147:     getter globalCompositeOperation
-CONSOLE MESSAGE: line 147:     getter imageSmoothingEnabled
-CONSOLE MESSAGE: line 147:     getter imageSmoothingQuality
-CONSOLE MESSAGE: line 147:     getter lineCap
-CONSOLE MESSAGE: line 147:     getter lineDashOffset
-CONSOLE MESSAGE: line 147:     getter lineJoin
-CONSOLE MESSAGE: line 147:     getter lineWidth
-CONSOLE MESSAGE: line 147:     getter miterLimit
-CONSOLE MESSAGE: line 147:     getter shadowBlur
-CONSOLE MESSAGE: line 147:     getter shadowColor
-CONSOLE MESSAGE: line 147:     getter shadowOffsetX
-CONSOLE MESSAGE: line 147:     getter shadowOffsetY
-CONSOLE MESSAGE: line 147:     getter strokeStyle
-CONSOLE MESSAGE: line 147:     method arc
-CONSOLE MESSAGE: line 147:     method arcTo
-CONSOLE MESSAGE: line 147:     method beginPath
-CONSOLE MESSAGE: line 147:     method bezierCurveTo
-CONSOLE MESSAGE: line 147:     method clearRect
-CONSOLE MESSAGE: line 147:     method clip
-CONSOLE MESSAGE: line 147:     method closePath
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method createLinearGradient
-CONSOLE MESSAGE: line 147:     method createPattern
-CONSOLE MESSAGE: line 147:     method createRadialGradient
-CONSOLE MESSAGE: line 147:     method drawImage
-CONSOLE MESSAGE: line 147:     method ellipse
-CONSOLE MESSAGE: line 147:     method fill
-CONSOLE MESSAGE: line 147:     method fillRect
-CONSOLE MESSAGE: line 147:     method getLineDash
-CONSOLE MESSAGE: line 147:     method isPointInPath
-CONSOLE MESSAGE: line 147:     method isPointInStroke
-CONSOLE MESSAGE: line 147:     method lineTo
-CONSOLE MESSAGE: line 147:     method moveTo
-CONSOLE MESSAGE: line 147:     method quadraticCurveTo
-CONSOLE MESSAGE: line 147:     method rect
-CONSOLE MESSAGE: line 147:     method resetTransform
-CONSOLE MESSAGE: line 147:     method restore
-CONSOLE MESSAGE: line 147:     method rotate
-CONSOLE MESSAGE: line 147:     method save
-CONSOLE MESSAGE: line 147:     method scale
-CONSOLE MESSAGE: line 147:     method setLineDash
-CONSOLE MESSAGE: line 147:     method setTransform
-CONSOLE MESSAGE: line 147:     method stroke
-CONSOLE MESSAGE: line 147:     method strokeRect
-CONSOLE MESSAGE: line 147:     method transform
-CONSOLE MESSAGE: line 147:     method translate
-CONSOLE MESSAGE: line 147:     setter currentTransform
-CONSOLE MESSAGE: line 147:     setter fillStyle
-CONSOLE MESSAGE: line 147:     setter filter
-CONSOLE MESSAGE: line 147:     setter globalAlpha
-CONSOLE MESSAGE: line 147:     setter globalCompositeOperation
-CONSOLE MESSAGE: line 147:     setter imageSmoothingEnabled
-CONSOLE MESSAGE: line 147:     setter imageSmoothingQuality
-CONSOLE MESSAGE: line 147:     setter lineCap
-CONSOLE MESSAGE: line 147:     setter lineDashOffset
-CONSOLE MESSAGE: line 147:     setter lineJoin
-CONSOLE MESSAGE: line 147:     setter lineWidth
-CONSOLE MESSAGE: line 147:     setter miterLimit
-CONSOLE MESSAGE: line 147:     setter shadowBlur
-CONSOLE MESSAGE: line 147:     setter shadowColor
-CONSOLE MESSAGE: line 147:     setter shadowOffsetX
-CONSOLE MESSAGE: line 147:     setter shadowOffsetY
-CONSOLE MESSAGE: line 147:     setter strokeStyle
-CONSOLE MESSAGE: line 147: interface PaintSize
-CONSOLE MESSAGE: line 147:     getter height
-CONSOLE MESSAGE: line 147:     getter width
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface PaintWorkletGlobalScope : WorkletGlobalScope
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface Path2D
-CONSOLE MESSAGE: line 147:     method addPath
-CONSOLE MESSAGE: line 147:     method arc
-CONSOLE MESSAGE: line 147:     method arcTo
-CONSOLE MESSAGE: line 147:     method bezierCurveTo
-CONSOLE MESSAGE: line 147:     method closePath
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method ellipse
-CONSOLE MESSAGE: line 147:     method lineTo
-CONSOLE MESSAGE: line 147:     method moveTo
-CONSOLE MESSAGE: line 147:     method quadraticCurveTo
-CONSOLE MESSAGE: line 147:     method rect
-CONSOLE MESSAGE: line 147: interface ReadableStream
-CONSOLE MESSAGE: line 147:     getter locked
-CONSOLE MESSAGE: line 147:     method cancel
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getReader
-CONSOLE MESSAGE: line 147:     method pipeThrough
-CONSOLE MESSAGE: line 147:     method pipeTo
-CONSOLE MESSAGE: line 147:     method tee
-CONSOLE MESSAGE: line 147: interface StylePropertyMapReadOnly
-CONSOLE MESSAGE: line 147:     getter size
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method entries
-CONSOLE MESSAGE: line 147:     method forEach
-CONSOLE MESSAGE: line 147:     method get
-CONSOLE MESSAGE: line 147:     method getAll
-CONSOLE MESSAGE: line 147:     method has
-CONSOLE MESSAGE: line 147:     method keys
-CONSOLE MESSAGE: line 147:     method values
-CONSOLE MESSAGE: line 147: interface TransformStream
-CONSOLE MESSAGE: line 147:     getter readable
-CONSOLE MESSAGE: line 147:     getter writable
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface WorkletGlobalScope
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147: interface WritableStream
-CONSOLE MESSAGE: line 147:     getter locked
-CONSOLE MESSAGE: line 147:     method abort
-CONSOLE MESSAGE: line 147:     method constructor
-CONSOLE MESSAGE: line 147:     method getWriter
-CONSOLE MESSAGE: line 147: global object
-CONSOLE MESSAGE: line 147:     attribute console
-CONSOLE MESSAGE: line 147:     getter devicePixelRatio
-CONSOLE MESSAGE: line 147:     method gc
-CONSOLE MESSAGE: line 147:     method registerPaint
+CONSOLE MESSAGE: line 151: interface ByteLengthQueuingStrategy
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method size
+CONSOLE MESSAGE: line 151: interface CSSImageValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSKeywordValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter value
+CONSOLE MESSAGE: line 151: interface CSSMathInvert : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathMax : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathMin : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathNegate : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathProduct : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathSum : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathValue : CSSNumericValue
+CONSOLE MESSAGE: line 151:     getter operator
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMatrixComponent : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter matrix
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter matrix
+CONSOLE MESSAGE: line 151: interface CSSNumericArray
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface CSSNumericValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     method add
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method div
+CONSOLE MESSAGE: line 151:     method equals
+CONSOLE MESSAGE: line 151:     method max
+CONSOLE MESSAGE: line 151:     method min
+CONSOLE MESSAGE: line 151:     method mul
+CONSOLE MESSAGE: line 151:     method sub
+CONSOLE MESSAGE: line 151:     method to
+CONSOLE MESSAGE: line 151:     method toSum
+CONSOLE MESSAGE: line 151:     method type
+CONSOLE MESSAGE: line 151: interface CSSPerspective : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter length
+CONSOLE MESSAGE: line 151: interface CSSPositionValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151: interface CSSRotate : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter angle
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     getter z
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter angle
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151:     setter z
+CONSOLE MESSAGE: line 151: interface CSSScale : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     getter z
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151:     setter z
+CONSOLE MESSAGE: line 151: interface CSSSkew : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter ax
+CONSOLE MESSAGE: line 151:     getter ay
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter ax
+CONSOLE MESSAGE: line 151:     setter ay
+CONSOLE MESSAGE: line 151: interface CSSStyleValue
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method toString
+CONSOLE MESSAGE: line 151: interface CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter is2D
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method toMatrix
+CONSOLE MESSAGE: line 151:     method toString
+CONSOLE MESSAGE: line 151:     setter is2D
+CONSOLE MESSAGE: line 151: interface CSSTransformValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter is2D
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method toMatrix
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface CSSTranslate : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     getter z
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151:     setter z
+CONSOLE MESSAGE: line 151: interface CSSUnitValue : CSSNumericValue
+CONSOLE MESSAGE: line 151:     getter unit
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter value
+CONSOLE MESSAGE: line 151: interface CSSUnparsedValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface CSSVariableReferenceValue
+CONSOLE MESSAGE: line 151:     getter fallback
+CONSOLE MESSAGE: line 151:     getter variable
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter variable
+CONSOLE MESSAGE: line 151: interface CountQueuingStrategy
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method size
+CONSOLE MESSAGE: line 151: interface PaintRenderingContext2D
+CONSOLE MESSAGE: line 151:     getter currentTransform
+CONSOLE MESSAGE: line 151:     getter fillStyle
+CONSOLE MESSAGE: line 151:     getter filter
+CONSOLE MESSAGE: line 151:     getter globalAlpha
+CONSOLE MESSAGE: line 151:     getter globalCompositeOperation
+CONSOLE MESSAGE: line 151:     getter imageSmoothingEnabled
+CONSOLE MESSAGE: line 151:     getter imageSmoothingQuality
+CONSOLE MESSAGE: line 151:     getter lineCap
+CONSOLE MESSAGE: line 151:     getter lineDashOffset
+CONSOLE MESSAGE: line 151:     getter lineJoin
+CONSOLE MESSAGE: line 151:     getter lineWidth
+CONSOLE MESSAGE: line 151:     getter miterLimit
+CONSOLE MESSAGE: line 151:     getter shadowBlur
+CONSOLE MESSAGE: line 151:     getter shadowColor
+CONSOLE MESSAGE: line 151:     getter shadowOffsetX
+CONSOLE MESSAGE: line 151:     getter shadowOffsetY
+CONSOLE MESSAGE: line 151:     getter strokeStyle
+CONSOLE MESSAGE: line 151:     method arc
+CONSOLE MESSAGE: line 151:     method arcTo
+CONSOLE MESSAGE: line 151:     method beginPath
+CONSOLE MESSAGE: line 151:     method bezierCurveTo
+CONSOLE MESSAGE: line 151:     method clearRect
+CONSOLE MESSAGE: line 151:     method clip
+CONSOLE MESSAGE: line 151:     method closePath
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method createLinearGradient
+CONSOLE MESSAGE: line 151:     method createPattern
+CONSOLE MESSAGE: line 151:     method createRadialGradient
+CONSOLE MESSAGE: line 151:     method drawImage
+CONSOLE MESSAGE: line 151:     method ellipse
+CONSOLE MESSAGE: line 151:     method fill
+CONSOLE MESSAGE: line 151:     method fillRect
+CONSOLE MESSAGE: line 151:     method getLineDash
+CONSOLE MESSAGE: line 151:     method isPointInPath
+CONSOLE MESSAGE: line 151:     method isPointInStroke
+CONSOLE MESSAGE: line 151:     method lineTo
+CONSOLE MESSAGE: line 151:     method moveTo
+CONSOLE MESSAGE: line 151:     method quadraticCurveTo
+CONSOLE MESSAGE: line 151:     method rect
+CONSOLE MESSAGE: line 151:     method resetTransform
+CONSOLE MESSAGE: line 151:     method restore
+CONSOLE MESSAGE: line 151:     method rotate
+CONSOLE MESSAGE: line 151:     method save
+CONSOLE MESSAGE: line 151:     method scale
+CONSOLE MESSAGE: line 151:     method setLineDash
+CONSOLE MESSAGE: line 151:     method setTransform
+CONSOLE MESSAGE: line 151:     method stroke
+CONSOLE MESSAGE: line 151:     method strokeRect
+CONSOLE MESSAGE: line 151:     method transform
+CONSOLE MESSAGE: line 151:     method translate
+CONSOLE MESSAGE: line 151:     setter currentTransform
+CONSOLE MESSAGE: line 151:     setter fillStyle
+CONSOLE MESSAGE: line 151:     setter filter
+CONSOLE MESSAGE: line 151:     setter globalAlpha
+CONSOLE MESSAGE: line 151:     setter globalCompositeOperation
+CONSOLE MESSAGE: line 151:     setter imageSmoothingEnabled
+CONSOLE MESSAGE: line 151:     setter imageSmoothingQuality
+CONSOLE MESSAGE: line 151:     setter lineCap
+CONSOLE MESSAGE: line 151:     setter lineDashOffset
+CONSOLE MESSAGE: line 151:     setter lineJoin
+CONSOLE MESSAGE: line 151:     setter lineWidth
+CONSOLE MESSAGE: line 151:     setter miterLimit
+CONSOLE MESSAGE: line 151:     setter shadowBlur
+CONSOLE MESSAGE: line 151:     setter shadowColor
+CONSOLE MESSAGE: line 151:     setter shadowOffsetX
+CONSOLE MESSAGE: line 151:     setter shadowOffsetY
+CONSOLE MESSAGE: line 151:     setter strokeStyle
+CONSOLE MESSAGE: line 151: interface PaintSize
+CONSOLE MESSAGE: line 151:     getter height
+CONSOLE MESSAGE: line 151:     getter width
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface PaintWorkletGlobalScope : WorkletGlobalScope
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface Path2D
+CONSOLE MESSAGE: line 151:     method addPath
+CONSOLE MESSAGE: line 151:     method arc
+CONSOLE MESSAGE: line 151:     method arcTo
+CONSOLE MESSAGE: line 151:     method bezierCurveTo
+CONSOLE MESSAGE: line 151:     method closePath
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method ellipse
+CONSOLE MESSAGE: line 151:     method lineTo
+CONSOLE MESSAGE: line 151:     method moveTo
+CONSOLE MESSAGE: line 151:     method quadraticCurveTo
+CONSOLE MESSAGE: line 151:     method rect
+CONSOLE MESSAGE: line 151: interface ReadableStream
+CONSOLE MESSAGE: line 151:     getter locked
+CONSOLE MESSAGE: line 151:     method cancel
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method getReader
+CONSOLE MESSAGE: line 151:     method pipeThrough
+CONSOLE MESSAGE: line 151:     method pipeTo
+CONSOLE MESSAGE: line 151:     method tee
+CONSOLE MESSAGE: line 151: interface StylePropertyMapReadOnly
+CONSOLE MESSAGE: line 151:     getter size
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method get
+CONSOLE MESSAGE: line 151:     method getAll
+CONSOLE MESSAGE: line 151:     method has
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface TransformStream
+CONSOLE MESSAGE: line 151:     getter readable
+CONSOLE MESSAGE: line 151:     getter writable
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface WorkletGlobalScope
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface WritableStream
+CONSOLE MESSAGE: line 151:     getter locked
+CONSOLE MESSAGE: line 151:     method abort
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method getWriter
+CONSOLE MESSAGE: line 151: global object
+CONSOLE MESSAGE: line 151:     attribute console
+CONSOLE MESSAGE: line 151:     getter devicePixelRatio
+CONSOLE MESSAGE: line 151:     method gc
+CONSOLE MESSAGE: line 151:     method registerPaint
+CONSOLE MESSAGE: line 151: interface ByteLengthQueuingStrategy
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method size
+CONSOLE MESSAGE: line 151: interface CSSImageValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSKeywordValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter value
+CONSOLE MESSAGE: line 151: interface CSSMathInvert : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathMax : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathMin : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathNegate : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathProduct : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathSum : CSSMathValue
+CONSOLE MESSAGE: line 151:     getter values
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMathValue : CSSNumericValue
+CONSOLE MESSAGE: line 151:     getter operator
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface CSSMatrixComponent : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter matrix
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter matrix
+CONSOLE MESSAGE: line 151: interface CSSNumericArray
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface CSSNumericValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     method add
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method div
+CONSOLE MESSAGE: line 151:     method equals
+CONSOLE MESSAGE: line 151:     method max
+CONSOLE MESSAGE: line 151:     method min
+CONSOLE MESSAGE: line 151:     method mul
+CONSOLE MESSAGE: line 151:     method sub
+CONSOLE MESSAGE: line 151:     method to
+CONSOLE MESSAGE: line 151:     method toSum
+CONSOLE MESSAGE: line 151:     method type
+CONSOLE MESSAGE: line 151: interface CSSPerspective : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter length
+CONSOLE MESSAGE: line 151: interface CSSPositionValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151: interface CSSRotate : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter angle
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     getter z
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter angle
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151:     setter z
+CONSOLE MESSAGE: line 151: interface CSSScale : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     getter z
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151:     setter z
+CONSOLE MESSAGE: line 151: interface CSSSkew : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter ax
+CONSOLE MESSAGE: line 151:     getter ay
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter ax
+CONSOLE MESSAGE: line 151:     setter ay
+CONSOLE MESSAGE: line 151: interface CSSStyleValue
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method toString
+CONSOLE MESSAGE: line 151: interface CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter is2D
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method toMatrix
+CONSOLE MESSAGE: line 151:     method toString
+CONSOLE MESSAGE: line 151:     setter is2D
+CONSOLE MESSAGE: line 151: interface CSSTransformValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter is2D
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method toMatrix
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface CSSTranslate : CSSTransformComponent
+CONSOLE MESSAGE: line 151:     getter x
+CONSOLE MESSAGE: line 151:     getter y
+CONSOLE MESSAGE: line 151:     getter z
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter x
+CONSOLE MESSAGE: line 151:     setter y
+CONSOLE MESSAGE: line 151:     setter z
+CONSOLE MESSAGE: line 151: interface CSSUnitValue : CSSNumericValue
+CONSOLE MESSAGE: line 151:     getter unit
+CONSOLE MESSAGE: line 151:     getter value
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter value
+CONSOLE MESSAGE: line 151: interface CSSUnparsedValue : CSSStyleValue
+CONSOLE MESSAGE: line 151:     getter length
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface CSSVariableReferenceValue
+CONSOLE MESSAGE: line 151:     getter fallback
+CONSOLE MESSAGE: line 151:     getter variable
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     setter variable
+CONSOLE MESSAGE: line 151: interface CountQueuingStrategy
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method size
+CONSOLE MESSAGE: line 151: interface PaintRenderingContext2D
+CONSOLE MESSAGE: line 151:     getter currentTransform
+CONSOLE MESSAGE: line 151:     getter fillStyle
+CONSOLE MESSAGE: line 151:     getter filter
+CONSOLE MESSAGE: line 151:     getter globalAlpha
+CONSOLE MESSAGE: line 151:     getter globalCompositeOperation
+CONSOLE MESSAGE: line 151:     getter imageSmoothingEnabled
+CONSOLE MESSAGE: line 151:     getter imageSmoothingQuality
+CONSOLE MESSAGE: line 151:     getter lineCap
+CONSOLE MESSAGE: line 151:     getter lineDashOffset
+CONSOLE MESSAGE: line 151:     getter lineJoin
+CONSOLE MESSAGE: line 151:     getter lineWidth
+CONSOLE MESSAGE: line 151:     getter miterLimit
+CONSOLE MESSAGE: line 151:     getter shadowBlur
+CONSOLE MESSAGE: line 151:     getter shadowColor
+CONSOLE MESSAGE: line 151:     getter shadowOffsetX
+CONSOLE MESSAGE: line 151:     getter shadowOffsetY
+CONSOLE MESSAGE: line 151:     getter strokeStyle
+CONSOLE MESSAGE: line 151:     method arc
+CONSOLE MESSAGE: line 151:     method arcTo
+CONSOLE MESSAGE: line 151:     method beginPath
+CONSOLE MESSAGE: line 151:     method bezierCurveTo
+CONSOLE MESSAGE: line 151:     method clearRect
+CONSOLE MESSAGE: line 151:     method clip
+CONSOLE MESSAGE: line 151:     method closePath
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method createLinearGradient
+CONSOLE MESSAGE: line 151:     method createPattern
+CONSOLE MESSAGE: line 151:     method createRadialGradient
+CONSOLE MESSAGE: line 151:     method drawImage
+CONSOLE MESSAGE: line 151:     method ellipse
+CONSOLE MESSAGE: line 151:     method fill
+CONSOLE MESSAGE: line 151:     method fillRect
+CONSOLE MESSAGE: line 151:     method getLineDash
+CONSOLE MESSAGE: line 151:     method isPointInPath
+CONSOLE MESSAGE: line 151:     method isPointInStroke
+CONSOLE MESSAGE: line 151:     method lineTo
+CONSOLE MESSAGE: line 151:     method moveTo
+CONSOLE MESSAGE: line 151:     method quadraticCurveTo
+CONSOLE MESSAGE: line 151:     method rect
+CONSOLE MESSAGE: line 151:     method resetTransform
+CONSOLE MESSAGE: line 151:     method restore
+CONSOLE MESSAGE: line 151:     method rotate
+CONSOLE MESSAGE: line 151:     method save
+CONSOLE MESSAGE: line 151:     method scale
+CONSOLE MESSAGE: line 151:     method setLineDash
+CONSOLE MESSAGE: line 151:     method setTransform
+CONSOLE MESSAGE: line 151:     method stroke
+CONSOLE MESSAGE: line 151:     method strokeRect
+CONSOLE MESSAGE: line 151:     method transform
+CONSOLE MESSAGE: line 151:     method translate
+CONSOLE MESSAGE: line 151:     setter currentTransform
+CONSOLE MESSAGE: line 151:     setter fillStyle
+CONSOLE MESSAGE: line 151:     setter filter
+CONSOLE MESSAGE: line 151:     setter globalAlpha
+CONSOLE MESSAGE: line 151:     setter globalCompositeOperation
+CONSOLE MESSAGE: line 151:     setter imageSmoothingEnabled
+CONSOLE MESSAGE: line 151:     setter imageSmoothingQuality
+CONSOLE MESSAGE: line 151:     setter lineCap
+CONSOLE MESSAGE: line 151:     setter lineDashOffset
+CONSOLE MESSAGE: line 151:     setter lineJoin
+CONSOLE MESSAGE: line 151:     setter lineWidth
+CONSOLE MESSAGE: line 151:     setter miterLimit
+CONSOLE MESSAGE: line 151:     setter shadowBlur
+CONSOLE MESSAGE: line 151:     setter shadowColor
+CONSOLE MESSAGE: line 151:     setter shadowOffsetX
+CONSOLE MESSAGE: line 151:     setter shadowOffsetY
+CONSOLE MESSAGE: line 151:     setter strokeStyle
+CONSOLE MESSAGE: line 151: interface PaintSize
+CONSOLE MESSAGE: line 151:     getter height
+CONSOLE MESSAGE: line 151:     getter width
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface PaintWorkletGlobalScope : WorkletGlobalScope
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface Path2D
+CONSOLE MESSAGE: line 151:     method addPath
+CONSOLE MESSAGE: line 151:     method arc
+CONSOLE MESSAGE: line 151:     method arcTo
+CONSOLE MESSAGE: line 151:     method bezierCurveTo
+CONSOLE MESSAGE: line 151:     method closePath
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method ellipse
+CONSOLE MESSAGE: line 151:     method lineTo
+CONSOLE MESSAGE: line 151:     method moveTo
+CONSOLE MESSAGE: line 151:     method quadraticCurveTo
+CONSOLE MESSAGE: line 151:     method rect
+CONSOLE MESSAGE: line 151: interface ReadableStream
+CONSOLE MESSAGE: line 151:     getter locked
+CONSOLE MESSAGE: line 151:     method cancel
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method getReader
+CONSOLE MESSAGE: line 151:     method pipeThrough
+CONSOLE MESSAGE: line 151:     method pipeTo
+CONSOLE MESSAGE: line 151:     method tee
+CONSOLE MESSAGE: line 151: interface StylePropertyMapReadOnly
+CONSOLE MESSAGE: line 151:     getter size
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method entries
+CONSOLE MESSAGE: line 151:     method forEach
+CONSOLE MESSAGE: line 151:     method get
+CONSOLE MESSAGE: line 151:     method getAll
+CONSOLE MESSAGE: line 151:     method has
+CONSOLE MESSAGE: line 151:     method keys
+CONSOLE MESSAGE: line 151:     method values
+CONSOLE MESSAGE: line 151: interface TransformStream
+CONSOLE MESSAGE: line 151:     getter readable
+CONSOLE MESSAGE: line 151:     getter writable
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface WorkletGlobalScope
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151: interface WritableStream
+CONSOLE MESSAGE: line 151:     getter locked
+CONSOLE MESSAGE: line 151:     method abort
+CONSOLE MESSAGE: line 151:     method constructor
+CONSOLE MESSAGE: line 151:     method getWriter
+CONSOLE MESSAGE: line 151: global object
+CONSOLE MESSAGE: line 151:     attribute console
+CONSOLE MESSAGE: line 151:     getter devicePixelRatio
+CONSOLE MESSAGE: line 151:     method gc
+CONSOLE MESSAGE: line 151:     method registerPaint
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/resources/global-interface-listing-worklet.js b/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/resources/global-interface-listing-worklet.js
index 56ebbb2..aa455df 100644
--- a/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/resources/global-interface-listing-worklet.js
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/resources/global-interface-listing-worklet.js
@@ -21,7 +21,11 @@
 var js_builtins = new Set([
     'Array',
     'ArrayBuffer',
+    'BigInt',
+    'BigInt64Array',
+    'BigUint64Array',
     'Boolean',
+    'DataView',
     'Date',
     'Error',
     'EvalError',
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/IndexedDB/interfaces.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/background-fetch/interfaces-expected.txt
new file mode 100644
index 0000000..27a8fa6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/background-fetch/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Exposed interfaces in a Document. promise_test: Unhandled rejection with value: object "BackgroundFetchRegistration inherits EventTarget, but EventTarget is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
new file mode 100644
index 0000000..35e0749
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Untitled Uncaught SecurityPolicyViolationEventInit inherits EventInit, but SecurityPolicyViolationEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/fullscreen/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/fullscreen/interfaces-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/fullscreen/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/html/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/html/dom/interfaces-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/html/dom/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/media-capabilities/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/media-capabilities/idlharness-expected.txt
new file mode 100644
index 0000000..2dcd3d0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/media-capabilities/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Media Capabilities IDL tests Uncaught MediaDecodingConfiguration inherits MediaConfiguration, but MediaDecodingConfiguration is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
new file mode 100644
index 0000000..ff43cb4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "MediaTrackConstraints inherits MediaTrackConstraintSet, but MediaTrackConstraints is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/payment-handler/interfaces.https.any-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/payment-handler/interfaces.https.any-expected.txt
new file mode 100644
index 0000000..81630dd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/payment-handler/interfaces.https.any-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Payment handler interfaces. promise_test: Unhandled rejection with value: object "CanMakePaymentEvent inherits ExtendableEvent, but ExtendableEvent is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
new file mode 100644
index 0000000..851df2b794
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL GainNode IDL Test Uncaught GainOptions inherits AudioNodeOptions, but GainOptions is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webstorage/idlharness-expected.txt
new file mode 100644
index 0000000..5991f94fa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webstorage/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Web Storage IDL tests Uncaught StorageEventInit inherits EventInit, but StorageEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webusb/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webusb/idlharness.https-expected.txt
new file mode 100644
index 0000000..2a8db22
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webusb/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL WebUSB IDL test promise_test: Unhandled rejection with value: object "USBConnectionEventInit inherits EventInit, but USBConnectionEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webxr/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webxr/interfaces.https-expected.txt
new file mode 100644
index 0000000..e76f2824
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webxr/interfaces.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test IDL implementation of WebXR API promise_test: Unhandled rejection with value: object "Partial dictionary WebGLContextAttributes with no original dictionary"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt
index f48e3441..536d00b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 74: 'webkitURL' is deprecated. Please use 'URL' instead.
+CONSOLE WARNING: line 78: 'webkitURL' is deprecated. Please use 'URL' instead.
 This test documents all interface attributes and methods on the global window object and element instances.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/IndexedDB/interfaces.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/background-fetch/interfaces-expected.txt
new file mode 100644
index 0000000..27a8fa6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/background-fetch/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Exposed interfaces in a Document. promise_test: Unhandled rejection with value: object "BackgroundFetchRegistration inherits EventTarget, but EventTarget is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
new file mode 100644
index 0000000..35e0749
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Untitled Uncaught SecurityPolicyViolationEventInit inherits EventInit, but SecurityPolicyViolationEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/fullscreen/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/fullscreen/interfaces-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/fullscreen/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/dom/interfaces-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/dom/interfaces-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/media-capabilities/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/media-capabilities/idlharness-expected.txt
new file mode 100644
index 0000000..2dcd3d0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/media-capabilities/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Media Capabilities IDL tests Uncaught MediaDecodingConfiguration inherits MediaConfiguration, but MediaDecodingConfiguration is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
new file mode 100644
index 0000000..ff43cb4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "MediaTrackConstraints inherits MediaTrackConstraintSet, but MediaTrackConstraints is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/payment-handler/interfaces.https.any-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/payment-handler/interfaces.https.any-expected.txt
new file mode 100644
index 0000000..81630dd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/payment-handler/interfaces.https.any-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Payment handler interfaces. promise_test: Unhandled rejection with value: object "CanMakePaymentEvent inherits ExtendableEvent, but ExtendableEvent is undefined."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
new file mode 100644
index 0000000..851df2b794
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL GainNode IDL Test Uncaught GainOptions inherits AudioNodeOptions, but GainOptions is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webstorage/idlharness-expected.txt
new file mode 100644
index 0000000..5991f94fa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webstorage/idlharness-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Web Storage IDL tests Uncaught StorageEventInit inherits EventInit, but StorageEventInit is not an interface.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webusb/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webusb/idlharness.https-expected.txt
new file mode 100644
index 0000000..2a8db22
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webusb/idlharness.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL WebUSB IDL test promise_test: Unhandled rejection with value: object "USBConnectionEventInit inherits EventInit, but USBConnectionEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webxr/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webxr/interfaces.https-expected.txt
new file mode 100644
index 0000000..e76f2824
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webxr/interfaces.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test IDL implementation of WebXR API promise_test: Unhandled rejection with value: object "Partial dictionary WebGLContextAttributes with no original dictionary"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt
index 11a32fa0..4d98413 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-platform-specific-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 74: 'webkitURL' is deprecated. Please use 'URL' instead.
+CONSOLE WARNING: line 78: 'webkitURL' is deprecated. Please use 'URL' instead.
 This test documents all interface attributes and methods on the global window object and element instances.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/resources/global-interface-listing.js b/third_party/WebKit/LayoutTests/resources/global-interface-listing.js
index 8cb2cdf..d9d4f204 100644
--- a/third_party/WebKit/LayoutTests/resources/global-interface-listing.js
+++ b/third_party/WebKit/LayoutTests/resources/global-interface-listing.js
@@ -13,11 +13,15 @@
 // objects have, so exercising them in a Blink test doesn't make sense.
 //
 // If new builtins are added, please update this list along with the one in
-// LayoutTests/http/tests/serviceworker/webexposed/resources/global-interface-listing-worker.js
+// LayoutTests/http/tests/worklet/webexposed/resources/global-interface-listing-worklet.js
 var jsBuiltins = new Set([
     'Array',
     'ArrayBuffer',
+    'BigInt',
+    'BigInt64Array',
+    'BigUint64Array',
     'Boolean',
+    'DataView',
     'Date',
     'Error',
     'EvalError',
diff --git a/third_party/WebKit/LayoutTests/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
new file mode 100644
index 0000000..ff43cb4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "MediaTrackConstraints inherits MediaTrackConstraintSet, but MediaTrackConstraints is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt b/third_party/WebKit/LayoutTests/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
new file mode 100644
index 0000000..bc6c479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index f78b0bc..3cda36d 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -290,28 +290,6 @@
     method constructor
     method contains
     method item
-interface DataView
-    attribute @@toStringTag
-    getter buffer
-    getter byteLength
-    getter byteOffset
-    method constructor
-    method getFloat32
-    method getFloat64
-    method getInt16
-    method getInt32
-    method getInt8
-    method getUint16
-    method getUint32
-    method getUint8
-    method setFloat32
-    method setFloat64
-    method setInt16
-    method setInt32
-    method setInt8
-    method setUint16
-    method setUint32
-    method setUint8
 interface Event
     attribute @@toStringTag
     attribute AT_TARGET
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 4eee6b9..406ee07 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -281,28 +281,6 @@
 [Worker]     method constructor
 [Worker]     method contains
 [Worker]     method item
-[Worker] interface DataView
-[Worker]     attribute @@toStringTag
-[Worker]     getter buffer
-[Worker]     getter byteLength
-[Worker]     getter byteOffset
-[Worker]     method constructor
-[Worker]     method getFloat32
-[Worker]     method getFloat64
-[Worker]     method getInt16
-[Worker]     method getInt32
-[Worker]     method getInt8
-[Worker]     method getUint16
-[Worker]     method getUint32
-[Worker]     method getUint8
-[Worker]     method setFloat32
-[Worker]     method setFloat64
-[Worker]     method setInt16
-[Worker]     method setInt32
-[Worker]     method setInt8
-[Worker]     method setUint16
-[Worker]     method setUint32
-[Worker]     method setUint8
 [Worker] interface DedicatedWorkerGlobalScope : WorkerGlobalScope
 [Worker]     attribute @@toStringTag
 [Worker]     attribute PERSISTENT
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
index bdf4fb7..535c308 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 74: 'webkitURL' is deprecated. Please use 'URL' instead.
+CONSOLE WARNING: line 78: 'webkitURL' is deprecated. Please use 'URL' instead.
 This test documents all interface attributes and methods on the global window object and element instances.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -1094,28 +1094,6 @@
     method clear
     method constructor
     method remove
-interface DataView
-    attribute @@toStringTag
-    getter buffer
-    getter byteLength
-    getter byteOffset
-    method constructor
-    method getFloat32
-    method getFloat64
-    method getInt16
-    method getInt32
-    method getInt8
-    method getUint16
-    method getUint32
-    method getUint8
-    method setFloat32
-    method setFloat64
-    method setInt16
-    method setInt32
-    method setInt8
-    method setUint16
-    method setUint32
-    method setUint8
 interface DelayNode : AudioNode
     attribute @@toStringTag
     getter delayTime
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
index 672db1e..2dc0f99 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -281,28 +281,6 @@
 [Worker]     method constructor
 [Worker]     method contains
 [Worker]     method item
-[Worker] interface DataView
-[Worker]     attribute @@toStringTag
-[Worker]     getter buffer
-[Worker]     getter byteLength
-[Worker]     getter byteOffset
-[Worker]     method constructor
-[Worker]     method getFloat32
-[Worker]     method getFloat64
-[Worker]     method getInt16
-[Worker]     method getInt32
-[Worker]     method getInt8
-[Worker]     method getUint16
-[Worker]     method getUint32
-[Worker]     method getUint8
-[Worker]     method setFloat32
-[Worker]     method setFloat64
-[Worker]     method setInt16
-[Worker]     method setInt32
-[Worker]     method setInt8
-[Worker]     method setUint16
-[Worker]     method setUint32
-[Worker]     method setUint8
 [Worker] interface Event
 [Worker]     attribute @@toStringTag
 [Worker]     attribute AT_TARGET
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 73ac3cc..5750d1b 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -320,28 +320,6 @@
 [Worker]     method constructor
 [Worker]     method contains
 [Worker]     method item
-[Worker] interface DataView
-[Worker]     attribute @@toStringTag
-[Worker]     getter buffer
-[Worker]     getter byteLength
-[Worker]     getter byteOffset
-[Worker]     method constructor
-[Worker]     method getFloat32
-[Worker]     method getFloat64
-[Worker]     method getInt16
-[Worker]     method getInt32
-[Worker]     method getInt8
-[Worker]     method getUint16
-[Worker]     method getUint32
-[Worker]     method getUint8
-[Worker]     method setFloat32
-[Worker]     method setFloat64
-[Worker]     method setInt16
-[Worker]     method setInt32
-[Worker]     method setInt8
-[Worker]     method setUint16
-[Worker]     method setUint32
-[Worker]     method setUint8
 [Worker] interface DedicatedWorkerGlobalScope : WorkerGlobalScope
 [Worker]     attribute @@toStringTag
 [Worker]     attribute PERSISTENT
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 530de08..ef73d7a 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 74: 'webkitURL' is deprecated. Please use 'URL' instead.
+CONSOLE WARNING: line 78: 'webkitURL' is deprecated. Please use 'URL' instead.
 This test documents all interface attributes and methods on the global window object and element instances.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -1438,28 +1438,6 @@
     method clear
     method constructor
     method remove
-interface DataView
-    attribute @@toStringTag
-    getter buffer
-    getter byteLength
-    getter byteOffset
-    method constructor
-    method getFloat32
-    method getFloat64
-    method getInt16
-    method getInt32
-    method getInt8
-    method getUint16
-    method getUint32
-    method getUint8
-    method setFloat32
-    method setFloat64
-    method setInt16
-    method setInt32
-    method setInt8
-    method setUint16
-    method setUint32
-    method setUint8
 interface DelayNode : AudioNode
     attribute @@toStringTag
     getter delayTime
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-platform-specific-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-platform-specific-expected.txt
index f32cb2301b..d32b6e85 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-platform-specific-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-platform-specific-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 74: 'webkitURL' is deprecated. Please use 'URL' instead.
+CONSOLE WARNING: line 78: 'webkitURL' is deprecated. Please use 'URL' instead.
 This test documents all interface attributes and methods on the global window object and element instances.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
index 09596cf2..2a12a86 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -320,28 +320,6 @@
 [Worker]     method constructor
 [Worker]     method contains
 [Worker]     method item
-[Worker] interface DataView
-[Worker]     attribute @@toStringTag
-[Worker]     getter buffer
-[Worker]     getter byteLength
-[Worker]     getter byteOffset
-[Worker]     method constructor
-[Worker]     method getFloat32
-[Worker]     method getFloat64
-[Worker]     method getInt16
-[Worker]     method getInt32
-[Worker]     method getInt8
-[Worker]     method getUint16
-[Worker]     method getUint32
-[Worker]     method getUint8
-[Worker]     method setFloat32
-[Worker]     method setFloat64
-[Worker]     method setInt16
-[Worker]     method setInt32
-[Worker]     method setInt8
-[Worker]     method setUint16
-[Worker]     method setUint32
-[Worker]     method setUint8
 [Worker] interface Event
 [Worker]     attribute @@toStringTag
 [Worker]     attribute AT_TARGET
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.cc
index be1cff0..6f387b69 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.cc
@@ -55,7 +55,8 @@
       shape_options_(kPreContext | kPostContext),
       is_empty_item_(false),
       should_create_box_fragment_(false),
-      style_variant_(static_cast<unsigned>(NGStyleVariant::kStandard)) {
+      style_variant_(static_cast<unsigned>(NGStyleVariant::kStandard)),
+      end_collapse_type_(kNotCollapsible) {
   DCHECK_GE(end, start);
   ComputeBoxProperties();
 }
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.h b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.h
index efce19c..b1be2677 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.h
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_item.h
@@ -49,6 +49,17 @@
     kPostContext = 2
   };
 
+  enum NGCollapseType {
+    // No collapsible spaces.
+    kNotCollapsible,
+    // A collapsible space run that does not contain segment breaks.
+    kCollapsibleSpace,
+    // A collapsible space run that contains segment breaks.
+    kCollapsibleNewline,
+    // This item is opaque to whitespace collapsing.
+    kOpaqueToCollapsing
+  };
+
   // The constructor and destructor can't be implicit or inlined, because they
   // require full definition of ComputedStyle.
   NGInlineItem(NGInlineItemType type,
@@ -101,6 +112,12 @@
     return static_cast<NGStyleVariant>(style_variant_);
   }
 
+  // Get or set the whitespace collapse type at the end of this item.
+  NGCollapseType EndCollapseType() const {
+    return static_cast<NGCollapseType>(end_collapse_type_);
+  }
+  void SetEndCollapseType(NGCollapseType type) { end_collapse_type_ = type; }
+
   static void Split(Vector<NGInlineItem>&, unsigned index, unsigned offset);
   static unsigned SetBidiLevel(Vector<NGInlineItem>&,
                                unsigned index,
@@ -128,6 +145,7 @@
   unsigned is_empty_item_ : 1;
   unsigned should_create_box_fragment_ : 1;
   unsigned style_variant_ : 2;
+  unsigned end_collapse_type_ : 2;  // NGCollapseType
   friend class NGInlineNode;
 };
 
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc
index 596a492..7717bdf 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc
@@ -52,22 +52,22 @@
 // CSS Text, Segment Break Transformation Rules
 // https://drafts.csswg.org/css-text-3/#line-break-transform
 static bool ShouldRemoveNewlineSlow(const StringBuilder& before,
+                                    unsigned space_index,
                                     const ComputedStyle* before_style,
-                                    const String& after,
-                                    unsigned after_index,
+                                    const StringView& after,
                                     const ComputedStyle* after_style) {
   // Remove if either before/after the newline is zeroWidthSpaceCharacter.
   UChar32 last = 0;
-  DCHECK(!before.IsEmpty());
-  DCHECK_EQ(before[before.length() - 1], ' ');
-  if (before.length() >= 2) {
-    last = before[before.length() - 2];
+  DCHECK(space_index == before.length() ||
+         (space_index < before.length() && before[space_index] == ' '));
+  if (space_index) {
+    last = before[space_index - 1];
     if (last == kZeroWidthSpaceCharacter)
       return true;
   }
   UChar32 next = 0;
-  if (after_index < after.length()) {
-    next = after[after_index];
+  if (!after.IsEmpty()) {
+    next = after[0];
     if (next == kZeroWidthSpaceCharacter)
       return true;
   }
@@ -77,14 +77,14 @@
     return false;
 
   // Remove if East Asian Widths of both before/after the newline are Wide.
-  if (U16_IS_TRAIL(last) && before.length() >= 2) {
-    UChar last_last = before[before.length() - 2];
+  if (U16_IS_TRAIL(last) && space_index >= 2) {
+    UChar last_last = before[space_index - 2];
     if (U16_IS_LEAD(last_last))
       last = U16_GET_SUPPLEMENTARY(last_last, last);
   }
   if (IsEastAsianWidthWide(last, before_style)) {
-    if (U16_IS_LEAD(next) && after_index + 1 < after.length()) {
-      UChar next_next = after[after_index + 1];
+    if (U16_IS_LEAD(next) && after.length() > 1) {
+      UChar next_next = after[1];
       if (U16_IS_TRAIL(next_next))
         next = U16_GET_SUPPLEMENTARY(next, next_next);
     }
@@ -96,13 +96,13 @@
 }
 
 static bool ShouldRemoveNewline(const StringBuilder& before,
+                                unsigned space_index,
                                 const ComputedStyle* before_style,
-                                const String& after,
-                                unsigned after_index,
+                                const StringView& after,
                                 const ComputedStyle* after_style) {
   // All characters before/after removable newline are 16 bits.
   return (!before.Is8Bit() || !after.Is8Bit()) &&
-         ShouldRemoveNewlineSlow(before, before_style, after, after_index,
+         ShouldRemoveNewlineSlow(before, space_index, before_style, after,
                                  after_style);
 }
 
@@ -112,7 +112,6 @@
                        unsigned end,
                        const ComputedStyle* style = nullptr,
                        LayoutObject* layout_object = nullptr) {
-  DCHECK(items->IsEmpty() || items->back().EndOffset() == start);
   items->push_back(NGInlineItem(type, start, end, style, layout_object));
 }
 
@@ -141,6 +140,36 @@
          ShouldIgnore(c);
 }
 
+// Find the end of the collapsible spaces.
+// Returns whether this space run contains a newline or not, because it changes
+// the collapsing behavior.
+static inline bool MoveToEndOfCollapsibleSpaces(const StringView& string,
+                                                unsigned* offset,
+                                                UChar* c) {
+  DCHECK_EQ(*c, string[*offset]);
+  DCHECK(IsCollapsibleSpace(*c));
+  bool space_run_has_newline = *c == kNewlineCharacter;
+  for ((*offset)++; *offset < string.length(); (*offset)++) {
+    *c = string[*offset];
+    space_run_has_newline |= *c == kNewlineCharacter;
+    if (!IsCollapsibleSpace(*c))
+      break;
+  }
+  return space_run_has_newline;
+}
+
+// Find the last item to compute collapsing with. Opaque items such as
+// open/close or bidi controls are ignored.
+// Returns nullptr if there were no previous items.
+static NGInlineItem* LastItemToCollapseWith(Vector<NGInlineItem>* items) {
+  for (auto it = items->rbegin(); it != items->rend(); it++) {
+    NGInlineItem& item = *it;
+    if (item.EndCollapseType() != NGInlineItem::kOpaqueToCollapsing)
+      return &item;
+  }
+  return nullptr;
+}
+
 template <typename OffsetMappingBuilder>
 void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::Append(
     const String& string,
@@ -153,9 +182,7 @@
   typename OffsetMappingBuilder::SourceNodeScope scope(&mapping_builder_,
                                                        layout_object);
 
-  last_auto_wrap_ = auto_wrap_;
   EWhiteSpace whitespace = style->WhiteSpace();
-  auto_wrap_ = ComputedStyle::AutoWrap(whitespace);
   bool is_svg_text = layout_object && layout_object->IsSVGInlineText();
 
   if (!ComputedStyle::CollapseWhiteSpace(whitespace))
@@ -163,82 +190,191 @@
   else if (ComputedStyle::PreserveNewline(whitespace) && !is_svg_text)
     AppendPreserveNewline(string, style, layout_object);
   else
-    AppendCollapseWhitespace(string, 0, string.length(), style, layout_object);
+    AppendCollapseWhitespace(string, style, layout_object);
 }
 
 template <typename OffsetMappingBuilder>
 void NGInlineItemsBuilderTemplate<
-    OffsetMappingBuilder>::AppendCollapseWhitespace(const String& string,
-                                                    unsigned start,
-                                                    unsigned end,
+    OffsetMappingBuilder>::AppendCollapseWhitespace(const StringView string,
                                                     const ComputedStyle* style,
                                                     LayoutText* layout_object) {
-  DCHECK_GT(end, start);
+  DCHECK(!string.IsEmpty());
 
-  // Collapsed spaces are "zero advance width, invisible, but retains its soft
-  // wrap opportunity". When the first collapsible space was in 'nowrap',
-  // following collapsed spaces should create a break opportunity.
-  // https://drafts.csswg.org/css-text-3/#collapse
-  if (last_collapsible_space_ != CollapsibleSpace::kNone && !last_auto_wrap_ &&
-      auto_wrap_ && IsCollapsibleSpace(string[start])) {
-    typename OffsetMappingBuilder::SourceNodeScope scope(&mapping_builder_,
-                                                         nullptr);
-    AppendBreakOpportunity(style, nullptr);
-    last_collapsible_space_ = CollapsibleSpace::kSpace;
+  // This algorithm segments the input string at the collapsible space, and
+  // process collapsible space run and non-space run alternately.
+
+  // The first run, regardless it is a collapsible space run or not, is special
+  // that it can interact with the last item. Depends on the end of the last
+  // item, it may either change collapsing behavior to collapse the leading
+  // spaces of this item entirely, or remove the trailing spaces of the last
+  // item.
+
+  // Due to this difference, this algorithm process the first run first, then
+  // loop through the rest of runs.
+
+  unsigned start_offset;
+  NGInlineItem::NGCollapseType end_collapse = NGInlineItem::kNotCollapsible;
+  unsigned i = 0;
+  UChar c = string[i];
+  if (IsCollapsibleSpace(c)) {
+    // Find the end of the collapsible space run.
+    bool space_run_has_newline = MoveToEndOfCollapsibleSpaces(string, &i, &c);
+
+    // LayoutBR does not set preserve_newline, but should be preserved.
+    if (UNLIKELY(space_run_has_newline && string.length() == 1 &&
+                 layout_object && layout_object->IsBR())) {
+      AppendForcedBreakCollapseWhitespace(style, layout_object);
+      return;
+    }
+
+    // Check the last item this space run may be collapsed with.
+    bool insert_space;
+    if (NGInlineItem* item = LastItemToCollapseWith(items_)) {
+      if (item->EndCollapseType() == NGInlineItem::kNotCollapsible) {
+        // The last item does not end with a collapsible space.
+        // Insert a space to represent this space run.
+        insert_space = true;
+      } else {
+        // The last item ends with a collapsible space this run should collapse
+        // to. Collapse the entire space run in this item.
+        DCHECK(item->EndCollapseType() == NGInlineItem::kCollapsibleSpace ||
+               item->EndCollapseType() == NGInlineItem::kCollapsibleNewline);
+        insert_space = false;
+
+        // If the space run either in this item or in the last item contains a
+        // newline, apply segment break rules. This may result in removal of
+        // the space in the last item.
+        if ((space_run_has_newline ||
+             item->EndCollapseType() == NGInlineItem::kCollapsibleNewline) &&
+            item->Type() == NGInlineItem::kText &&
+            ShouldRemoveNewline(text_, item->EndOffset() - 1, item->Style(),
+                                StringView(string, i), style)) {
+          RemoveTrailingCollapsibleSpace(item);
+          space_run_has_newline = false;
+        } else if (!item->Style()->AutoWrap() && style->AutoWrap()) {
+          // Otherwise, remove the space run entirely, collapsing to the space
+          // in the last item.
+
+          // There is a special case to generate a break opportunity though.
+          // Spec-wise, collapsed spaces are "zero advance width, invisible,
+          // but retains its soft wrap opportunity".
+          // https://drafts.csswg.org/css-text-3/#collapse
+          // In most cases, this is not needed and that collapsed spaces are
+          // removed entirely. However, when the first collapsible space is
+          // 'nowrap', and the following collapsed space is 'wrap', the
+          // collapsed space needs to create a break opportunity.
+          typename OffsetMappingBuilder::SourceNodeScope scope(
+              &mapping_builder_, nullptr);
+          AppendBreakOpportunity(style, nullptr);
+        }
+      }
+    } else {
+      // This space is at the beginning of the paragraph. Remove leading spaces
+      // as CSS requires.
+      insert_space = false;
+    }
+
+    // If this space run contains a newline, apply segment break rules.
+    if (space_run_has_newline &&
+        ShouldRemoveNewline(text_, text_.length(), style, StringView(string, i),
+                            style)) {
+      insert_space = space_run_has_newline = false;
+    }
+
+    // Done computing the interaction with the last item. Start appending.
+    start_offset = text_.length();
+
+    DCHECK(i);
+    unsigned collapsed_length = i;
+    if (insert_space) {
+      text_.Append(kSpaceCharacter);
+      mapping_builder_.AppendIdentityMapping(1);
+      collapsed_length--;
+    }
+    if (collapsed_length)
+      mapping_builder_.AppendCollapsedMapping(collapsed_length);
+
+    // If this space run is at the end of this item, keep whether the
+    // collapsible space run has a newline or not in the item.
+    if (i == string.length()) {
+      end_collapse = space_run_has_newline ? NGInlineItem::kCollapsibleNewline
+                                           : NGInlineItem::kCollapsibleSpace;
+    }
+  } else {
+    // If the last item ended with a collapsible space run with segment breaks,
+    // apply segment break rules. This may result in removal of the space in the
+    // last item.
+    if (NGInlineItem* item = LastItemToCollapseWith(items_)) {
+      if (item->EndCollapseType() == NGInlineItem::kCollapsibleNewline &&
+          ShouldRemoveNewline(text_, item->EndOffset() - 1, item->Style(),
+                              string, style)) {
+        RemoveTrailingCollapsibleSpace(item);
+      }
+    }
+
+    start_offset = text_.length();
   }
 
-  unsigned start_offset = text_.length();
-  for (unsigned i = start; i < end;) {
-    UChar c = string[i];
-    if (c == kNewlineCharacter) {
-      // LayoutBR does not set preserve_newline, but should be preserved.
-      if (!i && end == 1 && layout_object && layout_object->IsBR()) {
-        AppendForcedBreakCollapseWhitespace(style, layout_object);
-        return;
+  // The first run is done. Loop through the rest of runs.
+  if (i < string.length()) {
+    while (true) {
+      // Append the non-space text until we find a collapsible space.
+      // |string[i]| is guaranteed not to be a space.
+      DCHECK(!IsCollapsibleSpace(string[i]));
+      unsigned start_of_non_space = i;
+      for (i++; i < string.length(); i++) {
+        c = string[i];
+        if (IsCollapsibleSpace(c))
+          break;
       }
+      text_.Append(string, start_of_non_space, i - start_of_non_space);
+      mapping_builder_.AppendIdentityMapping(i - start_of_non_space);
 
-      if (last_collapsible_space_ == CollapsibleSpace::kNone) {
+      if (i == string.length())
+        break;
+
+      // Process a collapsible space run. First, find the end of the run.
+      DCHECK_EQ(c, string[i]);
+      DCHECK(IsCollapsibleSpace(c));
+      unsigned start_of_spaces = i;
+      bool space_run_has_newline = MoveToEndOfCollapsibleSpaces(string, &i, &c);
+
+      // Because leading spaces are handled before this loop, no need to check
+      // cross-item collapsing.
+      DCHECK(start_of_spaces);
+
+      // If this space run contains a newline, apply segment break rules.
+      if (space_run_has_newline &&
+          ShouldRemoveNewline(text_, text_.length(), style,
+                              StringView(string, i), style)) {
+        space_run_has_newline = false;
+      } else {
+        // Otherwise, or if the segment break rules did not remove the run,
+        // append a space.
         text_.Append(kSpaceCharacter);
         mapping_builder_.AppendIdentityMapping(1);
-      } else {
-        mapping_builder_.AppendCollapsedMapping(1);
+        start_of_spaces++;
       }
-      last_collapsible_space_ = CollapsibleSpace::kNewline;
-      i++;
-      continue;
-    }
 
-    if (c == kSpaceCharacter || c == kTabulationCharacter) {
-      if (last_collapsible_space_ == CollapsibleSpace::kNone) {
-        text_.Append(kSpaceCharacter);
-        last_collapsible_space_ = CollapsibleSpace::kSpace;
-        mapping_builder_.AppendIdentityMapping(1);
-      } else {
-        mapping_builder_.AppendCollapsedMapping(1);
+      if (i != start_of_spaces)
+        mapping_builder_.AppendCollapsedMapping(i - start_of_spaces);
+
+      // If this space run is at the end of this item, keep whether the
+      // collapsible space run has a newline or not in the item.
+      if (i == string.length()) {
+        end_collapse = space_run_has_newline ? NGInlineItem::kCollapsibleNewline
+                                             : NGInlineItem::kCollapsibleSpace;
+        break;
       }
-      i++;
-      continue;
     }
-
-    if (last_collapsible_space_ == CollapsibleSpace::kNewline) {
-      RemoveTrailingCollapsibleNewlineIfNeeded(string, i, style);
-      start_offset = std::min(start_offset, text_.length());
-    }
-
-    size_t end_of_non_space = string.Find(IsCollapsibleSpace, i + 1);
-    if (end_of_non_space == kNotFound)
-      end_of_non_space = string.length();
-    text_.Append(string, i, end_of_non_space - i);
-    mapping_builder_.AppendIdentityMapping(end_of_non_space - i);
-    i = end_of_non_space;
-    last_collapsible_space_ = CollapsibleSpace::kNone;
   }
 
   if (text_.length() > start_offset) {
     AppendItem(items_, NGInlineItem::kText, start_offset, text_.length(), style,
                layout_object);
-
-    is_empty_inline_ &= items_->back().IsEmptyItem();
+    NGInlineItem& item = items_->back();
+    item.SetEndCollapseType(end_collapse);
+    is_empty_inline_ &= item.IsEmptyItem();
   }
 }
 
@@ -272,8 +408,6 @@
     is_empty_inline_ &= items_->back().IsEmptyItem();
     start = end;
   }
-
-  last_collapsible_space_ = CollapsibleSpace::kNone;
 }
 
 template <typename OffsetMappingBuilder>
@@ -291,7 +425,9 @@
     size_t end = string.find(kNewlineCharacter, start + 1);
     if (end == kNotFound)
       end = string.length();
-    AppendCollapseWhitespace(string, start, end, style, layout_object);
+    DCHECK_GE(end, start);
+    AppendCollapseWhitespace(StringView(string, start, end - start), style,
+                             layout_object);
     start = end;
   }
 }
@@ -311,6 +447,12 @@
 
   Append(NGInlineItem::kControl, kNewlineCharacter, style, layout_object);
 
+  // A forced break is not a collapsible space, but following collapsible spaces
+  // are leading spaces and that they should be collapsed.
+  // Pretend that this item ends with a collapsible space, so that following
+  // collapsible spaces can be collapsed.
+  items_->back().SetEndCollapseType(NGInlineItem::kCollapsibleSpace);
+
   // Then re-add bidi controls to restore the bidi context.
   if (!bidi_context_.IsEmpty()) {
     typename OffsetMappingBuilder::SourceNodeScope scope(&mapping_builder_,
@@ -328,17 +470,14 @@
   RemoveTrailingCollapsibleSpaceIfExists();
 
   AppendForcedBreak(style, layout_object);
-
-  // Remove collapsible spaces immediately after a preserved newline.
-  last_collapsible_space_ = CollapsibleSpace::kSpace;
 }
 
 template <typename OffsetMappingBuilder>
 void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::AppendBreakOpportunity(
     const ComputedStyle* style,
     LayoutObject* layout_object) {
-  Append(NGInlineItem::kControl, kZeroWidthSpaceCharacter, style,
-         layout_object);
+  AppendOpaque(NGInlineItem::kControl, kZeroWidthSpaceCharacter, style,
+               layout_object);
 }
 
 template <typename OffsetMappingBuilder>
@@ -355,7 +494,6 @@
   AppendItem(items_, type, end_offset - 1, end_offset, style, layout_object);
 
   is_empty_inline_ &= items_->back().IsEmptyItem();
-  last_collapsible_space_ = CollapsibleSpace::kNone;
 }
 
 template <typename OffsetMappingBuilder>
@@ -379,7 +517,9 @@
   unsigned end_offset = text_.length();
   AppendItem(items_, type, end_offset - 1, end_offset, style, layout_object);
 
-  is_empty_inline_ &= items_->back().IsEmptyItem();
+  NGInlineItem& item = items_->back();
+  item.SetEndCollapseType(NGInlineItem::kOpaqueToCollapsing);
+  is_empty_inline_ &= item.IsEmptyItem();
 }
 
 template <typename OffsetMappingBuilder>
@@ -390,89 +530,60 @@
   unsigned end_offset = text_.length();
   AppendItem(items_, type, end_offset, end_offset, style, layout_object);
 
-  is_empty_inline_ &= items_->back().IsEmptyItem();
-}
-
-// Removes the collapsible newline at the end of |text_| if exists and the
-// removal conditions met.
-template <typename OffsetMappingBuilder>
-void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::
-    RemoveTrailingCollapsibleNewlineIfNeeded(const String& after,
-                                             unsigned after_index,
-                                             const ComputedStyle* after_style) {
-  DCHECK_EQ(last_collapsible_space_, CollapsibleSpace::kNewline);
-
-  if (text_.IsEmpty() || text_[text_.length() - 1] != kSpaceCharacter)
-    return;
-
-  const ComputedStyle* before_style = after_style;
-  if (!items_->IsEmpty()) {
-    NGInlineItem& item = items_->back();
-    if (text_.length() < item.EndOffset() + 2)
-      before_style = item.Style();
-  }
-
-  if (ShouldRemoveNewline(text_, before_style, after, after_index, after_style))
-    RemoveTrailingCollapsibleSpace(text_.length() - 1);
+  NGInlineItem& item = items_->back();
+  item.SetEndCollapseType(NGInlineItem::kOpaqueToCollapsing);
+  is_empty_inline_ &= item.IsEmptyItem();
 }
 
 // Removes the collapsible space at the end of |text_| if exists.
 template <typename OffsetMappingBuilder>
 void NGInlineItemsBuilderTemplate<
     OffsetMappingBuilder>::RemoveTrailingCollapsibleSpaceIfExists() {
-  if (last_collapsible_space_ == CollapsibleSpace::kNone || text_.IsEmpty())
-    return;
-
-  // Look for the last space character since characters that are opaque to
-  // whitespace collapsing may be appended.
-  for (unsigned i = text_.length(); i;) {
-    UChar ch = text_[--i];
-    if (ch == kSpaceCharacter) {
-      RemoveTrailingCollapsibleSpace(i);
-      return;
-    }
-
-    // AppendForcedBreakCollapseWhitespace sets CollapsibleSpace::kSpace to
-    // ignore leading spaces. In this case, the trailing collapsible space does
-    // not exist.
-    if (ch == kNewlineCharacter)
-      return;
+  if (NGInlineItem* item = LastItemToCollapseWith(items_)) {
+    if (item->EndCollapseType() != NGInlineItem::kNotCollapsible)
+      RemoveTrailingCollapsibleSpace(item);
   }
-  // We could still reach here because the initial value is kSpace, in order to
-  // collapse leading spaces.
 }
 
-// Removes the collapsible space at the specified index.
+// Removes the collapsible space at the end of the specified item.
 template <typename OffsetMappingBuilder>
 void NGInlineItemsBuilderTemplate<
-    OffsetMappingBuilder>::RemoveTrailingCollapsibleSpace(unsigned index) {
-  DCHECK_NE(last_collapsible_space_, CollapsibleSpace::kNone);
-  DCHECK(!text_.IsEmpty());
-  DCHECK_EQ(text_[index], kSpaceCharacter);
+    OffsetMappingBuilder>::RemoveTrailingCollapsibleSpace(NGInlineItem* item) {
+  DCHECK(item);
+  DCHECK_GT(item->Length(), 0u);
+  DCHECK(item->EndCollapseType() == NGInlineItem::kCollapsibleSpace ||
+         item->EndCollapseType() == NGInlineItem::kCollapsibleNewline);
 
-  text_.erase(index);
-  last_collapsible_space_ = CollapsibleSpace::kNone;
-  mapping_builder_.CollapseTrailingSpace(text_.length() - index);
+  // A forced break pretends that it's a collapsible space, see
+  // |AppendForcedBreak()|. It should not be removed.
+  if (item->Type() == NGInlineItem::kControl)
+    return;
+  DCHECK_EQ(item->Type(), NGInlineItem::kText);
 
-  // Adjust items if the removed space is already included.
-  for (unsigned i = items_->size(); i > 0;) {
-    NGInlineItem& item = (*items_)[--i];
-    if (index >= item.EndOffset())
+  unsigned space_offset = item->EndOffset() - 1;
+  DCHECK_EQ(text_[space_offset], kSpaceCharacter);
+  text_.erase(space_offset);
+  mapping_builder_.CollapseTrailingSpace(text_.length() - space_offset);
+
+  // Remove the item if the item has only one space that we're removing.
+  if (item->Length() == 1) {
+    DCHECK_EQ(item->StartOffset(), space_offset);
+    unsigned index = std::distance(items_->begin(), item);
+    items_->EraseAt(index);
+    if (index == items_->size())
       return;
-    if (item.StartOffset() <= index) {
-      if (item.Length() == 1) {
-        DCHECK_EQ(item.StartOffset(), index);
-        DCHECK_EQ(item.Type(), NGInlineItem::kText);
-        items_->EraseAt(i);
-      } else {
-        item.SetEndOffset(item.EndOffset() - 1);
-      }
-      return;
-    }
+    // Re-compute |item| because |EraseAt| may have reallocated the buffer.
+    item = &(*items_)[index];
+  } else {
+    item->SetEndOffset(item->EndOffset() - 1);
+    item->SetEndCollapseType(NGInlineItem::kNotCollapsible);
+    item++;
+  }
 
-    // Trailing spaces can be removed across non-character items.
-    // Adjust their offsets if after the removed index.
-    item.SetOffset(item.StartOffset() - 1, item.EndOffset() - 1);
+  // Trailing spaces can be removed across non-character items.
+  // Adjust their offsets if after the removed index.
+  for (; item != items_->end(); item++) {
+    item->SetOffset(item->StartOffset() - 1, item->EndOffset() - 1);
   }
 }
 
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.h b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.h
index fa00c2b5..b631efe 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.h
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.h
@@ -118,11 +118,6 @@
   };
   Vector<BidiContext> bidi_context_;
 
-  enum class CollapsibleSpace { kNone, kSpace, kNewline };
-
-  CollapsibleSpace last_collapsible_space_ = CollapsibleSpace::kSpace;
-  bool auto_wrap_ = true;
-  bool last_auto_wrap_ = false;
   bool has_bidi_controls_ = false;
   bool is_empty_inline_ = true;
 
@@ -137,9 +132,7 @@
               const ComputedStyle*,
               LayoutObject*);
 
-  void AppendCollapseWhitespace(const String&,
-                                unsigned start,
-                                unsigned end,
+  void AppendCollapseWhitespace(const StringView,
                                 const ComputedStyle*,
                                 LayoutText*);
   void AppendPreserveWhitespace(const String&,
@@ -151,10 +144,7 @@
   void AppendForcedBreak(const ComputedStyle*, LayoutObject*);
 
   void RemoveTrailingCollapsibleSpaceIfExists();
-  void RemoveTrailingCollapsibleSpace(unsigned);
-  void RemoveTrailingCollapsibleNewlineIfNeeded(const String&,
-                                                unsigned,
-                                                const ComputedStyle*);
+  void RemoveTrailingCollapsibleSpace(NGInlineItem*);
 
   void Exit(LayoutObject*);
 };
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc
index 613b09e..4a336b9b 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder_test.cc
@@ -236,9 +236,11 @@
   EXPECT_EQ("{4, 5}", collapsed_);
 }
 
-TEST_F(NGInlineItemsBuilderTest, CollapseBeforeNewlineAcrossElements) {
+TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAcrossElements) {
   EXPECT_EQ("text text", TestAppend("text ", "\ntext"));
   EXPECT_EQ("{5}", collapsed_);
+  EXPECT_EQ("text text", TestAppend("text ", "\n text"));
+  EXPECT_EQ("{5, 6}", collapsed_);
   EXPECT_EQ("text text", TestAppend("text", " ", "\ntext"));
   EXPECT_EQ("{5}", collapsed_);
 }
@@ -291,6 +293,11 @@
       << "Collapsible space after newline is removed even when the "
          "newline was removed.";
   EXPECT_EQ("{5, 6}", collapsed_);
+
+  EXPECT_EQ(String(u"text\u200Btext"), TestAppend(u"text\u200B ", u"\ntext"))
+      << "A white space sequence containing a segment break before or after "
+         "a zero width space is collapsed to a zero width space.";
+  EXPECT_EQ("{5, 6}", collapsed_);
 }
 
 TEST_F(NGInlineItemsBuilderTest, CollapseEastAsianWidth) {
diff --git a/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc b/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc
index 0e455bd..9776fc2 100644
--- a/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc
@@ -454,7 +454,9 @@
   }
 
   if (!painting_overflow_contents) {
-    PaintInsetBoxShadowWithBorderRect(paint_info, paint_rect, style);
+    PaintInsetBoxShadowWithBorderRect(paint_info, paint_rect, style,
+                                      border_edges_.line_left,
+                                      border_edges_.line_right);
 
     if (box_decoration_data.has_border_decoration &&
         ShouldPaintBoxFragmentBorders(*box_fragment_.GetLayoutObject())) {
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn
index 83d9438..3233c2e 100644
--- a/third_party/WebKit/Source/devtools/BUILD.gn
+++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -668,6 +668,7 @@
   "front_end/sources/scopeChainSidebarPane.css",
   "front_end/sources/ScopeChainSidebarPane.js",
   "front_end/sources/ScriptFormatterEditorAction.js",
+  "front_end/sources/SearchSourcesView.js",
   "front_end/sources/serviceWorkersSidebar.css",
   "front_end/sources/SimpleHistoryManager.js",
   "front_end/sources/SnippetsPlugin.js",
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png
index 5615c38..5d9ea50 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png
+++ b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png
index 80a8b9e..f6b7df7 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png
+++ b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg
index a381bd04..7ddbae1 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg
@@ -1449,4 +1449,18 @@
      height="8"
      x="206"
      y="176" />
+  <g
+     style="fill:#000000"
+     id="g4456"
+     transform="matrix(0.78548728,0,0,0.78548728,200.6822,123.63151)">
+    <path
+       id="path4442"
+       d="M 15.5,14 H 14.71 L 14.43,13.73 C 15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3 5.91,3 3,5.91 3,9.5 3,13.09 5.91,16 9.5,16 c 1.61,0 3.09,-0.59 4.23,-1.57 L 14,14.71 v 0.79 l 5,4.99 1.49,-1.49 z m -6,0 C 7.01,14 5,11.99 5,9.5 5,7.01 7.01,5 9.5,5 11.99,5 14,7.01 14,9.5 14,11.99 11.99,14 9.5,14 Z"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path4444"
+       d="M 0,0 H 24 V 24 H 0 Z"
+       inkscape:connector-curvature="0"
+       style="fill:none" />
+  </g>
 </svg>
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
index 19fe532..6d0214a 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
@@ -1,6 +1,6 @@
 {
     "securityIcons.svg": "27676f7c1f1542659c7c49a8052259dc",
-    "largeIcons.svg": "a3d63f220a6f8a7b8aa04f58599a1736",
+    "largeIcons.svg": "6c7e87328ee5186a34782daf56700758",
     "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28",
     "checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a",
     "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45",
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
index 19fe532..6d0214a 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
@@ -1,6 +1,6 @@
 {
     "securityIcons.svg": "27676f7c1f1542659c7c49a8052259dc",
-    "largeIcons.svg": "a3d63f220a6f8a7b8aa04f58599a1736",
+    "largeIcons.svg": "6c7e87328ee5186a34782daf56700758",
     "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28",
     "checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a",
     "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45",
diff --git a/third_party/WebKit/Source/devtools/front_end/Runtime.js b/third_party/WebKit/Source/devtools/front_end/Runtime.js
index 9aa24bd..56fbb235 100644
--- a/third_party/WebKit/Source/devtools/front_end/Runtime.js
+++ b/third_party/WebKit/Source/devtools/front_end/Runtime.js
@@ -533,8 +533,10 @@
    * @return {!Object}
    */
   sharedInstance(constructorFunction) {
-    if (Runtime._instanceSymbol in constructorFunction)
+    if (Runtime._instanceSymbol in constructorFunction &&
+        Object.getOwnPropertySymbols(constructorFunction).includes(Runtime._instanceSymbol))
       return constructorFunction[Runtime._instanceSymbol];
+
     const instance = new constructorFunction();
     constructorFunction[Runtime._instanceSymbol] = instance;
     return instance;
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
index f1f6e654..ba7bb86 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
@@ -166,8 +166,6 @@
   }
 
   _createSearchPrompt() {
-    if (!Runtime.experiments.isEnabled('networkSearch'))
-      return null;
     const text = this._searchHint.contentElement.createChild('div', 'search-button');
     text.createChild('span').textContent = ls`Search headers and response bodies for `;
     const filterString = text.createChild('strong');
@@ -1951,8 +1949,6 @@
   }
 
   _updateSearchPrompt() {
-    if (!Runtime.experiments.isEnabled('networkSearch'))
-      return;
     const filterString = this._filterBar.visible() ? this._textFilterUI.value() : '';
     if (filterString.length) {
       const filterBarElement = this._filterBar.element;
@@ -1966,7 +1962,7 @@
   _openSearchView() {
     const filterString = this._textFilterUI.value();
     this._textFilterUI.setValue('');
-    Search.SearchView.openSearch('network.searchInNetwork', filterString, true);
+    Network.SearchNetworkView.openSearch(filterString, true);
   }
 };
 
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
index 8d0a3e4..74dd1ac50 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
@@ -30,6 +30,7 @@
 /**
  * @implements {UI.ContextMenu.Provider}
  * @implements {UI.Searchable}
+ * @implements {UI.ViewLocationResolver}
  */
 Network.NetworkPanel = class extends UI.Panel {
   constructor() {
@@ -50,12 +51,13 @@
     /** @type {?Network.NetworkPanel.FilmStripRecorder} */
     this._filmStripRecorder = null;
 
-    this._panelToolbar = new UI.Toolbar('', this.element);
-    this._filterBar = new UI.FilterBar('networkPanel', true);
-    this._filterBar.show(this.element);
-    this.setDefaultFocusedChild(this._filterBar);
+    const panel = new UI.VBox();
 
-    this._filmStripPlaceholderElement = this.element.createChild('div', 'network-film-strip-placeholder');
+    this._panelToolbar = new UI.Toolbar('', panel.contentElement);
+    this._filterBar = new UI.FilterBar('networkPanel', true);
+    this._filterBar.show(panel.contentElement);
+
+    this._filmStripPlaceholderElement = panel.contentElement.createChild('div', 'network-film-strip-placeholder');
 
     // Create top overview component.
     this._overviewPane = new PerfUI.TimelineOverviewPane('network');
@@ -64,14 +66,33 @@
     this._overviewPane.element.id = 'network-overview-panel';
     this._networkOverview = new Network.NetworkOverview();
     this._overviewPane.setOverviewControls([this._networkOverview]);
-    this._overviewPlaceholderElement = this.element.createChild('div');
+    this._overviewPlaceholderElement = panel.contentElement.createChild('div');
 
     this._calculator = new Network.NetworkTransferTimeCalculator();
 
     this._splitWidget = new UI.SplitWidget(true, false, 'networkPanelSplitViewState');
     this._splitWidget.hideMain();
+    this._splitWidget.show(panel.contentElement);
 
-    this._splitWidget.show(this.element);
+    panel.setDefaultFocusedChild(this._filterBar);
+
+    const initialSidebarWidth = 225;
+    const splitWidget = new UI.SplitWidget(true, false, 'networkPanelSidebarState', initialSidebarWidth);
+    splitWidget.hideSidebar();
+    splitWidget.enableShowModeSaving();
+    splitWidget.element.tabIndex = 0;
+    splitWidget.show(this.element);
+    this._sidebarLocation = UI.viewManager.createTabbedLocation(async () => {
+      UI.viewManager.showView('network');
+      splitWidget.showBoth();
+    }, 'network-sidebar', true);
+    const tabbedPane = this._sidebarLocation.tabbedPane();
+    tabbedPane.setMinimumSize(100, 25);
+    tabbedPane.element.classList.add('network-tabbed-pane');
+    splitWidget.setSidebarWidget(tabbedPane);
+    splitWidget.setMainWidget(panel);
+    splitWidget.setDefaultFocusedChild(panel);
+    this.setDefaultFocusedChild(splitWidget);
 
     this._progressBarContainer = createElement('div');
 
@@ -101,7 +122,7 @@
 
     this._offlineCheckbox = MobileThrottling.throttlingManager().createOfflineToolbarCheckbox();
     this._throttlingSelect = this._createThrottlingConditionsSelect();
-    this._setupToolbarButtons();
+    this._setupToolbarButtons(splitWidget);
 
     this._toggleRecord(true);
     this._toggleShowOverview();
@@ -164,9 +185,12 @@
     this._networkLogView.setWindow(startTime, endTime);
   }
 
-  _setupToolbarButtons() {
+  _setupToolbarButtons(splitWidget) {
+    const searchToggle = new UI.ToolbarToggle('Search', 'largeicon-search');
+    function updateSidebarToggle() {
+      searchToggle.setToggled(splitWidget.showMode() !== UI.SplitWidget.ShowMode.OnlyMain);
+    }
     this._panelToolbar.appendToolbarItem(UI.Toolbar.createActionButton(this._toggleRecordAction));
-
     const clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear');
     clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => BrowserSDK.networkLog.reset(), this);
     this._panelToolbar.appendToolbarItem(clearButton);
@@ -176,6 +200,15 @@
     this._panelToolbar.appendToolbarItem(recordFilmStripButton);
 
     this._panelToolbar.appendToolbarItem(this._filterBar.filterButton());
+    updateSidebarToggle();
+    splitWidget.addEventListener(UI.SplitWidget.Events.ShowModeChanged, updateSidebarToggle);
+    searchToggle.addEventListener(UI.ToolbarButton.Events.Click, () => {
+      if (splitWidget.showMode() === UI.SplitWidget.ShowMode.OnlyMain)
+        splitWidget.showBoth();
+      else
+        splitWidget.hideSidebar();
+    });
+    this._panelToolbar.appendToolbarItem(searchToggle);
     this._panelToolbar.appendSeparator();
 
     this._panelToolbar.appendText(Common.UIString('View:'));
@@ -593,6 +626,17 @@
     this._networkOverview.updateRequest(request);
     this._overviewPane.scheduleUpdate();
   }
+
+  /**
+   * @override
+   * @param {string} locationName
+   * @return {?UI.ViewLocation}
+   */
+  resolveLocation(locationName) {
+    if (locationName === 'network-sidebar')
+      return this._sidebarLocation;
+    return null;
+  }
 };
 
 Network.NetworkPanel.displayScreenshotDelay = 1000;
@@ -767,3 +811,57 @@
       view.revealResponseHeader(location.responseHeader.name);
   }
 };
+
+Network.SearchNetworkView = class extends Search.SearchView {
+  constructor() {
+    super('network');
+  }
+
+  /**
+   * @param {string} query
+   * @param {boolean=} searchImmediately
+   * @return {!Promise<!Search.SearchView>}
+   */
+  static async openSearch(query, searchImmediately) {
+    await UI.viewManager.showView('network.search-network-tab');
+    const searchView =
+        /** @type {!Network.SearchNetworkView} */ (self.runtime.sharedInstance(Network.SearchNetworkView));
+    searchView.toggle(query, !!searchImmediately);
+    return searchView;
+  }
+
+  /**
+   * @override
+   * @return {!Search.SearchScope}
+   */
+  createScope() {
+    return new Network.NetworkSearchScope();
+  }
+};
+
+/**
+ * @implements {UI.ActionDelegate}
+ */
+Network.NetworkPanel.SearchActionDelegate = class {
+  /**
+   * @override
+   * @param {!UI.Context} context
+   * @param {string} actionId
+   * @return {boolean}
+   */
+  handleAction(context, actionId) {
+    this._showSearch();
+    return true;
+  }
+
+  /**
+   * @return {!Promise}
+   */
+  _showSearch() {
+    const selection = UI.inspectorView.element.window().getSelection();
+    let queryCandidate = '';
+    if (selection.rangeCount)
+      queryCandidate = selection.toString().replace(/\r?\n.*/, '');
+    return Network.SearchNetworkView.openSearch(queryCandidate);
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkSearchScope.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkSearchScope.js
index 2a62cd07..65257f4 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkSearchScope.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkSearchScope.js
@@ -144,14 +144,23 @@
 
   /**
    * @override
+   * @return {string}
+   */
+  description() {
+    return this._request.url();
+  }
+
+  /**
+   * @override
    * @param {number} index
    * @return {string}
    */
   matchLineContent(index) {
-    const header = this._locations[index].requestHeader || this._locations[index].responseHeader;
+    const location = this._locations[index];
+    const header = location.requestHeader || location.responseHeader;
     if (header)
-      return `${header.name}: ${header.value}`;
-    return this._locations[index].searchMatch.lineContent;
+      return header.value;
+    return location.searchMatch.lineContent;
   }
 
   /**
@@ -170,10 +179,9 @@
    */
   matchLabel(index) {
     const location = this._locations[index];
-    if (location.requestHeader)
-      return Common.UIString(' Request Header');  // These strings should have same length for æsthetics
-    if (location.responseHeader)
-      return Common.UIString('Response Header');
+    const header = location.requestHeader || location.responseHeader;
+    if (header)
+      return header.name;
     return location.searchMatch.lineNumber + 1;
   }
 };
diff --git a/third_party/WebKit/Source/devtools/front_end/network/module.json b/third_party/WebKit/Source/devtools/front_end/network/module.json
index 1d3f482..329a2e34 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/network/module.json
@@ -121,14 +121,39 @@
             "tags": "disk cache, network throttling, useragent, user agent"
         },
         {
-            "type": "@Search.SearchScope",
-            "id": "network.searchInNetwork",
-            "experiment": "networkSearch",
-            "className": "Network.NetworkSearchScope",
-            "title": "Network",
-            "description": "Search headers and response bodies"
+            "type": "@UI.ViewLocationResolver",
+            "name": "network-sidebar",
+            "category": "Network",
+            "className": "Network.NetworkPanel"
+        },
+        {
+            "type": "view",
+            "location": "network-sidebar",
+            "id": "network.search-network-tab",
+            "title": "Search",
+            "persistence": "permanent",
+            "className": "Network.SearchNetworkView"
+        },
+        {
+            "type": "action",
+            "actionId": "network.search",
+            "title": "Search",
+            "className": "Network.NetworkPanel.SearchActionDelegate",
+            "contextTypes": [
+                "Network.NetworkPanel"
+            ],
+            "category": "DevTools",
+            "bindings": [
+                {
+                    "platform": "mac",
+                    "shortcut": "Meta+Alt+F"
+                },
+                {
+                    "platform": "windows,linux",
+                    "shortcut": "Ctrl+Shift+F"
+                }
+            ]
         }
-
     ],
     "dependencies": [
         "search",
diff --git a/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css b/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css
index 6426aeb..ba6505e 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css
@@ -27,7 +27,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-.panel.network > .toolbar {
+.panel.network .toolbar {
     background-color: var(--toolbar-bg-color);
     border-bottom: var(--divider-border);
 }
@@ -136,3 +136,7 @@
 .open-search-view > * {
     margin: 0 4px;
 }
+
+.network-tabbed-pane {
+    background-color: var(--toolbar-bg-color);
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/search/SearchConfig.js b/third_party/WebKit/Source/devtools/front_end/search/SearchConfig.js
index c1a9f8d6..0ba3f5c 100644
--- a/third_party/WebKit/Source/devtools/front_end/search/SearchConfig.js
+++ b/third_party/WebKit/Source/devtools/front_end/search/SearchConfig.js
@@ -6,13 +6,11 @@
  */
 Search.SearchConfig = class {
   /**
-   * @param {?string} scopeType
    * @param {string} query
    * @param {boolean} ignoreCase
    * @param {boolean} isRegex
    */
-  constructor(scopeType, query, ignoreCase, isRegex) {
-    this._scopeType = scopeType;
+  constructor(query, ignoreCase, isRegex) {
     this._query = query;
     this._ignoreCase = ignoreCase;
     this._isRegex = isRegex;
@@ -20,19 +18,11 @@
   }
 
   /**
-   * @param {{scopeType: ?string, query: string, ignoreCase: boolean, isRegex: boolean}} object
+   * @param {{query: string, ignoreCase: boolean, isRegex: boolean}} object
    * @return {!Search.SearchConfig}
    */
   static fromPlainObject(object) {
-    const scopeType = object.scopeType || null;
-    return new Search.SearchConfig(scopeType, object.query, object.ignoreCase, object.isRegex);
-  }
-
-  /**
-   * @return {?string}
-   */
-  scopeType() {
-    return this._scopeType;
+    return new Search.SearchConfig(object.query, object.ignoreCase, object.isRegex);
   }
 
   /**
@@ -63,7 +53,7 @@
    * @return {{query: string, ignoreCase: boolean, isRegex: boolean}}
    */
   toPlainObject() {
-    return {scopeType: this.scopeType(), query: this.query(), ignoreCase: this.ignoreCase(), isRegex: this.isRegex()};
+    return {query: this.query(), ignoreCase: this.ignoreCase(), isRegex: this.isRegex()};
   }
 
   _parse() {
@@ -208,13 +198,18 @@
   label() {},
 
   /**
+   * @return {string}
+   */
+  description() {},
+
+  /**
    * @return {number}
    */
   matchesCount() {},
 
   /**
    * @param {number} index
-   * @return {?}
+   * @return {string}
    */
   matchLabel(index) {},
 
diff --git a/third_party/WebKit/Source/devtools/front_end/search/SearchResultsPane.js b/third_party/WebKit/Source/devtools/front_end/search/SearchResultsPane.js
index a8324ab..29c7f96b 100644
--- a/third_party/WebKit/Source/devtools/front_end/search/SearchResultsPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/search/SearchResultsPane.js
@@ -12,6 +12,7 @@
     /** @type {!Array<!Search.SearchResult>} */
     this._searchResults = [];
     this._treeOutline = new UI.TreeOutlineInShadow();
+    this._treeOutline.hideOverflow();
     this._treeOutline.registerRequiredCSS('search/searchResultsPane.css');
     this.contentElement.appendChild(this._treeOutline.element);
 
@@ -92,16 +93,13 @@
     const fileNameSpan = createElement('span');
     fileNameSpan.className = 'search-result-file-name';
     fileNameSpan.textContent = this._searchResult.label();
+    this.tooltip = this._searchResult.description();
     this.listItemElement.appendChild(fileNameSpan);
 
     const matchesCountSpan = createElement('span');
     matchesCountSpan.className = 'search-result-matches-count';
 
-    const searchMatchesCount = this._searchResult.matchesCount();
-    if (searchMatchesCount === 1)
-      matchesCountSpan.textContent = Common.UIString('(%d match)', searchMatchesCount);
-    else
-      matchesCountSpan.textContent = Common.UIString('(%d matches)', searchMatchesCount);
+    matchesCountSpan.textContent = `${this._searchResult.matchesCount()}`;
 
     this.listItemElement.appendChild(matchesCountSpan);
     if (this.expanded)
@@ -121,15 +119,16 @@
       regexes.push(createSearchRegex(queries[i], !this._searchConfig.ignoreCase(), this._searchConfig.isRegex()));
 
     for (let i = fromIndex; i < toIndex; ++i) {
-      const lineContent = searchResult.matchLineContent(i);
+      const lineContent = searchResult.matchLineContent(i).trim();
       let matchRanges = [];
       for (let j = 0; j < regexes.length; ++j)
         matchRanges = matchRanges.concat(this._regexMatchRanges(lineContent, regexes[j]));
 
       const anchor = Components.Linkifier.linkifyRevealable(searchResult.matchRevealable(i), '');
+      anchor.classList.add('search-match-link');
       const lineNumberSpan = createElement('span');
       lineNumberSpan.classList.add('search-match-line-number');
-      lineNumberSpan.textContent = this._labelString(searchResult, i);
+      lineNumberSpan.textContent = searchResult.matchLabel(i);
       anchor.appendChild(lineNumberSpan);
 
       const contentSpan = this._createContentSpan(lineContent, matchRanges);
@@ -138,26 +137,13 @@
       const searchMatchElement = new UI.TreeElement();
       searchMatchElement.selectable = false;
       this.appendChild(searchMatchElement);
-      searchMatchElement.listItemElement.className = 'search-match source-code';
+      searchMatchElement.listItemElement.className = 'search-match';
       searchMatchElement.listItemElement.appendChild(anchor);
+      searchMatchElement.tooltip = lineContent;
     }
   }
 
   /**
-   * @param {!Search.SearchResult} searchResult
-   * @param {number} index
-   * @return {string}
-   */
-  _labelString(searchResult, index) {
-    const MIN_WIDTH = 4;
-    let label = searchResult.matchLabel(index);
-    if (label === null)
-      return spacesPadding(MIN_WIDTH);
-    label = label.toString();
-    return label.length < MIN_WIDTH ? spacesPadding(MIN_WIDTH - label.length) + label : label;
-  }
-
-  /**
    * @param {number} startMatchIndex
    */
   _appendShowMoreMatchesElement(startMatchIndex) {
@@ -173,8 +159,15 @@
   /**
    * @param {string} lineContent
    * @param {!Array.<!TextUtils.SourceRange>} matchRanges
+   * @return {!Element}
    */
   _createContentSpan(lineContent, matchRanges) {
+    const trimBy = matchRanges[0].offset > 20 ? matchRanges[0].offset - 15 : 0;
+    lineContent = lineContent.substring(trimBy, 1000 + trimBy);
+    if (trimBy) {
+      matchRanges = matchRanges.map(range => new TextUtils.SourceRange(range.offset - trimBy + 1, range.length));
+      lineContent = '\u2026' + lineContent;
+    }
     const contentSpan = createElement('span');
     contentSpan.className = 'search-match-content';
     contentSpan.textContent = lineContent;
diff --git a/third_party/WebKit/Source/devtools/front_end/search/SearchView.js b/third_party/WebKit/Source/devtools/front_end/search/SearchView.js
index 1d390d63..8789493 100644
--- a/third_party/WebKit/Source/devtools/front_end/search/SearchView.js
+++ b/third_party/WebKit/Source/devtools/front_end/search/SearchView.js
@@ -2,7 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 Search.SearchView = class extends UI.VBox {
-  constructor() {
+  /**
+   * @param {string} settingKey
+   */
+  constructor(settingKey) {
     super(true);
     this.setMinimumSize(0, 40);
     this.registerRequiredCSS('search/searchView.css');
@@ -38,12 +41,25 @@
     this._searchResultsElement.className = 'search-results';
 
     const toolbar = new UI.Toolbar('search-toolbar', this._searchPanelElement);
+    this._matchCaseButton = Search.SearchView._appendToolbarToggle(toolbar, 'Aa', Common.UIString('Match Case'));
+    this._regexButton =
+        Search.SearchView._appendToolbarToggle(toolbar, '.*', Common.UIString('Use Regular Expression'));
+    toolbar.appendSpacer();
+    const refreshButton = new UI.ToolbarButton(Common.UIString('Refresh'), 'largeicon-refresh');
+    const clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear');
+    toolbar.appendToolbarItem(refreshButton);
+    toolbar.appendToolbarItem(clearButton);
+    refreshButton.addEventListener(UI.ToolbarButton.Events.Click, this._onAction.bind(this));
+    clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => {
+      this._resetSearch();
+      this._onSearchInputClear();
+    });
 
     const searchContainer = this._searchPanelElement.createChild('div', 'search-container');
 
     this._search = UI.HistoryInput.create();
     searchContainer.appendChild(this._search);
-    this._search.placeholder = Common.UIString('Search all sources (use "file:" to filter by path)\u200e');
+    this._search.placeholder = Common.UIString('Search');
     this._search.setAttribute('type', 'text');
     this._search.classList.add('search-config-search');
     this._search.setAttribute('results', '0');
@@ -58,28 +74,14 @@
     const cancelButtonContainer = searchContainer.createChild('div', 'search-cancel-button-container');
     cancelButtonContainer.appendChild(this._searchInputClearElement);
 
-    this._matchCaseButton = Search.SearchView._appendToolbarToggle(toolbar, 'Aa', Common.UIString('Match Case'));
-    this._regexButton =
-        Search.SearchView._appendToolbarToggle(toolbar, '.*', Common.UIString('Use Regular Expression'));
 
     const searchStatusBarElement = this.contentElement.createChild('div', 'search-toolbar-summary');
     this._searchMessageElement = searchStatusBarElement.createChild('div', 'search-message');
     this._searchProgressPlaceholderElement = searchStatusBarElement.createChild('div', 'flex-centered');
     this._searchResultsMessageElement = searchStatusBarElement.createChild('div', 'search-message');
 
-    this._scopesSelector = new UI.SegmentedButton();
-    this._scopesSelector.element.classList.add('search-scopes');
-    this._scopesSelector.show(this._searchPanelElement);
-
     this._advancedSearchConfig = Common.settings.createLocalSetting(
-        'advancedSearchConfig', new Search.SearchConfig(null, '', true, false).toPlainObject());
-
-    /** @type {!Map<string, !Runtime.Extension>} */
-    this._searchScopes = new Map();
-    this._defaultScope = Search.SearchView._readScopesExtenstions(this._scopesSelector, this._searchScopes);
-
-    if (this._searchScopes.size < 2)
-      this._scopesSelector.hideWidget();
+        settingKey + 'SearchConfig', new Search.SearchConfig('', true, false).toPlainObject());
 
     this._load();
     /** @type {?Search.SearchScope} */
@@ -101,60 +103,26 @@
   }
 
   /**
-   * @param {?string} searchScopeType
-   * @param {string} query
-   * @param {boolean=} searchImmediately
-   * @return {!Promise<!Search.SearchView>}
-   */
-  static async openSearch(searchScopeType, query, searchImmediately) {
-    await UI.viewManager.showView('search.search');
-    const searchView =
-        /** @type {!Search.SearchView} */ (self.runtime.sharedInstance(Search.SearchView));
-    searchView._toggle(searchScopeType, query, !!searchImmediately);
-    return searchView;
-  }
-
-  /**
-   * @param {!UI.SegmentedButton} selector
-   * @param {!Map<string, !Runtime.Extension>} scopesMap
-   * @return {!Runtime.Extension}
-   */
-  static _readScopesExtenstions(selector, scopesMap) {
-    let defaultScope = null;
-    for (const extension of self.runtime.extensions(Search.SearchScope)) {
-      const id = extension.descriptor().id;
-      scopesMap.set(id, extension);
-      selector.addSegment(extension.title(), id, extension.descriptor().description);
-      if (!defaultScope)
-        defaultScope = extension;
-    }
-    return defaultScope;
-  }
-
-  /**
    * @return {!Search.SearchConfig}
    */
   _buildSearchConfig() {
-    return new Search.SearchConfig(
-        this._scopesSelector.selected(), this._search.value, !this._matchCaseButton.toggled(),
-        this._regexButton.toggled());
+    return new Search.SearchConfig(this._search.value, !this._matchCaseButton.toggled(), this._regexButton.toggled());
   }
 
   /**
-   * @param {?string} searchScopeType
+   * @protected
    * @param {string} queryCandidate
    * @param {boolean=} searchImmediately
    */
-  async _toggle(searchScopeType, queryCandidate, searchImmediately) {
+  async toggle(queryCandidate, searchImmediately) {
     if (queryCandidate)
       this._search.value = queryCandidate;
-    this._selectScope(searchScopeType);
     if (this.isShowing())
       this.focus();
     else
       this._focusOnShow = true;
 
-    await this._initScope(this._scopesSelector.selected());
+    this._initScope();
     if (searchImmediately)
       this._onAction();
     else
@@ -162,13 +130,15 @@
   }
 
   /**
-   * @param {?string} scopeTypeId
+   * @protected
+   * @return {!Search.SearchScope}
    */
-  async _initScope(scopeTypeId) {
-    let extension = scopeTypeId ? this._searchScopes.get(scopeTypeId) : null;
-    if (!extension)
-      extension = this._defaultScope;
-    this._searchScope = await extension.instance();
+  createScope() {
+    throw new Error('Not implemented');
+  }
+
+  _initScope() {
+    this._searchScope = this.createScope();
   }
 
   /**
@@ -253,7 +223,7 @@
   async _startSearch(searchConfig) {
     this._resetSearch();
     ++this._searchId;
-    await this._initScope(searchConfig.scopeType());
+    this._initScope();
     if (!this._isIndexing)
       this._startIndexing();
     this._pendingSearchConfig = searchConfig;
@@ -402,9 +372,8 @@
   _load() {
     const searchConfig = Search.SearchConfig.fromPlainObject(this._advancedSearchConfig.get());
     this._search.value = searchConfig.query();
-    this._matchCaseButton.setToggled(searchConfig.ignoreCase());
+    this._matchCaseButton.setToggled(!searchConfig.ignoreCase());
     this._regexButton.setToggled(searchConfig.isRegex());
-    this._selectScope(searchConfig.scopeType());
 
     if (this._search.value && this._search.value.length)
       this._searchInputClearElement.classList.remove('hidden');
@@ -414,39 +383,7 @@
     const searchConfig = this._buildSearchConfig();
     if (!searchConfig.query() || !searchConfig.query().length)
       return;
-
     this._save();
     this._startSearch(searchConfig);
   }
-
-  /**
-   * @param {?string} scopeTypeId
-   */
-  _selectScope(scopeTypeId) {
-    this._scopesSelector.select(scopeTypeId || this._defaultScope.descriptor().id);
-  }
-};
-
-/**
- * @implements {UI.ActionDelegate}
- */
-Search.SearchView.ActionDelegate = class {
-  /**
-   * @override
-   * @param {!UI.Context} context
-   * @param {string} actionId
-   * @return {boolean}
-   */
-  handleAction(context, actionId) {
-    this._showSearch();
-    return true;
-  }
-
-  _showSearch() {
-    const selection = UI.inspectorView.element.window().getSelection();
-    let queryCandidate = '';
-    if (selection.rangeCount)
-      queryCandidate = selection.toString().replace(/\r?\n.*/, '');
-    return Search.SearchView.openSearch(null, queryCandidate);
-  }
 };
diff --git a/third_party/WebKit/Source/devtools/front_end/search/module.json b/third_party/WebKit/Source/devtools/front_end/search/module.json
index f9f17629..b9db50d7 100644
--- a/third_party/WebKit/Source/devtools/front_end/search/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/search/module.json
@@ -1,37 +1,4 @@
 {
-    "extensions": [
-        {
-            "type": "view",
-            "location": "drawer-view",
-            "id": "search.search",
-            "title": "Search",
-            "persistence": "closeable",
-            "order": 100,
-            "className": "Search.SearchView"
-        },
-        {
-            "type": "action",
-            "actionId": "search.all",
-            "title": "Search",
-            "className": "Search.SearchView.ActionDelegate",
-            "category": "DevTools",
-            "bindings": [
-                {
-                    "platform": "mac",
-                    "shortcut": "Meta+Alt+F"
-                },
-                {
-                    "platform": "windows,linux",
-                    "shortcut": "Ctrl+Shift+F"
-                }
-            ]
-        },
-        {
-            "type": "context-menu-item",
-            "location": "mainMenu/default",
-            "actionId": "search.all"
-        }
-    ],
     "dependencies": [
         "components"
     ],
diff --git a/third_party/WebKit/Source/devtools/front_end/search/searchResultsPane.css b/third_party/WebKit/Source/devtools/front_end/search/searchResultsPane.css
index afab20a..95627f69 100644
--- a/third_party/WebKit/Source/devtools/front_end/search/searchResultsPane.css
+++ b/third_party/WebKit/Source/devtools/front_end/search/searchResultsPane.css
@@ -7,6 +7,7 @@
 :host {
     padding: 0;
     margin: 0;
+    overflow-y: auto;
 }
 
 .tree-outline {
@@ -22,10 +23,12 @@
 }
 
 li.search-result {
+    cursor: pointer;
+    font-size: 12px;
+    margin-top: 8px;
     padding: 2px 0 2px 4px;
     word-wrap: normal;
     white-space: pre;
-    cursor: pointer;
 }
 
 li.search-result:hover {
@@ -33,21 +36,27 @@
 }
 
 li.search-result .search-result-file-name {
-    font-weight: bold;
     color: #222;
+    flex: 1 1;
+    overflow: hidden;
+    text-overflow: ellipsis;
     white-space: nowrap;
 }
 
 li.search-result .search-result-matches-count {
-    margin-left: 5px;
-    color: #222;
+    color: #888;
+    margin: 0 8px;
+}
+
+li.search-result.expanded .search-result-matches-count {
+    display: none;
 }
 
 li.show-more-matches {
-    padding: 4px 0;
     color: #222;
     cursor: pointer;
-    margin-left: 20px;
+    font-weight: bold;
+    padding: 8px 0;
 }
 
 li.show-more-matches:hover {
@@ -70,11 +79,6 @@
     word-break: normal;
     padding: 2px 4px 2px 6px;
     margin-right: 5px;
-    border-right: 1px solid #BBB;
-}
-
-li.search-match:not(:hover) .search-match-line-number {
-    background-color: #F0F0F0;
 }
 
 li.search-match:hover {
@@ -98,3 +102,12 @@
 li.search-match .search-match-content {
     color: #000;
 }
+
+ol.children.expanded {
+    padding: 4px 0;
+}
+
+.search-match-link {
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/search/searchView.css b/third_party/WebKit/Source/devtools/front_end/search/searchView.css
index 5986e4e..6efde3e 100644
--- a/third_party/WebKit/Source/devtools/front_end/search/searchView.css
+++ b/third_party/WebKit/Source/devtools/front_end/search/searchView.css
@@ -6,26 +6,23 @@
 
 .search-drawer-header {
     align-items: center;
-    flex: none;
-    display: flex;
-    border-bottom: 2px solid #e8e8e8;
-    white-space: nowrap;
+    flex-shrink: 0;
     overflow: hidden;
 }
 
 .search-drawer-header input.search-config-search {
-    padding: 0 28px;
-    margin: 2px 1px 2px 2px;
-    height: 28px;
+    border: none;
     border-radius: 2px;
     color: #303030;
-    border: none;
-    min-width: 95px;
     flex-grow: 1;
+    height: 28px;
+    margin: 2px 2px 2px 2px;
+    min-width: 95px;
+    padding: 0 28px;
 }
 
 .search-drawer-header input.search-config-search:focus {
-    box-shadow: 0 0 0 2px rgba(66, 133, 244, 0.4);
+    box-shadow: var(--focus-ring-active-shadow);
 }
 
 .search-drawer-header .search-icon {
@@ -79,39 +76,16 @@
     flex: auto;
 }
 
-.search-results .empty-view {
-    pointer-events: none;
-}
-
-.empty-view {
-    font-size: 24px;
-    color: rgb(75%, 75%, 75%);
-    font-weight: bold;
-    padding: 10px;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-}
-
 .search-container {
+    background-color: white;
     border: #dadada 0.5px;
-    border-style: none solid;
+    border-style: solid none;
     display: flex;
     flex-grow: 1;
-    margin: 0 8px;
     position: relative;
 }
 
 .search-container:focus-within {
+    background-color: transparent;
     border-color: transparent;
 }
-
-.search-toolbar {
-    padding: 0 8px 0 8px;
-    flex-grow: 0;
-}
-
-.search-scopes {
-    flex-grow: 0;
-    margin: 0 12px;
-}
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js b/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js
index 28e012dd..959ac962 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js
@@ -131,7 +131,7 @@
    */
   static appendSearchItem(contextMenu, path) {
     function searchPath() {
-      Search.SearchView.openSearch('sources.search-in-files', `file:${path.trim()}`);
+      Sources.SearchSourcesView.openSearch(`file:${path.trim()}`);
     }
 
     let searchLabel = Common.UIString('Search in folder');
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/SearchSourcesView.js b/third_party/WebKit/Source/devtools/front_end/sources/SearchSourcesView.js
new file mode 100644
index 0000000..7322c3e
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources/SearchSourcesView.js
@@ -0,0 +1,58 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+Sources.SearchSourcesView = class extends Search.SearchView {
+  constructor() {
+    super('sources');
+  }
+
+  /**
+   * @param {string} query
+   * @param {boolean=} searchImmediately
+   * @return {!Promise<!Search.SearchView>}
+   */
+  static async openSearch(query, searchImmediately) {
+    await UI.viewManager.showView('sources.search-sources-tab');
+    const searchView =
+        /** @type {!Search.SearchView} */ (self.runtime.sharedInstance(Sources.SearchSourcesView));
+    searchView.toggle(query, !!searchImmediately);
+    return searchView;
+  }
+
+  /**
+   * @override
+   * @return {!Search.SearchScope}
+   */
+  createScope() {
+    return new Sources.SourcesSearchScope();
+  }
+};
+
+/**
+ * @implements {UI.ActionDelegate}
+ */
+Sources.SearchSourcesView.ActionDelegate = class {
+  /**
+   * @override
+   * @param {!UI.Context} context
+   * @param {string} actionId
+   * @return {boolean}
+   */
+  handleAction(context, actionId) {
+    this._showSearch();
+    return true;
+  }
+
+  /**
+   * @return {!Promise}
+   */
+  _showSearch() {
+    const selection = UI.inspectorView.element.window().getSelection();
+    let queryCandidate = '';
+    if (selection.rangeCount)
+      queryCandidate = selection.toString().replace(/\r?\n.*/, '');
+
+    return Sources.SearchSourcesView.openSearch(queryCandidate);
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js b/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js
index 281e118..5c405503 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js
@@ -303,7 +303,15 @@
    * @return {string}
    */
   label() {
-    return this._uiSourceCode.fullDisplayName();
+    return this._uiSourceCode.displayName();
+  }
+
+  /**
+   * @override
+   * @return {string}
+   */
+  description() {
+    return this._uiSourceCode.url();
   }
 
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/module.json b/third_party/WebKit/Source/devtools/front_end/sources/module.json
index 3824eef..e8220bfc 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/sources/module.json
@@ -316,6 +316,15 @@
             "className": "Sources.SnippetsNavigatorView"
         },
         {
+            "type": "view",
+            "location": "navigator-view",
+            "id": "sources.search-sources-tab",
+            "title": "Search",
+            "order": 7,
+            "persistence": "permanent",
+            "className": "Sources.SearchSourcesView"
+        },
+        {
             "type": "@Sources.NavigatorView",
             "viewId": "navigator-network",
             "className": "Sources.NetworkNavigatorView"
@@ -798,12 +807,29 @@
             ]
         },
         {
-            "type": "@Search.SearchScope",
-            "id": "sources.search-in-files",
-            "className": "Sources.SourcesSearchScope",
-            "title": "Sources",
-            "description": "Search workspace sources"
+            "type": "action",
+            "actionId": "sources.search",
+            "order": 10000,
+            "title": "Search",
+            "className": "Sources.SearchSourcesView.ActionDelegate",
+            "category": "DevTools",
+            "bindings": [
+                {
+                    "platform": "mac",
+                    "shortcut": "Meta+Alt+F"
+                },
+                {
+                    "platform": "windows,linux",
+                    "shortcut": "Ctrl+Shift+F"
+                }
+            ]
+        },
+        {
+            "type": "context-menu-item",
+            "location": "mainMenu/default",
+            "actionId": "search.all"
         }
+
     ],
     "dependencies": [
         "components",
@@ -833,6 +859,7 @@
         "UISourceCodeFrame.js",
         "JavaScriptSourceFrame.js",
         "CSSPlugin.js",
+        "SearchSourcesView.js",
         "NavigatorView.js",
         "ScopeChainSidebarPane.js",
         "SourcesNavigator.js",
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
index 3c48524..9ba57c82 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
@@ -229,6 +229,7 @@
   'largeicon-resume': {position: 'f2', spritesheet: 'largeicons', isMask: true},
   'largeicon-rotate': {position: 'g9', spritesheet: 'largeicons', isMask: true},
   'largeicon-rotate-screen': {position: 'g8', spritesheet: 'largeicons', isMask: true},
+  'largeicon-search': {position: 'h4', spritesheet: 'largeicons', isMask: true},
   'largeicon-settings-gear': {position: 'g7', spritesheet: 'largeicons', isMask: true},
   'largeicon-show-bottom-sidebar': {position: 'g6', spritesheet: 'largeicons', isMask: true},
   'largeicon-show-left-sidebar': {position: 'g5', spritesheet: 'largeicons', isMask: true},
diff --git a/third_party/WebKit/Source/modules/credentialmanager/CredentialManagerTypeConverters.cpp b/third_party/WebKit/Source/modules/credentialmanager/CredentialManagerTypeConverters.cpp
index dd68399..88297c1 100644
--- a/third_party/WebKit/Source/modules/credentialmanager/CredentialManagerTypeConverters.cpp
+++ b/third_party/WebKit/Source/modules/credentialmanager/CredentialManagerTypeConverters.cpp
@@ -118,6 +118,8 @@
       return CredentialManagerError::PENDING_REQUEST;
     case webauth::mojom::blink::AuthenticatorStatus::INVALID_DOMAIN:
       return CredentialManagerError::INVALID_DOMAIN;
+    case webauth::mojom::blink::AuthenticatorStatus::INVALID_STATE:
+      return CredentialManagerError::INVALID_STATE;
     case webauth::mojom::blink::AuthenticatorStatus::NOT_IMPLEMENTED:
       return CredentialManagerError::NOT_IMPLEMENTED;
     case webauth::mojom::blink::AuthenticatorStatus::SUCCESS:
diff --git a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp
index 79d03dd..d4c021cd 100644
--- a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp
+++ b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp
@@ -256,6 +256,10 @@
           "Parameters for this operation are not supported.");
     case CredentialManagerError::INVALID_DOMAIN:
       return DOMException::Create(kSecurityError, "This is an invalid domain.");
+    case CredentialManagerError::INVALID_STATE:
+      return DOMException::Create(
+          kInvalidStateError,
+          "Attempting to register an already-registered key.");
     case CredentialManagerError::NOT_IMPLEMENTED:
       return DOMException::Create(kNotSupportedError, "Not implemented");
     case CredentialManagerError::UNKNOWN:
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
index 4203d2b..2fdb30d3 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
@@ -417,18 +417,24 @@
   // or createAnswer, so this only applies when there are no fingerprints.
   // This is allowed.
   const size_t new_fingerprint_pos = new_sdp.Find("\na=fingerprint:");
-  if (new_fingerprint_pos == kNotFound)
+  if (new_fingerprint_pos == kNotFound) {
     return false;
+  }
   // Look for fingerprint having been added. Not allowed.
   const size_t old_fingerprint_pos = old_sdp.Find("\na=fingerprint:");
   if (old_fingerprint_pos == kNotFound) {
     return true;
   }
-  // Look for fingerprint being modified. Not allowed.
-  const size_t old_fingerprint_end =
-      old_sdp.Find("\n", old_fingerprint_pos + 1);
-  const size_t new_fingerprint_end =
-      new_sdp.Find("\n", new_fingerprint_pos + 1);
+  // Look for fingerprint being modified. Not allowed.  Handle differences in
+  // line endings ('\r\n' vs, '\n' when looking for the end of the fingerprint).
+  size_t old_fingerprint_end = old_sdp.Find("\r\n", old_fingerprint_pos + 1);
+  if (old_fingerprint_end == std::string::npos) {
+    old_fingerprint_end = old_sdp.Find("\n", old_fingerprint_pos + 1);
+  }
+  size_t new_fingerprint_end = new_sdp.Find("\r\n", new_fingerprint_pos + 1);
+  if (new_fingerprint_end == std::string::npos) {
+    new_fingerprint_end = new_sdp.Find("\n", new_fingerprint_pos + 1);
+  }
   return old_sdp.Substring(old_fingerprint_pos,
                            old_fingerprint_end - old_fingerprint_pos) !=
          new_sdp.Substring(new_fingerprint_pos,
diff --git a/third_party/WebKit/public/platform/modules/credentialmanager/credential_manager.mojom b/third_party/WebKit/public/platform/modules/credentialmanager/credential_manager.mojom
index 3ee3e8e2..b5ad4ea 100644
--- a/third_party/WebKit/public/platform/modules/credentialmanager/credential_manager.mojom
+++ b/third_party/WebKit/public/platform/modules/credentialmanager/credential_manager.mojom
@@ -27,6 +27,7 @@
   NOT_ALLOWED,
   NOT_SUPPORTED,
   INVALID_DOMAIN,
+  INVALID_STATE,
   NOT_IMPLEMENTED,
   UNKNOWN
 };
diff --git a/third_party/WebKit/public/platform/modules/webauth/authenticator.mojom b/third_party/WebKit/public/platform/modules/webauth/authenticator.mojom
index b1540b6..23733907 100644
--- a/third_party/WebKit/public/platform/modules/webauth/authenticator.mojom
+++ b/third_party/WebKit/public/platform/modules/webauth/authenticator.mojom
@@ -18,6 +18,7 @@
   NOT_ALLOWED_ERROR,
   NOT_SUPPORTED_ERROR,
   INVALID_DOMAIN,
+  INVALID_STATE,
   NOT_IMPLEMENTED,
   UNKNOWN_ERROR,
 };
diff --git a/third_party/proguard/README.chromium b/third_party/proguard/README.chromium
index 1e2ec21..14b6982 100644
--- a/third_party/proguard/README.chromium
+++ b/third_party/proguard/README.chromium
@@ -1,7 +1,7 @@
 Name: Proguard
 URL: http://proguard.sourceforge.net/
-Version: 6.0.1
-Date: March 4, 2018
+Version: 5.2.1
+Date: June 22, 2016
 License: GPL v2
 License File: NOT_SHIPPED
 Security Critical: no
diff --git a/third_party/proguard/lib/proguard.jar b/third_party/proguard/lib/proguard.jar
index cf011d9..c670fe92 100644
--- a/third_party/proguard/lib/proguard.jar
+++ b/third_party/proguard/lib/proguard.jar
Binary files differ
diff --git a/third_party/proguard/lib/retrace.jar b/third_party/proguard/lib/retrace.jar
index 780fd15..408712f3 100644
--- a/third_party/proguard/lib/retrace.jar
+++ b/third_party/proguard/lib/retrace.jar
Binary files differ
diff --git a/tools/clang/plugins/ChromeClassTester.cpp b/tools/clang/plugins/ChromeClassTester.cpp
index c275183b..594edde 100644
--- a/tools/clang/plugins/ChromeClassTester.cpp
+++ b/tools/clang/plugins/ChromeClassTester.cpp
@@ -95,17 +95,47 @@
   if (filename == "<scratch space>")
     return LocationType::kThirdParty;
 
+#if defined(LLVM_ON_UNIX)
+  // Resolve the symlinktastic relative path and make it absolute.
+  char resolvedPath[MAXPATHLEN];
+  if (options_.no_realpath) {
+    // Same reason as windows below.
+    filename.insert(filename.begin(), '/');
+  } else if (realpath(filename.c_str(), resolvedPath)) {
+    filename = resolvedPath;
+  }
+#endif
+
+#if defined(LLVM_ON_WIN32)
+  // Make path absolute.
+  if (options_.no_realpath) {
+    // This turns e.g. "gen/dir/file.cc" to "/gen/dir/file.cc" which lets the
+    // "/gen/" banned_dir work.
+    filename.insert(filename.begin(), '/');
+  } else {
+    // The Windows dance: Convert to UTF-16, call GetFullPathNameW, convert back
+    DWORD size_needed =
+        MultiByteToWideChar(CP_UTF8, 0, filename.data(), -1, nullptr, 0);
+    std::wstring utf16(size_needed, L'\0');
+    MultiByteToWideChar(CP_UTF8, 0, filename.data(), -1,
+                        &utf16[0], size_needed);
+
+    size_needed = GetFullPathNameW(utf16.data(), 0, nullptr, nullptr);
+    std::wstring full_utf16(size_needed, L'\0');
+    GetFullPathNameW(utf16.data(), full_utf16.size(), &full_utf16[0], nullptr);
+
+    size_needed = WideCharToMultiByte(CP_UTF8, 0, full_utf16.data(), -1,
+                                      nullptr, 0, nullptr, nullptr);
+    filename.resize(size_needed);
+    WideCharToMultiByte(CP_UTF8, 0, full_utf16.data(), -1, &filename[0],
+                        size_needed, nullptr, nullptr);
+  }
+#endif
+
   // When using distributed cross compilation build tools, file paths can have
   // separators which differ from ones at this platform. Make them consistent.
   std::replace(filename.begin(), filename.end(), '\\', '/');
 
-  // Ensure that we can search for patterns of the form "/foo/" even
-  // if we have a relative path like "foo/bar.cc".  We don't expect
-  // this transformed path to exist necessarily.
-  if (filename.front() != '/') {
-    filename.insert(0, 1, '/');
-  }
-
   // Don't check autogenerated files. ninja puts them in $OUT_DIR/gen.
   if (filename.find("/gen/") != std::string::npos)
     return LocationType::kThirdParty;
diff --git a/tools/clang/plugins/FindBadConstructsAction.cpp b/tools/clang/plugins/FindBadConstructsAction.cpp
index 37ab286..e1443f9 100644
--- a/tools/clang/plugins/FindBadConstructsAction.cpp
+++ b/tools/clang/plugins/FindBadConstructsAction.cpp
@@ -53,6 +53,8 @@
       // TODO(tsepez): Enable this by default once http://crbug.com/356815
       // and http://crbug.com/356816 are fixed.
       options_.check_enum_last_value = true;
+    } else if (args[i] == "no-realpath") {
+      options_.no_realpath = true;
     } else if (args[i] == "check-ipc") {
       options_.check_ipc = true;
     } else {
diff --git a/tools/clang/plugins/Options.h b/tools/clang/plugins/Options.h
index e3fe865..a012979 100644
--- a/tools/clang/plugins/Options.h
+++ b/tools/clang/plugins/Options.h
@@ -11,6 +11,9 @@
   bool check_base_classes = false;
   bool enforce_in_thirdparty_webkit = false;  // Use in Blink code itself
   bool check_enum_last_value = false;
+  // This is needed for some distributed build-sytems to respect banned
+  // paths. See https://crbug.com/583454 for details.
+  bool no_realpath = false;
   bool check_ipc = false;
 };
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 50e36cc9..f4093ad 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -105,8 +105,8 @@
     },
 
     'chromium.clang': {
-      'CFI Linux CF': 'cfi_full_cfi_diag_recover_release_static',
-      'CFI Linux ToT': 'clang_tot_cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on',
+      'CFI Linux CF': 'cfi_full_cfi_icall_cfi_diag_recover_release_static',
+      'CFI Linux ToT': 'clang_tot_cfi_full_cfi_icall_cfi_diag_thin_lto_release_static_dcheck_always_on',
       'CFI Linux (icall)': 'cfi_full_diag_icall_release_static_dcheck_always_on',
       'CrWinAsan': 'asan_clang_fuzzer_static_v8_heap_x86_full_symbols_release',
       'CrWinAsan(dll)': 'asan_clang_shared_v8_heap_x86_full_symbols_release',
@@ -167,8 +167,8 @@
       'Android deterministic': 'android_without_codecs_release_bot_minimal_symbols',
       'Android deterministic (dbg)': 'android_debug_bot',
       'Browser Side Navigation Linux': 'release_bot',
-      'CFI Linux CF': 'cfi_full_cfi_diag_recover_release_static',
-      'CFI Linux ToT': 'clang_tot_cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on',
+      'CFI Linux CF': 'cfi_full_cfi_icall_cfi_diag_recover_release_static',
+      'CFI Linux ToT': 'clang_tot_cfi_full_cfi_icall_cfi_diag_thin_lto_release_static_dcheck_always_on',
       'CFI Linux (icall)': 'cfi_full_diag_icall_release_static_dcheck_always_on',
       'chromeos-amd64-generic-rel-goma-canary': 'cros_chrome_sdk',
 
@@ -1091,8 +1091,8 @@
       'cast', 'cast_audio', 'release_trybot',
     ],
 
-    'cfi_full_cfi_diag_recover_release_static': [
-      'cfi_full', 'cfi_diag', 'cfi_recover', 'thin_lto', 'release', 'static',
+    'cfi_full_cfi_icall_cfi_diag_recover_release_static': [
+      'cfi_full', 'cfi_icall', 'cfi_diag', 'cfi_recover', 'thin_lto', 'release', 'static',
     ],
 
     'cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on_goma': [
@@ -1131,6 +1131,10 @@
       'clang_tot', 'asan', 'lsan', 'static', 'release',
     ],
 
+    'clang_tot_cfi_full_cfi_icall_cfi_diag_thin_lto_release_static_dcheck_always_on': [
+      'clang_tot', 'cfi_full', 'cfi_icall', 'cfi_diag', 'thin_lto', 'release', 'static', 'dcheck_always_on',
+    ],
+
     'clang_tot_cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on': [
       'clang_tot', 'cfi_full', 'cfi_diag', 'thin_lto', 'release', 'static', 'dcheck_always_on',
     ],
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 4a4de78..8db4394 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -5626,6 +5626,14 @@
   <description>User triggered the hotword by saying 'Ok Google'.</description>
 </action>
 
+<action name="ITunesLinksHandler_StoreKitLaunched">
+  <owner>mrefaat@chromium.org</owner>
+  <description>
+    Record when StoreKit is launched on the iOS app by ITunesLinkHandler. This
+    should happen when the user navigates to iTunes appstore URL.
+  </description>
+</action>
+
 <action name="ImportLockDialogCocoa_Shown">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index cae8bd9..f49acc2 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -1413,12 +1413,16 @@
 
 <enum name="ArcOptInAction">
   <summary>Defines Arc OptIn actions</summary>
-  <int value="0" label="Opted Out"/>
-  <int value="1" label="Opted In"/>
+  <int value="0" label="DEPRECATED: Opted Out"/>
+  <int value="1" label="DEPRECATED: Opted In"/>
   <int value="2" label="DEPRECATED: Notification accepted"/>
   <int value="3" label="DEPRECATED: Notification declined"/>
   <int value="4" label="DEPRECATED: Notification timed out"/>
   <int value="5" label="Retry after OptIn failure"/>
+  <int value="6" label="Opted In from OOBE"/>
+  <int value="7" label="Opted Out from OOBE"/>
+  <int value="8" label="Opted In from session"/>
+  <int value="9" label="Opted Out from session"/>
 </enum>
 
 <enum name="ArcOptInCancel">
@@ -22977,6 +22981,7 @@
   <int value="78" label="SURVEY_INFOBAR_ANDROID"/>
   <int value="79" label="NEAR_OOM_INFOBAR_ANDROID"/>
   <int value="80" label="INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE"/>
+  <int value="81" label="PAGE_LOAD_CAPPING_INFOBAR_DELEGATE"/>
 </enum>
 
 <enum name="InfoBarResponse">
@@ -25901,6 +25906,8 @@
   <int value="-1686782572" label="ChromeHomeInactivitySheetExpansion:disabled"/>
   <int value="-1682843294" label="DataReductionProxyDecidesTransform:enabled"/>
   <int value="-1677715989" label="UnifiedConsent:disabled"/>
+  <int value="-1676256979"
+      label="AutofillUpstreamUseGooglePayOnAndroidBranding:enabled"/>
   <int value="-1670137340"
       label="OptimizeLoadingIPCForSmallResources:disabled"/>
   <int value="-1669486359" label="ImportantSitesInCBD:enabled"/>
@@ -26377,6 +26384,7 @@
   <int value="-560551550" label="use-memory-pressure-chromeos"/>
   <int value="-560114351" label="OfflinePagesRenovations:disabled"/>
   <int value="-557742250" label="ContentSuggestionsCategories:disabled"/>
+  <int value="-548495403" label="AutofillDynamicForms:enabled"/>
   <int value="-548082154" label="protect-sync-credential:disabled"/>
   <int value="-541611402" label="OfflinePagesPrefetching:enabled"/>
   <int value="-536289234" label="ssl-interstitial-v2-colorful"/>
@@ -27113,6 +27121,8 @@
   <int value="1257980502" label="disable-accelerated-video-decode"/>
   <int value="1260186484" label="spurious-power-button-screen-accel"/>
   <int value="1261713150" label="ChromeHomeOptOutSnackbar:disabled"/>
+  <int value="1266525177"
+      label="AutofillUpstreamUseGooglePayOnAndroidBranding:disabled"/>
   <int value="1266886673" label="delay-reload-stop-button-change"/>
   <int value="1268470658" label="disable-android-password-link"/>
   <int value="1269940659" label="EnumerateAudioDevices:enabled"/>
@@ -27276,6 +27286,7 @@
   <int value="1659082220" label="EnableManualSaving:disabled"/>
   <int value="1659372520" label="WebXrRenderPath:disabled"/>
   <int value="1661925474" label="silent-debugger-extension-api"/>
+  <int value="1663185040" label="AutofillDynamicForms:disabled"/>
   <int value="1664401033" label="ColorCorrectRendering:enabled"/>
   <int value="1665349789" label="spurious-power-button-window"/>
   <int value="1667584730" label="WebXR:disabled"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 15b9e30..3bbd4b0 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -32139,8 +32139,17 @@
     units="ms">
   <owner>hansberry@chromium.org</owner>
   <summary>
-    The duration of time between when a client began advertising to a host, and
-    connected to that host (before authentication).
+    The duration of time between when a client begins to scan and advertise, and
+    connects to a host (before authentication).
+
+    This histogram only considers the time from when the client *sends* an
+    advertisement, and not when the client *receives* an advertisement. See
+    InstantTethering.Performance.StartScanToReceiveAdvertisementDuration and
+    InstantTethering.Performance.ReceiveAdvertisementToConnectionDuration for
+    histograms that consider when the client receives an advertisement.
+
+    This histogram is the foreground advertisement analog of
+    InstantTethering.Performance.StartScanToConnectionDuration.Background.
   </summary>
 </histogram>
 
@@ -32149,7 +32158,7 @@
     units="ms">
   <owner>hansberry@chromium.org</owner>
   <summary>
-    The duration of time between when a client connects to a host,  and
+    The duration of time between when a client connects to a host, and
     authenticates with that host.
   </summary>
 </histogram>
@@ -32202,6 +32211,67 @@
 </histogram>
 
 <histogram
+    name="InstantTethering.Performance.ReceiveAdvertisementToConnectionDuration"
+    units="ms">
+  <owner>hansberry@chromium.org</owner>
+  <summary>
+    The duration of time between when a client received a foreground
+    advertisement from a host, and connected to that host (before
+    authentication).
+  </summary>
+</histogram>
+
+<histogram
+    name="InstantTethering.Performance.ReceiveAdvertisementToConnectionDuration.Background"
+    units="ms">
+  <owner>hansberry@chromium.org</owner>
+  <summary>
+    The duration of time between when a client received a background
+    advertisement from a host, and connected to that host (before
+    authentication).
+
+    This histogram is the background analog of
+    InstantTethering.Performance.ReceiveAdvertisementToConnectionDuration.
+  </summary>
+</histogram>
+
+<histogram
+    name="InstantTethering.Performance.StartScanToConnectionDuration.Background"
+    units="ms">
+  <owner>hansberry@chromium.org</owner>
+  <summary>
+    The duration of time between when a client begins to scan, and connects to a
+    host (before authentication).
+
+    This histogram is the background analog of
+    InstantTethering.Performance.AdvertisementToConnectionDuration.
+  </summary>
+</histogram>
+
+<histogram
+    name="InstantTethering.Performance.StartScanToReceiveAdvertisementDuration"
+    units="ms">
+  <owner>hansberry@chromium.org</owner>
+  <summary>
+    The duration of time between when a client begins to scan and advertise, and
+    receives a foreground advertisement from a host.
+  </summary>
+</histogram>
+
+<histogram
+    name="InstantTethering.Performance.StartScanToReceiveAdvertisementDuration.Background"
+    units="ms">
+  <owner>hansberry@chromium.org</owner>
+  <summary>
+    The duration of time between when a client begins to scan, and receives a
+    background advertisement from a host.
+
+    This histogram is the background analog of
+    InstantTethering.Performance.AdvertisementToConnectionDuration.
+  </summary>
+</histogram>
+
+<histogram
     name="InstantTethering.Performance.TetherAvailabilityResponseDuration"
     units="ms">
   <owner>hansberry@chromium.org</owner>
@@ -32635,6 +32705,17 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.CommittedURLMatchesCurrentItem" enum="Boolean">
+  <owner>danyao@chromium.org</owner>
+  <summary>
+    When a navigation is committed, the web view URL is expected to match that
+    of the current back-forward item. WKWebView seems to break this assumption
+    at times. This histogram counts the frequency of this invariant violation at
+    the time when a new navigation is committed. True means the URL matches the
+    current back-forward item.
+  </summary>
+</histogram>
+
 <histogram name="IOS.ContentExtension.DisplayCount" units="count">
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -32659,6 +32740,17 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.FinishedURLMatchesCurrentItem" enum="Boolean">
+  <owner>danyao@chromium.org</owner>
+  <summary>
+    When a navigation is finished, the web view URL is expected to match that of
+    the current back-forward item. WKWebView seems to break this assumption at
+    times. This histogram counts the frequency of this invariant violation at
+    the time when a new navigation is finished. True means the URL matches the
+    current back-forward item.
+  </summary>
+</histogram>
+
 <histogram name="IOS.Handoff.Origin" enum="IOSHandoffOrigin">
   <owner>erikchen@chromium.org</owner>
   <summary>
@@ -32817,6 +32909,16 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.WKWebViewFinishBeforeCommit" enum="Boolean">
+  <owner>danyao@chromium.org</owner>
+  <summary>
+    WKWebView should notify navigation commit before navigation finish, but
+    exceptions have been observed. This histogram counts the frequency of this
+    invariant violation at the time when a new navigation is finished. True
+    means navigation finish callback happened before navigation commit.
+  </summary>
+</histogram>
+
 <histogram name="IPC.AttachmentBrokerPrivileged.BrokerAttachmentError"
     enum="IPCAttachmentBrokerPrivilegedBrokerAttachmentError">
   <owner>erikchen@chromium.org</owner>
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index 9e92a4d..334274f 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -251,11 +251,7 @@
          ('tracing_perftests', 'build17-b1--device2'),
          # ('gpu_perftests', 'build18-b1--device2'), https://crbug.com/775219
          # ('cc_perftests', 'build47-b1--device2'), https://crbug.com/736150
-        ],
-       'perf_tests_with_args': [
-         ('angle_perftests', 'build17-b1--device7', ['--shard-timeout=300'],
-           'angle_perftests'),
-       ]
+        ]
       }
     ])
 
@@ -1075,10 +1071,25 @@
 # We will only be generating one entry per isolate in the new world.
 # Right now this is simply adding and/or updating chromium.perf.fyi.json
 # until migration is complete.  See crbug.com/757933 for more info.
+#
+# To add a new isolate, add an entry to the 'tests' section.  Supported
+# values in this json are:
+# isolate: the name of the isolate you are trigger
+# test_suite: name of the test suite if different than the isolate
+#     that you want to show up as the test name
+# extra_args: args that need to be passed to the script target
+#     of the isolate you are running.
+# shards: shard indices that you want the isolate to run on.  If omitted
+#     will run on all shards.
 NEW_PERF_RECIPE_FYI_TESTERS = {
   'testers' : {
     'One Buildbot Step Test Builder': {
-      'isolate': 'telemetry_perf_tests_experimental',
+      'tests': [
+        {
+          'isolate': 'telemetry_perf_tests_experimental',
+          'extra_args': ['--xvfb'],
+        }
+      ],
       'platform': 'linux',
       'dimension': {
         'pool': 'Chrome-perf-fyi',
@@ -1092,7 +1103,17 @@
       ],
     },
     'Mac 10.12 Laptop Low End': {
-      'isolate': 'performance_test_suite',
+      'tests': [
+        {
+          'isolate': 'performance_test_suite',
+        },
+        {
+          'isolate': 'load_library_perf_tests_v2',
+          'test_suite_name': 'load_library_perf_tests',
+          'extra_args': ["--non-telemetry=true"],
+          'shards': [0]
+        }
+      ],
       'platform': 'mac',
       'dimension': {
         'pool': 'Chrome-perf-fyi',
@@ -1110,7 +1131,12 @@
       ],
     },
     'Android Go': {
-      'isolate': 'performance_test_suite',
+      'tests': [
+        {
+          'name': 'performance_test_suite',
+          'isolate': 'performance_test_suite',
+        }
+      ],
       'platform': 'android',
       'dimension': {
         'pool': 'chrome.tests.perf-fyi',
@@ -1128,11 +1154,20 @@
 }
 
 
-def add_common_test_properties(test, tester_config):
+def add_common_test_properties(test_entry, tester_config, test_spec):
   dimensions = []
+  index = 0
   for device_id in tester_config['device_ids']:
-    dimensions.append({'id': device_id})
-  test['trigger_script'] = {
+    run_on_shard = True
+    if test_spec.get('shards', False):
+      # If specific shards are specified, only generate
+      # a entry for the specified shards
+      if index not in test_spec['shards']:
+        run_on_shard = False
+    if run_on_shard:
+      dimensions.append({'id': device_id})
+    index = index + 1
+  test_entry['trigger_script'] = {
       'script': '//testing/trigger_scripts/perf_device_trigger.py',
       'args': [
           '--multiple-trigger-configs',
@@ -1141,7 +1176,7 @@
           'True'
       ],
   }
-  test['merge'] = {
+  test_entry['merge'] = {
       'script': '//tools/perf/process_perf_results.py',
       'args': [
         '--service-account-file',
@@ -1151,7 +1186,7 @@
   return len(dimensions)
 
 
-def generate_performance_test_suite(tester_config):
+def generate_performance_test(tester_config, test):
   # First determine the browser that you need based on the tester
   browser_name = ''
   # For trybot testing we always use the reference build
@@ -1170,30 +1205,35 @@
 
   test_args = [
     '-v',
-    '--xvfb',
     '--browser=%s' % browser_name
   ]
+  test_args += test.get('extra_args', [])
 
   # Appending testing=true if we only want to run a subset of benchmarks
   # for quicker testing
   if tester_config.get('testing', False):
     test_args.append('--testing=true')
 
-  isolate_name = tester_config['isolate']
+  isolate_name = test['isolate']
   if browser_name == 'android-webview':
     test_args.append(
         '--webview-embedder-apk=../../out/Release/apks/SystemWebViewShell.apk')
     isolate_name = 'telemetry_perf_webview_tests'
 
+  # Check to see if the name is different than the isolate
+  test_suite = isolate_name
+  if test.get('test_suite', False):
+    test_suite = test['test_suite']
+
   result = {
     'args': test_args,
     'isolate_name': isolate_name,
-    'name': isolate_name,
+    'name': test_suite,
     'override_compile_targets': [
       isolate_name
     ]
   }
-  shards = add_common_test_properties(result, tester_config)
+  shards = add_common_test_properties(result, tester_config, test)
   result['swarming'] = {
     # Always say this is true regardless of whether the tester
     # supports swarming. It doesn't hurt.
@@ -1224,7 +1264,9 @@
     # what we have listed here
     testers = NEW_PERF_RECIPE_FYI_TESTERS
     for tester, tester_config in testers['testers'].iteritems():
-      isolated_scripts = [generate_performance_test_suite(tester_config)]
+      isolated_scripts = []
+      for test in tester_config['tests']:
+        isolated_scripts.append(generate_performance_test(tester_config, test))
       tests[tester] = {
         'isolated_scripts': sorted(isolated_scripts, key=lambda x: x['name'])
       }
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index dc5889a..e50667e 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -2419,7 +2419,10 @@
       return ROLE_SYSTEM_ALERT;
 
     case ax::mojom::Role::kAlertDialog:
-      return ROLE_SYSTEM_DIALOG;
+      // We temporarily use |ROLE_SYSTEM_ALERT| because some Windows screen
+      // readers are not compatible with |ax::mojom::Role::kAlertDialog| yet.
+      // TODO(aleventhal) modify this to return |ROLE_SYSTEM_DIALOG|.
+      return ROLE_SYSTEM_ALERT;
 
     case ax::mojom::Role::kAnchor:
       return ROLE_SYSTEM_LINK;
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index c75b96e..2f74c3a9 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -359,6 +359,7 @@
 
 test("aura_unittests") {
   sources = [
+    "../compositor_extra/shadow_unittest.cc",
     "gestures/gesture_recognizer_unittest.cc",
     "hit_test_data_provider_aura_unittest.cc",
     "mus/drag_drop_controller_mus_unittest.cc",
@@ -393,6 +394,7 @@
     "//testing/gtest",
     "//ui/base:test_support",
     "//ui/compositor:test_support",
+    "//ui/compositor_extra",
     "//ui/display:test_support",
     "//ui/events:gesture_detection",
     "//ui/events:test_support",
diff --git a/ui/aura/window_occlusion_tracker.cc b/ui/aura/window_occlusion_tracker.cc
index f1bd2aee..f573b75 100644
--- a/ui/aura/window_occlusion_tracker.cc
+++ b/ui/aura/window_occlusion_tracker.cc
@@ -27,7 +27,11 @@
 
 // Maximum number of times that MaybeComputeOcclusion() should have to recompute
 // occlusion states before they become stable.
-constexpr int kMaxRecomputeOcclusion = 2;
+//
+// TODO(fdoray): This can be changed to 2 once showing/hiding a WebContents
+// doesn't cause a call to Show()/Hide() on the aura::Window of a
+// RenderWidgetHostViewAura. https://crbug.com/827268
+constexpr int kMaxRecomputeOcclusion = 3;
 
 WindowOcclusionTracker* g_tracker = nullptr;
 
diff --git a/ui/aura/window_occlusion_tracker_unittest.cc b/ui/aura/window_occlusion_tracker_unittest.cc
index 8ee2fd1..a89b3ecd 100644
--- a/ui/aura/window_occlusion_tracker_unittest.cc
+++ b/ui/aura/window_occlusion_tracker_unittest.cc
@@ -1426,21 +1426,21 @@
     if (!window_to_update_)
       return;
 
+    ++num_occlusion_change_;
+
     if (window_to_update_->IsVisible()) {
       window_to_update_->Hide();
-      EXPECT_FALSE(did_set_expectation_from_occlusion_changed_);
-      set_expectation(Window::OcclusionState::HIDDEN);
-      did_set_expectation_from_occlusion_changed_ = true;
+      if (num_occlusion_change_ <= 3)
+        set_expectation(Window::OcclusionState::HIDDEN);
     } else {
       window_to_update_->Show();
-      if (!did_set_expectation_from_occlusion_changed_)
         set_expectation(Window::OcclusionState::VISIBLE);
     }
   }
 
  private:
   Window* window_to_update_ = nullptr;
-  bool did_set_expectation_from_occlusion_changed_ = false;
+  int num_occlusion_change_ = 0;
 
   DISALLOW_COPY_AND_ASSIGN(WindowDelegateChangingWindowVisibility);
 };
diff --git a/ui/compositor_extra/BUILD.gn b/ui/compositor_extra/BUILD.gn
new file mode 100644
index 0000000..ef59ba4
--- /dev/null
+++ b/ui/compositor_extra/BUILD.gn
@@ -0,0 +1,18 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("compositor_extra") {
+  sources = [
+    "shadow.cc",
+    "shadow.h",
+  ]
+
+  deps = [
+    "//base",
+    "//ui/base",
+    "//ui/compositor",
+    "//ui/gfx",
+    "//ui/gfx/geometry",
+  ]
+}
diff --git a/ui/compositor_extra/DEPS b/ui/compositor_extra/DEPS
new file mode 100644
index 0000000..ed9f0a5
--- /dev/null
+++ b/ui/compositor_extra/DEPS
@@ -0,0 +1,5 @@
+include_rules = [
+  "+ui/base",
+  "+ui/compositor",
+  "+ui/gfx",
+]
diff --git a/ui/wm/core/shadow.cc b/ui/compositor_extra/shadow.cc
similarity index 98%
rename from ui/wm/core/shadow.cc
rename to ui/compositor_extra/shadow.cc
index 20def6b..d14b7e3 100644
--- a/ui/wm/core/shadow.cc
+++ b/ui/compositor_extra/shadow.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/wm/core/shadow.h"
+#include "ui/compositor_extra/shadow.h"
 
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/compositor/layer.h"
@@ -10,7 +10,7 @@
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/shadow_util.h"
 
-namespace wm {
+namespace ui {
 
 namespace {
 
@@ -173,4 +173,4 @@
                 blur_region.height()));
 }
 
-}  // namespace wm
+}  // namespace ui
diff --git a/ui/wm/core/shadow.h b/ui/compositor_extra/shadow.h
similarity index 93%
rename from ui/wm/core/shadow.h
rename to ui/compositor_extra/shadow.h
index 4c224a2..fb47899 100644
--- a/ui/wm/core/shadow.h
+++ b/ui/compositor_extra/shadow.h
@@ -2,15 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_WM_CORE_SHADOW_H_
-#define UI_WM_CORE_SHADOW_H_
+#ifndef UI_COMPOSITOR_EXTRA_SHADOW_H_
+#define UI_COMPOSITOR_EXTRA_SHADOW_H_
 
 #include <memory>
 
 #include "base/macros.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/gfx/geometry/rect.h"
-#include "ui/wm/core/wm_core_export.h"
 
 namespace gfx {
 struct ShadowDetails;
@@ -18,12 +17,9 @@
 
 namespace ui {
 class Layer;
-}  // namespace ui
-
-namespace wm {
 
 // Simple class that draws a drop shadow around content at given bounds.
-class WM_CORE_EXPORT Shadow : public ui::ImplicitAnimationObserver {
+class Shadow : public ui::ImplicitAnimationObserver {
  public:
   Shadow();
   ~Shadow() override;
@@ -103,6 +99,6 @@
   DISALLOW_COPY_AND_ASSIGN(Shadow);
 };
 
-}  // namespace wm
+}  // namespace ui
 
-#endif  // UI_WM_CORE_SHADOW_H_
+#endif  // UI_COMPOSITOR_EXTRA_SHADOW_H_
diff --git a/ui/wm/core/shadow_unittest.cc b/ui/compositor_extra/shadow_unittest.cc
similarity index 79%
rename from ui/wm/core/shadow_unittest.cc
rename to ui/compositor_extra/shadow_unittest.cc
index 28cef9b..10e6bfe 100644
--- a/ui/wm/core/shadow_unittest.cc
+++ b/ui/compositor_extra/shadow_unittest.cc
@@ -2,14 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/wm/core/shadow.h"
+#include "ui/compositor_extra/shadow.h"
 
 #include "base/macros.h"
-#include "ui/aura/test/aura_test_base.h"
+#include "base/test/test_discardable_memory_allocator.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/compositor/layer.h"
+#include "ui/compositor/scoped_animation_duration_scale_mode.h"
+#include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/shadow_util.h"
 #include "ui/gfx/shadow_value.h"
 
-namespace wm {
+namespace ui {
 namespace {
 
 constexpr int kElevationLarge = 24;
@@ -28,10 +32,30 @@
   return bounds.size();
 }
 
-using ShadowTest = aura::test::AuraTestBase;
+class ShadowTest : public testing::Test {
+ protected:
+  ShadowTest() {}
+  ~ShadowTest() override {}
+
+  void SetUp() override {
+    base::DiscardableMemoryAllocator::SetInstance(
+        &discardable_memory_allocator_);
+  }
+
+  void TearDown() override {
+    base::DiscardableMemoryAllocator::SetInstance(nullptr);
+  }
+
+ private:
+  base::TestDiscardableMemoryAllocator discardable_memory_allocator_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShadowTest);
+};
 
 // Test if the proper content bounds is calculated based on the current style.
 TEST_F(ShadowTest, SetContentBounds) {
+  ScopedAnimationDurationScaleMode zero_duration_mode(
+      ScopedAnimationDurationScaleMode::ZERO_DURATION);
   // Verify that layer bounds are outset from content bounds.
   Shadow shadow;
   {
@@ -103,4 +127,4 @@
 }
 
 }  // namespace
-}  // namespace wm
+}  // namespace ui
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
index 7c1fcfdd..93c0bcd 100644
--- a/ui/gfx/render_text_unittest.cc
+++ b/ui/gfx/render_text_unittest.cc
@@ -962,10 +962,6 @@
   render_text->Draw(canvas());
 }
 
-// TODO(PORT): Fails for RenderTextMac.
-// Crashes on Mac with RenderTextHarfBuzz. See http://crbug.com/640068.
-#if !defined(OS_MACOSX)
-
 TEST_P(RenderTextTest, ElidedText) {
   // TODO(skanuj) : Add more test cases for following
   // - RenderText styles.
@@ -1067,8 +1063,6 @@
   EXPECT_EQ(elided_obscured_text, render_text->GetDisplayText());
 }
 
-#endif  // !defined(OS_MACOSX)
-
 // TODO(PORT): Fails for RenderTextMac.
 TEST_P(RenderTextHarfBuzzTest, MultilineElide) {
   RenderText* render_text = GetRenderText();
@@ -1814,9 +1808,6 @@
   EXPECT_EQ(0U, render_text->cursor_position());
 }
 
-// TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
-// Crashes on Mac with RenderTextHarfBuzz. See http://crbug.com/640068.
-#if !defined(OS_MACOSX)
 TEST_P(RenderTextHarfBuzzTest, MoveCursorLeftRight_MeiryoUILigatures) {
   RenderText* render_text = GetRenderText();
   // Meiryo UI uses single-glyph ligatures for 'ff' and 'ffi', but each letter
@@ -1841,7 +1832,6 @@
   }
   EXPECT_EQ(6U, render_text->cursor_position());
 }
-#endif  // !defined(OS_MACOSX)
 
 TEST_P(RenderTextHarfBuzzTest, GraphemePositions) {
   // LTR कि (DEVANAGARI KA with VOWEL I) (2-char grapheme), LTR abc, and LTR कि.
diff --git a/ui/views/bubble/bubble_dialog_delegate.cc b/ui/views/bubble/bubble_dialog_delegate.cc
index 9f766e72..2155df79 100644
--- a/ui/views/bubble/bubble_dialog_delegate.cc
+++ b/ui/views/bubble/bubble_dialog_delegate.cc
@@ -250,6 +250,13 @@
       adjust_if_offscreen_ && !anchor_minimized && has_anchor);
 }
 
+ax::mojom::Role BubbleDialogDelegateView::GetAccessibleWindowRole() const {
+  // We return |ax::mojom::Role::kAlertDialog| which will make screen
+  // readers announce the contents of the bubble dialog as soon as it appears,
+  // as long as we also fire |ax::mojom::Event::kAlert|.
+  return ax::mojom::Role::kAlertDialog;
+}
+
 void BubbleDialogDelegateView::OnNativeThemeChanged(
     const ui::NativeTheme* theme) {
   UpdateColorsFromTheme(theme);
@@ -325,9 +332,11 @@
   // the bubble in its entirety rather than just its title and initially focused
   // view.  See http://crbug.com/474622 for details.
   if (widget == GetWidget() && visible) {
-    if (GetAccessibleWindowRole() == ax::mojom::Role::kAlertDialog)
+    if (GetAccessibleWindowRole() == ax::mojom::Role::kAlert ||
+        GetAccessibleWindowRole() == ax::mojom::Role::kAlertDialog) {
       widget->GetRootView()->NotifyAccessibilityEvent(ax::mojom::Event::kAlert,
                                                       true);
+    }
   }
 }
 
diff --git a/ui/views/bubble/bubble_dialog_delegate.h b/ui/views/bubble/bubble_dialog_delegate.h
index ab5ca68..d23bb6f 100644
--- a/ui/views/bubble/bubble_dialog_delegate.h
+++ b/ui/views/bubble/bubble_dialog_delegate.h
@@ -10,6 +10,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "build/build_config.h"
+#include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/views/bubble/bubble_border.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
@@ -132,6 +133,9 @@
   // Get bubble bounds from the anchor rect and client view's preferred size.
   virtual gfx::Rect GetBubbleBounds();
 
+  // DialogDelegateView overrides:
+  ax::mojom::Role GetAccessibleWindowRole() const override;
+
   // View overrides:
   void OnNativeThemeChanged(const ui::NativeTheme* theme) override;
 
diff --git a/ui/views/bubble/tray_bubble_view.cc b/ui/views/bubble/tray_bubble_view.cc
index fe4ba97..56f2ca5 100644
--- a/ui/views/bubble/tray_bubble_view.cc
+++ b/ui/views/bubble/tray_bubble_view.cc
@@ -313,6 +313,13 @@
   return ui::DIALOG_BUTTON_NONE;
 }
 
+ax::mojom::Role TrayBubbleView::GetAccessibleWindowRole() const {
+  // We override the role because the base class sets it to alert dialog.
+  // This would make screen readers announce the whole of the system tray
+  // which is undesirable.
+  return ax::mojom::Role::kDialog;
+}
+
 void TrayBubbleView::SizeToContents() {
   BubbleDialogDelegateView::SizeToContents();
   bubble_content_mask_->layer()->SetBounds(GetBubbleBounds());
diff --git a/ui/views/bubble/tray_bubble_view.h b/ui/views/bubble/tray_bubble_view.h
index aeff9a8..d001b052 100644
--- a/ui/views/bubble/tray_bubble_view.h
+++ b/ui/views/bubble/tray_bubble_view.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/optional.h"
+#include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/events/event.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/views/bubble/bubble_dialog_delegate.h"
@@ -160,6 +161,7 @@
  protected:
   // Overridden from views::BubbleDialogDelegateView.
   int GetDialogButtons() const override;
+  ax::mojom::Role GetAccessibleWindowRole() const override;
   void SizeToContents() override;
 
   // Overridden from views::View.
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm
index 76406e0..bb46e78 100644
--- a/ui/views/cocoa/bridged_content_view.mm
+++ b/ui/views/cocoa/bridged_content_view.mm
@@ -820,6 +820,11 @@
   [self handleKeyEvent:&event];
 }
 
+- (void)flagsChanged:(NSEvent*)theEvent {
+  ui::KeyEvent event(theEvent);
+  [self handleKeyEvent:&event];
+}
+
 - (void)scrollWheel:(NSEvent*)theEvent {
   if (!hostedView_)
     return;
diff --git a/ui/views/view.cc b/ui/views/view.cc
index 8568fae..398a23a6 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -437,9 +437,7 @@
 }
 
 void View::SizeToPreferredSize() {
-  gfx::Size pref_size = GetPreferredSize();
-  if ((pref_size.width() != width()) || (pref_size.height() != height()))
-    SetBounds(x(), y(), pref_size.width(), pref_size.height());
+  SetSize(GetPreferredSize());
 }
 
 gfx::Size View::GetMinimumSize() const {
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index 82631bb..a294b7f2 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -323,6 +323,23 @@
   EXPECT_TRUE(child->did_layout_);
 }
 
+// Tests that SizeToPreferredSize will trigger a Layout if the size has changed
+// or if layout is marked invalid.
+TEST_F(ViewTest, SizeToPreferredSizeInducesLayout) {
+  TestView example_view;
+  example_view.SetPreferredSize(gfx::Size(101, 102));
+  example_view.SizeToPreferredSize();
+  EXPECT_TRUE(example_view.did_layout_);
+
+  example_view.Reset();
+  example_view.SizeToPreferredSize();
+  EXPECT_FALSE(example_view.did_layout_);
+
+  example_view.InvalidateLayout();
+  example_view.SizeToPreferredSize();
+  EXPECT_TRUE(example_view.did_layout_);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // OnBoundsChanged
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/ui/views/widget/widget_interactive_uitest.cc b/ui/views/widget/widget_interactive_uitest.cc
index 21e41dac..dc293c3 100644
--- a/ui/views/widget/widget_interactive_uitest.cc
+++ b/ui/views/widget/widget_interactive_uitest.cc
@@ -377,9 +377,7 @@
   }
 
   void WaitForEvents() {
-    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-    base::RunLoop run_loop;
+    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
     quit_closure_ = run_loop.QuitClosure();
     run_loop.Run();
   }
diff --git a/ui/wm/BUILD.gn b/ui/wm/BUILD.gn
index a5637d2..0b0e0f3 100644
--- a/ui/wm/BUILD.gn
+++ b/ui/wm/BUILD.gn
@@ -32,8 +32,6 @@
     "core/focus_rules.h",
     "core/native_cursor_manager.h",
     "core/native_cursor_manager_delegate.h",
-    "core/shadow.cc",
-    "core/shadow.h",
     "core/shadow_controller.cc",
     "core/shadow_controller.h",
     "core/shadow_types.cc",
@@ -71,6 +69,7 @@
     "//ui/base",
     "//ui/base/ime",
     "//ui/compositor",
+    "//ui/compositor_extra",
     "//ui/display",
     "//ui/events",
     "//ui/events:events_base",
@@ -129,7 +128,6 @@
     "core/easy_resize_window_targeter_unittest.cc",
     "core/focus_controller_unittest.cc",
     "core/shadow_controller_unittest.cc",
-    "core/shadow_unittest.cc",
     "core/transient_window_manager_unittest.cc",
     "core/transient_window_stacking_client_unittest.cc",
     "core/visibility_controller_unittest.cc",
@@ -150,6 +148,7 @@
     "//ui/base:test_support",
     "//ui/base/ime",
     "//ui/compositor:test_support",
+    "//ui/compositor_extra",
     "//ui/events:test_support",
     "//ui/events/platform",
     "//ui/gfx",
diff --git a/ui/wm/core/DEPS b/ui/wm/core/DEPS
index 73f5eb1..3d4d8af 100644
--- a/ui/wm/core/DEPS
+++ b/ui/wm/core/DEPS
@@ -11,6 +11,7 @@
   "+ui/base/ui_base_paths.h",
   "+ui/base/ui_base_types.h",
   "+ui/compositor",
+  "+ui/compositor_extra",
   "+ui/events",
   "+ui/gfx",
   "+ui/resources/grit/ui_resources.h",
diff --git a/ui/wm/core/shadow_controller.cc b/ui/wm/core/shadow_controller.cc
index 875ed5e9..4e2033eb 100644
--- a/ui/wm/core/shadow_controller.cc
+++ b/ui/wm/core/shadow_controller.cc
@@ -19,15 +19,15 @@
 #include "ui/base/class_property.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/compositor/layer.h"
-#include "ui/wm/core/shadow.h"
+#include "ui/compositor_extra/shadow.h"
 #include "ui/wm/core/shadow_types.h"
 #include "ui/wm/core/window_util.h"
 #include "ui/wm/public/activation_client.h"
 
 using std::make_pair;
 
-DEFINE_UI_CLASS_PROPERTY_TYPE(::wm::Shadow*);
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(::wm::Shadow, kShadowLayerKey, nullptr);
+DEFINE_UI_CLASS_PROPERTY_TYPE(ui::Shadow*);
+DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(ui::Shadow, kShadowLayerKey, nullptr);
 
 namespace wm {
 
@@ -205,7 +205,7 @@
     const gfx::Rect& old_bounds,
     const gfx::Rect& new_bounds,
     ui::PropertyChangeReason reason) {
-  Shadow* shadow = GetShadowForWindow(window);
+  ui::Shadow* shadow = GetShadowForWindow(window);
   if (shadow)
     shadow->SetContentBounds(gfx::Rect(new_bounds.size()));
 }
@@ -219,12 +219,12 @@
                                                aura::Window* gained_active,
                                                aura::Window* lost_active) {
   if (gained_active) {
-    Shadow* shadow = GetShadowForWindow(gained_active);
+    ui::Shadow* shadow = GetShadowForWindow(gained_active);
     if (shadow)
       shadow->SetElevation(GetShadowElevationForActiveState(gained_active));
   }
   if (lost_active) {
-    Shadow* shadow = GetShadowForWindow(lost_active);
+    ui::Shadow* shadow = GetShadowForWindow(lost_active);
     if (shadow && GetShadowElevationConvertDefault(lost_active) ==
                       kShadowElevationInactiveWindow) {
       shadow->SetElevation(
@@ -248,7 +248,7 @@
 void ShadowController::Impl::HandlePossibleShadowVisibilityChange(
     aura::Window* window) {
   const bool should_show = ShouldShowShadowForWindow(window);
-  Shadow* shadow = GetShadowForWindow(window);
+  ui::Shadow* shadow = GetShadowForWindow(window);
   if (shadow) {
     shadow->SetElevation(GetShadowElevationForActiveState(window));
     shadow->layer()->SetVisible(should_show);
@@ -259,7 +259,7 @@
 
 void ShadowController::Impl::CreateShadowForWindow(aura::Window* window) {
   DCHECK(!window->IsRootWindow());
-  Shadow* shadow = new Shadow();
+  ui::Shadow* shadow = new ui::Shadow();
   window->SetProperty(kShadowLayerKey, shadow);
 
   int corner_radius = window->GetProperty(aura::client::kWindowCornerRadiusKey);
@@ -286,7 +286,7 @@
 
 // ShadowController ------------------------------------------------------------
 
-Shadow* ShadowController::GetShadowForWindow(aura::Window* window) {
+ui::Shadow* ShadowController::GetShadowForWindow(aura::Window* window) {
   return window->GetProperty(kShadowLayerKey);
 }
 
diff --git a/ui/wm/core/shadow_controller.h b/ui/wm/core/shadow_controller.h
index f9c3bee..5cdc329a0 100644
--- a/ui/wm/core/shadow_controller.h
+++ b/ui/wm/core/shadow_controller.h
@@ -17,10 +17,13 @@
 class Window;
 }
 
+namespace ui {
+class Shadow;
+}
+
 namespace wm {
 
 class ActivationClient;
-class Shadow;
 
 // ShadowController observes changes to windows and creates and updates drop
 // shadows as needed. ShadowController itself is light weight and per
@@ -29,7 +32,7 @@
 class WM_CORE_EXPORT ShadowController : public ActivationChangeObserver {
  public:
   // Returns the shadow for the |window|, or NULL if no shadow exists.
-  static Shadow* GetShadowForWindow(aura::Window* window);
+  static ui::Shadow* GetShadowForWindow(aura::Window* window);
 
   explicit ShadowController(ActivationClient* activation_client);
   ~ShadowController() override;
diff --git a/ui/wm/core/shadow_controller_unittest.cc b/ui/wm/core/shadow_controller_unittest.cc
index c3af569..e9ad4d8 100644
--- a/ui/wm/core/shadow_controller_unittest.cc
+++ b/ui/wm/core/shadow_controller_unittest.cc
@@ -15,8 +15,8 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/compositor/layer.h"
+#include "ui/compositor_extra/shadow.h"
 #include "ui/wm/core/default_activation_client.h"
-#include "ui/wm/core/shadow.h"
 #include "ui/wm/core/shadow_types.h"
 #include "ui/wm/core/window_util.h"
 #include "ui/wm/public/activation_client.h"
@@ -66,7 +66,7 @@
   EXPECT_FALSE(ShadowController::GetShadowForWindow(window.get()));
   window->Show();
 
-  const Shadow* shadow = ShadowController::GetShadowForWindow(window.get());
+  const ui::Shadow* shadow = ShadowController::GetShadowForWindow(window.get());
   ASSERT_TRUE(shadow != NULL);
   EXPECT_TRUE(shadow->layer()->visible());
 
@@ -99,7 +99,7 @@
   // When the shadow is first created, it should use the window's size (but
   // remain at the origin, since it's a child of the window's layer).
   SetShadowElevation(window.get(), kShadowElevationInactiveWindow);
-  const Shadow* shadow = ShadowController::GetShadowForWindow(window.get());
+  const ui::Shadow* shadow = ShadowController::GetShadowForWindow(window.get());
   ASSERT_TRUE(shadow != NULL);
   EXPECT_EQ(gfx::Rect(kOldBounds.size()).ToString(),
             shadow->content_bounds().ToString());
@@ -122,7 +122,7 @@
   ActivateWindow(window1.get());
 
   // window1 is active, so style should have active appearance.
-  Shadow* shadow1 = ShadowController::GetShadowForWindow(window1.get());
+  ui::Shadow* shadow1 = ShadowController::GetShadowForWindow(window1.get());
   ASSERT_TRUE(shadow1 != NULL);
   EXPECT_EQ(kShadowElevationActiveWindow, shadow1->desired_elevation());
 
@@ -136,7 +136,7 @@
   ActivateWindow(window2.get());
 
   // window1 is now inactive, so shadow should go inactive.
-  Shadow* shadow2 = ShadowController::GetShadowForWindow(window2.get());
+  ui::Shadow* shadow2 = ShadowController::GetShadowForWindow(window2.get());
   ASSERT_TRUE(shadow2 != NULL);
   EXPECT_EQ(kShadowElevationInactiveWindow, shadow1->desired_elevation());
   EXPECT_EQ(kShadowElevationActiveWindow, shadow2->desired_elevation());
@@ -150,7 +150,7 @@
   ParentWindow(window.get());
   window->Show();
 
-  Shadow* shadow = ShadowController::GetShadowForWindow(window.get());
+  ui::Shadow* shadow = ShadowController::GetShadowForWindow(window.get());
   ASSERT_TRUE(shadow != NULL);
   EXPECT_EQ(kShadowElevationInactiveWindow, shadow->desired_elevation());
 
@@ -173,7 +173,7 @@
   tooltip_window->SetBounds(gfx::Rect(10, 20, 300, 400));
   tooltip_window->Show();
 
-  Shadow* tooltip_shadow =
+  ui::Shadow* tooltip_shadow =
       ShadowController::GetShadowForWindow(tooltip_window.get());
   ASSERT_TRUE(tooltip_shadow != NULL);
   EXPECT_EQ(kShadowElevationMenuOrTooltip, tooltip_shadow->desired_elevation());
@@ -185,7 +185,7 @@
   menu_window->SetBounds(gfx::Rect(10, 20, 300, 400));
   menu_window->Show();
 
-  Shadow* menu_shadow =
+  ui::Shadow* menu_shadow =
       ShadowController::GetShadowForWindow(tooltip_window.get());
   ASSERT_TRUE(menu_shadow != NULL);
   EXPECT_EQ(kShadowElevationMenuOrTooltip, menu_shadow->desired_elevation());
@@ -203,7 +203,7 @@
   ActivateWindow(window1.get());
 
   // window1 is active, so style should have active appearance.
-  Shadow* shadow1 = ShadowController::GetShadowForWindow(window1.get());
+  ui::Shadow* shadow1 = ShadowController::GetShadowForWindow(window1.get());
   ASSERT_TRUE(shadow1 != NULL);
   EXPECT_EQ(kShadowElevationActiveWindow, shadow1->desired_elevation());