diff --git a/DEPS b/DEPS
index d6b1086..c25b9b4 100644
--- a/DEPS
+++ b/DEPS
@@ -40,7 +40,7 @@
   # 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': '0bd8f36309293720b44af92f113f6ebe96d54779',
+  'skia_revision': 'e95941f2c61d8bcb5aaf60968e4391a1c7a0d593',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '9907db54ee404c8a3efb585fa7db4c58e6966ef3',
+  'catapult_revision': 'c3f25757340bf0a82c398d19b5e5591cfc25404e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/chrome/VERSION b/chrome/VERSION
index 81d27e2..e6d2edf 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=58
 MINOR=0
-BUILD=2995
+BUILD=2996
 PATCH=0
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 9289040..1616a15 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -9347,15 +9347,14 @@
         <message name="IDS_ARC_VERSION_LABEL" desc="Label for ARC version">
           ARC Version
         </message>
+        <message name="IDS_ARC_LABEL" desc="Label for ARC">
+          ARC
+        </message>
+        <message name="IDS_PLATFORM_LABEL" desc="Label for Platform">
+          Platform
+        </message>
       </if> <!-- chromeos -->
 
-      <message name="IDS_ARC_LABEL" desc="Label for ARC">
-        ARC
-      </message>
-      <message name="IDS_PLATFORM_LABEL" desc="Label for Platform">
-        Platform
-      </message>
-
       <!-- chrome://settings. Android uses native UI for settings -->
       <if expr="not is_android">
         <if expr="chromeos">
diff --git a/chrome/browser/extensions/favicon_downloader.cc b/chrome/browser/extensions/favicon_downloader.cc
index 39ac3dd..fa6f2ad0e 100644
--- a/chrome/browser/extensions/favicon_downloader.cc
+++ b/chrome/browser/extensions/favicon_downloader.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "components/favicon/content/content_favicon_driver.h"
+#include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/favicon_url.h"
 #include "third_party/skia/include/core/SkBitmap.h"
@@ -100,7 +101,7 @@
     const GURL& image_url,
     const std::vector<SkBitmap>& bitmaps,
     const std::vector<gfx::Size>& original_bitmap_sizes) {
-  // Request may have been canceled by DidNavigateMainFrame().
+  // Request may have been canceled by DidFinishNavigation().
   if (in_progress_requests_.erase(id) == 0)
     return;
 
@@ -112,9 +113,11 @@
 }
 
 // content::WebContentsObserver overrides:
-void FaviconDownloader::DidNavigateMainFrame(
-    const content::LoadCommittedDetails& details,
-    const content::FrameNavigateParams& params) {
+void FaviconDownloader::DidFinishNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted())
+    return;
+
   // Clear all pending requests.
   in_progress_requests_.clear();
   favicon_map_.clear();
diff --git a/chrome/browser/extensions/favicon_downloader.h b/chrome/browser/extensions/favicon_downloader.h
index 77cf8596..049c2be 100644
--- a/chrome/browser/extensions/favicon_downloader.h
+++ b/chrome/browser/extensions/favicon_downloader.h
@@ -71,9 +71,8 @@
                           const std::vector<gfx::Size>& original_bitmap_sizes);
 
   // content::WebContentsObserver overrides:
-  void DidNavigateMainFrame(
-      const content::LoadCommittedDetails& details,
-      const content::FrameNavigateParams& params) override;
+  void DidFinishNavigation(
+      content::NavigationHandle* navigation_handle) override;
   void DidUpdateFaviconURL(
       const std::vector<content::FaviconURL>& candidates) override;
 
diff --git a/chrome/browser/ui/libgtkui/gtk_util.cc b/chrome/browser/ui/libgtkui/gtk_util.cc
index 543cbda..55bd85f 100644
--- a/chrome/browser/ui/libgtkui/gtk_util.cc
+++ b/chrome/browser/ui/libgtkui/gtk_util.cc
@@ -347,14 +347,17 @@
                         color.blue * 255);
 }
 
