diff --git a/DEPS b/DEPS
index fe19d652..b4a68586 100644
--- a/DEPS
+++ b/DEPS
@@ -86,7 +86,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': '87cc90dfaaf78e306eb4758bfdcb4c8977de4452',
+  'angle_revision': 'e30edd6fcb9625e62985548917340360811e0d93',
   # 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.
@@ -98,7 +98,7 @@
   # 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': '94ed4456bfe64ea045be24c66966d814b73fa7ac',
+  'pdfium_revision': '14768f3264a4cff8ca0096a27e41f1861b2c422b',
   # 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.
@@ -332,7 +332,7 @@
   },
 
   'src/third_party/dom_distiller_js/dist':
-    Var('chromium_git') + '/chromium/dom-distiller/dist.git' + '@' + '7a530fc00184ee28e79a2b45270906cacaf00d3b',
+    Var('chromium_git') + '/chromium/dom-distiller/dist.git' + '@' + '60b46718e28f553ab57e3d2bbda5b3b41456f417',
 
   'src/third_party/elfutils/src': {
       'url': Var('chromium_git') + '/external/elfutils.git' + '@' + '249673729a7e5dbd5de4f3760bdcaa3d23d154d7',
@@ -639,7 +639,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '05591bbeae6592fd924caec8e728a4ea86cbb8c9',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '844ce8bb3ac1c5cbc31dd0026cfaf6694ddee631', # commit position 20628
+    Var('webrtc_git') + '/src.git' + '@' + '1aa285974b6b2c5d1afe44b3eafe08f4b80837ed', # commit position 20628
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
diff --git a/android_webview/common/crash_reporter/crash_keys.cc b/android_webview/common/crash_reporter/crash_keys.cc
index 3662ad04a..ad76719d 100644
--- a/android_webview/common/crash_reporter/crash_keys.cc
+++ b/android_webview/common/crash_reporter/crash_keys.cc
@@ -37,10 +37,6 @@
       {kShutdownType, kSmallSize},
       {kBrowserUnpinTrace, kMediumSize},
 
-      // content/:
-      {"discardable-memory-allocated", kSmallSize},
-      {"discardable-memory-free", kSmallSize},
-      {"total-discardable-memory-allocated", kSmallSize},
       {kViewCount, kSmallSize},
 
       // media/:
diff --git a/ash/DEPS b/ash/DEPS
index 286f4dd..e144dec 100644
--- a/ash/DEPS
+++ b/ash/DEPS
@@ -106,6 +106,9 @@
   "touch_transformer_controller\.*": [
     "+ash/host"
   ],
+  "window_manager.cc": [
+    "+ash/host/ash_window_tree_host.h"
+  ],
   "window_manager_service.cc": [
     "+chromeos/cryptohome"
   ],
diff --git a/ash/display/display_synchronizer.cc b/ash/display/display_synchronizer.cc
index 6b5aa42..952f764 100644
--- a/ash/display/display_synchronizer.cc
+++ b/ash/display/display_synchronizer.cc
@@ -4,11 +4,13 @@
 
 #include "ash/display/display_synchronizer.h"
 
+#include "ash/display/mirror_window_controller.h"
 #include "ash/host/ash_window_tree_host.h"
 #include "ash/shell.h"
 #include "services/ui/public/interfaces/window_manager_constants.mojom.h"
 #include "ui/aura/mus/window_manager_delegate.h"
 #include "ui/aura/mus/window_tree_host_mus.h"
+#include "ui/base/ui_base_switches_util.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/manager/managed_display_info.h"
 
@@ -60,10 +62,24 @@
     displays.push_back(display_manager->GetDisplayAt(i));
     metrics.push_back(GetMetricsForDisplay(displays[i].id()));
   }
-  const std::vector<display::Display>& mirrors =
-      display_manager->software_mirroring_display_list();
-  for (size_t i = 0; i < mirrors.size(); ++i)
-    metrics.push_back(GetMetricsForDisplay(mirrors[i].id()));
+  std::vector<display::Display> mirrors;
+  MirrorWindowController* mirror_window_controller =
+      Shell::Get()->window_tree_host_manager()->mirror_window_controller();
+  for (const auto& mirror :
+       display_manager->software_mirroring_display_list()) {
+    if (::switches::IsMusHostingViz()) {
+      // If mus is hosting viz, the window server handle mirrors internally.
+      mirrors.push_back(mirror);
+      metrics.push_back(GetMetricsForDisplay(mirror.id()));
+    } else if (mirror_window_controller->GetAshWindowTreeHostForDisplayId(
+                   mirror.id())) {
+      // Otherwise, if MirrorWindowController constructed a window tree host
+      // the window server should construct a normal ws::Display for the mirror.
+      displays.push_back(mirror);
+      metrics.push_back(GetMetricsForDisplay(mirror.id()));
+    }
+  }
+
   window_manager_client_->SetDisplayConfiguration(
       displays, std::move(metrics),
       WindowTreeHostManager::GetPrimaryDisplayId(), mirrors);
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc
index 6d34fdf3..c18ddda 100644
--- a/ash/display/mirror_window_controller.cc
+++ b/ash/display/mirror_window_controller.cc
@@ -13,6 +13,7 @@
 #include "ash/host/ash_window_tree_host.h"
 #include "ash/host/ash_window_tree_host_init_params.h"
 #include "ash/host/root_window_transformer.h"
+#include "ash/public/cpp/config.h"
 #include "ash/root_window_settings.h"
 #include "ash/shell.h"
 #include "base/strings/stringprintf.h"
@@ -23,6 +24,7 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/layout.h"
+#include "ui/base/ui_base_switches_util.h"
 #include "ui/compositor/reflector.h"
 #include "ui/display/display_layout.h"
 #include "ui/display/manager/display_manager.h"
@@ -212,19 +214,20 @@
       host_info->ash_host->SetRootWindowTransformer(std::move(transformer));
       mirror_window->SetBounds(host->window()->bounds());
       mirror_window->Show();
-      if (reflector_) {
-        reflector_->AddMirroringLayer(mirror_window->layer());
-      } else if (aura::Env::GetInstance()->context_factory_private()) {
-        reflector_ =
-            aura::Env::GetInstance()
-                ->context_factory_private()
-                ->CreateReflector(
-                    Shell::GetPrimaryRootWindow()->GetHost()->compositor(),
-                    mirror_window->layer());
-      } else {
-        // TODO: Config::MUS needs to support reflector.
-        // http://crbug.com/601869.
-        NOTIMPLEMENTED();
+      // The classic config creates the accelerated widget synchronously. Mus
+      // (without viz) creates the reflector in OnAcceleratedWidgetOverridden.
+      if (host->GetAcceleratedWidget() != gfx::kNullAcceleratedWidget) {
+        DCHECK_EQ(Shell::GetAshConfig(), Config::CLASSIC);
+        if (reflector_) {
+          reflector_->AddMirroringLayer(mirror_window->layer());
+        } else if (aura::Env::GetInstance()->context_factory_private()) {
+          reflector_ =
+              aura::Env::GetInstance()
+                  ->context_factory_private()
+                  ->CreateReflector(
+                      Shell::GetPrimaryRootWindow()->GetHost()->compositor(),
+                      mirror_window->layer());
+        }
       }
     } else {
       AshWindowTreeHost* ash_host =
@@ -318,6 +321,22 @@
   }
 }
 
+void MirrorWindowController::OnAcceleratedWidgetOverridden(
+    aura::WindowTreeHost* host) {
+  DCHECK_NE(host->GetAcceleratedWidget(), gfx::kNullAcceleratedWidget);
+  DCHECK_NE(Shell::GetAshConfig(), Config::CLASSIC);
+  DCHECK(!switches::IsMusHostingViz());
+  MirroringHostInfo* info = mirroring_host_info_map_[host->GetDisplayId()];
+  if (reflector_) {
+    reflector_->AddMirroringLayer(info->mirror_window->layer());
+  } else if (aura::Env::GetInstance()->context_factory_private()) {
+    reflector_ =
+        aura::Env::GetInstance()->context_factory_private()->CreateReflector(
+            Shell::GetPrimaryRootWindow()->GetHost()->compositor(),
+            info->mirror_window->layer());
+  }
+}
+
 display::Display MirrorWindowController::GetDisplayForRootWindow(
     const aura::Window* root) const {
   for (const auto& pair : mirroring_host_info_map_) {
@@ -335,7 +354,8 @@
 
 AshWindowTreeHost* MirrorWindowController::GetAshWindowTreeHostForDisplayId(
     int64_t id) {
-  CHECK_EQ(1u, mirroring_host_info_map_.count(id));
+  if (mirroring_host_info_map_.count(id) == 0)
+    return nullptr;
   return mirroring_host_info_map_[id]->ash_host.get();
 }
 
diff --git a/ash/display/mirror_window_controller.h b/ash/display/mirror_window_controller.h
index 5b4eb12b..f350df3 100644
--- a/ash/display/mirror_window_controller.h
+++ b/ash/display/mirror_window_controller.h
@@ -63,6 +63,7 @@
 
   // aura::WindowTreeHostObserver overrides:
   void OnHostResized(aura::WindowTreeHost* host) override;
+  void OnAcceleratedWidgetOverridden(aura::WindowTreeHost* host) override;
 
   // Returns the display::Display for the mirroring root window.
   display::Display GetDisplayForRootWindow(const aura::Window* root) const;
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc
index 22384677..cca2c80e 100644
--- a/ash/display/window_tree_host_manager.cc
+++ b/ash/display/window_tree_host_manager.cc
@@ -284,7 +284,10 @@
 AshWindowTreeHost* WindowTreeHostManager::GetAshWindowTreeHostForDisplayId(
     int64_t display_id) {
   const auto host = window_tree_hosts_.find(display_id);
-  return host == window_tree_hosts_.end() ? nullptr : host->second;
+  if (host != window_tree_hosts_.end())
+    return host->second;
+  return mirror_window_controller_->GetAshWindowTreeHostForDisplayId(
+      display_id);
 }
 
 aura::Window::Windows WindowTreeHostManager::GetAllRootWindows() {
diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc
index 0188cf3..989d17f 100644
--- a/ash/extended_desktop_unittest.cc
+++ b/ash/extended_desktop_unittest.cc
@@ -336,6 +336,10 @@
 }
 
 TEST_F(ExtendedDesktopTest, Capture) {
+  // This test deals with input events but not visuals so don't throttle input
+  // on visuals.
+  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
+
   UpdateDisplay("1000x600,600x400");
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
 
@@ -819,6 +823,9 @@
 }
 
 TEST_F(ExtendedDesktopTest, PassiveGrab) {
+  // This test deals with input events but not visuals so don't throttle input
+  // on visuals.
+  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
   EventLocationRecordingEventHandler event_handler;
   ash::Shell::Get()->AddPreTargetHandler(&event_handler);
 
diff --git a/ash/window_manager.cc b/ash/window_manager.cc
index f76a2fe..16b91d3 100644
--- a/ash/window_manager.cc
+++ b/ash/window_manager.cc
@@ -12,8 +12,10 @@
 
 #include "ash/accelerators/accelerator_handler.h"
 #include "ash/accelerators/accelerator_ids.h"
+#include "ash/display/window_tree_host_manager.h"
 #include "ash/drag_drop/drag_image_view.h"
 #include "ash/event_matcher_util.h"
+#include "ash/host/ash_window_tree_host.h"
 #include "ash/public/cpp/config.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/public/cpp/window_pin_type.h"
@@ -337,10 +339,13 @@
 void WindowManager::OnWmAcceleratedWidgetAvailableForDisplay(
     int64_t display_id,
     gfx::AcceleratedWidget widget) {
-  auto* window = Shell::GetRootWindowForDisplayId(display_id);
-  if (window) {
-    auto* host = static_cast<aura::WindowTreeHostMus*>(window->GetHost());
-    host->OverrideAcceleratedWidget(widget);
+  WindowTreeHostManager* manager = Shell::Get()->window_tree_host_manager();
+  AshWindowTreeHost* host =
+      manager->GetAshWindowTreeHostForDisplayId(display_id);
+  // The display may have been destroyed before getting this async callback.
+  if (host && host->AsWindowTreeHost()) {
+    static_cast<aura::WindowTreeHostMus*>(host->AsWindowTreeHost())
+        ->OverrideAcceleratedWidget(widget);
   }
 }
 
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index da850d37..5f5f438a 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -2113,6 +2113,8 @@
 }
 
 TEST_F(SplitViewWindowSelectorTest, Dragging) {
+  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
+
   ui::test::EventGenerator& generator = GetEventGenerator();
 
   std::unique_ptr<aura::Window> right_window = CreateTestWindow();
diff --git a/base/android/java/src/org/chromium/base/StrictModeContext.java b/base/android/java/src/org/chromium/base/StrictModeContext.java
index cb06fedf..beaaac0 100644
--- a/base/android/java/src/org/chromium/base/StrictModeContext.java
+++ b/base/android/java/src/org/chromium/base/StrictModeContext.java
@@ -63,6 +63,16 @@
         return new StrictModeContext(oldPolicy);
     }
 
+    /**
+     * Convenience method for disabling StrictMode for slow calls with try-with-resources.
+     */
+    public static StrictModeContext allowSlowCalls() {
+        StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
+        StrictMode.setThreadPolicy(
+                new StrictMode.ThreadPolicy.Builder(oldPolicy).permitCustomSlowCalls().build());
+        return new StrictModeContext(oldPolicy);
+    }
+
     @Override
     public void close() {
         if (mThreadPolicy != null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index c22161d..3289ef22 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -173,6 +173,8 @@
     public static final String CHROME_HOME_PROMO = "ChromeHomePromo";
     public static final String CHROME_HOME_PROMO_INFO_ONLY = "ChromeHomePromoInfoOnly";
     public static final String CHROME_HOME_PROMO_ON_STARTUP = "ChromeHomePromoOnStartup";
+    public static final String CHROME_HOME_PULL_TO_REFRESH_IPH_AT_TOP =
+            "ChromeHomePullToRefreshIphAtTop";
     public static final String CHROME_HOME_SHOW_GOOGLE_G_WHEN_URL_CLEARED =
             "ChromeHomeShowGoogleGWhenUrlCleared";
     public static final String CHROME_HOME_SURVEY = "ChromeHomeSurvey";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBottomSheetContent.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBottomSheetContent.java
index fe51583..c41007cc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBottomSheetContent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBottomSheetContent.java
@@ -37,6 +37,7 @@
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.toolbar.BottomToolbarPhone;
 import org.chromium.chrome.browser.util.ViewUtils;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.StateChangeReason;
@@ -70,6 +71,7 @@
     private final LogoView mLogoView;
     private final LogoDelegateImpl mLogoDelegate;
     private final LocationBarPhone mLocationBar;
+    private final BottomToolbarPhone mToolbarView;
     private final ViewGroup mControlContainerView;
     private final View mToolbarPullHandle;
     private final View mToolbarShadow;
@@ -231,6 +233,7 @@
         mRecyclerView.setOnTouchListener(touchListener);
 
         mControlContainerView = (ViewGroup) activity.findViewById(R.id.control_container);
+        mToolbarView = (BottomToolbarPhone) activity.findViewById(R.id.toolbar);
         mToolbarPullHandle = activity.findViewById(R.id.toolbar_handle);
         mToolbarShadow = activity.findViewById(R.id.bottom_toolbar_shadow);
         mLogoDelegate = new LogoDelegateImpl(navigationDelegate, mLogoView, profile);
@@ -407,6 +410,7 @@
             mControlContainerView.setTranslationY(0);
             mToolbarPullHandle.setTranslationY(0);
             mToolbarShadow.setTranslationY(0);
+            mToolbarView.setShownInNtp(false);
             ViewUtils.setAncestorsShouldClipChildren(mControlContainerView, true);
             mRecyclerView.setAlpha(1.0f);
             mRecyclerView.setVisibility(View.VISIBLE);
@@ -447,6 +451,12 @@
         mToolbarPullHandle.setTranslationY(-toolbarOffset);
         mToolbarShadow.setTranslationY(-toolbarOffset);
 
+        if (toolbarOffset == 0.0f || toolbarOffset == sheetHeightPx) {
+            mToolbarView.setShownInNtp(false);
+        } else {
+            mToolbarView.setShownInNtp(true);
+        }
+
         // Fade out the whole RecyclerView when the URL bar is focused, and fade it in when it loses
         // focus.
         final float alpha;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
index ff225b5e..6f0c04d7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
@@ -216,6 +216,9 @@
     /** A handle to the {@link ChromeActivity} this toolbar exists in. */
     private ChromeActivity mActivity;
 
+    /** Whether the toolbar is currently being shown in the NTP. */
+    private boolean mShownInNtp;
+
     /**
      * Constructs a BottomToolbarPhone object.
      * @param context The Context in which this View object is created.
@@ -912,6 +915,16 @@
                 ApiCompatibilityUtils.getPaddingEnd(otherToolbar), otherToolbar.getPaddingBottom());
     }
 
+    /**
+     * @param shownInNtp Whether the toolbar is currently being shown in the NTP.
+     */
+    public void setShownInNtp(boolean shownInNtp) {
+        if (shownInNtp == mShownInNtp) return;
+
+        mShownInNtp = shownInNtp;
+        updateToolbarBackground(mVisualState);
+    }
+
     @Override
     protected void onAccessibilityStatusChanged(boolean enabled) {
         setUseExpandButton();
@@ -1046,6 +1059,13 @@
             return ApiCompatibilityUtils.getColor(getResources(),
                     DeviceClassManager.enableAccessibilityLayout() ? R.color.incognito_primary_color
                                                                    : R.color.modern_primary_color);
+        } else if (visualState == VisualState.NORMAL && mShownInNtp) {
+            // TODO(twellington): Ideally the VisualState would be set to NEW_TAB_NORMAL and that
+            // would be used to set the toolbar background. The VisualState is used for some toolbar
+            // animations that we don't run on BottomToolbarPhone. Those animations need to be
+            // reworked before the VisualState can be set to NEW_TAB_NORMAL when the Chrome Home NTP
+            // is showing.
+            return Color.TRANSPARENT;
         } else if (visualState == VisualState.NORMAL
                 || visualState == VisualState.TAB_SWITCHER_NORMAL) {
             return ApiCompatibilityUtils.getColor(getResources(), R.color.modern_primary_color);
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 af6fa0c..53425ff 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
@@ -55,7 +55,7 @@
 import org.chromium.chrome.browser.util.MathUtils;
 import org.chromium.chrome.browser.widget.FadingBackgroundView;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController.ContentType;
-import org.chromium.chrome.browser.widget.textbubble.ViewAnchoredTextBubble;
+import org.chromium.chrome.browser.widget.textbubble.TextBubble;
 import org.chromium.content.browser.BrowserStartupController;
 import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content_public.browser.LoadUrlParams;
@@ -1702,7 +1702,7 @@
      * @return The bottom sheet's help bubble if it exists.
      */
     @VisibleForTesting
-    public @Nullable ViewAnchoredTextBubble getHelpBubbleForTests() {
+    public @Nullable TextBubble getHelpBubbleForTests() {
         return getIphBubbleController().getHelpBubbleForTests();
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/ChromeHomeIphBubbleController.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/ChromeHomeIphBubbleController.java
index 774ca1a..a930072 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/ChromeHomeIphBubbleController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/ChromeHomeIphBubbleController.java
@@ -5,8 +5,10 @@
 package org.chromium.chrome.browser.widget.bottomsheet;
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.support.annotation.Nullable;
 import android.view.View;
+import android.view.View.OnLayoutChangeListener;
 import android.widget.PopupWindow.OnDismissListener;
 
 import org.chromium.base.Callback;
@@ -22,6 +24,7 @@
 import org.chromium.chrome.browser.toolbar.BottomToolbarPhone;
 import org.chromium.chrome.browser.widget.ViewHighlighter;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.StateChangeReason;
+import org.chromium.chrome.browser.widget.textbubble.TextBubble;
 import org.chromium.chrome.browser.widget.textbubble.ViewAnchoredTextBubble;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.feature_engagement.FeatureConstants;
@@ -41,7 +44,7 @@
      */
     private static final String HELP_BUBBLE_TIMEOUT_PARAM_NAME = "x_iph-timeout-duration-ms";
 
-    private ViewAnchoredTextBubble mHelpBubble;
+    private TextBubble mHelpBubble;
     private LayoutManagerChrome mLayoutManager;
     private BottomToolbarPhone mToolbar;
     private View mControlContainer;
@@ -67,7 +70,7 @@
         mBottomSheet.addObserver(new EmptyBottomSheetObserver() {
             @Override
             public void onSheetOpened(@StateChangeReason int reason) {
-                if (mHelpBubble != null) mHelpBubble.dismiss();
+                dismissHelpBubble();
 
                 Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.getLastUsedProfile());
                 tracker.notifyEvent(EventConstants.BOTTOM_SHEET_EXPANDED);
@@ -149,14 +152,23 @@
         if (!fromMenu && !showRefreshIph && !showColdStartIph) return;
 
         // Determine which strings to use.
+        boolean showAtTopOfScreen = showRefreshIph
+                && ChromeFeatureList.isEnabled(
+                           ChromeFeatureList.CHROME_HOME_PULL_TO_REFRESH_IPH_AT_TOP);
         boolean showExpandButtonHelpBubble = !showRefreshIph && mToolbar.isUsingExpandButton();
         View anchorView = showExpandButtonHelpBubble
                 ? mControlContainer.findViewById(R.id.expand_sheet_button)
                 : mControlContainer;
-        int stringId = showRefreshIph ? R.string.bottom_sheet_pull_to_refresh_help_bubble_message
-                                      : showExpandButtonHelpBubble
-                        ? R.string.bottom_sheet_accessibility_expand_button_help_bubble_message
-                        : R.string.bottom_sheet_help_bubble_message;
+        int stringId = 0;
+        if (showRefreshIph) {
+            stringId = showAtTopOfScreen
+                    ? R.string.bottom_sheet_pull_to_refresh_help_bubble_accessibility_message
+                    : R.string.bottom_sheet_pull_to_refresh_help_bubble_message;
+        } else if (showExpandButtonHelpBubble) {
+            stringId = R.string.bottom_sheet_accessibility_expand_button_help_bubble_message;
+        } else {
+            stringId = R.string.bottom_sheet_help_bubble_message;
+        }
         int accessibilityStringId = showRefreshIph
                 ? R.string.bottom_sheet_pull_to_refresh_help_bubble_accessibility_message
                 : stringId;
@@ -166,7 +178,7 @@
         EmptyOverviewModeObserver overviewModeObserver = new EmptyOverviewModeObserver() {
             @Override
             public void onOverviewModeStartedShowing(boolean showToolbar) {
-                mHelpBubble.dismiss();
+                dismissHelpBubble();
             }
         };
         mLayoutManager.addOverviewModeObserver(overviewModeObserver);
@@ -176,8 +188,29 @@
                 mFullscreenManager.getBrowserVisibilityDelegate().showControlsPersistent();
 
         // Create the help bubble and setup dismissal behavior.
-        mHelpBubble =
-                new ViewAnchoredTextBubble(mContext, anchorView, stringId, accessibilityStringId);
+        View topAnchorView = (View) mBottomSheet.getParent();
+        OnLayoutChangeListener topAnchorLayoutChangeListener = new OnLayoutChangeListener() {
+            @Override
+            public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                if (left != oldLeft || right != oldRight || top != oldTop || bottom != oldBottom) {
+                    dismissHelpBubble();
+                }
+            }
+        };
+
+        if (showAtTopOfScreen) {
+            mHelpBubble =
+                    new TextBubble(mContext, topAnchorView, stringId, accessibilityStringId, false);
+            mHelpBubble.setAnchorRect(getTopAnchorRect(topAnchorView));
+            topAnchorView.addOnLayoutChangeListener(topAnchorLayoutChangeListener);
+        } else {
+            mHelpBubble = new ViewAnchoredTextBubble(
+                    mContext, anchorView, stringId, accessibilityStringId);
+            int inset = mContext.getResources().getDimensionPixelSize(
+                    R.dimen.bottom_sheet_help_bubble_inset);
+            ((ViewAnchoredTextBubble) mHelpBubble).setInsetPx(0, inset, 0, inset);
+        }
 
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_HOME_PERSISTENT_IPH)) {
             int dismissTimeout = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
@@ -205,6 +238,10 @@
 
                 ViewHighlighter.turnOffHighlight(anchorView);
 
+                if (showAtTopOfScreen) {
+                    topAnchorView.removeOnLayoutChangeListener(topAnchorLayoutChangeListener);
+                }
+
                 mHelpBubble = null;
             }
         });
@@ -215,9 +252,6 @@
         }
 
         // Show the bubble.
-        int inset = mContext.getResources().getDimensionPixelSize(
-                R.dimen.bottom_sheet_help_bubble_inset);
-        mHelpBubble.setInsetPx(0, inset, 0, inset);
         mHelpBubble.show();
     }
 
@@ -225,7 +259,24 @@
      * @return The bottom sheet's help bubble if it exists.
      */
     @VisibleForTesting
-    public @Nullable ViewAnchoredTextBubble getHelpBubbleForTests() {
+    public @Nullable TextBubble getHelpBubbleForTests() {
         return mHelpBubble;
     }
+
+    /** Dismiss the help bubble if it is not null. */
+    private void dismissHelpBubble() {
+        if (mHelpBubble != null) mHelpBubble.dismiss();
+    }
+
+    /**
+     * @param topAnchorView The view used display the IPH bubble when it is shown at the top of the
+     *                      screen.
+     * @return A {@link Rect} used to anchor the IPH bubble.
+     */
+    private Rect getTopAnchorRect(View topAnchorView) {
+        int[] locationInWindow = new int[2];
+        topAnchorView.getLocationInWindow(locationInWindow);
+        int centerPoint = locationInWindow[0] + topAnchorView.getWidth() / 2;
+        return new Rect(centerPoint, locationInWindow[1], centerPoint, locationInWindow[1]);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/ArrowBubbleDrawable.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/ArrowBubbleDrawable.java
index d36a8d05..97862b08 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/ArrowBubbleDrawable.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/ArrowBubbleDrawable.java
@@ -37,6 +37,7 @@
 
     private int mArrowXOffsetPx;
     private boolean mArrowOnTop;
+    private boolean mShowArrow;
 
     public ArrowBubbleDrawable(Context context) {
         mRadiusPx = context.getResources().getDimensionPixelSize(R.dimen.text_bubble_corner_radius);
@@ -103,6 +104,21 @@
     }
 
     /**
+     * @return Whether or not an arrow is currently shown.
+     */
+    public boolean isShowingArrow() {
+        return mShowArrow;
+    }
+
+    /**
+     * @param showArrow Whether the bubble should have an arrow.
+     */
+    public void setShowArrow(boolean showArrow) {
+        mShowArrow = showArrow;
+        invalidateSelf();
+    }
+
+    /**
      * @param color The color to make the bubble and arrow.
      */
     public void setBubbleColor(@ColorInt int color) {
@@ -132,16 +148,19 @@
     public void draw(Canvas canvas) {
         mBubbleDrawable.draw(canvas);
 
-        canvas.save();
-        // If the arrow is on the bottom, flip the arrow before drawing.
-        if (!mArrowOnTop) {
-            int arrowCenterYPx = getBounds().height() - mArrowHeightPx / 2;
-            canvas.scale(1, -1, mArrowXOffsetPx, arrowCenterYPx);
-            canvas.translate(0, arrowCenterYPx - mArrowHeightPx / 2);
+        if (mShowArrow) {
+            canvas.save();
+
+            // If the arrow is on the bottom, flip the arrow before drawing.
+            if (!mArrowOnTop) {
+                int arrowCenterYPx = getBounds().height() - mArrowHeightPx / 2;
+                canvas.scale(1, -1, mArrowXOffsetPx, arrowCenterYPx);
+                canvas.translate(0, arrowCenterYPx - mArrowHeightPx / 2);
+            }
+            canvas.translate(mArrowXOffsetPx, 0);
+            canvas.drawPath(mArrowPath, mArrowPaint);
+            canvas.restore();
         }
-        canvas.translate(mArrowXOffsetPx, 0);
-        canvas.drawPath(mArrowPath, mArrowPaint);
-        canvas.restore();
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java
index e087f522..48f466328 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java
@@ -129,7 +129,7 @@
     private final int mAccessibilityStringId;
 
     /**
-     * Constructs a {@link TextBubble} instance.
+     * Constructs a {@link TextBubble} instance using the default arrow drawable background.
      * @param context  Context to draw resources from.
      * @param rootView The {@link View} to use for size calculations and for display.
      * @param stringId The id of the string resource for the text that should be shown.
@@ -137,12 +137,28 @@
      */
     public TextBubble(Context context, View rootView, @StringRes int stringId,
             @StringRes int accessibilityStringId) {
+        this(context, rootView, stringId, accessibilityStringId, true);
+    }
+
+    /**
+     * Constructs a {@link TextBubble} instance.
+     * @param context  Context to draw resources from.
+     * @param rootView The {@link View} to use for size calculations and for display.
+     * @param stringId The id of the string resource for the text that should be shown.
+     * @param accessibilityStringId The id of the string resource of the accessibility text.
+     * @param showArrow Whether the bubble should have an arrow.
+     */
+    public TextBubble(Context context, View rootView, @StringRes int stringId,
+            @StringRes int accessibilityStringId, boolean showArrow) {
         mContext = context;
         mRootView = rootView.getRootView();
         mStringId = stringId;
         mAccessibilityStringId = accessibilityStringId;
         mPopupWindow = new PopupWindow(mContext);
+
         mDrawable = new ArrowBubbleDrawable(context);
+        mDrawable.setShowArrow(showArrow);
+
         mHandler = new Handler();
 
         mPopupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -355,14 +371,19 @@
         // In landscape mode, root view includes the decorations in some devices. So we guard the
         // window dimensions against |mCachedWindowRect.right| instead.
         mX = MathUtils.clamp(mX, mMarginPx, mCachedWindowRect.right - mWidth - mMarginPx);
-        int arrowXOffset = mAnchorRect.centerX() - mX;
 
-        // Force the anchor to be in a reasonable spot w.r.t. the bubble (not over the corners).
-        int minArrowOffset = mDrawable.getArrowLeftSpacing();
-        int maxArrowOffset = mWidth - mDrawable.getArrowRightSpacing();
-        arrowXOffset = MathUtils.clamp(arrowXOffset, minArrowOffset, maxArrowOffset);
+        int arrowXOffset = 0;
+        if (mDrawable.isShowingArrow()) {
+            arrowXOffset = mAnchorRect.centerX() - mX;
 
-        // TODO(dtrainor): Figure out how to move the arrow and bubble to make things look better.
+            // Force the anchor to be in a reasonable spot w.r.t. the bubble (not over the corners).
+            int minArrowOffset = mDrawable.getArrowLeftSpacing();
+            int maxArrowOffset = mWidth - mDrawable.getArrowRightSpacing();
+            arrowXOffset = MathUtils.clamp(arrowXOffset, minArrowOffset, maxArrowOffset);
+        }
+
+        // TODO(dtrainor): Figure out how to move the arrow and bubble to make things look
+        // better.
 
         mDrawable.setPositionProperties(arrowXOffset, positionBelow);
 
diff --git a/chrome/app/chrome_crash_reporter_client_win.cc b/chrome/app/chrome_crash_reporter_client_win.cc
index 0b12ebf..27e3a65 100644
--- a/chrome/app/chrome_crash_reporter_client_win.cc
+++ b/chrome/app/chrome_crash_reporter_client_win.cc
@@ -83,10 +83,6 @@
       {kShutdownType, kSmallSize},
       {kBrowserUnpinTrace, kMediumSize},
 
-      // content/:
-      {"discardable-memory-allocated", kSmallSize},
-      {"discardable-memory-free", kSmallSize},
-      {"total-discardable-memory-allocated", kSmallSize},
       {kViewCount, kSmallSize},
 
       // media/:
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 8b9d59d..a8424ac 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1025,6 +1025,8 @@
     "policy/managed_bookmarks_policy_handler.h",
     "policy/network_prediction_policy_handler.cc",
     "policy/network_prediction_policy_handler.h",
+    "policy/policy_conversions.cc",
+    "policy/policy_conversions.h",
     "policy/policy_helpers.cc",
     "policy/policy_helpers.h",
     "policy/profile_policy_connector.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index ed61bc6..d614fe62 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1907,6 +1907,10 @@
      flag_descriptions::kChromeHomePersistentIphName,
      flag_descriptions::kChromeHomePersistentIphDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kChromeHomePersistentIph)},
+    {"enable-chrome-home-pull-to-refresh-iph-at-top",
+     flag_descriptions::kChromeHomePullToRefreshIphAtTopName,
+     flag_descriptions::kChromeHomePullToRefreshIphAtTopDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kChromeHomePullToRefreshIphAtTop)},
     {"enable-chrome-memex", flag_descriptions::kChromeMemexName,
      flag_descriptions::kChromeMemexDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kChromeMemexFeature)},
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 7f0dd14..7ca2304 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -73,6 +73,7 @@
     &kChromeHomePromo,
     &kChromeHomePromoInfoOnly,
     &kChromeHomePromoOnStartup,
+    &kChromeHomePullToRefreshIphAtTop,
     &kChromeHomeOptOutSnackbar,
     &kChromeHomeShowGoogleGWhenUrlCleared,
     &kChromeHomeSurvey,
@@ -213,6 +214,9 @@
 const base::Feature kChromeHomePromoOnStartup{"ChromeHomePromoOnStartup",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kChromeHomePullToRefreshIphAtTop{
+    "ChromeHomePullToRefreshIphAtTop", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kChromeHomeOptOutSnackbar{
     "ChromeHomeOptOutSnackbar", base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index 1b09a01..22dc1ce 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -32,6 +32,7 @@
 extern const base::Feature kChromeHomePromo;
 extern const base::Feature kChromeHomePromoInfoOnly;
 extern const base::Feature kChromeHomePromoOnStartup;
+extern const base::Feature kChromeHomePullToRefreshIphAtTop;
 extern const base::Feature kChromeHomeOptOutSnackbar;
 extern const base::Feature kChromeHomeShowGoogleGWhenUrlCleared;
 extern const base::Feature kChromeHomeSurvey;
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
index 113b5c2..24e9162 100644
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
@@ -397,7 +397,7 @@
 
 // Fails on ASAN. See http://crbug.com/776308 . (Note MAYBE_ doesn't work well
 // with parameterized tests).
-#if !defined(ADDRESS_SANITIZER)
+#if !defined(ADDRESS_SANITIZER) && !defined(OS_CHROMEOS)
 IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, NavigateSystemTray) {
   EnableChromeVox();
 
@@ -456,7 +456,7 @@
       break;
   }
 }
-#endif  // !defined(ADDRESS_SANITIZER)
+#endif  // !defined(ADDRESS_SANITIZER) && !defined(OS_CHROMEOS)
 
 // See http://crbug.com/443608
 IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, DISABLED_ScreenBrightness) {
diff --git a/chrome/browser/chromeos/arc/arc_service_launcher.cc b/chrome/browser/chromeos/arc/arc_service_launcher.cc
index b0bfec2..b18e4139 100644
--- a/chrome/browser/chromeos/arc/arc_service_launcher.cc
+++ b/chrome/browser/chromeos/arc/arc_service_launcher.cc
@@ -55,6 +55,7 @@
 #include "components/arc/power/arc_power_bridge.h"
 #include "components/arc/rotation_lock/arc_rotation_lock_bridge.h"
 #include "components/arc/storage_manager/arc_storage_manager.h"
+#include "components/arc/usb/usb_host_bridge.h"
 #include "components/arc/volume_mounter/arc_volume_mounter_bridge.h"
 #include "components/prefs/pref_member.h"
 #include "ui/arc/notification/arc_notification_manager.h"
@@ -163,6 +164,7 @@
   ArcSettingsService::GetForBrowserContext(profile);
   ArcTracingBridge::GetForBrowserContext(profile);
   ArcTtsService::GetForBrowserContext(profile);
+  ArcUsbHostBridge::GetForBrowserContext(profile);
   ArcUserSessionService::GetForBrowserContext(profile);
   ArcVoiceInteractionArcHomeService::GetForBrowserContext(profile);
   ArcVoiceInteractionFrameworkService::GetForBrowserContext(profile);
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.cc b/chrome/browser/chromeos/policy/system_log_uploader.cc
index a8fce4d..5574cd7 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader.cc
@@ -21,9 +21,12 @@
 #include "chrome/browser/chromeos/policy/upload_job_impl.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
+#include "chrome/browser/policy/policy_conversions.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/feedback/anonymizer_tool.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/user_manager/user_manager.h"
 #include "net/http/http_request_headers.h"
 
 namespace policy {
@@ -39,6 +42,10 @@
 // The cutoff point (in bytes) after which log contents are ignored.
 const size_t kLogCutoffSize = 50 * 1024 * 1024;  // 50 MiB.
 
+// Pseudo-location of policy dump file. Policy is uploaded from memory,
+// there is no actual file on disk.
+constexpr char kPolicyDumpFileLocation[] = "/var/log/policy_dump.json";
+
 // The file names of the system logs to upload.
 // Note: do not add anything to this list without checking for PII in the file.
 const char* const kSystemLogFileNames[] = {
@@ -91,7 +98,8 @@
   ~SystemLogDelegate() override;
 
   // SystemLogUploader::Delegate:
-  void LoadSystemLogs(const LogUploadCallback& upload_callback) override;
+  std::string GetPolicyAsJSON() override;
+  void LoadSystemLogs(LogUploadCallback upload_callback) override;
 
   std::unique_ptr<UploadJob> CreateUploadJob(
       const GURL& upload_url,
@@ -110,13 +118,24 @@
 
 SystemLogDelegate::~SystemLogDelegate() {}
 
-void SystemLogDelegate::LoadSystemLogs(
-    const LogUploadCallback& upload_callback) {
+std::string SystemLogDelegate::GetPolicyAsJSON() {
+  bool include_user_policies = false;
+  if (user_manager::UserManager::IsInitialized()) {
+    if (user_manager::UserManager::Get()->GetPrimaryUser()) {
+      include_user_policies =
+          user_manager::UserManager::Get()->GetPrimaryUser()->IsAffiliated();
+    }
+  }
+  return policy::GetAllPolicyValuesAsJSON(
+      ProfileManager::GetActiveUserProfile(), include_user_policies);
+}
+
+void SystemLogDelegate::LoadSystemLogs(LogUploadCallback upload_callback) {
   // Run ReadFiles() in the thread that interacts with the file system and
   // return system logs to |upload_callback| on the current thread.
   base::PostTaskWithTraitsAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND},
-      base::Bind(&ReadFiles), upload_callback);
+      base::BindOnce(&ReadFiles), std::move(upload_callback));
 }
 
 std::unique_ptr<UploadJob> SystemLogDelegate::CreateUploadJob(
@@ -311,10 +330,10 @@
   DCHECK(thread_checker_.CalledOnValidThread());
 
   if (upload_enabled_) {
-    SYSLOG(INFO) << "Starting system log upload.";
+    SYSLOG(INFO) << "Reading system logs for upload.";
     log_upload_in_progress_ = true;
-    syslog_delegate_->LoadSystemLogs(base::Bind(
-        &SystemLogUploader::UploadSystemLogs, weak_factory_.GetWeakPtr()));
+    syslog_delegate_->LoadSystemLogs(base::BindOnce(
+        &SystemLogUploader::OnSystemLogsLoaded, weak_factory_.GetWeakPtr()));
   } else {
     // If upload is disabled, schedule the next attempt after 12h.
     SYSLOG(INFO) << "System log upload is disabled, rescheduling.";
@@ -324,6 +343,16 @@
   }
 }
 
+void SystemLogUploader::OnSystemLogsLoaded(
+    std::unique_ptr<SystemLogs> system_logs) {
+  // Must be called on the main thread.
+  DCHECK(thread_checker_.CalledOnValidThread());
+  system_logs->push_back(std::make_pair(kPolicyDumpFileLocation,
+                                        syslog_delegate_->GetPolicyAsJSON()));
+  SYSLOG(INFO) << "Starting system log upload.";
+  UploadSystemLogs(std::move(system_logs));
+}
+
 void SystemLogUploader::ScheduleNextSystemLogUpload(base::TimeDelta frequency) {
   // Don't schedule a new system log upload if there's a log upload in progress
   // (it will be scheduled once the current one completes).
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.h b/chrome/browser/chromeos/policy/system_log_uploader.h
index 608df1a..c1be946 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader.h
+++ b/chrome/browser/chromeos/policy/system_log_uploader.h
@@ -59,12 +59,15 @@
   class Delegate {
    public:
     using LogUploadCallback =
-        base::Callback<void(std::unique_ptr<SystemLogs> system_logs)>;
+        base::OnceCallback<void(std::unique_ptr<SystemLogs> system_logs)>;
 
     virtual ~Delegate() {}
 
+    // Returns current policy dump in JSON format.
+    virtual std::string GetPolicyAsJSON() = 0;
+
     // Loads system logs and invokes |upload_callback|.
-    virtual void LoadSystemLogs(const LogUploadCallback& upload_callback) = 0;
+    virtual void LoadSystemLogs(LogUploadCallback upload_callback) = 0;
 
     // Creates a new fully configured instance of an UploadJob. This method
     // will be called exactly once per every system log upload.
@@ -101,7 +104,10 @@
   void StartLogUpload();
 
   // The callback is invoked by the Delegate if system logs have been loaded
-  // from disk, uploads system logs.
+  // from disk, adds policy dump and calls UploadSystemLogs.
+  void OnSystemLogsLoaded(std::unique_ptr<SystemLogs> system_logs);
+
+  // Uploads system logs.
   void UploadSystemLogs(std::unique_ptr<SystemLogs> system_logs);
 
   // Helper method that figures out when the next system log upload should
diff --git a/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
index 8cbf76e..87c2811 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
@@ -21,6 +21,10 @@
 
 namespace {
 
+// Pseudo-location of policy dump file.
+constexpr char kPolicyDumpFileLocation[] = "/var/log/policy_dump.json";
+constexpr char kPolicyDump[] = "{}";
+
 // The list of tested system log file names.
 const char* const kTestSystemLogFileNames[] = {"name1.txt", "name32.txt"};
 
@@ -81,7 +85,11 @@
                                file_index_ + 1),
             name);
 
-  EXPECT_EQ(kTestSystemLogFileNames[file_index_], filename);
+  if (file_index_ == max_files_ - 1) {
+    EXPECT_EQ(kPolicyDumpFileLocation, filename);
+  } else {
+    EXPECT_EQ(kTestSystemLogFileNames[file_index_], filename);
+  }
 
   EXPECT_EQ(2U, header_entries.size());
   EXPECT_EQ(
@@ -90,7 +98,11 @@
   EXPECT_EQ(SystemLogUploader::kContentTypePlainText,
             header_entries.find(net::HttpRequestHeaders::kContentType)->second);
 
-  EXPECT_EQ(kTestSystemLogFileNames[file_index_], *data);
+  if (file_index_ == max_files_ - 1) {
+    EXPECT_EQ(kPolicyDump, *data);
+  } else {
+    EXPECT_EQ(kTestSystemLogFileNames[file_index_], *data);
+  }
 
   file_index_++;
 }
@@ -117,9 +129,11 @@
       : is_upload_error_(is_upload_error), system_logs_(system_logs) {}
   ~MockSystemLogDelegate() override {}
 
-  void LoadSystemLogs(const LogUploadCallback& upload_callback) override {
+  std::string GetPolicyAsJSON() override { return kPolicyDump; }
+
+  void LoadSystemLogs(LogUploadCallback upload_callback) override {
     EXPECT_TRUE(is_upload_allowed_);
-    upload_callback.Run(
+    std::move(upload_callback).Run(
         base::MakeUnique<SystemLogUploader::SystemLogs>(system_logs_));
   }
 
@@ -127,7 +141,7 @@
       const GURL& url,
       UploadJob::Delegate* delegate) override {
     return base::MakeUnique<MockUploadJob>(url, delegate, is_upload_error_,
-                                           system_logs_.size());
+                                           system_logs_.size() + 1);
   }
 
   void set_upload_allowed(bool is_upload_allowed) {
diff --git a/chrome/browser/devtools/device/usb/android_usb_socket.h b/chrome/browser/devtools/device/usb/android_usb_socket.h
index 17715b1..799c1e8 100644
--- a/chrome/browser/devtools/device/usb/android_usb_socket.h
+++ b/chrome/browser/devtools/device/usb/android_usb_socket.h
@@ -35,12 +35,11 @@
   int Read(net::IOBuffer* buf,
            int buf_len,
            const net::CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
-  int Write(net::IOBuffer* buf,
-            int buf_len,
-            const net::CompletionCallback& callback,
-            const net::NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+  int Write(
+      net::IOBuffer* buf,
+      int buf_len,
+      const net::CompletionCallback& callback,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
   int Connect(const net::CompletionCallback& callback) override;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index f157acf..60f212ac 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1715,6 +1715,11 @@
 const char kChromeHomePromoDescription[] =
     "Enable showing the opt-in/out Chrome Home promo.";
 
+const char kChromeHomePullToRefreshIphAtTopName[] =
+    "Chrome Home Pull-To-Refresh Iph At Top";
+const char kChromeHomePullToRefreshIphAtTopDescription[] =
+    "Show the Chrome Home pull-to-refresh help bubble at the top of the screen";
+
 const char kChromeHomeShowGoogleGName[] = "Chrome Home Show Google G";
 const char kChromeHomeShowGoogleGDescription[] =
     "Show the Google G when the url is cleared. The flag to clear the url "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index ba5f3f6..ac0eb294 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1052,6 +1052,9 @@
 extern const char kChromeHomePromoName[];
 extern const char kChromeHomePromoDescription[];
 
+extern const char kChromeHomePullToRefreshIphAtTopName[];
+extern const char kChromeHomePullToRefreshIphAtTopDescription[];
+
 extern const char kChromeHomeShowGoogleGName[];
 extern const char kChromeHomeShowGoogleGDescription[];
 
diff --git a/chrome/browser/policy/policy_conversions.cc b/chrome/browser/policy/policy_conversions.cc
new file mode 100644
index 0000000..bf6952c3
--- /dev/null
+++ b/chrome/browser/policy/policy_conversions.cc
@@ -0,0 +1,188 @@
+// Copyright 2017 The Chromium Authors. 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/policy/policy_conversions.h"
+
+#include "base/json/json_writer.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/policy/profile_policy_connector_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/policy/core/browser/policy_error_map.h"
+#include "components/policy/core/common/policy_details.h"
+#include "components/policy/core/common/policy_namespace.h"
+#include "components/policy/core/common/policy_service.h"
+#include "components/policy/core/common/policy_types.h"
+#include "components/policy/policy_constants.h"
+#include "components/strings/grit/components_strings.h"
+#include "extensions/features/features.h"
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest.h"
+#include "extensions/common/manifest_constants.h"
+#endif
+
+namespace policy {
+
+namespace {
+
+struct PolicyStringMap {
+  const char* key;
+  int string_id;
+};
+
+const PolicyStringMap kPolicySources[policy::POLICY_SOURCE_COUNT] = {
+    {"sourceEnterpriseDefault", IDS_POLICY_SOURCE_ENTERPRISE_DEFAULT},
+    {"sourceCloud", IDS_POLICY_SOURCE_CLOUD},
+    {"sourceActiveDirectory", IDS_POLICY_SOURCE_ACTIVE_DIRECTORY},
+    {"sourcePublicSessionOverride", IDS_POLICY_SOURCE_PUBLIC_SESSION_OVERRIDE},
+    {"sourcePlatform", IDS_POLICY_SOURCE_PLATFORM},
+};
+
+// Utility function that returns a JSON serialization of the given |dict|.
+std::unique_ptr<base::Value> DictionaryToJSONString(
+    const base::DictionaryValue& dict) {
+  std::string json_string;
+  base::JSONWriter::WriteWithOptions(
+      dict, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_string);
+  return std::make_unique<base::Value>(json_string);
+}
+
+// Returns a copy of |value|. If necessary (which is specified by
+// |convert_values|), converts some values to a representation that
+// i18n_template.js will display.
+std::unique_ptr<base::Value> CopyAndMaybeConvert(const base::Value* value,
+                                                 bool convert_values) {
+  if (!convert_values)
+    return value->CreateDeepCopy();
+  const base::DictionaryValue* dict = NULL;
+  if (value->GetAsDictionary(&dict))
+    return DictionaryToJSONString(*dict);
+
+  std::unique_ptr<base::Value> copy = value->CreateDeepCopy();
+  base::ListValue* list = NULL;
+  if (copy->GetAsList(&list)) {
+    for (size_t i = 0; i < list->GetSize(); ++i) {
+      if (list->GetDictionary(i, &dict))
+        list->Set(i, DictionaryToJSONString(*dict));
+    }
+  }
+
+  return copy;
+}
+
+PolicyService* GetPolicyService(content::BrowserContext* context) {
+  return ProfilePolicyConnectorFactory::GetForBrowserContext(context)
+      ->policy_service();
+}
+
+// Inserts a description of each policy in |policy_map| into |values|, using
+// the optional errors in |errors| to determine the status of each policy. If
+// |convert_values| is true, converts the values to show them in javascript.
+
+void GetPolicyValues(const policy::PolicyMap& map,
+                     policy::PolicyErrorMap* errors,
+                     base::DictionaryValue* values,
+                     bool with_user_policies,
+                     bool convert_values) {
+  for (const auto& entry : map) {
+    if (entry.second.scope == policy::POLICY_SCOPE_USER && !with_user_policies)
+      continue;
+    std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
+    value->Set("value",
+               CopyAndMaybeConvert(entry.second.value.get(), convert_values));
+    if (entry.second.scope == policy::POLICY_SCOPE_USER)
+      value->SetString("scope", "user");
+    else
+      value->SetString("scope", "machine");
+    if (entry.second.level == policy::POLICY_LEVEL_RECOMMENDED)
+      value->SetString("level", "recommended");
+    else
+      value->SetString("level", "mandatory");
+    value->SetString("source", kPolicySources[entry.second.source].key);
+    base::string16 error = errors->GetErrors(entry.first);
+    if (!error.empty())
+      value->SetString("error", error);
+    values->SetWithoutPathExpansion(entry.first, std::move(value));
+  }
+}
+
+void GetChromePolicyValues(content::BrowserContext* context,
+                           base::DictionaryValue* values,
+                           bool keep_user_policies,
+                           bool convert_values) {
+  policy::PolicyService* policy_service = GetPolicyService(context);
+  policy::PolicyMap map;
+
+  // Make a copy that can be modified, since some policy values are modified
+  // before being displayed.
+  map.CopyFrom(policy_service->GetPolicies(
+      policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME, std::string())));
+
+  // Get a list of all the errors in the policy values.
+  const policy::ConfigurationPolicyHandlerList* handler_list =
+      g_browser_process->browser_policy_connector()->GetHandlerList();
+  policy::PolicyErrorMap errors;
+  handler_list->ApplyPolicySettings(map, NULL, &errors);
+
+  // Convert dictionary values to strings for display.
+  handler_list->PrepareForDisplaying(&map);
+
+  GetPolicyValues(map, &errors, values, keep_user_policies, convert_values);
+}
+
+}  // namespace
+
+std::unique_ptr<base::DictionaryValue> GetAllPolicyValuesAsDictionary(
+    content::BrowserContext* context,
+    bool with_user_policies,
+    bool convert_values) {
+  base::DictionaryValue all_policies;
+  if (!context)
+    return std::make_unique<base::DictionaryValue>(std::move(all_policies));
+
+  // Add Chrome policy values.
+  auto chrome_policies = std::make_unique<base::DictionaryValue>();
+  GetChromePolicyValues(context, chrome_policies.get(), with_user_policies,
+                        convert_values);
+  all_policies.Set("chromePolicies", std::move(chrome_policies));
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  // Add extension policy values.
+  extensions::ExtensionRegistry* registry =
+      extensions::ExtensionRegistry::Get(Profile::FromBrowserContext(context));
+  auto extension_values = std::make_unique<base::DictionaryValue>();
+
+  for (const scoped_refptr<const extensions::Extension>& extension :
+       registry->enabled_extensions()) {
+    // Skip this extension if it's not an enterprise extension.
+    if (!extension->manifest()->HasPath(
+            extensions::manifest_keys::kStorageManagedSchema))
+      continue;
+    auto extension_policies = std::make_unique<base::DictionaryValue>();
+    policy::PolicyNamespace policy_namespace = policy::PolicyNamespace(
+        policy::POLICY_DOMAIN_EXTENSIONS, extension->id());
+    policy::PolicyErrorMap empty_error_map;
+    GetPolicyValues(GetPolicyService(context)->GetPolicies(policy_namespace),
+                    &empty_error_map, extension_policies.get(),
+                    with_user_policies, convert_values);
+    extension_values->Set(extension->id(), std::move(extension_policies));
+  }
+  all_policies.Set("extensionPolicies", std::move(extension_values));
+#endif
+  return std::make_unique<base::DictionaryValue>(std::move(all_policies));
+}
+
+std::string GetAllPolicyValuesAsJSON(content::BrowserContext* context,
+                                     bool with_user_policies) {
+  std::unique_ptr<base::DictionaryValue> all_policies =
+      policy::GetAllPolicyValuesAsDictionary(context, with_user_policies,
+                                             false /* convert_values */);
+  return DictionaryToJSONString(*all_policies)->GetString();
+}
+
+}  // namespace policy
diff --git a/chrome/browser/policy/policy_conversions.h b/chrome/browser/policy/policy_conversions.h
new file mode 100644
index 0000000..cf6295a5
--- /dev/null
+++ b/chrome/browser/policy/policy_conversions.h
@@ -0,0 +1,32 @@
+// Copyright 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.
+
+#ifndef CHROME_BROWSER_POLICY_POLICY_CONVERSIONS_H_
+#define CHROME_BROWSER_POLICY_POLICY_CONVERSIONS_H_
+
+#include <memory>
+
+#include "base/values.h"
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace policy {
+// Returns a dictionary with the values of all set policies, with some values
+// converted to be shown in javascript, if it is specified.
+// |with_user_policies| governs if values with POLICY_SCOPE_USER are included.
+std::unique_ptr<base::DictionaryValue> GetAllPolicyValuesAsDictionary(
+    content::BrowserContext* context,
+    bool with_user_policies,
+    bool convert_values);
+
+// Returns a JSON with the values of all set policies.
+// |with_user_policies| governs if values with POLICY_SCOPE_USER are included.
+std::string GetAllPolicyValuesAsJSON(content::BrowserContext* context,
+                                     bool with_user_policies);
+
+}  // namespace policy
+
+#endif  // CHROME_BROWSER_POLICY_POLICY_CONVERSIONS_H_
diff --git a/chrome/browser/process_singleton_mac.mm b/chrome/browser/process_singleton_mac.mm
index 845ac41..7dfc5480 100644
--- a/chrome/browser/process_singleton_mac.mm
+++ b/chrome/browser/process_singleton_mac.mm
@@ -11,30 +11,38 @@
 
 namespace {
 
-// Forwards |event| to an already-running Chromium process.
+// Extracts the URL from |event| and forwards it to an already-running Chromium
+// process.
 OSErr HandleGURLEvent(const AppleEvent* event,
                       AppleEvent* reply,
                       SRefCon handler_refcon) {
-  // Forwarding the message without |kAENoReply| hangs us, so assume that a
-  // reply is unnecessary as an invariant.
-  DCHECK_EQ(reply->descriptorType, typeNull);
-
   pid_t forwarding_pid = *(reinterpret_cast<pid_t*>(handler_refcon));
   base::mac::ScopedAEDesc<> other_process_pid;
   // Create an address descriptor for the running process.
   AECreateDesc(typeKernelProcessID, &forwarding_pid, sizeof(forwarding_pid),
                other_process_pid.OutPointer());
 
-  // Change the event's address to the running process.
-  AppleEvent* event_copy = const_cast<AppleEvent*>(event);
-  if (AEPutAttributeDesc(event_copy, keyAddressAttr, other_process_pid) ==
-      noErr) {
-    // Send the message back out.
-    AESendMessage(event_copy, reply, kAENoReply, kNoTimeOut);
-    return noErr;
-  }
+  OSErr status = noErr;
+  base::mac::ScopedAEDesc<> event_copy;
+  status = AECreateAppleEvent(kInternetEventClass, kAEGetURL, other_process_pid,
+                              kAutoGenerateReturnID, kAnyTransactionID,
+                              event_copy.OutPointer());
+  if (status != noErr)
+    return status;
 
-  return noErr;
+  base::mac::ScopedAEDesc<> url;
+  // A GURL event's direct object is the URL as a descriptor with type
+  // TEXT.
+  status =
+      AEGetParamDesc(event, keyDirectObject, typeWildCard, url.OutPointer());
+  if (status != noErr)
+    return status;
+
+  status = AEPutParamDesc(event_copy.OutPointer(), keyDirectObject, url);
+  if (status != noErr)
+    return status;
+
+  return AESendMessage(event_copy, reply, kAENoReply, kNoTimeOut);
 }
 
 }  //  namespace
diff --git a/chrome/browser/ui/webui/policy_ui_handler.cc b/chrome/browser/ui/webui/policy_ui_handler.cc
index d834c87..ccfafe79 100644
--- a/chrome/browser/ui/webui/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -26,6 +26,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/download_prefs.h"
+#include "chrome/browser/policy/policy_conversions.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/policy/profile_policy_connector_factory.h"
 #include "chrome/browser/policy/schema_registry_service.h"
@@ -176,39 +177,6 @@
     dict->SetString("domain", gaia::ExtractDomainName(username));
 }
 
-// Utility function that returns a JSON serialization of the given |dict|.
-std::unique_ptr<base::Value> DictionaryToJSONString(
-    const base::DictionaryValue& dict) {
-  std::string json_string;
-  base::JSONWriter::WriteWithOptions(dict,
-                                     base::JSONWriter::OPTIONS_PRETTY_PRINT,
-                                     &json_string);
-  return std::make_unique<base::Value>(json_string);
-}
-
-// Returns a copy of |value|. If necessary (which is specified by
-// |convert_values|), converts some values to a representation that
-// i18n_template.js will display.
-std::unique_ptr<base::Value> CopyAndMaybeConvert(const base::Value* value,
-                                                 bool convert_values) {
-  if (!convert_values)
-    return value->CreateDeepCopy();
-  const base::DictionaryValue* dict = NULL;
-  if (value->GetAsDictionary(&dict))
-    return DictionaryToJSONString(*dict);
-
-  std::unique_ptr<base::Value> copy = value->CreateDeepCopy();
-  base::ListValue* list = NULL;
-  if (copy->GetAsList(&list)) {
-    for (size_t i = 0; i < list->GetSize(); ++i) {
-      if (list->GetDictionary(i, &dict))
-        list->Set(i, DictionaryToJSONString(*dict));
-    }
-  }
-
-  return copy;
-}
-
 }  // namespace
 
 // An interface for querying the status of a policy provider.  It surfaces
@@ -765,93 +733,15 @@
   web_ui()->CallJavascriptFunctionUnsafe("policy.Page.setPolicyNames", names);
 }
 
-std::unique_ptr<base::DictionaryValue> PolicyUIHandler::GetAllPolicyValues(
-    bool convert_values) const {
-  base::DictionaryValue all_policies;
-
-  // Add Chrome policy values.
-  auto chrome_policies = std::make_unique<base::DictionaryValue>();
-  GetChromePolicyValues(chrome_policies.get(), convert_values);
-  all_policies.Set("chromePolicies", std::move(chrome_policies));
-
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  // Add extension policy values.
-  extensions::ExtensionRegistry* registry =
-      extensions::ExtensionRegistry::Get(Profile::FromWebUI(web_ui()));
-  auto extension_values = std::make_unique<base::DictionaryValue>();
-
-  for (const scoped_refptr<const extensions::Extension>& extension :
-       registry->enabled_extensions()) {
-    // Skip this extension if it's not an enterprise extension.
-    if (!extension->manifest()->HasPath(
-        extensions::manifest_keys::kStorageManagedSchema))
-      continue;
-    auto extension_policies = std::make_unique<base::DictionaryValue>();
-    policy::PolicyNamespace policy_namespace = policy::PolicyNamespace(
-        policy::POLICY_DOMAIN_EXTENSIONS, extension->id());
-    policy::PolicyErrorMap empty_error_map;
-    GetPolicyValues(GetPolicyService()->GetPolicies(policy_namespace),
-                    &empty_error_map, extension_policies.get(), convert_values);
-    extension_values->Set(extension->id(), std::move(extension_policies));
-  }
-  all_policies.Set("extensionPolicies", std::move(extension_values));
-#endif
-  return std::make_unique<base::DictionaryValue>(std::move(all_policies));
-}
-
 void PolicyUIHandler::SendPolicyValues() const {
   std::unique_ptr<base::DictionaryValue> all_policies =
-      GetAllPolicyValues(true);
+      policy::GetAllPolicyValuesAsDictionary(
+          web_ui()->GetWebContents()->GetBrowserContext(),
+          true /* with_user_policies */, true /* convert_values */);
   web_ui()->CallJavascriptFunctionUnsafe("policy.Page.setPolicyValues",
                                          *all_policies);
 }
 
-void PolicyUIHandler::GetPolicyValues(const policy::PolicyMap& map,
-                                      policy::PolicyErrorMap* errors,
-                                      base::DictionaryValue* values,
-                                      bool convert_values) const {
-  for (const auto& entry : map) {
-    std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
-    value->Set("value",
-               CopyAndMaybeConvert(entry.second.value.get(), convert_values));
-    if (entry.second.scope == policy::POLICY_SCOPE_USER)
-      value->SetString("scope", "user");
-    else
-      value->SetString("scope", "machine");
-    if (entry.second.level == policy::POLICY_LEVEL_RECOMMENDED)
-      value->SetString("level", "recommended");
-    else
-      value->SetString("level", "mandatory");
-    value->SetString("source", kPolicySources[entry.second.source].key);
-    base::string16 error = errors->GetErrors(entry.first);
-    if (!error.empty())
-      value->SetString("error", error);
-    values->SetWithoutPathExpansion(entry.first, std::move(value));
-  }
-}
-
-void PolicyUIHandler::GetChromePolicyValues(base::DictionaryValue* values,
-                                            bool convert_values) const {
-  policy::PolicyService* policy_service = GetPolicyService();
-  policy::PolicyMap map;
-
-  // Make a copy that can be modified, since some policy values are modified
-  // before being displayed.
-  map.CopyFrom(policy_service->GetPolicies(
-      policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME, std::string())));
-
-  // Get a list of all the errors in the policy values.
-  const policy::ConfigurationPolicyHandlerList* handler_list =
-      g_browser_process->browser_policy_connector()->GetHandlerList();
-  policy::PolicyErrorMap errors;
-  handler_list->ApplyPolicySettings(map, NULL, &errors);
-
-  // Convert dictionary values to strings for display.
-  handler_list->PrepareForDisplaying(&map);
-
-  GetPolicyValues(map, &errors, values, convert_values);
-}
-
 void PolicyUIHandler::SendStatus() const {
   std::unique_ptr<base::DictionaryValue> device_status(
       new base::DictionaryValue);
@@ -909,10 +799,9 @@
 
 void PolicyUIHandler::WritePoliciesToJSONFile(
     const base::FilePath& path) const {
-  std::unique_ptr<base::DictionaryValue> all_policies =
-      GetAllPolicyValues(false);
-  std::string json_policies =
-      DictionaryToJSONString(*all_policies)->GetString();
+  std::string json_policies = policy::GetAllPolicyValuesAsJSON(
+      web_ui()->GetWebContents()->GetBrowserContext(),
+      true /* with_user_policies */);
 
   base::PostTaskWithTraits(
       FROM_HERE,
diff --git a/chrome/browser/ui/webui/policy_ui_handler.h b/chrome/browser/ui/webui/policy_ui_handler.h
index e181e422..a3f7e8c 100644
--- a/chrome/browser/ui/webui/policy_ui_handler.h
+++ b/chrome/browser/ui/webui/policy_ui_handler.h
@@ -98,22 +98,6 @@
   // information is sent.
   void SendStatus() const;
 
-  // Inserts a description of each policy in |policy_map| into |values|, using
-  // the optional errors in |errors| to determine the status of each policy. If
-  // |convert_values| is true, converts the values to show them in javascript.
-  void GetPolicyValues(const policy::PolicyMap& policy_map,
-                       policy::PolicyErrorMap* errors,
-                       base::DictionaryValue* values,
-                       bool convert_values) const;
-
-  // Returns a dictionary with the values of all set policies, with some values
-  // converted to be shown in javascript, if it is specified.
-  std::unique_ptr<base::DictionaryValue> GetAllPolicyValues(
-      bool convert_values) const;
-
-  void GetChromePolicyValues(base::DictionaryValue* values,
-                             bool convert_values) const;
-
   void WritePoliciesToJSONFile(const base::FilePath& path) const;
 
   void HandleInitialized(const base::ListValue* args);
diff --git a/chrome/common/crash_keys.cc b/chrome/common/crash_keys.cc
index 0e26e9e..e0c5c746 100644
--- a/chrome/common/crash_keys.cc
+++ b/chrome/common/crash_keys.cc
@@ -63,10 +63,6 @@
     {kShutdownType, kSmallSize},
     {kBrowserUnpinTrace, kMediumSize},
 
-    // content/:
-    {"discardable-memory-allocated", kSmallSize},
-    {"discardable-memory-free", kSmallSize},
-    {"total-discardable-memory-allocated", kSmallSize},
     {kViewCount, kSmallSize},
 
     // sandbox/:
diff --git a/chrome/renderer/net/OWNERS b/chrome/renderer/net/OWNERS
index 5ca5854..64d7be95 100644
--- a/chrome/renderer/net/OWNERS
+++ b/chrome/renderer/net/OWNERS
@@ -1,4 +1,3 @@
-jar@chromium.org
 mmenke@chromium.org
 juliatuttle@chromium.org
 
diff --git a/chrome/test/chromedriver/net/adb_client_socket.cc b/chrome/test/chromedriver/net/adb_client_socket.cc
index 448378f..68e8dae 100644
--- a/chrome/test/chromedriver/net/adb_client_socket.cc
+++ b/chrome/test/chromedriver/net/adb_client_socket.cc
@@ -18,6 +18,7 @@
 #include "net/base/net_errors.h"
 #include "net/log/net_log_source.h"
 #include "net/socket/tcp_client_socket.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "third_party/WebKit/public/public_features.h"
 
 namespace {
@@ -150,9 +151,9 @@
         new net::StringIOBuffer(request_);
 
     result = socket_->Write(
-        request_buffer.get(),
-        request_buffer->size(),
-        base::Bind(&HttpOverAdbSocket::ReadResponse, base::Unretained(this)));
+        request_buffer.get(), request_buffer->size(),
+        base::Bind(&HttpOverAdbSocket::ReadResponse, base::Unretained(this)),
+        TRAFFIC_ANNOTATION_FOR_TESTS);
     if (result != net::ERR_IO_PENDING)
       ReadResponse(result);
   }
@@ -408,8 +409,8 @@
 
     scoped_refptr<net::StringIOBuffer> request_buffer =
         new net::StringIOBuffer(buffer);
-    int result =
-        socket_->Write(request_buffer.get(), request_buffer->size(), callback);
+    int result = socket_->Write(request_buffer.get(), request_buffer->size(),
+                                callback, TRAFFIC_ANNOTATION_FOR_TESTS);
     if (result != net::ERR_IO_PENDING)
       callback.Run(result);
   }
@@ -527,13 +528,11 @@
                                   const CommandCallback& callback) {
   scoped_refptr<net::StringIOBuffer> request_buffer =
       new net::StringIOBuffer(EncodeMessage(command));
-  int result = socket_->Write(request_buffer.get(),
-                              request_buffer->size(),
-                              base::Bind(&AdbClientSocket::ReadResponse,
-                                         base::Unretained(this),
-                                         callback,
-                                         is_void,
-                                         has_length));
+  int result = socket_->Write(
+      request_buffer.get(), request_buffer->size(),
+      base::Bind(&AdbClientSocket::ReadResponse, base::Unretained(this),
+                 callback, is_void, has_length),
+      TRAFFIC_ANNOTATION_FOR_TESTS);
   if (result != net::ERR_IO_PENDING)
     ReadResponse(callback, is_void, has_length, result);
 }
diff --git a/chromecast/crash/cast_crash_keys.cc b/chromecast/crash/cast_crash_keys.cc
index d855a041..e253489 100644
--- a/chromecast/crash/cast_crash_keys.cc
+++ b/chromecast/crash/cast_crash_keys.cc
@@ -32,10 +32,6 @@
       {"shutdown-type", ::crash_keys::kSmallSize},
       {"browser-unpin-trace", ::crash_keys::kMediumSize},
 
-      // content/:
-      {"discardable-memory-allocated", ::crash_keys::kSmallSize},
-      {"discardable-memory-free", ::crash_keys::kSmallSize},
-      {"total-discardable-memory-allocated", ::crash_keys::kSmallSize},
       {"view-count", ::crash_keys::kSmallSize},
 
       // media/:
diff --git a/chromecast/net/BUILD.gn b/chromecast/net/BUILD.gn
index f6c3ae0f..313e313 100644
--- a/chromecast/net/BUILD.gn
+++ b/chromecast/net/BUILD.gn
@@ -67,6 +67,7 @@
     "//base",
     "//base/test:run_all_unittests",
     "//net",
+    "//net:test_support",
     "//testing/gtest",
   ]
 }
diff --git a/chromecast/net/fake_stream_socket.h b/chromecast/net/fake_stream_socket.h
index 658d916..496496a 100644
--- a/chromecast/net/fake_stream_socket.h
+++ b/chromecast/net/fake_stream_socket.h
@@ -31,12 +31,11 @@
   int Read(net::IOBuffer* buf,
            int buf_len,
            const net::CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
-  int Write(net::IOBuffer* buf,
-            int buf_len,
-            const net::CompletionCallback& callback,
-            const net::NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+  int Write(
+      net::IOBuffer* buf,
+      int buf_len,
+      const net::CompletionCallback& callback,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
   int Connect(const net::CompletionCallback& callback) override;
diff --git a/chromecast/net/fake_stream_socket_unittest.cc b/chromecast/net/fake_stream_socket_unittest.cc
index 77ed216..10357f1 100644
--- a/chromecast/net/fake_stream_socket_unittest.cc
+++ b/chromecast/net/fake_stream_socket_unittest.cc
@@ -14,6 +14,7 @@
 #include "net/base/io_buffer.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromecast {
@@ -74,7 +75,8 @@
   EXPECT_EQ(net::ERR_IO_PENDING,
             socket_1_.Read(io_buffer.get(), 1, base::Bind(&Callback)));
   EXPECT_EQ(net::ERR_SOCKET_NOT_CONNECTED,
-            socket_1_.Write(io_buffer.get(), 1, base::Bind(&Callback)));
+            socket_1_.Write(io_buffer.get(), 1, base::Bind(&Callback),
+                            TRAFFIC_ANNOTATION_FOR_TESTS));
 }
 
 TEST_F(FakeStreamSocketTest, ReadAndWriteWithPeer) {
@@ -85,7 +87,8 @@
       new net::StringIOBuffer(kData));
   ASSERT_EQ(
       static_cast<int>(kData.size()),
-      socket_1_.Write(send_buffer.get(), kData.size(), base::Bind(&Callback)));
+      socket_1_.Write(send_buffer.get(), kData.size(), base::Bind(&Callback),
+                      TRAFFIC_ANNOTATION_FOR_TESTS));
   scoped_refptr<net::IOBuffer> receive_buffer(new net::IOBuffer(kData.size()));
   ASSERT_EQ(static_cast<int>(kData.size()),
             socket_2_.Read(receive_buffer.get(), kData.size(),
@@ -105,7 +108,8 @@
       new net::StringIOBuffer(kData));
   ASSERT_EQ(
       static_cast<int>(kData.size()),
-      socket_1_.Write(send_buffer.get(), kData.size(), base::Bind(&Callback)));
+      socket_1_.Write(send_buffer.get(), kData.size(), base::Bind(&Callback),
+                      TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(0, std::memcmp(kData.data(), receive_buffer->data(), kData.size()));
 }
 
@@ -118,9 +122,10 @@
       new net::StringIOBuffer(kData));
   const int kWriteCount = 1024 * 1024 / kData.size();
   for (int i = 0; i < kWriteCount; i++) {
-    ASSERT_EQ(static_cast<int>(kData.size()),
-              socket_1_.Write(send_buffer.get(), kData.size(),
-                              base::Bind(&Callback)));
+    ASSERT_EQ(
+        static_cast<int>(kData.size()),
+        socket_1_.Write(send_buffer.get(), kData.size(), base::Bind(&Callback),
+                        TRAFFIC_ANNOTATION_FOR_TESTS));
   }
   scoped_refptr<net::IOBuffer> receive_buffer(new net::IOBuffer(1024));
   for (int i = 0; i < 1024; i++) {
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index 941cf63..f90aaa7 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -50,6 +50,8 @@
     "rotation_lock/arc_rotation_lock_bridge.h",
     "storage_manager/arc_storage_manager.cc",
     "storage_manager/arc_storage_manager.h",
+    "usb/usb_host_bridge.cc",
+    "usb/usb_host_bridge.h",
     "volume_mounter/arc_volume_mounter_bridge.cc",
     "volume_mounter/arc_volume_mounter_bridge.h",
   ]
@@ -75,7 +77,11 @@
     "//components/url_formatter",
     "//components/user_manager",
     "//content/public/common",
+    "//device/base",
     "//device/bluetooth",
+    "//device/usb",
+    "//device/usb/mojo",
+    "//device/usb/public/interfaces",
     "//google_apis",
     "//mojo/edk/system",
     "//services/device/public/interfaces",
diff --git a/components/arc/arc_bridge_host_impl.cc b/components/arc/arc_bridge_host_impl.cc
index 17a6f0e..eb7aaae 100644
--- a/components/arc/arc_bridge_host_impl.cc
+++ b/components/arc/arc_bridge_host_impl.cc
@@ -248,6 +248,11 @@
   OnInstanceReady(arc_bridge_service_->tts(), std::move(tts_ptr));
 }
 
+void ArcBridgeHostImpl::OnUsbHostInstanceReady(
+    mojom::UsbHostInstancePtr usb_host_ptr) {
+  OnInstanceReady(arc_bridge_service_->usb_host(), std::move(usb_host_ptr));
+}
+
 void ArcBridgeHostImpl::OnVideoInstanceReady(
     mojom::VideoInstancePtr video_ptr) {
   OnInstanceReady(arc_bridge_service_->video(), std::move(video_ptr));
diff --git a/components/arc/arc_bridge_host_impl.h b/components/arc/arc_bridge_host_impl.h
index 604aedb..0a7374a 100644
--- a/components/arc/arc_bridge_host_impl.h
+++ b/components/arc/arc_bridge_host_impl.h
@@ -86,6 +86,7 @@
       mojom::StorageManagerInstancePtr storage_manager_ptr) override;
   void OnTracingInstanceReady(mojom::TracingInstancePtr trace_ptr) override;
   void OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) override;
+  void OnUsbHostInstanceReady(mojom::UsbHostInstancePtr usb_host_ptr) override;
   void OnVideoInstanceReady(mojom::VideoInstancePtr video_ptr) override;
   void OnVoiceInteractionArcHomeInstanceReady(
       mojom::VoiceInteractionArcHomeInstancePtr home_ptr) override;
diff --git a/components/arc/arc_bridge_service.h b/components/arc/arc_bridge_service.h
index 50aef34..6cfd090 100644
--- a/components/arc/arc_bridge_service.h
+++ b/components/arc/arc_bridge_service.h
@@ -69,6 +69,8 @@
 class TracingInstance;
 class TtsHost;
 class TtsInstance;
+class UsbHostHost;
+class UsbHostInstance;
 class VideoHost;
 class VideoInstance;
 class VoiceInteractionArcHomeHost;
@@ -184,6 +186,9 @@
   }
   ConnectionHolder<mojom::TracingInstance>* tracing() { return &tracing_; }
   ConnectionHolder<mojom::TtsInstance, mojom::TtsHost>* tts() { return &tts_; }
+  ConnectionHolder<mojom::UsbHostInstance, mojom::UsbHostHost>* usb_host() {
+    return &usb_host_;
+  }
   ConnectionHolder<mojom::VideoInstance, mojom::VideoHost>* video() {
     return &video_;
   }
@@ -247,6 +252,7 @@
   ConnectionHolder<mojom::StorageManagerInstance> storage_manager_;
   ConnectionHolder<mojom::TracingInstance> tracing_;
   ConnectionHolder<mojom::TtsInstance, mojom::TtsHost> tts_;
+  ConnectionHolder<mojom::UsbHostInstance, mojom::UsbHostHost> usb_host_;
   ConnectionHolder<mojom::VideoInstance, mojom::VideoHost> video_;
   ConnectionHolder<mojom::VoiceInteractionArcHomeInstance,
                    mojom::VoiceInteractionArcHomeHost>
diff --git a/components/arc/common/BUILD.gn b/components/arc/common/BUILD.gn
index 4cab264..ffd8c52 100644
--- a/components/arc/common/BUILD.gn
+++ b/components/arc/common/BUILD.gn
@@ -46,6 +46,7 @@
       "storage_manager.mojom",
       "tracing.mojom",
       "tts.mojom",
+      "usb_host.mojom",
       "voice_interaction_arc_home.mojom",
       "voice_interaction_framework.mojom",
       "volume_mounter.mojom",
diff --git a/components/arc/common/arc_bridge.mojom b/components/arc/common/arc_bridge.mojom
index 297c99a..c779b381 100644
--- a/components/arc/common/arc_bridge.mojom
+++ b/components/arc/common/arc_bridge.mojom
@@ -35,15 +35,16 @@
 import "storage_manager.mojom";
 import "tracing.mojom";
 import "tts.mojom";
+import "usb_host.mojom";
 import "video.mojom";
 import "voice_interaction_arc_home.mojom";
 import "voice_interaction_framework.mojom";
 import "volume_mounter.mojom";
 import "wallpaper.mojom";
 
-// Next MinVersion: 34
+// Next MinVersion: 35
 // Deprecated method IDs: 101, 105
-// Next method ID: 139
+// Next method ID: 140
 interface ArcBridgeHost {
   // Keep the entries alphabetical. In order to do so without breaking
   // compatibility with the ARC instance, explicitly assign each interface a
@@ -150,6 +151,9 @@
   // Notifies Chrome that the TtsInstance interface is ready.
   [MinVersion=17] OnTtsInstanceReady@123(TtsInstance instance_ptr);
 
+  // Notifies Chrome that the UsbHostInstance interface is ready.
+  [MinVersion=34] OnUsbHostInstanceReady@139(UsbHostInstance instance_ptr);
+
   // Notifies Chrome that the VideoInstance interface is ready.
   [MinVersion=6] OnVideoInstanceReady@107(VideoInstance instance_ptr);
 
diff --git a/components/arc/common/usb_host.mojom b/components/arc/common/usb_host.mojom
new file mode 100644
index 0000000..abdeac8
--- /dev/null
+++ b/components/arc/common/usb_host.mojom
@@ -0,0 +1,44 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Next MinVersion: 1
+module arc.mojom;
+
+// re-use device.mojom.UsbDeviceInfo
+import "device/usb/public/interfaces/device.mojom";
+
+// Next method ID: 3
+interface UsbHostHost {
+  // Tries the open the USB device node for the device named 'guid'
+  // and returns an open file descriptor to this node.
+  // You need to have previously called RequestPermission for this 'guid'
+  // else this call will fail.
+  OpenDevice@0(string guid) => (handle usb_fd);
+
+  // Returns the USB device descriptors for the device named 'guid'.
+  GetDeviceInfo@1(string guid) => (string device_name,
+                                   device.mojom.UsbDeviceInfo info);
+
+  // Asks for the permission to access the USB device called 'guid',
+  // if 'guid' is an empty string, requests the permission to list USB devices
+  // instead.
+  // if the permission hasn't successfully obtained in the past, this will
+  // trigger a UI pop-up requesting the user authorization on the behalf of
+  // the package 'pkg_name' if 'interactive' is set to true, or fail
+  // immediately.
+  RequestPermission@2(string guid, string pkg_name, bool interactive)
+      => (bool authorized);
+};
+
+// Next method ID: 3
+interface UsbHostInstance {
+  // Establishes full-duplex communication with the host.
+  Init@0(UsbHostHost host_ptr) => ();
+
+  // Notifies the instance of a new USB device.
+  OnDeviceAdded@1(string guid);
+
+  // Notifies the instance of the removal of a USB device.
+  OnDeviceRemoved@2(string guid);
+};
diff --git a/components/arc/test/fake_arc_bridge_host.cc b/components/arc/test/fake_arc_bridge_host.cc
index e3d39bd..148f5c22 100644
--- a/components/arc/test/fake_arc_bridge_host.cc
+++ b/components/arc/test/fake_arc_bridge_host.cc
@@ -98,6 +98,9 @@
 
 void FakeArcBridgeHost::OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) {}
 
+void FakeArcBridgeHost::OnUsbHostInstanceReady(
+    mojom::UsbHostInstancePtr usb_ptr) {}
+
 void FakeArcBridgeHost::OnVideoInstanceReady(
     mojom::VideoInstancePtr video_ptr) {}
 
diff --git a/components/arc/test/fake_arc_bridge_host.h b/components/arc/test/fake_arc_bridge_host.h
index d8ca679..cce1ad2b 100644
--- a/components/arc/test/fake_arc_bridge_host.h
+++ b/components/arc/test/fake_arc_bridge_host.h
@@ -64,6 +64,7 @@
       mojom::StorageManagerInstancePtr storage_manager_ptr) override;
   void OnTracingInstanceReady(mojom::TracingInstancePtr trace_ptr) override;
   void OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) override;
+  void OnUsbHostInstanceReady(mojom::UsbHostInstancePtr usb_ptr) override;
   void OnVideoInstanceReady(mojom::VideoInstancePtr video_ptr) override;
   void OnVoiceInteractionArcHomeInstanceReady(
       mojom::VoiceInteractionArcHomeInstancePtr home_ptr) override;
diff --git a/components/arc/usb/DEPS b/components/arc/usb/DEPS
new file mode 100644
index 0000000..1c02ffb
--- /dev/null
+++ b/components/arc/usb/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+device/base",
+  "+device/usb",
+]
diff --git a/components/arc/usb/usb_host_bridge.cc b/components/arc/usb/usb_host_bridge.cc
new file mode 100644
index 0000000..5da8a8f
--- /dev/null
+++ b/components/arc/usb/usb_host_bridge.cc
@@ -0,0 +1,259 @@
+// Copyright 2017 The Chromium Authors. 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/arc/usb/usb_host_bridge.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/memory/singleton.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/permission_broker_client.h"
+#include "components/arc/arc_bridge_service.h"
+#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
+#include "device/base/device_client.h"
+#include "device/usb/mojo/type_converters.h"
+#include "device/usb/usb_device_handle.h"
+#include "device/usb/usb_device_linux.h"
+#include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/scoped_platform_handle.h"
+
+namespace arc {
+namespace {
+
+// Singleton factory for ArcUsbHostBridge
+class ArcUsbHostBridgeFactory
+    : public internal::ArcBrowserContextKeyedServiceFactoryBase<
+          ArcUsbHostBridge,
+          ArcUsbHostBridgeFactory> {
+ public:
+  // Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
+  static constexpr const char* kName = "ArcUsbHostBridgeFactory";
+
+  static ArcUsbHostBridgeFactory* GetInstance() {
+    return base::Singleton<ArcUsbHostBridgeFactory>::get();
+  }
+
+ private:
+  friend base::DefaultSingletonTraits<ArcUsbHostBridgeFactory>;
+  ArcUsbHostBridgeFactory() = default;
+  ~ArcUsbHostBridgeFactory() override = default;
+};
+
+void OnDeviceOpened(mojom::UsbHostHost::OpenDeviceCallback callback,
+                    base::ScopedFD fd) {
+  if (!fd.is_valid()) {
+    LOG(ERROR) << "Invalid USB device FD";
+    std::move(callback).Run(mojo::ScopedHandle());
+    return;
+  }
+  mojo::edk::ScopedPlatformHandle platform_handle{
+      mojo::edk::PlatformHandle(fd.release())};
+  MojoHandle wrapped_handle;
+  MojoResult wrap_result = mojo::edk::CreatePlatformHandleWrapper(
+      std::move(platform_handle), &wrapped_handle);
+  if (wrap_result != MOJO_RESULT_OK) {
+    LOG(ERROR) << "Failed to wrap device FD. Closing: " << wrap_result;
+    std::move(callback).Run(mojo::ScopedHandle());
+    return;
+  }
+  mojo::ScopedHandle scoped_handle{mojo::Handle(wrapped_handle)};
+  std::move(callback).Run(std::move(scoped_handle));
+}
+
+void OnDeviceOpenError(mojom::UsbHostHost::OpenDeviceCallback callback,
+                       const std::string& error_name,
+                       const std::string& error_message) {
+  LOG(WARNING) << "Cannot open USB device: " << error_name << ": "
+               << error_message;
+  std::move(callback).Run(mojo::ScopedHandle());
+}
+
+using CheckedCallback =
+    base::RepeatingCallback<void(const std::string& guid, bool success)>;
+
+void OnGetDevicesComplete(
+    const CheckedCallback& callback,
+    const std::vector<scoped_refptr<device::UsbDevice>>& devices) {
+  for (const scoped_refptr<device::UsbDevice>& device : devices)
+    device->CheckUsbAccess(base::BindOnce(callback, device.get()->guid()));
+}
+
+}  // namespace
+
+ArcUsbHostBridge* ArcUsbHostBridge::GetForBrowserContext(
+    content::BrowserContext* context) {
+  return ArcUsbHostBridgeFactory::GetForBrowserContext(context);
+}
+
+ArcUsbHostBridge::ArcUsbHostBridge(content::BrowserContext* context,
+                                   ArcBridgeService* bridge_service)
+    : arc_bridge_service_(bridge_service),
+      usb_observer_(this),
+      weak_factory_(this) {
+  arc_bridge_service_->usb_host()->SetHost(this);
+  arc_bridge_service_->usb_host()->AddObserver(this);
+
+  usb_service_ = device::DeviceClient::Get()->GetUsbService();
+  if (usb_service_)
+    usb_observer_.Add(usb_service_);
+}
+
+ArcUsbHostBridge::~ArcUsbHostBridge() {
+  if (usb_service_)
+    usb_service_->RemoveObserver(this);
+  arc_bridge_service_->usb_host()->RemoveObserver(this);
+  arc_bridge_service_->usb_host()->SetHost(nullptr);
+}
+
+void ArcUsbHostBridge::RequestPermission(const std::string& guid,
+                                         const std::string& package,
+                                         bool interactive,
+                                         RequestPermissionCallback callback) {
+  VLOG(2) << "USB RequestPermission " << guid << " package " << package;
+  // Permission already requested.
+  if (HasPermissionForDevice(guid)) {
+    std::move(callback).Run(true);
+    return;
+  }
+
+  // The other side was just checking, fail without asking the user.
+  if (!interactive) {
+    std::move(callback).Run(false);
+    return;
+  }
+
+  // Ask the authorization from the user.
+  DoRequestUserAuthorization(guid, package, std::move(callback));
+}
+
+void ArcUsbHostBridge::OpenDevice(const std::string& guid,
+                                  OpenDeviceCallback callback) {
+  if (!usb_service_) {
+    std::move(callback).Run(mojo::ScopedHandle());
+    return;
+  }
+
+  device::UsbDeviceLinux* device =
+      static_cast<device::UsbDeviceLinux*>(usb_service_->GetDevice(guid).get());
+  if (!device) {
+    std::move(callback).Run(mojo::ScopedHandle());
+    return;
+  }
+
+  // The RequestPermission was never done, abort.
+  if (!HasPermissionForDevice(guid)) {
+    std::move(callback).Run(mojo::ScopedHandle());
+    return;
+  }
+
+  chromeos::PermissionBrokerClient* client =
+      chromeos::DBusThreadManager::Get()->GetPermissionBrokerClient();
+  DCHECK(client) << "Could not get permission broker client.";
+  auto repeating_callback =
+      base::AdaptCallbackForRepeating(std::move(callback));
+  client->OpenPath(device->device_path(),
+                   base::Bind(&OnDeviceOpened, repeating_callback),
+                   base::Bind(&OnDeviceOpenError, repeating_callback));
+}
+
+void ArcUsbHostBridge::GetDeviceInfo(const std::string& guid,
+                                     GetDeviceInfoCallback callback) {
+  if (!usb_service_) {
+    std::move(callback).Run(std::string(), nullptr);
+    return;
+  }
+  scoped_refptr<device::UsbDevice> device = usb_service_->GetDevice(guid);
+  if (!device.get()) {
+    LOG(WARNING) << "Unknown USB device " << guid;
+    std::move(callback).Run(std::string(), nullptr);
+    return;
+  }
+
+  device::mojom::UsbDeviceInfoPtr info =
+      device::mojom::UsbDeviceInfo::From(*device);
+  // b/69295049 the other side doesn't like optional strings.
+  for (const device::mojom::UsbConfigurationInfoPtr& cfg :
+       info->configurations) {
+    cfg->configuration_name =
+        cfg->configuration_name.value_or(base::string16());
+    for (const device::mojom::UsbInterfaceInfoPtr& iface : cfg->interfaces) {
+      for (const device::mojom::UsbAlternateInterfaceInfoPtr& alt :
+           iface->alternates) {
+        alt->interface_name = alt->interface_name.value_or(base::string16());
+      }
+    }
+  }
+
+  std::string path =
+      static_cast<device::UsbDeviceLinux*>(device.get())->device_path();
+
+  std::move(callback).Run(path, std::move(info));
+}
+
+// device::UsbService::Observer callbacks.
+
+void ArcUsbHostBridge::OnDeviceAdded(scoped_refptr<device::UsbDevice> device) {
+  device->CheckUsbAccess(base::BindOnce(&ArcUsbHostBridge::OnDeviceChecked,
+                                        weak_factory_.GetWeakPtr(),
+                                        device.get()->guid()));
+}
+
+void ArcUsbHostBridge::OnDeviceRemoved(
+    scoped_refptr<device::UsbDevice> device) {
+  mojom::UsbHostInstance* usb_host_instance = ARC_GET_INSTANCE_FOR_METHOD(
+      arc_bridge_service_->usb_host(), OnDeviceAdded);
+
+  if (!usb_host_instance) {
+    VLOG(2) << "UsbInstance not ready yet";
+    return;
+  }
+
+  usb_host_instance->OnDeviceRemoved(device.get()->guid());
+}
+
+// Notifies the observer that the UsbService it depends on is shutting down.
+void ArcUsbHostBridge::WillDestroyUsbService() {
+  // Disconnect.
+  arc_bridge_service_->usb_host()->SetHost(nullptr);
+}
+
+void ArcUsbHostBridge::OnConnectionReady() {
+  if (!usb_service_)
+    return;
+  // Send the (filtered) list of already existing USB devices to the other side.
+  usb_service_->GetDevices(
+      base::Bind(&OnGetDevicesComplete,
+                 base::BindRepeating(&ArcUsbHostBridge::OnDeviceChecked,
+                                     weak_factory_.GetWeakPtr())));
+}
+
+void ArcUsbHostBridge::OnDeviceChecked(const std::string& guid, bool allowed) {
+  if (!allowed)
+    return;
+
+  mojom::UsbHostInstance* usb_host_instance = ARC_GET_INSTANCE_FOR_METHOD(
+      arc_bridge_service_->usb_host(), OnDeviceAdded);
+
+  if (!usb_host_instance)
+    return;
+
+  usb_host_instance->OnDeviceAdded(guid);
+}
+
+void ArcUsbHostBridge::DoRequestUserAuthorization(
+    const std::string& guid,
+    const std::string& package,
+    RequestPermissionCallback callback) {
+  // TODO: implement the UI dialog
+  // fail close for now
+  std::move(callback).Run(false);
+}
+
+bool ArcUsbHostBridge::HasPermissionForDevice(const std::string& guid) {
+  // TODO: implement permission settings
+  // fail close for now
+  return false;
+}
+
+}  // namespace arc
diff --git a/components/arc/usb/usb_host_bridge.h b/components/arc/usb/usb_host_bridge.h
new file mode 100644
index 0000000..8d9f8fd
--- /dev/null
+++ b/components/arc/usb/usb_host_bridge.h
@@ -0,0 +1,85 @@
+// Copyright 2017 The Chromium 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_ARC_USB_USB_HOST_BRIDGE_H_
+#define COMPONENTS_ARC_USB_USB_HOST_BRIDGE_H_
+
+#include <string>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "base/scoped_observer.h"
+#include "components/arc/common/usb_host.mojom.h"
+#include "components/arc/connection_observer.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "device/usb/public/interfaces/device_manager.mojom.h"
+#include "device/usb/usb_device.h"
+#include "device/usb/usb_service.h"
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace arc {
+
+class ArcBridgeService;
+
+// Private implementation of UsbHostHost.
+class ArcUsbHostBridge : public KeyedService,
+                         public ConnectionObserver<mojom::UsbHostInstance>,
+                         public device::UsbService::Observer,
+                         public mojom::UsbHostHost {
+ public:
+  // Returns singleton instance for the given BrowserContext,
+  // or nullptr if the browser |context| is not allowed to use ARC.
+  static ArcUsbHostBridge* GetForBrowserContext(
+      content::BrowserContext* context);
+
+  // The constructor will register an Observer with ArcBridgeService.
+  explicit ArcUsbHostBridge(content::BrowserContext* context,
+                            ArcBridgeService* bridge_service);
+  ~ArcUsbHostBridge() override;
+
+  // mojom::UsbHostHost overrides:
+  void RequestPermission(const std::string& guid,
+                         const std::string& package,
+                         bool interactive,
+                         RequestPermissionCallback callback) override;
+  void OpenDevice(const std::string& guid,
+                  OpenDeviceCallback callback) override;
+  void GetDeviceInfo(const std::string& guid,
+                     GetDeviceInfoCallback callback) override;
+
+  // device::UsbService::Observer overrides:
+  void OnDeviceAdded(scoped_refptr<device::UsbDevice> device) override;
+  void OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) override;
+  void WillDestroyUsbService() override;
+
+  // ConnectionObserver<mojom::UsbHostInstance> overrides:
+  void OnConnectionReady() override;
+
+ private:
+  void OnDeviceChecked(const std::string& guid, bool allowed);
+  void DoRequestUserAuthorization(const std::string& guid,
+                                  const std::string& package,
+                                  RequestPermissionCallback callback);
+  bool HasPermissionForDevice(const std::string& guid);
+
+  ArcBridgeService* const arc_bridge_service_;  // Owned by ArcServiceManager.
+  mojom::UsbHostHostPtr usb_host_ptr_;
+  ScopedObserver<device::UsbService, device::UsbService::Observer>
+      usb_observer_;
+  device::UsbService* usb_service_;
+
+  // WeakPtrFactory to use for callbacks.
+  base::WeakPtrFactory<ArcUsbHostBridge> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcUsbHostBridge);
+};
+
+}  // namespace arc
+
+#endif  // COMPONENTS_ARC_USB_USB_HOST_BRIDGE_H_
diff --git a/components/autofill/core/browser/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/credit_card_save_manager_unittest.cc
index 38272c8..11d47e9 100644
--- a/components/autofill/core/browser/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/credit_card_save_manager_unittest.cc
@@ -1575,7 +1575,7 @@
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(3 /* num_fillable_forms_parsed */);
 
-  // Edit the data, but don't include a name, and submit.
+  // Edit the data and submit.
   credit_card_form.fields[0].value = ASCIIToUTF16("Flo Master");
   credit_card_form.fields[1].value = ASCIIToUTF16("4111111111111111");
   credit_card_form.fields[2].value = ASCIIToUTF16("11");
@@ -1619,7 +1619,7 @@
   CreateTestCreditCardFormData(&credit_card_form, true, false);
   FormsSeen({credit_card_form});
 
-  // Edit the data, but don't include a name, and submit.
+  // Edit the data and submit.
   credit_card_form.fields[0].value = ASCIIToUTF16("Flo Master");
   credit_card_form.fields[1].value = ASCIIToUTF16("4111111111111111");
   credit_card_form.fields[2].value = ASCIIToUTF16("11");
@@ -1663,7 +1663,7 @@
   CreateTestCreditCardFormData(&credit_card_form, true, false);
   FormsSeen({credit_card_form});
 
-  // Edit the data, but don't include a name, and submit.
+  // Edit the data and submit.
   credit_card_form.fields[0].value = ASCIIToUTF16("Flo Master");
   credit_card_form.fields[1].value = ASCIIToUTF16("4111111111111111");
   credit_card_form.fields[2].value = ASCIIToUTF16("11");
@@ -1710,7 +1710,7 @@
   CreateTestCreditCardFormData(&credit_card_form, true, false);
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
-  // Edit the data, but don't include a name, and submit.
+  // Edit the data and submit.
   credit_card_form.fields[0].value = ASCIIToUTF16("Flo Master");
   credit_card_form.fields[1].value = ASCIIToUTF16("4111111111111111");
   credit_card_form.fields[2].value = ASCIIToUTF16("11");
diff --git a/components/certificate_transparency/single_tree_tracker_unittest.cc b/components/certificate_transparency/single_tree_tracker_unittest.cc
index 95f3e2f..59ba2af 100644
--- a/components/certificate_transparency/single_tree_tracker_unittest.cc
+++ b/components/certificate_transparency/single_tree_tracker_unittest.cc
@@ -174,10 +174,9 @@
                    const std::string& hostname,
                    net::HostCache::Entry::Source source,
                    base::TimeDelta ttl) {
-  CHECK(cache);
-  const net::HostCache::Key key(hostname, net::ADDRESS_FAMILY_UNSPECIFIED, 0);
-  const net::HostCache::Entry entry(net::OK, net::AddressList(), source);
-  cache->Set(key, entry, base::TimeTicks::Now(), ttl);
+  cache->Set(net::HostCache::Key(hostname, net::ADDRESS_FAMILY_UNSPECIFIED, 0),
+             net::HostCache::Entry(net::OK, net::AddressList(), source),
+             base::TimeTicks::Now(), ttl);
 }
 
 }  // namespace
diff --git a/components/discardable_memory/DEPS b/components/discardable_memory/DEPS
index 093b1d9..6d3523e 100644
--- a/components/discardable_memory/DEPS
+++ b/components/discardable_memory/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
+  "+components/crash/core/common/crash_key.h",
   "+mojo/public/cpp",
 ]
diff --git a/components/discardable_memory/client/BUILD.gn b/components/discardable_memory/client/BUILD.gn
index 8cf73572..ecf93c2 100644
--- a/components/discardable_memory/client/BUILD.gn
+++ b/components/discardable_memory/client/BUILD.gn
@@ -16,6 +16,7 @@
 
   deps = [
     "//base",
+    "//components/crash/core/common:crash_key",
     "//components/discardable_memory/common",
     "//components/discardable_memory/public/interfaces",
   ]
diff --git a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
index a078874..245bfe4 100644
--- a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
+++ b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
@@ -11,7 +11,6 @@
 
 #include "base/atomic_sequence_num.h"
 #include "base/bind.h"
-#include "base/debug/crash_logging.h"
 #include "base/macros.h"
 #include "base/memory/discardable_memory.h"
 #include "base/memory/discardable_shared_memory.h"
@@ -25,6 +24,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/trace_event.h"
+#include "components/crash/core/common/crash_key.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 
 namespace discardable_memory {
@@ -410,14 +410,13 @@
 void ClientDiscardableSharedMemoryManager::MemoryUsageChanged(
     size_t new_bytes_total,
     size_t new_bytes_free) const {
-  static const char kDiscardableMemoryAllocatedKey[] =
-      "discardable-memory-allocated";
-  base::debug::SetCrashKeyValue(kDiscardableMemoryAllocatedKey,
-                                base::NumberToString(new_bytes_total));
+  static crash_reporter::CrashKeyString<24> discardable_memory_allocated(
+      "discardable-memory-allocated");
+  discardable_memory_allocated.Set(base::NumberToString(new_bytes_total));
 
-  static const char kDiscardableMemoryFreeKey[] = "discardable-memory-free";
-  base::debug::SetCrashKeyValue(kDiscardableMemoryFreeKey,
-                                base::NumberToString(new_bytes_free));
+  static crash_reporter::CrashKeyString<24> discardable_memory_free(
+      "discardable-memory-free");
+  discardable_memory_free.Set(base::NumberToString(new_bytes_free));
 }
 
 }  // namespace discardable_memory
diff --git a/components/discardable_memory/service/BUILD.gn b/components/discardable_memory/service/BUILD.gn
index 6ac608b7..59f8817d 100644
--- a/components/discardable_memory/service/BUILD.gn
+++ b/components/discardable_memory/service/BUILD.gn
@@ -16,6 +16,7 @@
 
   deps = [
     "//base",
+    "//components/crash/core/common:crash_key",
     "//components/discardable_memory/common",
     "//components/discardable_memory/public/interfaces",
   ]
diff --git a/components/discardable_memory/service/discardable_shared_memory_manager.cc b/components/discardable_memory/service/discardable_shared_memory_manager.cc
index e039f0b5..d36d0fa 100644
--- a/components/discardable_memory/service/discardable_shared_memory_manager.cc
+++ b/components/discardable_memory/service/discardable_shared_memory_manager.cc
@@ -12,7 +12,6 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/command_line.h"
-#include "base/debug/crash_logging.h"
 #include "base/macros.h"
 #include "base/memory/discardable_memory.h"
 #include "base/memory/memory_coordinator_client_registry.h"
@@ -29,6 +28,7 @@
 #include "base/trace_event/process_memory_dump.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
+#include "components/crash/core/common/crash_key.h"
 #include "components/discardable_memory/common/discardable_shared_memory_heap.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/system/platform_handle.h"
@@ -617,10 +617,9 @@
 
 void DiscardableSharedMemoryManager::BytesAllocatedChanged(
     size_t new_bytes_allocated) const {
-  static const char kTotalDiscardableMemoryAllocatedKey[] =
-      "total-discardable-memory-allocated";
-  base::debug::SetCrashKeyValue(kTotalDiscardableMemoryAllocatedKey,
-                                base::NumberToString(new_bytes_allocated));
+  static crash_reporter::CrashKeyString<24> total_discardable_memory(
+      "total-discardable-memory-allocated");
+  total_discardable_memory.Set(base::NumberToString(new_bytes_allocated));
 }
 
 base::Time DiscardableSharedMemoryManager::Now() const {
diff --git a/components/neterror/OWNERS b/components/neterror/OWNERS
index 0dd67b9f..40148ee4 100644
--- a/components/neterror/OWNERS
+++ b/components/neterror/OWNERS
@@ -1,4 +1,3 @@
-jar@chromium.org
 mmenke@chromium.org
 juliatuttle@chromium.org
 edwardjung@chromium.org
diff --git a/components/network_hints/OWNERS b/components/network_hints/OWNERS
index 76224884..510eb168 100644
--- a/components/network_hints/OWNERS
+++ b/components/network_hints/OWNERS
@@ -1,2 +1 @@
-jar@chromium.org
 juliatuttle@chromium.org
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java
index 34a4ff5c..6ba0455 100644
--- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java
+++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java
@@ -7,7 +7,6 @@
 import android.accounts.Account;
 import android.accounts.AuthenticatorDescription;
 import android.app.Activity;
-import android.content.Context;
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 
@@ -17,7 +16,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.ObserverList;
 import org.chromium.base.ThreadUtils;
-import org.chromium.base.VisibleForTesting;
 import org.chromium.components.signin.AccountManagerDelegate;
 import org.chromium.components.signin.AccountManagerDelegateException;
 import org.chromium.components.signin.AccountManagerFacade;
@@ -117,23 +115,12 @@
     private boolean mRegisterObserversCalled;
     private FakeProfileDataSource mFakeProfileDataSource;
 
-    @VisibleForTesting
     public FakeAccountManagerDelegate(@ProfileDataSourceFlag int profileDataSourceFlag) {
         if (profileDataSourceFlag == ENABLE_PROFILE_DATA_SOURCE) {
             mFakeProfileDataSource = new FakeProfileDataSource();
         }
     }
 
-    /** Will be removed after fixing downstream clients. */
-    @Deprecated
-    public FakeAccountManagerDelegate(Context context, Account... accounts) {
-        if (accounts != null) {
-            for (Account account : accounts) {
-                mAccounts.add(AccountHolder.builder(account).alwaysAccept(true).build());
-            }
-        }
-    }
-
     public void setProfileData(
             String accountId, @Nullable ProfileDataSource.ProfileData profileData) {
         assert mFakeProfileDataSource != null : "ProfileDataSource was disabled!";
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc
index 5f6765f..3931676 100644
--- a/content/browser/renderer_host/delegated_frame_host.cc
+++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -299,8 +299,12 @@
 }
 
 void DelegatedFrameHost::WasResized() {
+  const viz::SurfaceId* primary_surface_id =
+      client_->DelegatedFrameHostGetLayer()->GetPrimarySurfaceId();
   if (enable_surface_synchronization_ &&
-      client_->DelegatedFrameHostIsVisible()) {
+      client_->DelegatedFrameHostIsVisible() &&
+      (!primary_surface_id || primary_surface_id->local_surface_id() !=
+                                  client_->GetLocalSurfaceId())) {
     current_frame_size_in_dip_ = client_->DelegatedFrameHostDesiredSizeInDIP();
 
     viz::SurfaceId surface_id(frame_sink_id_, client_->GetLocalSurfaceId());
diff --git a/docs/ios/build_instructions.md b/docs/ios/build_instructions.md
index 60e943f..1d0c76a 100644
--- a/docs/ios/build_instructions.md
+++ b/docs/ios/build_instructions.md
@@ -12,7 +12,7 @@
 
 ## System requirements
 
-* A 64-bit Mac running 10.11+.
+* A 64-bit Mac running 10.12.6 or later.
 * [Xcode](https://developer.apple.com/xcode) 9.0+.
 * The current version of the JDK (required for the Closure compiler).
 
@@ -226,6 +226,10 @@
 $ out/Debug-iphonesimulator/iossim out/Debug-iphonesimulator/Chromium.app
 ```
 
+With Xcode 9, `iossim` no longer automatically launches the Simulator. This must now
+be done manually from within Xcode (`Xcode > Open Developer Tool > Simulator`), and
+also must be done *after* running `iossim`.
+
 ### Passing arguments
 
 Arguments needed to be passed to the test application through `iossim`, such as
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm
index 64fed38..8e01bb0b 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm
@@ -194,6 +194,7 @@
     // safeAreaInsets.  Since this situation is universally called for the full
     // screen new tab animation, it's safe to check the rootViewController's
     // view instead.
+    // TODO(crbug.com/791784) : Remove use of rootViewController.
     UIView* insetsView = self.headerView;
     if (!self.headerView.window) {
       insetsView =
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
index 050058f..58fa0211 100644
--- a/ios/chrome/browser/tabs/tab.mm
+++ b/ios/chrome/browser/tabs/tab.mm
@@ -444,10 +444,6 @@
   overscrollActionsControllerDelegate_ = overscrollActionsControllerDelegate;
 }
 
-- (void)webDidUpdateSessionForLoadWithURL:(const GURL&)URL {
-  // TODO(crbug.com/674991): Remove this method.
-}
-
 // Halt the tab, which amounts to halting its webController.
 - (void)terminateNetworkActivity {
   [self.webController terminateNetworkActivity];
diff --git a/ios/chrome/browser/ui/download/pass_kit_coordinator.mm b/ios/chrome/browser/ui/download/pass_kit_coordinator.mm
index 11401f7..fff487e 100644
--- a/ios/chrome/browser/ui/download/pass_kit_coordinator.mm
+++ b/ios/chrome/browser/ui/download/pass_kit_coordinator.mm
@@ -71,6 +71,10 @@
 
 // Presents PKAddPassesViewController.
 - (void)presentAddPassUI {
+  if (![PKAddPassesViewController canAddPasses]) {
+    [self stop];
+    return;
+  }
   _viewController = [[PKAddPassesViewController alloc] initWithPass:self.pass];
   _viewController.delegate = self;
   [self.baseViewController presentViewController:_viewController
diff --git a/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm b/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm
index 655d279..4c4bbc6 100644
--- a/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm
@@ -27,6 +27,7 @@
 #endif
 
 using testing::WaitUntilConditionOrTimeout;
+using testing::kWaitForUIElementTimeout;
 
 // Test fixture for PassKitCoordinator class.
 class PassKitCoordinatorTest : public PlatformTest {
@@ -57,11 +58,6 @@
 // Tests that PassKitCoordinator presents PKAddPassesViewController for the
 // valid PKPass object.
 TEST_F(PassKitCoordinatorTest, ValidPassKitObject) {
-  if (IsIPadIdiom()) {
-    // Wallet app is not supported on iPads.
-    return;
-  }
-
   std::string data = testing::GetTestPass();
   NSData* nsdata = [NSData dataWithBytes:data.c_str() length:data.size()];
   PKPass* pass = [[PKPass alloc] initWithData:nsdata error:nil];
@@ -72,16 +68,21 @@
       presentDialogForPass:pass
                   webState:web_state_.get()];
 
-  EXPECT_TRUE(WaitUntilConditionOrTimeout(testing::kWaitForUIElementTimeout, ^{
-    return [base_view_controller_.presentedViewController class] ==
-           [PKAddPassesViewController class];
-  }));
+  if (IsIPadIdiom()) {
+    // Wallet app is not supported on iPads.
+  } else {
+    EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+      return [base_view_controller_.presentedViewController class] ==
+             [PKAddPassesViewController class];
+    }));
 
-  [coordinator_ stop];
+    [coordinator_ stop];
 
-  EXPECT_TRUE(WaitUntilConditionOrTimeout(testing::kWaitForUIElementTimeout, ^{
-    return base_view_controller_.presentedViewController == nil;
-  }));
+    EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+      return base_view_controller_.presentedViewController == nil;
+    }));
+  }
+
   EXPECT_FALSE(coordinator_.webState);
   EXPECT_FALSE(coordinator_.pass);
 }
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
index 8460aa1..6b87567 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
@@ -165,7 +165,7 @@
                                          -kToolbarButtonAnimationOffset
                                                          forButtons:
                                                  self.trailingStackViewButtons];
-                                 [self setAllVisibleToolbarButtonsOpacity:0];
+                                 [self setAllToolbarButtonsOpacity:0];
                                }
                                completion:nil];
 
@@ -212,7 +212,7 @@
   [NSLayoutConstraint activateConstraints:self.regularToolbarConstraints];
   // Change the Toolbar buttons opacity to 0 since these will fade in once the
   // locationBarContainer has been contracted.
-  [self setAllVisibleToolbarButtonsOpacity:0];
+  [self setAllToolbarButtonsOpacity:0];
   [animator addAnimations:^{
     self.locationBarContainer.layer.borderWidth = kLocationBarBorderWidth;
     [self.view layoutIfNeeded];
@@ -242,7 +242,7 @@
                                        setHorizontalTranslationOffset:0
                                                            forButtons:
                                                 self.trailingStackViewButtons];
-                                   [self setAllVisibleToolbarButtonsOpacity:1];
+                                   [self setAllToolbarButtonsOpacity:1];
                                  }
                                  completion:nil];
   }];
@@ -999,24 +999,23 @@
   [self.dispatcher startVoiceSearch:command];
 }
 
-// Sets all Visible Toolbar Buttons opacity to |alpha|.
-- (void)setAllVisibleToolbarButtonsOpacity:(CGFloat)alpha {
+// Sets all Toolbar Buttons opacity to |alpha|.
+- (void)setAllToolbarButtonsOpacity:(CGFloat)alpha {
   for (UIButton* button in [self.leadingStackViewButtons
            arrayByAddingObjectsFromArray:self.trailingStackViewButtons]) {
-    if (!button.hidden)
       button.alpha = alpha;
   }
 }
 
 // Offsets the horizontal translation transform of all visible Toolbar Buttons
-// in |array| by |offset|. Used for fade in animations.
+// in |array| by |offset|. If the button is hidden it will assign the
+// IdentityTransform. Used for fade in animations.
 - (void)setHorizontalTranslationOffset:(LayoutOffset)offset
                             forButtons:(NSArray<ToolbarButton*>*)array {
   for (UIButton* button in array) {
-    if (!button.hidden)
-      button.transform = (offset != 0)
-                             ? CGAffineTransformMakeTranslation(offset, 0)
-                             : CGAffineTransformIdentity;
+    button.transform = (offset != 0 && !button.hidden)
+                           ? CGAffineTransformMakeTranslation(offset, 0)
+                           : CGAffineTransformIdentity;
   }
 }
 
diff --git a/ios/web/navigation/navigation_manager_delegate.h b/ios/web/navigation/navigation_manager_delegate.h
index 2d7698b..867879b0 100644
--- a/ios/web/navigation/navigation_manager_delegate.h
+++ b/ios/web/navigation/navigation_manager_delegate.h
@@ -9,7 +9,6 @@
 
 
 @protocol CRWWebViewNavigationProxy;
-class GURL;
 
 namespace web {
 
@@ -38,10 +37,6 @@
   // navigation using a different user agent type.
   virtual void WillChangeUserAgentType() = 0;
 
-  // Instructs the delegate to notify its delegates that the current navigation
-  // item will be loaded.
-  virtual void WillLoadCurrentItemWithUrl(const GURL&) = 0;
-
   // Instructs the delegate to load the current navigation item.
   virtual void LoadCurrentItem() = 0;
 
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm
index 6b49cc81..53c7124 100644
--- a/ios/web/navigation/navigation_manager_impl.mm
+++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -262,7 +262,6 @@
     added_item->SetShouldSkipRepostFormConfirmation(true);
   }
 
-  delegate_->WillLoadCurrentItemWithUrl(params.url);
   delegate_->LoadCurrentItem();
 }
 
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm
index a642c9c5..c7d39974 100644
--- a/ios/web/navigation/navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -73,7 +73,6 @@
   MOCK_METHOD0(ClearTransientContent, void());
   MOCK_METHOD0(RecordPageStateInNavigationItem, void());
   MOCK_METHOD0(UpdateHtml5HistoryState, void());
-  MOCK_METHOD1(WillLoadCurrentItemWithUrl, void(const GURL&));
   MOCK_METHOD0(WillChangeUserAgentType, void());
   MOCK_METHOD0(LoadCurrentItem, void());
   MOCK_METHOD0(LoadIfNecessary, void());
@@ -2128,8 +2127,6 @@
   EXPECT_CALL(navigation_manager_delegate(), RecordPageStateInNavigationItem())
       .Times(1);
   EXPECT_CALL(navigation_manager_delegate(), ClearTransientContent()).Times(1);
-  EXPECT_CALL(navigation_manager_delegate(),
-              WillLoadCurrentItemWithUrl(::testing::Ref(params.url)));
   EXPECT_CALL(navigation_manager_delegate(), LoadCurrentItem()).Times(1);
 
   navigation_manager()->LoadURLWithParams(params);
@@ -2161,8 +2158,6 @@
   EXPECT_CALL(navigation_manager_delegate(), RecordPageStateInNavigationItem())
       .Times(1);
   EXPECT_CALL(navigation_manager_delegate(), ClearTransientContent()).Times(1);
-  EXPECT_CALL(navigation_manager_delegate(),
-              WillLoadCurrentItemWithUrl(::testing::Ref(params.url)));
   EXPECT_CALL(navigation_manager_delegate(), LoadCurrentItem()).Times(1);
 
   navigation_manager()->LoadURLWithParams(params);
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 1a29a13..1b74274 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
@@ -69,7 +69,6 @@
   MOCK_METHOD0(ClearTransientContent, void());
   MOCK_METHOD0(RecordPageStateInNavigationItem, void());
   MOCK_METHOD0(UpdateHtml5HistoryState, void());
-  MOCK_METHOD1(WillLoadCurrentItemWithUrl, void(const GURL&));
   MOCK_METHOD0(WillChangeUserAgentType, void());
   MOCK_METHOD0(LoadCurrentItem, void());
   MOCK_METHOD0(LoadIfNecessary, void());
@@ -577,7 +576,6 @@
   items.push_back(std::move(item0));
   items.push_back(std::move(item1));
 
-  EXPECT_CALL(delegate_, WillLoadCurrentItemWithUrl(testing::_)).Times(1);
   manager_->Restore(0 /* last_committed_item_index */, std::move(items));
 
   NavigationItem* pending_item = manager_->GetPendingItem();
@@ -656,7 +654,6 @@
 
 // Tests that Restore() accepts empty session history and performs no-op.
 TEST_F(WKBasedNavigationManagerTest, RestoreSessionWithEmptyHistory) {
-  EXPECT_CALL(delegate_, WillLoadCurrentItemWithUrl(testing::_)).Times(0);
   manager_->Restore(-1 /* last_committed_item_index */,
                     std::vector<std::unique_ptr<NavigationItem>>());
 
diff --git a/ios/web/public/web_state/ui/crw_web_delegate.h b/ios/web/public/web_state/ui/crw_web_delegate.h
index 1cda8c83..42dbf17 100644
--- a/ios/web/public/web_state/ui/crw_web_delegate.h
+++ b/ios/web/public/web_state/ui/crw_web_delegate.h
@@ -37,15 +37,6 @@
 - (void)webController:(CRWWebController*)webController
     retrievePlaceholderOverlayImage:(void (^)(UIImage*))block;
 
-// ---------------------------------------------------------------------
-// TODO(rohitrao): Eliminate as many of the following delegate methods as
-// possible.  They only exist because the Tab and CRWWebController logic was
-// very intertwined. We should streamline the logic to jump between classes
-// less, then remove any delegate method that becomes unnecessary as a result.
-
-// Called when a page is loaded using loadWithParams.
-- (void)webDidUpdateSessionForLoadWithURL:(const GURL&)URL;
-
 @optional
 
 // Called to ask CRWWebDelegate if |CRWWebController| should open the given URL.
diff --git a/ios/web/test/fakes/fake_navigation_manager_delegate.h b/ios/web/test/fakes/fake_navigation_manager_delegate.h
index 5716aac..9fe648a 100644
--- a/ios/web/test/fakes/fake_navigation_manager_delegate.h
+++ b/ios/web/test/fakes/fake_navigation_manager_delegate.h
@@ -7,7 +7,6 @@
 
 #import "ios/web/navigation/navigation_manager_delegate.h"
 
-class GURL;
 @protocol CRWWebViewNavigationProxy;
 
 namespace web {
@@ -17,7 +16,6 @@
   void ClearTransientContent() override;
   void RecordPageStateInNavigationItem() override;
   void UpdateHtml5HistoryState() override;
-  void WillLoadCurrentItemWithUrl(const GURL&) override;
   void WillChangeUserAgentType() override;
   void LoadCurrentItem() override;
   void LoadIfNecessary() override;
diff --git a/ios/web/test/fakes/fake_navigation_manager_delegate.mm b/ios/web/test/fakes/fake_navigation_manager_delegate.mm
index 0932b3d..dc8b801 100644
--- a/ios/web/test/fakes/fake_navigation_manager_delegate.mm
+++ b/ios/web/test/fakes/fake_navigation_manager_delegate.mm
@@ -15,7 +15,6 @@
 void FakeNavigationManagerDelegate::ClearTransientContent() {}
 void FakeNavigationManagerDelegate::RecordPageStateInNavigationItem() {}
 void FakeNavigationManagerDelegate::UpdateHtml5HistoryState() {}
-void FakeNavigationManagerDelegate::WillLoadCurrentItemWithUrl(const GURL&) {}
 void FakeNavigationManagerDelegate::WillChangeUserAgentType() {}
 void FakeNavigationManagerDelegate::LoadCurrentItem() {}
 void FakeNavigationManagerDelegate::LoadIfNecessary() {}
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h
index 1fc59f6..b154faf 100644
--- a/ios/web/web_state/ui/crw_web_controller.h
+++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -158,11 +158,6 @@
 // to generate an overlay placeholder view.
 - (BOOL)canUseViewForGeneratingOverlayPlaceholderView;
 
-// Notifies delegate that |currentNavItem| will be loaded with |url|.
-// TODO(crbug.com/674991): Remove this method when CRWWebDelegate is no longer
-// used.
-- (void)willLoadCurrentItemWithURL:(const GURL&)URL;
-
 // Loads the URL indicated by current session state.
 - (void)loadCurrentURL;
 
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 37f782b..ed3b16d 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -1792,10 +1792,6 @@
                               withCompletionHandler:completionHandler];
 }
 
-- (void)willLoadCurrentItemWithURL:(const GURL&)URL {
-  [_delegate webDidUpdateSessionForLoadWithURL:URL];
-}
-
 - (void)loadCurrentURL {
   // If the content view doesn't exist, the tab has either been evicted, or
   // never displayed. Bail, and let the URL be loaded when the tab is shown.
diff --git a/ios/web/web_state/web_state_impl.h b/ios/web/web_state/web_state_impl.h
index 07eed9a..b654261a 100644
--- a/ios/web/web_state/web_state_impl.h
+++ b/ios/web/web_state/web_state_impl.h
@@ -277,7 +277,6 @@
   void RecordPageStateInNavigationItem() override;
   void UpdateHtml5HistoryState() override;
   void WillChangeUserAgentType() override;
-  void WillLoadCurrentItemWithUrl(const GURL&) override;
   void LoadCurrentItem() override;
   void LoadIfNecessary() override;
   void Reload() override;
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index 3fed0c3..a5eb6069 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -783,10 +783,6 @@
   [web_controller_ requirePageReconstruction];
 }
 
-void WebStateImpl::WillLoadCurrentItemWithUrl(const GURL& url) {
-  [web_controller_ willLoadCurrentItemWithURL:url];
-}
-
 void WebStateImpl::LoadCurrentItem() {
   [web_controller_ loadCurrentURL];
 }
diff --git a/jingle/glue/fake_ssl_client_socket.h b/jingle/glue/fake_ssl_client_socket.h
index 64c34836..3ab9e641 100644
--- a/jingle/glue/fake_ssl_client_socket.h
+++ b/jingle/glue/fake_ssl_client_socket.h
@@ -51,12 +51,11 @@
   int Read(net::IOBuffer* buf,
            int buf_len,
            const net::CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
-  int Write(net::IOBuffer* buf,
-            int buf_len,
-            const net::CompletionCallback& callback,
-            const net::NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+  int Write(
+      net::IOBuffer* buf,
+      int buf_len,
+      const net::CompletionCallback& callback,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
   int Connect(const net::CompletionCallback& callback) override;
diff --git a/jingle/glue/fake_ssl_client_socket_unittest.cc b/jingle/glue/fake_ssl_client_socket_unittest.cc
index ae4c7a63..e56b0c4 100644
--- a/jingle/glue/fake_ssl_client_socket_unittest.cc
+++ b/jingle/glue/fake_ssl_client_socket_unittest.cc
@@ -23,7 +23,7 @@
 #include "net/socket/socket_tag.h"
 #include "net/socket/socket_test_util.h"
 #include "net/socket/stream_socket.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -185,10 +185,9 @@
 
         scoped_refptr<net::IOBuffer> write_buf(
             new net::StringIOBuffer(kWriteTestData));
-        int write_status =
-            fake_ssl_client_socket.Write(write_buf.get(),
-                                         arraysize(kWriteTestData),
-                                         test_completion_callback.callback());
+        int write_status = fake_ssl_client_socket.Write(
+            write_buf.get(), arraysize(kWriteTestData),
+            test_completion_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
         ExpectStatus(mode, arraysize(kWriteTestData), write_status,
                      &test_completion_callback);
       } else {
diff --git a/jingle/glue/proxy_resolving_client_socket.h b/jingle/glue/proxy_resolving_client_socket.h
index 6af72f70..d37c4fd 100644
--- a/jingle/glue/proxy_resolving_client_socket.h
+++ b/jingle/glue/proxy_resolving_client_socket.h
@@ -57,12 +57,11 @@
   int Read(net::IOBuffer* buf,
            int buf_len,
            const net::CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
-  int Write(net::IOBuffer* buf,
-            int buf_len,
-            const net::CompletionCallback& callback,
-            const net::NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+  int Write(
+      net::IOBuffer* buf,
+      int buf_len,
+      const net::CompletionCallback& callback,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
   int Connect(const net::CompletionCallback& callback) override;
diff --git a/media/cast/net/udp_transport.cc b/media/cast/net/udp_transport.cc
index 57e3b67..8ed8517 100644
--- a/media/cast/net/udp_transport.cc
+++ b/media/cast/net/udp_transport.cc
@@ -258,8 +258,10 @@
     // If we called Connect() before we must call Write() instead of
     // SendTo(). Otherwise on some platforms we might get
     // ERR_SOCKET_IS_CONNECTED.
-    result = udp_socket_->Write(
-        buf.get(), static_cast<int>(packet->data.size()), callback);
+    // TODO(crbug.com/656607): Add proper annotation.
+    result =
+        udp_socket_->Write(buf.get(), static_cast<int>(packet->data.size()),
+                           callback, NO_TRAFFIC_ANNOTATION_BUG_656607);
   } else if (!IsEmpty(remote_addr_)) {
     result = udp_socket_->SendTo(buf.get(),
                                  static_cast<int>(packet->data.size()),
diff --git a/net/BUILD.gn b/net/BUILD.gn
index c59ee4d..e5b35082 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1045,6 +1045,7 @@
       "proxy/multi_threaded_proxy_resolver.h",
       "proxy/network_delegate_error_observer.cc",
       "proxy/network_delegate_error_observer.h",
+      "proxy/pac_js_library.h",
       "proxy/polling_proxy_config_service.cc",
       "proxy/polling_proxy_config_service.h",
       "proxy/proxy_bypass_rules.cc",
@@ -1076,7 +1077,6 @@
       "proxy/proxy_resolver_factory.h",
       "proxy/proxy_resolver_mac.cc",
       "proxy/proxy_resolver_mac.h",
-      "proxy/proxy_resolver_script.h",
       "proxy/proxy_resolver_script_data.cc",
       "proxy/proxy_resolver_script_data.h",
       "proxy/proxy_resolver_winhttp.cc",
diff --git a/net/proxy/pac_js_library.h b/net/proxy/pac_js_library.h
new file mode 100644
index 0000000..a26ea80a
--- /dev/null
+++ b/net/proxy/pac_js_library.h
@@ -0,0 +1,282 @@
+// 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.
+
+#ifndef NET_PROXY_PAC_JS_LIBRARY_H_
+#define NET_PROXY_PAC_JS_LIBRARY_H_
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Akhil Arora <akhil.arora@sun.com>
+ *   Tomi Leppikangas <Tomi.Leppikangas@oulu.fi>
+ *   Darin Fisher <darin@meer.net>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+// The following code was formatted from:
+//   'mozilla/netwerk/base/src/nsProxyAutoConfig.js' (1.55)
+//
+// Using the command:
+//   $ cat nsProxyAutoConfig.js |
+//       awk '/var pacUtils/,/EOF/' |
+//       sed -e 's/^\s*$/""/g' |
+//       sed -e 's/"\s*[+]\s*$/"/g' |
+//       sed -e 's/"$/" \\/g' |
+//       sed -e 's/\/(ipaddr);/\/.exec(ipaddr);/g' |
+//       grep -v '^var pacUtils ='
+//
+// isPlainHost() was removed.
+#define PAC_JS_LIBRARY                                                        \
+  "function dnsDomainIs(host, domain) {\n"                                    \
+  "    return (host.length >= domain.length &&\n"                             \
+  "            host.substring(host.length - domain.length) == domain);\n"     \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function dnsDomainLevels(host) {\n"                                        \
+  "    return host.split('.').length-1;\n"                                    \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function convert_addr(ipchars) {\n"                                        \
+  "    var bytes = ipchars.split('.');\n"                                     \
+  "    var result = ((bytes[0] & 0xff) << 24) |\n"                            \
+  "                 ((bytes[1] & 0xff) << 16) |\n"                            \
+  "                 ((bytes[2] & 0xff) <<  8) |\n"                            \
+  "                  (bytes[3] & 0xff);\n"                                    \
+  "    return result;\n"                                                      \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function isInNet(ipaddr, pattern, maskstr) {\n"                            \
+  "    var test = "                                                           \
+  "/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(ipaddr);\n"     \
+  "    if (test == null) {\n"                                                 \
+  "        ipaddr = dnsResolve(ipaddr);\n"                                    \
+  "        if (ipaddr == null)\n"                                             \
+  "            return false;\n"                                               \
+  "    } else if (test[1] > 255 || test[2] > 255 || \n"                       \
+  "               test[3] > 255 || test[4] > 255) {\n"                        \
+  "        return false;    // not an IP address\n"                           \
+  "    }\n"                                                                   \
+  "    var host = convert_addr(ipaddr);\n"                                    \
+  "    var pat  = convert_addr(pattern);\n"                                   \
+  "    var mask = convert_addr(maskstr);\n"                                   \
+  "    return ((host & mask) == (pat & mask));\n"                             \
+  "    \n"                                                                    \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function isResolvable(host) {\n"                                           \
+  "    var ip = dnsResolve(host);\n"                                          \
+  "    return (ip != null);\n"                                                \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function localHostOrDomainIs(host, hostdom) {\n"                           \
+  "    return (host == hostdom) ||\n"                                         \
+  "           (hostdom.lastIndexOf(host + '.', 0) == 0);\n"                   \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function shExpMatch(url, pattern) {\n"                                     \
+  "   pattern = pattern.replace(/\\./g, '\\\\.');\n"                          \
+  "   pattern = pattern.replace(/\\*/g, '.*');\n"                             \
+  "   pattern = pattern.replace(/\\?/g, '.');\n"                              \
+  "   var newRe = new RegExp('^'+pattern+'$');\n"                             \
+  "   return newRe.test(url);\n"                                              \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "var wdays = {SUN: 0, MON: 1, TUE: 2, WED: 3, THU: 4, FRI: 5, SAT: 6};\n"   \
+  ""                                                                          \
+  "var months = {JAN: 0, FEB: 1, MAR: 2, APR: 3, MAY: 4, JUN: 5, JUL: 6, "    \
+  "AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11};\n"                              \
+  ""                                                                          \
+  "function weekdayRange() {\n"                                               \
+  "    function getDay(weekday) {\n"                                          \
+  "        if (weekday in wdays) {\n"                                         \
+  "            return wdays[weekday];\n"                                      \
+  "        }\n"                                                               \
+  "        return -1;\n"                                                      \
+  "    }\n"                                                                   \
+  "    var date = new Date();\n"                                              \
+  "    var argc = arguments.length;\n"                                        \
+  "    var wday;\n"                                                           \
+  "    if (argc < 1)\n"                                                       \
+  "        return false;\n"                                                   \
+  "    if (arguments[argc - 1] == 'GMT') {\n"                                 \
+  "        argc--;\n"                                                         \
+  "        wday = date.getUTCDay();\n"                                        \
+  "    } else {\n"                                                            \
+  "        wday = date.getDay();\n"                                           \
+  "    }\n"                                                                   \
+  "    var wd1 = getDay(arguments[0]);\n"                                     \
+  "    var wd2 = (argc == 2) ? getDay(arguments[1]) : wd1;\n"                 \
+  "    return (wd1 == -1 || wd2 == -1) ? false\n"                             \
+  "                                    : (wd1 <= wday && wday <= wd2);\n"     \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function dateRange() {\n"                                                  \
+  "    function getMonth(name) {\n"                                           \
+  "        if (name in months) {\n"                                           \
+  "            return months[name];\n"                                        \
+  "        }\n"                                                               \
+  "        return -1;\n"                                                      \
+  "    }\n"                                                                   \
+  "    var date = new Date();\n"                                              \
+  "    var argc = arguments.length;\n"                                        \
+  "    if (argc < 1) {\n"                                                     \
+  "        return false;\n"                                                   \
+  "    }\n"                                                                   \
+  "    var isGMT = (arguments[argc - 1] == 'GMT');\n"                         \
+  "\n"                                                                        \
+  "    if (isGMT) {\n"                                                        \
+  "        argc--;\n"                                                         \
+  "    }\n"                                                                   \
+  "    // function will work even without explict handling of this case\n"    \
+  "    if (argc == 1) {\n"                                                    \
+  "        var tmp = parseInt(arguments[0]);\n"                               \
+  "        if (isNaN(tmp)) {\n"                                               \
+  "            return ((isGMT ? date.getUTCMonth() : date.getMonth()) ==\n"   \
+  "getMonth(arguments[0]));\n"                                                \
+  "        } else if (tmp < 32) {\n"                                          \
+  "            return ((isGMT ? date.getUTCDate() : date.getDate()) == "      \
+  "tmp);\n"                                                                   \
+  "        } else { \n"                                                       \
+  "            return ((isGMT ? date.getUTCFullYear() : date.getFullYear()) " \
+  "==\n"                                                                      \
+  "tmp);\n"                                                                   \
+  "        }\n"                                                               \
+  "    }\n"                                                                   \
+  "    var year = date.getFullYear();\n"                                      \
+  "    var date1, date2;\n"                                                   \
+  "    date1 = new Date(year,  0,  1,  0,  0,  0);\n"                         \
+  "    date2 = new Date(year, 11, 31, 23, 59, 59);\n"                         \
+  "    var adjustMonth = false;\n"                                            \
+  "    for (var i = 0; i < (argc >> 1); i++) {\n"                             \
+  "        var tmp = parseInt(arguments[i]);\n"                               \
+  "        if (isNaN(tmp)) {\n"                                               \
+  "            var mon = getMonth(arguments[i]);\n"                           \
+  "            date1.setMonth(mon);\n"                                        \
+  "        } else if (tmp < 32) {\n"                                          \
+  "            adjustMonth = (argc <= 2);\n"                                  \
+  "            date1.setDate(tmp);\n"                                         \
+  "        } else {\n"                                                        \
+  "            date1.setFullYear(tmp);\n"                                     \
+  "        }\n"                                                               \
+  "    }\n"                                                                   \
+  "    for (var i = (argc >> 1); i < argc; i++) {\n"                          \
+  "        var tmp = parseInt(arguments[i]);\n"                               \
+  "        if (isNaN(tmp)) {\n"                                               \
+  "            var mon = getMonth(arguments[i]);\n"                           \
+  "            date2.setMonth(mon);\n"                                        \
+  "        } else if (tmp < 32) {\n"                                          \
+  "            date2.setDate(tmp);\n"                                         \
+  "        } else {\n"                                                        \
+  "            date2.setFullYear(tmp);\n"                                     \
+  "        }\n"                                                               \
+  "    }\n"                                                                   \
+  "    if (adjustMonth) {\n"                                                  \
+  "        date1.setMonth(date.getMonth());\n"                                \
+  "        date2.setMonth(date.getMonth());\n"                                \
+  "    }\n"                                                                   \
+  "    if (isGMT) {\n"                                                        \
+  "    var tmp = date;\n"                                                     \
+  "        tmp.setFullYear(date.getUTCFullYear());\n"                         \
+  "        tmp.setMonth(date.getUTCMonth());\n"                               \
+  "        tmp.setDate(date.getUTCDate());\n"                                 \
+  "        tmp.setHours(date.getUTCHours());\n"                               \
+  "        tmp.setMinutes(date.getUTCMinutes());\n"                           \
+  "        tmp.setSeconds(date.getUTCSeconds());\n"                           \
+  "        date = tmp;\n"                                                     \
+  "    }\n"                                                                   \
+  "    return ((date1 <= date) && (date <= date2));\n"                        \
+  "}\n"                                                                       \
+  ""                                                                          \
+  "function timeRange() {\n"                                                  \
+  "    var argc = arguments.length;\n"                                        \
+  "    var date = new Date();\n"                                              \
+  "    var isGMT= false;\n"                                                   \
+  "\n"                                                                        \
+  "    if (argc < 1) {\n"                                                     \
+  "        return false;\n"                                                   \
+  "    }\n"                                                                   \
+  "    if (arguments[argc - 1] == 'GMT') {\n"                                 \
+  "        isGMT = true;\n"                                                   \
+  "        argc--;\n"                                                         \
+  "    }\n"                                                                   \
+  "\n"                                                                        \
+  "    var hour = isGMT ? date.getUTCHours() : date.getHours();\n"            \
+  "    var date1, date2;\n"                                                   \
+  "    date1 = new Date();\n"                                                 \
+  "    date2 = new Date();\n"                                                 \
+  "\n"                                                                        \
+  "    if (argc == 1) {\n"                                                    \
+  "        return (hour == arguments[0]);\n"                                  \
+  "    } else if (argc == 2) {\n"                                             \
+  "        return ((arguments[0] <= hour) && (hour <= arguments[1]));\n"      \
+  "    } else {\n"                                                            \
+  "        switch (argc) {\n"                                                 \
+  "        case 6:\n"                                                         \
+  "            date1.setSeconds(arguments[2]);\n"                             \
+  "            date2.setSeconds(arguments[5]);\n"                             \
+  "        case 4:\n"                                                         \
+  "            var middle = argc >> 1;\n"                                     \
+  "            date1.setHours(arguments[0]);\n"                               \
+  "            date1.setMinutes(arguments[1]);\n"                             \
+  "            date2.setHours(arguments[middle]);\n"                          \
+  "            date2.setMinutes(arguments[middle + 1]);\n"                    \
+  "            if (middle == 2) {\n"                                          \
+  "                date2.setSeconds(59);\n"                                   \
+  "            }\n"                                                           \
+  "            break;\n"                                                      \
+  "        default:\n"                                                        \
+  "          throw 'timeRange: bad number of arguments'\n"                    \
+  "        }\n"                                                               \
+  "    }\n"                                                                   \
+  "\n"                                                                        \
+  "    if (isGMT) {\n"                                                        \
+  "        date.setFullYear(date.getUTCFullYear());\n"                        \
+  "        date.setMonth(date.getUTCMonth());\n"                              \
+  "        date.setDate(date.getUTCDate());\n"                                \
+  "        date.setHours(date.getUTCHours());\n"                              \
+  "        date.setMinutes(date.getUTCMinutes());\n"                          \
+  "        date.setSeconds(date.getUTCSeconds());\n"                          \
+  "    }\n"                                                                   \
+  "    return ((date1 <= date) && (date <= date2));\n"                        \
+  "}\n"
+
+// This is a Microsoft extension to PAC for IPv6, see:
+// http://blogs.msdn.com/b/wndp/archive/2006/07/13/ipv6-pac-extensions-v0-9.aspx
+#define PAC_JS_LIBRARY_EX                  \
+  "function isResolvableEx(host) {\n"      \
+  "    var ipList = dnsResolveEx(host);\n" \
+  "    return (ipList != '');\n"           \
+  "}\n"
+
+#endif  // NET_PROXY_PAC_JS_LIBRARY_H_
diff --git a/net/proxy/proxy_resolver_script.h b/net/proxy/proxy_resolver_script.h
deleted file mode 100644
index e838bed..0000000
--- a/net/proxy/proxy_resolver_script.h
+++ /dev/null
@@ -1,278 +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.
-
-#ifndef NET_PROXY_PROXY_RESOLVER_SCRIPT_H_
-#define NET_PROXY_PROXY_RESOLVER_SCRIPT_H_
-
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Akhil Arora <akhil.arora@sun.com>
- *   Tomi Leppikangas <Tomi.Leppikangas@oulu.fi>
- *   Darin Fisher <darin@meer.net>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-// The following code was formatted from:
-//   'mozilla/netwerk/base/src/nsProxyAutoConfig.js' (1.55)
-//
-// Using the command:
-//   $ cat nsProxyAutoConfig.js |
-//       awk '/var pacUtils/,/EOF/' |
-//       sed -e 's/^\s*$/""/g' |
-//       sed -e 's/"\s*[+]\s*$/"/g' |
-//       sed -e 's/"$/" \\/g' |
-//       sed -e 's/\/(ipaddr);/\/.exec(ipaddr);/g' |
-//       grep -v '^var pacUtils ='
-//
-// isPlainHost() was removed.
-#define PROXY_RESOLVER_SCRIPT \
-  "function dnsDomainIs(host, domain) {\n" \
-  "    return (host.length >= domain.length &&\n" \
-  "            host.substring(host.length - domain.length) == domain);\n" \
-  "}\n" \
-  "" \
-  "function dnsDomainLevels(host) {\n" \
-  "    return host.split('.').length-1;\n" \
-  "}\n" \
-  "" \
-  "function convert_addr(ipchars) {\n" \
-  "    var bytes = ipchars.split('.');\n" \
-  "    var result = ((bytes[0] & 0xff) << 24) |\n" \
-  "                 ((bytes[1] & 0xff) << 16) |\n" \
-  "                 ((bytes[2] & 0xff) <<  8) |\n" \
-  "                  (bytes[3] & 0xff);\n" \
-  "    return result;\n" \
-  "}\n" \
-  "" \
-  "function isInNet(ipaddr, pattern, maskstr) {\n" \
-  "    var test = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(ipaddr);\n" \
-  "    if (test == null) {\n" \
-  "        ipaddr = dnsResolve(ipaddr);\n" \
-  "        if (ipaddr == null)\n" \
-  "            return false;\n" \
-  "    } else if (test[1] > 255 || test[2] > 255 || \n" \
-  "               test[3] > 255 || test[4] > 255) {\n" \
-  "        return false;    // not an IP address\n" \
-  "    }\n" \
-  "    var host = convert_addr(ipaddr);\n" \
-  "    var pat  = convert_addr(pattern);\n" \
-  "    var mask = convert_addr(maskstr);\n" \
-  "    return ((host & mask) == (pat & mask));\n" \
-  "    \n" \
-  "}\n" \
-  "" \
-  "function isResolvable(host) {\n" \
-  "    var ip = dnsResolve(host);\n" \
-  "    return (ip != null);\n" \
-  "}\n" \
-  "" \
-  "function localHostOrDomainIs(host, hostdom) {\n" \
-  "    return (host == hostdom) ||\n" \
-  "           (hostdom.lastIndexOf(host + '.', 0) == 0);\n" \
-  "}\n" \
-  "" \
-  "function shExpMatch(url, pattern) {\n" \
-  "   pattern = pattern.replace(/\\./g, '\\\\.');\n" \
-  "   pattern = pattern.replace(/\\*/g, '.*');\n" \
-  "   pattern = pattern.replace(/\\?/g, '.');\n" \
-  "   var newRe = new RegExp('^'+pattern+'$');\n" \
-  "   return newRe.test(url);\n" \
-  "}\n" \
-  "" \
-  "var wdays = {SUN: 0, MON: 1, TUE: 2, WED: 3, THU: 4, FRI: 5, SAT: 6};\n" \
-  "" \
-  "var months = {JAN: 0, FEB: 1, MAR: 2, APR: 3, MAY: 4, JUN: 5, JUL: 6, AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11};\n" \
-  "" \
-  "function weekdayRange() {\n" \
-  "    function getDay(weekday) {\n" \
-  "        if (weekday in wdays) {\n" \
-  "            return wdays[weekday];\n" \
-  "        }\n" \
-  "        return -1;\n" \
-  "    }\n" \
-  "    var date = new Date();\n" \
-  "    var argc = arguments.length;\n" \
-  "    var wday;\n" \
-  "    if (argc < 1)\n" \
-  "        return false;\n" \
-  "    if (arguments[argc - 1] == 'GMT') {\n" \
-  "        argc--;\n" \
-  "        wday = date.getUTCDay();\n" \
-  "    } else {\n" \
-  "        wday = date.getDay();\n" \
-  "    }\n" \
-  "    var wd1 = getDay(arguments[0]);\n" \
-  "    var wd2 = (argc == 2) ? getDay(arguments[1]) : wd1;\n" \
-  "    return (wd1 == -1 || wd2 == -1) ? false\n" \
-  "                                    : (wd1 <= wday && wday <= wd2);\n" \
-  "}\n" \
-  "" \
-  "function dateRange() {\n" \
-  "    function getMonth(name) {\n" \
-  "        if (name in months) {\n" \
-  "            return months[name];\n" \
-  "        }\n" \
-  "        return -1;\n" \
-  "    }\n" \
-  "    var date = new Date();\n" \
-  "    var argc = arguments.length;\n" \
-  "    if (argc < 1) {\n" \
-  "        return false;\n" \
-  "    }\n" \
-  "    var isGMT = (arguments[argc - 1] == 'GMT');\n" \
-  "\n" \
-  "    if (isGMT) {\n" \
-  "        argc--;\n" \
-  "    }\n" \
-  "    // function will work even without explict handling of this case\n" \
-  "    if (argc == 1) {\n" \
-  "        var tmp = parseInt(arguments[0]);\n" \
-  "        if (isNaN(tmp)) {\n" \
-  "            return ((isGMT ? date.getUTCMonth() : date.getMonth()) ==\n" \
-  "getMonth(arguments[0]));\n" \
-  "        } else if (tmp < 32) {\n" \
-  "            return ((isGMT ? date.getUTCDate() : date.getDate()) == tmp);\n" \
-  "        } else { \n" \
-  "            return ((isGMT ? date.getUTCFullYear() : date.getFullYear()) ==\n" \
-  "tmp);\n" \
-  "        }\n" \
-  "    }\n" \
-  "    var year = date.getFullYear();\n" \
-  "    var date1, date2;\n" \
-  "    date1 = new Date(year,  0,  1,  0,  0,  0);\n" \
-  "    date2 = new Date(year, 11, 31, 23, 59, 59);\n" \
-  "    var adjustMonth = false;\n" \
-  "    for (var i = 0; i < (argc >> 1); i++) {\n" \
-  "        var tmp = parseInt(arguments[i]);\n" \
-  "        if (isNaN(tmp)) {\n" \
-  "            var mon = getMonth(arguments[i]);\n" \
-  "            date1.setMonth(mon);\n" \
-  "        } else if (tmp < 32) {\n" \
-  "            adjustMonth = (argc <= 2);\n" \
-  "            date1.setDate(tmp);\n" \
-  "        } else {\n" \
-  "            date1.setFullYear(tmp);\n" \
-  "        }\n" \
-  "    }\n" \
-  "    for (var i = (argc >> 1); i < argc; i++) {\n" \
-  "        var tmp = parseInt(arguments[i]);\n" \
-  "        if (isNaN(tmp)) {\n" \
-  "            var mon = getMonth(arguments[i]);\n" \
-  "            date2.setMonth(mon);\n" \
-  "        } else if (tmp < 32) {\n" \
-  "            date2.setDate(tmp);\n" \
-  "        } else {\n" \
-  "            date2.setFullYear(tmp);\n" \
-  "        }\n" \
-  "    }\n" \
-  "    if (adjustMonth) {\n" \
-  "        date1.setMonth(date.getMonth());\n" \
-  "        date2.setMonth(date.getMonth());\n" \
-  "    }\n" \
-  "    if (isGMT) {\n" \
-  "    var tmp = date;\n" \
-  "        tmp.setFullYear(date.getUTCFullYear());\n" \
-  "        tmp.setMonth(date.getUTCMonth());\n" \
-  "        tmp.setDate(date.getUTCDate());\n" \
-  "        tmp.setHours(date.getUTCHours());\n" \
-  "        tmp.setMinutes(date.getUTCMinutes());\n" \
-  "        tmp.setSeconds(date.getUTCSeconds());\n" \
-  "        date = tmp;\n" \
-  "    }\n" \
-  "    return ((date1 <= date) && (date <= date2));\n" \
-  "}\n" \
-  "" \
-  "function timeRange() {\n" \
-  "    var argc = arguments.length;\n" \
-  "    var date = new Date();\n" \
-  "    var isGMT= false;\n" \
-  "\n" \
-  "    if (argc < 1) {\n" \
-  "        return false;\n" \
-  "    }\n" \
-  "    if (arguments[argc - 1] == 'GMT') {\n" \
-  "        isGMT = true;\n" \
-  "        argc--;\n" \
-  "    }\n" \
-  "\n" \
-  "    var hour = isGMT ? date.getUTCHours() : date.getHours();\n" \
-  "    var date1, date2;\n" \
-  "    date1 = new Date();\n" \
-  "    date2 = new Date();\n" \
-  "\n" \
-  "    if (argc == 1) {\n" \
-  "        return (hour == arguments[0]);\n" \
-  "    } else if (argc == 2) {\n" \
-  "        return ((arguments[0] <= hour) && (hour <= arguments[1]));\n" \
-  "    } else {\n" \
-  "        switch (argc) {\n" \
-  "        case 6:\n" \
-  "            date1.setSeconds(arguments[2]);\n" \
-  "            date2.setSeconds(arguments[5]);\n" \
-  "        case 4:\n" \
-  "            var middle = argc >> 1;\n" \
-  "            date1.setHours(arguments[0]);\n" \
-  "            date1.setMinutes(arguments[1]);\n" \
-  "            date2.setHours(arguments[middle]);\n" \
-  "            date2.setMinutes(arguments[middle + 1]);\n" \
-  "            if (middle == 2) {\n" \
-  "                date2.setSeconds(59);\n" \
-  "            }\n" \
-  "            break;\n" \
-  "        default:\n" \
-  "          throw 'timeRange: bad number of arguments'\n" \
-  "        }\n" \
-  "    }\n" \
-  "\n" \
-  "    if (isGMT) {\n" \
-  "        date.setFullYear(date.getUTCFullYear());\n" \
-  "        date.setMonth(date.getUTCMonth());\n" \
-  "        date.setDate(date.getUTCDate());\n" \
-  "        date.setHours(date.getUTCHours());\n" \
-  "        date.setMinutes(date.getUTCMinutes());\n" \
-  "        date.setSeconds(date.getUTCSeconds());\n" \
-  "    }\n" \
-  "    return ((date1 <= date) && (date <= date2));\n" \
-  "}\n"
-
-// This is a Microsoft extension to PAC for IPv6, see:
-// http://blogs.msdn.com/b/wndp/archive/2006/07/13/ipv6-pac-extensions-v0-9.aspx
-#define PROXY_RESOLVER_SCRIPT_EX \
-  "function isResolvableEx(host) {\n" \
-  "    var ipList = dnsResolveEx(host);\n" \
-  "    return (ipList != '');\n" \
-  "}\n"
-
-#endif  // NET_PROXY_PROXY_RESOLVER_SCRIPT_H_
diff --git a/net/proxy/proxy_resolver_v8.cc b/net/proxy/proxy_resolver_v8.cc
index 88c9aa4..91dafc0 100644
--- a/net/proxy/proxy_resolver_v8.cc
+++ b/net/proxy/proxy_resolver_v8.cc
@@ -24,8 +24,8 @@
 #include "gin/v8_initializer.h"
 #include "net/base/ip_address.h"
 #include "net/base/net_errors.h"
+#include "net/proxy/pac_js_library.h"
 #include "net/proxy/proxy_info.h"
-#include "net/proxy/proxy_resolver_script.h"
 #include "net/proxy/proxy_resolver_script_data.h"
 #include "url/gurl.h"
 #include "url/url_canon.h"
@@ -34,8 +34,7 @@
 // Notes on the javascript environment:
 //
 // For the majority of the PAC utility functions, we use the same code
-// as Firefox. See the javascript library that proxy_resolver_scipt.h
-// pulls in.
+// as Firefox. See the javascript library that pac_js_library.h pulls in.
 //
 // In addition, we implement a subset of Microsoft's extensions to PAC.
 // - myIpAddressEx()
@@ -573,10 +572,7 @@
     // (This script should never fail, as it is a string literal!)
     // Note that the two string literals are concatenated.
     int rv = RunScript(
-        ASCIILiteralToV8String(
-            isolate_,
-            PROXY_RESOLVER_SCRIPT
-            PROXY_RESOLVER_SCRIPT_EX),
+        ASCIILiteralToV8String(isolate_, PAC_JS_LIBRARY PAC_JS_LIBRARY_EX),
         kPacUtilityResourceName);
     if (rv != OK) {
       NOTREACHED();
diff --git a/net/quic/chromium/quic_proxy_client_socket.h b/net/quic/chromium/quic_proxy_client_socket.h
index c38250a..90b0f2bf 100644
--- a/net/quic/chromium/quic_proxy_client_socket.h
+++ b/net/quic/chromium/quic_proxy_client_socket.h
@@ -68,12 +68,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
   int GetPeerAddress(IPEndPoint* address) const override;
diff --git a/net/quic/chromium/quic_proxy_client_socket_unittest.cc b/net/quic/chromium/quic_proxy_client_socket_unittest.cc
index 3169883..fa49500 100644
--- a/net/quic/chromium/quic_proxy_client_socket_unittest.cc
+++ b/net/quic/chromium/quic_proxy_client_socket_unittest.cc
@@ -36,6 +36,7 @@
 #include "net/socket/socket_test_util.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -432,13 +433,15 @@
     scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(len));
     memcpy(buf->data(), data, len);
     EXPECT_EQ(rv,
-              sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
+              sock_->Write(buf.get(), buf->size(), write_callback_.callback(),
+                           TRAFFIC_ANNOTATION_FOR_TESTS));
   }
 
   void AssertSyncWriteSucceeds(const char* data, int len) {
     scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(len));
     memcpy(buf->data(), data, len);
-    EXPECT_THAT(sock_->Write(buf.get(), buf->size(), CompletionCallback()),
+    EXPECT_THAT(sock_->Write(buf.get(), buf->size(), CompletionCallback(),
+                             TRAFFIC_ANNOTATION_FOR_TESTS),
                 IsOk());
   }
 
diff --git a/net/socket/fuzzed_datagram_client_socket.cc b/net/socket/fuzzed_datagram_client_socket.cc
index 44f5490..65043f50 100644
--- a/net/socket/fuzzed_datagram_client_socket.cc
+++ b/net/socket/fuzzed_datagram_client_socket.cc
@@ -137,12 +137,10 @@
     IOBuffer* buf,
     int buf_len,
     const CompletionCallback& callback,
-    const NetworkTrafficAnnotationTag& traffic_annotation) {
+    const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
   CHECK(!callback.is_null());
   CHECK(!write_pending_);
 
-  // TODO(crbug.com/656607): Handle traffic annotation.
-
   // Normally this is allowed, but code really shouldn't be doing this - if it
   // is, it's best to figure out why, and fix it.
   CHECK(connected_);
diff --git a/net/socket/fuzzed_datagram_client_socket.h b/net/socket/fuzzed_datagram_client_socket.h
index defa6ae..6d19562 100644
--- a/net/socket/fuzzed_datagram_client_socket.h
+++ b/net/socket/fuzzed_datagram_client_socket.h
@@ -52,12 +52,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
   int SetDoNotFragment() override;
diff --git a/net/socket/fuzzed_socket.cc b/net/socket/fuzzed_socket.cc
index def156b9..be62fff 100644
--- a/net/socket/fuzzed_socket.cc
+++ b/net/socket/fuzzed_socket.cc
@@ -90,15 +90,14 @@
   return ERR_IO_PENDING;
 }
 
-int FuzzedSocket::Write(IOBuffer* buf,
-                        int buf_len,
-                        const CompletionCallback& callback,
-                        const NetworkTrafficAnnotationTag& traffic_annotation) {
+int FuzzedSocket::Write(
+    IOBuffer* buf,
+    int buf_len,
+    const CompletionCallback& callback,
+    const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
   DCHECK(!connect_pending_);
   DCHECK(!write_pending_);
 
-  // TODO(crbug.com/656607): Handle traffic annotation.
-
   bool sync;
   int result;
 
diff --git a/net/socket/fuzzed_socket.h b/net/socket/fuzzed_socket.h
index a283e7c08..3340e43 100644
--- a/net/socket/fuzzed_socket.h
+++ b/net/socket/fuzzed_socket.h
@@ -62,12 +62,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
 
diff --git a/net/socket/fuzzed_socket_factory.cc b/net/socket/fuzzed_socket_factory.cc
index fcdad66..ca158aea 100644
--- a/net/socket/fuzzed_socket_factory.cc
+++ b/net/socket/fuzzed_socket_factory.cc
@@ -38,12 +38,10 @@
     return ERR_UNEXPECTED;
   }
 
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override {
+            const NetworkTrafficAnnotationTag& traffic_annotation) override {
     NOTREACHED();
     return ERR_UNEXPECTED;
   }
diff --git a/net/socket/socket.h b/net/socket/socket.h
index 87fd9cb..1d0ab92 100644
--- a/net/socket/socket.h
+++ b/net/socket/socket.h
@@ -81,15 +81,6 @@
   // Note: changing this value can affect the TCP window size on some platforms.
   // Returns a net error code.
   virtual int SetSendBufferSize(int32_t size) = 0;
-
- private:
-  void SetTrafficAnnotation(
-      const NetworkTrafficAnnotationTag& traffic_annotation) {
-    traffic_annotation_ =
-        MutableNetworkTrafficAnnotationTag(traffic_annotation);
-  }
-
-  MutableNetworkTrafficAnnotationTag traffic_annotation_;
 };
 
 }  // namespace net
diff --git a/net/socket/socket_posix.cc b/net/socket/socket_posix.cc
index 9661928f..91ce4e82 100644
--- a/net/socket/socket_posix.cc
+++ b/net/socket/socket_posix.cc
@@ -347,10 +347,11 @@
   return ERR_IO_PENDING;
 }
 
-int SocketPosix::Write(IOBuffer* buf,
-                       int buf_len,
-                       const CompletionCallback& callback,
-                       const NetworkTrafficAnnotationTag& traffic_annotation) {
+int SocketPosix::Write(
+    IOBuffer* buf,
+    int buf_len,
+    const CompletionCallback& callback,
+    const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_NE(kInvalidSocket, socket_fd_);
   DCHECK(!waiting_connect_);
@@ -359,8 +360,6 @@
   DCHECK(!callback.is_null());
   DCHECK_LT(0, buf_len);
 
-  // TODO(crbug.com/656607): Handle traffic annotation.
-
   int rv = DoWrite(buf, buf_len);
   if (rv == ERR_IO_PENDING)
     rv = WaitForWrite(buf, buf_len, callback);
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc
index 637cdf9d..88344f0 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -928,12 +928,10 @@
     IOBuffer* buf,
     int buf_len,
     const CompletionCallback& callback,
-    const NetworkTrafficAnnotationTag& traffic_annotation) {
+    const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
   DCHECK(buf);
   DCHECK_GT(buf_len, 0);
 
-  // TODO(crbug.com/656607): Handle traffic annotation.
-
   if (!connected_ || !data_)
     return ERR_UNEXPECTED;
 
@@ -1356,12 +1354,10 @@
     IOBuffer* buf,
     int buf_len,
     const CompletionCallback& callback,
-    const NetworkTrafficAnnotationTag& traffic_annotation) {
+    const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
   DCHECK(buf);
   DCHECK_GT(buf_len, 0);
 
-  // TODO(crbug.com/656607): Handle traffic annotation.
-
   if (!connected_ || !data_)
     return ERR_UNEXPECTED;
 
diff --git a/net/socket/socks5_client_socket.h b/net/socket/socks5_client_socket.h
index c440aa27..8d3f34f5 100644
--- a/net/socket/socks5_client_socket.h
+++ b/net/socket/socks5_client_socket.h
@@ -67,12 +67,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
 
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
diff --git a/net/socket/socks5_client_socket_unittest.cc b/net/socket/socks5_client_socket_unittest.cc
index bef8a94..b8807287 100644
--- a/net/socket/socks5_client_socket_unittest.cc
+++ b/net/socket/socks5_client_socket_unittest.cc
@@ -24,6 +24,7 @@
 #include "net/socket/socket_test_util.h"
 #include "net/socket/tcp_client_socket.h"
 #include "net/test/gtest_util.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
@@ -173,8 +174,8 @@
 
   scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size()));
   memcpy(buffer->data(), payload_write.data(), payload_write.size());
-  rv = user_sock_->Write(
-      buffer.get(), payload_write.size(), callback_.callback());
+  rv = user_sock_->Write(buffer.get(), payload_write.size(),
+                         callback_.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
   rv = callback_.WaitForResult();
   EXPECT_EQ(static_cast<int>(payload_write.size()), rv);
diff --git a/net/socket/socks_client_socket.h b/net/socket/socks_client_socket.h
index dcef711..0061543 100644
--- a/net/socket/socks_client_socket.h
+++ b/net/socket/socks_client_socket.h
@@ -64,12 +64,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
 
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
diff --git a/net/socket/ssl_client_socket_impl.h b/net/socket/ssl_client_socket_impl.h
index 33a6054..40b5d97 100644
--- a/net/socket/ssl_client_socket_impl.h
+++ b/net/socket/ssl_client_socket_impl.h
@@ -130,12 +130,10 @@
   int ReadIfReady(IOBuffer* buf,
                   int buf_len,
                   const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
 
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index 99c8eaf..19576f439 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -266,12 +266,10 @@
   int ReadIfReady(IOBuffer* buf,
                   int buf_len,
                   const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
 
   // Sets the next Read() call and all future calls to return |error|.
   // If there is already a pending asynchronous read, the configured error
@@ -347,12 +345,10 @@
   int ReadIfReady(IOBuffer* buf,
                   int buf_len,
                   const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
 
   int pending_read_result() const { return pending_read_result_; }
   IOBuffer* pending_read_buf() const { return pending_read_buf_.get(); }
diff --git a/net/socket/ssl_server_socket_unittest.cc b/net/socket/ssl_server_socket_unittest.cc
index 54bc3a5..987768ca 100644
--- a/net/socket/ssl_server_socket_unittest.cc
+++ b/net/socket/ssl_server_socket_unittest.cc
@@ -66,7 +66,7 @@
 #include "net/test/cert_test_util.h"
 #include "net/test/gtest_util.h"
 #include "net/test/test_data_directory.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
@@ -120,12 +120,10 @@
     return PropagateData(buf, buf_len);
   }
 
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) {
+            const NetworkTrafficAnnotationTag& traffic_annotation) {
     DCHECK(write_callback_.is_null());
     if (closed_) {
       if (write_called_after_close_)
@@ -238,15 +236,14 @@
     return incoming_->Read(buf, buf_len, callback);
   }
 
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override {
+            const NetworkTrafficAnnotationTag& traffic_annotation) override {
     // Write random number of bytes.
     buf_len = rand() % buf_len + 1;
-    return outgoing_->Write(buf, buf_len, callback);
+    return outgoing_->Write(buf, buf_len, callback,
+                            TRAFFIC_ANNOTATION_FOR_TESTS);
   }
 
   int SetReceiveBufferSize(int32_t size) override { return OK; }
@@ -328,7 +325,8 @@
 
   // Write then read.
   int written =
-      server.Write(write_buf.get(), kTestDataSize, CompletionCallback());
+      server.Write(write_buf.get(), kTestDataSize, CompletionCallback(),
+                   TRAFFIC_ANNOTATION_FOR_TESTS);
   EXPECT_GT(written, 0);
   EXPECT_LE(written, kTestDataSize);
 
@@ -342,7 +340,8 @@
   EXPECT_EQ(ERR_IO_PENDING,
             server.Read(read_buf.get(), kReadBufSize, callback.callback()));
 
-  written = client.Write(write_buf.get(), kTestDataSize, CompletionCallback());
+  written = client.Write(write_buf.get(), kTestDataSize, CompletionCallback(),
+                         TRAFFIC_ANNOTATION_FOR_TESTS);
   EXPECT_GT(written, 0);
   EXPECT_LE(written, kTestDataSize);
 
diff --git a/net/socket/tcp_socket_win.cc b/net/socket/tcp_socket_win.cc
index a4efc03..4ecab0b60 100644
--- a/net/socket/tcp_socket_win.cc
+++ b/net/socket/tcp_socket_win.cc
@@ -518,11 +518,11 @@
   return ERR_IO_PENDING;
 }
 
-int TCPSocketWin::Write(IOBuffer* buf,
-                        int buf_len,
-                        const CompletionCallback& callback,
-                        const NetworkTrafficAnnotationTag& traffic_annotation) {
-  // TODO(crbug.com/656607): Handle traffic annotation.
+int TCPSocketWin::Write(
+    IOBuffer* buf,
+    int buf_len,
+    const CompletionCallback& callback,
+    const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK_NE(socket_, INVALID_SOCKET);
   DCHECK(!waiting_write_);
diff --git a/net/socket/tcp_socket_win.h b/net/socket/tcp_socket_win.h
index 5ea6305..1cb2675a 100644
--- a/net/socket/tcp_socket_win.h
+++ b/net/socket/tcp_socket_win.h
@@ -70,12 +70,10 @@
   int ReadIfReady(IOBuffer* buf,
                   int buf_len,
                   const CompletionCallback& callback);
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607);
+            const NetworkTrafficAnnotationTag& traffic_annotation);
 
   int GetLocalAddress(IPEndPoint* address) const;
   int GetPeerAddress(IPEndPoint* address) const;
diff --git a/net/socket/udp_client_socket.h b/net/socket/udp_client_socket.h
index f631c6d6..986898c 100644
--- a/net/socket/udp_client_socket.h
+++ b/net/socket/udp_client_socket.h
@@ -38,12 +38,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
   void Close() override;
   int GetPeerAddress(IPEndPoint* address) const override;
   int GetLocalAddress(IPEndPoint* address) const override;
diff --git a/net/socket/udp_socket_perftest.cc b/net/socket/udp_socket_perftest.cc
index 190e157..25f0ba3 100644
--- a/net/socket/udp_socket_perftest.cc
+++ b/net/socket/udp_socket_perftest.cc
@@ -17,6 +17,7 @@
 #include "net/socket/udp_socket.h"
 #include "net/test/gtest_util.h"
 #include "net/test/net_test_suite.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
@@ -75,7 +76,8 @@
         socket->Write(io_buffer.get(), io_buffer->size(),
                       base::Bind(&UDPSocketPerfTest::DoneWritePacketsToSocket,
                                  weak_factory_.GetWeakPtr(), socket,
-                                 num_of_packets - 1, done_callback));
+                                 num_of_packets - 1, done_callback),
+                      TRAFFIC_ANNOTATION_FOR_TESTS);
     if (rv == ERR_IO_PENDING)
       break;
     --num_of_packets;
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc
index 1f16055..82423090 100644
--- a/net/socket/udp_socket_unittest.cc
+++ b/net/socket/udp_socket_unittest.cc
@@ -29,6 +29,7 @@
 #include "net/socket/udp_server_socket.h"
 #include "net/test/gtest_util.h"
 #include "net/test/net_test_suite.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
@@ -98,8 +99,8 @@
   int WriteSocket(UDPClientSocket* socket, const std::string& msg) {
     scoped_refptr<StringIOBuffer> io_buffer(new StringIOBuffer(msg));
     TestCompletionCallback callback;
-    int rv =
-        socket->Write(io_buffer.get(), io_buffer->size(), callback.callback());
+    int rv = socket->Write(io_buffer.get(), io_buffer->size(),
+                           callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
     return callback.GetResult(rv);
   }
 
diff --git a/net/socket/udp_socket_win.cc b/net/socket/udp_socket_win.cc
index 99b73ab..7790d6a 100644
--- a/net/socket/udp_socket_win.cc
+++ b/net/socket/udp_socket_win.cc
@@ -407,11 +407,11 @@
   return ERR_IO_PENDING;
 }
 
-int UDPSocketWin::Write(IOBuffer* buf,
-                        int buf_len,
-                        const CompletionCallback& callback,
-                        const NetworkTrafficAnnotationTag& traffic_annotation) {
-  // TODO(crbug.com/656607): Handle traffic annotation.
+int UDPSocketWin::Write(
+    IOBuffer* buf,
+    int buf_len,
+    const CompletionCallback& callback,
+    const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
   return SendToOrWrite(buf, buf_len, remote_address_.get(), callback);
 }
 
diff --git a/net/socket/udp_socket_win.h b/net/socket/udp_socket_win.h
index 8f7279ca..71094d4 100644
--- a/net/socket/udp_socket_win.h
+++ b/net/socket/udp_socket_win.h
@@ -89,12 +89,10 @@
   // Writes to the socket.
   // Only usable from the client-side of a UDP socket, after the socket
   // has been connected.
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607);
+            const NetworkTrafficAnnotationTag& traffic_annotation);
 
   // Reads from a socket and receive sender address information.
   // |buf| is the buffer to read data into.
diff --git a/net/socket/unix_domain_client_socket_posix.h b/net/socket/unix_domain_client_socket_posix.h
index 9b8cf426..dbc513c 100644
--- a/net/socket/unix_domain_client_socket_posix.h
+++ b/net/socket/unix_domain_client_socket_posix.h
@@ -66,12 +66,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
 
diff --git a/net/spdy/chromium/spdy_proxy_client_socket.h b/net/spdy/chromium/spdy_proxy_client_socket.h
index 3f26223..d95589dc 100644
--- a/net/spdy/chromium/spdy_proxy_client_socket.h
+++ b/net/spdy/chromium/spdy_proxy_client_socket.h
@@ -85,12 +85,10 @@
   int Read(IOBuffer* buf,
            int buf_len,
            const CompletionCallback& callback) override;
-  // TODO(crbug.com/656607): Remove default value.
   int Write(IOBuffer* buf,
             int buf_len,
             const CompletionCallback& callback,
-            const NetworkTrafficAnnotationTag& traffic_annotation =
-                NO_TRAFFIC_ANNOTATION_BUG_656607) override;
+            const NetworkTrafficAnnotationTag& traffic_annotation) override;
   int SetReceiveBufferSize(int32_t size) override;
   int SetSendBufferSize(int32_t size) override;
   int GetPeerAddress(IPEndPoint* address) const override;
diff --git a/net/spdy/chromium/spdy_proxy_client_socket_unittest.cc b/net/spdy/chromium/spdy_proxy_client_socket_unittest.cc
index 63c8d10..e8eccf49 100644
--- a/net/spdy/chromium/spdy_proxy_client_socket_unittest.cc
+++ b/net/spdy/chromium/spdy_proxy_client_socket_unittest.cc
@@ -33,6 +33,7 @@
 #include "net/test/cert_test_util.h"
 #include "net/test/gtest_util.h"
 #include "net/test/test_data_directory.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
@@ -286,8 +287,8 @@
                                                    int len,
                                                    int rv) {
   scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len));
-  EXPECT_EQ(rv,
-            sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
+  EXPECT_EQ(rv, sock_->Write(buf.get(), buf->size(), write_callback_.callback(),
+                             TRAFFIC_ANNOTATION_FOR_TESTS));
 }
 
 void SpdyProxyClientSocketTest::AssertWriteLength(int len) {
@@ -590,7 +591,8 @@
                                                    big_data.length()));
 
   EXPECT_EQ(ERR_IO_PENDING,
-            sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
+            sock_->Write(buf.get(), buf->size(), write_callback_.callback(),
+                         TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(buf->size(), write_callback_.WaitForResult());
 }
 
@@ -1055,7 +1057,8 @@
   ResumeAndRun();
   scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
   EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
-            sock_->Write(buf.get(), buf->size(), CompletionCallback()));
+            sock_->Write(buf.get(), buf->size(), CompletionCallback(),
+                         TRAFFIC_ANNOTATION_FOR_TESTS));
 }
 
 // Calling Write() on a disconnected socket is an error.
@@ -1081,7 +1084,8 @@
 
   scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
   EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
-            sock_->Write(buf.get(), buf->size(), CompletionCallback()));
+            sock_->Write(buf.get(), buf->size(), CompletionCallback(),
+                         TRAFFIC_ANNOTATION_FOR_TESTS));
 
   // Let the RST_STREAM write while |rst| is in-scope.
   base::RunLoop().RunUntilIdle();
@@ -1109,7 +1113,8 @@
 
   scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
   EXPECT_EQ(ERR_IO_PENDING,
-            sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
+            sock_->Write(buf.get(), buf->size(), write_callback_.callback(),
+                         TRAFFIC_ANNOTATION_FOR_TESTS));
   // Make sure the write actually starts.
   base::RunLoop().RunUntilIdle();
 
@@ -1141,7 +1146,8 @@
 
   scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
   EXPECT_EQ(ERR_IO_PENDING,
-            sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
+            sock_->Write(buf.get(), buf->size(), write_callback_.callback(),
+                         TRAFFIC_ANNOTATION_FOR_TESTS));
 
   sock_->Disconnect();
 
@@ -1213,10 +1219,9 @@
             sock_->Read(read_buf.get(), kLen1, read_callback_.callback()));
 
   scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1));
-  EXPECT_EQ(
-      ERR_IO_PENDING,
-      sock_->Write(
-          write_buf.get(), write_buf->size(), write_callback_.callback()));
+  EXPECT_EQ(ERR_IO_PENDING, sock_->Write(write_buf.get(), write_buf->size(),
+                                         write_callback_.callback(),
+                                         TRAFFIC_ANNOTATION_FOR_TESTS));
 
   ResumeAndRun();
 
@@ -1345,10 +1350,9 @@
             sock_->Read(read_buf.get(), kLen1, read_callback.callback()));
 
   scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1));
-  EXPECT_EQ(
-      ERR_IO_PENDING,
-      sock_->Write(
-          write_buf.get(), write_buf->size(), write_callback_.callback()));
+  EXPECT_EQ(ERR_IO_PENDING, sock_->Write(write_buf.get(), write_buf->size(),
+                                         write_callback_.callback(),
+                                         TRAFFIC_ANNOTATION_FOR_TESTS));
 
   ResumeAndRun();
 
diff --git a/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc b/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc
index 7af8a3a..e8982d6 100644
--- a/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc
+++ b/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc
@@ -22,6 +22,7 @@
 #include "net/base/test_completion_callback.h"
 #include "net/socket/socket_posix.h"
 #include "net/socket/unix_domain_client_socket_posix.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "remoting/host/security_key/security_key_auth_handler.h"
 #include "remoting/host/security_key/security_key_socket.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -125,9 +126,9 @@
     net::TestCompletionCallback write_callback;
     int bytes_written = 0;
     while (bytes_written < request_len) {
-      int write_result = client_socket->Write(request_buffer.get(),
-                                              request_buffer->BytesRemaining(),
-                                              write_callback.callback());
+      int write_result = client_socket->Write(
+          request_buffer.get(), request_buffer->BytesRemaining(),
+          write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
       write_result = write_callback.GetResult(write_result);
       ASSERT_GT(write_result, 0);
       bytes_written += write_result;
diff --git a/remoting/protocol/pseudotcp_adapter.cc b/remoting/protocol/pseudotcp_adapter.cc
index 382cc5c4..1b65002 100644
--- a/remoting/protocol/pseudotcp_adapter.cc
+++ b/remoting/protocol/pseudotcp_adapter.cc
@@ -159,13 +159,12 @@
     const scoped_refptr<net::IOBuffer>& buffer,
     int buffer_size,
     const net::CompletionCallback& callback,
-    const net::NetworkTrafficAnnotationTag& traffic_annotation) {
+    const net::NetworkTrafficAnnotationTag& /*traffic_annotation*/) {
   DCHECK(write_callback_.is_null());
 
   // Reference the Core in case a callback deletes the adapter.
   scoped_refptr<Core> core(this);
 
-  // TODO(crbug.com/656607): Handle traffic annotation.
   int result = pseudo_tcp_.Send(buffer->data(), buffer_size);
   if (result < 0) {
     result = net::MapSystemError(pseudo_tcp_.GetError());
diff --git a/services/ui/ws/display_manager.cc b/services/ui/ws/display_manager.cc
index 8a9cbe5e..f135b3b 100644
--- a/services/ui/ws/display_manager.cc
+++ b/services/ui/ws/display_manager.cc
@@ -96,6 +96,8 @@
   bool found_internal_display = false;
 
   // Check the mirrors before potentially passing them to a unified display.
+  DCHECK(window_server_->is_hosting_viz() || mirrors.empty())
+      << "The window server only handles mirrors specially when hosting viz.";
   for (const auto& mirror : mirrors) {
     if (mirror.id() == display::kInvalidDisplayId) {
       LOG(ERROR) << "SetDisplayConfiguration passed invalid display id";
diff --git a/services/ui/ws/server_window.cc b/services/ui/ws/server_window.cc
index 9da355131..efc68f3 100644
--- a/services/ui/ws/server_window.cc
+++ b/services/ui/ws/server_window.cc
@@ -178,6 +178,11 @@
     observer.OnWindowHierarchyChanged(child, nullptr, this);
 }
 
+void ServerWindow::RemoveAllChildren() {
+  while (!children_.empty())
+    Remove(children_[0]);
+}
+
 void ServerWindow::Reorder(ServerWindow* relative,
                            mojom::OrderDirection direction) {
   parent_->children_.erase(
diff --git a/services/ui/ws/server_window.h b/services/ui/ws/server_window.h
index 042a9d9..2998481 100644
--- a/services/ui/ws/server_window.h
+++ b/services/ui/ws/server_window.h
@@ -86,8 +86,15 @@
     return current_local_surface_id_;
   }
 
+  // Add the child to this window.
   void Add(ServerWindow* child);
+
+  // Removes the child window, but does not delete it.
   void Remove(ServerWindow* child);
+
+  // Removes all child windows from this window, but does not delete them.
+  void RemoveAllChildren();
+
   void Reorder(ServerWindow* relative, mojom::OrderDirection diretion);
   void StackChildAtBottom(ServerWindow* child);
   void StackChildAtTop(ServerWindow* child);
diff --git a/services/ui/ws/window_manager_state.cc b/services/ui/ws/window_manager_state.cc
index 6de4266..6960a74 100644
--- a/services/ui/ws/window_manager_state.cc
+++ b/services/ui/ws/window_manager_state.cc
@@ -296,8 +296,6 @@
       return;
     }
   }
-
-  NOTREACHED();
 }
 
 const UserId& WindowManagerState::user_id() const {
diff --git a/services/ui/ws/window_tree.cc b/services/ui/ws/window_tree.cc
index 510efc7..5099571 100644
--- a/services/ui/ws/window_tree.cc
+++ b/services/ui/ws/window_tree.cc
@@ -344,6 +344,7 @@
   }
 
   Display* display = display_manager()->GetDisplayById(display_to_create.id());
+  const bool display_already_existed = display != nullptr;
   if (!display) {
     // Create a display if the window manager is extending onto a new display.
     display = display_manager()->AddDisplayForWindowManager(
@@ -362,7 +363,7 @@
       display->GetWindowManagerDisplayRootForUser(
           window_manager_state_->user_id());
   DCHECK(display_root);
-  DCHECK(display_root->root()->children().empty());
+  display_root->root()->RemoveAllChildren();
 
   // NOTE: this doesn't resize the window in any way. We assume the client takes
   // care of any modifications it needs to do.
@@ -375,6 +376,13 @@
     DCHECK(old_parent);
     window_manager_state_->DeleteWindowManagerDisplayRoot(old_parent);
   }
+  if (display_already_existed &&
+      display->platform_display()->GetAcceleratedWidget()) {
+    // Notify the window manager that the dispay's accelerated widget is already
+    // available, if the display is being reused for a new window tree host.
+    window_manager_internal_->WmOnAcceleratedWidgetForDisplay(
+        display->GetId(), display->platform_display()->GetAcceleratedWidget());
+  }
   return window;
 }
 
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index fb010ad..7bd6c10f 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -428,7 +428,7 @@
 crbug.com/591099 compositing/squashing/no-squashing-into-fixed-position-that-clips.html [ Failure ]
 crbug.com/591099 compositing/squashing/opacity-squashed-owner.html [ Failure ]
 crbug.com/591099 compositing/squashing/repaint-child-of-squashed.html [ Failure ]
-crbug.com/591099 compositing/squashing/selection-repaint-with-gaps.html [ Failure ]
+crbug.com/591099 compositing/squashing/selection-repaint-with-gaps.html [ Crash Failure ]
 crbug.com/591099 compositing/squashing/squash-above-fixed-1.html [ Failure ]
 crbug.com/591099 compositing/squashing/squash-above-fixed-2.html [ Failure ]
 crbug.com/591099 compositing/squashing/squash-above-fixed-3.html [ Failure ]
@@ -2178,15 +2178,15 @@
 crbug.com/591099 editing/selection/continuations-without-move-caret-to-boundary.html [ Failure ]
 crbug.com/591099 editing/selection/designmode-no-caret.html [ Failure ]
 crbug.com/591099 editing/selection/display-table-text.html [ Failure ]
-crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed.html [ Failure ]
-crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed.html [ Failure ]
-crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl.html [ Failure ]
-crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping.html [ Failure ]
+crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed.html [ Crash Failure ]
+crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed.html [ Crash Failure ]
+crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl.html [ Crash Failure ]
+crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping.html [ Crash Failure ]
 crbug.com/591099 editing/selection/double_click_and_modify.html [ Failure Pass ]
 crbug.com/591099 editing/selection/doubleclick-beside-cr-span.html [ Failure Timeout ]
 crbug.com/591099 editing/selection/doubleclick-whitespace.html [ Failure Pass ]
 crbug.com/591099 editing/selection/drag-in-iframe.html [ Failure ]
-crbug.com/591099 editing/selection/drag-select-1.html [ Failure ]
+crbug.com/591099 editing/selection/drag-select-1.html [ Crash Failure ]
 crbug.com/591099 editing/selection/drag-selection-nodes.html [ Failure Pass ]
 crbug.com/591099 editing/selection/drag-to-contenteditable-iframe.html [ Failure ]
 crbug.com/591099 editing/selection/drag_with_unfocused_selection.html [ Failure ]
@@ -2261,11 +2261,11 @@
 crbug.com/591099 editing/selection/select-out-of-floated-contenteditable.html [ Failure ]
 crbug.com/591099 editing/selection/select-out-of-floated-input.html [ Failure ]
 crbug.com/591099 editing/selection/select-out-of-floated-textarea.html [ Failure ]
-crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2.html [ Failure ]
-crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-ltr.html [ Failure ]
-crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2.html [ Failure ]
-crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Failure ]
-crbug.com/591099 editing/selection/select-text-overflow-ellipsis.html [ Failure ]
+crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2.html [ Crash Failure ]
+crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-ltr.html [ Crash Failure ]
+crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2.html [ Crash Failure ]
+crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Crash Failure ]
+crbug.com/591099 editing/selection/select-text-overflow-ellipsis.html [ Crash Failure ]
 crbug.com/591099 editing/selection/selectNode.html [ Failure ]
 crbug.com/591099 editing/selection/selectNodeContents.html [ Failure ]
 crbug.com/591099 editing/selection/select_all/select_all_overflow_hidden_table.html [ Failure Pass ]
@@ -2499,11 +2499,11 @@
 crbug.com/591099 external/wpt/css/css-tables/table-model-fixup-2.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-tables/visibility-collapse-rowcol-001.html [ Crash Pass ]
 crbug.com/591099 external/wpt/css/css-tables/visibility-collapse-rowspan-crash.html [ Crash Pass ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Crash ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-006.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-007.html [ Failure ]
@@ -2511,9 +2511,9 @@
 crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-010.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-012.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-021.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-filled-001.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-open-001.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-shape-001.xht [ Crash ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-filled-001.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-open-001.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-shape-001.xht [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-ui/box-sizing-007.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-ui/box-sizing-008.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-ui/box-sizing-009.html [ Failure ]
@@ -2987,14 +2987,14 @@
 crbug.com/591099 fast/block/positioning/abs-inside-inline-rel.html [ Crash ]
 crbug.com/591099 fast/block/positioning/absolute-appended-to-inline.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-2.html [ Crash ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-3.html [ Crash ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr.html [ Crash ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-2.html [ Crash ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-3.html [ Crash ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl.html [ Crash ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-short-ltr.html [ Crash ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-short-rtl.html [ Crash ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-2.html [ Crash Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-3.html [ Crash Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr.html [ Crash Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-2.html [ Crash Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-3.html [ Crash Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl.html [ Crash Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-short-ltr.html [ Crash Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-short-rtl.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/absolute-with-html-border-quirks.html [ Failure ]
 crbug.com/591099 fast/block/positioning/abspos-auto-left-and-width-change-parent-margin-left.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto-height-with-top-and-bottom.html [ Failure ]
@@ -3006,7 +3006,7 @@
 crbug.com/591099 fast/block/positioning/child-of-fixed-pos-after-movement.html [ Crash ]
 crbug.com/591099 fast/block/positioning/fixed-in-abs-height-change.html [ Crash ]
 crbug.com/591099 fast/block/positioning/fixed-positioning-scrollbar-bug.html [ Failure ]
-crbug.com/591099 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Crash ]
+crbug.com/591099 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Crash Pass ]
 crbug.com/591099 fast/block/positioning/hittest-on-relative-positioned-children.html [ Failure ]
 crbug.com/591099 fast/block/positioning/inline-block-relposition.html [ Failure ]
 crbug.com/591099 fast/block/positioning/leftmargin-topmargin.html [ Failure ]
@@ -3015,7 +3015,7 @@
 crbug.com/591099 fast/block/positioning/rel-positioned-inline-changes-width.html [ Crash ]
 crbug.com/591099 fast/block/positioning/relative-overflow-block.html [ Failure ]
 crbug.com/591099 fast/block/positioning/relative-overflow-replaced.html [ Failure ]
-crbug.com/591099 fast/block/positioning/relative-positioned-inline-container.html [ Crash ]
+crbug.com/591099 fast/block/positioning/relative-positioned-inline-container.html [ Crash Pass ]
 crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash-2.html [ Failure ]
 crbug.com/591099 fast/block/positioning/rtl-static-positioning.html [ Failure ]
 crbug.com/591099 fast/block/positioning/table-cell-static-position.html [ Failure Pass ]
@@ -3332,8 +3332,8 @@
 crbug.com/591099 fast/css/MarqueeLayoutTest.html [ Failure ]
 crbug.com/591099 fast/css/ZeroOpacityLayers.html [ Failure ]
 crbug.com/591099 fast/css/ZeroOpacityLayers2.html [ Failure ]
-crbug.com/591099 fast/css/abs-pos-child-inside-rel-pos-inline-001.html [ Crash ]
-crbug.com/591099 fast/css/abs-pos-child-inside-rel-pos-inline-offset-001.html [ Crash ]
+crbug.com/591099 fast/css/abs-pos-child-inside-rel-pos-inline-001.html [ Crash Failure ]
+crbug.com/591099 fast/css/abs-pos-child-inside-rel-pos-inline-offset-001.html [ Crash Failure ]
 crbug.com/591099 fast/css/absolute-child-with-percent-height-inside-relative-parent.html [ Failure ]
 crbug.com/591099 fast/css/absolute-poition-in-rtl-parent.html [ Failure ]
 crbug.com/591099 fast/css/acid2-pixel.html [ Failure ]
@@ -3724,7 +3724,7 @@
 crbug.com/591099 fast/dom/shadow/shadow-contents-event.html [ Crash ]
 crbug.com/591099 fast/dom/shadow/shadow-dom-event-dispatching-details-summary.html [ Crash ]
 crbug.com/591099 fast/dom/shadow/shadow-dom-event-dispatching-svg-in-shadow-subtree.html [ Failure ]
-crbug.com/591099 fast/dom/vertical-scrollbar-in-rtl.html [ Failure Pass ]
+crbug.com/591099 fast/dom/vertical-scrollbar-in-rtl.html [ Crash Failure Pass ]
 crbug.com/591099 fast/dom/wrapper-classes.html [ Timeout ]
 crbug.com/591099 fast/dom/wrapper-context.html [ Failure ]
 crbug.com/591099 fast/dynamic/001.html [ Failure ]
@@ -4344,7 +4344,7 @@
 crbug.com/591099 fast/inline/inline-box-background-repeat-y.html [ Failure ]
 crbug.com/591099 fast/inline/inline-box-background.html [ Failure ]
 crbug.com/591099 fast/inline/inline-focus-ring-under-absolute-enclosing-relative-div.html [ Failure ]
-crbug.com/591099 fast/inline/inline-offsetLeft-relpos.html [ Crash ]
+crbug.com/591099 fast/inline/inline-offsetLeft-relpos.html [ Crash Failure ]
 crbug.com/591099 fast/inline/justify-emphasis-inline-box.html [ Failure ]
 crbug.com/591099 fast/inline/left-right-center-inline-alignment-in-ltr-and-rtl-blocks.html [ Failure ]
 crbug.com/591099 fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline.html [ Failure ]
@@ -5014,7 +5014,7 @@
 crbug.com/591099 compositing/overflow/overflow-with-negative-z-index-child.html [ Failure ]
 crbug.com/714962 compositing/overflow/rtl-overflow.html [ Failure ]
 crbug.com/591099 compositing/perspective-interest-rect.html [ Failure ]
-crbug.com/714962 compositing/squashing/squash-composited-input.html [ Failure ]
+crbug.com/714962 compositing/squashing/squash-composited-input.html [ Failure Pass ]
 crbug.com/714962 compositing/squashing/squash-overflow-hidden-scrolltop.html [ Failure ]
 crbug.com/591099 compositing/squashing/squashing-does-not-stop-transform-propagation.html [ Crash ]
 crbug.com/714962 compositing/squashing/universal-accelerated-overflow-scrolling.html [ Failure ]
@@ -5123,11 +5123,14 @@
 crbug.com/714962 editing/selection/offset-from-point.html [ Failure ]
 crbug.com/714962 editing/selection/select-from-textfield-outwards.html [ Failure ]
 crbug.com/714962 editing/selection/select-line-break-with-opposite-directionality.html [ Failure ]
+crbug.com/591099 editing/selection/select-out-of-floated-non-editable.html [ Failure ]
 crbug.com/591099 editing/selection/selection-linebreaks-rtl-writing-modes.html [ Failure ]
 crbug.com/714962 editing/selection/skip-over-contenteditable.html [ Failure ]
+crbug.com/591099 editing/selection/subpixel-positioned-selection.html [ Crash ]
 crbug.com/714962 editing/selection/table-lineboundary.html [ Failure ]
 crbug.com/714962 editing/shadow/compare-positions-in-nested-shadow.html [ Failure ]
 crbug.com/714962 editing/surrounding-text/surrounding-text.html [ Failure ]
+crbug.com/591099 editing/text-iterator/first_letter_find_string_crash.html [ Crash Pass ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_AES-CBC.https.worker.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_AES-CTR.https.worker.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_AES-GCM.https.worker.html [ Pass Timeout ]
@@ -5265,6 +5268,7 @@
 crbug.com/591099 external/wpt/css/css-multicol/multicol-gap-large-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-multicol/multicol-gap-negative-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-multicol/multicol-height-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-multicol/multicol-height-block-child-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-multicol/multicol-inherit-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-multicol/multicol-inherit-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-multicol/multicol-list-item-001.xht [ Failure ]
@@ -5357,11 +5361,11 @@
 crbug.com/591099 external/wpt/css/css-style-attr/style-attr-urls-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-style-attr/style-attr-urls-002.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-tables/visibility-collapse-colspan-003.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Crash ]
-crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-string-001.xht [ Crash ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-style-string-001.xht [ Crash Failure ]
 crbug.com/714962 external/wpt/css/css-transforms/matrix/svg-matrix-036.html [ Failure ]
 crbug.com/714962 external/wpt/css/css-transforms/matrix/svg-matrix-037.html [ Failure ]
 crbug.com/714962 external/wpt/css/css-transforms/matrix/svg-matrix-038.html [ Failure ]
@@ -5413,7 +5417,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-039.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-041.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-043.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-045.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-045.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-047.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-049.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-051.xht [ Failure Pass ]
@@ -5431,8 +5435,8 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-075.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-077.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-079.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-081.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-083.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-081.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-083.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-085.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-087.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089.xht [ Failure Pass ]
@@ -5444,7 +5448,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-105.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-107.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-109.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-111.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-111.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-113.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-115.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-117.xht [ Failure Pass ]
@@ -5453,7 +5457,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-123.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-127.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-129.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-129.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-131.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-133.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-135.xht [ Failure Pass ]
@@ -5462,7 +5466,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-141.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-143.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-145.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-147.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-147.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-149.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-151.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-153.xht [ Failure Pass ]
@@ -5476,7 +5480,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-169.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-171.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-173.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-175.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-175.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-177.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-179.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-181.xht [ Failure ]
@@ -5486,8 +5490,8 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-191.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-193.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-195.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-197.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-195.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-197.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-199.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-203.xht [ Failure ]
@@ -5591,7 +5595,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-174.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-178.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-180.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-180.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-182.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-184.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-186.xht [ Failure ]
@@ -5691,14 +5695,14 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-002.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-004.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-006.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-008.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-008.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-010.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-012.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-014.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-016.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-018.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-018.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/text-combine-upright-decorations-001.html [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-indent-vlr-003.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-indent-vlr-003.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-indent-vlr-005.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-indent-vlr-011.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-indent-vlr-013.xht [ Failure ]
@@ -5779,6 +5783,8 @@
 crbug.com/591099 external/wpt/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-encode-href-errors-hangul.html [ Timeout ]
 crbug.com/591099 external/wpt/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-encode-href-errors-misc.html [ Timeout ]
 crbug.com/591099 external/wpt/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-encode-href.html [ Timeout ]
+crbug.com/591099 external/wpt/feature-policy/autoplay-allowed-by-feature-policy-attribute.https.sub.html [ Failure ]
+crbug.com/591099 external/wpt/feature-policy/autoplay-allowed-by-feature-policy.https.sub.html [ Failure ]
 crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements-xhtml.xhtml [ Crash ]
 crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements.html [ Crash ]
 crbug.com/591099 external/wpt/html/dom/documents/resource-metadata-management/document-lastModified-01.html [ Pass ]
@@ -5843,7 +5849,7 @@
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_pre-wrap_wrapped.html [ Crash ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_pre-wrap_wrapped.html [ Crash ]
 crbug.com/714962 fast/backgrounds/root-background-propagation3.html [ Failure ]
-crbug.com/714962 fast/backgrounds/selection-background-color.html [ Failure ]
+crbug.com/714962 fast/backgrounds/selection-background-color.html [ Failure Pass ]
 crbug.com/714962 fast/block/basic/015.html [ Failure ]
 crbug.com/714962 fast/block/basic/016.html [ Failure ]
 crbug.com/591099 fast/block/block-remove-child-delete-line-box-crash.html [ Crash ]
@@ -5882,8 +5888,8 @@
 crbug.com/714962 fast/block/margin-collapse/044.html [ Failure ]
 crbug.com/714962 fast/block/margin-collapse/line-beside-float-complex-margin-collapsing.html [ Failure ]
 crbug.com/591099 fast/block/percent-height-descendant-not-removed-crash2.html [ Crash ]
-crbug.com/591099 fast/block/positioning/052.html [ Crash ]
-crbug.com/591099 fast/block/positioning/058.html [ Crash ]
+crbug.com/591099 fast/block/positioning/052.html [ Crash Pass ]
+crbug.com/591099 fast/block/positioning/058.html [ Crash Pass ]
 crbug.com/591099 fast/block/positioning/abspositioned-object-under-split-relpositioned-inline-crash.html [ Crash ]
 crbug.com/714962 fast/block/positioning/auto/006.html [ Failure Pass ]
 crbug.com/714962 fast/block/positioning/auto/vertical-lr/006.html [ Failure Pass ]
@@ -5898,7 +5904,7 @@
 crbug.com/591099 fast/block/positioning/removing-inside-relpositioned-inline-crash.html [ Crash ]
 crbug.com/714962 fast/borders/block-mask-overlay-image.html [ Failure ]
 crbug.com/714962 fast/borders/border-image-fill-no-border.html [ Failure Pass ]
-crbug.com/591099 fast/borders/border-image-inherits-with-border.html [ Failure ]
+crbug.com/591099 fast/borders/border-image-inherits-with-border.html [ Failure Pass ]
 crbug.com/714962 fast/borders/border-image-outset-split-inline.html [ Failure ]
 crbug.com/714962 fast/borders/border-image-scaled.html [ Failure ]
 crbug.com/714962 fast/borders/border-inner-bleed.html [ Failure ]
@@ -5999,7 +6005,7 @@
 crbug.com/591099 fast/css/pseudo-element-backdrop-hit-test.html [ Crash ]
 crbug.com/591099 fast/css/pseudo-required-optional-005.html [ Crash ]
 crbug.com/591099 fast/css/shadow-dom-scope.html [ Crash ]
-crbug.com/591099 fast/css/sticky/inline-sticky-abspos-child.html [ Crash ]
+crbug.com/591099 fast/css/sticky/inline-sticky-abspos-child.html [ Crash Failure ]
 crbug.com/714962 fast/css/sticky/replaced-sticky.html [ Failure ]
 crbug.com/714962 fast/css/sticky/sticky-both-sides-bottom-right-constrained.html [ Failure ]
 crbug.com/714962 fast/css/sticky/sticky-top-overflow.html [ Failure Pass ]
@@ -6152,7 +6158,7 @@
 crbug.com/714962 fast/forms/calendar-picker/week-picker-mouse-operations.html [ Failure ]
 crbug.com/714962 fast/forms/checkbox/checkbox-focus-by-mouse.html [ Failure ]
 crbug.com/714962 fast/forms/color/input-color-chooser-shown-readonly.html [ Failure Pass ]
-crbug.com/714962 fast/forms/color/input-color-chooser-shown.html [ Failure ]
+crbug.com/714962 fast/forms/color/input-color-chooser-shown.html [ Crash Failure ]
 crbug.com/714962 fast/forms/cursor-at-editable-content-boundary.html [ Failure ]
 crbug.com/591099 fast/forms/datalist/input-appearance-range-with-datalist-rtl.html [ Crash ]
 crbug.com/591099 fast/forms/datalist/range-snap-to-datalist.html [ Crash ]
@@ -6287,7 +6293,7 @@
 crbug.com/714962 fast/forms/textarea/drag-out-of-textarea.html [ Failure ]
 crbug.com/714962 fast/forms/textarea/textarea-inline-block-baseline.html [ Failure Pass ]
 crbug.com/714962 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Failure ]
-crbug.com/714962 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Failure ]
+crbug.com/714962 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Failure Timeout ]
 crbug.com/714962 fast/forms/textarea/textarea-resize-below-min-size-zoomed.html [ Failure ]
 crbug.com/714962 fast/forms/textarea/textarea-resize-below-min-size.html [ Failure ]
 crbug.com/714962 fast/forms/time-multiple-fields/time-multiple-fields-clearbutton-change-and-input-events.html [ Failure ]
@@ -6409,7 +6415,7 @@
 crbug.com/591099 fast/parser/title-error-test.html [ Failure ]
 crbug.com/591099 fast/parser/xhtml-alternate-entities.xml [ Failure ]
 crbug.com/591099 fast/reflections/abs-position-in-reflection.html [ Failure ]
-crbug.com/591099 fast/reflections/inline-crash.html [ Failure ]
+crbug.com/591099 fast/reflections/inline-crash.html [ Crash Failure ]
 crbug.com/591099 fast/reflections/opacity-reflection-transform.html [ Failure ]
 crbug.com/591099 fast/reflections/reflection-direction.html [ Failure ]
 crbug.com/591099 fast/reflections/reflection-masks-opacity.html [ Failure ]
@@ -6444,7 +6450,7 @@
 crbug.com/591099 fast/replaced/percent-height-in-anonymous-block.html [ Failure ]
 crbug.com/591099 fast/replaced/preferred-widths.html [ Failure ]
 crbug.com/591099 fast/replaced/replaced-element-with-percentage-height-anonymous-block-parent.html [ Failure ]
-crbug.com/591099 fast/replaced/replaced-last-line-layout.html [ Crash ]
+crbug.com/591099 fast/replaced/replaced-last-line-layout.html [ Crash Pass ]
 crbug.com/591099 fast/replaced/selection-rect-in-table-cell.html [ Failure Pass ]
 crbug.com/591099 fast/replaced/selection-rect-transform.html [ Failure ]
 crbug.com/591099 fast/replaced/selection-rect.html [ Failure Pass ]
@@ -6601,9 +6607,9 @@
 crbug.com/591099 fast/selectors/placeholder-shown-sibling-style-update.html [ Failure ]
 crbug.com/591099 fast/selectors/placeholder-shown-style-update.html [ Failure ]
 crbug.com/591099 fast/selectors/querySelector-in-range-crash.html [ Crash ]
-crbug.com/714962 fast/selectors/selection-window-inactive.html [ Failure ]
-crbug.com/591099 fast/selectors/shadow-host-div-with-span.html [ Failure ]
-crbug.com/591099 fast/selectors/shadow-host-div-with-text.html [ Failure ]
+crbug.com/714962 fast/selectors/selection-window-inactive.html [ Failure Pass ]
+crbug.com/591099 fast/selectors/shadow-host-div-with-span.html [ Failure Pass ]
+crbug.com/591099 fast/selectors/shadow-host-div-with-text.html [ Failure Pass ]
 crbug.com/591099 fast/selectors/unqualified-hover-quirks.html [ Failure ]
 crbug.com/591099 fast/selectors/unqualified-hover-strict.html [ Failure ]
 crbug.com/591099 fast/selectors/visited-descendant.html [ Failure ]
@@ -6714,6 +6720,7 @@
 crbug.com/591099 fast/sub-pixel/inline-block-with-padding.html [ Failure ]
 crbug.com/714962 fast/sub-pixel/position-right-aligns-with-container.html [ Failure Pass ]
 crbug.com/591099 fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer.html [ Failure ]
+crbug.com/591099 fast/sub-pixel/selection/selection-rect-in-sub-pixel-table.html [ Crash ]
 crbug.com/591099 fast/sub-pixel/should-not-repaint-subpixel-composited-layer.html [ Failure ]
 crbug.com/714962 fast/sub-pixel/size-of-span-with-different-positions.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ]
@@ -7033,7 +7040,7 @@
 crbug.com/591099 fast/text/justify-ideograph-vertical.html [ Failure ]
 crbug.com/714962 fast/text/justify-padding-distribution.html [ Failure Pass ]
 crbug.com/591099 fast/text/large-text-composed-char.html [ Timeout ]
-crbug.com/591099 fast/text/letter-spacing-leading-and-trailing.html [ Failure ]
+crbug.com/591099 fast/text/letter-spacing-leading-and-trailing.html [ Crash Failure ]
 crbug.com/714962 fast/text/line-break-after-inline-latin1.html [ Failure ]
 crbug.com/591099 fast/text/long-word.html [ Failure Pass ]
 crbug.com/714962 fast/text/multiglyph-characters.html [ Failure ]
@@ -7064,26 +7071,29 @@
 crbug.com/591099 fast/text/place-rtl-ellipsis-in-inline-blocks.html [ Failure ]
 crbug.com/714962 fast/text/recalc-position-of-linebox-after-deleting-ellipsis.html [ Failure ]
 crbug.com/714962 fast/text/remove-zero-length-run.html [ Failure ]
-crbug.com/714962 fast/text/selection/atsui-partial-selection.html [ Failure ]
+crbug.com/714962 fast/text/selection/atsui-partial-selection.html [ Failure Pass ]
 crbug.com/714962 fast/text/selection/atsui-rtl-override-selection.html [ Failure ]
-crbug.com/714962 fast/text/selection/complex-text-rtl-selection-repaint.html [ Failure ]
+crbug.com/714962 fast/text/selection/complex-text-rtl-selection-repaint.html [ Crash Failure Pass ]
+crbug.com/591099 fast/text/selection/complex-text-spaces-selection.html [ Crash Pass ]
 crbug.com/714962 fast/text/selection/flexbox-selection-nested.html [ Failure ]
 crbug.com/591099 fast/text/selection/flexbox-selection.html [ Failure ]
+crbug.com/591099 fast/text/selection/hebrew-selection.html [ Crash Failure ]
 crbug.com/714962 fast/text/selection/insert-text-crash.html [ Failure ]
-crbug.com/714962 fast/text/selection/justified-selection.html [ Failure ]
+crbug.com/714962 fast/text/selection/justified-selection.html [ Failure Pass ]
 crbug.com/591099 fast/text/selection/khmer-selection.html [ Failure ]
 crbug.com/591099 fast/text/selection/offsetForPosition-complex-fallback.html [ Failure ]
 crbug.com/714962 fast/text/selection/pre-wrap-overflow-selection.html [ Failure ]
+crbug.com/591099 fast/text/selection/repaint-glyph-bounds.html [ Failure ]
 crbug.com/714962 fast/text/selection/reset-drag-on-mouse-down.html [ Failure ]
 crbug.com/591099 fast/text/selection/selection-hard-linebreak.html [ Failure ]
-crbug.com/714962 fast/text/selection/selection-multiple-runs.html [ Failure ]
-crbug.com/714962 fast/text/selection/selection-painted-separately.html [ Failure ]
-crbug.com/591099 fast/text/selection/selection-painting-hidpi.html [ Failure ]
-crbug.com/591099 fast/text/selection/selection-rect-line-height-too-big.html [ Failure ]
-crbug.com/591099 fast/text/selection/selection-rect-line-height-too-small.html [ Failure ]
+crbug.com/714962 fast/text/selection/selection-multiple-runs.html [ Crash Failure Pass ]
+crbug.com/714962 fast/text/selection/selection-painted-separately.html [ Failure Pass ]
+crbug.com/591099 fast/text/selection/selection-painting-hidpi.html [ Failure Pass ]
+crbug.com/591099 fast/text/selection/selection-rect-line-height-too-big.html [ Failure Pass ]
+crbug.com/591099 fast/text/selection/selection-rect-line-height-too-small.html [ Failure Pass ]
 crbug.com/591099 fast/text/selection/selection-rect-rounding.html [ Failure ]
-crbug.com/591099 fast/text/selection/selection-with-inline-padding.html [ Failure ]
-crbug.com/714962 fast/text/selection/shaping-selection-rect.html [ Failure ]
+crbug.com/591099 fast/text/selection/selection-with-inline-padding.html [ Crash Failure ]
+crbug.com/714962 fast/text/selection/shaping-selection-rect.html [ Crash Failure ]
 crbug.com/714962 fast/text/selection/should-use-atsui.html [ Failure ]
 crbug.com/714962 fast/text/selection/thai-offsetForPosition-inside-character.html [ Failure ]
 crbug.com/591099 fast/text/shaping/same-script-different-lang.html [ Failure ]
@@ -7206,7 +7216,7 @@
 crbug.com/591099 fragmentation/block-after-float-first-child.html [ Failure ]
 crbug.com/591099 fragmentation/block-with-float-and-1-orphaned-line.html [ Failure ]
 crbug.com/591099 fragmentation/border-spacing-break-before-unbreakable-row.html [ Failure ]
-crbug.com/591099 fragmentation/break-before-empty-child-block.html [ Failure ]
+crbug.com/591099 fragmentation/break-before-empty-child-block.html [ Crash Failure ]
 crbug.com/591099 fragmentation/break-in-first-table-row-only.html [ Failure ]
 crbug.com/591099 fragmentation/break-in-second-table-section.html [ Failure ]
 crbug.com/591099 fragmentation/break-in-tbody-after-caption.html [ Failure ]
@@ -7552,7 +7562,7 @@
 crbug.com/714962 http/tests/devtools/layers/layer-canvas-log.js [ Failure ]
 crbug.com/591099 http/tests/devtools/network/network-columns-visible.js [ Failure Timeout ]
 crbug.com/591099 http/tests/devtools/network/network-datareceived.js [ Failure ]
-crbug.com/591099 http/tests/devtools/network/network-disable-cache-preloads.js [ Failure ]
+crbug.com/591099 http/tests/devtools/network/network-disable-cache-preloads.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/persistence/automapping-sourcemap-nameclash.js [ Failure ]
 crbug.com/591099 http/tests/devtools/persistence/persistence-tabbed-editor-opens-filesystem-uisourcecode.js [ Failure Timeout ]
 crbug.com/591099 http/tests/devtools/runtime/runtime-getProperties.js [ Failure ]
@@ -7564,7 +7574,7 @@
 crbug.com/591099 http/tests/devtools/sources/debugger-ui/function-generator-details.js [ Failure ]
 crbug.com/591099 http/tests/devtools/sources/debugger/live-edit-no-reveal.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger/properties-special.js [ Failure ]
-crbug.com/591099 http/tests/devtools/startup/console/console-format-startup.js [ Failure ]
+crbug.com/591099 http/tests/devtools/startup/console/console-format-startup.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/startup/reattach-after-editing-styles.html [ Crash Pass Timeout ]
 crbug.com/591099 http/tests/devtools/text-autosizing-override.js [ Failure ]
 crbug.com/714962 http/tests/devtools/tracing/scroll-invalidations.js [ Failure ]
@@ -7602,6 +7612,7 @@
 crbug.com/591099 http/tests/local/fileapi/file-last-modified-after-delete.html [ Failure ]
 crbug.com/591099 http/tests/local/fileapi/file-last-modified.html [ Failure ]
 crbug.com/714962 http/tests/local/fileapi/select-dragged-file-input-utf-8.html [ Failure ]
+crbug.com/591099 http/tests/local/fileapi/select-dragged-file-input.html [ Skip ]
 crbug.com/591099 http/tests/local/fileapi/send-dragged-file.html [ Failure ]
 crbug.com/591099 http/tests/local/fileapi/send-sliced-dragged-file.html [ Failure ]
 crbug.com/714962 http/tests/local/formdata/form-data-with-unknown-file-extension.html [ Failure ]
@@ -8085,6 +8096,7 @@
 crbug.com/591099 paint/invalidation/clip/clip-path-resize.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/clip-unclip-and-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/clip-with-layout-delta.html [ Failure ]
+crbug.com/591099 paint/invalidation/clip/clip-with-transform-resize.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/clipped-relative.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/control-clip.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/css-clip-change-stacking-child.html [ Failure ]
@@ -8311,7 +8323,7 @@
 crbug.com/591099 paint/invalidation/outline/continuation-after-outline.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-continuations.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-layers.html [ Crash ]
+crbug.com/591099 paint/invalidation/outline/focus-layers.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-ring-on-child-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
@@ -8516,11 +8528,11 @@
 crbug.com/714962 paint/invalidation/search-field-cancel.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/block-selection-gap-stale-cache-2.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/block-selection-gap-stale-cache.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html [ Failure ]
+crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html [ Crash Failure ]
+crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html [ Crash Failure ]
+crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html [ Crash Failure ]
+crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline.html [ Crash Failure ]
+crbug.com/591099 paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/selection/japanese-rl-selection-clear.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/japanese-rl-selection-repaint.html [ Failure ]
 crbug.com/714962 paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root.html [ Failure ]
@@ -8528,16 +8540,16 @@
 crbug.com/591099 paint/invalidation/selection/selection-after-delete.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/selection-after-remove.html [ Failure ]
 crbug.com/714962 paint/invalidation/selection/selection-and-text-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/selection-change-in-iframe-with-relative-parent.html [ Failure ]
+crbug.com/591099 paint/invalidation/selection/selection-change-in-iframe-with-relative-parent.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/selection/selection-clear-after-move.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/selection/selection-clear.html [ Failure ]
 crbug.com/714962 paint/invalidation/selection/selection-in-composited-scrolling-container.html [ Failure ]
 crbug.com/714962 paint/invalidation/selection/selection-in-non-composited-scrolling-container.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/selection-partial-invalidation-between-blocks.html [ Failure Pass ]
+crbug.com/591099 paint/invalidation/selection/selection-partial-invalidation-between-blocks.html [ Crash Failure Pass ]
 crbug.com/714962 paint/invalidation/selection/selection-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/selection-rl.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/selection-within-composited-scroller.html [ Failure ]
-crbug.com/714962 paint/invalidation/selection/text-selection-rect-in-overflow-2.html [ Failure ]
+crbug.com/591099 paint/invalidation/selection/selection-within-composited-scroller.html [ Crash Failure ]
+crbug.com/714962 paint/invalidation/selection/text-selection-rect-in-overflow-2.html [ Crash Failure ]
 crbug.com/714962 paint/invalidation/selection/text-selection-rect-in-overflow.html [ Failure ]
 crbug.com/591099 paint/invalidation/shadow-multiple.html [ Failure ]
 crbug.com/591099 paint/invalidation/stacked-diacritics.html [ Failure ]
@@ -8664,7 +8676,7 @@
 crbug.com/714962 paint/invalidation/svg/use-detach.svg [ Failure ]
 crbug.com/714962 paint/invalidation/svg/use-disappears-after-style-update.svg [ Failure ]
 crbug.com/714962 paint/invalidation/svg/use-inherit-style.svg [ Failure ]
-crbug.com/591099 paint/invalidation/svg/use-instanceRoot-event-bubbling.xhtml [ Pass Timeout ]
+crbug.com/591099 paint/invalidation/svg/use-instanceRoot-event-bubbling.xhtml [ Crash Pass Timeout ]
 crbug.com/591099 paint/invalidation/svg/use-setAttribute-crash.svg [ Failure ]
 crbug.com/714962 paint/invalidation/svg/window.svg [ Failure ]
 crbug.com/714962 paint/invalidation/svg/zoom-coords-viewattr-01-b.svg [ Failure ]
@@ -8818,19 +8830,19 @@
 crbug.com/591099 paint/printing/print-text-shadow.html [ Failure ]
 crbug.com/591099 paint/roundedrects/circle-with-shadow.html [ Failure ]
 crbug.com/591099 paint/roundedrects/input-with-rounded-rect-and-shadow.html [ Failure ]
-crbug.com/714962 paint/selection/text-selection-counter.html [ Failure ]
+crbug.com/714962 paint/selection/text-selection-counter.html [ Failure Pass ]
 crbug.com/714962 paint/selection/text-selection-drag.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-inline-block-rtl.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-inline-block.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-across-blocks-line-beginning-end.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-across-blocks.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-br.html [ Failure ]
+crbug.com/591099 paint/selection/text-selection-inline-block-rtl.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-inline-block.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-across-blocks-line-beginning-end.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-across-blocks.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-br.html [ Crash Failure ]
 crbug.com/591099 paint/selection/text-selection-newline-clipped-by-overflow.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-mixed-ltr-rtl.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-rtl-double-linebreak.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-rtl.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-span-across-line.html [ Failure ]
-crbug.com/591099 paint/selection/text-selection-newline-span.html [ Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-mixed-ltr-rtl.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-rtl-double-linebreak.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-rtl.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-span-across-line.html [ Crash Failure ]
+crbug.com/591099 paint/selection/text-selection-newline-span.html [ Crash Failure ]
 crbug.com/591099 paint/selection/text-selection-newline-vertical-lr.html [ Failure ]
 crbug.com/591099 paint/selection/text-selection-newline-vertical-rl.html [ Failure ]
 crbug.com/591099 paint/selection/text-selection-newline.html [ Failure ]
@@ -10537,6 +10549,7 @@
 crbug.com/714962 virtual/spv175/compositing/overflow/rtl-overflow.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/overflow/scaled-mask.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/overflow/scaled-overflow.html [ Failure ]
+crbug.com/591099 virtual/spv175/compositing/overflow/scroll-ancestor-update.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/overflow/scroll-parent-absolute-with-backdrop-filter.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/overflow/scroll-parent-absolute.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor.html [ Failure ]
@@ -10619,7 +10632,7 @@
 crbug.com/591099 virtual/spv175/compositing/squashing/no-squashing-into-fixed-position-that-clips.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/squashing/opacity-squashed-owner.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/squashing/repaint-child-of-squashed.html [ Failure ]
-crbug.com/591099 virtual/spv175/compositing/squashing/selection-repaint-with-gaps.html [ Failure ]
+crbug.com/591099 virtual/spv175/compositing/squashing/selection-repaint-with-gaps.html [ Crash Failure ]
 crbug.com/591099 virtual/spv175/compositing/squashing/squash-above-fixed-1.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/squashing/squash-above-fixed-2.html [ Failure ]
 crbug.com/591099 virtual/spv175/compositing/squashing/squash-above-fixed-3.html [ Failure ]
@@ -10734,6 +10747,7 @@
 crbug.com/591099 virtual/spv175/paint/invalidation/clip/caret-ancestor-clip-change.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/clip/clip-unclip-and-change.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/clip/clip-with-layout-delta.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/clip/clip-with-transform-resize.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/clip/clipped-relative.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/clip/control-clip.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/clip/css-clip-change-stacking-child.html [ Failure ]
@@ -10951,7 +10965,7 @@
 crbug.com/591099 virtual/spv175/paint/invalidation/outline/continuation-after-outline.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/outline/focus-continuations.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/outline/focus-layers.html [ Crash ]
+crbug.com/591099 virtual/spv175/paint/invalidation/outline/focus-layers.html [ Crash Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/outline/focus-ring-on-child-move.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
@@ -11075,6 +11089,7 @@
 crbug.com/591099 virtual/spv175/paint/invalidation/remove-inline-after-layout.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/remove-inline-layer-after-layout.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/renderer-destruction-by-invalidateSelection-crash.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/repaint-across-writing-mode-boundary.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/repaint-descandant-on-ancestor-layer-move.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/repaint-in-iframe.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/repaint-on-style-change.html [ Failure ]
@@ -11141,22 +11156,23 @@
 crbug.com/591099 virtual/spv175/paint/invalidation/scroll/scrolled-iframe-scrollbar-change.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/block-selection-gap-stale-cache-2.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/block-selection-gap-stale-cache.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-includes-newline.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html [ Crash Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/japanese-rl-selection-clear.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/japanese-rl-selection-repaint.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/selected-replaced.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-after-delete.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-after-remove.html [ Failure ]
 crbug.com/714962 virtual/spv175/paint/invalidation/selection/selection-and-text-repaint.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent.html [ Crash Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-clear.html [ Failure ]
 crbug.com/714962 virtual/spv175/paint/invalidation/selection/selection-repaint.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-within-composited-scroller.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/selection/text-selection-rect-in-overflow-2.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-rl.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/selection-within-composited-scroller.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/invalidation/selection/text-selection-rect-in-overflow-2.html [ Crash Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/selection/text-selection-rect-in-overflow.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/shadow-multiple.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/stacked-diacritics.html [ Failure ]
@@ -11200,7 +11216,7 @@
 crbug.com/714962 virtual/spv175/paint/invalidation/svg/text-xy-updates-SVGList.xhtml [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/svg/transform-focus-ring-repaint.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/svg/transform-foreign-object.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/invalidation/svg/use-instanceRoot-event-bubbling.xhtml [ Pass Timeout ]
+crbug.com/591099 virtual/spv175/paint/invalidation/svg/use-instanceRoot-event-bubbling.xhtml [ Crash Pass Timeout ]
 crbug.com/591099 virtual/spv175/paint/invalidation/svg/use-setAttribute-crash.svg [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/table/add-table-overpaint.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/invalidation/table/block-selection-gap-in-table-cell.html [ Failure ]
@@ -11334,19 +11350,19 @@
 crbug.com/591099 virtual/spv175/paint/printing/print-text-shadow.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/roundedrects/circle-with-shadow.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/roundedrects/input-with-rounded-rect-and-shadow.html [ Failure ]
-crbug.com/714962 virtual/spv175/paint/selection/text-selection-counter.html [ Failure ]
+crbug.com/714962 virtual/spv175/paint/selection/text-selection-counter.html [ Failure Pass ]
 crbug.com/714962 virtual/spv175/paint/selection/text-selection-drag.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-inline-block-rtl.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-inline-block.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-across-blocks-line-beginning-end.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-across-blocks.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-br.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-inline-block-rtl.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-inline-block.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-across-blocks-line-beginning-end.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-across-blocks.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-br.html [ Crash Failure ]
 crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-clipped-by-overflow.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-mixed-ltr-rtl.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-rtl-double-linebreak.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-rtl.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-span-across-line.html [ Failure ]
-crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-span.html [ Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-mixed-ltr-rtl.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-rtl-double-linebreak.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-rtl.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-span-across-line.html [ Crash Failure ]
+crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-span.html [ Crash Failure ]
 crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-vertical-lr.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline-vertical-rl.html [ Failure ]
 crbug.com/591099 virtual/spv175/paint/selection/text-selection-newline.html [ Failure ]
@@ -11365,6 +11381,11 @@
 crbug.com/591099 virtual/spv2/paint/invalidation/box/margin.html [ Failure Pass ]
 crbug.com/591099 virtual/stable/ [ Skip ]
 crbug.com/591099 virtual/threaded/ [ Skip ]
+crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Failure ]
+crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy-attribute.https.sub.html [ Failure ]
+crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy.https.sub.html [ Failure ]
+crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-default-feature-policy.https.sub.html [ Failure ]
+crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-disabled-by-feature-policy.https.sub.html [ Failure ]
 crbug.com/591099 virtual/wheelscrolllatching/ [ Skip ]
 crbug.com/591099 webaudio/BiquadFilter/tail-time-lowpass.html [ Timeout ]
 crbug.com/591099 webexposed/element-instance-property-listing.html [ Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 8f32db8c..49c7cb46 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2790,24 +2790,6 @@
 crbug.com/709227 external/wpt/html/syntax/parsing/html5lib_webkit02.html?run_type=write_single [ Failure ]
 crbug.com/709227 external/wpt/html/webappapis/scripting/events/event-handler-processing-algorithm-error/synthetic-errorevent-click.worker.html [ Failure ]
 crbug.com/709227 external/wpt/html/webappapis/scripting/events/event-handler-processing-algorithm-error/workerglobalscope-synthetic-errorevent.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.worker.html [ Failure ]
-crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.worker.html [ Failure ]
 crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.worker.html [ Failure ]
 crbug.com/709227 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.worker.html [ Failure ]
 crbug.com/709227 external/wpt/offscreen-canvas/path-objects/2d.path.stroke.prune.arc.worker.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/css-parser/color3-expected.txt b/third_party/WebKit/LayoutTests/css-parser/color3-expected.txt
index 519ab76..9e92ff5 100644
--- a/third_party/WebKit/LayoutTests/css-parser/color3-expected.txt
+++ b/third_party/WebKit/LayoutTests/css-parser/color3-expected.txt
@@ -110,12 +110,12 @@
 PASS colorTest.parseColor("hsl(10, 50%, 0)") is "parse error"
 PASS colorTest.parseColor("hsl(50%, 50%, 0%)") is "parse error"
 PASS colorTest.parseColor("hsl(0, 0% 0%)") is "parse error"
-PASS colorTest.parseColor("hsl(30deg, 100%, 100%)") is "parse error"
+FAIL colorTest.parseColor("hsl(30deg, 100%, 100%)") should be parse error. Was rgb(255, 255, 255).
 PASS colorTest.parseColor("hsl(0, 0%, light)") is "parse error"
 PASS colorTest.parseColor("hsl()") is "parse error"
 PASS colorTest.parseColor("hsl(0)") is "parse error"
 PASS colorTest.parseColor("hsl(0, 0%)") is "parse error"
-PASS colorTest.parseColor("hsl(0, 0%, 0%, 0%)") is "parse error"
+FAIL colorTest.parseColor("hsl(0, 0%, 0%, 0%)") should be parse error. Was rgba(0, 0, 0, 0).
 PASS colorTest.parseColor("HSLA(-300, 100%, 37.5%, 1)") is "rgb(191, 191, 0)"
 PASS colorTest.parseColor("hsLA(-300, 100%, 37.5%, 12)") is "rgb(191, 191, 0)"
 PASS colorTest.parseColor("hsla(-300, 100%, 37.5%, 0.2)") is "rgba(191, 191, 0, 0.2)"
@@ -124,12 +124,12 @@
 PASS colorTest.parseColor("hsla(10, 50%, 0, 1)") is "parse error"
 PASS colorTest.parseColor("hsla(50%, 50%, 0%, 1)") is "parse error"
 PASS colorTest.parseColor("hsla(0, 0% 0%, 1)") is "parse error"
-PASS colorTest.parseColor("hsla(30deg, 100%, 100%, 1)") is "parse error"
+FAIL colorTest.parseColor("hsla(30deg, 100%, 100%, 1)") should be parse error. Was rgb(255, 255, 255).
 PASS colorTest.parseColor("hsla(0, 0%, light, 1)") is "parse error"
 PASS colorTest.parseColor("hsla()") is "parse error"
 PASS colorTest.parseColor("hsla(0)") is "parse error"
 PASS colorTest.parseColor("hsla(0, 0%)") is "parse error"
-PASS colorTest.parseColor("hsla(0, 0%, 0%, 50%)") is "parse error"
+FAIL colorTest.parseColor("hsla(0, 0%, 0%, 50%)") should be parse error. Was rgba(0, 0, 0, 0.498).
 PASS colorTest.parseColor("hsla(0, 0%, 0%, 1, 0%)") is "parse error"
 PASS colorTest.parseColor("cmyk(0, 0, 0, 0)") is "parse error"
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/css-parser/color3_hsl-expected.txt b/third_party/WebKit/LayoutTests/css-parser/color3_hsl-expected.txt
index 36b6596c..8158180 100644
--- a/third_party/WebKit/LayoutTests/css-parser/color3_hsl-expected.txt
+++ b/third_party/WebKit/LayoutTests/css-parser/color3_hsl-expected.txt
@@ -151,75 +151,75 @@
 PASS colorTest.parseColor("hsl(0, 37.5%, 12.5%)") is "rgb(43, 19, 19)"
 PASS colorTest.parseColor("hsl(30, 37.5%, 12.5%)") is "rgb(43, 31, 19)"
 PASS colorTest.parseColor("hsl(60, 37.5%, 12.5%)") is "rgb(43, 43, 19)"
-FAIL colorTest.parseColor("hsl(90, 37.5%, 12.5%)") should be rgb(31, 43, 19). Was rgb(32, 43, 19).
+PASS colorTest.parseColor("hsl(90, 37.5%, 12.5%)") is "rgb(31, 43, 19)"
 PASS colorTest.parseColor("hsl(120, 37.5%, 12.5%)") is "rgb(19, 43, 19)"
-FAIL colorTest.parseColor("hsl(150, 37.5%, 12.5%)") should be rgb(19, 43, 31). Was rgb(19, 43, 32).
+PASS colorTest.parseColor("hsl(150, 37.5%, 12.5%)") is "rgb(19, 43, 31)"
 PASS colorTest.parseColor("hsl(180, 37.5%, 12.5%)") is "rgb(19, 43, 43)"
 PASS colorTest.parseColor("hsl(210, 37.5%, 12.5%)") is "rgb(19, 31, 43)"
 PASS colorTest.parseColor("hsl(240, 37.5%, 12.5%)") is "rgb(19, 19, 43)"
 PASS colorTest.parseColor("hsl(270, 37.5%, 12.5%)") is "rgb(31, 19, 43)"
 PASS colorTest.parseColor("hsl(300, 37.5%, 12.5%)") is "rgb(43, 19, 43)"
-FAIL colorTest.parseColor("hsl(330, 37.5%, 12.5%)") should be rgb(43, 19, 31). Was rgb(43, 19, 32).
+PASS colorTest.parseColor("hsl(330, 37.5%, 12.5%)") is "rgb(43, 19, 31)"
 PASS colorTest.parseColor("hsl(0, 50%, 12.5%)") is "rgb(47, 15, 15)"
 PASS colorTest.parseColor("hsl(30, 50%, 12.5%)") is "rgb(47, 31, 15)"
 PASS colorTest.parseColor("hsl(60, 50%, 12.5%)") is "rgb(47, 47, 15)"
-FAIL colorTest.parseColor("hsl(90, 50%, 12.5%)") should be rgb(31, 47, 15). Was rgb(32, 47, 15).
+PASS colorTest.parseColor("hsl(90, 50%, 12.5%)") is "rgb(31, 47, 15)"
 PASS colorTest.parseColor("hsl(120, 50%, 12.5%)") is "rgb(15, 47, 15)"
-FAIL colorTest.parseColor("hsl(150, 50%, 12.5%)") should be rgb(15, 47, 31). Was rgb(15, 47, 32).
+PASS colorTest.parseColor("hsl(150, 50%, 12.5%)") is "rgb(15, 47, 31)"
 PASS colorTest.parseColor("hsl(180, 50%, 12.5%)") is "rgb(15, 47, 47)"
 PASS colorTest.parseColor("hsl(210, 50%, 12.5%)") is "rgb(15, 31, 47)"
 PASS colorTest.parseColor("hsl(240, 50%, 12.5%)") is "rgb(15, 15, 47)"
 PASS colorTest.parseColor("hsl(270, 50%, 12.5%)") is "rgb(31, 15, 47)"
 PASS colorTest.parseColor("hsl(300, 50%, 12.5%)") is "rgb(47, 15, 47)"
-FAIL colorTest.parseColor("hsl(330, 50%, 12.5%)") should be rgb(47, 15, 31). Was rgb(47, 15, 32).
+PASS colorTest.parseColor("hsl(330, 50%, 12.5%)") is "rgb(47, 15, 31)"
 PASS colorTest.parseColor("hsl(0, 62.5%, 12.5%)") is "rgb(51, 11, 11)"
 PASS colorTest.parseColor("hsl(30, 62.5%, 12.5%)") is "rgb(51, 31, 11)"
 PASS colorTest.parseColor("hsl(60, 62.5%, 12.5%)") is "rgb(51, 51, 11)"
-FAIL colorTest.parseColor("hsl(90, 62.5%, 12.5%)") should be rgb(31, 51, 11). Was rgb(32, 51, 11).
+PASS colorTest.parseColor("hsl(90, 62.5%, 12.5%)") is "rgb(31, 51, 11)"
 PASS colorTest.parseColor("hsl(120, 62.5%, 12.5%)") is "rgb(11, 51, 11)"
-FAIL colorTest.parseColor("hsl(150, 62.5%, 12.5%)") should be rgb(11, 51, 31). Was rgb(11, 51, 32).
+PASS colorTest.parseColor("hsl(150, 62.5%, 12.5%)") is "rgb(11, 51, 31)"
 PASS colorTest.parseColor("hsl(180, 62.5%, 12.5%)") is "rgb(11, 51, 51)"
 PASS colorTest.parseColor("hsl(210, 62.5%, 12.5%)") is "rgb(11, 31, 51)"
 PASS colorTest.parseColor("hsl(240, 62.5%, 12.5%)") is "rgb(11, 11, 51)"
 PASS colorTest.parseColor("hsl(270, 62.5%, 12.5%)") is "rgb(31, 11, 51)"
 PASS colorTest.parseColor("hsl(300, 62.5%, 12.5%)") is "rgb(51, 11, 51)"
-FAIL colorTest.parseColor("hsl(330, 62.5%, 12.5%)") should be rgb(51, 11, 31). Was rgb(51, 11, 32).
+PASS colorTest.parseColor("hsl(330, 62.5%, 12.5%)") is "rgb(51, 11, 31)"
 PASS colorTest.parseColor("hsl(0, 75%, 12.5%)") is "rgb(55, 7, 7)"
 PASS colorTest.parseColor("hsl(30, 75%, 12.5%)") is "rgb(55, 31, 7)"
 PASS colorTest.parseColor("hsl(60, 75%, 12.5%)") is "rgb(55, 55, 7)"
-FAIL colorTest.parseColor("hsl(90, 75%, 12.5%)") should be rgb(31, 55, 7). Was rgb(32, 55, 7).
+PASS colorTest.parseColor("hsl(90, 75%, 12.5%)") is "rgb(31, 55, 7)"
 PASS colorTest.parseColor("hsl(120, 75%, 12.5%)") is "rgb(7, 55, 7)"
-FAIL colorTest.parseColor("hsl(150, 75%, 12.5%)") should be rgb(7, 55, 31). Was rgb(7, 55, 32).
+PASS colorTest.parseColor("hsl(150, 75%, 12.5%)") is "rgb(7, 55, 31)"
 PASS colorTest.parseColor("hsl(180, 75%, 12.5%)") is "rgb(7, 55, 55)"
 PASS colorTest.parseColor("hsl(210, 75%, 12.5%)") is "rgb(7, 31, 55)"
 PASS colorTest.parseColor("hsl(240, 75%, 12.5%)") is "rgb(7, 7, 55)"
 PASS colorTest.parseColor("hsl(270, 75%, 12.5%)") is "rgb(31, 7, 55)"
 PASS colorTest.parseColor("hsl(300, 75%, 12.5%)") is "rgb(55, 7, 55)"
-FAIL colorTest.parseColor("hsl(330, 75%, 12.5%)") should be rgb(55, 7, 31). Was rgb(55, 7, 32).
+PASS colorTest.parseColor("hsl(330, 75%, 12.5%)") is "rgb(55, 7, 31)"
 PASS colorTest.parseColor("hsl(0, 87.5%, 12.5%)") is "rgb(59, 3, 3)"
 PASS colorTest.parseColor("hsl(30, 87.5%, 12.5%)") is "rgb(59, 31, 3)"
 PASS colorTest.parseColor("hsl(60, 87.5%, 12.5%)") is "rgb(59, 59, 3)"
-FAIL colorTest.parseColor("hsl(90, 87.5%, 12.5%)") should be rgb(31, 59, 3). Was rgb(32, 59, 3).
+PASS colorTest.parseColor("hsl(90, 87.5%, 12.5%)") is "rgb(31, 59, 3)"
 PASS colorTest.parseColor("hsl(120, 87.5%, 12.5%)") is "rgb(3, 59, 3)"
-FAIL colorTest.parseColor("hsl(150, 87.5%, 12.5%)") should be rgb(3, 59, 31). Was rgb(3, 59, 32).
+PASS colorTest.parseColor("hsl(150, 87.5%, 12.5%)") is "rgb(3, 59, 31)"
 PASS colorTest.parseColor("hsl(180, 87.5%, 12.5%)") is "rgb(3, 59, 59)"
 PASS colorTest.parseColor("hsl(210, 87.5%, 12.5%)") is "rgb(3, 31, 59)"
 PASS colorTest.parseColor("hsl(240, 87.5%, 12.5%)") is "rgb(3, 3, 59)"
 PASS colorTest.parseColor("hsl(270, 87.5%, 12.5%)") is "rgb(31, 3, 59)"
 PASS colorTest.parseColor("hsl(300, 87.5%, 12.5%)") is "rgb(59, 3, 59)"
-FAIL colorTest.parseColor("hsl(330, 87.5%, 12.5%)") should be rgb(59, 3, 31). Was rgb(59, 3, 32).
+PASS colorTest.parseColor("hsl(330, 87.5%, 12.5%)") is "rgb(59, 3, 31)"
 PASS colorTest.parseColor("hsl(0, 100%, 12.5%)") is "rgb(63, 0, 0)"
 PASS colorTest.parseColor("hsl(30, 100%, 12.5%)") is "rgb(63, 31, 0)"
 PASS colorTest.parseColor("hsl(60, 100%, 12.5%)") is "rgb(63, 63, 0)"
-FAIL colorTest.parseColor("hsl(90, 100%, 12.5%)") should be rgb(31, 63, 0). Was rgb(32, 63, 0).
+PASS colorTest.parseColor("hsl(90, 100%, 12.5%)") is "rgb(31, 63, 0)"
 PASS colorTest.parseColor("hsl(120, 100%, 12.5%)") is "rgb(0, 63, 0)"
-FAIL colorTest.parseColor("hsl(150, 100%, 12.5%)") should be rgb(0, 63, 31). Was rgb(0, 63, 32).
+PASS colorTest.parseColor("hsl(150, 100%, 12.5%)") is "rgb(0, 63, 31)"
 PASS colorTest.parseColor("hsl(180, 100%, 12.5%)") is "rgb(0, 63, 63)"
 PASS colorTest.parseColor("hsl(210, 100%, 12.5%)") is "rgb(0, 31, 63)"
 PASS colorTest.parseColor("hsl(240, 100%, 12.5%)") is "rgb(0, 0, 63)"
 PASS colorTest.parseColor("hsl(270, 100%, 12.5%)") is "rgb(31, 0, 63)"
 PASS colorTest.parseColor("hsl(300, 100%, 12.5%)") is "rgb(63, 0, 63)"
-FAIL colorTest.parseColor("hsl(330, 100%, 12.5%)") should be rgb(63, 0, 31). Was rgb(63, 0, 32).
+PASS colorTest.parseColor("hsl(330, 100%, 12.5%)") is "rgb(63, 0, 31)"
 PASS colorTest.parseColor("hsl(0, 0%, 25%)") is "rgb(63, 63, 63)"
 PASS colorTest.parseColor("hsl(30, 0%, 25%)") is "rgb(63, 63, 63)"
 PASS colorTest.parseColor("hsl(60, 0%, 25%)") is "rgb(63, 63, 63)"
@@ -259,75 +259,75 @@
 PASS colorTest.parseColor("hsl(0, 37.5%, 25%)") is "rgb(87, 39, 39)"
 PASS colorTest.parseColor("hsl(30, 37.5%, 25%)") is "rgb(87, 63, 39)"
 PASS colorTest.parseColor("hsl(60, 37.5%, 25%)") is "rgb(87, 87, 39)"
-FAIL colorTest.parseColor("hsl(90, 37.5%, 25%)") should be rgb(63, 87, 39). Was rgb(64, 87, 39).
+PASS colorTest.parseColor("hsl(90, 37.5%, 25%)") is "rgb(63, 87, 39)"
 PASS colorTest.parseColor("hsl(120, 37.5%, 25%)") is "rgb(39, 87, 39)"
-FAIL colorTest.parseColor("hsl(150, 37.5%, 25%)") should be rgb(39, 87, 63). Was rgb(39, 87, 64).
+PASS colorTest.parseColor("hsl(150, 37.5%, 25%)") is "rgb(39, 87, 63)"
 PASS colorTest.parseColor("hsl(180, 37.5%, 25%)") is "rgb(39, 87, 87)"
 PASS colorTest.parseColor("hsl(210, 37.5%, 25%)") is "rgb(39, 63, 87)"
 PASS colorTest.parseColor("hsl(240, 37.5%, 25%)") is "rgb(39, 39, 87)"
 PASS colorTest.parseColor("hsl(270, 37.5%, 25%)") is "rgb(63, 39, 87)"
 PASS colorTest.parseColor("hsl(300, 37.5%, 25%)") is "rgb(87, 39, 87)"
-FAIL colorTest.parseColor("hsl(330, 37.5%, 25%)") should be rgb(87, 39, 63). Was rgb(87, 39, 64).
+PASS colorTest.parseColor("hsl(330, 37.5%, 25%)") is "rgb(87, 39, 63)"
 PASS colorTest.parseColor("hsl(0, 50%, 25%)") is "rgb(95, 31, 31)"
 PASS colorTest.parseColor("hsl(30, 50%, 25%)") is "rgb(95, 63, 31)"
 PASS colorTest.parseColor("hsl(60, 50%, 25%)") is "rgb(95, 95, 31)"
-FAIL colorTest.parseColor("hsl(90, 50%, 25%)") should be rgb(63, 95, 31). Was rgb(64, 95, 31).
+PASS colorTest.parseColor("hsl(90, 50%, 25%)") is "rgb(63, 95, 31)"
 PASS colorTest.parseColor("hsl(120, 50%, 25%)") is "rgb(31, 95, 31)"
-FAIL colorTest.parseColor("hsl(150, 50%, 25%)") should be rgb(31, 95, 63). Was rgb(31, 95, 64).
+PASS colorTest.parseColor("hsl(150, 50%, 25%)") is "rgb(31, 95, 63)"
 PASS colorTest.parseColor("hsl(180, 50%, 25%)") is "rgb(31, 95, 95)"
 PASS colorTest.parseColor("hsl(210, 50%, 25%)") is "rgb(31, 63, 95)"
 PASS colorTest.parseColor("hsl(240, 50%, 25%)") is "rgb(31, 31, 95)"
 PASS colorTest.parseColor("hsl(270, 50%, 25%)") is "rgb(63, 31, 95)"
 PASS colorTest.parseColor("hsl(300, 50%, 25%)") is "rgb(95, 31, 95)"
-FAIL colorTest.parseColor("hsl(330, 50%, 25%)") should be rgb(95, 31, 63). Was rgb(95, 31, 64).
+PASS colorTest.parseColor("hsl(330, 50%, 25%)") is "rgb(95, 31, 63)"
 PASS colorTest.parseColor("hsl(0, 62.5%, 25%)") is "rgb(103, 23, 23)"
 PASS colorTest.parseColor("hsl(30, 62.5%, 25%)") is "rgb(103, 63, 23)"
 PASS colorTest.parseColor("hsl(60, 62.5%, 25%)") is "rgb(103, 103, 23)"
-FAIL colorTest.parseColor("hsl(90, 62.5%, 25%)") should be rgb(63, 103, 23). Was rgb(64, 103, 23).
+PASS colorTest.parseColor("hsl(90, 62.5%, 25%)") is "rgb(63, 103, 23)"
 PASS colorTest.parseColor("hsl(120, 62.5%, 25%)") is "rgb(23, 103, 23)"
-FAIL colorTest.parseColor("hsl(150, 62.5%, 25%)") should be rgb(23, 103, 63). Was rgb(23, 103, 64).
+PASS colorTest.parseColor("hsl(150, 62.5%, 25%)") is "rgb(23, 103, 63)"
 PASS colorTest.parseColor("hsl(180, 62.5%, 25%)") is "rgb(23, 103, 103)"
 PASS colorTest.parseColor("hsl(210, 62.5%, 25%)") is "rgb(23, 63, 103)"
 PASS colorTest.parseColor("hsl(240, 62.5%, 25%)") is "rgb(23, 23, 103)"
 PASS colorTest.parseColor("hsl(270, 62.5%, 25%)") is "rgb(63, 23, 103)"
 PASS colorTest.parseColor("hsl(300, 62.5%, 25%)") is "rgb(103, 23, 103)"
-FAIL colorTest.parseColor("hsl(330, 62.5%, 25%)") should be rgb(103, 23, 63). Was rgb(103, 23, 64).
+PASS colorTest.parseColor("hsl(330, 62.5%, 25%)") is "rgb(103, 23, 63)"
 PASS colorTest.parseColor("hsl(0, 75%, 25%)") is "rgb(111, 15, 15)"
 PASS colorTest.parseColor("hsl(30, 75%, 25%)") is "rgb(111, 63, 15)"
 PASS colorTest.parseColor("hsl(60, 75%, 25%)") is "rgb(111, 111, 15)"
-FAIL colorTest.parseColor("hsl(90, 75%, 25%)") should be rgb(63, 111, 15). Was rgb(64, 111, 15).
+PASS colorTest.parseColor("hsl(90, 75%, 25%)") is "rgb(63, 111, 15)"
 PASS colorTest.parseColor("hsl(120, 75%, 25%)") is "rgb(15, 111, 15)"
-FAIL colorTest.parseColor("hsl(150, 75%, 25%)") should be rgb(15, 111, 63). Was rgb(15, 111, 64).
+PASS colorTest.parseColor("hsl(150, 75%, 25%)") is "rgb(15, 111, 63)"
 PASS colorTest.parseColor("hsl(180, 75%, 25%)") is "rgb(15, 111, 111)"
 PASS colorTest.parseColor("hsl(210, 75%, 25%)") is "rgb(15, 63, 111)"
 PASS colorTest.parseColor("hsl(240, 75%, 25%)") is "rgb(15, 15, 111)"
 PASS colorTest.parseColor("hsl(270, 75%, 25%)") is "rgb(63, 15, 111)"
 PASS colorTest.parseColor("hsl(300, 75%, 25%)") is "rgb(111, 15, 111)"
-FAIL colorTest.parseColor("hsl(330, 75%, 25%)") should be rgb(111, 15, 63). Was rgb(111, 15, 64).
+PASS colorTest.parseColor("hsl(330, 75%, 25%)") is "rgb(111, 15, 63)"
 PASS colorTest.parseColor("hsl(0, 87.5%, 25%)") is "rgb(119, 7, 7)"
 PASS colorTest.parseColor("hsl(30, 87.5%, 25%)") is "rgb(119, 63, 7)"
 PASS colorTest.parseColor("hsl(60, 87.5%, 25%)") is "rgb(119, 119, 7)"
-FAIL colorTest.parseColor("hsl(90, 87.5%, 25%)") should be rgb(63, 119, 7). Was rgb(64, 119, 7).
+PASS colorTest.parseColor("hsl(90, 87.5%, 25%)") is "rgb(63, 119, 7)"
 PASS colorTest.parseColor("hsl(120, 87.5%, 25%)") is "rgb(7, 119, 7)"
-FAIL colorTest.parseColor("hsl(150, 87.5%, 25%)") should be rgb(7, 119, 63). Was rgb(7, 119, 64).
+PASS colorTest.parseColor("hsl(150, 87.5%, 25%)") is "rgb(7, 119, 63)"
 PASS colorTest.parseColor("hsl(180, 87.5%, 25%)") is "rgb(7, 119, 119)"
 PASS colorTest.parseColor("hsl(210, 87.5%, 25%)") is "rgb(7, 63, 119)"
 PASS colorTest.parseColor("hsl(240, 87.5%, 25%)") is "rgb(7, 7, 119)"
 PASS colorTest.parseColor("hsl(270, 87.5%, 25%)") is "rgb(63, 7, 119)"
 PASS colorTest.parseColor("hsl(300, 87.5%, 25%)") is "rgb(119, 7, 119)"
-FAIL colorTest.parseColor("hsl(330, 87.5%, 25%)") should be rgb(119, 7, 63). Was rgb(119, 7, 64).
+PASS colorTest.parseColor("hsl(330, 87.5%, 25%)") is "rgb(119, 7, 63)"
 PASS colorTest.parseColor("hsl(0, 100%, 25%)") is "rgb(127, 0, 0)"
 PASS colorTest.parseColor("hsl(30, 100%, 25%)") is "rgb(127, 63, 0)"
 PASS colorTest.parseColor("hsl(60, 100%, 25%)") is "rgb(127, 127, 0)"
-FAIL colorTest.parseColor("hsl(90, 100%, 25%)") should be rgb(63, 127, 0). Was rgb(64, 127, 0).
+PASS colorTest.parseColor("hsl(90, 100%, 25%)") is "rgb(63, 127, 0)"
 PASS colorTest.parseColor("hsl(120, 100%, 25%)") is "rgb(0, 127, 0)"
-FAIL colorTest.parseColor("hsl(150, 100%, 25%)") should be rgb(0, 127, 63). Was rgb(0, 127, 64).
+PASS colorTest.parseColor("hsl(150, 100%, 25%)") is "rgb(0, 127, 63)"
 PASS colorTest.parseColor("hsl(180, 100%, 25%)") is "rgb(0, 127, 127)"
 PASS colorTest.parseColor("hsl(210, 100%, 25%)") is "rgb(0, 63, 127)"
 PASS colorTest.parseColor("hsl(240, 100%, 25%)") is "rgb(0, 0, 127)"
 PASS colorTest.parseColor("hsl(270, 100%, 25%)") is "rgb(63, 0, 127)"
 PASS colorTest.parseColor("hsl(300, 100%, 25%)") is "rgb(127, 0, 127)"
-FAIL colorTest.parseColor("hsl(330, 100%, 25%)") should be rgb(127, 0, 63). Was rgb(127, 0, 64).
+PASS colorTest.parseColor("hsl(330, 100%, 25%)") is "rgb(127, 0, 63)"
 PASS colorTest.parseColor("hsl(0, 0%, 37.5%)") is "rgb(95, 95, 95)"
 PASS colorTest.parseColor("hsl(30, 0%, 37.5%)") is "rgb(95, 95, 95)"
 PASS colorTest.parseColor("hsl(60, 0%, 37.5%)") is "rgb(95, 95, 95)"
@@ -355,87 +355,87 @@
 PASS colorTest.parseColor("hsl(0, 25%, 37.5%)") is "rgb(119, 71, 71)"
 PASS colorTest.parseColor("hsl(30, 25%, 37.5%)") is "rgb(119, 95, 71)"
 PASS colorTest.parseColor("hsl(60, 25%, 37.5%)") is "rgb(119, 119, 71)"
-FAIL colorTest.parseColor("hsl(90, 25%, 37.5%)") should be rgb(95, 119, 71). Was rgb(96, 119, 71).
+PASS colorTest.parseColor("hsl(90, 25%, 37.5%)") is "rgb(95, 119, 71)"
 PASS colorTest.parseColor("hsl(120, 25%, 37.5%)") is "rgb(71, 119, 71)"
-FAIL colorTest.parseColor("hsl(150, 25%, 37.5%)") should be rgb(71, 119, 95). Was rgb(71, 119, 96).
+PASS colorTest.parseColor("hsl(150, 25%, 37.5%)") is "rgb(71, 119, 95)"
 PASS colorTest.parseColor("hsl(180, 25%, 37.5%)") is "rgb(71, 119, 119)"
 PASS colorTest.parseColor("hsl(210, 25%, 37.5%)") is "rgb(71, 95, 119)"
 PASS colorTest.parseColor("hsl(240, 25%, 37.5%)") is "rgb(71, 71, 119)"
 PASS colorTest.parseColor("hsl(270, 25%, 37.5%)") is "rgb(95, 71, 119)"
 PASS colorTest.parseColor("hsl(300, 25%, 37.5%)") is "rgb(119, 71, 119)"
-FAIL colorTest.parseColor("hsl(330, 25%, 37.5%)") should be rgb(119, 71, 95). Was rgb(119, 71, 96).
+PASS colorTest.parseColor("hsl(330, 25%, 37.5%)") is "rgb(119, 71, 95)"
 PASS colorTest.parseColor("hsl(0, 37.5%, 37.5%)") is "rgb(131, 59, 59)"
 PASS colorTest.parseColor("hsl(30, 37.5%, 37.5%)") is "rgb(131, 95, 59)"
 PASS colorTest.parseColor("hsl(60, 37.5%, 37.5%)") is "rgb(131, 131, 59)"
-FAIL colorTest.parseColor("hsl(90, 37.5%, 37.5%)") should be rgb(95, 131, 59). Was rgb(96, 131, 59).
+PASS colorTest.parseColor("hsl(90, 37.5%, 37.5%)") is "rgb(95, 131, 59)"
 PASS colorTest.parseColor("hsl(120, 37.5%, 37.5%)") is "rgb(59, 131, 59)"
-FAIL colorTest.parseColor("hsl(150, 37.5%, 37.5%)") should be rgb(59, 131, 95). Was rgb(59, 131, 96).
+PASS colorTest.parseColor("hsl(150, 37.5%, 37.5%)") is "rgb(59, 131, 95)"
 PASS colorTest.parseColor("hsl(180, 37.5%, 37.5%)") is "rgb(59, 131, 131)"
 PASS colorTest.parseColor("hsl(210, 37.5%, 37.5%)") is "rgb(59, 95, 131)"
 PASS colorTest.parseColor("hsl(240, 37.5%, 37.5%)") is "rgb(59, 59, 131)"
 PASS colorTest.parseColor("hsl(270, 37.5%, 37.5%)") is "rgb(95, 59, 131)"
 PASS colorTest.parseColor("hsl(300, 37.5%, 37.5%)") is "rgb(131, 59, 131)"
-FAIL colorTest.parseColor("hsl(330, 37.5%, 37.5%)") should be rgb(131, 59, 95). Was rgb(131, 59, 96).
+PASS colorTest.parseColor("hsl(330, 37.5%, 37.5%)") is "rgb(131, 59, 95)"
 PASS colorTest.parseColor("hsl(0, 50%, 37.5%)") is "rgb(143, 47, 47)"
 PASS colorTest.parseColor("hsl(30, 50%, 37.5%)") is "rgb(143, 95, 47)"
 PASS colorTest.parseColor("hsl(60, 50%, 37.5%)") is "rgb(143, 143, 47)"
-FAIL colorTest.parseColor("hsl(90, 50%, 37.5%)") should be rgb(95, 143, 47). Was rgb(96, 143, 47).
+PASS colorTest.parseColor("hsl(90, 50%, 37.5%)") is "rgb(95, 143, 47)"
 PASS colorTest.parseColor("hsl(120, 50%, 37.5%)") is "rgb(47, 143, 47)"
-FAIL colorTest.parseColor("hsl(150, 50%, 37.5%)") should be rgb(47, 143, 95). Was rgb(47, 143, 96).
+PASS colorTest.parseColor("hsl(150, 50%, 37.5%)") is "rgb(47, 143, 95)"
 PASS colorTest.parseColor("hsl(180, 50%, 37.5%)") is "rgb(47, 143, 143)"
 PASS colorTest.parseColor("hsl(210, 50%, 37.5%)") is "rgb(47, 95, 143)"
 PASS colorTest.parseColor("hsl(240, 50%, 37.5%)") is "rgb(47, 47, 143)"
 PASS colorTest.parseColor("hsl(270, 50%, 37.5%)") is "rgb(95, 47, 143)"
 PASS colorTest.parseColor("hsl(300, 50%, 37.5%)") is "rgb(143, 47, 143)"
-FAIL colorTest.parseColor("hsl(330, 50%, 37.5%)") should be rgb(143, 47, 95). Was rgb(143, 47, 96).
+PASS colorTest.parseColor("hsl(330, 50%, 37.5%)") is "rgb(143, 47, 95)"
 PASS colorTest.parseColor("hsl(0, 62.5%, 37.5%)") is "rgb(155, 35, 35)"
 PASS colorTest.parseColor("hsl(30, 62.5%, 37.5%)") is "rgb(155, 95, 35)"
 PASS colorTest.parseColor("hsl(60, 62.5%, 37.5%)") is "rgb(155, 155, 35)"
-FAIL colorTest.parseColor("hsl(90, 62.5%, 37.5%)") should be rgb(95, 155, 35). Was rgb(96, 155, 35).
+PASS colorTest.parseColor("hsl(90, 62.5%, 37.5%)") is "rgb(95, 155, 35)"
 PASS colorTest.parseColor("hsl(120, 62.5%, 37.5%)") is "rgb(35, 155, 35)"
-FAIL colorTest.parseColor("hsl(150, 62.5%, 37.5%)") should be rgb(35, 155, 95). Was rgb(35, 155, 96).
+PASS colorTest.parseColor("hsl(150, 62.5%, 37.5%)") is "rgb(35, 155, 95)"
 PASS colorTest.parseColor("hsl(180, 62.5%, 37.5%)") is "rgb(35, 155, 155)"
 PASS colorTest.parseColor("hsl(210, 62.5%, 37.5%)") is "rgb(35, 95, 155)"
 PASS colorTest.parseColor("hsl(240, 62.5%, 37.5%)") is "rgb(35, 35, 155)"
 PASS colorTest.parseColor("hsl(270, 62.5%, 37.5%)") is "rgb(95, 35, 155)"
 PASS colorTest.parseColor("hsl(300, 62.5%, 37.5%)") is "rgb(155, 35, 155)"
-FAIL colorTest.parseColor("hsl(330, 62.5%, 37.5%)") should be rgb(155, 35, 95). Was rgb(155, 35, 96).
+PASS colorTest.parseColor("hsl(330, 62.5%, 37.5%)") is "rgb(155, 35, 95)"
 PASS colorTest.parseColor("hsl(0, 75%, 37.5%)") is "rgb(167, 23, 23)"
 PASS colorTest.parseColor("hsl(30, 75%, 37.5%)") is "rgb(167, 95, 23)"
 PASS colorTest.parseColor("hsl(60, 75%, 37.5%)") is "rgb(167, 167, 23)"
-FAIL colorTest.parseColor("hsl(90, 75%, 37.5%)") should be rgb(95, 167, 23). Was rgb(96, 167, 23).
+PASS colorTest.parseColor("hsl(90, 75%, 37.5%)") is "rgb(95, 167, 23)"
 PASS colorTest.parseColor("hsl(120, 75%, 37.5%)") is "rgb(23, 167, 23)"
-FAIL colorTest.parseColor("hsl(150, 75%, 37.5%)") should be rgb(23, 167, 95). Was rgb(23, 167, 96).
+PASS colorTest.parseColor("hsl(150, 75%, 37.5%)") is "rgb(23, 167, 95)"
 PASS colorTest.parseColor("hsl(180, 75%, 37.5%)") is "rgb(23, 167, 167)"
 PASS colorTest.parseColor("hsl(210, 75%, 37.5%)") is "rgb(23, 95, 167)"
 PASS colorTest.parseColor("hsl(240, 75%, 37.5%)") is "rgb(23, 23, 167)"
 PASS colorTest.parseColor("hsl(270, 75%, 37.5%)") is "rgb(95, 23, 167)"
 PASS colorTest.parseColor("hsl(300, 75%, 37.5%)") is "rgb(167, 23, 167)"
-FAIL colorTest.parseColor("hsl(330, 75%, 37.5%)") should be rgb(167, 23, 95). Was rgb(167, 23, 96).
+PASS colorTest.parseColor("hsl(330, 75%, 37.5%)") is "rgb(167, 23, 95)"
 PASS colorTest.parseColor("hsl(0, 87.5%, 37.5%)") is "rgb(179, 11, 11)"
 PASS colorTest.parseColor("hsl(30, 87.5%, 37.5%)") is "rgb(179, 95, 11)"
 PASS colorTest.parseColor("hsl(60, 87.5%, 37.5%)") is "rgb(179, 179, 11)"
-FAIL colorTest.parseColor("hsl(90, 87.5%, 37.5%)") should be rgb(95, 179, 11). Was rgb(96, 179, 11).
+PASS colorTest.parseColor("hsl(90, 87.5%, 37.5%)") is "rgb(95, 179, 11)"
 PASS colorTest.parseColor("hsl(120, 87.5%, 37.5%)") is "rgb(11, 179, 11)"
-FAIL colorTest.parseColor("hsl(150, 87.5%, 37.5%)") should be rgb(11, 179, 95). Was rgb(11, 179, 96).
+PASS colorTest.parseColor("hsl(150, 87.5%, 37.5%)") is "rgb(11, 179, 95)"
 PASS colorTest.parseColor("hsl(180, 87.5%, 37.5%)") is "rgb(11, 179, 179)"
 PASS colorTest.parseColor("hsl(210, 87.5%, 37.5%)") is "rgb(11, 95, 179)"
 PASS colorTest.parseColor("hsl(240, 87.5%, 37.5%)") is "rgb(11, 11, 179)"
 PASS colorTest.parseColor("hsl(270, 87.5%, 37.5%)") is "rgb(95, 11, 179)"
 PASS colorTest.parseColor("hsl(300, 87.5%, 37.5%)") is "rgb(179, 11, 179)"
-FAIL colorTest.parseColor("hsl(330, 87.5%, 37.5%)") should be rgb(179, 11, 95). Was rgb(179, 11, 96).
+PASS colorTest.parseColor("hsl(330, 87.5%, 37.5%)") is "rgb(179, 11, 95)"
 PASS colorTest.parseColor("hsl(0, 100%, 37.5%)") is "rgb(191, 0, 0)"
 PASS colorTest.parseColor("hsl(30, 100%, 37.5%)") is "rgb(191, 95, 0)"
 PASS colorTest.parseColor("hsl(60, 100%, 37.5%)") is "rgb(191, 191, 0)"
-FAIL colorTest.parseColor("hsl(90, 100%, 37.5%)") should be rgb(95, 191, 0). Was rgb(96, 191, 0).
+PASS colorTest.parseColor("hsl(90, 100%, 37.5%)") is "rgb(95, 191, 0)"
 PASS colorTest.parseColor("hsl(120, 100%, 37.5%)") is "rgb(0, 191, 0)"
-FAIL colorTest.parseColor("hsl(150, 100%, 37.5%)") should be rgb(0, 191, 95). Was rgb(0, 191, 96).
+PASS colorTest.parseColor("hsl(150, 100%, 37.5%)") is "rgb(0, 191, 95)"
 PASS colorTest.parseColor("hsl(180, 100%, 37.5%)") is "rgb(0, 191, 191)"
 PASS colorTest.parseColor("hsl(210, 100%, 37.5%)") is "rgb(0, 95, 191)"
 PASS colorTest.parseColor("hsl(240, 100%, 37.5%)") is "rgb(0, 0, 191)"
 PASS colorTest.parseColor("hsl(270, 100%, 37.5%)") is "rgb(95, 0, 191)"
 PASS colorTest.parseColor("hsl(300, 100%, 37.5%)") is "rgb(191, 0, 191)"
-FAIL colorTest.parseColor("hsl(330, 100%, 37.5%)") should be rgb(191, 0, 95). Was rgb(191, 0, 96).
+PASS colorTest.parseColor("hsl(330, 100%, 37.5%)") is "rgb(191, 0, 95)"
 PASS colorTest.parseColor("hsl(0, 0%, 50%)") is "rgb(127, 127, 127)"
 PASS colorTest.parseColor("hsl(30, 0%, 50%)") is "rgb(127, 127, 127)"
 PASS colorTest.parseColor("hsl(60, 0%, 50%)") is "rgb(127, 127, 127)"
@@ -475,75 +475,75 @@
 PASS colorTest.parseColor("hsl(0, 37.5%, 50%)") is "rgb(175, 79, 79)"
 PASS colorTest.parseColor("hsl(30, 37.5%, 50%)") is "rgb(175, 127, 79)"
 PASS colorTest.parseColor("hsl(60, 37.5%, 50%)") is "rgb(175, 175, 79)"
-FAIL colorTest.parseColor("hsl(90, 37.5%, 50%)") should be rgb(127, 175, 79). Was rgb(128, 175, 79).
+PASS colorTest.parseColor("hsl(90, 37.5%, 50%)") is "rgb(127, 175, 79)"
 PASS colorTest.parseColor("hsl(120, 37.5%, 50%)") is "rgb(79, 175, 79)"
-FAIL colorTest.parseColor("hsl(150, 37.5%, 50%)") should be rgb(79, 175, 127). Was rgb(79, 175, 128).
+PASS colorTest.parseColor("hsl(150, 37.5%, 50%)") is "rgb(79, 175, 127)"
 PASS colorTest.parseColor("hsl(180, 37.5%, 50%)") is "rgb(79, 175, 175)"
 PASS colorTest.parseColor("hsl(210, 37.5%, 50%)") is "rgb(79, 127, 175)"
 PASS colorTest.parseColor("hsl(240, 37.5%, 50%)") is "rgb(79, 79, 175)"
 PASS colorTest.parseColor("hsl(270, 37.5%, 50%)") is "rgb(127, 79, 175)"
 PASS colorTest.parseColor("hsl(300, 37.5%, 50%)") is "rgb(175, 79, 175)"
-FAIL colorTest.parseColor("hsl(330, 37.5%, 50%)") should be rgb(175, 79, 127). Was rgb(175, 79, 128).
+PASS colorTest.parseColor("hsl(330, 37.5%, 50%)") is "rgb(175, 79, 127)"
 PASS colorTest.parseColor("hsl(0, 50%, 50%)") is "rgb(191, 63, 63)"
 PASS colorTest.parseColor("hsl(30, 50%, 50%)") is "rgb(191, 127, 63)"
 PASS colorTest.parseColor("hsl(60, 50%, 50%)") is "rgb(191, 191, 63)"
-FAIL colorTest.parseColor("hsl(90, 50%, 50%)") should be rgb(127, 191, 63). Was rgb(128, 191, 63).
+PASS colorTest.parseColor("hsl(90, 50%, 50%)") is "rgb(127, 191, 63)"
 PASS colorTest.parseColor("hsl(120, 50%, 50%)") is "rgb(63, 191, 63)"
-FAIL colorTest.parseColor("hsl(150, 50%, 50%)") should be rgb(63, 191, 127). Was rgb(63, 191, 128).
+PASS colorTest.parseColor("hsl(150, 50%, 50%)") is "rgb(63, 191, 127)"
 PASS colorTest.parseColor("hsl(180, 50%, 50%)") is "rgb(63, 191, 191)"
 PASS colorTest.parseColor("hsl(210, 50%, 50%)") is "rgb(63, 127, 191)"
 PASS colorTest.parseColor("hsl(240, 50%, 50%)") is "rgb(63, 63, 191)"
 PASS colorTest.parseColor("hsl(270, 50%, 50%)") is "rgb(127, 63, 191)"
 PASS colorTest.parseColor("hsl(300, 50%, 50%)") is "rgb(191, 63, 191)"
-FAIL colorTest.parseColor("hsl(330, 50%, 50%)") should be rgb(191, 63, 127). Was rgb(191, 63, 128).
+PASS colorTest.parseColor("hsl(330, 50%, 50%)") is "rgb(191, 63, 127)"
 PASS colorTest.parseColor("hsl(0, 62.5%, 50%)") is "rgb(207, 47, 47)"
 PASS colorTest.parseColor("hsl(30, 62.5%, 50%)") is "rgb(207, 127, 47)"
 PASS colorTest.parseColor("hsl(60, 62.5%, 50%)") is "rgb(207, 207, 47)"
-FAIL colorTest.parseColor("hsl(90, 62.5%, 50%)") should be rgb(127, 207, 47). Was rgb(128, 207, 47).
+PASS colorTest.parseColor("hsl(90, 62.5%, 50%)") is "rgb(127, 207, 47)"
 PASS colorTest.parseColor("hsl(120, 62.5%, 50%)") is "rgb(47, 207, 47)"
-FAIL colorTest.parseColor("hsl(150, 62.5%, 50%)") should be rgb(47, 207, 127). Was rgb(47, 207, 128).
+PASS colorTest.parseColor("hsl(150, 62.5%, 50%)") is "rgb(47, 207, 127)"
 PASS colorTest.parseColor("hsl(180, 62.5%, 50%)") is "rgb(47, 207, 207)"
 PASS colorTest.parseColor("hsl(210, 62.5%, 50%)") is "rgb(47, 127, 207)"
 PASS colorTest.parseColor("hsl(240, 62.5%, 50%)") is "rgb(47, 47, 207)"
 PASS colorTest.parseColor("hsl(270, 62.5%, 50%)") is "rgb(127, 47, 207)"
 PASS colorTest.parseColor("hsl(300, 62.5%, 50%)") is "rgb(207, 47, 207)"
-FAIL colorTest.parseColor("hsl(330, 62.5%, 50%)") should be rgb(207, 47, 127). Was rgb(207, 47, 128).
+PASS colorTest.parseColor("hsl(330, 62.5%, 50%)") is "rgb(207, 47, 127)"
 PASS colorTest.parseColor("hsl(0, 75%, 50%)") is "rgb(223, 31, 31)"
 PASS colorTest.parseColor("hsl(30, 75%, 50%)") is "rgb(223, 127, 31)"
 PASS colorTest.parseColor("hsl(60, 75%, 50%)") is "rgb(223, 223, 31)"
-FAIL colorTest.parseColor("hsl(90, 75%, 50%)") should be rgb(127, 223, 31). Was rgb(128, 223, 31).
+PASS colorTest.parseColor("hsl(90, 75%, 50%)") is "rgb(127, 223, 31)"
 PASS colorTest.parseColor("hsl(120, 75%, 50%)") is "rgb(31, 223, 31)"
-FAIL colorTest.parseColor("hsl(150, 75%, 50%)") should be rgb(31, 223, 127). Was rgb(31, 223, 128).
+PASS colorTest.parseColor("hsl(150, 75%, 50%)") is "rgb(31, 223, 127)"
 PASS colorTest.parseColor("hsl(180, 75%, 50%)") is "rgb(31, 223, 223)"
 PASS colorTest.parseColor("hsl(210, 75%, 50%)") is "rgb(31, 127, 223)"
 PASS colorTest.parseColor("hsl(240, 75%, 50%)") is "rgb(31, 31, 223)"
 PASS colorTest.parseColor("hsl(270, 75%, 50%)") is "rgb(127, 31, 223)"
 PASS colorTest.parseColor("hsl(300, 75%, 50%)") is "rgb(223, 31, 223)"
-FAIL colorTest.parseColor("hsl(330, 75%, 50%)") should be rgb(223, 31, 127). Was rgb(223, 31, 128).
+PASS colorTest.parseColor("hsl(330, 75%, 50%)") is "rgb(223, 31, 127)"
 PASS colorTest.parseColor("hsl(0, 87.5%, 50%)") is "rgb(239, 15, 15)"
 PASS colorTest.parseColor("hsl(30, 87.5%, 50%)") is "rgb(239, 127, 15)"
 PASS colorTest.parseColor("hsl(60, 87.5%, 50%)") is "rgb(239, 239, 15)"
-FAIL colorTest.parseColor("hsl(90, 87.5%, 50%)") should be rgb(127, 239, 15). Was rgb(128, 239, 15).
+PASS colorTest.parseColor("hsl(90, 87.5%, 50%)") is "rgb(127, 239, 15)"
 PASS colorTest.parseColor("hsl(120, 87.5%, 50%)") is "rgb(15, 239, 15)"
-FAIL colorTest.parseColor("hsl(150, 87.5%, 50%)") should be rgb(15, 239, 127). Was rgb(15, 239, 128).
+PASS colorTest.parseColor("hsl(150, 87.5%, 50%)") is "rgb(15, 239, 127)"
 PASS colorTest.parseColor("hsl(180, 87.5%, 50%)") is "rgb(15, 239, 239)"
 PASS colorTest.parseColor("hsl(210, 87.5%, 50%)") is "rgb(15, 127, 239)"
 PASS colorTest.parseColor("hsl(240, 87.5%, 50%)") is "rgb(15, 15, 239)"
 PASS colorTest.parseColor("hsl(270, 87.5%, 50%)") is "rgb(127, 15, 239)"
 PASS colorTest.parseColor("hsl(300, 87.5%, 50%)") is "rgb(239, 15, 239)"
-FAIL colorTest.parseColor("hsl(330, 87.5%, 50%)") should be rgb(239, 15, 127). Was rgb(239, 15, 128).
+PASS colorTest.parseColor("hsl(330, 87.5%, 50%)") is "rgb(239, 15, 127)"
 PASS colorTest.parseColor("hsl(0, 100%, 50%)") is "rgb(255, 0, 0)"
 PASS colorTest.parseColor("hsl(30, 100%, 50%)") is "rgb(255, 127, 0)"
 PASS colorTest.parseColor("hsl(60, 100%, 50%)") is "rgb(255, 255, 0)"
-FAIL colorTest.parseColor("hsl(90, 100%, 50%)") should be rgb(127, 255, 0). Was rgb(128, 255, 0).
+PASS colorTest.parseColor("hsl(90, 100%, 50%)") is "rgb(127, 255, 0)"
 PASS colorTest.parseColor("hsl(120, 100%, 50%)") is "rgb(0, 255, 0)"
-FAIL colorTest.parseColor("hsl(150, 100%, 50%)") should be rgb(0, 255, 127). Was rgb(0, 255, 128).
+PASS colorTest.parseColor("hsl(150, 100%, 50%)") is "rgb(0, 255, 127)"
 PASS colorTest.parseColor("hsl(180, 100%, 50%)") is "rgb(0, 255, 255)"
 PASS colorTest.parseColor("hsl(210, 100%, 50%)") is "rgb(0, 127, 255)"
 PASS colorTest.parseColor("hsl(240, 100%, 50%)") is "rgb(0, 0, 255)"
 PASS colorTest.parseColor("hsl(270, 100%, 50%)") is "rgb(127, 0, 255)"
 PASS colorTest.parseColor("hsl(300, 100%, 50%)") is "rgb(255, 0, 255)"
-FAIL colorTest.parseColor("hsl(330, 100%, 50%)") should be rgb(255, 0, 127). Was rgb(255, 0, 128).
+PASS colorTest.parseColor("hsl(330, 100%, 50%)") is "rgb(255, 0, 127)"
 PASS colorTest.parseColor("hsl(0, 0%, 62.5%)") is "rgb(159, 159, 159)"
 PASS colorTest.parseColor("hsl(30, 0%, 62.5%)") is "rgb(159, 159, 159)"
 PASS colorTest.parseColor("hsl(60, 0%, 62.5%)") is "rgb(159, 159, 159)"
@@ -595,63 +595,63 @@
 PASS colorTest.parseColor("hsl(0, 50%, 62.5%)") is "rgb(207, 111, 111)"
 PASS colorTest.parseColor("hsl(30, 50%, 62.5%)") is "rgb(207, 159, 111)"
 PASS colorTest.parseColor("hsl(60, 50%, 62.5%)") is "rgb(207, 207, 111)"
-FAIL colorTest.parseColor("hsl(90, 50%, 62.5%)") should be rgb(159, 207, 111). Was rgb(160, 207, 111).
+PASS colorTest.parseColor("hsl(90, 50%, 62.5%)") is "rgb(159, 207, 111)"
 PASS colorTest.parseColor("hsl(120, 50%, 62.5%)") is "rgb(111, 207, 111)"
-FAIL colorTest.parseColor("hsl(150, 50%, 62.5%)") should be rgb(111, 207, 159). Was rgb(111, 207, 160).
+PASS colorTest.parseColor("hsl(150, 50%, 62.5%)") is "rgb(111, 207, 159)"
 PASS colorTest.parseColor("hsl(180, 50%, 62.5%)") is "rgb(111, 207, 207)"
 PASS colorTest.parseColor("hsl(210, 50%, 62.5%)") is "rgb(111, 159, 207)"
 PASS colorTest.parseColor("hsl(240, 50%, 62.5%)") is "rgb(111, 111, 207)"
 PASS colorTest.parseColor("hsl(270, 50%, 62.5%)") is "rgb(159, 111, 207)"
 PASS colorTest.parseColor("hsl(300, 50%, 62.5%)") is "rgb(207, 111, 207)"
-FAIL colorTest.parseColor("hsl(330, 50%, 62.5%)") should be rgb(207, 111, 159). Was rgb(207, 111, 160).
+PASS colorTest.parseColor("hsl(330, 50%, 62.5%)") is "rgb(207, 111, 159)"
 PASS colorTest.parseColor("hsl(0, 62.5%, 62.5%)") is "rgb(219, 99, 99)"
 PASS colorTest.parseColor("hsl(30, 62.5%, 62.5%)") is "rgb(219, 159, 99)"
 PASS colorTest.parseColor("hsl(60, 62.5%, 62.5%)") is "rgb(219, 219, 99)"
-FAIL colorTest.parseColor("hsl(90, 62.5%, 62.5%)") should be rgb(159, 219, 99). Was rgb(160, 219, 99).
+PASS colorTest.parseColor("hsl(90, 62.5%, 62.5%)") is "rgb(159, 219, 99)"
 PASS colorTest.parseColor("hsl(120, 62.5%, 62.5%)") is "rgb(99, 219, 99)"
-FAIL colorTest.parseColor("hsl(150, 62.5%, 62.5%)") should be rgb(99, 219, 159). Was rgb(99, 219, 160).
+PASS colorTest.parseColor("hsl(150, 62.5%, 62.5%)") is "rgb(99, 219, 159)"
 PASS colorTest.parseColor("hsl(180, 62.5%, 62.5%)") is "rgb(99, 219, 219)"
 PASS colorTest.parseColor("hsl(210, 62.5%, 62.5%)") is "rgb(99, 159, 219)"
 PASS colorTest.parseColor("hsl(240, 62.5%, 62.5%)") is "rgb(99, 99, 219)"
 PASS colorTest.parseColor("hsl(270, 62.5%, 62.5%)") is "rgb(159, 99, 219)"
 PASS colorTest.parseColor("hsl(300, 62.5%, 62.5%)") is "rgb(219, 99, 219)"
-FAIL colorTest.parseColor("hsl(330, 62.5%, 62.5%)") should be rgb(219, 99, 159). Was rgb(219, 99, 160).
+PASS colorTest.parseColor("hsl(330, 62.5%, 62.5%)") is "rgb(219, 99, 159)"
 PASS colorTest.parseColor("hsl(0, 75%, 62.5%)") is "rgb(231, 87, 87)"
 PASS colorTest.parseColor("hsl(30, 75%, 62.5%)") is "rgb(231, 159, 87)"
 PASS colorTest.parseColor("hsl(60, 75%, 62.5%)") is "rgb(231, 231, 87)"
-FAIL colorTest.parseColor("hsl(90, 75%, 62.5%)") should be rgb(159, 231, 87). Was rgb(160, 231, 87).
+PASS colorTest.parseColor("hsl(90, 75%, 62.5%)") is "rgb(159, 231, 87)"
 PASS colorTest.parseColor("hsl(120, 75%, 62.5%)") is "rgb(87, 231, 87)"
-FAIL colorTest.parseColor("hsl(150, 75%, 62.5%)") should be rgb(87, 231, 159). Was rgb(87, 231, 160).
+PASS colorTest.parseColor("hsl(150, 75%, 62.5%)") is "rgb(87, 231, 159)"
 PASS colorTest.parseColor("hsl(180, 75%, 62.5%)") is "rgb(87, 231, 231)"
 PASS colorTest.parseColor("hsl(210, 75%, 62.5%)") is "rgb(87, 159, 231)"
 PASS colorTest.parseColor("hsl(240, 75%, 62.5%)") is "rgb(87, 87, 231)"
 PASS colorTest.parseColor("hsl(270, 75%, 62.5%)") is "rgb(159, 87, 231)"
 PASS colorTest.parseColor("hsl(300, 75%, 62.5%)") is "rgb(231, 87, 231)"
-FAIL colorTest.parseColor("hsl(330, 75%, 62.5%)") should be rgb(231, 87, 159). Was rgb(231, 87, 160).
+PASS colorTest.parseColor("hsl(330, 75%, 62.5%)") is "rgb(231, 87, 159)"
 PASS colorTest.parseColor("hsl(0, 87.5%, 62.5%)") is "rgb(243, 75, 75)"
 PASS colorTest.parseColor("hsl(30, 87.5%, 62.5%)") is "rgb(243, 159, 75)"
 PASS colorTest.parseColor("hsl(60, 87.5%, 62.5%)") is "rgb(243, 243, 75)"
-FAIL colorTest.parseColor("hsl(90, 87.5%, 62.5%)") should be rgb(159, 243, 75). Was rgb(160, 243, 75).
+PASS colorTest.parseColor("hsl(90, 87.5%, 62.5%)") is "rgb(159, 243, 75)"
 PASS colorTest.parseColor("hsl(120, 87.5%, 62.5%)") is "rgb(75, 243, 75)"
-FAIL colorTest.parseColor("hsl(150, 87.5%, 62.5%)") should be rgb(75, 243, 159). Was rgb(75, 243, 160).
+PASS colorTest.parseColor("hsl(150, 87.5%, 62.5%)") is "rgb(75, 243, 159)"
 PASS colorTest.parseColor("hsl(180, 87.5%, 62.5%)") is "rgb(75, 243, 243)"
 PASS colorTest.parseColor("hsl(210, 87.5%, 62.5%)") is "rgb(75, 159, 243)"
 PASS colorTest.parseColor("hsl(240, 87.5%, 62.5%)") is "rgb(75, 75, 243)"
 PASS colorTest.parseColor("hsl(270, 87.5%, 62.5%)") is "rgb(159, 75, 243)"
 PASS colorTest.parseColor("hsl(300, 87.5%, 62.5%)") is "rgb(243, 75, 243)"
-FAIL colorTest.parseColor("hsl(330, 87.5%, 62.5%)") should be rgb(243, 75, 159). Was rgb(243, 75, 160).
+PASS colorTest.parseColor("hsl(330, 87.5%, 62.5%)") is "rgb(243, 75, 159)"
 PASS colorTest.parseColor("hsl(0, 100%, 62.5%)") is "rgb(255, 63, 63)"
 PASS colorTest.parseColor("hsl(30, 100%, 62.5%)") is "rgb(255, 159, 63)"
 PASS colorTest.parseColor("hsl(60, 100%, 62.5%)") is "rgb(255, 255, 63)"
-FAIL colorTest.parseColor("hsl(90, 100%, 62.5%)") should be rgb(159, 255, 63). Was rgb(160, 255, 63).
+PASS colorTest.parseColor("hsl(90, 100%, 62.5%)") is "rgb(159, 255, 63)"
 PASS colorTest.parseColor("hsl(120, 100%, 62.5%)") is "rgb(63, 255, 63)"
-FAIL colorTest.parseColor("hsl(150, 100%, 62.5%)") should be rgb(63, 255, 159). Was rgb(63, 255, 160).
+PASS colorTest.parseColor("hsl(150, 100%, 62.5%)") is "rgb(63, 255, 159)"
 PASS colorTest.parseColor("hsl(180, 100%, 62.5%)") is "rgb(63, 255, 255)"
 PASS colorTest.parseColor("hsl(210, 100%, 62.5%)") is "rgb(63, 159, 255)"
 PASS colorTest.parseColor("hsl(240, 100%, 62.5%)") is "rgb(63, 63, 255)"
 PASS colorTest.parseColor("hsl(270, 100%, 62.5%)") is "rgb(159, 63, 255)"
 PASS colorTest.parseColor("hsl(300, 100%, 62.5%)") is "rgb(255, 63, 255)"
-FAIL colorTest.parseColor("hsl(330, 100%, 62.5%)") should be rgb(255, 63, 159). Was rgb(255, 63, 160).
+PASS colorTest.parseColor("hsl(330, 100%, 62.5%)") is "rgb(255, 63, 159)"
 PASS colorTest.parseColor("hsl(0, 0%, 75%)") is "rgb(191, 191, 191)"
 PASS colorTest.parseColor("hsl(30, 0%, 75%)") is "rgb(191, 191, 191)"
 PASS colorTest.parseColor("hsl(60, 0%, 75%)") is "rgb(191, 191, 191)"
@@ -727,39 +727,39 @@
 PASS colorTest.parseColor("hsl(0, 75%, 75%)") is "rgb(239, 143, 143)"
 PASS colorTest.parseColor("hsl(30, 75%, 75%)") is "rgb(239, 191, 143)"
 PASS colorTest.parseColor("hsl(60, 75%, 75%)") is "rgb(239, 239, 143)"
-FAIL colorTest.parseColor("hsl(90, 75%, 75%)") should be rgb(191, 239, 143). Was rgb(192, 239, 143).
+PASS colorTest.parseColor("hsl(90, 75%, 75%)") is "rgb(191, 239, 143)"
 PASS colorTest.parseColor("hsl(120, 75%, 75%)") is "rgb(143, 239, 143)"
-FAIL colorTest.parseColor("hsl(150, 75%, 75%)") should be rgb(143, 239, 191). Was rgb(143, 239, 192).
+PASS colorTest.parseColor("hsl(150, 75%, 75%)") is "rgb(143, 239, 191)"
 PASS colorTest.parseColor("hsl(180, 75%, 75%)") is "rgb(143, 239, 239)"
 PASS colorTest.parseColor("hsl(210, 75%, 75%)") is "rgb(143, 191, 239)"
 PASS colorTest.parseColor("hsl(240, 75%, 75%)") is "rgb(143, 143, 239)"
 PASS colorTest.parseColor("hsl(270, 75%, 75%)") is "rgb(191, 143, 239)"
 PASS colorTest.parseColor("hsl(300, 75%, 75%)") is "rgb(239, 143, 239)"
-FAIL colorTest.parseColor("hsl(330, 75%, 75%)") should be rgb(239, 143, 191). Was rgb(239, 143, 192).
+PASS colorTest.parseColor("hsl(330, 75%, 75%)") is "rgb(239, 143, 191)"
 PASS colorTest.parseColor("hsl(0, 87.5%, 75%)") is "rgb(247, 135, 135)"
 PASS colorTest.parseColor("hsl(30, 87.5%, 75%)") is "rgb(247, 191, 135)"
 PASS colorTest.parseColor("hsl(60, 87.5%, 75%)") is "rgb(247, 247, 135)"
-FAIL colorTest.parseColor("hsl(90, 87.5%, 75%)") should be rgb(191, 247, 135). Was rgb(192, 247, 135).
+PASS colorTest.parseColor("hsl(90, 87.5%, 75%)") is "rgb(191, 247, 135)"
 PASS colorTest.parseColor("hsl(120, 87.5%, 75%)") is "rgb(135, 247, 135)"
-FAIL colorTest.parseColor("hsl(150, 87.5%, 75%)") should be rgb(135, 247, 191). Was rgb(135, 247, 192).
+PASS colorTest.parseColor("hsl(150, 87.5%, 75%)") is "rgb(135, 247, 191)"
 PASS colorTest.parseColor("hsl(180, 87.5%, 75%)") is "rgb(135, 247, 247)"
 PASS colorTest.parseColor("hsl(210, 87.5%, 75%)") is "rgb(135, 191, 247)"
 PASS colorTest.parseColor("hsl(240, 87.5%, 75%)") is "rgb(135, 135, 247)"
 PASS colorTest.parseColor("hsl(270, 87.5%, 75%)") is "rgb(191, 135, 247)"
 PASS colorTest.parseColor("hsl(300, 87.5%, 75%)") is "rgb(247, 135, 247)"
-FAIL colorTest.parseColor("hsl(330, 87.5%, 75%)") should be rgb(247, 135, 191). Was rgb(247, 135, 192).
+PASS colorTest.parseColor("hsl(330, 87.5%, 75%)") is "rgb(247, 135, 191)"
 PASS colorTest.parseColor("hsl(0, 100%, 75%)") is "rgb(255, 127, 127)"
 PASS colorTest.parseColor("hsl(30, 100%, 75%)") is "rgb(255, 191, 127)"
 PASS colorTest.parseColor("hsl(60, 100%, 75%)") is "rgb(255, 255, 127)"
-FAIL colorTest.parseColor("hsl(90, 100%, 75%)") should be rgb(191, 255, 127). Was rgb(192, 255, 127).
+PASS colorTest.parseColor("hsl(90, 100%, 75%)") is "rgb(191, 255, 127)"
 PASS colorTest.parseColor("hsl(120, 100%, 75%)") is "rgb(127, 255, 127)"
-FAIL colorTest.parseColor("hsl(150, 100%, 75%)") should be rgb(127, 255, 191). Was rgb(127, 255, 192).
+PASS colorTest.parseColor("hsl(150, 100%, 75%)") is "rgb(127, 255, 191)"
 PASS colorTest.parseColor("hsl(180, 100%, 75%)") is "rgb(127, 255, 255)"
 PASS colorTest.parseColor("hsl(210, 100%, 75%)") is "rgb(127, 191, 255)"
 PASS colorTest.parseColor("hsl(240, 100%, 75%)") is "rgb(127, 127, 255)"
 PASS colorTest.parseColor("hsl(270, 100%, 75%)") is "rgb(191, 127, 255)"
 PASS colorTest.parseColor("hsl(300, 100%, 75%)") is "rgb(255, 127, 255)"
-FAIL colorTest.parseColor("hsl(330, 100%, 75%)") should be rgb(255, 127, 191). Was rgb(255, 127, 192).
+PASS colorTest.parseColor("hsl(330, 100%, 75%)") is "rgb(255, 127, 191)"
 PASS colorTest.parseColor("hsl(0, 0%, 87.5%)") is "rgb(223, 223, 223)"
 PASS colorTest.parseColor("hsl(30, 0%, 87.5%)") is "rgb(223, 223, 223)"
 PASS colorTest.parseColor("hsl(60, 0%, 87.5%)") is "rgb(223, 223, 223)"
diff --git a/third_party/WebKit/LayoutTests/css-parser/color3_hsla_1-expected.txt b/third_party/WebKit/LayoutTests/css-parser/color3_hsla_1-expected.txt
index 2cf0671..ec0b49a 100644
--- a/third_party/WebKit/LayoutTests/css-parser/color3_hsla_1-expected.txt
+++ b/third_party/WebKit/LayoutTests/css-parser/color3_hsla_1-expected.txt
@@ -151,75 +151,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 12.5%, 1)") is "rgb(43, 19, 19)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 12.5%, 1)") is "rgb(43, 31, 19)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 12.5%, 1)") is "rgb(43, 43, 19)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 12.5%, 1)") should be rgb(31, 43, 19). Was rgb(32, 43, 19).
+PASS colorTest.parseColor("hsla(90, 37.5%, 12.5%, 1)") is "rgb(31, 43, 19)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 12.5%, 1)") is "rgb(19, 43, 19)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 12.5%, 1)") should be rgb(19, 43, 31). Was rgb(19, 43, 32).
+PASS colorTest.parseColor("hsla(150, 37.5%, 12.5%, 1)") is "rgb(19, 43, 31)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 12.5%, 1)") is "rgb(19, 43, 43)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 12.5%, 1)") is "rgb(19, 31, 43)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 12.5%, 1)") is "rgb(19, 19, 43)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 12.5%, 1)") is "rgb(31, 19, 43)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 12.5%, 1)") is "rgb(43, 19, 43)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 12.5%, 1)") should be rgb(43, 19, 31). Was rgb(43, 19, 32).
+PASS colorTest.parseColor("hsla(330, 37.5%, 12.5%, 1)") is "rgb(43, 19, 31)"
 PASS colorTest.parseColor("hsla(0, 50%, 12.5%, 1)") is "rgb(47, 15, 15)"
 PASS colorTest.parseColor("hsla(30, 50%, 12.5%, 1)") is "rgb(47, 31, 15)"
 PASS colorTest.parseColor("hsla(60, 50%, 12.5%, 1)") is "rgb(47, 47, 15)"
-FAIL colorTest.parseColor("hsla(90, 50%, 12.5%, 1)") should be rgb(31, 47, 15). Was rgb(32, 47, 15).
+PASS colorTest.parseColor("hsla(90, 50%, 12.5%, 1)") is "rgb(31, 47, 15)"
 PASS colorTest.parseColor("hsla(120, 50%, 12.5%, 1)") is "rgb(15, 47, 15)"
-FAIL colorTest.parseColor("hsla(150, 50%, 12.5%, 1)") should be rgb(15, 47, 31). Was rgb(15, 47, 32).
+PASS colorTest.parseColor("hsla(150, 50%, 12.5%, 1)") is "rgb(15, 47, 31)"
 PASS colorTest.parseColor("hsla(180, 50%, 12.5%, 1)") is "rgb(15, 47, 47)"
 PASS colorTest.parseColor("hsla(210, 50%, 12.5%, 1)") is "rgb(15, 31, 47)"
 PASS colorTest.parseColor("hsla(240, 50%, 12.5%, 1)") is "rgb(15, 15, 47)"
 PASS colorTest.parseColor("hsla(270, 50%, 12.5%, 1)") is "rgb(31, 15, 47)"
 PASS colorTest.parseColor("hsla(300, 50%, 12.5%, 1)") is "rgb(47, 15, 47)"
-FAIL colorTest.parseColor("hsla(330, 50%, 12.5%, 1)") should be rgb(47, 15, 31). Was rgb(47, 15, 32).
+PASS colorTest.parseColor("hsla(330, 50%, 12.5%, 1)") is "rgb(47, 15, 31)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 12.5%, 1)") is "rgb(51, 11, 11)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 12.5%, 1)") is "rgb(51, 31, 11)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 12.5%, 1)") is "rgb(51, 51, 11)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 12.5%, 1)") should be rgb(31, 51, 11). Was rgb(32, 51, 11).
+PASS colorTest.parseColor("hsla(90, 62.5%, 12.5%, 1)") is "rgb(31, 51, 11)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 12.5%, 1)") is "rgb(11, 51, 11)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 12.5%, 1)") should be rgb(11, 51, 31). Was rgb(11, 51, 32).
+PASS colorTest.parseColor("hsla(150, 62.5%, 12.5%, 1)") is "rgb(11, 51, 31)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 12.5%, 1)") is "rgb(11, 51, 51)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 12.5%, 1)") is "rgb(11, 31, 51)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 12.5%, 1)") is "rgb(11, 11, 51)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 12.5%, 1)") is "rgb(31, 11, 51)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 12.5%, 1)") is "rgb(51, 11, 51)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 12.5%, 1)") should be rgb(51, 11, 31). Was rgb(51, 11, 32).
+PASS colorTest.parseColor("hsla(330, 62.5%, 12.5%, 1)") is "rgb(51, 11, 31)"
 PASS colorTest.parseColor("hsla(0, 75%, 12.5%, 1)") is "rgb(55, 7, 7)"
 PASS colorTest.parseColor("hsla(30, 75%, 12.5%, 1)") is "rgb(55, 31, 7)"
 PASS colorTest.parseColor("hsla(60, 75%, 12.5%, 1)") is "rgb(55, 55, 7)"
-FAIL colorTest.parseColor("hsla(90, 75%, 12.5%, 1)") should be rgb(31, 55, 7). Was rgb(32, 55, 7).
+PASS colorTest.parseColor("hsla(90, 75%, 12.5%, 1)") is "rgb(31, 55, 7)"
 PASS colorTest.parseColor("hsla(120, 75%, 12.5%, 1)") is "rgb(7, 55, 7)"
-FAIL colorTest.parseColor("hsla(150, 75%, 12.5%, 1)") should be rgb(7, 55, 31). Was rgb(7, 55, 32).
+PASS colorTest.parseColor("hsla(150, 75%, 12.5%, 1)") is "rgb(7, 55, 31)"
 PASS colorTest.parseColor("hsla(180, 75%, 12.5%, 1)") is "rgb(7, 55, 55)"
 PASS colorTest.parseColor("hsla(210, 75%, 12.5%, 1)") is "rgb(7, 31, 55)"
 PASS colorTest.parseColor("hsla(240, 75%, 12.5%, 1)") is "rgb(7, 7, 55)"
 PASS colorTest.parseColor("hsla(270, 75%, 12.5%, 1)") is "rgb(31, 7, 55)"
 PASS colorTest.parseColor("hsla(300, 75%, 12.5%, 1)") is "rgb(55, 7, 55)"
-FAIL colorTest.parseColor("hsla(330, 75%, 12.5%, 1)") should be rgb(55, 7, 31). Was rgb(55, 7, 32).
+PASS colorTest.parseColor("hsla(330, 75%, 12.5%, 1)") is "rgb(55, 7, 31)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 12.5%, 1)") is "rgb(59, 3, 3)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 12.5%, 1)") is "rgb(59, 31, 3)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 12.5%, 1)") is "rgb(59, 59, 3)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 12.5%, 1)") should be rgb(31, 59, 3). Was rgb(32, 59, 3).
+PASS colorTest.parseColor("hsla(90, 87.5%, 12.5%, 1)") is "rgb(31, 59, 3)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 12.5%, 1)") is "rgb(3, 59, 3)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 12.5%, 1)") should be rgb(3, 59, 31). Was rgb(3, 59, 32).
+PASS colorTest.parseColor("hsla(150, 87.5%, 12.5%, 1)") is "rgb(3, 59, 31)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 12.5%, 1)") is "rgb(3, 59, 59)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 12.5%, 1)") is "rgb(3, 31, 59)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 12.5%, 1)") is "rgb(3, 3, 59)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 12.5%, 1)") is "rgb(31, 3, 59)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 12.5%, 1)") is "rgb(59, 3, 59)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 12.5%, 1)") should be rgb(59, 3, 31). Was rgb(59, 3, 32).
+PASS colorTest.parseColor("hsla(330, 87.5%, 12.5%, 1)") is "rgb(59, 3, 31)"
 PASS colorTest.parseColor("hsla(0, 100%, 12.5%, 1)") is "rgb(63, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 12.5%, 1)") is "rgb(63, 31, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 12.5%, 1)") is "rgb(63, 63, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 12.5%, 1)") should be rgb(31, 63, 0). Was rgb(32, 63, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 12.5%, 1)") is "rgb(31, 63, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 12.5%, 1)") is "rgb(0, 63, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 12.5%, 1)") should be rgb(0, 63, 31). Was rgb(0, 63, 32).
+PASS colorTest.parseColor("hsla(150, 100%, 12.5%, 1)") is "rgb(0, 63, 31)"
 PASS colorTest.parseColor("hsla(180, 100%, 12.5%, 1)") is "rgb(0, 63, 63)"
 PASS colorTest.parseColor("hsla(210, 100%, 12.5%, 1)") is "rgb(0, 31, 63)"
 PASS colorTest.parseColor("hsla(240, 100%, 12.5%, 1)") is "rgb(0, 0, 63)"
 PASS colorTest.parseColor("hsla(270, 100%, 12.5%, 1)") is "rgb(31, 0, 63)"
 PASS colorTest.parseColor("hsla(300, 100%, 12.5%, 1)") is "rgb(63, 0, 63)"
-FAIL colorTest.parseColor("hsla(330, 100%, 12.5%, 1)") should be rgb(63, 0, 31). Was rgb(63, 0, 32).
+PASS colorTest.parseColor("hsla(330, 100%, 12.5%, 1)") is "rgb(63, 0, 31)"
 PASS colorTest.parseColor("hsla(0, 0%, 25%, 1)") is "rgb(63, 63, 63)"
 PASS colorTest.parseColor("hsla(30, 0%, 25%, 1)") is "rgb(63, 63, 63)"
 PASS colorTest.parseColor("hsla(60, 0%, 25%, 1)") is "rgb(63, 63, 63)"
@@ -259,75 +259,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 25%, 1)") is "rgb(87, 39, 39)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 25%, 1)") is "rgb(87, 63, 39)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 25%, 1)") is "rgb(87, 87, 39)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 25%, 1)") should be rgb(63, 87, 39). Was rgb(64, 87, 39).
+PASS colorTest.parseColor("hsla(90, 37.5%, 25%, 1)") is "rgb(63, 87, 39)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 25%, 1)") is "rgb(39, 87, 39)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 25%, 1)") should be rgb(39, 87, 63). Was rgb(39, 87, 64).
+PASS colorTest.parseColor("hsla(150, 37.5%, 25%, 1)") is "rgb(39, 87, 63)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 25%, 1)") is "rgb(39, 87, 87)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 25%, 1)") is "rgb(39, 63, 87)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 25%, 1)") is "rgb(39, 39, 87)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 25%, 1)") is "rgb(63, 39, 87)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 25%, 1)") is "rgb(87, 39, 87)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 25%, 1)") should be rgb(87, 39, 63). Was rgb(87, 39, 64).
+PASS colorTest.parseColor("hsla(330, 37.5%, 25%, 1)") is "rgb(87, 39, 63)"
 PASS colorTest.parseColor("hsla(0, 50%, 25%, 1)") is "rgb(95, 31, 31)"
 PASS colorTest.parseColor("hsla(30, 50%, 25%, 1)") is "rgb(95, 63, 31)"
 PASS colorTest.parseColor("hsla(60, 50%, 25%, 1)") is "rgb(95, 95, 31)"
-FAIL colorTest.parseColor("hsla(90, 50%, 25%, 1)") should be rgb(63, 95, 31). Was rgb(64, 95, 31).
+PASS colorTest.parseColor("hsla(90, 50%, 25%, 1)") is "rgb(63, 95, 31)"
 PASS colorTest.parseColor("hsla(120, 50%, 25%, 1)") is "rgb(31, 95, 31)"
-FAIL colorTest.parseColor("hsla(150, 50%, 25%, 1)") should be rgb(31, 95, 63). Was rgb(31, 95, 64).
+PASS colorTest.parseColor("hsla(150, 50%, 25%, 1)") is "rgb(31, 95, 63)"
 PASS colorTest.parseColor("hsla(180, 50%, 25%, 1)") is "rgb(31, 95, 95)"
 PASS colorTest.parseColor("hsla(210, 50%, 25%, 1)") is "rgb(31, 63, 95)"
 PASS colorTest.parseColor("hsla(240, 50%, 25%, 1)") is "rgb(31, 31, 95)"
 PASS colorTest.parseColor("hsla(270, 50%, 25%, 1)") is "rgb(63, 31, 95)"
 PASS colorTest.parseColor("hsla(300, 50%, 25%, 1)") is "rgb(95, 31, 95)"
-FAIL colorTest.parseColor("hsla(330, 50%, 25%, 1)") should be rgb(95, 31, 63). Was rgb(95, 31, 64).
+PASS colorTest.parseColor("hsla(330, 50%, 25%, 1)") is "rgb(95, 31, 63)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 25%, 1)") is "rgb(103, 23, 23)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 25%, 1)") is "rgb(103, 63, 23)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 25%, 1)") is "rgb(103, 103, 23)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 25%, 1)") should be rgb(63, 103, 23). Was rgb(64, 103, 23).
+PASS colorTest.parseColor("hsla(90, 62.5%, 25%, 1)") is "rgb(63, 103, 23)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 25%, 1)") is "rgb(23, 103, 23)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 25%, 1)") should be rgb(23, 103, 63). Was rgb(23, 103, 64).
+PASS colorTest.parseColor("hsla(150, 62.5%, 25%, 1)") is "rgb(23, 103, 63)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 25%, 1)") is "rgb(23, 103, 103)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 25%, 1)") is "rgb(23, 63, 103)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 25%, 1)") is "rgb(23, 23, 103)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 25%, 1)") is "rgb(63, 23, 103)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 25%, 1)") is "rgb(103, 23, 103)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 25%, 1)") should be rgb(103, 23, 63). Was rgb(103, 23, 64).
+PASS colorTest.parseColor("hsla(330, 62.5%, 25%, 1)") is "rgb(103, 23, 63)"
 PASS colorTest.parseColor("hsla(0, 75%, 25%, 1)") is "rgb(111, 15, 15)"
 PASS colorTest.parseColor("hsla(30, 75%, 25%, 1)") is "rgb(111, 63, 15)"
 PASS colorTest.parseColor("hsla(60, 75%, 25%, 1)") is "rgb(111, 111, 15)"
-FAIL colorTest.parseColor("hsla(90, 75%, 25%, 1)") should be rgb(63, 111, 15). Was rgb(64, 111, 15).
+PASS colorTest.parseColor("hsla(90, 75%, 25%, 1)") is "rgb(63, 111, 15)"
 PASS colorTest.parseColor("hsla(120, 75%, 25%, 1)") is "rgb(15, 111, 15)"
-FAIL colorTest.parseColor("hsla(150, 75%, 25%, 1)") should be rgb(15, 111, 63). Was rgb(15, 111, 64).
+PASS colorTest.parseColor("hsla(150, 75%, 25%, 1)") is "rgb(15, 111, 63)"
 PASS colorTest.parseColor("hsla(180, 75%, 25%, 1)") is "rgb(15, 111, 111)"
 PASS colorTest.parseColor("hsla(210, 75%, 25%, 1)") is "rgb(15, 63, 111)"
 PASS colorTest.parseColor("hsla(240, 75%, 25%, 1)") is "rgb(15, 15, 111)"
 PASS colorTest.parseColor("hsla(270, 75%, 25%, 1)") is "rgb(63, 15, 111)"
 PASS colorTest.parseColor("hsla(300, 75%, 25%, 1)") is "rgb(111, 15, 111)"
-FAIL colorTest.parseColor("hsla(330, 75%, 25%, 1)") should be rgb(111, 15, 63). Was rgb(111, 15, 64).
+PASS colorTest.parseColor("hsla(330, 75%, 25%, 1)") is "rgb(111, 15, 63)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 25%, 1)") is "rgb(119, 7, 7)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 25%, 1)") is "rgb(119, 63, 7)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 25%, 1)") is "rgb(119, 119, 7)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 25%, 1)") should be rgb(63, 119, 7). Was rgb(64, 119, 7).
+PASS colorTest.parseColor("hsla(90, 87.5%, 25%, 1)") is "rgb(63, 119, 7)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 25%, 1)") is "rgb(7, 119, 7)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 25%, 1)") should be rgb(7, 119, 63). Was rgb(7, 119, 64).
+PASS colorTest.parseColor("hsla(150, 87.5%, 25%, 1)") is "rgb(7, 119, 63)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 25%, 1)") is "rgb(7, 119, 119)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 25%, 1)") is "rgb(7, 63, 119)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 25%, 1)") is "rgb(7, 7, 119)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 25%, 1)") is "rgb(63, 7, 119)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 25%, 1)") is "rgb(119, 7, 119)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 25%, 1)") should be rgb(119, 7, 63). Was rgb(119, 7, 64).
+PASS colorTest.parseColor("hsla(330, 87.5%, 25%, 1)") is "rgb(119, 7, 63)"
 PASS colorTest.parseColor("hsla(0, 100%, 25%, 1)") is "rgb(127, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 25%, 1)") is "rgb(127, 63, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 25%, 1)") is "rgb(127, 127, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 25%, 1)") should be rgb(63, 127, 0). Was rgb(64, 127, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 25%, 1)") is "rgb(63, 127, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 25%, 1)") is "rgb(0, 127, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 25%, 1)") should be rgb(0, 127, 63). Was rgb(0, 127, 64).
+PASS colorTest.parseColor("hsla(150, 100%, 25%, 1)") is "rgb(0, 127, 63)"
 PASS colorTest.parseColor("hsla(180, 100%, 25%, 1)") is "rgb(0, 127, 127)"
 PASS colorTest.parseColor("hsla(210, 100%, 25%, 1)") is "rgb(0, 63, 127)"
 PASS colorTest.parseColor("hsla(240, 100%, 25%, 1)") is "rgb(0, 0, 127)"
 PASS colorTest.parseColor("hsla(270, 100%, 25%, 1)") is "rgb(63, 0, 127)"
 PASS colorTest.parseColor("hsla(300, 100%, 25%, 1)") is "rgb(127, 0, 127)"
-FAIL colorTest.parseColor("hsla(330, 100%, 25%, 1)") should be rgb(127, 0, 63). Was rgb(127, 0, 64).
+PASS colorTest.parseColor("hsla(330, 100%, 25%, 1)") is "rgb(127, 0, 63)"
 PASS colorTest.parseColor("hsla(0, 0%, 37.5%, 1)") is "rgb(95, 95, 95)"
 PASS colorTest.parseColor("hsla(30, 0%, 37.5%, 1)") is "rgb(95, 95, 95)"
 PASS colorTest.parseColor("hsla(60, 0%, 37.5%, 1)") is "rgb(95, 95, 95)"
@@ -355,87 +355,87 @@
 PASS colorTest.parseColor("hsla(0, 25%, 37.5%, 1)") is "rgb(119, 71, 71)"
 PASS colorTest.parseColor("hsla(30, 25%, 37.5%, 1)") is "rgb(119, 95, 71)"
 PASS colorTest.parseColor("hsla(60, 25%, 37.5%, 1)") is "rgb(119, 119, 71)"
-FAIL colorTest.parseColor("hsla(90, 25%, 37.5%, 1)") should be rgb(95, 119, 71). Was rgb(96, 119, 71).
+PASS colorTest.parseColor("hsla(90, 25%, 37.5%, 1)") is "rgb(95, 119, 71)"
 PASS colorTest.parseColor("hsla(120, 25%, 37.5%, 1)") is "rgb(71, 119, 71)"
-FAIL colorTest.parseColor("hsla(150, 25%, 37.5%, 1)") should be rgb(71, 119, 95). Was rgb(71, 119, 96).
+PASS colorTest.parseColor("hsla(150, 25%, 37.5%, 1)") is "rgb(71, 119, 95)"
 PASS colorTest.parseColor("hsla(180, 25%, 37.5%, 1)") is "rgb(71, 119, 119)"
 PASS colorTest.parseColor("hsla(210, 25%, 37.5%, 1)") is "rgb(71, 95, 119)"
 PASS colorTest.parseColor("hsla(240, 25%, 37.5%, 1)") is "rgb(71, 71, 119)"
 PASS colorTest.parseColor("hsla(270, 25%, 37.5%, 1)") is "rgb(95, 71, 119)"
 PASS colorTest.parseColor("hsla(300, 25%, 37.5%, 1)") is "rgb(119, 71, 119)"
-FAIL colorTest.parseColor("hsla(330, 25%, 37.5%, 1)") should be rgb(119, 71, 95). Was rgb(119, 71, 96).
+PASS colorTest.parseColor("hsla(330, 25%, 37.5%, 1)") is "rgb(119, 71, 95)"
 PASS colorTest.parseColor("hsla(0, 37.5%, 37.5%, 1)") is "rgb(131, 59, 59)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 37.5%, 1)") is "rgb(131, 95, 59)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 37.5%, 1)") is "rgb(131, 131, 59)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 37.5%, 1)") should be rgb(95, 131, 59). Was rgb(96, 131, 59).
+PASS colorTest.parseColor("hsla(90, 37.5%, 37.5%, 1)") is "rgb(95, 131, 59)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 37.5%, 1)") is "rgb(59, 131, 59)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 37.5%, 1)") should be rgb(59, 131, 95). Was rgb(59, 131, 96).
+PASS colorTest.parseColor("hsla(150, 37.5%, 37.5%, 1)") is "rgb(59, 131, 95)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 37.5%, 1)") is "rgb(59, 131, 131)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 37.5%, 1)") is "rgb(59, 95, 131)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 37.5%, 1)") is "rgb(59, 59, 131)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 37.5%, 1)") is "rgb(95, 59, 131)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 37.5%, 1)") is "rgb(131, 59, 131)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 37.5%, 1)") should be rgb(131, 59, 95). Was rgb(131, 59, 96).
+PASS colorTest.parseColor("hsla(330, 37.5%, 37.5%, 1)") is "rgb(131, 59, 95)"
 PASS colorTest.parseColor("hsla(0, 50%, 37.5%, 1)") is "rgb(143, 47, 47)"
 PASS colorTest.parseColor("hsla(30, 50%, 37.5%, 1)") is "rgb(143, 95, 47)"
 PASS colorTest.parseColor("hsla(60, 50%, 37.5%, 1)") is "rgb(143, 143, 47)"
-FAIL colorTest.parseColor("hsla(90, 50%, 37.5%, 1)") should be rgb(95, 143, 47). Was rgb(96, 143, 47).
+PASS colorTest.parseColor("hsla(90, 50%, 37.5%, 1)") is "rgb(95, 143, 47)"
 PASS colorTest.parseColor("hsla(120, 50%, 37.5%, 1)") is "rgb(47, 143, 47)"
-FAIL colorTest.parseColor("hsla(150, 50%, 37.5%, 1)") should be rgb(47, 143, 95). Was rgb(47, 143, 96).
+PASS colorTest.parseColor("hsla(150, 50%, 37.5%, 1)") is "rgb(47, 143, 95)"
 PASS colorTest.parseColor("hsla(180, 50%, 37.5%, 1)") is "rgb(47, 143, 143)"
 PASS colorTest.parseColor("hsla(210, 50%, 37.5%, 1)") is "rgb(47, 95, 143)"
 PASS colorTest.parseColor("hsla(240, 50%, 37.5%, 1)") is "rgb(47, 47, 143)"
 PASS colorTest.parseColor("hsla(270, 50%, 37.5%, 1)") is "rgb(95, 47, 143)"
 PASS colorTest.parseColor("hsla(300, 50%, 37.5%, 1)") is "rgb(143, 47, 143)"
-FAIL colorTest.parseColor("hsla(330, 50%, 37.5%, 1)") should be rgb(143, 47, 95). Was rgb(143, 47, 96).
+PASS colorTest.parseColor("hsla(330, 50%, 37.5%, 1)") is "rgb(143, 47, 95)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 37.5%, 1)") is "rgb(155, 35, 35)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 37.5%, 1)") is "rgb(155, 95, 35)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 37.5%, 1)") is "rgb(155, 155, 35)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 37.5%, 1)") should be rgb(95, 155, 35). Was rgb(96, 155, 35).
+PASS colorTest.parseColor("hsla(90, 62.5%, 37.5%, 1)") is "rgb(95, 155, 35)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 37.5%, 1)") is "rgb(35, 155, 35)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 37.5%, 1)") should be rgb(35, 155, 95). Was rgb(35, 155, 96).
+PASS colorTest.parseColor("hsla(150, 62.5%, 37.5%, 1)") is "rgb(35, 155, 95)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 37.5%, 1)") is "rgb(35, 155, 155)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 37.5%, 1)") is "rgb(35, 95, 155)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 37.5%, 1)") is "rgb(35, 35, 155)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 37.5%, 1)") is "rgb(95, 35, 155)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 37.5%, 1)") is "rgb(155, 35, 155)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 37.5%, 1)") should be rgb(155, 35, 95). Was rgb(155, 35, 96).
+PASS colorTest.parseColor("hsla(330, 62.5%, 37.5%, 1)") is "rgb(155, 35, 95)"
 PASS colorTest.parseColor("hsla(0, 75%, 37.5%, 1)") is "rgb(167, 23, 23)"
 PASS colorTest.parseColor("hsla(30, 75%, 37.5%, 1)") is "rgb(167, 95, 23)"
 PASS colorTest.parseColor("hsla(60, 75%, 37.5%, 1)") is "rgb(167, 167, 23)"
-FAIL colorTest.parseColor("hsla(90, 75%, 37.5%, 1)") should be rgb(95, 167, 23). Was rgb(96, 167, 23).
+PASS colorTest.parseColor("hsla(90, 75%, 37.5%, 1)") is "rgb(95, 167, 23)"
 PASS colorTest.parseColor("hsla(120, 75%, 37.5%, 1)") is "rgb(23, 167, 23)"
-FAIL colorTest.parseColor("hsla(150, 75%, 37.5%, 1)") should be rgb(23, 167, 95). Was rgb(23, 167, 96).
+PASS colorTest.parseColor("hsla(150, 75%, 37.5%, 1)") is "rgb(23, 167, 95)"
 PASS colorTest.parseColor("hsla(180, 75%, 37.5%, 1)") is "rgb(23, 167, 167)"
 PASS colorTest.parseColor("hsla(210, 75%, 37.5%, 1)") is "rgb(23, 95, 167)"
 PASS colorTest.parseColor("hsla(240, 75%, 37.5%, 1)") is "rgb(23, 23, 167)"
 PASS colorTest.parseColor("hsla(270, 75%, 37.5%, 1)") is "rgb(95, 23, 167)"
 PASS colorTest.parseColor("hsla(300, 75%, 37.5%, 1)") is "rgb(167, 23, 167)"
-FAIL colorTest.parseColor("hsla(330, 75%, 37.5%, 1)") should be rgb(167, 23, 95). Was rgb(167, 23, 96).
+PASS colorTest.parseColor("hsla(330, 75%, 37.5%, 1)") is "rgb(167, 23, 95)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 37.5%, 1)") is "rgb(179, 11, 11)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 37.5%, 1)") is "rgb(179, 95, 11)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 37.5%, 1)") is "rgb(179, 179, 11)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 37.5%, 1)") should be rgb(95, 179, 11). Was rgb(96, 179, 11).
+PASS colorTest.parseColor("hsla(90, 87.5%, 37.5%, 1)") is "rgb(95, 179, 11)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 37.5%, 1)") is "rgb(11, 179, 11)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 37.5%, 1)") should be rgb(11, 179, 95). Was rgb(11, 179, 96).
+PASS colorTest.parseColor("hsla(150, 87.5%, 37.5%, 1)") is "rgb(11, 179, 95)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 37.5%, 1)") is "rgb(11, 179, 179)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 37.5%, 1)") is "rgb(11, 95, 179)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 37.5%, 1)") is "rgb(11, 11, 179)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 37.5%, 1)") is "rgb(95, 11, 179)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 37.5%, 1)") is "rgb(179, 11, 179)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 37.5%, 1)") should be rgb(179, 11, 95). Was rgb(179, 11, 96).
+PASS colorTest.parseColor("hsla(330, 87.5%, 37.5%, 1)") is "rgb(179, 11, 95)"
 PASS colorTest.parseColor("hsla(0, 100%, 37.5%, 1)") is "rgb(191, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 37.5%, 1)") is "rgb(191, 95, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 37.5%, 1)") is "rgb(191, 191, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 37.5%, 1)") should be rgb(95, 191, 0). Was rgb(96, 191, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 37.5%, 1)") is "rgb(95, 191, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 37.5%, 1)") is "rgb(0, 191, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 37.5%, 1)") should be rgb(0, 191, 95). Was rgb(0, 191, 96).
+PASS colorTest.parseColor("hsla(150, 100%, 37.5%, 1)") is "rgb(0, 191, 95)"
 PASS colorTest.parseColor("hsla(180, 100%, 37.5%, 1)") is "rgb(0, 191, 191)"
 PASS colorTest.parseColor("hsla(210, 100%, 37.5%, 1)") is "rgb(0, 95, 191)"
 PASS colorTest.parseColor("hsla(240, 100%, 37.5%, 1)") is "rgb(0, 0, 191)"
 PASS colorTest.parseColor("hsla(270, 100%, 37.5%, 1)") is "rgb(95, 0, 191)"
 PASS colorTest.parseColor("hsla(300, 100%, 37.5%, 1)") is "rgb(191, 0, 191)"
-FAIL colorTest.parseColor("hsla(330, 100%, 37.5%, 1)") should be rgb(191, 0, 95). Was rgb(191, 0, 96).
+PASS colorTest.parseColor("hsla(330, 100%, 37.5%, 1)") is "rgb(191, 0, 95)"
 PASS colorTest.parseColor("hsla(0, 0%, 50%, 1)") is "rgb(127, 127, 127)"
 PASS colorTest.parseColor("hsla(30, 0%, 50%, 1)") is "rgb(127, 127, 127)"
 PASS colorTest.parseColor("hsla(60, 0%, 50%, 1)") is "rgb(127, 127, 127)"
@@ -475,75 +475,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 50%, 1)") is "rgb(175, 79, 79)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 50%, 1)") is "rgb(175, 127, 79)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 50%, 1)") is "rgb(175, 175, 79)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 50%, 1)") should be rgb(127, 175, 79). Was rgb(128, 175, 79).
+PASS colorTest.parseColor("hsla(90, 37.5%, 50%, 1)") is "rgb(127, 175, 79)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 50%, 1)") is "rgb(79, 175, 79)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 50%, 1)") should be rgb(79, 175, 127). Was rgb(79, 175, 128).
+PASS colorTest.parseColor("hsla(150, 37.5%, 50%, 1)") is "rgb(79, 175, 127)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 50%, 1)") is "rgb(79, 175, 175)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 50%, 1)") is "rgb(79, 127, 175)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 50%, 1)") is "rgb(79, 79, 175)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 50%, 1)") is "rgb(127, 79, 175)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 50%, 1)") is "rgb(175, 79, 175)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 50%, 1)") should be rgb(175, 79, 127). Was rgb(175, 79, 128).
+PASS colorTest.parseColor("hsla(330, 37.5%, 50%, 1)") is "rgb(175, 79, 127)"
 PASS colorTest.parseColor("hsla(0, 50%, 50%, 1)") is "rgb(191, 63, 63)"
 PASS colorTest.parseColor("hsla(30, 50%, 50%, 1)") is "rgb(191, 127, 63)"
 PASS colorTest.parseColor("hsla(60, 50%, 50%, 1)") is "rgb(191, 191, 63)"
-FAIL colorTest.parseColor("hsla(90, 50%, 50%, 1)") should be rgb(127, 191, 63). Was rgb(128, 191, 63).
+PASS colorTest.parseColor("hsla(90, 50%, 50%, 1)") is "rgb(127, 191, 63)"
 PASS colorTest.parseColor("hsla(120, 50%, 50%, 1)") is "rgb(63, 191, 63)"
-FAIL colorTest.parseColor("hsla(150, 50%, 50%, 1)") should be rgb(63, 191, 127). Was rgb(63, 191, 128).
+PASS colorTest.parseColor("hsla(150, 50%, 50%, 1)") is "rgb(63, 191, 127)"
 PASS colorTest.parseColor("hsla(180, 50%, 50%, 1)") is "rgb(63, 191, 191)"
 PASS colorTest.parseColor("hsla(210, 50%, 50%, 1)") is "rgb(63, 127, 191)"
 PASS colorTest.parseColor("hsla(240, 50%, 50%, 1)") is "rgb(63, 63, 191)"
 PASS colorTest.parseColor("hsla(270, 50%, 50%, 1)") is "rgb(127, 63, 191)"
 PASS colorTest.parseColor("hsla(300, 50%, 50%, 1)") is "rgb(191, 63, 191)"
-FAIL colorTest.parseColor("hsla(330, 50%, 50%, 1)") should be rgb(191, 63, 127). Was rgb(191, 63, 128).
+PASS colorTest.parseColor("hsla(330, 50%, 50%, 1)") is "rgb(191, 63, 127)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 50%, 1)") is "rgb(207, 47, 47)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 50%, 1)") is "rgb(207, 127, 47)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 50%, 1)") is "rgb(207, 207, 47)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 50%, 1)") should be rgb(127, 207, 47). Was rgb(128, 207, 47).
+PASS colorTest.parseColor("hsla(90, 62.5%, 50%, 1)") is "rgb(127, 207, 47)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 50%, 1)") is "rgb(47, 207, 47)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 50%, 1)") should be rgb(47, 207, 127). Was rgb(47, 207, 128).
+PASS colorTest.parseColor("hsla(150, 62.5%, 50%, 1)") is "rgb(47, 207, 127)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 50%, 1)") is "rgb(47, 207, 207)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 50%, 1)") is "rgb(47, 127, 207)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 50%, 1)") is "rgb(47, 47, 207)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 50%, 1)") is "rgb(127, 47, 207)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 50%, 1)") is "rgb(207, 47, 207)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 50%, 1)") should be rgb(207, 47, 127). Was rgb(207, 47, 128).
+PASS colorTest.parseColor("hsla(330, 62.5%, 50%, 1)") is "rgb(207, 47, 127)"
 PASS colorTest.parseColor("hsla(0, 75%, 50%, 1)") is "rgb(223, 31, 31)"
 PASS colorTest.parseColor("hsla(30, 75%, 50%, 1)") is "rgb(223, 127, 31)"
 PASS colorTest.parseColor("hsla(60, 75%, 50%, 1)") is "rgb(223, 223, 31)"
-FAIL colorTest.parseColor("hsla(90, 75%, 50%, 1)") should be rgb(127, 223, 31). Was rgb(128, 223, 31).
+PASS colorTest.parseColor("hsla(90, 75%, 50%, 1)") is "rgb(127, 223, 31)"
 PASS colorTest.parseColor("hsla(120, 75%, 50%, 1)") is "rgb(31, 223, 31)"
-FAIL colorTest.parseColor("hsla(150, 75%, 50%, 1)") should be rgb(31, 223, 127). Was rgb(31, 223, 128).
+PASS colorTest.parseColor("hsla(150, 75%, 50%, 1)") is "rgb(31, 223, 127)"
 PASS colorTest.parseColor("hsla(180, 75%, 50%, 1)") is "rgb(31, 223, 223)"
 PASS colorTest.parseColor("hsla(210, 75%, 50%, 1)") is "rgb(31, 127, 223)"
 PASS colorTest.parseColor("hsla(240, 75%, 50%, 1)") is "rgb(31, 31, 223)"
 PASS colorTest.parseColor("hsla(270, 75%, 50%, 1)") is "rgb(127, 31, 223)"
 PASS colorTest.parseColor("hsla(300, 75%, 50%, 1)") is "rgb(223, 31, 223)"
-FAIL colorTest.parseColor("hsla(330, 75%, 50%, 1)") should be rgb(223, 31, 127). Was rgb(223, 31, 128).
+PASS colorTest.parseColor("hsla(330, 75%, 50%, 1)") is "rgb(223, 31, 127)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 50%, 1)") is "rgb(239, 15, 15)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 50%, 1)") is "rgb(239, 127, 15)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 50%, 1)") is "rgb(239, 239, 15)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 50%, 1)") should be rgb(127, 239, 15). Was rgb(128, 239, 15).
+PASS colorTest.parseColor("hsla(90, 87.5%, 50%, 1)") is "rgb(127, 239, 15)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 50%, 1)") is "rgb(15, 239, 15)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 50%, 1)") should be rgb(15, 239, 127). Was rgb(15, 239, 128).
+PASS colorTest.parseColor("hsla(150, 87.5%, 50%, 1)") is "rgb(15, 239, 127)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 50%, 1)") is "rgb(15, 239, 239)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 50%, 1)") is "rgb(15, 127, 239)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 50%, 1)") is "rgb(15, 15, 239)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 50%, 1)") is "rgb(127, 15, 239)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 50%, 1)") is "rgb(239, 15, 239)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 50%, 1)") should be rgb(239, 15, 127). Was rgb(239, 15, 128).
+PASS colorTest.parseColor("hsla(330, 87.5%, 50%, 1)") is "rgb(239, 15, 127)"
 PASS colorTest.parseColor("hsla(0, 100%, 50%, 1)") is "rgb(255, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 50%, 1)") is "rgb(255, 127, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 50%, 1)") is "rgb(255, 255, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 50%, 1)") should be rgb(127, 255, 0). Was rgb(128, 255, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 50%, 1)") is "rgb(127, 255, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 50%, 1)") is "rgb(0, 255, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 50%, 1)") should be rgb(0, 255, 127). Was rgb(0, 255, 128).
+PASS colorTest.parseColor("hsla(150, 100%, 50%, 1)") is "rgb(0, 255, 127)"
 PASS colorTest.parseColor("hsla(180, 100%, 50%, 1)") is "rgb(0, 255, 255)"
 PASS colorTest.parseColor("hsla(210, 100%, 50%, 1)") is "rgb(0, 127, 255)"
 PASS colorTest.parseColor("hsla(240, 100%, 50%, 1)") is "rgb(0, 0, 255)"
 PASS colorTest.parseColor("hsla(270, 100%, 50%, 1)") is "rgb(127, 0, 255)"
 PASS colorTest.parseColor("hsla(300, 100%, 50%, 1)") is "rgb(255, 0, 255)"
-FAIL colorTest.parseColor("hsla(330, 100%, 50%, 1)") should be rgb(255, 0, 127). Was rgb(255, 0, 128).
+PASS colorTest.parseColor("hsla(330, 100%, 50%, 1)") is "rgb(255, 0, 127)"
 PASS colorTest.parseColor("hsla(0, 0%, 62.5%, 1)") is "rgb(159, 159, 159)"
 PASS colorTest.parseColor("hsla(30, 0%, 62.5%, 1)") is "rgb(159, 159, 159)"
 PASS colorTest.parseColor("hsla(60, 0%, 62.5%, 1)") is "rgb(159, 159, 159)"
@@ -595,63 +595,63 @@
 PASS colorTest.parseColor("hsla(0, 50%, 62.5%, 1)") is "rgb(207, 111, 111)"
 PASS colorTest.parseColor("hsla(30, 50%, 62.5%, 1)") is "rgb(207, 159, 111)"
 PASS colorTest.parseColor("hsla(60, 50%, 62.5%, 1)") is "rgb(207, 207, 111)"
-FAIL colorTest.parseColor("hsla(90, 50%, 62.5%, 1)") should be rgb(159, 207, 111). Was rgb(160, 207, 111).
+PASS colorTest.parseColor("hsla(90, 50%, 62.5%, 1)") is "rgb(159, 207, 111)"
 PASS colorTest.parseColor("hsla(120, 50%, 62.5%, 1)") is "rgb(111, 207, 111)"
-FAIL colorTest.parseColor("hsla(150, 50%, 62.5%, 1)") should be rgb(111, 207, 159). Was rgb(111, 207, 160).
+PASS colorTest.parseColor("hsla(150, 50%, 62.5%, 1)") is "rgb(111, 207, 159)"
 PASS colorTest.parseColor("hsla(180, 50%, 62.5%, 1)") is "rgb(111, 207, 207)"
 PASS colorTest.parseColor("hsla(210, 50%, 62.5%, 1)") is "rgb(111, 159, 207)"
 PASS colorTest.parseColor("hsla(240, 50%, 62.5%, 1)") is "rgb(111, 111, 207)"
 PASS colorTest.parseColor("hsla(270, 50%, 62.5%, 1)") is "rgb(159, 111, 207)"
 PASS colorTest.parseColor("hsla(300, 50%, 62.5%, 1)") is "rgb(207, 111, 207)"
-FAIL colorTest.parseColor("hsla(330, 50%, 62.5%, 1)") should be rgb(207, 111, 159). Was rgb(207, 111, 160).
+PASS colorTest.parseColor("hsla(330, 50%, 62.5%, 1)") is "rgb(207, 111, 159)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 62.5%, 1)") is "rgb(219, 99, 99)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 62.5%, 1)") is "rgb(219, 159, 99)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 62.5%, 1)") is "rgb(219, 219, 99)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 62.5%, 1)") should be rgb(159, 219, 99). Was rgb(160, 219, 99).
+PASS colorTest.parseColor("hsla(90, 62.5%, 62.5%, 1)") is "rgb(159, 219, 99)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 62.5%, 1)") is "rgb(99, 219, 99)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 62.5%, 1)") should be rgb(99, 219, 159). Was rgb(99, 219, 160).
+PASS colorTest.parseColor("hsla(150, 62.5%, 62.5%, 1)") is "rgb(99, 219, 159)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 62.5%, 1)") is "rgb(99, 219, 219)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 62.5%, 1)") is "rgb(99, 159, 219)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 62.5%, 1)") is "rgb(99, 99, 219)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 62.5%, 1)") is "rgb(159, 99, 219)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 62.5%, 1)") is "rgb(219, 99, 219)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 62.5%, 1)") should be rgb(219, 99, 159). Was rgb(219, 99, 160).
+PASS colorTest.parseColor("hsla(330, 62.5%, 62.5%, 1)") is "rgb(219, 99, 159)"
 PASS colorTest.parseColor("hsla(0, 75%, 62.5%, 1)") is "rgb(231, 87, 87)"
 PASS colorTest.parseColor("hsla(30, 75%, 62.5%, 1)") is "rgb(231, 159, 87)"
 PASS colorTest.parseColor("hsla(60, 75%, 62.5%, 1)") is "rgb(231, 231, 87)"
-FAIL colorTest.parseColor("hsla(90, 75%, 62.5%, 1)") should be rgb(159, 231, 87). Was rgb(160, 231, 87).
+PASS colorTest.parseColor("hsla(90, 75%, 62.5%, 1)") is "rgb(159, 231, 87)"
 PASS colorTest.parseColor("hsla(120, 75%, 62.5%, 1)") is "rgb(87, 231, 87)"
-FAIL colorTest.parseColor("hsla(150, 75%, 62.5%, 1)") should be rgb(87, 231, 159). Was rgb(87, 231, 160).
+PASS colorTest.parseColor("hsla(150, 75%, 62.5%, 1)") is "rgb(87, 231, 159)"
 PASS colorTest.parseColor("hsla(180, 75%, 62.5%, 1)") is "rgb(87, 231, 231)"
 PASS colorTest.parseColor("hsla(210, 75%, 62.5%, 1)") is "rgb(87, 159, 231)"
 PASS colorTest.parseColor("hsla(240, 75%, 62.5%, 1)") is "rgb(87, 87, 231)"
 PASS colorTest.parseColor("hsla(270, 75%, 62.5%, 1)") is "rgb(159, 87, 231)"
 PASS colorTest.parseColor("hsla(300, 75%, 62.5%, 1)") is "rgb(231, 87, 231)"
-FAIL colorTest.parseColor("hsla(330, 75%, 62.5%, 1)") should be rgb(231, 87, 159). Was rgb(231, 87, 160).
+PASS colorTest.parseColor("hsla(330, 75%, 62.5%, 1)") is "rgb(231, 87, 159)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 62.5%, 1)") is "rgb(243, 75, 75)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 62.5%, 1)") is "rgb(243, 159, 75)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 62.5%, 1)") is "rgb(243, 243, 75)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 62.5%, 1)") should be rgb(159, 243, 75). Was rgb(160, 243, 75).
+PASS colorTest.parseColor("hsla(90, 87.5%, 62.5%, 1)") is "rgb(159, 243, 75)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 62.5%, 1)") is "rgb(75, 243, 75)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 62.5%, 1)") should be rgb(75, 243, 159). Was rgb(75, 243, 160).
+PASS colorTest.parseColor("hsla(150, 87.5%, 62.5%, 1)") is "rgb(75, 243, 159)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 62.5%, 1)") is "rgb(75, 243, 243)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 62.5%, 1)") is "rgb(75, 159, 243)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 62.5%, 1)") is "rgb(75, 75, 243)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 62.5%, 1)") is "rgb(159, 75, 243)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 62.5%, 1)") is "rgb(243, 75, 243)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 62.5%, 1)") should be rgb(243, 75, 159). Was rgb(243, 75, 160).
+PASS colorTest.parseColor("hsla(330, 87.5%, 62.5%, 1)") is "rgb(243, 75, 159)"
 PASS colorTest.parseColor("hsla(0, 100%, 62.5%, 1)") is "rgb(255, 63, 63)"
 PASS colorTest.parseColor("hsla(30, 100%, 62.5%, 1)") is "rgb(255, 159, 63)"
 PASS colorTest.parseColor("hsla(60, 100%, 62.5%, 1)") is "rgb(255, 255, 63)"
-FAIL colorTest.parseColor("hsla(90, 100%, 62.5%, 1)") should be rgb(159, 255, 63). Was rgb(160, 255, 63).
+PASS colorTest.parseColor("hsla(90, 100%, 62.5%, 1)") is "rgb(159, 255, 63)"
 PASS colorTest.parseColor("hsla(120, 100%, 62.5%, 1)") is "rgb(63, 255, 63)"
-FAIL colorTest.parseColor("hsla(150, 100%, 62.5%, 1)") should be rgb(63, 255, 159). Was rgb(63, 255, 160).
+PASS colorTest.parseColor("hsla(150, 100%, 62.5%, 1)") is "rgb(63, 255, 159)"
 PASS colorTest.parseColor("hsla(180, 100%, 62.5%, 1)") is "rgb(63, 255, 255)"
 PASS colorTest.parseColor("hsla(210, 100%, 62.5%, 1)") is "rgb(63, 159, 255)"
 PASS colorTest.parseColor("hsla(240, 100%, 62.5%, 1)") is "rgb(63, 63, 255)"
 PASS colorTest.parseColor("hsla(270, 100%, 62.5%, 1)") is "rgb(159, 63, 255)"
 PASS colorTest.parseColor("hsla(300, 100%, 62.5%, 1)") is "rgb(255, 63, 255)"
-FAIL colorTest.parseColor("hsla(330, 100%, 62.5%, 1)") should be rgb(255, 63, 159). Was rgb(255, 63, 160).
+PASS colorTest.parseColor("hsla(330, 100%, 62.5%, 1)") is "rgb(255, 63, 159)"
 PASS colorTest.parseColor("hsla(0, 0%, 75%, 1)") is "rgb(191, 191, 191)"
 PASS colorTest.parseColor("hsla(30, 0%, 75%, 1)") is "rgb(191, 191, 191)"
 PASS colorTest.parseColor("hsla(60, 0%, 75%, 1)") is "rgb(191, 191, 191)"
@@ -727,39 +727,39 @@
 PASS colorTest.parseColor("hsla(0, 75%, 75%, 1)") is "rgb(239, 143, 143)"
 PASS colorTest.parseColor("hsla(30, 75%, 75%, 1)") is "rgb(239, 191, 143)"
 PASS colorTest.parseColor("hsla(60, 75%, 75%, 1)") is "rgb(239, 239, 143)"
-FAIL colorTest.parseColor("hsla(90, 75%, 75%, 1)") should be rgb(191, 239, 143). Was rgb(192, 239, 143).
+PASS colorTest.parseColor("hsla(90, 75%, 75%, 1)") is "rgb(191, 239, 143)"
 PASS colorTest.parseColor("hsla(120, 75%, 75%, 1)") is "rgb(143, 239, 143)"
-FAIL colorTest.parseColor("hsla(150, 75%, 75%, 1)") should be rgb(143, 239, 191). Was rgb(143, 239, 192).
+PASS colorTest.parseColor("hsla(150, 75%, 75%, 1)") is "rgb(143, 239, 191)"
 PASS colorTest.parseColor("hsla(180, 75%, 75%, 1)") is "rgb(143, 239, 239)"
 PASS colorTest.parseColor("hsla(210, 75%, 75%, 1)") is "rgb(143, 191, 239)"
 PASS colorTest.parseColor("hsla(240, 75%, 75%, 1)") is "rgb(143, 143, 239)"
 PASS colorTest.parseColor("hsla(270, 75%, 75%, 1)") is "rgb(191, 143, 239)"
 PASS colorTest.parseColor("hsla(300, 75%, 75%, 1)") is "rgb(239, 143, 239)"
-FAIL colorTest.parseColor("hsla(330, 75%, 75%, 1)") should be rgb(239, 143, 191). Was rgb(239, 143, 192).
+PASS colorTest.parseColor("hsla(330, 75%, 75%, 1)") is "rgb(239, 143, 191)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 75%, 1)") is "rgb(247, 135, 135)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 75%, 1)") is "rgb(247, 191, 135)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 75%, 1)") is "rgb(247, 247, 135)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 75%, 1)") should be rgb(191, 247, 135). Was rgb(192, 247, 135).
+PASS colorTest.parseColor("hsla(90, 87.5%, 75%, 1)") is "rgb(191, 247, 135)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 75%, 1)") is "rgb(135, 247, 135)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 75%, 1)") should be rgb(135, 247, 191). Was rgb(135, 247, 192).
+PASS colorTest.parseColor("hsla(150, 87.5%, 75%, 1)") is "rgb(135, 247, 191)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 75%, 1)") is "rgb(135, 247, 247)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 75%, 1)") is "rgb(135, 191, 247)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 75%, 1)") is "rgb(135, 135, 247)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 75%, 1)") is "rgb(191, 135, 247)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 75%, 1)") is "rgb(247, 135, 247)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 75%, 1)") should be rgb(247, 135, 191). Was rgb(247, 135, 192).
+PASS colorTest.parseColor("hsla(330, 87.5%, 75%, 1)") is "rgb(247, 135, 191)"
 PASS colorTest.parseColor("hsla(0, 100%, 75%, 1)") is "rgb(255, 127, 127)"
 PASS colorTest.parseColor("hsla(30, 100%, 75%, 1)") is "rgb(255, 191, 127)"
 PASS colorTest.parseColor("hsla(60, 100%, 75%, 1)") is "rgb(255, 255, 127)"
-FAIL colorTest.parseColor("hsla(90, 100%, 75%, 1)") should be rgb(191, 255, 127). Was rgb(192, 255, 127).
+PASS colorTest.parseColor("hsla(90, 100%, 75%, 1)") is "rgb(191, 255, 127)"
 PASS colorTest.parseColor("hsla(120, 100%, 75%, 1)") is "rgb(127, 255, 127)"
-FAIL colorTest.parseColor("hsla(150, 100%, 75%, 1)") should be rgb(127, 255, 191). Was rgb(127, 255, 192).
+PASS colorTest.parseColor("hsla(150, 100%, 75%, 1)") is "rgb(127, 255, 191)"
 PASS colorTest.parseColor("hsla(180, 100%, 75%, 1)") is "rgb(127, 255, 255)"
 PASS colorTest.parseColor("hsla(210, 100%, 75%, 1)") is "rgb(127, 191, 255)"
 PASS colorTest.parseColor("hsla(240, 100%, 75%, 1)") is "rgb(127, 127, 255)"
 PASS colorTest.parseColor("hsla(270, 100%, 75%, 1)") is "rgb(191, 127, 255)"
 PASS colorTest.parseColor("hsla(300, 100%, 75%, 1)") is "rgb(255, 127, 255)"
-FAIL colorTest.parseColor("hsla(330, 100%, 75%, 1)") should be rgb(255, 127, 191). Was rgb(255, 127, 192).
+PASS colorTest.parseColor("hsla(330, 100%, 75%, 1)") is "rgb(255, 127, 191)"
 PASS colorTest.parseColor("hsla(0, 0%, 87.5%, 1)") is "rgb(223, 223, 223)"
 PASS colorTest.parseColor("hsla(30, 0%, 87.5%, 1)") is "rgb(223, 223, 223)"
 PASS colorTest.parseColor("hsla(60, 0%, 87.5%, 1)") is "rgb(223, 223, 223)"
@@ -1123,75 +1123,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 12.5%, 0.2)") is "rgba(43, 19, 19, 0.2)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 12.5%, 0.2)") is "rgba(43, 31, 19, 0.2)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 12.5%, 0.2)") is "rgba(43, 43, 19, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 12.5%, 0.2)") should be rgba(31, 43, 19, 0.2). Was rgba(32, 43, 19, 0.2).
+PASS colorTest.parseColor("hsla(90, 37.5%, 12.5%, 0.2)") is "rgba(31, 43, 19, 0.2)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 12.5%, 0.2)") is "rgba(19, 43, 19, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 12.5%, 0.2)") should be rgba(19, 43, 31, 0.2). Was rgba(19, 43, 32, 0.2).
+PASS colorTest.parseColor("hsla(150, 37.5%, 12.5%, 0.2)") is "rgba(19, 43, 31, 0.2)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 12.5%, 0.2)") is "rgba(19, 43, 43, 0.2)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 12.5%, 0.2)") is "rgba(19, 31, 43, 0.2)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 12.5%, 0.2)") is "rgba(19, 19, 43, 0.2)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 12.5%, 0.2)") is "rgba(31, 19, 43, 0.2)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 12.5%, 0.2)") is "rgba(43, 19, 43, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 12.5%, 0.2)") should be rgba(43, 19, 31, 0.2). Was rgba(43, 19, 32, 0.2).
+PASS colorTest.parseColor("hsla(330, 37.5%, 12.5%, 0.2)") is "rgba(43, 19, 31, 0.2)"
 PASS colorTest.parseColor("hsla(0, 50%, 12.5%, 0.2)") is "rgba(47, 15, 15, 0.2)"
 PASS colorTest.parseColor("hsla(30, 50%, 12.5%, 0.2)") is "rgba(47, 31, 15, 0.2)"
 PASS colorTest.parseColor("hsla(60, 50%, 12.5%, 0.2)") is "rgba(47, 47, 15, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 50%, 12.5%, 0.2)") should be rgba(31, 47, 15, 0.2). Was rgba(32, 47, 15, 0.2).
+PASS colorTest.parseColor("hsla(90, 50%, 12.5%, 0.2)") is "rgba(31, 47, 15, 0.2)"
 PASS colorTest.parseColor("hsla(120, 50%, 12.5%, 0.2)") is "rgba(15, 47, 15, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 50%, 12.5%, 0.2)") should be rgba(15, 47, 31, 0.2). Was rgba(15, 47, 32, 0.2).
+PASS colorTest.parseColor("hsla(150, 50%, 12.5%, 0.2)") is "rgba(15, 47, 31, 0.2)"
 PASS colorTest.parseColor("hsla(180, 50%, 12.5%, 0.2)") is "rgba(15, 47, 47, 0.2)"
 PASS colorTest.parseColor("hsla(210, 50%, 12.5%, 0.2)") is "rgba(15, 31, 47, 0.2)"
 PASS colorTest.parseColor("hsla(240, 50%, 12.5%, 0.2)") is "rgba(15, 15, 47, 0.2)"
 PASS colorTest.parseColor("hsla(270, 50%, 12.5%, 0.2)") is "rgba(31, 15, 47, 0.2)"
 PASS colorTest.parseColor("hsla(300, 50%, 12.5%, 0.2)") is "rgba(47, 15, 47, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 50%, 12.5%, 0.2)") should be rgba(47, 15, 31, 0.2). Was rgba(47, 15, 32, 0.2).
+PASS colorTest.parseColor("hsla(330, 50%, 12.5%, 0.2)") is "rgba(47, 15, 31, 0.2)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 12.5%, 0.2)") is "rgba(51, 11, 11, 0.2)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 12.5%, 0.2)") is "rgba(51, 31, 11, 0.2)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 12.5%, 0.2)") is "rgba(51, 51, 11, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 12.5%, 0.2)") should be rgba(31, 51, 11, 0.2). Was rgba(32, 51, 11, 0.2).
+PASS colorTest.parseColor("hsla(90, 62.5%, 12.5%, 0.2)") is "rgba(31, 51, 11, 0.2)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 12.5%, 0.2)") is "rgba(11, 51, 11, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 12.5%, 0.2)") should be rgba(11, 51, 31, 0.2). Was rgba(11, 51, 32, 0.2).
+PASS colorTest.parseColor("hsla(150, 62.5%, 12.5%, 0.2)") is "rgba(11, 51, 31, 0.2)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 12.5%, 0.2)") is "rgba(11, 51, 51, 0.2)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 12.5%, 0.2)") is "rgba(11, 31, 51, 0.2)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 12.5%, 0.2)") is "rgba(11, 11, 51, 0.2)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 12.5%, 0.2)") is "rgba(31, 11, 51, 0.2)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 12.5%, 0.2)") is "rgba(51, 11, 51, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 12.5%, 0.2)") should be rgba(51, 11, 31, 0.2). Was rgba(51, 11, 32, 0.2).
+PASS colorTest.parseColor("hsla(330, 62.5%, 12.5%, 0.2)") is "rgba(51, 11, 31, 0.2)"
 PASS colorTest.parseColor("hsla(0, 75%, 12.5%, 0.2)") is "rgba(55, 7, 7, 0.2)"
 PASS colorTest.parseColor("hsla(30, 75%, 12.5%, 0.2)") is "rgba(55, 31, 7, 0.2)"
 PASS colorTest.parseColor("hsla(60, 75%, 12.5%, 0.2)") is "rgba(55, 55, 7, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 75%, 12.5%, 0.2)") should be rgba(31, 55, 7, 0.2). Was rgba(32, 55, 7, 0.2).
+PASS colorTest.parseColor("hsla(90, 75%, 12.5%, 0.2)") is "rgba(31, 55, 7, 0.2)"
 PASS colorTest.parseColor("hsla(120, 75%, 12.5%, 0.2)") is "rgba(7, 55, 7, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 75%, 12.5%, 0.2)") should be rgba(7, 55, 31, 0.2). Was rgba(7, 55, 32, 0.2).
+PASS colorTest.parseColor("hsla(150, 75%, 12.5%, 0.2)") is "rgba(7, 55, 31, 0.2)"
 PASS colorTest.parseColor("hsla(180, 75%, 12.5%, 0.2)") is "rgba(7, 55, 55, 0.2)"
 PASS colorTest.parseColor("hsla(210, 75%, 12.5%, 0.2)") is "rgba(7, 31, 55, 0.2)"
 PASS colorTest.parseColor("hsla(240, 75%, 12.5%, 0.2)") is "rgba(7, 7, 55, 0.2)"
 PASS colorTest.parseColor("hsla(270, 75%, 12.5%, 0.2)") is "rgba(31, 7, 55, 0.2)"
 PASS colorTest.parseColor("hsla(300, 75%, 12.5%, 0.2)") is "rgba(55, 7, 55, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 75%, 12.5%, 0.2)") should be rgba(55, 7, 31, 0.2). Was rgba(55, 7, 32, 0.2).
+PASS colorTest.parseColor("hsla(330, 75%, 12.5%, 0.2)") is "rgba(55, 7, 31, 0.2)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 12.5%, 0.2)") is "rgba(59, 3, 3, 0.2)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 12.5%, 0.2)") is "rgba(59, 31, 3, 0.2)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 12.5%, 0.2)") is "rgba(59, 59, 3, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 12.5%, 0.2)") should be rgba(31, 59, 3, 0.2). Was rgba(32, 59, 3, 0.2).
+PASS colorTest.parseColor("hsla(90, 87.5%, 12.5%, 0.2)") is "rgba(31, 59, 3, 0.2)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 12.5%, 0.2)") is "rgba(3, 59, 3, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 12.5%, 0.2)") should be rgba(3, 59, 31, 0.2). Was rgba(3, 59, 32, 0.2).
+PASS colorTest.parseColor("hsla(150, 87.5%, 12.5%, 0.2)") is "rgba(3, 59, 31, 0.2)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 12.5%, 0.2)") is "rgba(3, 59, 59, 0.2)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 12.5%, 0.2)") is "rgba(3, 31, 59, 0.2)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 12.5%, 0.2)") is "rgba(3, 3, 59, 0.2)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 12.5%, 0.2)") is "rgba(31, 3, 59, 0.2)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 12.5%, 0.2)") is "rgba(59, 3, 59, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 12.5%, 0.2)") should be rgba(59, 3, 31, 0.2). Was rgba(59, 3, 32, 0.2).
+PASS colorTest.parseColor("hsla(330, 87.5%, 12.5%, 0.2)") is "rgba(59, 3, 31, 0.2)"
 PASS colorTest.parseColor("hsla(0, 100%, 12.5%, 0.2)") is "rgba(63, 0, 0, 0.2)"
 PASS colorTest.parseColor("hsla(30, 100%, 12.5%, 0.2)") is "rgba(63, 31, 0, 0.2)"
 PASS colorTest.parseColor("hsla(60, 100%, 12.5%, 0.2)") is "rgba(63, 63, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 100%, 12.5%, 0.2)") should be rgba(31, 63, 0, 0.2). Was rgba(32, 63, 0, 0.2).
+PASS colorTest.parseColor("hsla(90, 100%, 12.5%, 0.2)") is "rgba(31, 63, 0, 0.2)"
 PASS colorTest.parseColor("hsla(120, 100%, 12.5%, 0.2)") is "rgba(0, 63, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 100%, 12.5%, 0.2)") should be rgba(0, 63, 31, 0.2). Was rgba(0, 63, 32, 0.2).
+PASS colorTest.parseColor("hsla(150, 100%, 12.5%, 0.2)") is "rgba(0, 63, 31, 0.2)"
 PASS colorTest.parseColor("hsla(180, 100%, 12.5%, 0.2)") is "rgba(0, 63, 63, 0.2)"
 PASS colorTest.parseColor("hsla(210, 100%, 12.5%, 0.2)") is "rgba(0, 31, 63, 0.2)"
 PASS colorTest.parseColor("hsla(240, 100%, 12.5%, 0.2)") is "rgba(0, 0, 63, 0.2)"
 PASS colorTest.parseColor("hsla(270, 100%, 12.5%, 0.2)") is "rgba(31, 0, 63, 0.2)"
 PASS colorTest.parseColor("hsla(300, 100%, 12.5%, 0.2)") is "rgba(63, 0, 63, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 100%, 12.5%, 0.2)") should be rgba(63, 0, 31, 0.2). Was rgba(63, 0, 32, 0.2).
+PASS colorTest.parseColor("hsla(330, 100%, 12.5%, 0.2)") is "rgba(63, 0, 31, 0.2)"
 PASS colorTest.parseColor("hsla(0, 0%, 25%, 0.2)") is "rgba(63, 63, 63, 0.2)"
 PASS colorTest.parseColor("hsla(30, 0%, 25%, 0.2)") is "rgba(63, 63, 63, 0.2)"
 PASS colorTest.parseColor("hsla(60, 0%, 25%, 0.2)") is "rgba(63, 63, 63, 0.2)"
@@ -1231,75 +1231,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 25%, 0.2)") is "rgba(87, 39, 39, 0.2)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 25%, 0.2)") is "rgba(87, 63, 39, 0.2)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 25%, 0.2)") is "rgba(87, 87, 39, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 25%, 0.2)") should be rgba(63, 87, 39, 0.2). Was rgba(64, 87, 39, 0.2).
+PASS colorTest.parseColor("hsla(90, 37.5%, 25%, 0.2)") is "rgba(63, 87, 39, 0.2)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 25%, 0.2)") is "rgba(39, 87, 39, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 25%, 0.2)") should be rgba(39, 87, 63, 0.2). Was rgba(39, 87, 64, 0.2).
+PASS colorTest.parseColor("hsla(150, 37.5%, 25%, 0.2)") is "rgba(39, 87, 63, 0.2)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 25%, 0.2)") is "rgba(39, 87, 87, 0.2)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 25%, 0.2)") is "rgba(39, 63, 87, 0.2)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 25%, 0.2)") is "rgba(39, 39, 87, 0.2)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 25%, 0.2)") is "rgba(63, 39, 87, 0.2)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 25%, 0.2)") is "rgba(87, 39, 87, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 25%, 0.2)") should be rgba(87, 39, 63, 0.2). Was rgba(87, 39, 64, 0.2).
+PASS colorTest.parseColor("hsla(330, 37.5%, 25%, 0.2)") is "rgba(87, 39, 63, 0.2)"
 PASS colorTest.parseColor("hsla(0, 50%, 25%, 0.2)") is "rgba(95, 31, 31, 0.2)"
 PASS colorTest.parseColor("hsla(30, 50%, 25%, 0.2)") is "rgba(95, 63, 31, 0.2)"
 PASS colorTest.parseColor("hsla(60, 50%, 25%, 0.2)") is "rgba(95, 95, 31, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 50%, 25%, 0.2)") should be rgba(63, 95, 31, 0.2). Was rgba(64, 95, 31, 0.2).
+PASS colorTest.parseColor("hsla(90, 50%, 25%, 0.2)") is "rgba(63, 95, 31, 0.2)"
 PASS colorTest.parseColor("hsla(120, 50%, 25%, 0.2)") is "rgba(31, 95, 31, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 50%, 25%, 0.2)") should be rgba(31, 95, 63, 0.2). Was rgba(31, 95, 64, 0.2).
+PASS colorTest.parseColor("hsla(150, 50%, 25%, 0.2)") is "rgba(31, 95, 63, 0.2)"
 PASS colorTest.parseColor("hsla(180, 50%, 25%, 0.2)") is "rgba(31, 95, 95, 0.2)"
 PASS colorTest.parseColor("hsla(210, 50%, 25%, 0.2)") is "rgba(31, 63, 95, 0.2)"
 PASS colorTest.parseColor("hsla(240, 50%, 25%, 0.2)") is "rgba(31, 31, 95, 0.2)"
 PASS colorTest.parseColor("hsla(270, 50%, 25%, 0.2)") is "rgba(63, 31, 95, 0.2)"
 PASS colorTest.parseColor("hsla(300, 50%, 25%, 0.2)") is "rgba(95, 31, 95, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 50%, 25%, 0.2)") should be rgba(95, 31, 63, 0.2). Was rgba(95, 31, 64, 0.2).
+PASS colorTest.parseColor("hsla(330, 50%, 25%, 0.2)") is "rgba(95, 31, 63, 0.2)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 25%, 0.2)") is "rgba(103, 23, 23, 0.2)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 25%, 0.2)") is "rgba(103, 63, 23, 0.2)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 25%, 0.2)") is "rgba(103, 103, 23, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 25%, 0.2)") should be rgba(63, 103, 23, 0.2). Was rgba(64, 103, 23, 0.2).
+PASS colorTest.parseColor("hsla(90, 62.5%, 25%, 0.2)") is "rgba(63, 103, 23, 0.2)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 25%, 0.2)") is "rgba(23, 103, 23, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 25%, 0.2)") should be rgba(23, 103, 63, 0.2). Was rgba(23, 103, 64, 0.2).
+PASS colorTest.parseColor("hsla(150, 62.5%, 25%, 0.2)") is "rgba(23, 103, 63, 0.2)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 25%, 0.2)") is "rgba(23, 103, 103, 0.2)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 25%, 0.2)") is "rgba(23, 63, 103, 0.2)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 25%, 0.2)") is "rgba(23, 23, 103, 0.2)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 25%, 0.2)") is "rgba(63, 23, 103, 0.2)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 25%, 0.2)") is "rgba(103, 23, 103, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 25%, 0.2)") should be rgba(103, 23, 63, 0.2). Was rgba(103, 23, 64, 0.2).
+PASS colorTest.parseColor("hsla(330, 62.5%, 25%, 0.2)") is "rgba(103, 23, 63, 0.2)"
 PASS colorTest.parseColor("hsla(0, 75%, 25%, 0.2)") is "rgba(111, 15, 15, 0.2)"
 PASS colorTest.parseColor("hsla(30, 75%, 25%, 0.2)") is "rgba(111, 63, 15, 0.2)"
 PASS colorTest.parseColor("hsla(60, 75%, 25%, 0.2)") is "rgba(111, 111, 15, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 75%, 25%, 0.2)") should be rgba(63, 111, 15, 0.2). Was rgba(64, 111, 15, 0.2).
+PASS colorTest.parseColor("hsla(90, 75%, 25%, 0.2)") is "rgba(63, 111, 15, 0.2)"
 PASS colorTest.parseColor("hsla(120, 75%, 25%, 0.2)") is "rgba(15, 111, 15, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 75%, 25%, 0.2)") should be rgba(15, 111, 63, 0.2). Was rgba(15, 111, 64, 0.2).
+PASS colorTest.parseColor("hsla(150, 75%, 25%, 0.2)") is "rgba(15, 111, 63, 0.2)"
 PASS colorTest.parseColor("hsla(180, 75%, 25%, 0.2)") is "rgba(15, 111, 111, 0.2)"
 PASS colorTest.parseColor("hsla(210, 75%, 25%, 0.2)") is "rgba(15, 63, 111, 0.2)"
 PASS colorTest.parseColor("hsla(240, 75%, 25%, 0.2)") is "rgba(15, 15, 111, 0.2)"
 PASS colorTest.parseColor("hsla(270, 75%, 25%, 0.2)") is "rgba(63, 15, 111, 0.2)"
 PASS colorTest.parseColor("hsla(300, 75%, 25%, 0.2)") is "rgba(111, 15, 111, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 75%, 25%, 0.2)") should be rgba(111, 15, 63, 0.2). Was rgba(111, 15, 64, 0.2).
+PASS colorTest.parseColor("hsla(330, 75%, 25%, 0.2)") is "rgba(111, 15, 63, 0.2)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 25%, 0.2)") is "rgba(119, 7, 7, 0.2)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 25%, 0.2)") is "rgba(119, 63, 7, 0.2)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 25%, 0.2)") is "rgba(119, 119, 7, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 25%, 0.2)") should be rgba(63, 119, 7, 0.2). Was rgba(64, 119, 7, 0.2).
+PASS colorTest.parseColor("hsla(90, 87.5%, 25%, 0.2)") is "rgba(63, 119, 7, 0.2)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 25%, 0.2)") is "rgba(7, 119, 7, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 25%, 0.2)") should be rgba(7, 119, 63, 0.2). Was rgba(7, 119, 64, 0.2).
+PASS colorTest.parseColor("hsla(150, 87.5%, 25%, 0.2)") is "rgba(7, 119, 63, 0.2)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 25%, 0.2)") is "rgba(7, 119, 119, 0.2)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 25%, 0.2)") is "rgba(7, 63, 119, 0.2)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 25%, 0.2)") is "rgba(7, 7, 119, 0.2)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 25%, 0.2)") is "rgba(63, 7, 119, 0.2)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 25%, 0.2)") is "rgba(119, 7, 119, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 25%, 0.2)") should be rgba(119, 7, 63, 0.2). Was rgba(119, 7, 64, 0.2).
+PASS colorTest.parseColor("hsla(330, 87.5%, 25%, 0.2)") is "rgba(119, 7, 63, 0.2)"
 PASS colorTest.parseColor("hsla(0, 100%, 25%, 0.2)") is "rgba(127, 0, 0, 0.2)"
 PASS colorTest.parseColor("hsla(30, 100%, 25%, 0.2)") is "rgba(127, 63, 0, 0.2)"
 PASS colorTest.parseColor("hsla(60, 100%, 25%, 0.2)") is "rgba(127, 127, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 100%, 25%, 0.2)") should be rgba(63, 127, 0, 0.2). Was rgba(64, 127, 0, 0.2).
+PASS colorTest.parseColor("hsla(90, 100%, 25%, 0.2)") is "rgba(63, 127, 0, 0.2)"
 PASS colorTest.parseColor("hsla(120, 100%, 25%, 0.2)") is "rgba(0, 127, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 100%, 25%, 0.2)") should be rgba(0, 127, 63, 0.2). Was rgba(0, 127, 64, 0.2).
+PASS colorTest.parseColor("hsla(150, 100%, 25%, 0.2)") is "rgba(0, 127, 63, 0.2)"
 PASS colorTest.parseColor("hsla(180, 100%, 25%, 0.2)") is "rgba(0, 127, 127, 0.2)"
 PASS colorTest.parseColor("hsla(210, 100%, 25%, 0.2)") is "rgba(0, 63, 127, 0.2)"
 PASS colorTest.parseColor("hsla(240, 100%, 25%, 0.2)") is "rgba(0, 0, 127, 0.2)"
 PASS colorTest.parseColor("hsla(270, 100%, 25%, 0.2)") is "rgba(63, 0, 127, 0.2)"
 PASS colorTest.parseColor("hsla(300, 100%, 25%, 0.2)") is "rgba(127, 0, 127, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 100%, 25%, 0.2)") should be rgba(127, 0, 63, 0.2). Was rgba(127, 0, 64, 0.2).
+PASS colorTest.parseColor("hsla(330, 100%, 25%, 0.2)") is "rgba(127, 0, 63, 0.2)"
 PASS colorTest.parseColor("hsla(0, 0%, 37.5%, 0.2)") is "rgba(95, 95, 95, 0.2)"
 PASS colorTest.parseColor("hsla(30, 0%, 37.5%, 0.2)") is "rgba(95, 95, 95, 0.2)"
 PASS colorTest.parseColor("hsla(60, 0%, 37.5%, 0.2)") is "rgba(95, 95, 95, 0.2)"
@@ -1327,87 +1327,87 @@
 PASS colorTest.parseColor("hsla(0, 25%, 37.5%, 0.2)") is "rgba(119, 71, 71, 0.2)"
 PASS colorTest.parseColor("hsla(30, 25%, 37.5%, 0.2)") is "rgba(119, 95, 71, 0.2)"
 PASS colorTest.parseColor("hsla(60, 25%, 37.5%, 0.2)") is "rgba(119, 119, 71, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 25%, 37.5%, 0.2)") should be rgba(95, 119, 71, 0.2). Was rgba(96, 119, 71, 0.2).
+PASS colorTest.parseColor("hsla(90, 25%, 37.5%, 0.2)") is "rgba(95, 119, 71, 0.2)"
 PASS colorTest.parseColor("hsla(120, 25%, 37.5%, 0.2)") is "rgba(71, 119, 71, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 25%, 37.5%, 0.2)") should be rgba(71, 119, 95, 0.2). Was rgba(71, 119, 96, 0.2).
+PASS colorTest.parseColor("hsla(150, 25%, 37.5%, 0.2)") is "rgba(71, 119, 95, 0.2)"
 PASS colorTest.parseColor("hsla(180, 25%, 37.5%, 0.2)") is "rgba(71, 119, 119, 0.2)"
 PASS colorTest.parseColor("hsla(210, 25%, 37.5%, 0.2)") is "rgba(71, 95, 119, 0.2)"
 PASS colorTest.parseColor("hsla(240, 25%, 37.5%, 0.2)") is "rgba(71, 71, 119, 0.2)"
 PASS colorTest.parseColor("hsla(270, 25%, 37.5%, 0.2)") is "rgba(95, 71, 119, 0.2)"
 PASS colorTest.parseColor("hsla(300, 25%, 37.5%, 0.2)") is "rgba(119, 71, 119, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 25%, 37.5%, 0.2)") should be rgba(119, 71, 95, 0.2). Was rgba(119, 71, 96, 0.2).
+PASS colorTest.parseColor("hsla(330, 25%, 37.5%, 0.2)") is "rgba(119, 71, 95, 0.2)"
 PASS colorTest.parseColor("hsla(0, 37.5%, 37.5%, 0.2)") is "rgba(131, 59, 59, 0.2)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 37.5%, 0.2)") is "rgba(131, 95, 59, 0.2)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 37.5%, 0.2)") is "rgba(131, 131, 59, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 37.5%, 0.2)") should be rgba(95, 131, 59, 0.2). Was rgba(96, 131, 59, 0.2).
+PASS colorTest.parseColor("hsla(90, 37.5%, 37.5%, 0.2)") is "rgba(95, 131, 59, 0.2)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 37.5%, 0.2)") is "rgba(59, 131, 59, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 37.5%, 0.2)") should be rgba(59, 131, 95, 0.2). Was rgba(59, 131, 96, 0.2).
+PASS colorTest.parseColor("hsla(150, 37.5%, 37.5%, 0.2)") is "rgba(59, 131, 95, 0.2)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 37.5%, 0.2)") is "rgba(59, 131, 131, 0.2)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 37.5%, 0.2)") is "rgba(59, 95, 131, 0.2)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 37.5%, 0.2)") is "rgba(59, 59, 131, 0.2)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 37.5%, 0.2)") is "rgba(95, 59, 131, 0.2)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 37.5%, 0.2)") is "rgba(131, 59, 131, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 37.5%, 0.2)") should be rgba(131, 59, 95, 0.2). Was rgba(131, 59, 96, 0.2).
+PASS colorTest.parseColor("hsla(330, 37.5%, 37.5%, 0.2)") is "rgba(131, 59, 95, 0.2)"
 PASS colorTest.parseColor("hsla(0, 50%, 37.5%, 0.2)") is "rgba(143, 47, 47, 0.2)"
 PASS colorTest.parseColor("hsla(30, 50%, 37.5%, 0.2)") is "rgba(143, 95, 47, 0.2)"
 PASS colorTest.parseColor("hsla(60, 50%, 37.5%, 0.2)") is "rgba(143, 143, 47, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 50%, 37.5%, 0.2)") should be rgba(95, 143, 47, 0.2). Was rgba(96, 143, 47, 0.2).
+PASS colorTest.parseColor("hsla(90, 50%, 37.5%, 0.2)") is "rgba(95, 143, 47, 0.2)"
 PASS colorTest.parseColor("hsla(120, 50%, 37.5%, 0.2)") is "rgba(47, 143, 47, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 50%, 37.5%, 0.2)") should be rgba(47, 143, 95, 0.2). Was rgba(47, 143, 96, 0.2).
+PASS colorTest.parseColor("hsla(150, 50%, 37.5%, 0.2)") is "rgba(47, 143, 95, 0.2)"
 PASS colorTest.parseColor("hsla(180, 50%, 37.5%, 0.2)") is "rgba(47, 143, 143, 0.2)"
 PASS colorTest.parseColor("hsla(210, 50%, 37.5%, 0.2)") is "rgba(47, 95, 143, 0.2)"
 PASS colorTest.parseColor("hsla(240, 50%, 37.5%, 0.2)") is "rgba(47, 47, 143, 0.2)"
 PASS colorTest.parseColor("hsla(270, 50%, 37.5%, 0.2)") is "rgba(95, 47, 143, 0.2)"
 PASS colorTest.parseColor("hsla(300, 50%, 37.5%, 0.2)") is "rgba(143, 47, 143, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 50%, 37.5%, 0.2)") should be rgba(143, 47, 95, 0.2). Was rgba(143, 47, 96, 0.2).
+PASS colorTest.parseColor("hsla(330, 50%, 37.5%, 0.2)") is "rgba(143, 47, 95, 0.2)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 37.5%, 0.2)") is "rgba(155, 35, 35, 0.2)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 37.5%, 0.2)") is "rgba(155, 95, 35, 0.2)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 37.5%, 0.2)") is "rgba(155, 155, 35, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 37.5%, 0.2)") should be rgba(95, 155, 35, 0.2). Was rgba(96, 155, 35, 0.2).
+PASS colorTest.parseColor("hsla(90, 62.5%, 37.5%, 0.2)") is "rgba(95, 155, 35, 0.2)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 37.5%, 0.2)") is "rgba(35, 155, 35, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 37.5%, 0.2)") should be rgba(35, 155, 95, 0.2). Was rgba(35, 155, 96, 0.2).
+PASS colorTest.parseColor("hsla(150, 62.5%, 37.5%, 0.2)") is "rgba(35, 155, 95, 0.2)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 37.5%, 0.2)") is "rgba(35, 155, 155, 0.2)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 37.5%, 0.2)") is "rgba(35, 95, 155, 0.2)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 37.5%, 0.2)") is "rgba(35, 35, 155, 0.2)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 37.5%, 0.2)") is "rgba(95, 35, 155, 0.2)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 37.5%, 0.2)") is "rgba(155, 35, 155, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 37.5%, 0.2)") should be rgba(155, 35, 95, 0.2). Was rgba(155, 35, 96, 0.2).
+PASS colorTest.parseColor("hsla(330, 62.5%, 37.5%, 0.2)") is "rgba(155, 35, 95, 0.2)"
 PASS colorTest.parseColor("hsla(0, 75%, 37.5%, 0.2)") is "rgba(167, 23, 23, 0.2)"
 PASS colorTest.parseColor("hsla(30, 75%, 37.5%, 0.2)") is "rgba(167, 95, 23, 0.2)"
 PASS colorTest.parseColor("hsla(60, 75%, 37.5%, 0.2)") is "rgba(167, 167, 23, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 75%, 37.5%, 0.2)") should be rgba(95, 167, 23, 0.2). Was rgba(96, 167, 23, 0.2).
+PASS colorTest.parseColor("hsla(90, 75%, 37.5%, 0.2)") is "rgba(95, 167, 23, 0.2)"
 PASS colorTest.parseColor("hsla(120, 75%, 37.5%, 0.2)") is "rgba(23, 167, 23, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 75%, 37.5%, 0.2)") should be rgba(23, 167, 95, 0.2). Was rgba(23, 167, 96, 0.2).
+PASS colorTest.parseColor("hsla(150, 75%, 37.5%, 0.2)") is "rgba(23, 167, 95, 0.2)"
 PASS colorTest.parseColor("hsla(180, 75%, 37.5%, 0.2)") is "rgba(23, 167, 167, 0.2)"
 PASS colorTest.parseColor("hsla(210, 75%, 37.5%, 0.2)") is "rgba(23, 95, 167, 0.2)"
 PASS colorTest.parseColor("hsla(240, 75%, 37.5%, 0.2)") is "rgba(23, 23, 167, 0.2)"
 PASS colorTest.parseColor("hsla(270, 75%, 37.5%, 0.2)") is "rgba(95, 23, 167, 0.2)"
 PASS colorTest.parseColor("hsla(300, 75%, 37.5%, 0.2)") is "rgba(167, 23, 167, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 75%, 37.5%, 0.2)") should be rgba(167, 23, 95, 0.2). Was rgba(167, 23, 96, 0.2).
+PASS colorTest.parseColor("hsla(330, 75%, 37.5%, 0.2)") is "rgba(167, 23, 95, 0.2)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 37.5%, 0.2)") is "rgba(179, 11, 11, 0.2)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 37.5%, 0.2)") is "rgba(179, 95, 11, 0.2)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 37.5%, 0.2)") is "rgba(179, 179, 11, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 37.5%, 0.2)") should be rgba(95, 179, 11, 0.2). Was rgba(96, 179, 11, 0.2).
+PASS colorTest.parseColor("hsla(90, 87.5%, 37.5%, 0.2)") is "rgba(95, 179, 11, 0.2)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 37.5%, 0.2)") is "rgba(11, 179, 11, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 37.5%, 0.2)") should be rgba(11, 179, 95, 0.2). Was rgba(11, 179, 96, 0.2).
+PASS colorTest.parseColor("hsla(150, 87.5%, 37.5%, 0.2)") is "rgba(11, 179, 95, 0.2)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 37.5%, 0.2)") is "rgba(11, 179, 179, 0.2)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 37.5%, 0.2)") is "rgba(11, 95, 179, 0.2)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 37.5%, 0.2)") is "rgba(11, 11, 179, 0.2)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 37.5%, 0.2)") is "rgba(95, 11, 179, 0.2)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 37.5%, 0.2)") is "rgba(179, 11, 179, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 37.5%, 0.2)") should be rgba(179, 11, 95, 0.2). Was rgba(179, 11, 96, 0.2).
+PASS colorTest.parseColor("hsla(330, 87.5%, 37.5%, 0.2)") is "rgba(179, 11, 95, 0.2)"
 PASS colorTest.parseColor("hsla(0, 100%, 37.5%, 0.2)") is "rgba(191, 0, 0, 0.2)"
 PASS colorTest.parseColor("hsla(30, 100%, 37.5%, 0.2)") is "rgba(191, 95, 0, 0.2)"
 PASS colorTest.parseColor("hsla(60, 100%, 37.5%, 0.2)") is "rgba(191, 191, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 100%, 37.5%, 0.2)") should be rgba(95, 191, 0, 0.2). Was rgba(96, 191, 0, 0.2).
+PASS colorTest.parseColor("hsla(90, 100%, 37.5%, 0.2)") is "rgba(95, 191, 0, 0.2)"
 PASS colorTest.parseColor("hsla(120, 100%, 37.5%, 0.2)") is "rgba(0, 191, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 100%, 37.5%, 0.2)") should be rgba(0, 191, 95, 0.2). Was rgba(0, 191, 96, 0.2).
+PASS colorTest.parseColor("hsla(150, 100%, 37.5%, 0.2)") is "rgba(0, 191, 95, 0.2)"
 PASS colorTest.parseColor("hsla(180, 100%, 37.5%, 0.2)") is "rgba(0, 191, 191, 0.2)"
 PASS colorTest.parseColor("hsla(210, 100%, 37.5%, 0.2)") is "rgba(0, 95, 191, 0.2)"
 PASS colorTest.parseColor("hsla(240, 100%, 37.5%, 0.2)") is "rgba(0, 0, 191, 0.2)"
 PASS colorTest.parseColor("hsla(270, 100%, 37.5%, 0.2)") is "rgba(95, 0, 191, 0.2)"
 PASS colorTest.parseColor("hsla(300, 100%, 37.5%, 0.2)") is "rgba(191, 0, 191, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 100%, 37.5%, 0.2)") should be rgba(191, 0, 95, 0.2). Was rgba(191, 0, 96, 0.2).
+PASS colorTest.parseColor("hsla(330, 100%, 37.5%, 0.2)") is "rgba(191, 0, 95, 0.2)"
 PASS colorTest.parseColor("hsla(0, 0%, 50%, 0.2)") is "rgba(127, 127, 127, 0.2)"
 PASS colorTest.parseColor("hsla(30, 0%, 50%, 0.2)") is "rgba(127, 127, 127, 0.2)"
 PASS colorTest.parseColor("hsla(60, 0%, 50%, 0.2)") is "rgba(127, 127, 127, 0.2)"
@@ -1447,15 +1447,15 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 50%, 0.2)") is "rgba(175, 79, 79, 0.2)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 50%, 0.2)") is "rgba(175, 127, 79, 0.2)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 50%, 0.2)") is "rgba(175, 175, 79, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 50%, 0.2)") should be rgba(127, 175, 79, 0.2). Was rgba(128, 175, 79, 0.2).
+PASS colorTest.parseColor("hsla(90, 37.5%, 50%, 0.2)") is "rgba(127, 175, 79, 0.2)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 50%, 0.2)") is "rgba(79, 175, 79, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 50%, 0.2)") should be rgba(79, 175, 127, 0.2). Was rgba(79, 175, 128, 0.2).
+PASS colorTest.parseColor("hsla(150, 37.5%, 50%, 0.2)") is "rgba(79, 175, 127, 0.2)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 50%, 0.2)") is "rgba(79, 175, 175, 0.2)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 50%, 0.2)") is "rgba(79, 127, 175, 0.2)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 50%, 0.2)") is "rgba(79, 79, 175, 0.2)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 50%, 0.2)") is "rgba(127, 79, 175, 0.2)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 50%, 0.2)") is "rgba(175, 79, 175, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 50%, 0.2)") should be rgba(175, 79, 127, 0.2). Was rgba(175, 79, 128, 0.2).
+PASS colorTest.parseColor("hsla(330, 37.5%, 50%, 0.2)") is "rgba(175, 79, 127, 0.2)"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/css-parser/color3_hsla_2-expected.txt b/third_party/WebKit/LayoutTests/css-parser/color3_hsla_2-expected.txt
index 713d882..8b33550f 100644
--- a/third_party/WebKit/LayoutTests/css-parser/color3_hsla_2-expected.txt
+++ b/third_party/WebKit/LayoutTests/css-parser/color3_hsla_2-expected.txt
@@ -7,63 +7,63 @@
 PASS colorTest.parseColor("hsla(0, 50%, 50%, 0.2)") is "rgba(191, 63, 63, 0.2)"
 PASS colorTest.parseColor("hsla(30, 50%, 50%, 0.2)") is "rgba(191, 127, 63, 0.2)"
 PASS colorTest.parseColor("hsla(60, 50%, 50%, 0.2)") is "rgba(191, 191, 63, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 50%, 50%, 0.2)") should be rgba(127, 191, 63, 0.2). Was rgba(128, 191, 63, 0.2).
+PASS colorTest.parseColor("hsla(90, 50%, 50%, 0.2)") is "rgba(127, 191, 63, 0.2)"
 PASS colorTest.parseColor("hsla(120, 50%, 50%, 0.2)") is "rgba(63, 191, 63, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 50%, 50%, 0.2)") should be rgba(63, 191, 127, 0.2). Was rgba(63, 191, 128, 0.2).
+PASS colorTest.parseColor("hsla(150, 50%, 50%, 0.2)") is "rgba(63, 191, 127, 0.2)"
 PASS colorTest.parseColor("hsla(180, 50%, 50%, 0.2)") is "rgba(63, 191, 191, 0.2)"
 PASS colorTest.parseColor("hsla(210, 50%, 50%, 0.2)") is "rgba(63, 127, 191, 0.2)"
 PASS colorTest.parseColor("hsla(240, 50%, 50%, 0.2)") is "rgba(63, 63, 191, 0.2)"
 PASS colorTest.parseColor("hsla(270, 50%, 50%, 0.2)") is "rgba(127, 63, 191, 0.2)"
 PASS colorTest.parseColor("hsla(300, 50%, 50%, 0.2)") is "rgba(191, 63, 191, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 50%, 50%, 0.2)") should be rgba(191, 63, 127, 0.2). Was rgba(191, 63, 128, 0.2).
+PASS colorTest.parseColor("hsla(330, 50%, 50%, 0.2)") is "rgba(191, 63, 127, 0.2)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 50%, 0.2)") is "rgba(207, 47, 47, 0.2)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 50%, 0.2)") is "rgba(207, 127, 47, 0.2)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 50%, 0.2)") is "rgba(207, 207, 47, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 50%, 0.2)") should be rgba(127, 207, 47, 0.2). Was rgba(128, 207, 47, 0.2).
+PASS colorTest.parseColor("hsla(90, 62.5%, 50%, 0.2)") is "rgba(127, 207, 47, 0.2)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 50%, 0.2)") is "rgba(47, 207, 47, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 50%, 0.2)") should be rgba(47, 207, 127, 0.2). Was rgba(47, 207, 128, 0.2).
+PASS colorTest.parseColor("hsla(150, 62.5%, 50%, 0.2)") is "rgba(47, 207, 127, 0.2)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 50%, 0.2)") is "rgba(47, 207, 207, 0.2)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 50%, 0.2)") is "rgba(47, 127, 207, 0.2)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 50%, 0.2)") is "rgba(47, 47, 207, 0.2)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 50%, 0.2)") is "rgba(127, 47, 207, 0.2)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 50%, 0.2)") is "rgba(207, 47, 207, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 50%, 0.2)") should be rgba(207, 47, 127, 0.2). Was rgba(207, 47, 128, 0.2).
+PASS colorTest.parseColor("hsla(330, 62.5%, 50%, 0.2)") is "rgba(207, 47, 127, 0.2)"
 PASS colorTest.parseColor("hsla(0, 75%, 50%, 0.2)") is "rgba(223, 31, 31, 0.2)"
 PASS colorTest.parseColor("hsla(30, 75%, 50%, 0.2)") is "rgba(223, 127, 31, 0.2)"
 PASS colorTest.parseColor("hsla(60, 75%, 50%, 0.2)") is "rgba(223, 223, 31, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 75%, 50%, 0.2)") should be rgba(127, 223, 31, 0.2). Was rgba(128, 223, 31, 0.2).
+PASS colorTest.parseColor("hsla(90, 75%, 50%, 0.2)") is "rgba(127, 223, 31, 0.2)"
 PASS colorTest.parseColor("hsla(120, 75%, 50%, 0.2)") is "rgba(31, 223, 31, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 75%, 50%, 0.2)") should be rgba(31, 223, 127, 0.2). Was rgba(31, 223, 128, 0.2).
+PASS colorTest.parseColor("hsla(150, 75%, 50%, 0.2)") is "rgba(31, 223, 127, 0.2)"
 PASS colorTest.parseColor("hsla(180, 75%, 50%, 0.2)") is "rgba(31, 223, 223, 0.2)"
 PASS colorTest.parseColor("hsla(210, 75%, 50%, 0.2)") is "rgba(31, 127, 223, 0.2)"
 PASS colorTest.parseColor("hsla(240, 75%, 50%, 0.2)") is "rgba(31, 31, 223, 0.2)"
 PASS colorTest.parseColor("hsla(270, 75%, 50%, 0.2)") is "rgba(127, 31, 223, 0.2)"
 PASS colorTest.parseColor("hsla(300, 75%, 50%, 0.2)") is "rgba(223, 31, 223, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 75%, 50%, 0.2)") should be rgba(223, 31, 127, 0.2). Was rgba(223, 31, 128, 0.2).
+PASS colorTest.parseColor("hsla(330, 75%, 50%, 0.2)") is "rgba(223, 31, 127, 0.2)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 50%, 0.2)") is "rgba(239, 15, 15, 0.2)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 50%, 0.2)") is "rgba(239, 127, 15, 0.2)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 50%, 0.2)") is "rgba(239, 239, 15, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 50%, 0.2)") should be rgba(127, 239, 15, 0.2). Was rgba(128, 239, 15, 0.2).
+PASS colorTest.parseColor("hsla(90, 87.5%, 50%, 0.2)") is "rgba(127, 239, 15, 0.2)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 50%, 0.2)") is "rgba(15, 239, 15, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 50%, 0.2)") should be rgba(15, 239, 127, 0.2). Was rgba(15, 239, 128, 0.2).
+PASS colorTest.parseColor("hsla(150, 87.5%, 50%, 0.2)") is "rgba(15, 239, 127, 0.2)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 50%, 0.2)") is "rgba(15, 239, 239, 0.2)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 50%, 0.2)") is "rgba(15, 127, 239, 0.2)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 50%, 0.2)") is "rgba(15, 15, 239, 0.2)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 50%, 0.2)") is "rgba(127, 15, 239, 0.2)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 50%, 0.2)") is "rgba(239, 15, 239, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 50%, 0.2)") should be rgba(239, 15, 127, 0.2). Was rgba(239, 15, 128, 0.2).
+PASS colorTest.parseColor("hsla(330, 87.5%, 50%, 0.2)") is "rgba(239, 15, 127, 0.2)"
 PASS colorTest.parseColor("hsla(0, 100%, 50%, 0.2)") is "rgba(255, 0, 0, 0.2)"
 PASS colorTest.parseColor("hsla(30, 100%, 50%, 0.2)") is "rgba(255, 127, 0, 0.2)"
 PASS colorTest.parseColor("hsla(60, 100%, 50%, 0.2)") is "rgba(255, 255, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 100%, 50%, 0.2)") should be rgba(127, 255, 0, 0.2). Was rgba(128, 255, 0, 0.2).
+PASS colorTest.parseColor("hsla(90, 100%, 50%, 0.2)") is "rgba(127, 255, 0, 0.2)"
 PASS colorTest.parseColor("hsla(120, 100%, 50%, 0.2)") is "rgba(0, 255, 0, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 100%, 50%, 0.2)") should be rgba(0, 255, 127, 0.2). Was rgba(0, 255, 128, 0.2).
+PASS colorTest.parseColor("hsla(150, 100%, 50%, 0.2)") is "rgba(0, 255, 127, 0.2)"
 PASS colorTest.parseColor("hsla(180, 100%, 50%, 0.2)") is "rgba(0, 255, 255, 0.2)"
 PASS colorTest.parseColor("hsla(210, 100%, 50%, 0.2)") is "rgba(0, 127, 255, 0.2)"
 PASS colorTest.parseColor("hsla(240, 100%, 50%, 0.2)") is "rgba(0, 0, 255, 0.2)"
 PASS colorTest.parseColor("hsla(270, 100%, 50%, 0.2)") is "rgba(127, 0, 255, 0.2)"
 PASS colorTest.parseColor("hsla(300, 100%, 50%, 0.2)") is "rgba(255, 0, 255, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 100%, 50%, 0.2)") should be rgba(255, 0, 127, 0.2). Was rgba(255, 0, 128, 0.2).
+PASS colorTest.parseColor("hsla(330, 100%, 50%, 0.2)") is "rgba(255, 0, 127, 0.2)"
 PASS colorTest.parseColor("hsla(0, 0%, 62.5%, 0.2)") is "rgba(159, 159, 159, 0.2)"
 PASS colorTest.parseColor("hsla(30, 0%, 62.5%, 0.2)") is "rgba(159, 159, 159, 0.2)"
 PASS colorTest.parseColor("hsla(60, 0%, 62.5%, 0.2)") is "rgba(159, 159, 159, 0.2)"
@@ -115,63 +115,63 @@
 PASS colorTest.parseColor("hsla(0, 50%, 62.5%, 0.2)") is "rgba(207, 111, 111, 0.2)"
 PASS colorTest.parseColor("hsla(30, 50%, 62.5%, 0.2)") is "rgba(207, 159, 111, 0.2)"
 PASS colorTest.parseColor("hsla(60, 50%, 62.5%, 0.2)") is "rgba(207, 207, 111, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 50%, 62.5%, 0.2)") should be rgba(159, 207, 111, 0.2). Was rgba(160, 207, 111, 0.2).
+PASS colorTest.parseColor("hsla(90, 50%, 62.5%, 0.2)") is "rgba(159, 207, 111, 0.2)"
 PASS colorTest.parseColor("hsla(120, 50%, 62.5%, 0.2)") is "rgba(111, 207, 111, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 50%, 62.5%, 0.2)") should be rgba(111, 207, 159, 0.2). Was rgba(111, 207, 160, 0.2).
+PASS colorTest.parseColor("hsla(150, 50%, 62.5%, 0.2)") is "rgba(111, 207, 159, 0.2)"
 PASS colorTest.parseColor("hsla(180, 50%, 62.5%, 0.2)") is "rgba(111, 207, 207, 0.2)"
 PASS colorTest.parseColor("hsla(210, 50%, 62.5%, 0.2)") is "rgba(111, 159, 207, 0.2)"
 PASS colorTest.parseColor("hsla(240, 50%, 62.5%, 0.2)") is "rgba(111, 111, 207, 0.2)"
 PASS colorTest.parseColor("hsla(270, 50%, 62.5%, 0.2)") is "rgba(159, 111, 207, 0.2)"
 PASS colorTest.parseColor("hsla(300, 50%, 62.5%, 0.2)") is "rgba(207, 111, 207, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 50%, 62.5%, 0.2)") should be rgba(207, 111, 159, 0.2). Was rgba(207, 111, 160, 0.2).
+PASS colorTest.parseColor("hsla(330, 50%, 62.5%, 0.2)") is "rgba(207, 111, 159, 0.2)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 62.5%, 0.2)") is "rgba(219, 99, 99, 0.2)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 62.5%, 0.2)") is "rgba(219, 159, 99, 0.2)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 62.5%, 0.2)") is "rgba(219, 219, 99, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 62.5%, 0.2)") should be rgba(159, 219, 99, 0.2). Was rgba(160, 219, 99, 0.2).
+PASS colorTest.parseColor("hsla(90, 62.5%, 62.5%, 0.2)") is "rgba(159, 219, 99, 0.2)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 62.5%, 0.2)") is "rgba(99, 219, 99, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 62.5%, 0.2)") should be rgba(99, 219, 159, 0.2). Was rgba(99, 219, 160, 0.2).
+PASS colorTest.parseColor("hsla(150, 62.5%, 62.5%, 0.2)") is "rgba(99, 219, 159, 0.2)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 62.5%, 0.2)") is "rgba(99, 219, 219, 0.2)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 62.5%, 0.2)") is "rgba(99, 159, 219, 0.2)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 62.5%, 0.2)") is "rgba(99, 99, 219, 0.2)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 62.5%, 0.2)") is "rgba(159, 99, 219, 0.2)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 62.5%, 0.2)") is "rgba(219, 99, 219, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 62.5%, 0.2)") should be rgba(219, 99, 159, 0.2). Was rgba(219, 99, 160, 0.2).
+PASS colorTest.parseColor("hsla(330, 62.5%, 62.5%, 0.2)") is "rgba(219, 99, 159, 0.2)"
 PASS colorTest.parseColor("hsla(0, 75%, 62.5%, 0.2)") is "rgba(231, 87, 87, 0.2)"
 PASS colorTest.parseColor("hsla(30, 75%, 62.5%, 0.2)") is "rgba(231, 159, 87, 0.2)"
 PASS colorTest.parseColor("hsla(60, 75%, 62.5%, 0.2)") is "rgba(231, 231, 87, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 75%, 62.5%, 0.2)") should be rgba(159, 231, 87, 0.2). Was rgba(160, 231, 87, 0.2).
+PASS colorTest.parseColor("hsla(90, 75%, 62.5%, 0.2)") is "rgba(159, 231, 87, 0.2)"
 PASS colorTest.parseColor("hsla(120, 75%, 62.5%, 0.2)") is "rgba(87, 231, 87, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 75%, 62.5%, 0.2)") should be rgba(87, 231, 159, 0.2). Was rgba(87, 231, 160, 0.2).
+PASS colorTest.parseColor("hsla(150, 75%, 62.5%, 0.2)") is "rgba(87, 231, 159, 0.2)"
 PASS colorTest.parseColor("hsla(180, 75%, 62.5%, 0.2)") is "rgba(87, 231, 231, 0.2)"
 PASS colorTest.parseColor("hsla(210, 75%, 62.5%, 0.2)") is "rgba(87, 159, 231, 0.2)"
 PASS colorTest.parseColor("hsla(240, 75%, 62.5%, 0.2)") is "rgba(87, 87, 231, 0.2)"
 PASS colorTest.parseColor("hsla(270, 75%, 62.5%, 0.2)") is "rgba(159, 87, 231, 0.2)"
 PASS colorTest.parseColor("hsla(300, 75%, 62.5%, 0.2)") is "rgba(231, 87, 231, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 75%, 62.5%, 0.2)") should be rgba(231, 87, 159, 0.2). Was rgba(231, 87, 160, 0.2).
+PASS colorTest.parseColor("hsla(330, 75%, 62.5%, 0.2)") is "rgba(231, 87, 159, 0.2)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 62.5%, 0.2)") is "rgba(243, 75, 75, 0.2)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 62.5%, 0.2)") is "rgba(243, 159, 75, 0.2)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 62.5%, 0.2)") is "rgba(243, 243, 75, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 62.5%, 0.2)") should be rgba(159, 243, 75, 0.2). Was rgba(160, 243, 75, 0.2).
+PASS colorTest.parseColor("hsla(90, 87.5%, 62.5%, 0.2)") is "rgba(159, 243, 75, 0.2)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 62.5%, 0.2)") is "rgba(75, 243, 75, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 62.5%, 0.2)") should be rgba(75, 243, 159, 0.2). Was rgba(75, 243, 160, 0.2).
+PASS colorTest.parseColor("hsla(150, 87.5%, 62.5%, 0.2)") is "rgba(75, 243, 159, 0.2)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 62.5%, 0.2)") is "rgba(75, 243, 243, 0.2)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 62.5%, 0.2)") is "rgba(75, 159, 243, 0.2)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 62.5%, 0.2)") is "rgba(75, 75, 243, 0.2)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 62.5%, 0.2)") is "rgba(159, 75, 243, 0.2)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 62.5%, 0.2)") is "rgba(243, 75, 243, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 62.5%, 0.2)") should be rgba(243, 75, 159, 0.2). Was rgba(243, 75, 160, 0.2).
+PASS colorTest.parseColor("hsla(330, 87.5%, 62.5%, 0.2)") is "rgba(243, 75, 159, 0.2)"
 PASS colorTest.parseColor("hsla(0, 100%, 62.5%, 0.2)") is "rgba(255, 63, 63, 0.2)"
 PASS colorTest.parseColor("hsla(30, 100%, 62.5%, 0.2)") is "rgba(255, 159, 63, 0.2)"
 PASS colorTest.parseColor("hsla(60, 100%, 62.5%, 0.2)") is "rgba(255, 255, 63, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 100%, 62.5%, 0.2)") should be rgba(159, 255, 63, 0.2). Was rgba(160, 255, 63, 0.2).
+PASS colorTest.parseColor("hsla(90, 100%, 62.5%, 0.2)") is "rgba(159, 255, 63, 0.2)"
 PASS colorTest.parseColor("hsla(120, 100%, 62.5%, 0.2)") is "rgba(63, 255, 63, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 100%, 62.5%, 0.2)") should be rgba(63, 255, 159, 0.2). Was rgba(63, 255, 160, 0.2).
+PASS colorTest.parseColor("hsla(150, 100%, 62.5%, 0.2)") is "rgba(63, 255, 159, 0.2)"
 PASS colorTest.parseColor("hsla(180, 100%, 62.5%, 0.2)") is "rgba(63, 255, 255, 0.2)"
 PASS colorTest.parseColor("hsla(210, 100%, 62.5%, 0.2)") is "rgba(63, 159, 255, 0.2)"
 PASS colorTest.parseColor("hsla(240, 100%, 62.5%, 0.2)") is "rgba(63, 63, 255, 0.2)"
 PASS colorTest.parseColor("hsla(270, 100%, 62.5%, 0.2)") is "rgba(159, 63, 255, 0.2)"
 PASS colorTest.parseColor("hsla(300, 100%, 62.5%, 0.2)") is "rgba(255, 63, 255, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 100%, 62.5%, 0.2)") should be rgba(255, 63, 159, 0.2). Was rgba(255, 63, 160, 0.2).
+PASS colorTest.parseColor("hsla(330, 100%, 62.5%, 0.2)") is "rgba(255, 63, 159, 0.2)"
 PASS colorTest.parseColor("hsla(0, 0%, 75%, 0.2)") is "rgba(191, 191, 191, 0.2)"
 PASS colorTest.parseColor("hsla(30, 0%, 75%, 0.2)") is "rgba(191, 191, 191, 0.2)"
 PASS colorTest.parseColor("hsla(60, 0%, 75%, 0.2)") is "rgba(191, 191, 191, 0.2)"
@@ -247,39 +247,39 @@
 PASS colorTest.parseColor("hsla(0, 75%, 75%, 0.2)") is "rgba(239, 143, 143, 0.2)"
 PASS colorTest.parseColor("hsla(30, 75%, 75%, 0.2)") is "rgba(239, 191, 143, 0.2)"
 PASS colorTest.parseColor("hsla(60, 75%, 75%, 0.2)") is "rgba(239, 239, 143, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 75%, 75%, 0.2)") should be rgba(191, 239, 143, 0.2). Was rgba(192, 239, 143, 0.2).
+PASS colorTest.parseColor("hsla(90, 75%, 75%, 0.2)") is "rgba(191, 239, 143, 0.2)"
 PASS colorTest.parseColor("hsla(120, 75%, 75%, 0.2)") is "rgba(143, 239, 143, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 75%, 75%, 0.2)") should be rgba(143, 239, 191, 0.2). Was rgba(143, 239, 192, 0.2).
+PASS colorTest.parseColor("hsla(150, 75%, 75%, 0.2)") is "rgba(143, 239, 191, 0.2)"
 PASS colorTest.parseColor("hsla(180, 75%, 75%, 0.2)") is "rgba(143, 239, 239, 0.2)"
 PASS colorTest.parseColor("hsla(210, 75%, 75%, 0.2)") is "rgba(143, 191, 239, 0.2)"
 PASS colorTest.parseColor("hsla(240, 75%, 75%, 0.2)") is "rgba(143, 143, 239, 0.2)"
 PASS colorTest.parseColor("hsla(270, 75%, 75%, 0.2)") is "rgba(191, 143, 239, 0.2)"
 PASS colorTest.parseColor("hsla(300, 75%, 75%, 0.2)") is "rgba(239, 143, 239, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 75%, 75%, 0.2)") should be rgba(239, 143, 191, 0.2). Was rgba(239, 143, 192, 0.2).
+PASS colorTest.parseColor("hsla(330, 75%, 75%, 0.2)") is "rgba(239, 143, 191, 0.2)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 75%, 0.2)") is "rgba(247, 135, 135, 0.2)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 75%, 0.2)") is "rgba(247, 191, 135, 0.2)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 75%, 0.2)") is "rgba(247, 247, 135, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 75%, 0.2)") should be rgba(191, 247, 135, 0.2). Was rgba(192, 247, 135, 0.2).
+PASS colorTest.parseColor("hsla(90, 87.5%, 75%, 0.2)") is "rgba(191, 247, 135, 0.2)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 75%, 0.2)") is "rgba(135, 247, 135, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 75%, 0.2)") should be rgba(135, 247, 191, 0.2). Was rgba(135, 247, 192, 0.2).
+PASS colorTest.parseColor("hsla(150, 87.5%, 75%, 0.2)") is "rgba(135, 247, 191, 0.2)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 75%, 0.2)") is "rgba(135, 247, 247, 0.2)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 75%, 0.2)") is "rgba(135, 191, 247, 0.2)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 75%, 0.2)") is "rgba(135, 135, 247, 0.2)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 75%, 0.2)") is "rgba(191, 135, 247, 0.2)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 75%, 0.2)") is "rgba(247, 135, 247, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 75%, 0.2)") should be rgba(247, 135, 191, 0.2). Was rgba(247, 135, 192, 0.2).
+PASS colorTest.parseColor("hsla(330, 87.5%, 75%, 0.2)") is "rgba(247, 135, 191, 0.2)"
 PASS colorTest.parseColor("hsla(0, 100%, 75%, 0.2)") is "rgba(255, 127, 127, 0.2)"
 PASS colorTest.parseColor("hsla(30, 100%, 75%, 0.2)") is "rgba(255, 191, 127, 0.2)"
 PASS colorTest.parseColor("hsla(60, 100%, 75%, 0.2)") is "rgba(255, 255, 127, 0.2)"
-FAIL colorTest.parseColor("hsla(90, 100%, 75%, 0.2)") should be rgba(191, 255, 127, 0.2). Was rgba(192, 255, 127, 0.2).
+PASS colorTest.parseColor("hsla(90, 100%, 75%, 0.2)") is "rgba(191, 255, 127, 0.2)"
 PASS colorTest.parseColor("hsla(120, 100%, 75%, 0.2)") is "rgba(127, 255, 127, 0.2)"
-FAIL colorTest.parseColor("hsla(150, 100%, 75%, 0.2)") should be rgba(127, 255, 191, 0.2). Was rgba(127, 255, 192, 0.2).
+PASS colorTest.parseColor("hsla(150, 100%, 75%, 0.2)") is "rgba(127, 255, 191, 0.2)"
 PASS colorTest.parseColor("hsla(180, 100%, 75%, 0.2)") is "rgba(127, 255, 255, 0.2)"
 PASS colorTest.parseColor("hsla(210, 100%, 75%, 0.2)") is "rgba(127, 191, 255, 0.2)"
 PASS colorTest.parseColor("hsla(240, 100%, 75%, 0.2)") is "rgba(127, 127, 255, 0.2)"
 PASS colorTest.parseColor("hsla(270, 100%, 75%, 0.2)") is "rgba(191, 127, 255, 0.2)"
 PASS colorTest.parseColor("hsla(300, 100%, 75%, 0.2)") is "rgba(255, 127, 255, 0.2)"
-FAIL colorTest.parseColor("hsla(330, 100%, 75%, 0.2)") should be rgba(255, 127, 191, 0.2). Was rgba(255, 127, 192, 0.2).
+PASS colorTest.parseColor("hsla(330, 100%, 75%, 0.2)") is "rgba(255, 127, 191, 0.2)"
 PASS colorTest.parseColor("hsla(0, 0%, 87.5%, 0.2)") is "rgba(223, 223, 223, 0.2)"
 PASS colorTest.parseColor("hsla(30, 0%, 87.5%, 0.2)") is "rgba(223, 223, 223, 0.2)"
 PASS colorTest.parseColor("hsla(60, 0%, 87.5%, 0.2)") is "rgba(223, 223, 223, 0.2)"
@@ -643,75 +643,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 12.5%, 0)") is "rgba(43, 19, 19, 0)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 12.5%, 0)") is "rgba(43, 31, 19, 0)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 12.5%, 0)") is "rgba(43, 43, 19, 0)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 12.5%, 0)") should be rgba(31, 43, 19, 0). Was rgba(32, 43, 19, 0).
+PASS colorTest.parseColor("hsla(90, 37.5%, 12.5%, 0)") is "rgba(31, 43, 19, 0)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 12.5%, 0)") is "rgba(19, 43, 19, 0)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 12.5%, 0)") should be rgba(19, 43, 31, 0). Was rgba(19, 43, 32, 0).
+PASS colorTest.parseColor("hsla(150, 37.5%, 12.5%, 0)") is "rgba(19, 43, 31, 0)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 12.5%, 0)") is "rgba(19, 43, 43, 0)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 12.5%, 0)") is "rgba(19, 31, 43, 0)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 12.5%, 0)") is "rgba(19, 19, 43, 0)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 12.5%, 0)") is "rgba(31, 19, 43, 0)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 12.5%, 0)") is "rgba(43, 19, 43, 0)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 12.5%, 0)") should be rgba(43, 19, 31, 0). Was rgba(43, 19, 32, 0).
+PASS colorTest.parseColor("hsla(330, 37.5%, 12.5%, 0)") is "rgba(43, 19, 31, 0)"
 PASS colorTest.parseColor("hsla(0, 50%, 12.5%, 0)") is "rgba(47, 15, 15, 0)"
 PASS colorTest.parseColor("hsla(30, 50%, 12.5%, 0)") is "rgba(47, 31, 15, 0)"
 PASS colorTest.parseColor("hsla(60, 50%, 12.5%, 0)") is "rgba(47, 47, 15, 0)"
-FAIL colorTest.parseColor("hsla(90, 50%, 12.5%, 0)") should be rgba(31, 47, 15, 0). Was rgba(32, 47, 15, 0).
+PASS colorTest.parseColor("hsla(90, 50%, 12.5%, 0)") is "rgba(31, 47, 15, 0)"
 PASS colorTest.parseColor("hsla(120, 50%, 12.5%, 0)") is "rgba(15, 47, 15, 0)"
-FAIL colorTest.parseColor("hsla(150, 50%, 12.5%, 0)") should be rgba(15, 47, 31, 0). Was rgba(15, 47, 32, 0).
+PASS colorTest.parseColor("hsla(150, 50%, 12.5%, 0)") is "rgba(15, 47, 31, 0)"
 PASS colorTest.parseColor("hsla(180, 50%, 12.5%, 0)") is "rgba(15, 47, 47, 0)"
 PASS colorTest.parseColor("hsla(210, 50%, 12.5%, 0)") is "rgba(15, 31, 47, 0)"
 PASS colorTest.parseColor("hsla(240, 50%, 12.5%, 0)") is "rgba(15, 15, 47, 0)"
 PASS colorTest.parseColor("hsla(270, 50%, 12.5%, 0)") is "rgba(31, 15, 47, 0)"
 PASS colorTest.parseColor("hsla(300, 50%, 12.5%, 0)") is "rgba(47, 15, 47, 0)"
-FAIL colorTest.parseColor("hsla(330, 50%, 12.5%, 0)") should be rgba(47, 15, 31, 0). Was rgba(47, 15, 32, 0).
+PASS colorTest.parseColor("hsla(330, 50%, 12.5%, 0)") is "rgba(47, 15, 31, 0)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 12.5%, 0)") is "rgba(51, 11, 11, 0)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 12.5%, 0)") is "rgba(51, 31, 11, 0)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 12.5%, 0)") is "rgba(51, 51, 11, 0)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 12.5%, 0)") should be rgba(31, 51, 11, 0). Was rgba(32, 51, 11, 0).
+PASS colorTest.parseColor("hsla(90, 62.5%, 12.5%, 0)") is "rgba(31, 51, 11, 0)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 12.5%, 0)") is "rgba(11, 51, 11, 0)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 12.5%, 0)") should be rgba(11, 51, 31, 0). Was rgba(11, 51, 32, 0).
+PASS colorTest.parseColor("hsla(150, 62.5%, 12.5%, 0)") is "rgba(11, 51, 31, 0)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 12.5%, 0)") is "rgba(11, 51, 51, 0)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 12.5%, 0)") is "rgba(11, 31, 51, 0)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 12.5%, 0)") is "rgba(11, 11, 51, 0)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 12.5%, 0)") is "rgba(31, 11, 51, 0)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 12.5%, 0)") is "rgba(51, 11, 51, 0)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 12.5%, 0)") should be rgba(51, 11, 31, 0). Was rgba(51, 11, 32, 0).
+PASS colorTest.parseColor("hsla(330, 62.5%, 12.5%, 0)") is "rgba(51, 11, 31, 0)"
 PASS colorTest.parseColor("hsla(0, 75%, 12.5%, 0)") is "rgba(55, 7, 7, 0)"
 PASS colorTest.parseColor("hsla(30, 75%, 12.5%, 0)") is "rgba(55, 31, 7, 0)"
 PASS colorTest.parseColor("hsla(60, 75%, 12.5%, 0)") is "rgba(55, 55, 7, 0)"
-FAIL colorTest.parseColor("hsla(90, 75%, 12.5%, 0)") should be rgba(31, 55, 7, 0). Was rgba(32, 55, 7, 0).
+PASS colorTest.parseColor("hsla(90, 75%, 12.5%, 0)") is "rgba(31, 55, 7, 0)"
 PASS colorTest.parseColor("hsla(120, 75%, 12.5%, 0)") is "rgba(7, 55, 7, 0)"
-FAIL colorTest.parseColor("hsla(150, 75%, 12.5%, 0)") should be rgba(7, 55, 31, 0). Was rgba(7, 55, 32, 0).
+PASS colorTest.parseColor("hsla(150, 75%, 12.5%, 0)") is "rgba(7, 55, 31, 0)"
 PASS colorTest.parseColor("hsla(180, 75%, 12.5%, 0)") is "rgba(7, 55, 55, 0)"
 PASS colorTest.parseColor("hsla(210, 75%, 12.5%, 0)") is "rgba(7, 31, 55, 0)"
 PASS colorTest.parseColor("hsla(240, 75%, 12.5%, 0)") is "rgba(7, 7, 55, 0)"
 PASS colorTest.parseColor("hsla(270, 75%, 12.5%, 0)") is "rgba(31, 7, 55, 0)"
 PASS colorTest.parseColor("hsla(300, 75%, 12.5%, 0)") is "rgba(55, 7, 55, 0)"
-FAIL colorTest.parseColor("hsla(330, 75%, 12.5%, 0)") should be rgba(55, 7, 31, 0). Was rgba(55, 7, 32, 0).
+PASS colorTest.parseColor("hsla(330, 75%, 12.5%, 0)") is "rgba(55, 7, 31, 0)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 12.5%, 0)") is "rgba(59, 3, 3, 0)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 12.5%, 0)") is "rgba(59, 31, 3, 0)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 12.5%, 0)") is "rgba(59, 59, 3, 0)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 12.5%, 0)") should be rgba(31, 59, 3, 0). Was rgba(32, 59, 3, 0).
+PASS colorTest.parseColor("hsla(90, 87.5%, 12.5%, 0)") is "rgba(31, 59, 3, 0)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 12.5%, 0)") is "rgba(3, 59, 3, 0)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 12.5%, 0)") should be rgba(3, 59, 31, 0). Was rgba(3, 59, 32, 0).
+PASS colorTest.parseColor("hsla(150, 87.5%, 12.5%, 0)") is "rgba(3, 59, 31, 0)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 12.5%, 0)") is "rgba(3, 59, 59, 0)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 12.5%, 0)") is "rgba(3, 31, 59, 0)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 12.5%, 0)") is "rgba(3, 3, 59, 0)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 12.5%, 0)") is "rgba(31, 3, 59, 0)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 12.5%, 0)") is "rgba(59, 3, 59, 0)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 12.5%, 0)") should be rgba(59, 3, 31, 0). Was rgba(59, 3, 32, 0).
+PASS colorTest.parseColor("hsla(330, 87.5%, 12.5%, 0)") is "rgba(59, 3, 31, 0)"
 PASS colorTest.parseColor("hsla(0, 100%, 12.5%, 0)") is "rgba(63, 0, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 12.5%, 0)") is "rgba(63, 31, 0, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 12.5%, 0)") is "rgba(63, 63, 0, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 12.5%, 0)") should be rgba(31, 63, 0, 0). Was rgba(32, 63, 0, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 12.5%, 0)") is "rgba(31, 63, 0, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 12.5%, 0)") is "rgba(0, 63, 0, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 12.5%, 0)") should be rgba(0, 63, 31, 0). Was rgba(0, 63, 32, 0).
+PASS colorTest.parseColor("hsla(150, 100%, 12.5%, 0)") is "rgba(0, 63, 31, 0)"
 PASS colorTest.parseColor("hsla(180, 100%, 12.5%, 0)") is "rgba(0, 63, 63, 0)"
 PASS colorTest.parseColor("hsla(210, 100%, 12.5%, 0)") is "rgba(0, 31, 63, 0)"
 PASS colorTest.parseColor("hsla(240, 100%, 12.5%, 0)") is "rgba(0, 0, 63, 0)"
 PASS colorTest.parseColor("hsla(270, 100%, 12.5%, 0)") is "rgba(31, 0, 63, 0)"
 PASS colorTest.parseColor("hsla(300, 100%, 12.5%, 0)") is "rgba(63, 0, 63, 0)"
-FAIL colorTest.parseColor("hsla(330, 100%, 12.5%, 0)") should be rgba(63, 0, 31, 0). Was rgba(63, 0, 32, 0).
+PASS colorTest.parseColor("hsla(330, 100%, 12.5%, 0)") is "rgba(63, 0, 31, 0)"
 PASS colorTest.parseColor("hsla(0, 0%, 25%, 0)") is "rgba(63, 63, 63, 0)"
 PASS colorTest.parseColor("hsla(30, 0%, 25%, 0)") is "rgba(63, 63, 63, 0)"
 PASS colorTest.parseColor("hsla(60, 0%, 25%, 0)") is "rgba(63, 63, 63, 0)"
@@ -751,75 +751,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 25%, 0)") is "rgba(87, 39, 39, 0)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 25%, 0)") is "rgba(87, 63, 39, 0)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 25%, 0)") is "rgba(87, 87, 39, 0)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 25%, 0)") should be rgba(63, 87, 39, 0). Was rgba(64, 87, 39, 0).
+PASS colorTest.parseColor("hsla(90, 37.5%, 25%, 0)") is "rgba(63, 87, 39, 0)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 25%, 0)") is "rgba(39, 87, 39, 0)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 25%, 0)") should be rgba(39, 87, 63, 0). Was rgba(39, 87, 64, 0).
+PASS colorTest.parseColor("hsla(150, 37.5%, 25%, 0)") is "rgba(39, 87, 63, 0)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 25%, 0)") is "rgba(39, 87, 87, 0)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 25%, 0)") is "rgba(39, 63, 87, 0)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 25%, 0)") is "rgba(39, 39, 87, 0)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 25%, 0)") is "rgba(63, 39, 87, 0)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 25%, 0)") is "rgba(87, 39, 87, 0)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 25%, 0)") should be rgba(87, 39, 63, 0). Was rgba(87, 39, 64, 0).
+PASS colorTest.parseColor("hsla(330, 37.5%, 25%, 0)") is "rgba(87, 39, 63, 0)"
 PASS colorTest.parseColor("hsla(0, 50%, 25%, 0)") is "rgba(95, 31, 31, 0)"
 PASS colorTest.parseColor("hsla(30, 50%, 25%, 0)") is "rgba(95, 63, 31, 0)"
 PASS colorTest.parseColor("hsla(60, 50%, 25%, 0)") is "rgba(95, 95, 31, 0)"
-FAIL colorTest.parseColor("hsla(90, 50%, 25%, 0)") should be rgba(63, 95, 31, 0). Was rgba(64, 95, 31, 0).
+PASS colorTest.parseColor("hsla(90, 50%, 25%, 0)") is "rgba(63, 95, 31, 0)"
 PASS colorTest.parseColor("hsla(120, 50%, 25%, 0)") is "rgba(31, 95, 31, 0)"
-FAIL colorTest.parseColor("hsla(150, 50%, 25%, 0)") should be rgba(31, 95, 63, 0). Was rgba(31, 95, 64, 0).
+PASS colorTest.parseColor("hsla(150, 50%, 25%, 0)") is "rgba(31, 95, 63, 0)"
 PASS colorTest.parseColor("hsla(180, 50%, 25%, 0)") is "rgba(31, 95, 95, 0)"
 PASS colorTest.parseColor("hsla(210, 50%, 25%, 0)") is "rgba(31, 63, 95, 0)"
 PASS colorTest.parseColor("hsla(240, 50%, 25%, 0)") is "rgba(31, 31, 95, 0)"
 PASS colorTest.parseColor("hsla(270, 50%, 25%, 0)") is "rgba(63, 31, 95, 0)"
 PASS colorTest.parseColor("hsla(300, 50%, 25%, 0)") is "rgba(95, 31, 95, 0)"
-FAIL colorTest.parseColor("hsla(330, 50%, 25%, 0)") should be rgba(95, 31, 63, 0). Was rgba(95, 31, 64, 0).
+PASS colorTest.parseColor("hsla(330, 50%, 25%, 0)") is "rgba(95, 31, 63, 0)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 25%, 0)") is "rgba(103, 23, 23, 0)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 25%, 0)") is "rgba(103, 63, 23, 0)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 25%, 0)") is "rgba(103, 103, 23, 0)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 25%, 0)") should be rgba(63, 103, 23, 0). Was rgba(64, 103, 23, 0).
+PASS colorTest.parseColor("hsla(90, 62.5%, 25%, 0)") is "rgba(63, 103, 23, 0)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 25%, 0)") is "rgba(23, 103, 23, 0)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 25%, 0)") should be rgba(23, 103, 63, 0). Was rgba(23, 103, 64, 0).
+PASS colorTest.parseColor("hsla(150, 62.5%, 25%, 0)") is "rgba(23, 103, 63, 0)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 25%, 0)") is "rgba(23, 103, 103, 0)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 25%, 0)") is "rgba(23, 63, 103, 0)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 25%, 0)") is "rgba(23, 23, 103, 0)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 25%, 0)") is "rgba(63, 23, 103, 0)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 25%, 0)") is "rgba(103, 23, 103, 0)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 25%, 0)") should be rgba(103, 23, 63, 0). Was rgba(103, 23, 64, 0).
+PASS colorTest.parseColor("hsla(330, 62.5%, 25%, 0)") is "rgba(103, 23, 63, 0)"
 PASS colorTest.parseColor("hsla(0, 75%, 25%, 0)") is "rgba(111, 15, 15, 0)"
 PASS colorTest.parseColor("hsla(30, 75%, 25%, 0)") is "rgba(111, 63, 15, 0)"
 PASS colorTest.parseColor("hsla(60, 75%, 25%, 0)") is "rgba(111, 111, 15, 0)"
-FAIL colorTest.parseColor("hsla(90, 75%, 25%, 0)") should be rgba(63, 111, 15, 0). Was rgba(64, 111, 15, 0).
+PASS colorTest.parseColor("hsla(90, 75%, 25%, 0)") is "rgba(63, 111, 15, 0)"
 PASS colorTest.parseColor("hsla(120, 75%, 25%, 0)") is "rgba(15, 111, 15, 0)"
-FAIL colorTest.parseColor("hsla(150, 75%, 25%, 0)") should be rgba(15, 111, 63, 0). Was rgba(15, 111, 64, 0).
+PASS colorTest.parseColor("hsla(150, 75%, 25%, 0)") is "rgba(15, 111, 63, 0)"
 PASS colorTest.parseColor("hsla(180, 75%, 25%, 0)") is "rgba(15, 111, 111, 0)"
 PASS colorTest.parseColor("hsla(210, 75%, 25%, 0)") is "rgba(15, 63, 111, 0)"
 PASS colorTest.parseColor("hsla(240, 75%, 25%, 0)") is "rgba(15, 15, 111, 0)"
 PASS colorTest.parseColor("hsla(270, 75%, 25%, 0)") is "rgba(63, 15, 111, 0)"
 PASS colorTest.parseColor("hsla(300, 75%, 25%, 0)") is "rgba(111, 15, 111, 0)"
-FAIL colorTest.parseColor("hsla(330, 75%, 25%, 0)") should be rgba(111, 15, 63, 0). Was rgba(111, 15, 64, 0).
+PASS colorTest.parseColor("hsla(330, 75%, 25%, 0)") is "rgba(111, 15, 63, 0)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 25%, 0)") is "rgba(119, 7, 7, 0)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 25%, 0)") is "rgba(119, 63, 7, 0)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 25%, 0)") is "rgba(119, 119, 7, 0)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 25%, 0)") should be rgba(63, 119, 7, 0). Was rgba(64, 119, 7, 0).
+PASS colorTest.parseColor("hsla(90, 87.5%, 25%, 0)") is "rgba(63, 119, 7, 0)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 25%, 0)") is "rgba(7, 119, 7, 0)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 25%, 0)") should be rgba(7, 119, 63, 0). Was rgba(7, 119, 64, 0).
+PASS colorTest.parseColor("hsla(150, 87.5%, 25%, 0)") is "rgba(7, 119, 63, 0)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 25%, 0)") is "rgba(7, 119, 119, 0)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 25%, 0)") is "rgba(7, 63, 119, 0)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 25%, 0)") is "rgba(7, 7, 119, 0)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 25%, 0)") is "rgba(63, 7, 119, 0)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 25%, 0)") is "rgba(119, 7, 119, 0)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 25%, 0)") should be rgba(119, 7, 63, 0). Was rgba(119, 7, 64, 0).
+PASS colorTest.parseColor("hsla(330, 87.5%, 25%, 0)") is "rgba(119, 7, 63, 0)"
 PASS colorTest.parseColor("hsla(0, 100%, 25%, 0)") is "rgba(127, 0, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 25%, 0)") is "rgba(127, 63, 0, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 25%, 0)") is "rgba(127, 127, 0, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 25%, 0)") should be rgba(63, 127, 0, 0). Was rgba(64, 127, 0, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 25%, 0)") is "rgba(63, 127, 0, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 25%, 0)") is "rgba(0, 127, 0, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 25%, 0)") should be rgba(0, 127, 63, 0). Was rgba(0, 127, 64, 0).
+PASS colorTest.parseColor("hsla(150, 100%, 25%, 0)") is "rgba(0, 127, 63, 0)"
 PASS colorTest.parseColor("hsla(180, 100%, 25%, 0)") is "rgba(0, 127, 127, 0)"
 PASS colorTest.parseColor("hsla(210, 100%, 25%, 0)") is "rgba(0, 63, 127, 0)"
 PASS colorTest.parseColor("hsla(240, 100%, 25%, 0)") is "rgba(0, 0, 127, 0)"
 PASS colorTest.parseColor("hsla(270, 100%, 25%, 0)") is "rgba(63, 0, 127, 0)"
 PASS colorTest.parseColor("hsla(300, 100%, 25%, 0)") is "rgba(127, 0, 127, 0)"
-FAIL colorTest.parseColor("hsla(330, 100%, 25%, 0)") should be rgba(127, 0, 63, 0). Was rgba(127, 0, 64, 0).
+PASS colorTest.parseColor("hsla(330, 100%, 25%, 0)") is "rgba(127, 0, 63, 0)"
 PASS colorTest.parseColor("hsla(0, 0%, 37.5%, 0)") is "rgba(95, 95, 95, 0)"
 PASS colorTest.parseColor("hsla(30, 0%, 37.5%, 0)") is "rgba(95, 95, 95, 0)"
 PASS colorTest.parseColor("hsla(60, 0%, 37.5%, 0)") is "rgba(95, 95, 95, 0)"
@@ -847,87 +847,87 @@
 PASS colorTest.parseColor("hsla(0, 25%, 37.5%, 0)") is "rgba(119, 71, 71, 0)"
 PASS colorTest.parseColor("hsla(30, 25%, 37.5%, 0)") is "rgba(119, 95, 71, 0)"
 PASS colorTest.parseColor("hsla(60, 25%, 37.5%, 0)") is "rgba(119, 119, 71, 0)"
-FAIL colorTest.parseColor("hsla(90, 25%, 37.5%, 0)") should be rgba(95, 119, 71, 0). Was rgba(96, 119, 71, 0).
+PASS colorTest.parseColor("hsla(90, 25%, 37.5%, 0)") is "rgba(95, 119, 71, 0)"
 PASS colorTest.parseColor("hsla(120, 25%, 37.5%, 0)") is "rgba(71, 119, 71, 0)"
-FAIL colorTest.parseColor("hsla(150, 25%, 37.5%, 0)") should be rgba(71, 119, 95, 0). Was rgba(71, 119, 96, 0).
+PASS colorTest.parseColor("hsla(150, 25%, 37.5%, 0)") is "rgba(71, 119, 95, 0)"
 PASS colorTest.parseColor("hsla(180, 25%, 37.5%, 0)") is "rgba(71, 119, 119, 0)"
 PASS colorTest.parseColor("hsla(210, 25%, 37.5%, 0)") is "rgba(71, 95, 119, 0)"
 PASS colorTest.parseColor("hsla(240, 25%, 37.5%, 0)") is "rgba(71, 71, 119, 0)"
 PASS colorTest.parseColor("hsla(270, 25%, 37.5%, 0)") is "rgba(95, 71, 119, 0)"
 PASS colorTest.parseColor("hsla(300, 25%, 37.5%, 0)") is "rgba(119, 71, 119, 0)"
-FAIL colorTest.parseColor("hsla(330, 25%, 37.5%, 0)") should be rgba(119, 71, 95, 0). Was rgba(119, 71, 96, 0).
+PASS colorTest.parseColor("hsla(330, 25%, 37.5%, 0)") is "rgba(119, 71, 95, 0)"
 PASS colorTest.parseColor("hsla(0, 37.5%, 37.5%, 0)") is "rgba(131, 59, 59, 0)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 37.5%, 0)") is "rgba(131, 95, 59, 0)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 37.5%, 0)") is "rgba(131, 131, 59, 0)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 37.5%, 0)") should be rgba(95, 131, 59, 0). Was rgba(96, 131, 59, 0).
+PASS colorTest.parseColor("hsla(90, 37.5%, 37.5%, 0)") is "rgba(95, 131, 59, 0)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 37.5%, 0)") is "rgba(59, 131, 59, 0)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 37.5%, 0)") should be rgba(59, 131, 95, 0). Was rgba(59, 131, 96, 0).
+PASS colorTest.parseColor("hsla(150, 37.5%, 37.5%, 0)") is "rgba(59, 131, 95, 0)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 37.5%, 0)") is "rgba(59, 131, 131, 0)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 37.5%, 0)") is "rgba(59, 95, 131, 0)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 37.5%, 0)") is "rgba(59, 59, 131, 0)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 37.5%, 0)") is "rgba(95, 59, 131, 0)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 37.5%, 0)") is "rgba(131, 59, 131, 0)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 37.5%, 0)") should be rgba(131, 59, 95, 0). Was rgba(131, 59, 96, 0).
+PASS colorTest.parseColor("hsla(330, 37.5%, 37.5%, 0)") is "rgba(131, 59, 95, 0)"
 PASS colorTest.parseColor("hsla(0, 50%, 37.5%, 0)") is "rgba(143, 47, 47, 0)"
 PASS colorTest.parseColor("hsla(30, 50%, 37.5%, 0)") is "rgba(143, 95, 47, 0)"
 PASS colorTest.parseColor("hsla(60, 50%, 37.5%, 0)") is "rgba(143, 143, 47, 0)"
-FAIL colorTest.parseColor("hsla(90, 50%, 37.5%, 0)") should be rgba(95, 143, 47, 0). Was rgba(96, 143, 47, 0).
+PASS colorTest.parseColor("hsla(90, 50%, 37.5%, 0)") is "rgba(95, 143, 47, 0)"
 PASS colorTest.parseColor("hsla(120, 50%, 37.5%, 0)") is "rgba(47, 143, 47, 0)"
-FAIL colorTest.parseColor("hsla(150, 50%, 37.5%, 0)") should be rgba(47, 143, 95, 0). Was rgba(47, 143, 96, 0).
+PASS colorTest.parseColor("hsla(150, 50%, 37.5%, 0)") is "rgba(47, 143, 95, 0)"
 PASS colorTest.parseColor("hsla(180, 50%, 37.5%, 0)") is "rgba(47, 143, 143, 0)"
 PASS colorTest.parseColor("hsla(210, 50%, 37.5%, 0)") is "rgba(47, 95, 143, 0)"
 PASS colorTest.parseColor("hsla(240, 50%, 37.5%, 0)") is "rgba(47, 47, 143, 0)"
 PASS colorTest.parseColor("hsla(270, 50%, 37.5%, 0)") is "rgba(95, 47, 143, 0)"
 PASS colorTest.parseColor("hsla(300, 50%, 37.5%, 0)") is "rgba(143, 47, 143, 0)"
-FAIL colorTest.parseColor("hsla(330, 50%, 37.5%, 0)") should be rgba(143, 47, 95, 0). Was rgba(143, 47, 96, 0).
+PASS colorTest.parseColor("hsla(330, 50%, 37.5%, 0)") is "rgba(143, 47, 95, 0)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 37.5%, 0)") is "rgba(155, 35, 35, 0)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 37.5%, 0)") is "rgba(155, 95, 35, 0)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 37.5%, 0)") is "rgba(155, 155, 35, 0)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 37.5%, 0)") should be rgba(95, 155, 35, 0). Was rgba(96, 155, 35, 0).
+PASS colorTest.parseColor("hsla(90, 62.5%, 37.5%, 0)") is "rgba(95, 155, 35, 0)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 37.5%, 0)") is "rgba(35, 155, 35, 0)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 37.5%, 0)") should be rgba(35, 155, 95, 0). Was rgba(35, 155, 96, 0).
+PASS colorTest.parseColor("hsla(150, 62.5%, 37.5%, 0)") is "rgba(35, 155, 95, 0)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 37.5%, 0)") is "rgba(35, 155, 155, 0)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 37.5%, 0)") is "rgba(35, 95, 155, 0)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 37.5%, 0)") is "rgba(35, 35, 155, 0)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 37.5%, 0)") is "rgba(95, 35, 155, 0)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 37.5%, 0)") is "rgba(155, 35, 155, 0)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 37.5%, 0)") should be rgba(155, 35, 95, 0). Was rgba(155, 35, 96, 0).
+PASS colorTest.parseColor("hsla(330, 62.5%, 37.5%, 0)") is "rgba(155, 35, 95, 0)"
 PASS colorTest.parseColor("hsla(0, 75%, 37.5%, 0)") is "rgba(167, 23, 23, 0)"
 PASS colorTest.parseColor("hsla(30, 75%, 37.5%, 0)") is "rgba(167, 95, 23, 0)"
 PASS colorTest.parseColor("hsla(60, 75%, 37.5%, 0)") is "rgba(167, 167, 23, 0)"
-FAIL colorTest.parseColor("hsla(90, 75%, 37.5%, 0)") should be rgba(95, 167, 23, 0). Was rgba(96, 167, 23, 0).
+PASS colorTest.parseColor("hsla(90, 75%, 37.5%, 0)") is "rgba(95, 167, 23, 0)"
 PASS colorTest.parseColor("hsla(120, 75%, 37.5%, 0)") is "rgba(23, 167, 23, 0)"
-FAIL colorTest.parseColor("hsla(150, 75%, 37.5%, 0)") should be rgba(23, 167, 95, 0). Was rgba(23, 167, 96, 0).
+PASS colorTest.parseColor("hsla(150, 75%, 37.5%, 0)") is "rgba(23, 167, 95, 0)"
 PASS colorTest.parseColor("hsla(180, 75%, 37.5%, 0)") is "rgba(23, 167, 167, 0)"
 PASS colorTest.parseColor("hsla(210, 75%, 37.5%, 0)") is "rgba(23, 95, 167, 0)"
 PASS colorTest.parseColor("hsla(240, 75%, 37.5%, 0)") is "rgba(23, 23, 167, 0)"
 PASS colorTest.parseColor("hsla(270, 75%, 37.5%, 0)") is "rgba(95, 23, 167, 0)"
 PASS colorTest.parseColor("hsla(300, 75%, 37.5%, 0)") is "rgba(167, 23, 167, 0)"
-FAIL colorTest.parseColor("hsla(330, 75%, 37.5%, 0)") should be rgba(167, 23, 95, 0). Was rgba(167, 23, 96, 0).
+PASS colorTest.parseColor("hsla(330, 75%, 37.5%, 0)") is "rgba(167, 23, 95, 0)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 37.5%, 0)") is "rgba(179, 11, 11, 0)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 37.5%, 0)") is "rgba(179, 95, 11, 0)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 37.5%, 0)") is "rgba(179, 179, 11, 0)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 37.5%, 0)") should be rgba(95, 179, 11, 0). Was rgba(96, 179, 11, 0).
+PASS colorTest.parseColor("hsla(90, 87.5%, 37.5%, 0)") is "rgba(95, 179, 11, 0)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 37.5%, 0)") is "rgba(11, 179, 11, 0)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 37.5%, 0)") should be rgba(11, 179, 95, 0). Was rgba(11, 179, 96, 0).
+PASS colorTest.parseColor("hsla(150, 87.5%, 37.5%, 0)") is "rgba(11, 179, 95, 0)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 37.5%, 0)") is "rgba(11, 179, 179, 0)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 37.5%, 0)") is "rgba(11, 95, 179, 0)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 37.5%, 0)") is "rgba(11, 11, 179, 0)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 37.5%, 0)") is "rgba(95, 11, 179, 0)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 37.5%, 0)") is "rgba(179, 11, 179, 0)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 37.5%, 0)") should be rgba(179, 11, 95, 0). Was rgba(179, 11, 96, 0).
+PASS colorTest.parseColor("hsla(330, 87.5%, 37.5%, 0)") is "rgba(179, 11, 95, 0)"
 PASS colorTest.parseColor("hsla(0, 100%, 37.5%, 0)") is "rgba(191, 0, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 37.5%, 0)") is "rgba(191, 95, 0, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 37.5%, 0)") is "rgba(191, 191, 0, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 37.5%, 0)") should be rgba(95, 191, 0, 0). Was rgba(96, 191, 0, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 37.5%, 0)") is "rgba(95, 191, 0, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 37.5%, 0)") is "rgba(0, 191, 0, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 37.5%, 0)") should be rgba(0, 191, 95, 0). Was rgba(0, 191, 96, 0).
+PASS colorTest.parseColor("hsla(150, 100%, 37.5%, 0)") is "rgba(0, 191, 95, 0)"
 PASS colorTest.parseColor("hsla(180, 100%, 37.5%, 0)") is "rgba(0, 191, 191, 0)"
 PASS colorTest.parseColor("hsla(210, 100%, 37.5%, 0)") is "rgba(0, 95, 191, 0)"
 PASS colorTest.parseColor("hsla(240, 100%, 37.5%, 0)") is "rgba(0, 0, 191, 0)"
 PASS colorTest.parseColor("hsla(270, 100%, 37.5%, 0)") is "rgba(95, 0, 191, 0)"
 PASS colorTest.parseColor("hsla(300, 100%, 37.5%, 0)") is "rgba(191, 0, 191, 0)"
-FAIL colorTest.parseColor("hsla(330, 100%, 37.5%, 0)") should be rgba(191, 0, 95, 0). Was rgba(191, 0, 96, 0).
+PASS colorTest.parseColor("hsla(330, 100%, 37.5%, 0)") is "rgba(191, 0, 95, 0)"
 PASS colorTest.parseColor("hsla(0, 0%, 50%, 0)") is "rgba(127, 127, 127, 0)"
 PASS colorTest.parseColor("hsla(30, 0%, 50%, 0)") is "rgba(127, 127, 127, 0)"
 PASS colorTest.parseColor("hsla(60, 0%, 50%, 0)") is "rgba(127, 127, 127, 0)"
@@ -967,75 +967,75 @@
 PASS colorTest.parseColor("hsla(0, 37.5%, 50%, 0)") is "rgba(175, 79, 79, 0)"
 PASS colorTest.parseColor("hsla(30, 37.5%, 50%, 0)") is "rgba(175, 127, 79, 0)"
 PASS colorTest.parseColor("hsla(60, 37.5%, 50%, 0)") is "rgba(175, 175, 79, 0)"
-FAIL colorTest.parseColor("hsla(90, 37.5%, 50%, 0)") should be rgba(127, 175, 79, 0). Was rgba(128, 175, 79, 0).
+PASS colorTest.parseColor("hsla(90, 37.5%, 50%, 0)") is "rgba(127, 175, 79, 0)"
 PASS colorTest.parseColor("hsla(120, 37.5%, 50%, 0)") is "rgba(79, 175, 79, 0)"
-FAIL colorTest.parseColor("hsla(150, 37.5%, 50%, 0)") should be rgba(79, 175, 127, 0). Was rgba(79, 175, 128, 0).
+PASS colorTest.parseColor("hsla(150, 37.5%, 50%, 0)") is "rgba(79, 175, 127, 0)"
 PASS colorTest.parseColor("hsla(180, 37.5%, 50%, 0)") is "rgba(79, 175, 175, 0)"
 PASS colorTest.parseColor("hsla(210, 37.5%, 50%, 0)") is "rgba(79, 127, 175, 0)"
 PASS colorTest.parseColor("hsla(240, 37.5%, 50%, 0)") is "rgba(79, 79, 175, 0)"
 PASS colorTest.parseColor("hsla(270, 37.5%, 50%, 0)") is "rgba(127, 79, 175, 0)"
 PASS colorTest.parseColor("hsla(300, 37.5%, 50%, 0)") is "rgba(175, 79, 175, 0)"
-FAIL colorTest.parseColor("hsla(330, 37.5%, 50%, 0)") should be rgba(175, 79, 127, 0). Was rgba(175, 79, 128, 0).
+PASS colorTest.parseColor("hsla(330, 37.5%, 50%, 0)") is "rgba(175, 79, 127, 0)"
 PASS colorTest.parseColor("hsla(0, 50%, 50%, 0)") is "rgba(191, 63, 63, 0)"
 PASS colorTest.parseColor("hsla(30, 50%, 50%, 0)") is "rgba(191, 127, 63, 0)"
 PASS colorTest.parseColor("hsla(60, 50%, 50%, 0)") is "rgba(191, 191, 63, 0)"
-FAIL colorTest.parseColor("hsla(90, 50%, 50%, 0)") should be rgba(127, 191, 63, 0). Was rgba(128, 191, 63, 0).
+PASS colorTest.parseColor("hsla(90, 50%, 50%, 0)") is "rgba(127, 191, 63, 0)"
 PASS colorTest.parseColor("hsla(120, 50%, 50%, 0)") is "rgba(63, 191, 63, 0)"
-FAIL colorTest.parseColor("hsla(150, 50%, 50%, 0)") should be rgba(63, 191, 127, 0). Was rgba(63, 191, 128, 0).
+PASS colorTest.parseColor("hsla(150, 50%, 50%, 0)") is "rgba(63, 191, 127, 0)"
 PASS colorTest.parseColor("hsla(180, 50%, 50%, 0)") is "rgba(63, 191, 191, 0)"
 PASS colorTest.parseColor("hsla(210, 50%, 50%, 0)") is "rgba(63, 127, 191, 0)"
 PASS colorTest.parseColor("hsla(240, 50%, 50%, 0)") is "rgba(63, 63, 191, 0)"
 PASS colorTest.parseColor("hsla(270, 50%, 50%, 0)") is "rgba(127, 63, 191, 0)"
 PASS colorTest.parseColor("hsla(300, 50%, 50%, 0)") is "rgba(191, 63, 191, 0)"
-FAIL colorTest.parseColor("hsla(330, 50%, 50%, 0)") should be rgba(191, 63, 127, 0). Was rgba(191, 63, 128, 0).
+PASS colorTest.parseColor("hsla(330, 50%, 50%, 0)") is "rgba(191, 63, 127, 0)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 50%, 0)") is "rgba(207, 47, 47, 0)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 50%, 0)") is "rgba(207, 127, 47, 0)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 50%, 0)") is "rgba(207, 207, 47, 0)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 50%, 0)") should be rgba(127, 207, 47, 0). Was rgba(128, 207, 47, 0).
+PASS colorTest.parseColor("hsla(90, 62.5%, 50%, 0)") is "rgba(127, 207, 47, 0)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 50%, 0)") is "rgba(47, 207, 47, 0)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 50%, 0)") should be rgba(47, 207, 127, 0). Was rgba(47, 207, 128, 0).
+PASS colorTest.parseColor("hsla(150, 62.5%, 50%, 0)") is "rgba(47, 207, 127, 0)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 50%, 0)") is "rgba(47, 207, 207, 0)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 50%, 0)") is "rgba(47, 127, 207, 0)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 50%, 0)") is "rgba(47, 47, 207, 0)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 50%, 0)") is "rgba(127, 47, 207, 0)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 50%, 0)") is "rgba(207, 47, 207, 0)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 50%, 0)") should be rgba(207, 47, 127, 0). Was rgba(207, 47, 128, 0).
+PASS colorTest.parseColor("hsla(330, 62.5%, 50%, 0)") is "rgba(207, 47, 127, 0)"
 PASS colorTest.parseColor("hsla(0, 75%, 50%, 0)") is "rgba(223, 31, 31, 0)"
 PASS colorTest.parseColor("hsla(30, 75%, 50%, 0)") is "rgba(223, 127, 31, 0)"
 PASS colorTest.parseColor("hsla(60, 75%, 50%, 0)") is "rgba(223, 223, 31, 0)"
-FAIL colorTest.parseColor("hsla(90, 75%, 50%, 0)") should be rgba(127, 223, 31, 0). Was rgba(128, 223, 31, 0).
+PASS colorTest.parseColor("hsla(90, 75%, 50%, 0)") is "rgba(127, 223, 31, 0)"
 PASS colorTest.parseColor("hsla(120, 75%, 50%, 0)") is "rgba(31, 223, 31, 0)"
-FAIL colorTest.parseColor("hsla(150, 75%, 50%, 0)") should be rgba(31, 223, 127, 0). Was rgba(31, 223, 128, 0).
+PASS colorTest.parseColor("hsla(150, 75%, 50%, 0)") is "rgba(31, 223, 127, 0)"
 PASS colorTest.parseColor("hsla(180, 75%, 50%, 0)") is "rgba(31, 223, 223, 0)"
 PASS colorTest.parseColor("hsla(210, 75%, 50%, 0)") is "rgba(31, 127, 223, 0)"
 PASS colorTest.parseColor("hsla(240, 75%, 50%, 0)") is "rgba(31, 31, 223, 0)"
 PASS colorTest.parseColor("hsla(270, 75%, 50%, 0)") is "rgba(127, 31, 223, 0)"
 PASS colorTest.parseColor("hsla(300, 75%, 50%, 0)") is "rgba(223, 31, 223, 0)"
-FAIL colorTest.parseColor("hsla(330, 75%, 50%, 0)") should be rgba(223, 31, 127, 0). Was rgba(223, 31, 128, 0).
+PASS colorTest.parseColor("hsla(330, 75%, 50%, 0)") is "rgba(223, 31, 127, 0)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 50%, 0)") is "rgba(239, 15, 15, 0)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 50%, 0)") is "rgba(239, 127, 15, 0)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 50%, 0)") is "rgba(239, 239, 15, 0)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 50%, 0)") should be rgba(127, 239, 15, 0). Was rgba(128, 239, 15, 0).
+PASS colorTest.parseColor("hsla(90, 87.5%, 50%, 0)") is "rgba(127, 239, 15, 0)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 50%, 0)") is "rgba(15, 239, 15, 0)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 50%, 0)") should be rgba(15, 239, 127, 0). Was rgba(15, 239, 128, 0).
+PASS colorTest.parseColor("hsla(150, 87.5%, 50%, 0)") is "rgba(15, 239, 127, 0)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 50%, 0)") is "rgba(15, 239, 239, 0)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 50%, 0)") is "rgba(15, 127, 239, 0)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 50%, 0)") is "rgba(15, 15, 239, 0)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 50%, 0)") is "rgba(127, 15, 239, 0)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 50%, 0)") is "rgba(239, 15, 239, 0)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 50%, 0)") should be rgba(239, 15, 127, 0). Was rgba(239, 15, 128, 0).
+PASS colorTest.parseColor("hsla(330, 87.5%, 50%, 0)") is "rgba(239, 15, 127, 0)"
 PASS colorTest.parseColor("hsla(0, 100%, 50%, 0)") is "rgba(255, 0, 0, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 50%, 0)") is "rgba(255, 127, 0, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 50%, 0)") is "rgba(255, 255, 0, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 50%, 0)") should be rgba(127, 255, 0, 0). Was rgba(128, 255, 0, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 50%, 0)") is "rgba(127, 255, 0, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 50%, 0)") is "rgba(0, 255, 0, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 50%, 0)") should be rgba(0, 255, 127, 0). Was rgba(0, 255, 128, 0).
+PASS colorTest.parseColor("hsla(150, 100%, 50%, 0)") is "rgba(0, 255, 127, 0)"
 PASS colorTest.parseColor("hsla(180, 100%, 50%, 0)") is "rgba(0, 255, 255, 0)"
 PASS colorTest.parseColor("hsla(210, 100%, 50%, 0)") is "rgba(0, 127, 255, 0)"
 PASS colorTest.parseColor("hsla(240, 100%, 50%, 0)") is "rgba(0, 0, 255, 0)"
 PASS colorTest.parseColor("hsla(270, 100%, 50%, 0)") is "rgba(127, 0, 255, 0)"
 PASS colorTest.parseColor("hsla(300, 100%, 50%, 0)") is "rgba(255, 0, 255, 0)"
-FAIL colorTest.parseColor("hsla(330, 100%, 50%, 0)") should be rgba(255, 0, 127, 0). Was rgba(255, 0, 128, 0).
+PASS colorTest.parseColor("hsla(330, 100%, 50%, 0)") is "rgba(255, 0, 127, 0)"
 PASS colorTest.parseColor("hsla(0, 0%, 62.5%, 0)") is "rgba(159, 159, 159, 0)"
 PASS colorTest.parseColor("hsla(30, 0%, 62.5%, 0)") is "rgba(159, 159, 159, 0)"
 PASS colorTest.parseColor("hsla(60, 0%, 62.5%, 0)") is "rgba(159, 159, 159, 0)"
@@ -1087,63 +1087,63 @@
 PASS colorTest.parseColor("hsla(0, 50%, 62.5%, 0)") is "rgba(207, 111, 111, 0)"
 PASS colorTest.parseColor("hsla(30, 50%, 62.5%, 0)") is "rgba(207, 159, 111, 0)"
 PASS colorTest.parseColor("hsla(60, 50%, 62.5%, 0)") is "rgba(207, 207, 111, 0)"
-FAIL colorTest.parseColor("hsla(90, 50%, 62.5%, 0)") should be rgba(159, 207, 111, 0). Was rgba(160, 207, 111, 0).
+PASS colorTest.parseColor("hsla(90, 50%, 62.5%, 0)") is "rgba(159, 207, 111, 0)"
 PASS colorTest.parseColor("hsla(120, 50%, 62.5%, 0)") is "rgba(111, 207, 111, 0)"
-FAIL colorTest.parseColor("hsla(150, 50%, 62.5%, 0)") should be rgba(111, 207, 159, 0). Was rgba(111, 207, 160, 0).
+PASS colorTest.parseColor("hsla(150, 50%, 62.5%, 0)") is "rgba(111, 207, 159, 0)"
 PASS colorTest.parseColor("hsla(180, 50%, 62.5%, 0)") is "rgba(111, 207, 207, 0)"
 PASS colorTest.parseColor("hsla(210, 50%, 62.5%, 0)") is "rgba(111, 159, 207, 0)"
 PASS colorTest.parseColor("hsla(240, 50%, 62.5%, 0)") is "rgba(111, 111, 207, 0)"
 PASS colorTest.parseColor("hsla(270, 50%, 62.5%, 0)") is "rgba(159, 111, 207, 0)"
 PASS colorTest.parseColor("hsla(300, 50%, 62.5%, 0)") is "rgba(207, 111, 207, 0)"
-FAIL colorTest.parseColor("hsla(330, 50%, 62.5%, 0)") should be rgba(207, 111, 159, 0). Was rgba(207, 111, 160, 0).
+PASS colorTest.parseColor("hsla(330, 50%, 62.5%, 0)") is "rgba(207, 111, 159, 0)"
 PASS colorTest.parseColor("hsla(0, 62.5%, 62.5%, 0)") is "rgba(219, 99, 99, 0)"
 PASS colorTest.parseColor("hsla(30, 62.5%, 62.5%, 0)") is "rgba(219, 159, 99, 0)"
 PASS colorTest.parseColor("hsla(60, 62.5%, 62.5%, 0)") is "rgba(219, 219, 99, 0)"
-FAIL colorTest.parseColor("hsla(90, 62.5%, 62.5%, 0)") should be rgba(159, 219, 99, 0). Was rgba(160, 219, 99, 0).
+PASS colorTest.parseColor("hsla(90, 62.5%, 62.5%, 0)") is "rgba(159, 219, 99, 0)"
 PASS colorTest.parseColor("hsla(120, 62.5%, 62.5%, 0)") is "rgba(99, 219, 99, 0)"
-FAIL colorTest.parseColor("hsla(150, 62.5%, 62.5%, 0)") should be rgba(99, 219, 159, 0). Was rgba(99, 219, 160, 0).
+PASS colorTest.parseColor("hsla(150, 62.5%, 62.5%, 0)") is "rgba(99, 219, 159, 0)"
 PASS colorTest.parseColor("hsla(180, 62.5%, 62.5%, 0)") is "rgba(99, 219, 219, 0)"
 PASS colorTest.parseColor("hsla(210, 62.5%, 62.5%, 0)") is "rgba(99, 159, 219, 0)"
 PASS colorTest.parseColor("hsla(240, 62.5%, 62.5%, 0)") is "rgba(99, 99, 219, 0)"
 PASS colorTest.parseColor("hsla(270, 62.5%, 62.5%, 0)") is "rgba(159, 99, 219, 0)"
 PASS colorTest.parseColor("hsla(300, 62.5%, 62.5%, 0)") is "rgba(219, 99, 219, 0)"
-FAIL colorTest.parseColor("hsla(330, 62.5%, 62.5%, 0)") should be rgba(219, 99, 159, 0). Was rgba(219, 99, 160, 0).
+PASS colorTest.parseColor("hsla(330, 62.5%, 62.5%, 0)") is "rgba(219, 99, 159, 0)"
 PASS colorTest.parseColor("hsla(0, 75%, 62.5%, 0)") is "rgba(231, 87, 87, 0)"
 PASS colorTest.parseColor("hsla(30, 75%, 62.5%, 0)") is "rgba(231, 159, 87, 0)"
 PASS colorTest.parseColor("hsla(60, 75%, 62.5%, 0)") is "rgba(231, 231, 87, 0)"
-FAIL colorTest.parseColor("hsla(90, 75%, 62.5%, 0)") should be rgba(159, 231, 87, 0). Was rgba(160, 231, 87, 0).
+PASS colorTest.parseColor("hsla(90, 75%, 62.5%, 0)") is "rgba(159, 231, 87, 0)"
 PASS colorTest.parseColor("hsla(120, 75%, 62.5%, 0)") is "rgba(87, 231, 87, 0)"
-FAIL colorTest.parseColor("hsla(150, 75%, 62.5%, 0)") should be rgba(87, 231, 159, 0). Was rgba(87, 231, 160, 0).
+PASS colorTest.parseColor("hsla(150, 75%, 62.5%, 0)") is "rgba(87, 231, 159, 0)"
 PASS colorTest.parseColor("hsla(180, 75%, 62.5%, 0)") is "rgba(87, 231, 231, 0)"
 PASS colorTest.parseColor("hsla(210, 75%, 62.5%, 0)") is "rgba(87, 159, 231, 0)"
 PASS colorTest.parseColor("hsla(240, 75%, 62.5%, 0)") is "rgba(87, 87, 231, 0)"
 PASS colorTest.parseColor("hsla(270, 75%, 62.5%, 0)") is "rgba(159, 87, 231, 0)"
 PASS colorTest.parseColor("hsla(300, 75%, 62.5%, 0)") is "rgba(231, 87, 231, 0)"
-FAIL colorTest.parseColor("hsla(330, 75%, 62.5%, 0)") should be rgba(231, 87, 159, 0). Was rgba(231, 87, 160, 0).
+PASS colorTest.parseColor("hsla(330, 75%, 62.5%, 0)") is "rgba(231, 87, 159, 0)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 62.5%, 0)") is "rgba(243, 75, 75, 0)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 62.5%, 0)") is "rgba(243, 159, 75, 0)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 62.5%, 0)") is "rgba(243, 243, 75, 0)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 62.5%, 0)") should be rgba(159, 243, 75, 0). Was rgba(160, 243, 75, 0).
+PASS colorTest.parseColor("hsla(90, 87.5%, 62.5%, 0)") is "rgba(159, 243, 75, 0)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 62.5%, 0)") is "rgba(75, 243, 75, 0)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 62.5%, 0)") should be rgba(75, 243, 159, 0). Was rgba(75, 243, 160, 0).
+PASS colorTest.parseColor("hsla(150, 87.5%, 62.5%, 0)") is "rgba(75, 243, 159, 0)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 62.5%, 0)") is "rgba(75, 243, 243, 0)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 62.5%, 0)") is "rgba(75, 159, 243, 0)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 62.5%, 0)") is "rgba(75, 75, 243, 0)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 62.5%, 0)") is "rgba(159, 75, 243, 0)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 62.5%, 0)") is "rgba(243, 75, 243, 0)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 62.5%, 0)") should be rgba(243, 75, 159, 0). Was rgba(243, 75, 160, 0).
+PASS colorTest.parseColor("hsla(330, 87.5%, 62.5%, 0)") is "rgba(243, 75, 159, 0)"
 PASS colorTest.parseColor("hsla(0, 100%, 62.5%, 0)") is "rgba(255, 63, 63, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 62.5%, 0)") is "rgba(255, 159, 63, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 62.5%, 0)") is "rgba(255, 255, 63, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 62.5%, 0)") should be rgba(159, 255, 63, 0). Was rgba(160, 255, 63, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 62.5%, 0)") is "rgba(159, 255, 63, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 62.5%, 0)") is "rgba(63, 255, 63, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 62.5%, 0)") should be rgba(63, 255, 159, 0). Was rgba(63, 255, 160, 0).
+PASS colorTest.parseColor("hsla(150, 100%, 62.5%, 0)") is "rgba(63, 255, 159, 0)"
 PASS colorTest.parseColor("hsla(180, 100%, 62.5%, 0)") is "rgba(63, 255, 255, 0)"
 PASS colorTest.parseColor("hsla(210, 100%, 62.5%, 0)") is "rgba(63, 159, 255, 0)"
 PASS colorTest.parseColor("hsla(240, 100%, 62.5%, 0)") is "rgba(63, 63, 255, 0)"
 PASS colorTest.parseColor("hsla(270, 100%, 62.5%, 0)") is "rgba(159, 63, 255, 0)"
 PASS colorTest.parseColor("hsla(300, 100%, 62.5%, 0)") is "rgba(255, 63, 255, 0)"
-FAIL colorTest.parseColor("hsla(330, 100%, 62.5%, 0)") should be rgba(255, 63, 159, 0). Was rgba(255, 63, 160, 0).
+PASS colorTest.parseColor("hsla(330, 100%, 62.5%, 0)") is "rgba(255, 63, 159, 0)"
 PASS colorTest.parseColor("hsla(0, 0%, 75%, 0)") is "rgba(191, 191, 191, 0)"
 PASS colorTest.parseColor("hsla(30, 0%, 75%, 0)") is "rgba(191, 191, 191, 0)"
 PASS colorTest.parseColor("hsla(60, 0%, 75%, 0)") is "rgba(191, 191, 191, 0)"
@@ -1219,39 +1219,39 @@
 PASS colorTest.parseColor("hsla(0, 75%, 75%, 0)") is "rgba(239, 143, 143, 0)"
 PASS colorTest.parseColor("hsla(30, 75%, 75%, 0)") is "rgba(239, 191, 143, 0)"
 PASS colorTest.parseColor("hsla(60, 75%, 75%, 0)") is "rgba(239, 239, 143, 0)"
-FAIL colorTest.parseColor("hsla(90, 75%, 75%, 0)") should be rgba(191, 239, 143, 0). Was rgba(192, 239, 143, 0).
+PASS colorTest.parseColor("hsla(90, 75%, 75%, 0)") is "rgba(191, 239, 143, 0)"
 PASS colorTest.parseColor("hsla(120, 75%, 75%, 0)") is "rgba(143, 239, 143, 0)"
-FAIL colorTest.parseColor("hsla(150, 75%, 75%, 0)") should be rgba(143, 239, 191, 0). Was rgba(143, 239, 192, 0).
+PASS colorTest.parseColor("hsla(150, 75%, 75%, 0)") is "rgba(143, 239, 191, 0)"
 PASS colorTest.parseColor("hsla(180, 75%, 75%, 0)") is "rgba(143, 239, 239, 0)"
 PASS colorTest.parseColor("hsla(210, 75%, 75%, 0)") is "rgba(143, 191, 239, 0)"
 PASS colorTest.parseColor("hsla(240, 75%, 75%, 0)") is "rgba(143, 143, 239, 0)"
 PASS colorTest.parseColor("hsla(270, 75%, 75%, 0)") is "rgba(191, 143, 239, 0)"
 PASS colorTest.parseColor("hsla(300, 75%, 75%, 0)") is "rgba(239, 143, 239, 0)"
-FAIL colorTest.parseColor("hsla(330, 75%, 75%, 0)") should be rgba(239, 143, 191, 0). Was rgba(239, 143, 192, 0).
+PASS colorTest.parseColor("hsla(330, 75%, 75%, 0)") is "rgba(239, 143, 191, 0)"
 PASS colorTest.parseColor("hsla(0, 87.5%, 75%, 0)") is "rgba(247, 135, 135, 0)"
 PASS colorTest.parseColor("hsla(30, 87.5%, 75%, 0)") is "rgba(247, 191, 135, 0)"
 PASS colorTest.parseColor("hsla(60, 87.5%, 75%, 0)") is "rgba(247, 247, 135, 0)"
-FAIL colorTest.parseColor("hsla(90, 87.5%, 75%, 0)") should be rgba(191, 247, 135, 0). Was rgba(192, 247, 135, 0).
+PASS colorTest.parseColor("hsla(90, 87.5%, 75%, 0)") is "rgba(191, 247, 135, 0)"
 PASS colorTest.parseColor("hsla(120, 87.5%, 75%, 0)") is "rgba(135, 247, 135, 0)"
-FAIL colorTest.parseColor("hsla(150, 87.5%, 75%, 0)") should be rgba(135, 247, 191, 0). Was rgba(135, 247, 192, 0).
+PASS colorTest.parseColor("hsla(150, 87.5%, 75%, 0)") is "rgba(135, 247, 191, 0)"
 PASS colorTest.parseColor("hsla(180, 87.5%, 75%, 0)") is "rgba(135, 247, 247, 0)"
 PASS colorTest.parseColor("hsla(210, 87.5%, 75%, 0)") is "rgba(135, 191, 247, 0)"
 PASS colorTest.parseColor("hsla(240, 87.5%, 75%, 0)") is "rgba(135, 135, 247, 0)"
 PASS colorTest.parseColor("hsla(270, 87.5%, 75%, 0)") is "rgba(191, 135, 247, 0)"
 PASS colorTest.parseColor("hsla(300, 87.5%, 75%, 0)") is "rgba(247, 135, 247, 0)"
-FAIL colorTest.parseColor("hsla(330, 87.5%, 75%, 0)") should be rgba(247, 135, 191, 0). Was rgba(247, 135, 192, 0).
+PASS colorTest.parseColor("hsla(330, 87.5%, 75%, 0)") is "rgba(247, 135, 191, 0)"
 PASS colorTest.parseColor("hsla(0, 100%, 75%, 0)") is "rgba(255, 127, 127, 0)"
 PASS colorTest.parseColor("hsla(30, 100%, 75%, 0)") is "rgba(255, 191, 127, 0)"
 PASS colorTest.parseColor("hsla(60, 100%, 75%, 0)") is "rgba(255, 255, 127, 0)"
-FAIL colorTest.parseColor("hsla(90, 100%, 75%, 0)") should be rgba(191, 255, 127, 0). Was rgba(192, 255, 127, 0).
+PASS colorTest.parseColor("hsla(90, 100%, 75%, 0)") is "rgba(191, 255, 127, 0)"
 PASS colorTest.parseColor("hsla(120, 100%, 75%, 0)") is "rgba(127, 255, 127, 0)"
-FAIL colorTest.parseColor("hsla(150, 100%, 75%, 0)") should be rgba(127, 255, 191, 0). Was rgba(127, 255, 192, 0).
+PASS colorTest.parseColor("hsla(150, 100%, 75%, 0)") is "rgba(127, 255, 191, 0)"
 PASS colorTest.parseColor("hsla(180, 100%, 75%, 0)") is "rgba(127, 255, 255, 0)"
 PASS colorTest.parseColor("hsla(210, 100%, 75%, 0)") is "rgba(127, 191, 255, 0)"
 PASS colorTest.parseColor("hsla(240, 100%, 75%, 0)") is "rgba(127, 127, 255, 0)"
 PASS colorTest.parseColor("hsla(270, 100%, 75%, 0)") is "rgba(191, 127, 255, 0)"
 PASS colorTest.parseColor("hsla(300, 100%, 75%, 0)") is "rgba(255, 127, 255, 0)"
-FAIL colorTest.parseColor("hsla(330, 100%, 75%, 0)") should be rgba(255, 127, 191, 0). Was rgba(255, 127, 192, 0).
+PASS colorTest.parseColor("hsla(330, 100%, 75%, 0)") is "rgba(255, 127, 191, 0)"
 PASS colorTest.parseColor("hsla(0, 0%, 87.5%, 0)") is "rgba(223, 223, 223, 0)"
 PASS colorTest.parseColor("hsla(30, 0%, 87.5%, 0)") is "rgba(223, 223, 223, 0)"
 PASS colorTest.parseColor("hsla(60, 0%, 87.5%, 0)") is "rgba(223, 223, 223, 0)"
diff --git a/third_party/WebKit/LayoutTests/external/OWNERS b/third_party/WebKit/LayoutTests/external/OWNERS
index 8b5054b8..d4138ee2 100644
--- a/third_party/WebKit/LayoutTests/external/OWNERS
+++ b/third_party/WebKit/LayoutTests/external/OWNERS
@@ -1,3 +1,5 @@
+# Please do not remove this file. It is needed by webkitpy/w3c/directory_owners_extractor.py
+
 # TEAM: ecosystem-infra@chromium.org
 # COMPONENT: Blink>Infra>Ecosystem
 foolip@chromium.org
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1-expected.txt
deleted file mode 100644
index 68b754c..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-1 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2-expected.txt
deleted file mode 100644
index 4b11fad5..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-2 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3-expected.txt
deleted file mode 100644
index a7c60cf..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-3 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4-expected.txt
deleted file mode 100644
index ccf7c36e..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-4 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5-expected.txt
deleted file mode 100644
index 374baf48..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-5 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6-expected.txt
deleted file mode 100644
index 36d6d2a2..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-6 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7-expected.txt
deleted file mode 100644
index cbb516d..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-7 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8-expected.txt
deleted file mode 100644
index a2e74ab..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-8 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9-expected.txt
deleted file mode 100644
index 91fd1d5..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsl-9 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1-expected.txt
deleted file mode 100644
index 7bece1a..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-1 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2-expected.txt
deleted file mode 100644
index 0be3a76e..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-2 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3-expected.txt
deleted file mode 100644
index c93d5ae..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-3 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4-expected.txt
deleted file mode 100644
index 9132e42..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-4 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5-expected.txt
deleted file mode 100644
index af32012..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-5 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6-expected.txt
deleted file mode 100644
index 4d01775..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-6 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7-expected.txt
deleted file mode 100644
index bebdc7c..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-7 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8-expected.txt
deleted file mode 100644
index 28a999b..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-8 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9-expected.txt
deleted file mode 100644
index 048b659..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Canvas test: 2d.fillStyle.parse.css-color-4-hsla-9 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1-expected.txt
deleted file mode 100644
index 70b5704..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-1 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2-expected.txt
deleted file mode 100644
index fbeb3bc..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-2 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3-expected.txt
deleted file mode 100644
index d4a4289..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-3 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4-expected.txt
deleted file mode 100644
index be4f9bc..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-4 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5-expected.txt
deleted file mode 100644
index 0d29c63..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-5 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6-expected.txt
deleted file mode 100644
index 86f82f9..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-6 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7-expected.txt
deleted file mode 100644
index 7a509847..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-7 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8-expected.txt
deleted file mode 100644
index c897025c..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-8 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9-expected.txt
deleted file mode 100644
index 3368b5d..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsl-9 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1-expected.txt
deleted file mode 100644
index 161283f..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-1 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2-expected.txt
deleted file mode 100644
index cffa8364..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-2 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3-expected.txt
deleted file mode 100644
index 27c718d..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-3 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4-expected.txt
deleted file mode 100644
index eabf2c18..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-4 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5-expected.txt
deleted file mode 100644
index 6c7f267..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-5 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6-expected.txt
deleted file mode 100644
index f739038..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-6 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7-expected.txt
deleted file mode 100644
index 5338052..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-7 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8-expected.txt
deleted file mode 100644
index aa1556a..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-8 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9-expected.txt
deleted file mode 100644
index 5860c42..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL OffscreenCanvas test: 2d.fillStyle.parse.css-color-4-hsla-9 assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https-expected.txt
index 45adc35..2241d7e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https-expected.txt
@@ -6,9 +6,11 @@
 FAIL getStats() with track added via addTransceiver should succeed assert_idl_attribute: Expect pc to have addTransceiver() method property "addTransceiver" not found in prototype chain
 FAIL getStats() with track associated with more than one sender should reject with InvalidAccessError promise_test: Unhandled rejection with value: object "TypeError: pc.addTransceiver is not a function"
 FAIL getStats() with track associated with both sender and receiver should reject with InvalidAccessError pc.addTransceiver is not a function
-FAIL getStats() with no argument should return stats report containing peer-connection stats assert_equals: Expect dictionary.timeStamp to be number expected "number" but got "undefined"
+PASS getStats() with no argument should return stats report containing peer-connection stats on an empty PC
+FAIL getStats() with no argument should return stats report containing peer-connection stats and outbound-track-stats assert_true: Expect statsReport to contain stats object of type outbound-rtp expected true got false
+FAIL getStats() with no argument should return stats for no-stream tracks assert_true: Expect statsReport to contain stats object of type outbound-rtp expected true got false
 FAIL getStats() on track associated with RtpSender should return stats report containing outbound-rtp stats promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'getStats' on 'RTCPeerConnection': The callback provided as parameter 1 is not a function."
 FAIL getStats() on track associated with RtpReceiver should return stats report containing inbound-rtp stats pc.addTransceiver is not a function
-FAIL getStats() with connected peer connections having tracks and data channel should return all mandatory to implement stats assert_unreached: test failed with error: Error: assert_equals: Expect dictionary.timeStamp to be number expected "number" but got "undefined" Reached unreachable code
+FAIL getStats() with connected peer connections having tracks and data channel should return all mandatory to implement stats assert_unreached: test failed with error: Error: assert_equals: Expect dictionary.issuerCertificateId to be string expected "string" but got "undefined" Reached unreachable code
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html
index decac1b..73138507 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html
@@ -122,7 +122,35 @@
       validateStatsReport(statsReport);
       assert_stats_report_has_stats(statsReport, ['peer-connection']);
     });
-  }, 'getStats() with no argument should return stats report containing peer-connection stats');
+  }, 'getStats() with no argument should return stats report containing peer-connection stats on an empty PC');
+
+  promise_test(t => {
+    const pc = new RTCPeerConnection();
+    return getTrackFromUserMedia('audio')
+    .then(([track, mediaStream]) => {
+      pc.addTrack(track, mediaStream);
+      return pc.getStats();
+    })
+    .then(statsReport => {
+      validateStatsReport(statsReport);
+      assert_stats_report_has_stats(statsReport, ['peer-connection']);
+      assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
+    });
+  }, 'getStats() with no argument should return stats report containing peer-connection stats and outbound-track-stats');
+
+  promise_test(t => {
+    const pc = new RTCPeerConnection();
+    return getTrackFromUserMedia('audio')
+    .then(([track, mediaStream]) => {
+      pc.addTrack(track);
+      return pc.getStats();
+    })
+    .then(statsReport => {
+      validateStatsReport(statsReport);
+      assert_stats_report_has_stats(statsReport, ['peer-connection']);
+      assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
+    });
+  }, 'getStats() with no argument should return stats for no-stream tracks');
 
   /*
     8.5.  The stats selection algorithm
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCStats-helper.js b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCStats-helper.js
index 2888246..c2be1b3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCStats-helper.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCStats-helper.js
@@ -136,7 +136,7 @@
     };
  */
 function validateRtcStats(statsReport, stats) {
-  assert_number_field(stats, 'timeStamp');
+  assert_number_field(stats, 'timestamp');
   assert_string_field(stats, 'type');
   assert_string_field(stats, 'id');
 }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
index 7ecee01..ce87ffd 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
index 318da6c..00ddd69 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 62.84x17.69
+    LayoutSVGContainer {g} at (10,0.80) size 12.83x11.60
       LayoutSVGPath {svg:line} at (10,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=0.80] [x2=10.00] [y2=12.40]
       LayoutSVGPath {svg:line} at (22.83,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=22.83] [y1=0.80] [x2=22.83] [y2=12.40]
       LayoutSVGRect {svg:rect} at (10,0.80) size 12.83x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=0.80] [width=12.83] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 125.67x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 125.67x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 41 width 125.68: "Expected 'Text' to be selected, got: 'Te'"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 72.09: "Text to Squeeze"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 2 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
index f69763b..12721b3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
index eab0be2..67dae4f 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 56.20x17.69
+    LayoutSVGContainer {g} at (24.77,0.80) size 5.83x11.60
       LayoutSVGPath {svg:line} at (24.77,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=24.77] [y1=0.80] [x2=24.77] [y2=12.40]
       LayoutSVGPath {svg:line} at (30.59,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=30.59] [y1=0.80] [x2=30.59] [y2=12.40]
       LayoutSVGRect {svg:rect} at (24.77,0.80) size 5.83x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=24.77] [y=0.80] [width=5.83] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 112.39x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 112.39x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 38 width 112.40: "Expected 'to' to be selected, got: 't'"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 72.09: "Text to Squeeze"
-selection start: position 3 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 5 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 7 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
index 8d59ab7..16be009 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
index 929f282..54e34b58 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 61x17.69
+    LayoutSVGContainer {g} at (32.53,0.80) size 12.35x11.60
       LayoutSVGPath {svg:line} at (32.53,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=32.53] [y1=0.80] [x2=32.53] [y2=12.40]
       LayoutSVGPath {svg:line} at (44.88,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=44.88] [y1=0.80] [x2=44.88] [y2=12.40]
       LayoutSVGRect {svg:rect} at (32.53,0.80) size 12.35x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=32.53] [y=0.80] [width=12.35] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 122x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 122x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 40 width 122.00: "Expected 'Squ' to be selected, got: 'o '"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 72.09: "Text to Squeeze"
-selection start: position 6 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
index 9fa6aa1..a8e7366 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
index d47355f..b025c0a 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 96.04x17.69
+    LayoutSVGContainer {g} at (10,0.80) size 50x11.60
       LayoutSVGPath {svg:line} at (10,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=0.80] [x2=10.00] [y2=12.40]
       LayoutSVGPath {svg:line} at (60,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=60.00] [y1=0.80] [x2=60.00] [y2=12.40]
       LayoutSVGRect {svg:rect} at (10,0.80) size 50x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=0.80] [width=50.00] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 192.08x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 192.08x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 61 width 192.08: "Expected 'Text to Squeeze' to be selected, got: 'Text to Squ'"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 72.09: "Text to Squeeze"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 15 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
index 3af71bd0..80c4566 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
index a34e2ce..2d36208 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 73.44x17.69
+    LayoutSVGContainer {g} at (10,0.80) size 40.27x11.60
       LayoutSVGPath {svg:line} at (10,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=0.80] [x2=10.00] [y2=12.40]
       LayoutSVGPath {svg:line} at (50.27,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=50.27] [y1=0.80] [x2=50.27] [y2=12.40]
       LayoutSVGRect {svg:rect} at (10,0.80) size 40.27x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=0.80] [width=40.27] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 146.88x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 146.88x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 48 width 146.88: "Expected 'Text' to be selected, got: 'Text to S'"
     LayoutSVGText {text} at (10,0.80) size 140x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 140x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 64.29: "Text to Stretch"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 9 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
index eb36aae..ce60cf5e 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
index 5a5d783..3169d42 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 74.66x17.69
+    LayoutSVGContainer {g} at (56.36,0.80) size 18.29x11.60
       LayoutSVGPath {svg:line} at (56.36,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=56.36] [y1=0.80] [x2=56.36] [y2=12.40]
       LayoutSVGPath {svg:line} at (74.66,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=74.66] [y1=0.80] [x2=74.66] [y2=12.40]
       LayoutSVGRect {svg:rect} at (56.36,0.80) size 18.29x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=56.36] [y=0.80] [width=18.29] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 119.59x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 119.59x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 40 width 119.60: "Expected 'to' to be selected, got: 'etc'"
     LayoutSVGText {text} at (10,0.80) size 140x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 140x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 64.29: "Text to Stretch"
-selection start: position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 14 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 5 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 7 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
index 8994f6a3..e9525e0 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
index 3e7c979..f6ed3e9d 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
@@ -2,14 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 108.63x17.69
+    LayoutSVGContainer {g} at (80.75,0.80) size 27.87x11.60
       LayoutSVGPath {svg:line} at (80.75,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=80.75] [y1=0.80] [x2=80.75] [y2=12.40]
       LayoutSVGPath {svg:line} at (108.63,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=108.63] [y1=0.80] [x2=108.63] [y2=12.40]
       LayoutSVGRect {svg:rect} at (80.75,0.80) size 27.87x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=80.75] [y=0.80] [width=27.87] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 113.19x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 113.19x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 38 width 113.20: "Expected 'Str' to be selected, got: ''"
     LayoutSVGText {text} at (10,0.80) size 140x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 140x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 64.29: "Text to Stretch"
-caret: position 15 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
index 19350c58..2f3bfdf0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
index c2748530..a7e6d09 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,1) size 61.74x17.49
+    LayoutSVGContainer {g} at (10,1) size 12.79x11.20
       LayoutSVGPath {svg:line} at (10,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=1.00] [x2=10.00] [y2=12.20]
       LayoutSVGPath {svg:line} at (22.79,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=22.79] [y1=1.00] [x2=22.79] [y2=12.20]
       LayoutSVGRect {svg:rect} at (10,1) size 12.79x11.20 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=1.00] [width=12.79] [height=11.20]
-      LayoutSVGText {svg:text} at (0,27.80) size 123.48x9.19 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,27.80) size 123.48x9.19
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 41 width 123.49: "Expected 'Text' to be selected, got: 'Te'"
     LayoutSVGText {text} at (10,1) size 50x11.19 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,1) size 50x11.19
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.71: "Text to Squeeze"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 2 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
index 21e7e7a..899d7f0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
index 78e2951..5a3af16 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,1) size 54.98x17.49
+    LayoutSVGContainer {g} at (24.72,1) size 5.81x11.20
       LayoutSVGPath {svg:line} at (24.72,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=24.72] [y1=1.00] [x2=24.72] [y2=12.20]
       LayoutSVGPath {svg:line} at (30.54,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=30.54] [y1=1.00] [x2=30.54] [y2=12.20]
       LayoutSVGRect {svg:rect} at (24.72,1) size 5.81x11.20 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=24.72] [y=1.00] [width=5.81] [height=11.20]
-      LayoutSVGText {svg:text} at (0,27.80) size 109.95x9.19 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,27.80) size 109.95x9.19
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 38 width 109.95: "Expected 'to' to be selected, got: 't'"
     LayoutSVGText {text} at (10,1) size 50x11.19 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,1) size 50x11.19
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.71: "Text to Squeeze"
-selection start: position 3 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 5 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 7 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
index f2068f1..7a8124d3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
index e772b9c..0bde10f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,1) size 59.98x17.49
+    LayoutSVGContainer {g} at (32.48,1) size 12.41x11.20
       LayoutSVGPath {svg:line} at (32.48,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=32.48] [y1=1.00] [x2=32.48] [y2=12.20]
       LayoutSVGPath {svg:line} at (44.88,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=44.88] [y1=1.00] [x2=44.88] [y2=12.20]
       LayoutSVGRect {svg:rect} at (32.48,1) size 12.41x11.20 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=32.48] [y=1.00] [width=12.41] [height=11.20]
-      LayoutSVGText {svg:text} at (0,27.80) size 119.95x9.19 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,27.80) size 119.95x9.19
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 40 width 119.96: "Expected 'Squ' to be selected, got: 'o '"
     LayoutSVGText {text} at (10,1) size 50x11.19 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,1) size 50x11.19
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.71: "Text to Squeeze"
-selection start: position 6 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
index a1a85db..4107288 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
index ce3483b..b4939717 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,1) size 94.63x17.49
+    LayoutSVGContainer {g} at (10,1) size 50x11.20
       LayoutSVGPath {svg:line} at (10,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=1.00] [x2=10.00] [y2=12.20]
       LayoutSVGPath {svg:line} at (60,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=60.00] [y1=1.00] [x2=60.00] [y2=12.20]
       LayoutSVGRect {svg:rect} at (10,1) size 50x11.20 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=1.00] [width=50.00] [height=11.20]
-      LayoutSVGText {svg:text} at (0,27.80) size 189.25x9.19 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,27.80) size 189.25x9.19
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 61 width 189.26: "Expected 'Text to Squeeze' to be selected, got: 'Text to Squ'"
     LayoutSVGText {text} at (10,1) size 50x11.19 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,1) size 50x11.19
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.71: "Text to Squeeze"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 15 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
index ed011e9..a36985f8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
index cd513ff..ecf9da71 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,1) size 72.19x17.49
+    LayoutSVGContainer {g} at (10,1) size 40.17x11.20
       LayoutSVGPath {svg:line} at (10,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=1.00] [x2=10.00] [y2=12.20]
       LayoutSVGPath {svg:line} at (50.17,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=50.17] [y1=1.00] [x2=50.17] [y2=12.20]
       LayoutSVGRect {svg:rect} at (10,1) size 40.17x11.20 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=1.00] [width=40.17] [height=11.20]
-      LayoutSVGText {svg:text} at (0,27.80) size 144.38x9.19 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,27.80) size 144.38x9.19
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 48 width 144.38: "Expected 'Text' to be selected, got: 'Text to S'"
     LayoutSVGText {text} at (10,1) size 140x11.19 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,1) size 140x11.19
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 63.92: "Text to Stretch"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 9 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
index 482620e2..4a75538 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
index f78a385e..6017474d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,1) size 74.52x17.49
+    LayoutSVGContainer {g} at (56.26,1) size 18.27x11.20
       LayoutSVGPath {svg:line} at (56.26,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=56.26] [y1=1.00] [x2=56.26] [y2=12.20]
       LayoutSVGPath {svg:line} at (74.52,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=74.52] [y1=1.00] [x2=74.52] [y2=12.20]
       LayoutSVGRect {svg:rect} at (56.26,1) size 18.27x11.20 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=56.26] [y=1.00] [width=18.27] [height=11.20]
-      LayoutSVGText {svg:text} at (0,27.80) size 117.05x9.19 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,27.80) size 117.05x9.19
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 40 width 117.05: "Expected 'to' to be selected, got: 'etc'"
     LayoutSVGText {text} at (10,1) size 140x11.19 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,1) size 140x11.19
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 63.92: "Text to Stretch"
-selection start: position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 14 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 5 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 7 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
index fae63176..2ce380655 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
index 83d9c5e0..327584b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
@@ -2,14 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,1) size 108.60x17.49
+    LayoutSVGContainer {g} at (80.61,1) size 28x11.20
       LayoutSVGPath {svg:line} at (80.61,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=80.61] [y1=1.00] [x2=80.61] [y2=12.20]
       LayoutSVGPath {svg:line} at (108.60,1) size 0x11.20 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=108.60] [y1=1.00] [x2=108.60] [y2=12.20]
       LayoutSVGRect {svg:rect} at (80.61,1) size 28x11.20 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=80.61] [y=1.00] [width=27.99] [height=11.20]
-      LayoutSVGText {svg:text} at (0,27.80) size 110.84x9.19 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,27.80) size 110.84x9.19
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 38 width 110.84: "Expected 'Str' to be selected, got: ''"
     LayoutSVGText {text} at (10,1) size 140x11.19 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,1) size 140x11.19
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 63.92: "Text to Stretch"
-caret: position 15 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 63f9df1..f0ce0bc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -620,6 +620,7 @@
     getter effectiveType
     getter onchange
     getter rtt
+    getter saveData
     method constructor
     setter onchange
 interface Notification : EventTarget
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
index bf865d3..aa2ada4 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
index e20539eb1..bb1942d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 61.23x17.69
+    LayoutSVGContainer {g} at (10,0.80) size 12.72x11.60
       LayoutSVGPath {svg:line} at (10,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=0.80] [x2=10.00] [y2=12.40]
       LayoutSVGPath {svg:line} at (22.72,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=22.72] [y1=0.80] [x2=22.72] [y2=12.40]
       LayoutSVGRect {svg:rect} at (10,0.80) size 12.72x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=0.80] [width=12.72] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 122.47x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 122.47x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 41 width 122.48: "Expected 'Text' to be selected, got: 'Te'"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.89: "Text to Squeeze"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 2 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
index c0ae434..eb4dbae2 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
index a24ab41..f629e60 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 54.59x17.69
+    LayoutSVGContainer {g} at (24.67,0.80) size 5.84x11.60
       LayoutSVGPath {svg:line} at (24.67,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=24.67] [y1=0.80] [x2=24.67] [y2=12.40]
       LayoutSVGPath {svg:line} at (30.51,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=30.51] [y1=0.80] [x2=30.51] [y2=12.40]
       LayoutSVGRect {svg:rect} at (24.67,0.80) size 5.84x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=24.67] [y=0.80] [width=5.84] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 109.19x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 109.19x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 38 width 109.20: "Expected 'to' to be selected, got: 't'"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.89: "Text to Squeeze"
-selection start: position 3 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 5 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 7 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
index 49f892a..d143bd4 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
index 40db483..1911087 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 59.59x17.69
+    LayoutSVGContainer {g} at (32.46,0.80) size 12.38x11.60
       LayoutSVGPath {svg:line} at (32.46,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=32.46] [y1=0.80] [x2=32.46] [y2=12.40]
       LayoutSVGPath {svg:line} at (44.84,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=44.84] [y1=0.80] [x2=44.84] [y2=12.40]
       LayoutSVGRect {svg:rect} at (32.46,0.80) size 12.38x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=32.46] [y=0.80] [width=12.38] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 119.19x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 119.19x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 40 width 119.20: "Expected 'Squ' to be selected, got: 'o '"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.89: "Text to Squeeze"
-selection start: position 6 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
index 6bc1d7b..fe6c40d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
index 5f999bb..8dfa525a 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 93.04x17.69
+    LayoutSVGContainer {g} at (10,0.80) size 50x11.60
       LayoutSVGPath {svg:line} at (10,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=0.80] [x2=10.00] [y2=12.40]
       LayoutSVGPath {svg:line} at (60,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=60.00] [y1=0.80] [x2=60.00] [y2=12.40]
       LayoutSVGRect {svg:rect} at (10,0.80) size 50x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=0.80] [width=50.00] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 186.08x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 186.08x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 61 width 186.08: "Expected 'Text to Squeeze' to be selected, got: 'Text to Squ'"
     LayoutSVGText {text} at (10,0.80) size 50x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 50x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 71.89: "Text to Squeeze"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 15 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
index 9f08312..c096dbf1 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
index 0074dd97..e49497a 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-1-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 71.23x17.69
+    LayoutSVGContainer {g} at (10,0.80) size 39.96x11.60
       LayoutSVGPath {svg:line} at (10,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=10.00] [y1=0.80] [x2=10.00] [y2=12.40]
       LayoutSVGPath {svg:line} at (49.96,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=49.96] [y1=0.80] [x2=49.96] [y2=12.40]
       LayoutSVGRect {svg:rect} at (10,0.80) size 39.96x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=10.00] [y=0.80] [width=39.96] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 142.47x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 142.47x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 48 width 142.48: "Expected 'Text' to be selected, got: 'Text to S'"
     LayoutSVGText {text} at (10,0.80) size 140x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 140x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 64.09: "Text to Stretch"
 selection start: position 0 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 9 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 4 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
index 68b6db1..57a53fb 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
index a6eadfffc..af70477 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.txt
@@ -2,15 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 74.42x17.69
+    LayoutSVGContainer {g} at (56.07,0.80) size 18.35x11.60
       LayoutSVGPath {svg:line} at (56.07,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=56.07] [y1=0.80] [x2=56.07] [y2=12.40]
       LayoutSVGPath {svg:line} at (74.42,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=74.42] [y1=0.80] [x2=74.42] [y2=12.40]
       LayoutSVGRect {svg:rect} at (56.07,0.80) size 18.35x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=56.07] [y=0.80] [width=18.35] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 116.39x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 116.39x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 40 width 116.40: "Expected 'to' to be selected, got: 'etc'"
     LayoutSVGText {text} at (10,0.80) size 140x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 140x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 64.09: "Text to Stretch"
-selection start: position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
-selection end:   position 14 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 5 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 7 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
index 6614436..895d34c6 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
index 6cda5b6..947e36c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.txt
@@ -2,14 +2,12 @@
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
   LayoutSVGRoot {svg} at (0,0) size 800x600
-    LayoutSVGContainer {g} at (0,0.80) size 108.50x17.69
+    LayoutSVGContainer {g} at (80.54,0.80) size 27.96x11.60
       LayoutSVGPath {svg:line} at (80.54,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=80.54] [y1=0.80] [x2=80.54] [y2=12.40]
       LayoutSVGPath {svg:line} at (108.50,0.80) size 0x11.60 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#000000]}] [x1=108.50] [y1=0.80] [x2=108.50] [y2=12.40]
       LayoutSVGRect {svg:rect} at (80.54,0.80) size 27.96x11.40 [fill={[type=SOLID] [color=#FF0000] [opacity=0.40]}] [x=80.54] [y=0.80] [width=27.96] [height=11.40]
-      LayoutSVGText {svg:text} at (0,28.19) size 110.39x8.80 [transform={m=((0.50,0.00)(0.00,0.50)) t=(0.00,0.00)}] contains 1 chunk(s)
-        LayoutSVGInlineText {#text} at (0,28.19) size 110.39x8.80
-          chunk 1 text run 1 at (0.00,35.00) startOffset 0 endOffset 38 width 110.40: "Expected 'Str' to be selected, got: ''"
     LayoutSVGText {text} at (10,0.80) size 140x11.39 contains 1 chunk(s)
       LayoutSVGInlineText {#text} at (10,0.80) size 140x11.39
         chunk 1 text run 1 at (10.00,10.00) startOffset 0 endOffset 15 width 64.09: "Text to Stretch"
-caret: position 15 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection start: position 8 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
+selection end:   position 11 of child 0 {#text} of child 5 {text} of child 0 {svg} of document
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 63f9df1..f0ce0bc 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
@@ -620,6 +620,7 @@
     getter effectiveType
     getter onchange
     getter rtt
+    getter saveData
     method constructor
     setter onchange
 interface Notification : EventTarget
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 9c6a6bf7..bbf6842 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
@@ -600,6 +600,7 @@
 [Worker]     getter effectiveType
 [Worker]     getter onchange
 [Worker]     getter rtt
+[Worker]     getter saveData
 [Worker]     method constructor
 [Worker]     setter onchange
 [Worker] interface Notification : EventTarget
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 5aad7c67..247bb61 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
@@ -3760,6 +3760,7 @@
     getter effectiveType
     getter onchange
     getter rtt
+    getter saveData
     method constructor
     setter onchange
 interface Node : EventTarget
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 cc84aca..49b14b46 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
@@ -595,6 +595,7 @@
 [Worker]     getter effectiveType
 [Worker]     getter onchange
 [Worker]     getter rtt
+[Worker]     getter saveData
 [Worker]     method constructor
 [Worker]     setter onchange
 [Worker] interface Notification : EventTarget
diff --git a/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp b/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
index b68dbcd3..cff0b10e 100644
--- a/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
+++ b/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
@@ -31,6 +31,17 @@
 #include "platform/fonts/FontFaceCreationParams.h"
 #include "platform/fonts/SimpleFontData.h"
 
+namespace {
+// An excessive amount of SimpleFontData objects is generated from
+// CSSFontFaceSource if a lot of varying FontDescriptions point to a web
+// font. These FontDescriptions can vary in size, font-feature-settings or
+// font-variation settings. Well known cases are animations of font-variation
+// settings, compare crbug.com/778352. For a start, let's reduce this number to
+// 1024, which is still a large number and should have enough steps for font
+// animations from the same font face source, but avoids unbounded growth.
+const size_t kMaxCachedFontData = 1024;
+}  // namespace
+
 namespace blink {
 
 CSSFontFaceSource::~CSSFontFaceSource() = default;
@@ -53,11 +64,28 @@
       font_data_table_.insert(key, nullptr).stored_value->value;
   if (!font_data)
     font_data = CreateFontData(font_description, font_selection_capabilities);
+
+  font_cache_key_age.PrependOrMoveToFirst(key);
+  PruneOldestIfNeeded();
+
+  DCHECK_LE(font_data_table_.size(), kMaxCachedFontData);
   // No release, because fontData is a reference to a RefPtr that is held in the
   // font_data_table_.
   return font_data;
 }
 
+void CSSFontFaceSource::PruneOldestIfNeeded() {
+  if (font_cache_key_age.size() > kMaxCachedFontData) {
+    DCHECK_EQ(font_cache_key_age.size() - 1, kMaxCachedFontData);
+    FontCacheKey& key = font_cache_key_age.back();
+    font_cache_key_age.pop_back();
+    auto font_data_entry = font_data_table_.Take(key);
+    DCHECK_EQ(font_cache_key_age.size(), kMaxCachedFontData);
+    if (font_data_entry && font_data_entry->GetCustomFontData())
+      font_data_entry->GetCustomFontData()->ClearFontFaceSource();
+  }
+}
+
 void CSSFontFaceSource::PruneTable() {
   if (font_data_table_.IsEmpty())
     return;
@@ -67,6 +95,7 @@
     if (font_data && font_data->GetCustomFontData())
       font_data->GetCustomFontData()->ClearFontFaceSource();
   }
+  font_cache_key_age.clear();
   font_data_table_.clear();
 }
 
diff --git a/third_party/WebKit/Source/core/css/CSSFontFaceSource.h b/third_party/WebKit/Source/core/css/CSSFontFaceSource.h
index edb66950..e78293b 100644
--- a/third_party/WebKit/Source/core/css/CSSFontFaceSource.h
+++ b/third_party/WebKit/Source/core/css/CSSFontFaceSource.h
@@ -33,6 +33,7 @@
 #include "platform/heap/Handle.h"
 #include "platform/wtf/Allocator.h"
 #include "platform/wtf/HashMap.h"
+#include "platform/wtf/LinkedHashSet.h"
 
 namespace blink {
 
@@ -71,12 +72,16 @@
   void PruneTable();
 
  private:
+  void PruneOldestIfNeeded();
   using FontDataTable = HashMap<FontCacheKey,
                                 scoped_refptr<SimpleFontData>,
                                 FontCacheKeyHash,
                                 FontCacheKeyTraits>;
+  using FontCacheKeyAgeList =
+      LinkedHashSet<FontCacheKey, FontCacheKeyHash, FontCacheKeyTraits>;
 
   FontDataTable font_data_table_;
+  FontCacheKeyAgeList font_cache_key_age;
   DISALLOW_COPY_AND_ASSIGN(CSSFontFaceSource);
 };
 
diff --git a/third_party/WebKit/Source/core/css/CSSFontFaceSourceTest.cpp b/third_party/WebKit/Source/core/css/CSSFontFaceSourceTest.cpp
index ce9c813..64e1a3ce 100644
--- a/third_party/WebKit/Source/core/css/CSSFontFaceSourceTest.cpp
+++ b/third_party/WebKit/Source/core/css/CSSFontFaceSourceTest.cpp
@@ -56,4 +56,27 @@
             font_face_source.GetFontDataForSize(4925));
 }
 
+// Exercises the size font_data_table_ assertions in CSSFontFaceSource.
+TEST(CSSFontFaceSourceTest, UnboundedGrowth) {
+  DummyFontFaceSource font_face_source;
+  FontDescription font_description_variable;
+  FontSelectionCapabilities normal_capabilities(
+      {NormalWidthValue(), NormalWidthValue()},
+      {NormalSlopeValue(), NormalSlopeValue()},
+      {NormalWeightValue(), NormalWeightValue()});
+
+  // Roughly 3000 font variants.
+  for (float wght = 700; wght < 705; wght += 1 / 6.f) {
+    for (float wdth = 100; wdth < 125; wdth += 1 / 4.f) {
+      scoped_refptr<FontVariationSettings> variation_settings =
+          FontVariationSettings::Create();
+      variation_settings->Append(FontVariationAxis("wght", wght));
+      variation_settings->Append(FontVariationAxis("wdth", wdth));
+      font_description_variable.SetVariationSettings(variation_settings);
+      font_face_source.GetFontData(font_description_variable,
+                                   normal_capabilities);
+    }
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
index 0eb2f43..bc225c0 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -604,20 +604,32 @@
   return args.AtEnd();
 }
 
-static bool ParseHSLParameters(CSSParserTokenRange& range,
-                               RGBA32& result,
-                               bool parse_alpha) {
+static bool ParseHSLParameters(CSSParserTokenRange& range, RGBA32& result) {
   DCHECK(range.Peek().FunctionId() == CSSValueHsl ||
          range.Peek().FunctionId() == CSSValueHsla);
   CSSParserTokenRange args = ConsumeFunction(range);
-  CSSPrimitiveValue* hsl_value = ConsumeNumber(args, kValueRangeAll);
-  if (!hsl_value)
-    return false;
-  double color_array[3];
-  color_array[0] = (((hsl_value->GetIntValue() % 360) + 360) % 360) / 360.0;
-  for (int i = 1; i < 3; i++) {
-    if (!ConsumeCommaIncludingWhitespace(args))
+  CSSPrimitiveValue* hsl_value = ConsumeAngle(args, nullptr, WTF::nullopt);
+  double angle_value;
+  if (!hsl_value) {
+    hsl_value = ConsumeNumber(args, kValueRangeAll);
+    if (!hsl_value)
       return false;
+    angle_value = hsl_value->GetDoubleValue();
+  } else {
+    angle_value = hsl_value->ComputeDegrees();
+  }
+  double color_array[3];
+  color_array[0] = fmod(fmod(angle_value, 360.0) + 360.0, 360.0) / 60.0;
+  bool requires_commas = false;
+  for (int i = 1; i < 3; i++) {
+    if (ConsumeCommaIncludingWhitespace(args)) {
+      if (i != 1 && !requires_commas)
+        return false;
+      requires_commas = true;
+    } else if (requires_commas || args.AtEnd() ||
+               (&args.Peek() - 1)->GetType() != kWhitespaceToken) {
+      return false;
+    }
     hsl_value = ConsumePercent(args, kValueRangeAll);
     if (!hsl_value)
       return false;
@@ -625,12 +637,21 @@
     color_array[i] = clampTo<double>(double_value, 0.0, 100.0) /
                      100.0;  // Needs to be value between 0 and 1.0.
   }
+
   double alpha = 1.0;
-  if (parse_alpha) {
-    if (!ConsumeCommaIncludingWhitespace(args))
-      return false;
-    if (!ConsumeNumberRaw(args, alpha))
-      return false;
+  bool comma_consumed = ConsumeCommaIncludingWhitespace(args);
+  bool slash_consumed = ConsumeSlashIncludingWhitespace(args);
+  if ((comma_consumed && !requires_commas) ||
+      (slash_consumed && requires_commas))
+    return false;
+  if (comma_consumed || slash_consumed) {
+    if (!ConsumeNumberRaw(args, alpha)) {
+      CSSPrimitiveValue* alpha_percent = ConsumePercent(args, kValueRangeAll);
+      if (!alpha_percent)
+        return false;
+      else
+        alpha = alpha_percent->GetDoubleValue() / 100.0f;
+    }
     alpha = clampTo<double>(alpha, 0.0, 1.0);
   }
   result =
@@ -680,8 +701,7 @@
   CSSParserTokenRange color_range = range;
   if ((function_id <= CSSValueRgba &&
        !ParseRGBParameters(color_range, result)) ||
-      (function_id >= CSSValueHsl &&
-       !ParseHSLParameters(color_range, result, function_id == CSSValueHsla)))
+      (function_id >= CSSValueHsl && !ParseHSLParameters(color_range, result)))
     return false;
   range = color_range;
   return true;
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp
index 16cc440..940b57a 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp
@@ -203,7 +203,7 @@
 
   int offset = closest_distance_box->OffsetForPositionInFragment(
       *closest_distance_fragment,
-      LayoutUnit(absolute_point.X() - closest_distance_position), true);
+      absolute_point.X() - closest_distance_position);
   return CreatePositionWithAffinity(offset + closest_distance_box->Start(),
                                     offset > 0
                                         ? TextAffinity::kUpstreamIfPossible
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h b/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h
index 4463932..182735e 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h
+++ b/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h
@@ -82,6 +82,8 @@
     return BuildNormalFragmentTransform();
   }
 
+  bool AffectedByTextLength() const { return length_adjust_scale != 1; }
+
   bool IsTransformed() const {
     return AffectedByTextLength() || !transform.IsIdentity();
   }
@@ -106,7 +108,7 @@
   // (see SVGTextLayoutEngine, which builds this transformation).
   AffineTransform transform;
 
-  // Contains lengthAdjust related transformations, which are not allowd to
+  // Contains lengthAdjust related transformations, which are not allowed to
   // influence the SVGTextQuery code.
   float length_adjust_scale;
   float length_adjust_bias;
@@ -118,8 +120,6 @@
     return BuildTransformForTextOnLine();
   }
 
-  bool AffectedByTextLength() const { return length_adjust_scale != 1; }
-
   void TransformAroundOrigin(AffineTransform& result) const {
     // Returns (translate(x, y) * result) * translate(-x, -y).
     result.SetE(result.E() + x);
diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
index 6171971..de209c95 100644
--- a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
@@ -67,29 +67,24 @@
 
 int SVGInlineTextBox::OffsetForPositionInFragment(
     const SVGTextFragment& fragment,
-    LayoutUnit position,
-    bool include_partial_glyphs) const {
+    float position) const {
   LineLayoutSVGInlineText line_layout_item =
       LineLayoutSVGInlineText(GetLineLayoutItem());
 
-  float scaling_factor = line_layout_item.ScalingFactor();
-  DCHECK(scaling_factor);
+  // Adjust position for the scaled font size.
+  DCHECK(line_layout_item.ScalingFactor());
+  position *= line_layout_item.ScalingFactor();
 
-  const ComputedStyle& style = line_layout_item.StyleRef();
+  // If this fragment is subjected to 'textLength' glyph adjustments, then
+  // apply the inverse to the position within the fragment.
+  if (fragment.AffectedByTextLength())
+    position /= fragment.length_adjust_scale;
 
-  TextRun text_run = ConstructTextRun(style, fragment);
-
-  // Eventually handle lengthAdjust="spacingAndGlyphs".
-  // FIXME: Handle vertical text.
-  if (fragment.IsTransformed()) {
-    AffineTransform fragment_transform = fragment.BuildFragmentTransform();
-    text_run.SetHorizontalGlyphStretch(
-        clampTo<float>(fragment_transform.XScale()));
-  }
-
+  const bool include_partial_glyphs = true;
+  TextRun text_run = ConstructTextRun(line_layout_item.StyleRef(), fragment);
   return fragment.character_offset - Start() +
          line_layout_item.ScaledFont().OffsetForPosition(
-             text_run, position * scaling_factor, include_partial_glyphs);
+             text_run, position, include_partial_glyphs);
 }
 
 LayoutUnit SVGInlineTextBox::PositionForOffset(int) const {
diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.h b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.h
index d509687d..66923f85 100644
--- a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.h
+++ b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.h
@@ -71,9 +71,7 @@
     starts_new_text_chunk_ = new_text_chunk;
   }
 
-  int OffsetForPositionInFragment(const SVGTextFragment&,
-                                  LayoutUnit position,
-                                  bool include_partial_glyphs) const;
+  int OffsetForPositionInFragment(const SVGTextFragment&, float position) const;
   FloatRect SelectionRectForTextFragment(const SVGTextFragment&,
                                          int fragment_start_position,
                                          int fragment_end_position,
diff --git a/third_party/WebKit/Source/platform/graphics/Color.cpp b/third_party/WebKit/Source/platform/graphics/Color.cpp
index e2a3117..42c632b1 100644
--- a/third_party/WebKit/Source/platform/graphics/Color.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Color.cpp
@@ -73,23 +73,23 @@
 
 static double CalcHue(double temp1, double temp2, double hue_val) {
   if (hue_val < 0.0)
-    hue_val++;
-  else if (hue_val > 1.0)
-    hue_val--;
-  if (hue_val * 6.0 < 1.0)
-    return temp1 + (temp2 - temp1) * hue_val * 6.0;
-  if (hue_val * 2.0 < 1.0)
+    hue_val += 6.0;
+  else if (hue_val >= 6.0)
+    hue_val -= 6.0;
+  if (hue_val < 1.0)
+    return temp1 + (temp2 - temp1) * hue_val;
+  if (hue_val < 3.0)
     return temp2;
-  if (hue_val * 3.0 < 2.0)
-    return temp1 + (temp2 - temp1) * (2.0 / 3.0 - hue_val) * 6.0;
+  if (hue_val < 4.0)
+    return temp1 + (temp2 - temp1) * (4.0 - hue_val);
   return temp1;
 }
 
-// Explanation of this algorithm can be found in the CSS3 Color Module
-// specification at http://www.w3.org/TR/css3-color/#hsl-color with further
-// explanation available at http://en.wikipedia.org/wiki/HSL_color_space
+// Explanation of this algorithm can be found in the CSS Color 4 Module
+// specification at https://drafts.csswg.org/css-color-4/#hsl-to-rgb with
+// further explanation available at http://en.wikipedia.org/wiki/HSL_color_space
 
-// all values are in the range of 0 to 1.0
+// Hue is in the range of 0 to 6.0, the remainder are in the range 0 to 1.0
 RGBA32 MakeRGBAFromHSLA(double hue,
                         double saturation,
                         double lightness,
@@ -102,15 +102,15 @@
                     static_cast<int>(alpha * scale_factor));
   }
 
-  double temp2 = lightness < 0.5
+  double temp2 = lightness <= 0.5
                      ? lightness * (1.0 + saturation)
                      : lightness + saturation - lightness * saturation;
   double temp1 = 2.0 * lightness - temp2;
 
   return MakeRGBA(
-      static_cast<int>(CalcHue(temp1, temp2, hue + 1.0 / 3.0) * scale_factor),
+      static_cast<int>(CalcHue(temp1, temp2, hue + 2.0) * scale_factor),
       static_cast<int>(CalcHue(temp1, temp2, hue) * scale_factor),
-      static_cast<int>(CalcHue(temp1, temp2, hue - 1.0 / 3.0) * scale_factor),
+      static_cast<int>(CalcHue(temp1, temp2, hue - 2.0) * scale_factor),
       static_cast<int>(alpha * scale_factor));
 }
 
diff --git a/third_party/WebKit/Source/platform/runtime_enabled_features.json5 b/third_party/WebKit/Source/platform/runtime_enabled_features.json5
index 8f22b93..3c1f602 100644
--- a/third_party/WebKit/Source/platform/runtime_enabled_features.json5
+++ b/third_party/WebKit/Source/platform/runtime_enabled_features.json5
@@ -683,7 +683,7 @@
     },
     {
       name: "NetInfoSaveData",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "NetworkService",
diff --git a/third_party/WebKit/Source/platform/text/TextRun.cpp b/third_party/WebKit/Source/platform/text/TextRun.cpp
index 6bbd56de..46ec0d0 100644
--- a/third_party/WebKit/Source/platform/text/TextRun.cpp
+++ b/third_party/WebKit/Source/platform/text/TextRun.cpp
@@ -34,9 +34,7 @@
   DISALLOW_NEW();
   const void* pointer;
   int integers[2];
-  float float1;
-  float float2;
-  float float3;
+  float floats[2];
   uint32_t bitfields : 10;
   TabSize tab_size;
 };
diff --git a/third_party/WebKit/Source/platform/text/TextRun.h b/third_party/WebKit/Source/platform/text/TextRun.h
index 7e879aca..b7e2743 100644
--- a/third_party/WebKit/Source/platform/text/TextRun.h
+++ b/third_party/WebKit/Source/platform/text/TextRun.h
@@ -67,7 +67,6 @@
       : characters_length_(len),
         len_(len),
         xpos_(xpos),
-        horizontal_glyph_stretch_(1),
         expansion_(expansion),
         expansion_behavior_(expansion_behavior),
         is8_bit_(true),
@@ -92,7 +91,6 @@
       : characters_length_(len),
         len_(len),
         xpos_(xpos),
-        horizontal_glyph_stretch_(1),
         expansion_(expansion),
         expansion_behavior_(expansion_behavior),
         is8_bit_(false),
@@ -116,7 +114,6 @@
       : characters_length_(string.length()),
         len_(string.length()),
         xpos_(xpos),
-        horizontal_glyph_stretch_(1),
         expansion_(expansion),
         expansion_behavior_(expansion_behavior),
         allow_tabs_(false),
@@ -226,10 +223,6 @@
   void SetExpansionBehavior(ExpansionBehavior behavior) {
     expansion_behavior_ = behavior;
   }
-  float HorizontalGlyphStretch() const { return horizontal_glyph_stretch_; }
-  void SetHorizontalGlyphStretch(float scale) {
-    horizontal_glyph_stretch_ = scale;
-  }
 
   bool AllowTabs() const { return allow_tabs_; }
   TabSize GetTabSize() const { return tab_size_; }
@@ -288,7 +281,6 @@
   // alignment or center alignment, left start of the text line is not the same
   // as left start of the containing block.
   float xpos_;
-  float horizontal_glyph_stretch_;
 
   float expansion_;
   ExpansionBehavior expansion_behavior_ : 2;
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py
index ce062d76..907a10b8 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py
@@ -2,6 +2,13 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+"""A limited finder & parser for Chromium OWNERS files.
+
+This module is intended to be used within LayoutTests/external and is
+informative only. For authoritative uses, please rely on `git cl owners`.
+For example, it does not support directives other than email addresses.
+"""
+
 import collections
 import re
 
@@ -12,8 +19,8 @@
 
 # Format of OWNERS files can be found at //src/third_party/depot_tools/owners.py
 # In our use case (under external/wpt), we only process the first enclosing
-# non-empty OWNERS file for any given path (i.e. always assuming "set noparent"),
-# and we only care about lines that are valid email addresses.
+# OWNERS file for any given path (i.e. always assuming "set noparent"), and we
+# ignore "per-file:" lines, "file:" directives, etc.
 
 # Recognizes 'X@Y' email addresses. Very simplistic. (from owners.py)
 BASIC_EMAIL_REGEXP = r'^[\w\-\+\%\.]+\@[\w\-\+\%\.]+$'
@@ -39,60 +46,59 @@
             owned directories (paths relative to the root of layout tests).
         """
         email_map = collections.defaultdict(set)
+        external_root_owners = self.finder.path_from_layout_tests('external', 'OWNERS')
         for relpath in changed_files:
+            # Try to find the first *non-empty* OWNERS file.
             absolute_path = self.finder.path_from_chromium_base(relpath)
-            if not absolute_path.startswith(self.finder.layout_tests_dir()):
+            owners = None
+            owners_file = self.find_owners_file(absolute_path)
+            while owners_file:
+                owners = self.extract_owners(owners_file)
+                if owners:
+                    break
+                # Found an empty OWNERS file. Try again from the parent directory.
+                absolute_path = self.filesystem.dirname(self.filesystem.dirname(owners_file))
+                owners_file = self.find_owners_file(absolute_path)
+            # Skip LayoutTests/external/OWNERS.
+            if not owners or owners_file == external_root_owners:
                 continue
-            owners_file = self.find_owners_file(self.filesystem.dirname(relpath))
-            if not owners_file:
-                continue
-            owners = self.extract_owners(owners_file)
+
             owned_directory = self.filesystem.dirname(owners_file)
             owned_directory_relpath = self.filesystem.relpath(owned_directory, self.finder.layout_tests_dir())
             email_map[tuple(owners)].add(owned_directory_relpath)
         return {owners: sorted(owned_directories) for owners, owned_directories in email_map.iteritems()}
 
-    # TODO(robertma): Do we really need to worry about empty OWNERS files?
-    def find_owners_file(self, start_directory):
-        """Find the first enclosing OWNERS file for a given path.
+    def find_owners_file(self, start_path):
+        """Finds the first enclosing OWNERS file for a given path.
 
-        Starting from the given directory, walks up the directory tree until the
-        first non-empty OWNERS file is found or LayoutTests/external is reached.
-        (OWNERS files with no valid emails are also considered empty.)
+        Starting from the given path, walks up the directory tree until the
+        first OWNERS file is found or LayoutTests/external is reached.
 
         Args:
-            start_directory: A relative path from the root of the repository, or
-                an absolute path.
+            start_path: A relative path from the root of the repository, or an
+                absolute path. The path can be a file or a directory.
 
         Returns:
-            The absolute path to the first non-empty OWNERS file found, or None
-            if not found.
+            The absolute path to the first OWNERS file found; None if not found
+            or if start_path is outside of LayoutTests/external.
         """
-        if self.filesystem.isabs(start_directory):
-            directory = start_directory
-        else:
-            directory = self.finder.path_from_chromium_base(start_directory)
+        abs_start_path = (start_path if self.filesystem.isabs(start_path)
+                          else self.finder.path_from_chromium_base(start_path))
+        directory = (abs_start_path if self.filesystem.isdir(abs_start_path)
+                     else self.filesystem.dirname(abs_start_path))
         external_root = self.finder.path_from_layout_tests('external')
-        # Changes to both LayoutTests/TestExpectations and the entire
-        # LayoutTests/FlagExpectations/ directory should be skipped and not
-        # raise an assertion.
-        if directory == self.finder.layout_tests_dir() or \
-           directory.startswith(self.finder.path_from_layout_tests('FlagExpectations')):
+        if not directory.startswith(external_root):
             return None
-        assert directory.startswith(external_root), '%s must start with %s' % (
-            directory, external_root)
-        while directory != external_root:
+        # Stop at LayoutTests, which is the parent of external_root.
+        while directory != self.finder.layout_tests_dir():
             owners_file = self.filesystem.join(directory, 'OWNERS')
             if self.filesystem.isfile(self.finder.path_from_chromium_base(owners_file)):
-                # TODO(robertma): Avoid parsing the file twice (find_owners_file
-                # only returns the path, which is read and parsed again later).
-                if self.extract_owners(owners_file):
-                    return owners_file
+                return owners_file
             directory = self.filesystem.dirname(directory)
         return None
 
     def extract_owners(self, owners_file):
-        """Extract owners from an OWNERS file.
+        """Extracts owners from an OWNERS file.
 
         Args:
             owners_file: An absolute path to an OWNERS file.
@@ -110,7 +116,7 @@
         return addresses
 
     def extract_component(self, owners_file):
-        """Extract the component from an OWNERS file.
+        """Extracts the component from an OWNERS file.
 
         Args:
             owners_file: An absolute path to an OWNERS file.
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor_unittest.py
index 2b810c4..e423775 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor_unittest.py
@@ -14,77 +14,120 @@
 class DirectoryOwnersExtractorTest(unittest.TestCase):
 
     def setUp(self):
-        self.filesystem = MockFileSystem()
+        # We always have an OWNERS file at LayoutTests/external.
+        self.filesystem = MockFileSystem(files={
+            '/mock-checkout/third_party/WebKit/LayoutTests/external/OWNERS': 'ecosystem-infra@chromium.org'
+        })
         self.extractor = DirectoryOwnersExtractor(self.filesystem)
 
-    def test_list_owners(self):
-        self.filesystem.files = {
+    def _write_files(self, files):
+        # Use write_text_file instead of directly assigning to filesystem.files
+        # so that intermediary directories are correctly created, too.
+        for path, contents in files.iteritems():
+            self.filesystem.write_text_file(path, contents)
+
+    def test_list_owners_combines_same_owners(self):
+        self._write_files({
             ABS_WPT_BASE + '/foo/x.html': '',
             ABS_WPT_BASE + '/foo/OWNERS': 'a@chromium.org\nc@chromium.org\n',
             ABS_WPT_BASE + '/bar/x/y.html': '',
             ABS_WPT_BASE + '/bar/OWNERS': 'a@chromium.org\nc@chromium.org\n',
-            ABS_WPT_BASE + '/baz/x/y.html': '',
-            ABS_WPT_BASE + '/baz/x/OWNERS': 'b@chromium.org\n',
-            ABS_WPT_BASE + '/quux/x/y.html': '',
-        }
+        })
         changed_files = [
-            # Same owners:
             REL_WPT_BASE + '/foo/x.html',
             REL_WPT_BASE + '/bar/x/y.html',
-            # Same owned directories:
-            REL_WPT_BASE + '/baz/x/y.html',
-            REL_WPT_BASE + '/baz/x/z.html',
-            # Owners not found:
-            REL_WPT_BASE + '/quux/x/y.html',
         ]
         self.assertEqual(
             self.extractor.list_owners(changed_files),
-            {('a@chromium.org', 'c@chromium.org'): ['external/wpt/bar', 'external/wpt/foo'],
-             ('b@chromium.org',): ['external/wpt/baz/x']}
+            {('a@chromium.org', 'c@chromium.org'): ['external/wpt/bar', 'external/wpt/foo']}
         )
 
-    def test_find_owners_file_current_dir(self):
-        self.filesystem.files = {
+    def test_list_owners_combines_same_directory(self):
+        self._write_files({
+            ABS_WPT_BASE + '/baz/x/y.html': '',
+            ABS_WPT_BASE + '/baz/x/y/z.html': '',
+            ABS_WPT_BASE + '/baz/x/OWNERS': 'foo@chromium.org\n',
+        })
+        changed_files = [
+            REL_WPT_BASE + '/baz/x/y.html',
+            REL_WPT_BASE + '/baz/x/y/z.html',
+        ]
+        self.assertEqual(
+            self.extractor.list_owners(changed_files),
+            {('foo@chromium.org',): ['external/wpt/baz/x']}
+        )
+
+    def test_list_owners_skips_empty_owners(self):
+        self._write_files({
+            ABS_WPT_BASE + '/baz/x/y/z.html': '',
+            ABS_WPT_BASE + '/baz/x/y/OWNERS': '# Some comments\n',
+            ABS_WPT_BASE + '/baz/x/OWNERS': 'foo@chromium.org\n',
+        })
+        changed_files = [
+            REL_WPT_BASE + '/baz/x/y/z.html',
+        ]
+        self.assertEqual(
+            self.extractor.list_owners(changed_files),
+            {('foo@chromium.org',): ['external/wpt/baz/x']}
+        )
+
+    def test_list_owners_not_found(self):
+        self._write_files({
+            # Although LayoutTests/external/OWNERS exists, it should not be listed.
+            ABS_WPT_BASE + '/foo/bar.html': '',
+            # Files out of external.
+            '/mock-checkout/third_party/WebKit/LayoutTests/TestExpectations': '',
+            '/mock-checkout/third_party/WebKit/LayoutTests/OWNERS': 'foo@chromium.org',
+        })
+        changed_files = [
+            REL_WPT_BASE + '/foo/bar.html',
+            'third_party/WebKit/LayoutTests/TestExpectations',
+        ]
+        self.assertEqual(self.extractor.list_owners(changed_files), {})
+
+    def test_find_owners_file_at_current_dir(self):
+        self._write_files({
             ABS_WPT_BASE + '/foo/OWNERS': 'a@chromium.org'
-        }
+        })
         self.assertEqual(self.extractor.find_owners_file(REL_WPT_BASE + '/foo'), ABS_WPT_BASE + '/foo/OWNERS')
 
-    def test_find_owners_file_ancestor(self):
-        self.filesystem.files = {
+    def test_find_owners_file_at_ancestor(self):
+        self._write_files({
             ABS_WPT_BASE + '/x/OWNERS': 'a@chromium.org',
             ABS_WPT_BASE + '/x/y/z.html': '',
-        }
+        })
         self.assertEqual(self.extractor.find_owners_file(REL_WPT_BASE + '/x/y'), ABS_WPT_BASE + '/x/OWNERS')
 
-    def test_find_owners_file_not_found(self):
-        self.filesystem.files = {
-            ABS_WPT_BASE + '/foo/OWNERS': 'a@chromium.org',
-            '/mock-checkout/third_party/WebKit/LayoutTests/external/OWNERS': 'a@chromium.org',
+    def test_find_owners_file_stops_at_external_root(self):
+        self._write_files({
             ABS_WPT_BASE + '/x/y/z.html': '',
-        }
-        self.assertEqual(self.extractor.find_owners_file(REL_WPT_BASE + '/x/y'), None)
+        })
+        self.assertEqual(self.extractor.find_owners_file(REL_WPT_BASE + '/x/y'),
+                         '/mock-checkout/third_party/WebKit/LayoutTests/external/OWNERS')
 
-    def test_find_owners_file_skip_empty(self):
-        self.filesystem.files = {
-            ABS_WPT_BASE + '/x/OWNERS': 'a@chromium.org',
-            ABS_WPT_BASE + '/x/y/OWNERS': '# b@chromium.org',
-            ABS_WPT_BASE + '/x/y/z.html': '',
-        }
-        self.assertEqual(self.extractor.find_owners_file(REL_WPT_BASE + '/x/y'), ABS_WPT_BASE + '/x/OWNERS')
+    def test_find_owners_file_takes_four_kinds_of_paths(self):
+        owners_path = ABS_WPT_BASE + '/foo/OWNERS'
+        self._write_files({
+            owners_path: 'a@chromium.org',
+            ABS_WPT_BASE + '/foo/bar.html': '',
+        })
+        # Absolute paths of directories.
+        self.assertEqual(self.extractor.find_owners_file(ABS_WPT_BASE + '/foo'), owners_path)
+        # Relative paths of directories.
+        self.assertEqual(self.extractor.find_owners_file(REL_WPT_BASE + '/foo'), owners_path)
+        # Absolute paths of files.
+        self.assertEqual(self.extractor.find_owners_file(ABS_WPT_BASE + '/foo/bar.html'), owners_path)
+        # Relative paths of files.
+        self.assertEqual(self.extractor.find_owners_file(REL_WPT_BASE + '/foo/bar.html'), owners_path)
 
-    def test_find_owners_file_absolute_path(self):
-        self.filesystem.files = {
-            ABS_WPT_BASE + '/foo/OWNERS': 'a@chromium.org'
-        }
-        self.assertEqual(self.extractor.find_owners_file(ABS_WPT_BASE + '/foo'), ABS_WPT_BASE + '/foo/OWNERS')
-
-    def test_find_owners_file_out_of_tree(self):
-        with self.assertRaises(AssertionError):
-            self.extractor.find_owners_file('third_party/WebKit/LayoutTests/other')
-        self.assertEqual(
-            self.extractor.find_owners_file('third_party/WebKit/LayoutTests'), None)
-        self.assertEqual(
-            self.extractor.find_owners_file('third_party/WebKit/LayoutTests/FlagExpectations/foo-bar'), None)
+    def test_find_owners_file_out_of_external(self):
+        self._write_files({
+            '/mock-checkout/third_party/WebKit/LayoutTests/OWNERS': 'foo@chromium.org',
+            '/mock-checkout/third_party/WebKit/LayoutTests/other/some_file': '',
+        })
+        self.assertIsNone(self.extractor.find_owners_file('third_party/WebKit/LayoutTests'))
+        self.assertIsNone(self.extractor.find_owners_file('third_party/WebKit/LayoutTests/other'))
+        self.assertIsNone(self.extractor.find_owners_file('third_party'))
 
     def test_extract_owners(self):
         self.filesystem.files = {
diff --git a/third_party/dom_distiller_js/README.chromium b/third_party/dom_distiller_js/README.chromium
index ce89f36..60ea9c1 100644
--- a/third_party/dom_distiller_js/README.chromium
+++ b/third_party/dom_distiller_js/README.chromium
@@ -1,6 +1,6 @@
 Name: dom-distiller-js
 URL: https://github.com/chromium/dom-distiller
-Version: 0bde3157d7
+Version: 9596033e36
 License: BSD
 Security Critical: yes
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 20cf2f8..8d7e512 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -24710,6 +24710,7 @@
   <int value="-1861814223" label="MidiManagerDynamicInstantiation:enabled"/>
   <int value="-1860481724" label="ChromeHomeExpandButton:enabled"/>
   <int value="-1856902397" label="LoadingWithMojo:enabled"/>
+  <int value="-1854432127" label="ChromeHomePullToRefreshIphAtTop:disabled"/>
   <int value="-1854372227" label="VrBrowsingExperimentalFeatures:enabled"/>
   <int value="-1849706663" label="enable-password-force-saving:disabled"/>
   <int value="-1847888049" label="AutofillSendBillingCustomerNumber:enabled"/>
@@ -24913,6 +24914,7 @@
   <int value="-1322882747" label="disable-datasaver-prompt"/>
   <int value="-1319688939" label="ignore-gpu-blacklist"/>
   <int value="-1318914924" label="OverflowIconsForMediaControls:enabled"/>
+  <int value="-1314603238" label="ChromeHomePullToRefreshIphAtTop:enabled"/>
   <int value="-1310737697" label="MaterialDesignSettings:enabled"/>
   <int value="-1302904242" label="enable-navigation-tracing"/>
   <int value="-1294050129" label="ContentFullscreen:disabled"/>
diff --git a/ui/aura/env.h b/ui/aura/env.h
index a1870db..bf0e4019 100644
--- a/ui/aura/env.h
+++ b/ui/aura/env.h
@@ -118,6 +118,11 @@
   }
   ui::ContextFactory* context_factory() { return context_factory_; }
 
+  void set_throttle_input_on_resize_for_testing(bool throttle_input) {
+    throttle_input_on_resize_ = throttle_input;
+  }
+  bool throttle_input_on_resize() const { return throttle_input_on_resize_; }
+
   void set_context_factory_private(
       ui::ContextFactoryPrivate* context_factory_private) {
     context_factory_private_ = context_factory_private;
@@ -222,6 +227,8 @@
   // creating a different WindowPort implementation.
   bool in_mus_shutdown_ = false;
 
+  bool throttle_input_on_resize_ = true;
+
   DISALLOW_COPY_AND_ASSIGN(Env);
 };
 
diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc
index f83c822..3f26feb1 100644
--- a/ui/aura/mus/window_tree_client.cc
+++ b/ui/aura/mus/window_tree_client.cc
@@ -874,7 +874,8 @@
       window_manager_client_->SetDisplayRoot(
           display, display_init_params->viewport_metrics.Clone(),
           display_init_params->is_primary_display, window->server_id(),
-          display_init_params->mirrors,
+          switches::IsMusHostingViz() ? display_init_params->mirrors
+                                      : std::vector<display::Display>(),
           base::Bind(&OnAckMustSucceed, FROM_HERE));
     }
   }
diff --git a/ui/aura/mus/window_tree_host_mus.cc b/ui/aura/mus/window_tree_host_mus.cc
index 68a3cd3..1552c67 100644
--- a/ui/aura/mus/window_tree_host_mus.cc
+++ b/ui/aura/mus/window_tree_host_mus.cc
@@ -13,6 +13,7 @@
 #include "ui/aura/mus/window_tree_host_mus_init_params.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/aura/window_tree_host_observer.h"
 #include "ui/base/class_property.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
@@ -186,6 +187,9 @@
   OnAcceleratedWidgetAvailable(widget, GetDisplay().device_scale_factor());
   if (was_visible)
     compositor()->SetVisible(true);
+
+  for (WindowTreeHostObserver& observer : observers())
+    observer.OnAcceleratedWidgetOverridden(this);
 }
 
 std::unique_ptr<DisplayInitParams>
diff --git a/ui/aura/window_tree_host.cc b/ui/aura/window_tree_host.cc
index f1607dc7..27b2b89 100644
--- a/ui/aura/window_tree_host.cc
+++ b/ui/aura/window_tree_host.cc
@@ -420,21 +420,10 @@
   dispatcher()->OnCursorMovedToRootLocation(root_location);
 }
 
-void WindowTreeHost::OnCompositingDidCommit(ui::Compositor* compositor) {}
-
-void WindowTreeHost::OnCompositingStarted(ui::Compositor* compositor,
-                                          base::TimeTicks start_time) {
-  if (!synchronizing_with_child_on_next_frame_)
-    return;
-  synchronizing_with_child_on_next_frame_ = false;
-  synchronization_start_time_ = base::TimeTicks::Now();
-  dispatcher_->HoldPointerMoves();
-  holding_pointer_moves_ = true;
-}
-
-void WindowTreeHost::OnCompositingEnded(ui::Compositor* compositor) {
+void WindowTreeHost::OnCompositingDidCommit(ui::Compositor* compositor) {
   if (!holding_pointer_moves_)
     return;
+
   dispatcher_->ReleasePointerMoves();
   holding_pointer_moves_ = false;
   DCHECK(!synchronization_start_time_.is_null());
@@ -442,11 +431,20 @@
                       base::TimeTicks::Now() - synchronization_start_time_);
 }
 
+void WindowTreeHost::OnCompositingStarted(ui::Compositor* compositor,
+                                          base::TimeTicks start_time) {}
+
+void WindowTreeHost::OnCompositingEnded(ui::Compositor* compositor) {}
+
 void WindowTreeHost::OnCompositingLockStateChanged(ui::Compositor* compositor) {
 }
 
 void WindowTreeHost::OnCompositingChildResizing(ui::Compositor* compositor) {
-  synchronizing_with_child_on_next_frame_ = true;
+  if (!Env::GetInstance()->throttle_input_on_resize() || holding_pointer_moves_)
+    return;
+  synchronization_start_time_ = base::TimeTicks::Now();
+  dispatcher_->HoldPointerMoves();
+  holding_pointer_moves_ = true;
 }
 
 void WindowTreeHost::OnCompositingShuttingDown(ui::Compositor* compositor) {
diff --git a/ui/aura/window_tree_host.h b/ui/aura/window_tree_host.h
index b1925384..b83f6494 100644
--- a/ui/aura/window_tree_host.h
+++ b/ui/aura/window_tree_host.h
@@ -252,6 +252,11 @@
   void OnDisplayMetricsChanged(const display::Display& display,
                                uint32_t metrics) override;
 
+ protected:
+  const base::ObserverList<WindowTreeHostObserver>& observers() const {
+    return observers_;
+  }
+
  private:
   friend class test::WindowTreeHostTestApi;
 
@@ -297,9 +302,6 @@
 
   gfx::Insets output_surface_padding_in_pixels_;
 
-  // Set to true if the next CompositorFrame will block on a new child surface.
-  bool synchronizing_with_child_on_next_frame_ = false;
-
   // Set to the time the synchronization event began.
   base::TimeTicks synchronization_start_time_;
 
diff --git a/ui/aura/window_tree_host_observer.h b/ui/aura/window_tree_host_observer.h
index e71455dc..a355be4 100644
--- a/ui/aura/window_tree_host_observer.h
+++ b/ui/aura/window_tree_host_observer.h
@@ -29,6 +29,9 @@
   // Called when the native window system sends the host request to close.
   virtual void OnHostCloseRequested(WindowTreeHost* host) {}
 
+  // Called when the accelerated widget is overridden for the host.
+  virtual void OnAcceleratedWidgetOverridden(WindowTreeHost* host) {}
+
  protected:
   virtual ~WindowTreeHostObserver() {}
 };
diff --git a/ui/aura/window_tree_host_unittest.cc b/ui/aura/window_tree_host_unittest.cc
index 52b9c6f..e1ee4cbc 100644
--- a/ui/aura/window_tree_host_unittest.cc
+++ b/ui/aura/window_tree_host_unittest.cc
@@ -78,26 +78,24 @@
 }
 
 TEST_F(WindowTreeHostTest, HoldPointerMovesOnChildResizing) {
-  // Signal to the ui::Compositor that a child is resizing. This will
-  // trigger input throttling on the next BeginFrame.
-  host()->compositor()->OnChildResizing();
-
-  // Wait for a CompositorFrame to be submitted.
-  ui::DrawWaiterForTest::WaitForCompositingStarted(host()->compositor());
   aura::WindowEventDispatcher* dispatcher = host()->dispatcher();
 
   aura::test::WindowEventDispatcherTestApi dispatcher_api(dispatcher);
 
-  // Pointer moves should be throttled until Viz ACKs. If surface
-  // synchronization is on, this may happen several BeginFrames later.
-  // This rate limits further resizing while Viz tries to synchronize
-  // the visuals of multiple clients.
+  EXPECT_FALSE(dispatcher_api.HoldingPointerMoves());
+
+  // Signal to the ui::Compositor that a child is resizing. This will
+  // immediately trigger input throttling.
+  host()->compositor()->OnChildResizing();
+
+  // Pointer moves should be throttled until the next commit. This has the
+  // effect of prioritizing the resize event above other operations in aura.
   EXPECT_TRUE(dispatcher_api.HoldingPointerMoves());
 
-  // Wait until Viz ACKs the submitted CompositorFrame.
-  ui::DrawWaiterForTest::WaitForCompositingEnded(host()->compositor());
+  // Wait for a CompositorFrame to be submitted.
+  ui::DrawWaiterForTest::WaitForCompositingStarted(host()->compositor());
 
-  // Pointer moves should be routed normally after the ACK.
+  // Pointer moves should be routed normally after commit.
   EXPECT_FALSE(dispatcher_api.HoldingPointerMoves());
 }
 
diff --git a/ui/events/gesture_detection/gesture_detector.cc b/ui/events/gesture_detection/gesture_detector.cc
index 988ae6c9..adb22f5 100644
--- a/ui/events/gesture_detection/gesture_detector.cc
+++ b/ui/events/gesture_detection/gesture_detector.cc
@@ -17,11 +17,6 @@
 namespace ui {
 namespace {
 
-// Using a small epsilon when comparing slop distances allows pixel perfect
-// slop determination when using fractional DIP coordinates (assuming the slop
-// region and DPI scale are reasonably proportioned).
-const float kSlopEpsilon = .05f;
-
 // Minimum distance a scroll must have traveled from the last scroll/focal point
 // to trigger an |OnScroll| callback.
 const float kScrollEpsilon = .1f;
@@ -427,6 +422,12 @@
 void GestureDetector::Init(const Config& config) {
   DCHECK(listener_);
 
+  // Using a small epsilon when comparing slop distances allows pixel
+  // perfect slop determination when using fractional DIP coordinates
+  // (assuming the slop region and DPI scale are reasonably
+  // proportioned).
+  const float kSlopEpsilon = .05f;
+
   const float touch_slop = config.touch_slop + kSlopEpsilon;
   const float double_tap_touch_slop = touch_slop;
   const float double_tap_slop = config.double_tap_slop + kSlopEpsilon;
diff --git a/ui/events/gesture_detection/scale_gesture_detector.cc b/ui/events/gesture_detection/scale_gesture_detector.cc
index 61eab9f..9eb3636 100644
--- a/ui/events/gesture_detection/scale_gesture_detector.cc
+++ b/ui/events/gesture_detection/scale_gesture_detector.cc
@@ -19,11 +19,6 @@
 namespace ui {
 namespace {
 
-// Using a small epsilon when comparing slop distances allows pixel perfect
-// slop determination when using fractional DPI coordinates (assuming the slop
-// region and DPI scale are reasonably proportioned).
-const float kSlopEpsilon = .05f;
-
 const float kScaleFactor = .5f;
 
 }  // namespace
@@ -60,6 +55,13 @@
       anchored_scale_mode_(ANCHORED_SCALE_MODE_NONE),
       event_before_or_above_starting_gesture_event_(false) {
   DCHECK(listener_);
+
+  // Using a small epsilon when comparing slop distances allows pixel
+  // perfect slop determination when using fractional DPI coordinates
+  // (assuming the slop region and DPI scale are reasonably
+  // proportioned).
+  const float kSlopEpsilon = .05f;
+
   span_slop_ = config.span_slop + kSlopEpsilon;
   min_span_ = config.min_scaling_span + kSlopEpsilon;
 }
diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc
index b86b8bf..14cad6f 100644
--- a/ui/message_center/views/notification_view.cc
+++ b/ui/message_center/views/notification_view.cc
@@ -85,23 +85,23 @@
   return views::CreateSolidSidedBorder(top, left, 0, 0, color);
 }
 
-// ItemView ////////////////////////////////////////////////////////////////////
+// NotificationItemView ////////////////////////////////////////////////////////
 
-// ItemViews are responsible for drawing each list notification item's title and
-// message next to each other within a single column.
-class ItemView : public views::View {
+// NotificationItemViews are responsible for drawing each list notification
+// item's title and message next to each other within a single column.
+class NotificationItemView : public views::View {
  public:
-  explicit ItemView(const NotificationItem& item);
-  ~ItemView() override;
+  explicit NotificationItemView(const NotificationItem& item);
+  ~NotificationItemView() override;
 
   // Overridden from views::View:
   void SetVisible(bool visible) override;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(ItemView);
+  DISALLOW_COPY_AND_ASSIGN(NotificationItemView);
 };
 
-ItemView::ItemView(const NotificationItem& item) {
+NotificationItemView::NotificationItemView(const NotificationItem& item) {
   SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
                                         gfx::Insets(),
                                         kItemTitleToMessagePadding));
@@ -124,10 +124,9 @@
   SchedulePaint();
 }
 
-ItemView::~ItemView() {
-}
+NotificationItemView::~NotificationItemView() {}
 
-void ItemView::SetVisible(bool visible) {
+void NotificationItemView::SetVisible(bool visible) {
   views::View::SetVisible(visible);
   for (int i = 0; i < child_count(); ++i)
     child_at(i)->SetVisible(visible);
@@ -522,7 +521,7 @@
 
   DCHECK(top_view_);
   for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) {
-    ItemView* item_view = new ItemView(items[i]);
+    NotificationItemView* item_view = new NotificationItemView(items[i]);
     item_view->SetBorder(MakeTextBorder(padding, i ? 0 : 4, 0));
     item_views_.push_back(item_view);
     top_view_->AddChildView(item_view);