-SkColor GetFgColor(const char* css_selector) {
-  auto context = GetStyleContextFromCss(css_selector);
+SkColor SkColorFromStyleContext(GtkStyleContext* context) {
   GdkRGBA color;
   gtk_style_context_get_color(context, gtk_style_context_get_state(context),
                               &color);
   return GdkRgbaToSkColor(color);
 }
 
+SkColor GetFgColor(const char* css_selector) {
+  return SkColorFromStyleContext(GetStyleContextFromCss(css_selector));
+}
+
 GtkCssProvider* GetCssProvider(const char* css) {
   GtkCssProvider* provider = gtk_css_provider_new();
   GError* error = nullptr;
diff --git a/chrome/browser/ui/libgtkui/gtk_util.h b/chrome/browser/ui/libgtkui/gtk_util.h
index 4f9269a..91f9520 100644
--- a/chrome/browser/ui/libgtkui/gtk_util.h
+++ b/chrome/browser/ui/libgtkui/gtk_util.h
@@ -139,6 +139,8 @@
 // must g_object_unref() the returned context.
 ScopedStyleContext GetStyleContextFromCss(const char* css_selector);
 
+SkColor SkColorFromStyleContext(GtkStyleContext* context);
+
 // Removes all border-type properties on |context| and all of its parents.
 void RemoveBorders(GtkStyleContext* context);
 
diff --git a/chrome/browser/ui/libgtkui/native_theme_gtk3.cc b/chrome/browser/ui/libgtkui/native_theme_gtk3.cc
index 74399f0..a593b14 100644
--- a/chrome/browser/ui/libgtkui/native_theme_gtk3.cc
+++ b/chrome/browser/ui/libgtkui/native_theme_gtk3.cc
@@ -20,8 +20,17 @@
 
 namespace {
 
+enum BackgroundRenderMode {
+  BG_RENDER_NORMAL,
+  BG_RENDER_NONE,
+  BG_RENDER_RECURSIVE,
+};
+
 SkBitmap GetWidgetBitmap(const gfx::Size& size,
-                         GtkStyleContext* context) {
+                         GtkStyleContext* context,
+                         BackgroundRenderMode bg_mode,
+                         bool render_frame) {
+  DCHECK(bg_mode != BG_RENDER_NONE || render_frame);
   SkBitmap bitmap;
   bitmap.allocN32Pixels(size.width(), size.height());
   bitmap.eraseColor(0);
@@ -32,8 +41,18 @@
       cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, size.width()));
   cairo_t* cr = cairo_create(surface);
 
-  RenderBackground(size, cr, context);
-  gtk_render_frame(context, cr, 0, 0, size.width(), size.height());
+  switch (bg_mode) {
+    case BG_RENDER_NORMAL:
+      gtk_render_background(context, cr, 0, 0, size.width(), size.height());
+      break;
+    case BG_RENDER_RECURSIVE:
+      RenderBackground(size, cr, context);
+      break;
+    case BG_RENDER_NONE:
+      break;
+  }
+  if (render_frame)
+    gtk_render_frame(context, cr, 0, 0, size.width(), size.height());
   cairo_destroy(cr);
   cairo_surface_destroy(surface);
   return bitmap;
@@ -41,8 +60,12 @@
 
 void PaintWidget(SkCanvas* canvas,
                  const gfx::Rect& rect,
-                 GtkStyleContext* context) {
-  canvas->drawBitmap(GetWidgetBitmap(rect.size(), context), rect.x(), rect.y());
+                 GtkStyleContext* context,
+                 BackgroundRenderMode bg_mode,
+                 bool render_frame) {
+  canvas->drawBitmap(
+      GetWidgetBitmap(rect.size(), context, bg_mode, render_frame), rect.x(),
+      rect.y());
 }
 
 GtkStateFlags StateToStateFlags(NativeThemeGtk3::State state) {
@@ -99,7 +122,7 @@
       return GetFgColor(
           "GtkMenu#menu GtkMenuItem#menuitem GtkLabel#label.accelerator");
     case ui::NativeTheme::kColorId_MenuSeparatorColor:
-    // MenuButton borders are used the same way as menu separators in Chrome.
+    // MenuButton borders are used as vertical menu separators in Chrome.
     case ui::NativeTheme::kColorId_EnabledMenuButtonBorderColor:
     case ui::NativeTheme::kColorId_FocusedMenuButtonBorderColor:
     case ui::NativeTheme::kColorId_HoverMenuButtonBorderColor:
@@ -125,7 +148,7 @@
     case ui::NativeTheme::kColorId_LinkPressed:
       if (GtkVersionCheck(3, 12))
         return GetFgColor("GtkLabel#label.link:link:hover:active");
-      // fallthrough
+    // fallthrough
     case ui::NativeTheme::kColorId_LinkEnabled: {
       if (GtkVersionCheck(3, 12)) {
         return GetFgColor("GtkLabel#label.link:link");
@@ -368,7 +391,8 @@
     SkCanvas* canvas,
     const gfx::Size& size,
     const MenuBackgroundExtraParams& menu_background) const {
-  PaintWidget(canvas, gfx::Rect(size), GetStyleContextFromCss("GtkMenu#menu"));
+  PaintWidget(canvas, gfx::Rect(size), GetStyleContextFromCss("GtkMenu#menu"),
+              BG_RENDER_RECURSIVE, false);
 }
 
 void NativeThemeGtk3::PaintMenuItemBackground(
@@ -378,7 +402,64 @@
     const MenuItemExtraParams& menu_item) const {
   auto context = GetStyleContextFromCss("GtkMenu#menu GtkMenuItem#menuitem");
   gtk_style_context_set_state(context, StateToStateFlags(state));
-  PaintWidget(canvas, rect, context);
+  PaintWidget(canvas, rect, context, BG_RENDER_NORMAL, true);
+}
+
+void NativeThemeGtk3::PaintMenuSeparator(
+    SkCanvas* canvas,
+    State state,
+    const gfx::Rect& rect,
+    const MenuSeparatorExtraParams& menu_separator) const {
+  auto separator_offset = [&](int separator_thickness) {
+    switch (menu_separator.type) {
+      case ui::LOWER_SEPARATOR:
+        return rect.height() - separator_thickness;
+      case ui::UPPER_SEPARATOR:
+        return 0;
+      default:
+        return rect.height() / 2;
+    }
+  };
+  if (GtkVersionCheck(3, 20)) {
+    auto context =
+        GetStyleContextFromCss("GtkMenu#menu GtkSeparator#separator");
+    GtkBorder margin, border, padding;
+    GtkStateFlags state = gtk_style_context_get_state(context);
+    gtk_style_context_get_margin(context, state, &margin);
+    gtk_style_context_get_border(context, state, &border);
+    gtk_style_context_get_padding(context, state, &padding);
+    int min_height = 0;
+    gtk_style_context_get(context, state, "min-height", &min_height, NULL);
+    int w = rect.width() - margin.left - margin.right;
+    int h =
+        min_height + padding.top + padding.bottom + border.top + border.bottom;
+    int x = margin.left;
+    int y = separator_offset(h);
+    PaintWidget(canvas, gfx::Rect(x, y, w, h), context, BG_RENDER_NORMAL, true);
+  } else {
+    auto context =
+        GetStyleContextFromCss("GtkMenu#menu GtkMenuItem#menuitem.separator");
+    gboolean wide_separators = false;
+    gint separator_height = 0;
+    gtk_style_context_get_style(context, "wide-separators", &wide_separators,
+                                "separator-height", &separator_height, nullptr);
+    // This code was adapted from gtk/gtkmenuitem.c.  For some reason,
+    // padding is used as the margin.
+    GtkBorder padding;
+    gtk_style_context_get_padding(context, gtk_style_context_get_state(context),
+                                  &padding);
+    int w = rect.width() - padding.left - padding.right;
+    int x = rect.x() + padding.left;
+    int h = wide_separators ? separator_height : 1;
+    int y = rect.y() + separator_offset(h);
+    if (wide_separators) {
+      PaintWidget(canvas, gfx::Rect(x, y, w, h), context, BG_RENDER_NONE, true);
+    } else {
+      SkPaint paint;
+      paint.setColor(SkColorFromStyleContext(context));
+      canvas->drawLine(x, y, x + w, y, paint);
+    }
+  }
 }
 
 void NativeThemeGtk3::PaintFrameTopArea(
@@ -390,12 +471,12 @@
                                             ? "#headerbar.header-bar.titlebar"
                                             : "GtkMenuBar#menubar");
   RemoveBorders(context);
-  gtk_style_context_set_state(context,
-                              frame_top_area.is_active
-                                  ? GTK_STATE_FLAG_NORMAL
-                              : GTK_STATE_FLAG_BACKDROP);
+  gtk_style_context_set_state(context, frame_top_area.is_active
+                                           ? GTK_STATE_FLAG_NORMAL
+                                           : GTK_STATE_FLAG_BACKDROP);
 
-  SkBitmap bitmap = GetWidgetBitmap(rect.size(), context);
+  SkBitmap bitmap =
+      GetWidgetBitmap(rect.size(), context, BG_RENDER_RECURSIVE, false);
 
   if (frame_top_area.incognito) {
     bitmap = SkBitmapOperations::CreateHSLShiftedBitmap(
diff --git a/chrome/browser/ui/libgtkui/native_theme_gtk3.h b/chrome/browser/ui/libgtkui/native_theme_gtk3.h
index 1946f72b..77de310e 100644
--- a/chrome/browser/ui/libgtkui/native_theme_gtk3.h
+++ b/chrome/browser/ui/libgtkui/native_theme_gtk3.h
@@ -25,6 +25,11 @@
       SkCanvas* canvas,
       const gfx::Size& size,
       const MenuBackgroundExtraParams& menu_background) const override;
+  void PaintMenuSeparator(
+      SkCanvas* canvas,
+      State state,
+      const gfx::Rect& rect,
+      const MenuSeparatorExtraParams& menu_separator) const override;
   void PaintMenuItemBackground(
       SkCanvas* canvas,
       State state,
diff --git a/chrome/browser/ui/webui/version_ui.cc b/chrome/browser/ui/webui/version_ui.cc
index 8235a8a6..78fd307 100644
--- a/chrome/browser/ui/webui/version_ui.cc
+++ b/chrome/browser/ui/webui/version_ui.cc
@@ -30,7 +30,6 @@
 #include "v8/include/v8-version-string.h"
 
 #if defined(OS_ANDROID)
-#include "base/android/build_info.h"
 #include "chrome/browser/ui/android/android_about_app_info.h"
 #else  // !defined(OS_ANDROID)
 #include "chrome/browser/ui/webui/theme_source.h"
@@ -56,24 +55,8 @@
                          version_info::GetVersionNumber());
   html_source->AddString(version_ui::kVersionModifier,
                          chrome::GetChannelString());
-  html_source->AddLocalizedString(version_ui::kOSName, IDS_VERSION_UI_OS);
-  html_source->AddLocalizedString(version_ui::kARC, IDS_ARC_LABEL);
-  html_source->AddLocalizedString(version_ui::kPlatform, IDS_PLATFORM_LABEL);
-  html_source->AddString(version_ui::kOSType, version_info::GetOSType());
   html_source->AddString(version_ui::kJSEngine, "V8");
   html_source->AddString(version_ui::kJSVersion, V8_VERSION_STRING);
-
-#if defined(OS_ANDROID)
-  html_source->AddString(version_ui::kOSVersion,
-                         AndroidAboutAppInfo::GetOsInfo());
-#else
-  html_source->AddString(version_ui::kOSVersion, std::string());
-  html_source->AddString(version_ui::kFlashPlugin, "Flash");
-  // Note that the Flash version is retrieve asynchronously and returned in
-  // VersionHandler::OnGotPlugins. The area is initially blank.
-  html_source->AddString(version_ui::kFlashVersion, std::string());
-#endif  // defined(OS_ANDROID)
-
   html_source->AddLocalizedString(version_ui::kCompany,
                                   IDS_ABOUT_VERSION_COMPANY_NAME);
   html_source->AddString(
@@ -88,12 +71,43 @@
                                   version_info::IsOfficialBuild()
                                       ? IDS_VERSION_UI_OFFICIAL
                                       : IDS_VERSION_UI_UNOFFICIAL);
+  html_source->AddLocalizedString(version_ui::kUserAgentName,
+                                  IDS_VERSION_UI_USER_AGENT);
+  html_source->AddString(version_ui::kUserAgent, GetUserAgent());
+  html_source->AddLocalizedString(version_ui::kCommandLineName,
+                                  IDS_VERSION_UI_COMMAND_LINE);
+  // Note that the executable path and profile path are retrieved asynchronously
+  // and returned in VersionHandler::OnGotFilePaths. The area is initially
+  // blank.
+  html_source->AddLocalizedString(version_ui::kExecutablePathName,
+                                  IDS_VERSION_UI_EXECUTABLE_PATH);
+  html_source->AddString(version_ui::kExecutablePath, std::string());
+  html_source->AddLocalizedString(version_ui::kProfilePathName,
+                                  IDS_VERSION_UI_PROFILE_PATH);
+  html_source->AddString(version_ui::kProfilePath, std::string());
+  html_source->AddLocalizedString(version_ui::kVariationsName,
+                                  IDS_VERSION_UI_VARIATIONS);
 
 #if defined(OS_CHROMEOS)
+  html_source->AddLocalizedString(version_ui::kARC, IDS_ARC_LABEL);
+  html_source->AddLocalizedString(version_ui::kPlatform, IDS_PLATFORM_LABEL);
   html_source->AddLocalizedString(version_ui::kCustomizationId,
                                   IDS_VERSION_UI_CUSTOMIZATION_ID);
+#else
+  html_source->AddLocalizedString(version_ui::kOSName, IDS_VERSION_UI_OS);
+  html_source->AddString(version_ui::kOSType, version_info::GetOSType());
 #endif  // OS_CHROMEOS
 
+#if defined(OS_ANDROID)
+  html_source->AddString(version_ui::kOSVersion,
+                         AndroidAboutAppInfo::GetOsInfo());
+#else
+  html_source->AddString(version_ui::kFlashPlugin, "Flash");
+  // Note that the Flash version is retrieve asynchronously and returned in
+  // VersionHandler::OnGotPlugins. The area is initially blank.
+  html_source->AddString(version_ui::kFlashVersion, std::string());
+#endif  // OS_ANDROID
+
 #if defined(ARCH_CPU_64_BITS)
   html_source->AddLocalizedString(version_ui::kVersionBitSize,
                                   IDS_VERSION_UI_64BIT);
@@ -101,11 +115,6 @@
   html_source->AddLocalizedString(version_ui::kVersionBitSize,
                                   IDS_VERSION_UI_32BIT);
 #endif
-  html_source->AddLocalizedString(version_ui::kUserAgentName,
-                                  IDS_VERSION_UI_USER_AGENT);
-  html_source->AddString(version_ui::kUserAgent, GetUserAgent());
-  html_source->AddLocalizedString(version_ui::kCommandLineName,
-                                  IDS_VERSION_UI_COMMAND_LINE);
 
 #if defined(OS_WIN)
   html_source->AddString(
@@ -122,39 +131,25 @@
   html_source->AddString(version_ui::kCommandLine, command_line);
 #endif
 
-  // Note that the executable path and profile path are retrieved asynchronously
-  // and returned in VersionHandler::OnGotFilePaths. The area is initially
-  // blank.
-  html_source->AddLocalizedString(version_ui::kExecutablePathName,
-                                  IDS_VERSION_UI_EXECUTABLE_PATH);
-  html_source->AddString(version_ui::kExecutablePath, std::string());
-
-  html_source->AddLocalizedString(version_ui::kProfilePathName,
-                                  IDS_VERSION_UI_PROFILE_PATH);
-  html_source->AddString(version_ui::kProfilePath, std::string());
-
-  html_source->AddLocalizedString(version_ui::kVariationsName,
-                                  IDS_VERSION_UI_VARIATIONS);
-
 #if defined(OS_WIN)
 #if defined(__clang__)
-  html_source->AddString("compiler", "clang");
+  html_source->AddString(version_ui::kCompiler, "clang");
 #elif defined(_MSC_VER) && _MSC_VER == 1900
 #if BUILDFLAG(PGO_BUILD)
-  html_source->AddString("compiler", "MSVC 2015 (PGO)");
+  html_source->AddString(version_ui::kCompiler, "MSVC 2015 (PGO)");
 #else
-  html_source->AddString("compiler", "MSVC 2015");
+  html_source->AddString(version_ui::kCompiler, "MSVC 2015");
 #endif
 #elif defined(_MSC_VER) && _MSC_VER == 1910
 #if BUILDFLAG(PGO_BUILD)
-  html_source->AddString("compiler", "MSVC 2017 (PGO)");
+  html_source->AddString(version_ui::kCompiler, "MSVC 2017 (PGO)");
 #else
-  html_source->AddString("compiler", "MSVC 2017");
+  html_source->AddString(version_ui::kCompiler, "MSVC 2017");
 #endif
 #elif defined(_MSC_VER)
 #error "Unsupported version of MSVC."
 #else
-  html_source->AddString("compiler", "Unknown");
+  html_source->AddString(version_ui::kCompiler, "Unknown");
 #endif
 #endif  // defined(OS_WIN)
 
diff --git a/components/version_ui/resources/about_version.html b/components/version_ui/resources/about_version.html
index a151b90..6928408d 100644
--- a/components/version_ui/resources/about_version.html
+++ b/components/version_ui/resources/about_version.html
@@ -63,7 +63,9 @@
           <td class="label" i18n-content="os_name"></td>
           <td class="version" id="os_type">
             <span i18n-content="os_type"></span>
-            <span id="os_version" i18n-content="os_version"></span>
+<if expr="is_android">
+            <span i18n-content="os_version"></span>
+</if>
           </td>
         </tr>
 </if>
@@ -71,7 +73,7 @@
         <tr>
           <td class="label" i18n-content="platform"></td>
           <td class="version" id="os_type">
-            <span id="os_version" i18n-content="os_version"></span>
+            <span id="os_version"></span>
           </td>
         </tr>
         <tr id="customization_id_holder" hidden>
@@ -79,13 +81,13 @@
           <td class="version">
             <span id="customization_id"></span>
           </td>
-</if>
         </tr>
         <tr id="arc_holder"><td class="label" i18n-content="arc_label"></td>
           <td class="version">
             <span id="arc_version"></span>
           </td>
         </tr>
+</if>
 <if expr="not is_ios">
         <tr><td class="label">JavaScript</td>
           <td class="version" id="js_engine">
@@ -117,12 +119,6 @@
           <td class="label" i18n-content="variations_name"></td>
           <td class="version" id="variations-list"></td>
         </tr>
-<if expr="is_android">
-        <tr id="build-id-section">
-          <td class="label" i18n-content="build_id_name"></td>
-          <td class="version" i18n-content="build_id"></td>
-        </tr>
-</if>
 <if expr="is_win">
         <tr id="compiler-section">
           <td class="label">Compiler</td>
diff --git a/components/version_ui/resources/about_version.js b/components/version_ui/resources/about_version.js
index 9a987f7..8232edd3 100644
--- a/components/version_ui/resources/about_version.js
+++ b/components/version_ui/resources/about_version.js
@@ -63,9 +63,10 @@
 /* All the work we do onload. */
 function onLoadWork() {
   chrome.send('requestVersionInfo');
-  $('arc_holder').hidden = true;
-  if (cr.isChromeOS)
+  if (cr.isChromeOS) {
+    $('arc_holder').hidden = true;
     chrome.chromeosInfoPrivate.get(['customizationId'], returnCustomizationId);
+  }
 }
 
 document.addEventListener('DOMContentLoaded', onLoadWork);
diff --git a/components/version_ui/version_ui_constants.cc b/components/version_ui/version_ui_constants.cc
index 5c4e824..d16045de 100644
--- a/components/version_ui/version_ui_constants.cc
+++ b/components/version_ui/version_ui_constants.cc
@@ -18,28 +18,47 @@
 
 // Strings.
 const char kApplicationLabel[] = "application_label";
+#if defined(OS_CHROMEOS)
 const char kARC[] = "arc_label";
+#endif
 const char kCL[] = "cl";
 const char kCommandLine[] = "command_line";
 const char kCommandLineName[] = "command_line_name";
 const char kCompany[] = "company";
+#if defined(OS_WIN)
+const char kCompiler[] = "compiler";
+#endif
 const char kCopyright[] = "copyright";
 #if defined(OS_CHROMEOS)
 const char kCustomizationId[] = "customization_id";
 #endif
+#if !defined(OS_IOS)
 const char kExecutablePath[] = "executable_path";
 const char kExecutablePathName[] = "executable_path_name";
+#endif
+#if !defined(OS_ANDROID) && !defined(OS_IOS)
 const char kFlashPlugin[] = "flash_plugin";
 const char kFlashVersion[] = "flash_version";
+#endif
+#if !defined(OS_IOS)
 const char kJSEngine[] = "js_engine";
 const char kJSVersion[] = "js_version";
+#endif
 const char kOfficial[] = "official";
+#if !defined(OS_CHROMEOS)
 const char kOSName[] = "os_name";
 const char kOSType[] = "os_type";
+#endif
+#if defined(OS_ANDROID)
 const char kOSVersion[] = "os_version";
+#endif
+#if defined(OS_CHROMEOS)
 const char kPlatform[] = "platform";
+#endif
+#if !defined(OS_IOS)
 const char kProfilePath[] = "profile_path";
 const char kProfilePathName[] = "profile_path_name";
+#endif
 const char kRevision[] = "revision";
 const char kTitle[] = "title";
 const char kUserAgent[] = "useragent";
diff --git a/components/version_ui/version_ui_constants.h b/components/version_ui/version_ui_constants.h
index 7f0d3e85..88a89288 100644
--- a/components/version_ui/version_ui_constants.h
+++ b/components/version_ui/version_ui_constants.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_VERSION_UI_VERSION_UI_CONSTANTS_H_
 #define COMPONENTS_VERSION_UI_VERSION_UI_CONSTANTS_H_
 
+#include "build/build_config.h"
+
 namespace version_ui {
 
 // Resource paths.
@@ -22,29 +24,47 @@
 // Strings.
 // Must match the constants used in the resource files.
 extern const char kApplicationLabel[];
+#if defined(OS_CHROMEOS)
 extern const char kARC[];
-extern const char kBlinkVersion[];
+#endif
 extern const char kCL[];
 extern const char kCommandLine[];
 extern const char kCommandLineName[];
 extern const char kCompany[];
+#if defined(OS_WIN)
+extern const char kCompiler[];
+#endif
 extern const char kCopyright[];
 #if defined(OS_CHROMEOS)
 extern const char kCustomizationId[];
 #endif
+#if !defined(OS_IOS)
 extern const char kExecutablePath[];
 extern const char kExecutablePathName[];
+#endif
+#if !defined(OS_ANDROID) && !defined(OS_IOS)
 extern const char kFlashPlugin[];
 extern const char kFlashVersion[];
+#endif
+#if !defined(OS_IOS)
 extern const char kJSEngine[];
 extern const char kJSVersion[];
+#endif
 extern const char kOfficial[];
+#if !defined(OS_CHROMEOS)
 extern const char kOSName[];
 extern const char kOSType[];
+#endif
+#if defined(OS_ANDROID)
 extern const char kOSVersion[];
+#endif
+#if defined(OS_CHROMEOS)
 extern const char kPlatform[];
+#endif
+#if !defined(OS_IOS)
 extern const char kProfilePath[];
 extern const char kProfilePathName[];
+#endif
 extern const char kRevision[];
 extern const char kTitle[];
 extern const char kUserAgent[];
diff --git a/content/browser/media/media_browsertest.cc b/content/browser/media/media_browsertest.cc
index 6e7ccc8..fcf69e54 100644
--- a/content/browser/media/media_browsertest.cc
+++ b/content/browser/media/media_browsertest.cc
@@ -144,8 +144,7 @@
 
 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
 // Crashes on Mac http://crbug.com/621857
-// Fails on Android http://crbug.com/682387
-#if defined(OS_MACOSX) || defined(OS_ANDROID)
+#if defined(OS_MACOSX)
 #define MAYBE_VideoBearMp4 DISABLED_VideoBearMp4
 #else
 #define MAYBE_VideoBearMp4 VideoBearMp4
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
index 77a2c78..5790a3bc 100644
--- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -66,6 +66,34 @@
         'draw-with-integer-texture-base-level.html',
         ['win', 'nvidia'], bug=679639)
 
+    # Win10 / NVIDIA Quadro M2000 failures
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'basic_types_interleaved_lines.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'basic_types_interleaved_triangles.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'basic_types_separate_lines.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'basic_types_separate_triangles.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'random_interleaved_lines.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'random_interleaved_triangles.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'random_separate_lines.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/' +
+        'random_separate_triangles.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+    self.Fail('deqp/functional/gles3/transformfeedback/interpolation_flat.html',
+        ['win10', ('nvidia', 0x1430)], bug=680754)
+
     # Win / AMD
     self.Fail('conformance2/rendering/blitframebuffer-stencil-only.html',
         ['win', 'amd'], bug=483282) # owner:jmadill
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
index a143953..4fc1674b 100644
--- a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
@@ -143,6 +143,16 @@
     self.Fail('conformance/extensions/ext-sRGB.html',
         ['win', 'nvidia', 'no_passthrough'], bug=679696)
 
+    # Win10 / NVIDIA Quadro M2000 / D3D9 failures
+    self.Fail('conformance/canvas/drawingbuffer-static-canvas-test.html',
+        ['win10', ('nvidia', 0x1430), 'd3d9'], bug=680754)
+    self.Fail('conformance/canvas/' +
+        'framebuffer-bindings-affected-by-to-data-url.html',
+        ['win10', ('nvidia', 0x1430), 'd3d9'], bug=680754)
+    self.Fail('conformance/ogles/GL/cos/cos_001_to_006.html',
+        ['win10', ('nvidia', 0x1430), 'd3d9'], bug=680754)
+
+
     # Win7 / Intel failures
     self.Fail('conformance/textures/misc/' +
               'copy-tex-image-and-sub-image-2d.html',
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 79abf33..50a4d1b9 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -993,9 +993,6 @@
       <message name="IDS_IOS_PLACEHOLDER_FIND_IN_PAGE" desc="The iOS placeholder for searching in the current page [Length: 30em] [iOS only]">
         Find in page...
       </message>
-      <message name="IDS_IOS_PLATFORM_LABEL" desc="Label for Platform. [Length: unlimited] [iOS only]">
-        Platform
-      </message>
       <message name="IDS_IOS_POPUPS_ALLOWED" desc="Label for the list of sites that the user has allowed to show pop-ups. [Length: 20em] [iOS only]">
         Pop-ups Allowed
       </message>
diff --git a/ios/chrome/browser/ui/webui/version_ui.mm b/ios/chrome/browser/ui/webui/version_ui.mm
index 76a51fd..26aa367 100644
--- a/ios/chrome/browser/ui/webui/version_ui.mm
+++ b/ios/chrome/browser/ui/webui/version_ui.mm
@@ -21,7 +21,6 @@
 #include "ios/chrome/browser/ui/webui/version_handler.h"
 #include "ios/chrome/common/channel_info.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
-#include "ios/chrome/grit/ios_strings.h"
 #include "ios/web/public/web_client.h"
 #include "ios/web/public/web_ui_ios_data_source.h"
 #include "ios/web/public/webui/web_ui_ios.h"
@@ -46,10 +45,7 @@
   html_source->AddString(version_ui::kVersionModifier,
                          GetChannelString(GetChannel()));
   html_source->AddLocalizedString(version_ui::kOSName, IDS_VERSION_UI_OS);
-  html_source->AddLocalizedString(version_ui::kPlatform,
-                                  IDS_IOS_PLATFORM_LABEL);
   html_source->AddString(version_ui::kOSType, version_info::GetOSType());
-  html_source->AddString(version_ui::kOSVersion, std::string());
 
   html_source->AddLocalizedString(version_ui::kCompany,
                                   IDS_IOS_ABOUT_VERSION_COMPANY_NAME);
diff --git a/media/test/data/player.html b/media/test/data/player.html
index a1f46392..7577d861 100644
--- a/media/test/data/player.html
+++ b/media/test/data/player.html
@@ -84,7 +84,12 @@
   player.controls = true;
   document.getElementById('player_container').appendChild(player);
 
-  player.addEventListener('loadedmetadata', function(e) {
+  // We use loadeddata instead of loadedmetadata to ensure the decoder has
+  // completed initialization, even though we don't need to decode anything to
+  // get the size metadata. This is an unfortunate workaround for an Android
+  // framework bug (http://crbug.com/682387) where we have to avoid killing
+  // the GPU process while the decoder is initializing.
+  player.addEventListener('loadeddata', function(e) {
     document.title = '' + player.videoWidth + ' ' + player.videoHeight;
   });
 
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-continue-exception-order.html b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-continue-exception-order.htm
similarity index 92%
rename from third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-continue-exception-order.html
rename to third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-continue-exception-order.htm
index 726addaa..8002476f 100644
--- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-continue-exception-order.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-continue-exception-order.htm
@@ -2,9 +2,9 @@
 <title>IndexedDB: IDBCursor continue() Exception Ordering</title>
 <meta charset=utf-8>
 <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-continue">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="resources/testharness-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
 <script>
 
 indexeddb_test(
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-delete-exception-order.html b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-delete-exception-order.htm
similarity index 91%
rename from third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-delete-exception-order.html
rename to third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-delete-exception-order.htm
index b2d0d5bd..cc2791c 100644
--- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-delete-exception-order.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-delete-exception-order.htm
@@ -2,9 +2,9 @@
 <title>IndexedDB: IDBCursor delete() Exception Ordering</title>
 <meta charset=utf-8>
 <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-delete">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="resources/testharness-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
 <script>
 
 indexeddb_test(
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-update-exception-order.html b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-update-exception-order.htm
similarity index 93%
rename from third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-update-exception-order.html
rename to third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-update-exception-order.htm
index cceee010..4e18731f 100644
--- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-update-exception-order.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbcursor-update-exception-order.htm
@@ -2,9 +2,9 @@
 <title>IndexedDB: IDBCursor update() Exception Ordering</title>
 <meta charset=utf-8>
 <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-update">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="resources/testharness-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
 <script>
 
 indexeddb_test(
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-createObjectStore-exception-order.html b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbdatabase-createObjectStore-exception-order.htm
similarity index 77%
rename from third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-createObjectStore-exception-order.html
rename to third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbdatabase-createObjectStore-exception-order.htm
index 490019d..50b3adb3 100644
--- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-createObjectStore-exception-order.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbdatabase-createObjectStore-exception-order.htm
@@ -2,16 +2,16 @@
 <title>IndexedDB: IDBDatabase createObjectStore() Exception Ordering</title>
 <meta charset=utf-8>
 <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-createobjectstore">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="resources/testharness-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
 <script>
 
 indexeddb_test(
-  (t, db, req) => {
+  (t, db, txn) => {
     db.createObjectStore('s');
 
-    req.transaction.onabort = () => {
+    txn.onabort = () => {
       setTimeout(t.step_func(() => {
         assert_throws(
           'InvalidStateError', () => { db.createObjectStore('s2'); },
@@ -21,20 +21,19 @@
         t.done();
       }), 0);
     };
-    req.onerror = null;
-    req.transaction.abort();
+    txn.abort();
   },
   (t, db) => { t.assert_unreached('open should fail'); },
   'IDBDatabase.createObjectStore exception order: ' +
-  'InvalidStateError vs. TransactionInactiveError'
+  'InvalidStateError vs. TransactionInactiveError',
+  { upgrade_will_abort: true }
 );
 
 indexeddb_test(
-  (t, db, req) => {
+  (t, db, txn) => {
     const store = db.createObjectStore('s');
 
-    req.onerror = null;
-    req.transaction.abort();
+    txn.abort();
 
     assert_throws(
       'TransactionInactiveError',
@@ -46,7 +45,8 @@
   },
   (t, db) => { t.assert_unreached('open should fail'); },
   'IDBDatabase.createObjectStore exception order: ' +
-  'TransactionInactiveError vs. SyntaxError'
+  'TransactionInactiveError vs. SyntaxError',
+  { upgrade_will_abort: true }
 );
 
 indexeddb_test(
@@ -67,8 +67,7 @@
   (t, db) => {
     db.createObjectStore('s');
     assert_throws('ConstraintError', () => {
-      db.createObjectStore('s', {autoIncrement: true,
-                                 keyPath: ''});
+      db.createObjectStore('s', {autoIncrement: true, keyPath: ''});
     }, '"already exists" check (ConstraintError) should precede ' +
        '"autoIncrement vs. keyPath" check (InvalidAccessError)');
     t.done();
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-deleteObjectStore-exception-order.html b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm
similarity index 69%
rename from third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-deleteObjectStore-exception-order.html
rename to third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm
index b411393..23a3e1f 100644
--- a/third_party/WebKit/LayoutTests/storage/indexeddb/idbdatabase-deleteObjectStore-exception-order.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm
@@ -2,15 +2,15 @@
 <title>IndexedDB: IDBDatabase deleteObjectStore() Exception Ordering</title>
 <meta charset=utf-8>
 <link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-deleteobjectstore">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="resources/testharness-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
 <script>
 
 indexeddb_test(
-  (t, db, req) => {
+  (t, db, txn) => {
     db.createObjectStore('s');
-    req.transaction.onabort = () => {
+    txn.onabort = () => {
       setTimeout(t.step_func(() => {
         assert_throws(
           'InvalidStateError', () => { db.deleteObjectStore('s'); },
@@ -19,18 +19,17 @@
         t.done();
       }), 0);
     };
-    req.onerror = null;
-    req.transaction.abort();
+    txn.abort();
   },
   (t, db) => { t.assert_unreached('open should fail'); },
   'IDBDatabase.deleteObjectStore exception order: ' +
-  'InvalidStateError vs. TransactionInactiveError'
+  'InvalidStateError vs. TransactionInactiveError',
+  { upgrade_will_abort: true }
 );
 
 indexeddb_test(
-  (t, db, req) => {
-    req.onerror = null;
-    req.transaction.abort();
+  (t, db, txn) => {
+    txn.abort();
     assert_throws(
       'TransactionInactiveError', () => { db.deleteObjectStore('nope'); },
       '"not active" check (TransactionInactiveError) should precede ' +
@@ -39,7 +38,8 @@
   },
   (t, db) => { t.assert_unreached('open should fail'); },
   'IDBDatabase.deleteObjectStore exception order: ' +
-  'TransactionInactiveError vs. NotFoundError'
+  'TransactionInactiveError vs. NotFoundError',
+  { upgrade_will_abort: true }
 );
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support.js b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support.js
index 81498739..4bfaf72c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/support.js
@@ -62,12 +62,14 @@
                     assert_unreached("unexpected open." + evt + " event");
                 }
 
-                if (e.target.result + "" == "[object IDBDatabase]" && !this.db) {
-                    this.db = e.target.result;
+                if (e.target.result + '' == '[object IDBDatabase]' &&
+                    !this.db) {
+                  this.db = e.target.result;
 
-                    this.db.onerror = fail(test, "unexpected db.error");
-                    this.db.onabort = fail(test, "unexpected db.abort");
-                    this.db.onversionchange = fail(test, "unexpected db.versionchange");
+                  this.db.onerror = fail(test, 'unexpected db.error');
+                  this.db.onabort = fail(test, 'unexpected db.abort');
+                  this.db.onversionchange =
+                      fail(test, 'unexpected db.versionchange');
                 }
             })
         })
@@ -102,22 +104,27 @@
     assert_equals(indexedDB.cmp(actual, expected), 0, description);
 }
 
-function indexeddb_test(upgrade_func, open_func, description) {
-    async_test(function(t) {
-        var dbname = document.location + '-' + t.name;
-        var del = indexedDB.deleteDatabase(dbname);
-        del.onerror = t.unreached_func('deleteDatabase should succeed');
-        var open = indexedDB.open(dbname, 1);
-        open.onerror = t.unreached_func('open should succeed');
-        open.onupgradeneeded = t.step_func(function() {
-            var db = open.result;
-            var tx = open.transaction;
-            upgrade_func(t, db, tx);
-        });
-        open.onsuccess = t.step_func(function() {
-            var db = open.result;
-            if (open_func)
-                open_func(t, db);
-        });
-    }, description);
+function indexeddb_test(upgrade_func, open_func, description, options) {
+  async_test(function(t) {
+    var options = Object.assign({upgrade_will_abort: false}, options);
+    var dbname = document.location + '-' + t.name;
+    var del = indexedDB.deleteDatabase(dbname);
+    del.onerror = t.unreached_func('deleteDatabase should succeed');
+    var open = indexedDB.open(dbname, 1);
+    if (!options.upgrade_will_abort) {
+      open.onsuccess = t.unreached_func('open should not succeed');
+    } else {
+      open.onerror = t.unreached_func('open should succeed');
+    }
+    open.onupgradeneeded = t.step_func(function() {
+      var db = open.result;
+      var tx = open.transaction;
+      upgrade_func(t, db, tx);
+    });
+    open.onsuccess = t.step_func(function() {
+      var db = open.result;
+      if (open_func)
+        open_func(t, db);
+    });
+  }, description);
 }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json b/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json
index a43ba389..4f8c3b8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json
@@ -15989,11 +15989,6 @@
      {}
     ]
    ],
-   "streams/piping/close-propagation-backward-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/piping/close-propagation-backward.js": [
     [
      {}
@@ -16004,16 +15999,6 @@
      {}
     ]
    ],
-   "streams/piping/close-propagation-backward.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "streams/piping/close-propagation-forward-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/piping/close-propagation-forward.js": [
     [
      {}
@@ -16024,16 +16009,6 @@
      {}
     ]
    ],
-   "streams/piping/close-propagation-forward.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "streams/piping/error-propagation-backward-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/piping/error-propagation-backward.js": [
     [
      {}
@@ -16044,16 +16019,6 @@
      {}
     ]
    ],
-   "streams/piping/error-propagation-backward.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "streams/piping/error-propagation-forward-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/piping/error-propagation-forward.js": [
     [
      {}
@@ -16064,16 +16029,6 @@
      {}
     ]
    ],
-   "streams/piping/error-propagation-forward.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "streams/piping/flow-control-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/piping/flow-control.js": [
     [
      {}
@@ -16084,16 +16039,6 @@
      {}
     ]
    ],
-   "streams/piping/flow-control.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "streams/piping/general-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/piping/general.js": [
     [
      {}
@@ -16104,11 +16049,6 @@
      {}
     ]
    ],
-   "streams/piping/general.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/piping/multiple-propagation-expected.txt": [
     [
      {}
@@ -16144,6 +16084,11 @@
      {}
     ]
    ],
+   "streams/piping/pipe-through.dedicatedworker-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "streams/piping/pipe-through.js": [
     [
      {}
@@ -16159,6 +16104,11 @@
      {}
     ]
    ],
+   "streams/piping/pipe-through.sharedworker-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "streams/piping/transform-streams-expected.txt": [
     [
      {}
@@ -16314,11 +16264,6 @@
      {}
     ]
    ],
-   "streams/readable-streams/pipe-through.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/readable-streams/readable-stream-reader.js": [
     [
      {}
@@ -16349,11 +16294,6 @@
      {}
     ]
    ],
-   "streams/readable-streams/templated.serviceworker.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "streams/resources/recording-streams.js": [
     [
      {}
@@ -17912,6 +17852,12 @@
      {}
     ]
    ],
+   "IndexedDB/idbcursor-continue-exception-order.htm": [
+    [
+     "/IndexedDB/idbcursor-continue-exception-order.htm",
+     {}
+    ]
+   ],
    "IndexedDB/idbcursor-continue.htm": [
     [
      "/IndexedDB/idbcursor-continue.htm",
@@ -17932,6 +17878,12 @@
      {}
     ]
    ],
+   "IndexedDB/idbcursor-delete-exception-order.htm": [
+    [
+     "/IndexedDB/idbcursor-delete-exception-order.htm",
+     {}
+    ]
+   ],
    "IndexedDB/idbcursor-direction-index-keyrange.htm": [
     [
      "/IndexedDB/idbcursor-direction-index-keyrange.htm",
@@ -17986,6 +17938,12 @@
      {}
     ]
    ],
+   "IndexedDB/idbcursor-update-exception-order.htm": [
+    [
+     "/IndexedDB/idbcursor-update-exception-order.htm",
+     {}
+    ]
+   ],
    "IndexedDB/idbcursor_advance_index.htm": [
     [
      "/IndexedDB/idbcursor_advance_index.htm",
@@ -18346,6 +18304,18 @@
      {}
     ]
    ],
+   "IndexedDB/idbdatabase-createObjectStore-exception-order.htm": [
+    [
+     "/IndexedDB/idbdatabase-createObjectStore-exception-order.htm",
+     {}
+    ]
+   ],
+   "IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm": [
+    [
+     "/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm",
+     {}
+    ]
+   ],
    "IndexedDB/idbdatabase_close.htm": [
     [
      "/IndexedDB/idbdatabase_close.htm",
@@ -34602,12 +34572,6 @@
    ]
   },
   "visual": {
-   "html/dom/elements/global-attributes/dir_auto-EN-L-expected.html": [
-    [
-     "/html/dom/elements/global-attributes/dir_auto-EN-L-expected.html",
-     {}
-    ]
-   ],
    "html/dom/elements/global-attributes/dir_auto-EN-R-expected.html": [
     [
      "/html/dom/elements/global-attributes/dir_auto-EN-R-expected.html",
@@ -35279,6 +35243,10 @@
    "7becf54b03320a3b905c4ebfa476476f22409307",
    "testharness"
   ],
+  "IndexedDB/idbcursor-continue-exception-order.htm": [
+   "5c6bd64850880ceb20639325cf3d61127e2b13c8",
+   "testharness"
+  ],
   "IndexedDB/idbcursor-continue.htm": [
    "953ae4b03fcfe2be3652df09577df2e3829dd53a",
    "testharness"
@@ -35291,6 +35259,10 @@
    "7c2ddb95ce4b7c588ddb2907367a365902eba349",
    "testharness"
   ],
+  "IndexedDB/idbcursor-delete-exception-order.htm": [
+   "6bb279530dbdedba84a2d45d58e5d0a81a4d95e5",
+   "testharness"
+  ],
   "IndexedDB/idbcursor-direction-index-keyrange.htm": [
    "d87cc37174c74e57880f8883e75a9c033c021e74",
    "testharness"
@@ -35327,6 +35299,10 @@
    "0677de106509b9b3f4d1e38780f479d9aaace626",
    "testharness"
   ],
+  "IndexedDB/idbcursor-update-exception-order.htm": [
+   "748c1764883cc62e58c1ce7929e91e6ee2941fda",
+   "testharness"
+  ],
   "IndexedDB/idbcursor_advance_index.htm": [
    "b6cb5fd53000be9c8d198b08d259a1062a8f9946",
    "testharness"
@@ -35567,6 +35543,14 @@
    "7534a0868a5861cfd9f2fef0f3eddf452c0d9366",
    "testharness"
   ],
+  "IndexedDB/idbdatabase-createObjectStore-exception-order.htm": [
+   "24d86e0a278a52c759f1a220041838bedd59959e",
+   "testharness"
+  ],
+  "IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm": [
+   "0e0ae655c2767b3755490104a28ae26e0d4cd500",
+   "testharness"
+  ],
   "IndexedDB/idbdatabase_close.htm": [
    "6b0a32c465f735544b89da588bb043bbfbb66230",
    "testharness"
@@ -36328,7 +36312,7 @@
    "support"
   ],
   "IndexedDB/support.js": [
-   "3f2f3bd905485efe94cf7c406bef4fa20a13ab83",
+   "0dfe81d16dd3f741deb013fda40faa6df9757334",
    "support"
   ],
   "IndexedDB/transaction-abort-generator-revert.html": [
@@ -42411,10 +42395,6 @@
    "3a0bacb8b3d8e66038d12472387dc51304a6052d",
    "testharness"
   ],
-  "html/dom/elements/global-attributes/dir_auto-EN-L-expected.html": [
-   "bbec57aca4e319e3a4638a2a008c510439582cf1",
-   "visual"
-  ],
   "html/dom/elements/global-attributes/dir_auto-EN-L-ref.html": [
    "bbec57aca4e319e3a4638a2a008c510439582cf1",
    "support"
@@ -49968,7 +49948,7 @@
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/external-script-windows1250.js": [
-   "43e3b65a18328fa95ba89cb4f075d1ab422580fa",
+   "3ae0d51ae4444e95a21cbe8d9d10822615903859",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/fetch-src/alpha/base.html": [
@@ -55035,10 +55015,6 @@
    "729d86f589af914bf59f046f40e3d98b5f37efc7",
    "support"
   ],
-  "streams/piping/close-propagation-backward-expected.txt": [
-   "2c78c276cdbf8f7b60303f7cae9323203f08336a",
-   "support"
-  ],
   "streams/piping/close-propagation-backward.dedicatedworker.html": [
    "17e143af0bd875f6097c2314ea9861e4b19ff91a",
    "testharness"
@@ -55055,10 +55031,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/piping/close-propagation-backward.serviceworker.https-expected.txt": [
-   "ba6e2b8a2a88f9178fa6e1c1dcffcebc54803040",
-   "support"
-  ],
   "streams/piping/close-propagation-backward.serviceworker.https.html": [
    "29ce859faa5a374d86c4f10e2c638061ce378a01",
    "testharness"
@@ -55067,10 +55039,6 @@
    "7ef2ba0b429b2032e099f62cf2bc17d606ad1c64",
    "testharness"
   ],
-  "streams/piping/close-propagation-forward-expected.txt": [
-   "4ab6fa412936f3290fec500ed4766d2331e86150",
-   "support"
-  ],
   "streams/piping/close-propagation-forward.dedicatedworker.html": [
    "d227631adae0611f7920d33343d148f19c13f833",
    "testharness"
@@ -55087,10 +55055,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/piping/close-propagation-forward.serviceworker.https-expected.txt": [
-   "e19b7cadf3133b589aea0f812c8a1b9f239fdcd3",
-   "support"
-  ],
   "streams/piping/close-propagation-forward.serviceworker.https.html": [
    "759ca4e212311a001d0abae2b2f21d1dca42736b",
    "testharness"
@@ -55099,10 +55063,6 @@
    "277a94372fc8359b631b46ea79778ce2ec0e928c",
    "testharness"
   ],
-  "streams/piping/error-propagation-backward-expected.txt": [
-   "bbe079c575b2d825134e679e61566da325745fee",
-   "support"
-  ],
   "streams/piping/error-propagation-backward.dedicatedworker.html": [
    "2f7ad2bf616e612f8cae9c61264d1ea012be2561",
    "testharness"
@@ -55119,10 +55079,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/piping/error-propagation-backward.serviceworker.https-expected.txt": [
-   "945748a9d526697937ab913a7c9b612449aa9604",
-   "support"
-  ],
   "streams/piping/error-propagation-backward.serviceworker.https.html": [
    "3502f6514992dab5662a5088c518d3a775863770",
    "testharness"
@@ -55131,10 +55087,6 @@
    "464dbfc87804e207057de70b2dcbb0aacf03b92e",
    "testharness"
   ],
-  "streams/piping/error-propagation-forward-expected.txt": [
-   "5244bd0323cc4426671f43de90f3f4e8ca0cf0db",
-   "support"
-  ],
   "streams/piping/error-propagation-forward.dedicatedworker.html": [
    "a2520ea68491b9e0987a63c9d5653a19ffff440d",
    "testharness"
@@ -55151,10 +55103,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/piping/error-propagation-forward.serviceworker.https-expected.txt": [
-   "14492b1c0b191299083792c701971693f981e0a5",
-   "support"
-  ],
   "streams/piping/error-propagation-forward.serviceworker.https.html": [
    "44db4461afd113439e349a05a08410ff58655850",
    "testharness"
@@ -55163,10 +55111,6 @@
    "c19cba806d0c806452464b7ede268458c65556a9",
    "testharness"
   ],
-  "streams/piping/flow-control-expected.txt": [
-   "f87be7d24d09906c86bc5e7ae4847b5b8fc8122c",
-   "support"
-  ],
   "streams/piping/flow-control.dedicatedworker.html": [
    "3936fceee569de910a7e3e4d5e3af9e7c4d1e942",
    "testharness"
@@ -55183,10 +55127,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/piping/flow-control.serviceworker.https-expected.txt": [
-   "5aabb47c1d495403fa0bac70b75ee617ba8b3214",
-   "support"
-  ],
   "streams/piping/flow-control.serviceworker.https.html": [
    "c6962c1f0358867289e1e9b36dac492059f4f9fe",
    "testharness"
@@ -55195,10 +55135,6 @@
    "74e67f2ad62720eb3314a1cdec5b4c28ca3ea5f6",
    "testharness"
   ],
-  "streams/piping/general-expected.txt": [
-   "9b373b5ed079db8c554da1df08fe91dbdb9e6a4d",
-   "support"
-  ],
   "streams/piping/general.dedicatedworker.html": [
    "8583d80450b090c16ed0795170340d040449bbc1",
    "testharness"
@@ -55215,10 +55151,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/piping/general.serviceworker.https-expected.txt": [
-   "97eafbd7ab102636b641e34862c62d587a221ea4",
-   "support"
-  ],
   "streams/piping/general.serviceworker.https.html": [
    "1792d6c45a5687777291a4dab031a954aa053752",
    "testharness"
@@ -55252,7 +55184,7 @@
    "support"
   ],
   "streams/piping/multiple-propagation.serviceworker.https-expected.txt": [
-   "46ba0a5a3b8864c2be80fe138bfeda70bc60d726",
+   "943a89576b2c9fe677d61dd3b5b65cde228fa23a",
    "support"
   ],
   "streams/piping/multiple-propagation.serviceworker.https.html": [
@@ -55268,7 +55200,11 @@
    "testharness"
   ],
   "streams/piping/pipe-through-expected.txt": [
-   "7a6f52b7ff44ea026c05f844f0c737e7f91704b0",
+   "99727d10dfd517ff4345ffd7f781f2cef6363980",
+   "support"
+  ],
+  "streams/piping/pipe-through.dedicatedworker-expected.txt": [
+   "99727d10dfd517ff4345ffd7f781f2cef6363980",
    "support"
   ],
   "streams/piping/pipe-through.dedicatedworker.html": [
@@ -55288,13 +55224,17 @@
    "support"
   ],
   "streams/piping/pipe-through.serviceworker.https-expected.txt": [
-   "cff39f6bf90e28753dd1cfa283918f87550450db",
+   "6c5faa30d98d1f34cb6badf7f8e59a2cf2fb9449",
    "support"
   ],
   "streams/piping/pipe-through.serviceworker.https.html": [
    "e6604dc4e7f4404ee9dea5ab237fb4636bf9e85a",
    "testharness"
   ],
+  "streams/piping/pipe-through.sharedworker-expected.txt": [
+   "85af76050db0eb713c881b422d70e7d9965c2eef",
+   "support"
+  ],
   "streams/piping/pipe-through.sharedworker.html": [
    "8ecb019e754fd4239cb35c27787897efc2dacccb",
    "testharness"
@@ -55544,7 +55484,7 @@
    "support"
   ],
   "streams/readable-streams/general.serviceworker.https-expected.txt": [
-   "5bf1010b9d29e4ccbe6183ac88f3fa3ab57ad908",
+   "c78457a9f96493462b1849e9dd00f66e52023f54",
    "support"
   ],
   "streams/readable-streams/general.serviceworker.https.html": [
@@ -55575,10 +55515,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/readable-streams/pipe-through.serviceworker.https-expected.txt": [
-   "3d8cf26fa4dc94303e587c86459b1f9942aa4dfb",
-   "support"
-  ],
   "streams/readable-streams/pipe-through.serviceworker.https.html": [
    "e6604dc4e7f4404ee9dea5ab237fb4636bf9e85a",
    "testharness"
@@ -55651,10 +55587,6 @@
    "04408971a1d82a7d3c990774456381313f1584bb",
    "support"
   ],
-  "streams/readable-streams/templated.serviceworker.https-expected.txt": [
-   "22c4a140e5f962f55d8d78441ed3157df488e008",
-   "support"
-  ],
   "streams/readable-streams/templated.serviceworker.https.html": [
    "82dcb18ef90fb8a957cd2a991cafc598e918e35b",
    "testharness"
@@ -57356,7 +57288,7 @@
    "testharness"
   ],
   "webrtc/rtcpeerconnection/rtcpeerconnection-idl-expected.txt": [
-   "c43f434595ce174a5e0eb86c638ed64e508ff874",
+   "683342cf65c9907063e1124f98c7c913d3089d83",
    "support"
   ],
   "webrtc/rtcpeerconnection/rtcpeerconnection-idl.html": [
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
index e6a6769..16c5e50 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -247,10 +247,11 @@
   if (!isScriptForEventSupported())
     return false;
 
+  String encoding;
   if (!client->charsetAttributeValue().isEmpty())
-    m_characterEncoding = client->charsetAttributeValue();
+    encoding = client->charsetAttributeValue();
   else
-    m_characterEncoding = elementDocument.characterSet();
+    encoding = elementDocument.characterSet();
 
   if (client->hasSourceAttribute()) {
     FetchRequest::DeferOption defer = FetchRequest::NoDefer;
@@ -260,7 +261,7 @@
     if (m_documentWriteIntervention ==
         DocumentWriteIntervention::FetchDocWrittenScriptDeferIdle)
       defer = FetchRequest::IdleLoad;
-    if (!fetchScript(client->sourceAttributeValue(), defer))
+    if (!fetchScript(client->sourceAttributeValue(), encoding, defer))
       return false;
   }
 
@@ -327,6 +328,7 @@
 }
 
 bool ScriptLoader::fetchScript(const String& sourceUrl,
+                               const String& encoding,
                                FetchRequest::DeferOption defer) {
   DCHECK(m_element);
 
@@ -345,7 +347,7 @@
     if (crossOrigin != CrossOriginAttributeNotSet)
       request.setCrossOriginAccessControl(elementDocument->getSecurityOrigin(),
                                           crossOrigin);
-    request.setCharset(scriptCharset());
+    request.setCharset(encoding);
 
     if (ContentSecurityPolicy::isNonceableElement(m_element.get()))
       request.setContentSecurityPolicyNonce(client()->nonce());
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.h b/third_party/WebKit/Source/core/dom/ScriptLoader.h
index d44a5ec..3935fe1 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.h
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.h
@@ -68,7 +68,6 @@
       const TextPosition& scriptStartPosition = TextPosition::minimumPosition(),
       LegacyTypeSupport = DisallowLegacyTypeInTypeAttribute);
 
-  String scriptCharset() const { return m_characterEncoding; }
   String scriptContent() const;
   // Returns false if and only if execution was blocked.
   bool executeScript(const ScriptSourceCode&);
@@ -129,7 +128,9 @@
   bool isScriptForEventSupported() const;
   void logScriptMIMEType(LocalFrame*, ScriptResource*, const String&);
 
-  bool fetchScript(const String& sourceUrl, FetchRequest::DeferOption);
+  bool fetchScript(const String& sourceUrl,
+                   const String& encoding,
+                   FetchRequest::DeferOption);
   bool doExecuteScript(const ScriptSourceCode&);
 
   ScriptLoaderClient* client() const;
@@ -140,8 +141,6 @@
   Member<Element> m_element;
   Member<ScriptResource> m_resource;
   WTF::OrdinalNumber m_startLineNumber;
-  String m_characterEncoding;
-  String m_fallbackCharacterEncoding;
 
   bool m_parserInserted : 1;
   bool m_isExternalScript : 1;
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
index 0a809a7..4db22d78 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
@@ -388,8 +388,8 @@
     def fetch_new_expectations_and_baselines(self):
         """Adds new expectations and downloads baselines based on try job results, then commits and uploads the change."""
         _log.info('Adding test expectations lines to LayoutTests/TestExpectations.')
-        line_adder = WPTExpectationsUpdater(self.host)
-        line_adder.run()
+        expectation_updater = WPTExpectationsUpdater(self.host)
+        expectation_updater.run(args=[])
         message = 'Update test expectations and baselines.'
         self.check_run(['git', 'commit', '-a', '-m', message])
         self.git_cl.run(['upload', '-m', message, '--rietveld'])
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h
index 2242fa8..4645165f 100644
--- a/ui/native_theme/native_theme.h
+++ b/ui/native_theme/native_theme.h
@@ -9,6 +9,7 @@
 #include "base/observer_list.h"
 #include "build/build_config.h"
 #include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/models/menu_separator_types.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/native_theme/native_theme_export.h"
 
@@ -56,8 +57,8 @@
     kMenuCheckBackground,
     kMenuPopupArrow,
     kMenuPopupGutter,
-    kMenuPopupSeparator,
 #endif
+    kMenuPopupSeparator,
     kMenuItemBackground,
     kProgressBar,
     kPushButton,
@@ -145,6 +146,11 @@
     bool is_selected;
   };
 
+  struct MenuSeparatorExtraParams {
+    const gfx::Rect* paint_rect;
+    MenuSeparatorType type;
+  };
+
   struct MenuItemExtraParams {
     bool is_selected;
     int corner_radius;
@@ -228,6 +234,7 @@
     MenuArrowExtraParams menu_arrow;
     MenuCheckExtraParams menu_check;
     MenuItemExtraParams menu_item;
+    MenuSeparatorExtraParams menu_separator;
     MenuListExtraParams menu_list;
     MenuBackgroundExtraParams menu_background;
     ProgressBarExtraParams progress_bar;
diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc
index ec5b30a..b9718490 100644
--- a/ui/native_theme/native_theme_base.cc
+++ b/ui/native_theme/native_theme_base.cc
@@ -186,6 +186,9 @@
     case kMenuPopupBackground:
       PaintMenuPopupBackground(canvas, rect.size(), extra.menu_background);
       break;
+    case kMenuPopupSeparator:
+      PaintMenuSeparator(canvas, state, rect, extra.menu_separator);
+      break;
     case kMenuItemBackground:
       PaintMenuItemBackground(canvas, state, rect, extra.menu_item);
       break;
@@ -776,6 +779,16 @@
   // By default don't draw anything over the normal background.
 }
 
+void NativeThemeBase::PaintMenuSeparator(
+    SkCanvas* canvas,
+    State state,
+    const gfx::Rect& rect,
+    const MenuSeparatorExtraParams& menu_separator) const {
+  SkPaint paint;
+  paint.setColor(GetSystemColor(ui::NativeTheme::kColorId_MenuSeparatorColor));
+  canvas->drawRect(gfx::RectToSkRect(*menu_separator.paint_rect), paint);
+}
+
 void NativeThemeBase::PaintSliderTrack(SkCanvas* canvas,
                                        State state,
                                        const gfx::Rect& rect,
diff --git a/ui/native_theme/native_theme_base.h b/ui/native_theme/native_theme_base.h
index fa06cfbc..ca838d49 100644
--- a/ui/native_theme/native_theme_base.h
+++ b/ui/native_theme/native_theme_base.h
@@ -104,6 +104,12 @@
       const gfx::Rect& rect,
       const MenuItemExtraParams& menu_item) const;
 
+  virtual void PaintMenuSeparator(
+      SkCanvas* canvas,
+      State state,
+      const gfx::Rect& rect,
+      const MenuSeparatorExtraParams& menu_separator) const;
+
   virtual void PaintSliderTrack(
       SkCanvas* canvas,
       State state,
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc
index 24eaae3..eea06d3a 100644
--- a/ui/native_theme/native_theme_win.cc
+++ b/ui/native_theme/native_theme_win.cc
@@ -264,7 +264,7 @@
       PaintMenuGutter(canvas, rect);
       return;
     case kMenuPopupSeparator:
-      PaintMenuSeparator(canvas, rect);
+      PaintMenuSeparator(canvas, *extra.menu_separator.paint_rect);
       return;
     case kMenuPopupBackground:
       PaintMenuBackground(canvas, rect);
@@ -429,7 +429,7 @@
       PaintMenuGutter(hdc, rect);
       return;
     case kMenuPopupSeparator:
-      PaintMenuSeparator(hdc, rect);
+      PaintMenuSeparator(hdc, *extra.menu_separator.paint_rect);
       return;
     case kMenuItemBackground:
       PaintMenuItemBackground(hdc, state, rect, extra.menu_item);
@@ -866,9 +866,8 @@
   return S_OK;
 }
 
-HRESULT NativeThemeWin::PaintMenuSeparator(
-    HDC hdc,
-    const gfx::Rect& rect) const {
+HRESULT NativeThemeWin::PaintMenuSeparator(HDC hdc,
+                                           const gfx::Rect& rect) const {
   RECT rect_win = rect.ToRECT();
 
   HANDLE handle = GetThemeHandle(MENU);
diff --git a/ui/native_theme/native_theme_win.h b/ui/native_theme/native_theme_win.h
index 52b2aebb..ab96c02b 100644
--- a/ui/native_theme/native_theme_win.h
+++ b/ui/native_theme/native_theme_win.h
@@ -164,8 +164,7 @@
                       int state_id,
                       RECT* rect) const;
 
-  HRESULT PaintMenuSeparator(HDC hdc,
-                             const gfx::Rect& rect) const;
+  HRESULT PaintMenuSeparator(HDC hdc, const gfx::Rect& rect) const;
 
   HRESULT PaintMenuGutter(HDC hdc, const gfx::Rect& rect) const;
 
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index bef106e..214a0be 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -226,9 +226,8 @@
     "controls/menu/menu_runner_impl_interface.h",
     "controls/menu/menu_scroll_view_container.cc",
     "controls/menu/menu_scroll_view_container.h",
+    "controls/menu/menu_separator.cc",
     "controls/menu/menu_separator.h",
-    "controls/menu/menu_separator_views.cc",
-    "controls/menu/menu_separator_win.cc",
     "controls/menu/menu_types.h",
     "controls/menu/native_menu_win.cc",
     "controls/menu/native_menu_win.h",
diff --git a/ui/views/controls/menu/menu_separator_views.cc b/ui/views/controls/menu/menu_separator.cc
similarity index 64%
rename from ui/views/controls/menu/menu_separator_views.cc
rename to ui/views/controls/menu/menu_separator.cc
index 86f794a..d3d532e 100644
--- a/ui/views/controls/menu/menu_separator_views.cc
+++ b/ui/views/controls/menu/menu_separator.cc
@@ -10,20 +10,57 @@
 #include "ui/native_theme/native_theme.h"
 #include "ui/views/controls/menu/menu_config.h"
 
+#if defined(OS_WIN)
+#include "ui/display/win/dpi.h"
+#endif
+
 namespace views {
 
-#if !defined(OS_WIN)
 void MenuSeparator::OnPaint(gfx::Canvas* canvas) {
-  canvas->FillRect(GetPaintBounds(),
-                   GetNativeTheme()->GetSystemColor(
-                       ui::NativeTheme::kColorId_MenuSeparatorColor));
-}
+  if (type_ == ui::SPACING_SEPARATOR)
+    return;
+
+  const MenuConfig& menu_config = MenuConfig::instance();
+  int pos = 0;
+  int separator_thickness = menu_config.separator_thickness;
+  switch (type_) {
+    case ui::LOWER_SEPARATOR:
+      pos = height() - separator_thickness;
+      break;
+    case ui::UPPER_SEPARATOR:
+      break;
+    default:
+      pos = height() / 2;
+      break;
+  }
+
+  gfx::Rect paint_rect(0, pos, width(), separator_thickness);
+  if (menu_config.use_outer_border)
+    paint_rect.Inset(1, 0);
+
+#if defined(OS_WIN)
+  // Hack to get the separator to display correctly on Windows where we may
+  // have fractional scales. We move the separator 1 pixel down to ensure that
+  // it falls within the clipping rect which is scaled up.
+  float device_scale = display::win::GetDPIScale();
+  bool is_fractional_scale =
+      (device_scale - static_cast<int>(device_scale) != 0);
+  if (is_fractional_scale && paint_rect.y() == 0)
+    paint_rect.set_y(1);
 #endif
 
+  ui::NativeTheme::ExtraParams params;
+  params.menu_separator.paint_rect = &paint_rect;
+  params.menu_separator.type = type_;
+  GetNativeTheme()->Paint(
+      canvas->sk_canvas(), ui::NativeTheme::kMenuPopupSeparator,
+      ui::NativeTheme::kNormal, gfx::Rect(bounds().size()), params);
+}
+
 gfx::Size MenuSeparator::GetPreferredSize() const {
   const MenuConfig& menu_config = MenuConfig::instance();
   int height = menu_config.separator_height;
-  switch(type_) {
+  switch (type_) {
     case ui::SPACING_SEPARATOR:
       height = menu_config.separator_spacing_height;
       break;
@@ -41,27 +78,4 @@
                    height);
 }
 
-gfx::Rect MenuSeparator::GetPaintBounds() {
-  int pos = 0;
-  const MenuConfig& menu_config = MenuConfig::instance();
-  int separator_thickness = menu_config.separator_thickness;
-  switch (type_) {
-    case ui::LOWER_SEPARATOR:
-      pos = height() - separator_thickness;
-      break;
-    case ui::SPACING_SEPARATOR:
-      return gfx::Rect();
-    case ui::UPPER_SEPARATOR:
-      break;
-    default:
-      pos = height() / 2;
-      break;
-  }
-
-  gfx::Rect paint_rect(0, pos, width(), separator_thickness);
-  if (menu_config.use_outer_border)
-    paint_rect.Inset(1, 0);
-  return paint_rect;
-}
-
 }  // namespace views
diff --git a/ui/views/controls/menu/menu_separator.h b/ui/views/controls/menu/menu_separator.h
index 7e013ff..2eeee1c 100644
--- a/ui/views/controls/menu/menu_separator.h
+++ b/ui/views/controls/menu/menu_separator.h
@@ -21,9 +21,6 @@
   gfx::Size GetPreferredSize() const override;
 
  private:
-  // Gets the bounds where the separator should be painted.
-  gfx::Rect GetPaintBounds();
-
   // The type of the separator.
   const ui::MenuSeparatorType type_;
 
diff --git a/ui/views/controls/menu/menu_separator_win.cc b/ui/views/controls/menu/menu_separator_win.cc
deleted file mode 100644
index 4fbe20aa..0000000
--- a/ui/views/controls/menu/menu_separator_win.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/controls/menu/menu_separator.h"
-
-#include <windows.h>
-#include <uxtheme.h>
-#include <Vssym32.h>
-
-#include "ui/display/win/dpi.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/native_theme/native_theme.h"
-#include "ui/native_theme/native_theme_aura.h"
-#include "ui/views/controls/menu/menu_item_view.h"
-
-namespace views {
-
-void MenuSeparator::OnPaint(gfx::Canvas* canvas) {
-  ui::NativeTheme* native_theme = GetNativeTheme();
-  gfx::Rect separator_bounds = GetPaintBounds();
-
-  // Hack to get the separator to display correctly on Windows where we may
-  // have fractional scales. We move the separator 1 pixel down to ensure that
-  // it falls within the clipping rect which is scaled up.
-  float device_scale = display::win::GetDPIScale();
-  bool is_fractional_scale =
-      (device_scale - static_cast<int>(device_scale) != 0);
-  if (is_fractional_scale && separator_bounds.y() == 0)
-    separator_bounds.set_y(1);
-
-  ui::NativeTheme::ExtraParams extra;
-  native_theme->Paint(
-      canvas->sk_canvas(), ui::NativeTheme::kMenuPopupSeparator,
-      ui::NativeTheme::kNormal, separator_bounds, extra);
-}
-
-}  // namespace views