diff --git a/DEPS b/DEPS
index 0d68c71a..f484eaa 100644
--- a/DEPS
+++ b/DEPS
@@ -45,7 +45,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '6bba6de94461cdb97a451bc7f88eec3b1ab71079',
+  'skia_revision': 'f6f7cf60985d8e109cc136f25e2a3c3383ca05ea',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -97,11 +97,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '6f2b6f8f72ffb5017ab00fca83185b21f1a9f56d',
+  'freetype_revision': '02e80da6090c21d6e59ac955b7f56e1ad4a9850b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '639e972bf15c206a77decda169e022c41c5aae36',
+  'catapult_revision': '0b563bed301ef780e6f0cac7bab670aaffb65fdf',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
index 897d5897..f3b8394 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -1816,9 +1816,12 @@
         helper.ensureSettingHasInitialValue();
     }
 
+    /*
+     * @SmallTest
+     * @Feature({"AndroidWebView", "Preferences"})
+     */
     @Test
-    @SmallTest
-    @Feature({"AndroidWebView", "Preferences"})
+    @DisabledTest(message = "crbug.com/767180")
     public void testDatabaseEnabled() throws Throwable {
         TestAwContentsClient client = new TestAwContentsClient();
         final AwTestContainerView testContainerView =
diff --git a/ash/public/cpp/shelf_prefs.cc b/ash/public/cpp/shelf_prefs.cc
index 8e307e9..2b5d95e 100644
--- a/ash/public/cpp/shelf_prefs.cc
+++ b/ash/public/cpp/shelf_prefs.cc
@@ -160,7 +160,7 @@
     case SHELF_AUTO_HIDE_ALWAYS_HIDDEN:
       // This should not be a valid preference option for now. We only want to
       // completely hide it when we run in app mode - or while we temporarily
-      // hide the shelf as part of an animation (e.g. the multi user change).
+      // hide the shelf (e.g. SessionAbortedDialog).
       return nullptr;
   }
   NOTREACHED();
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 3191076..9acc466 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -392,11 +392,6 @@
   return false;
 }
 
-void ShelfLayoutManager::SetAnimationDurationOverride(
-    int duration_override_in_ms) {
-  duration_override_in_ms_ = duration_override_in_ms;
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // ShelfLayoutManager, wm::WmSnapToPixelLayoutManager implementation:
 
@@ -613,15 +608,12 @@
     ui::ScopedLayerAnimationSettings status_animation_setter(
         GetLayer(status_widget)->GetAnimator());
     if (animate) {
-      int duration = duration_override_in_ms_ ? duration_override_in_ms_
-                                              : kAnimationDurationMS;
-      shelf_animation_setter.SetTransitionDuration(
-          base::TimeDelta::FromMilliseconds(duration));
+      auto duration = base::TimeDelta::FromMilliseconds(kAnimationDurationMS);
+      shelf_animation_setter.SetTransitionDuration(duration);
       shelf_animation_setter.SetTweenType(gfx::Tween::EASE_OUT);
       shelf_animation_setter.SetPreemptionStrategy(
           ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
-      status_animation_setter.SetTransitionDuration(
-          base::TimeDelta::FromMilliseconds(duration));
+      status_animation_setter.SetTransitionDuration(duration);
       status_animation_setter.SetTweenType(gfx::Tween::EASE_OUT);
       status_animation_setter.SetPreemptionStrategy(
           ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h
index fc7d810..413df536 100644
--- a/ash/shelf/shelf_layout_manager.h
+++ b/ash/shelf/shelf_layout_manager.h
@@ -140,10 +140,6 @@
   // be processed any further, false otherwise.
   bool ProcessGestureEvent(const ui::GestureEvent& event_in_screen);
 
-  // Set an animation duration override for the show / hide animation of the
-  // shelf. Specifying 0 leads to use the default.
-  void SetAnimationDurationOverride(int duration_override_in_ms);
-
   // Overridden from wm::WmSnapToPixelLayoutManager:
   void OnWindowResized() override;
   void SetChildBounds(aura::Window* child,
@@ -392,9 +388,6 @@
   // needs to be removed from the available work area.
   int chromevox_panel_height_ = 0;
 
-  // The show hide animation duration override or 0 for default.
-  int duration_override_in_ms_ = 0;
-
   // Whether background blur is enabled.
   const bool is_background_blur_enabled_;
 
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc
index e5d98269..cbb58cf 100644
--- a/ash/shelf/shelf_widget.cc
+++ b/ash/shelf/shelf_widget.cc
@@ -45,7 +45,6 @@
   FocusCycler* focus_cycler() { return focus_cycler_; }
 
   ui::Layer* opaque_background() { return &opaque_background_; }
-  ui::Layer* opaque_foreground() { return &opaque_foreground_; }
 
   void SetParentLayer(ui::Layer* layer);
 
@@ -67,10 +66,6 @@
   // A background layer that may be visible depending on a
   // ShelfBackgroundAnimator.
   ui::Layer opaque_background_;
-  // A black foreground layer which is shown while transitioning between users.
-  // Note: Since the back- and foreground layers have different functions they
-  // can be used simultaneously - so no repurposing possible.
-  ui::Layer opaque_foreground_;
 
   DISALLOW_COPY_AND_ASSIGN(DelegateView);
 };
@@ -78,22 +73,17 @@
 ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf_widget)
     : shelf_widget_(shelf_widget),
       focus_cycler_(nullptr),
-      opaque_background_(ui::LAYER_SOLID_COLOR),
-      opaque_foreground_(ui::LAYER_SOLID_COLOR) {
+      opaque_background_(ui::LAYER_SOLID_COLOR) {
   DCHECK(shelf_widget_);
   SetLayoutManager(new views::FillLayout());
   set_allow_deactivate_on_esc(true);
   opaque_background_.SetBounds(GetLocalBounds());
-  opaque_foreground_.SetBounds(GetLocalBounds());
-  opaque_foreground_.SetOpacity(0.0f);
-  opaque_foreground_.SetColor(SK_ColorBLACK);
 }
 
 ShelfWidget::DelegateView::~DelegateView() {}
 
 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) {
   layer->Add(&opaque_background_);
-  layer->Add(&opaque_foreground_);
   ReorderLayers();
 }
 
@@ -105,12 +95,10 @@
 void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) {
   views::View::ReorderChildLayers(parent_layer);
   parent_layer->StackAtBottom(&opaque_background_);
-  parent_layer->StackAtTop(&opaque_foreground_);
 }
 
 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) {
   opaque_background_.SetBounds(GetLocalBounds());
-  opaque_foreground_.SetBounds(GetLocalBounds());
 }
 
 void ShelfWidget::DelegateView::UpdateShelfBackground(SkColor color) {
@@ -203,27 +191,6 @@
   return background_animator_.GetBackgroundAlphaValue(background_type);
 }
 
-void ShelfWidget::HideShelfBehindBlackBar(bool hide, int animation_time_ms) {
-  if (IsShelfHiddenBehindBlackBar() == hide)
-    return;
-
-  ui::Layer* opaque_foreground = delegate_view_->opaque_foreground();
-  float target_opacity = hide ? 1.0f : 0.0f;
-  std::unique_ptr<ui::ScopedLayerAnimationSettings> opaque_foreground_animation;
-  opaque_foreground_animation.reset(
-      new ui::ScopedLayerAnimationSettings(opaque_foreground->GetAnimator()));
-  opaque_foreground_animation->SetTransitionDuration(
-      base::TimeDelta::FromMilliseconds(animation_time_ms));
-  opaque_foreground_animation->SetPreemptionStrategy(
-      ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
-
-  opaque_foreground->SetOpacity(target_opacity);
-}
-
-bool ShelfWidget::IsShelfHiddenBehindBlackBar() const {
-  return delegate_view_->opaque_foreground()->GetTargetOpacity() != 0.0f;
-}
-
 void ShelfWidget::OnShelfAlignmentChanged() {
   // Check added for http://crbug.com/738011.
   CHECK(status_area_widget_);
diff --git a/ash/shelf/shelf_widget.h b/ash/shelf/shelf_widget.h
index 8068653e..6dad5720 100644
--- a/ash/shelf/shelf_widget.h
+++ b/ash/shelf/shelf_widget.h
@@ -55,11 +55,6 @@
   // Gets the alpha value of |background_type|.
   int GetBackgroundAlphaValue(ShelfBackgroundType background_type) const;
 
-  // Hide the shelf behind a black bar during e.g. a user transition when |hide|
-  // is true. The |animation_time_ms| will be used as animation duration.
-  void HideShelfBehindBlackBar(bool hide, int animation_time_ms);
-  bool IsShelfHiddenBehindBlackBar() const;
-
   ShelfLayoutManager* shelf_layout_manager() { return shelf_layout_manager_; }
   StatusAreaWidget* status_area_widget() const { return status_area_widget_; }
 
diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py
index f4acd857..26fedbf 100644
--- a/build/android/pylib/gtest/gtest_test_instance.py
+++ b/build/android/pylib/gtest/gtest_test_instance.py
@@ -292,6 +292,7 @@
     self._total_external_shards = args.test_launcher_total_shards
     self._suite = args.suite_name[0]
     self._symbolizer = stack_symbolizer.Symbolizer(None, False)
+    self._gs_test_artifacts_bucket = args.gs_test_artifacts_bucket
 
     # GYP:
     if args.executable_dist_dir:
@@ -419,6 +420,10 @@
     return self._flags
 
   @property
+  def gs_test_artifacts_bucket(self):
+    return self._gs_test_artifacts_bucket
+
+  @property
   def gtest_filter(self):
     return self._gtest_filter
 
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py
index b833fc9..22794a43 100644
--- a/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -7,6 +7,7 @@
 import logging
 import os
 import posixpath
+import shutil
 import time
 
 from devil.android import crash_handler
@@ -21,9 +22,11 @@
 from pylib.local import local_test_server_spawner
 from pylib.local.device import local_device_environment
 from pylib.local.device import local_device_test_run
+from pylib.utils import google_storage_helper
 from pylib.utils import logdog_helper
 from py_trace_event import trace_event
 from py_utils import contextlib_ext
+from py_utils import tempfile_ext
 import tombstones
 
 _MAX_INLINE_FLAGS_LENGTH = 50  # Arbitrarily chosen.
@@ -393,6 +396,25 @@
         self._test_instance.total_external_shards)
     return tests
 
+  def _UploadTestArtifacts(self, device, test_artifacts_dir):
+    # TODO(jbudorick): Reconcile this with the output manager once
+    # https://codereview.chromium.org/2933993002/ lands.
+    if test_artifacts_dir:
+      with tempfile_ext.NamedTemporaryDirectory() as test_artifacts_host_dir:
+        device.PullFile(test_artifacts_dir.name, test_artifacts_host_dir)
+        test_artifacts_zip = shutil.make_archive('test_artifacts', 'zip',
+                                                 test_artifacts_host_dir)
+        link = google_storage_helper.upload(
+            google_storage_helper.unique_name(
+                'test_artifacts', device=device),
+            test_artifacts_zip,
+            bucket='%s/test_artifacts' % (
+                self._test_instance.gs_test_artifacts_bucket))
+        logging.info('Uploading test artifacts to %s.', link)
+        os.remove(test_artifacts_zip)
+        return link
+    return None
+
   #override
   def _RunTest(self, device, test):
     # Run the test.
@@ -404,38 +426,47 @@
         adb=device.adb,
         dir=self._delegate.ResultsDirectory(device),
         suffix='.xml') as device_tmp_results_file:
+      with contextlib_ext.Optional(
+          device_temp_file.NamedDeviceTemporaryDirectory(
+              adb=device.adb, dir='/sdcard/'),
+          self._test_instance.gs_test_artifacts_bucket) as test_artifacts_dir:
 
-      flags = list(self._test_instance.flags)
-      if self._test_instance.enable_xml_result_parsing:
-        flags.append('--gtest_output=xml:%s' % device_tmp_results_file.name)
+        flags = list(self._test_instance.flags)
+        if self._test_instance.enable_xml_result_parsing:
+          flags.append('--gtest_output=xml:%s' % device_tmp_results_file.name)
 
-      logging.info('flags:')
-      for f in flags:
-        logging.info('  %s', f)
+        if self._test_instance.gs_test_artifacts_bucket:
+          flags.append('--test_artifacts_dir=%s' % test_artifacts_dir.name)
 
-      with local_device_environment.OptionalPerTestLogcat(
-          device, hash(tuple(test)),
-          self._test_instance.should_save_logcat) as logmon:
-        with contextlib_ext.Optional(
-            trace_event.trace(str(test)),
-            self._env.trace_output):
-          output = self._delegate.Run(
-              test, device, flags=' '.join(flags),
-              timeout=timeout, retries=0)
+        logging.info('flags:')
+        for f in flags:
+          logging.info('  %s', f)
 
-      if self._test_instance.enable_xml_result_parsing:
-        try:
-          gtest_xml = device.ReadFile(
-              device_tmp_results_file.name,
-              as_root=True)
-        except device_errors.CommandFailedError as e:
-          logging.warning(
-              'Failed to pull gtest results XML file %s: %s',
-              device_tmp_results_file.name,
-              str(e))
-          gtest_xml = None
+        with local_device_environment.OptionalPerTestLogcat(
+            device, hash(tuple(test)),
+            self._test_instance.should_save_logcat) as logmon:
+          with contextlib_ext.Optional(
+              trace_event.trace(str(test)),
+              self._env.trace_output):
+            output = self._delegate.Run(
+                test, device, flags=' '.join(flags),
+                timeout=timeout, retries=0)
 
-      logcat_url = logmon.GetLogcatURL()
+        if self._test_instance.enable_xml_result_parsing:
+          try:
+            gtest_xml = device.ReadFile(
+                device_tmp_results_file.name,
+                as_root=True)
+          except device_errors.CommandFailedError as e:
+            logging.warning(
+                'Failed to pull gtest results XML file %s: %s',
+                device_tmp_results_file.name,
+                str(e))
+            gtest_xml = None
+
+        logcat_url = logmon.GetLogcatURL()
+        test_artifacts_url = self._UploadTestArtifacts(device,
+                                                       test_artifacts_dir)
 
     for s in self._servers[str(device)]:
       s.Reset()
@@ -461,6 +492,9 @@
       if self._test_instance.should_save_logcat:
         r.SetLink('logcat', logcat_url)
 
+      if self._test_instance.gs_test_artifacts_bucket:
+        r.SetLink('test_artifacts', test_artifacts_url)
+
       if r.GetType() == base_test_result.ResultType.CRASH:
         self._crashes.add(r.GetName())
         if self._test_instance.store_tombstones:
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 42b9bdc..ae2275c 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -346,6 +346,11 @@
       help='Path to file that contains googletest-style filter strings. '
            'See also //testing/buildbot/filters/README.md.')
 
+  parser.add_argument(
+      '--gs-test-artifacts-bucket',
+      help=('If present, test artifacts will be uploaded to this Google '
+            'Storage bucket.'))
+
 
 def AddInstrumentationTestOptions(parser):
   """Adds Instrumentation test options to |parser|."""
diff --git a/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml b/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml
index 5b97abe..ba655ff 100644
--- a/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml
+++ b/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml
@@ -11,7 +11,7 @@
     android:viewportWidth="72"
     android:viewportHeight="72">
 
-    <path android:fillColor="@color/default_primary_color"
+    <path android:fillColor="@color/modern_light_grey"
         android:pathData="M0,0 L72,0 L72,71.9997 L0,71.9997 Z" />
     <path android:fillColor="@color/light_normal_color"
         android:pathData="M45,42.9997 L45,28.9997 C45,27.8997,44.1,26.9997,43,26.9997 L29,26.9997
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 9358d56..a3c0ec83 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -170,6 +170,8 @@
             "ContentSuggestionsScrollToLoad";
     public static final String CONTENT_SUGGESTIONS_SETTINGS = "ContentSuggestionsSettings";
     public static final String CONTENT_SUGGESTIONS_SHOW_SUMMARY = "ContentSuggestionsShowSummary";
+    public static final String CONTENT_SUGGESTIONS_THUMBNAIL_DOMINANT_COLOR =
+            "ContentSuggestionsThumbnailDominantColor";
     public static final String CONTENT_SUGGESTIONS_VIDEO_OVERLAY = "ContentSuggestionsVideoOverlay";
     public static final String CONTEXTUAL_SEARCH_SINGLE_ACTIONS = "ContextualSearchSingleActions";
     public static final String CONTEXTUAL_SEARCH_URL_ACTIONS = "ContextualSearchUrlActions";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
index e215c826..d2883a1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
@@ -8,6 +8,7 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.TransitionDrawable;
 import android.media.ThumbnailUtils;
@@ -189,7 +190,18 @@
 
         // Temporarily set placeholder and then fetch the thumbnail from a provider.
         mThumbnailView.setBackground(null);
-        mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder);
+        if (FeatureUtilities.isChromeHomeEnabled()
+                && ChromeFeatureList.isEnabled(
+                           ChromeFeatureList.CONTENT_SUGGESTIONS_THUMBNAIL_DOMINANT_COLOR)) {
+            ColorDrawable colorDrawable =
+                    new ColorDrawable(mSuggestion.getThumbnailDominantColor() != null
+                                    ? mSuggestion.getThumbnailDominantColor()
+                                    : ApiCompatibilityUtils.getColor(mThumbnailView.getResources(),
+                                              R.color.modern_light_grey));
+            mThumbnailView.setImageDrawable(colorDrawable);
+        } else {
+            mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder);
+        }
         mThumbnailView.setTint(null);
 
         // Fetch thumbnail for the current article.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
index c859f182..bc14e76 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -526,6 +526,7 @@
     @Override
     public void shutdown() {
         mActivity.getFullscreenManager().removeListener(this);
+        mActivity.getFullscreenManager().setPersistentFullscreenMode(false);
         reparentAllTabs(mActivity.getWindowAndroid());
         if (mNativeVrShell != 0) {
             nativeDestroy(mNativeVrShell);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
index 1b40b75f..4ad6494ae 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
@@ -186,13 +186,15 @@
         if (FeatureUtilities.isChromeHomeEnabled()) {
             mModernLayout.setVisibility(incognitoEnabled ? View.VISIBLE : View.GONE);
             if (incognitoSelected) {
-                setBackgroundResource(R.color.incognito_primary_color);
+                setBackgroundColor(ApiCompatibilityUtils.getColor(
+                        getResources(), R.color.incognito_primary_color));
                 mModernStackButtonWrapper.setSelectedTabIndicatorColor(
                         mTabIconSelectedLightColor.getDefaultColor());
                 mModernStandardButtonIcon.setTint(mTabIconLightColor);
                 mModernIncognitoButtonIcon.setTint(mTabIconSelectedLightColor);
             } else {
-                setBackgroundResource(R.color.modern_primary_color);
+                setBackgroundColor(ApiCompatibilityUtils.getColor(
+                        getResources(), R.color.modern_primary_color));
                 mModernStackButtonWrapper.setSelectedTabIndicatorColor(
                         mTabIconSelectedDarkColor.getDefaultColor());
                 mModernStandardButtonIcon.setTint(mTabIconSelectedDarkColor);
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 ef51cd85..c6e8047d 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
@@ -30,6 +30,7 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
 import org.chromium.base.ObserverList;
+import org.chromium.base.SysUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.library_loader.LibraryProcessType;
 import org.chromium.chrome.R;
@@ -1007,18 +1008,12 @@
                     contentView, oldContent, mBottomSheetContentContainer, true));
         }
 
-        // Return early if there are no animators to run.
-        if (animators.isEmpty()) {
-            onContentSwapAnimationEnd(content);
-            return;
-        }
-
         // Temporarily make the background of the toolbar holder a solid color so the transition
         // doesn't appear to show a hole in the toolbar.
         int colorId = content == null || !content.isIncognitoThemedContent()
                 ? R.color.modern_primary_color
                 : R.color.incognito_primary_color;
-        if (!mIsSheetOpen || content.isIncognitoThemedContent()
+        if (!mIsSheetOpen || (content != null && content.isIncognitoThemedContent())
                 || (mSheetContent != null && mSheetContent.isIncognitoThemedContent())) {
             // If the sheet is closed, the bottom sheet content container is invisible, so
             // background color is needed on the toolbar holder to prevent a blank rectangle from
@@ -1029,12 +1024,25 @@
         mBottomSheetContentContainer.setBackgroundColor(
                 ApiCompatibilityUtils.getColor(getResources(), colorId));
 
+        // Set color on the content view to compensate for a JellyBean bug (crbug.com/766237).
+        if (content != null) {
+            content.getContentView().setBackgroundColor(
+                    ApiCompatibilityUtils.getColor(getResources(), colorId));
+        }
+
+        // Return early if there are no animators to run.
+        if (animators.isEmpty()) {
+            onContentSwapAnimationEnd(content);
+            return;
+        }
+
         mContentSwapAnimatorSet.playTogether(animators);
         mContentSwapAnimatorSet.start();
 
         // If the existing content is null or the tab switcher assets are showing, end the animation
         // immediately.
-        if (mSheetContent == null || mDefaultToolbarView.isInTabSwitcherMode()) {
+        if (mSheetContent == null || mDefaultToolbarView.isInTabSwitcherMode()
+                || SysUtils.isLowEndDevice()) {
             mContentSwapAnimatorSet.end();
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java
index d75d20a..23322179 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java
@@ -412,8 +412,9 @@
     }
 
     private void updateVisuals(boolean isIncognitoTabModelSelected) {
-        setBackgroundResource(isIncognitoTabModelSelected ? R.color.incognito_primary_color
-                                                          : R.color.modern_primary_color);
+        setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(),
+                isIncognitoTabModelSelected ? R.color.incognito_primary_color
+                                            : R.color.modern_primary_color));
 
         ColorStateList tint = ApiCompatibilityUtils.getColorStateList(getResources(),
                 isIncognitoTabModelSelected ? R.color.bottom_nav_tint_incognito
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
index eb9a5c31..5a5c12d1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
@@ -9,6 +9,7 @@
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.Nullable;
@@ -213,7 +214,7 @@
                 20f, // Score
                 mTimestamp, // Fetch timestamp
                 false, // Is video suggestion
-                null); // Thumbnail dominant color
+                Color.GREEN); // Thumbnail dominant color
         renderSuggestion(longSnippet, fullCategoryInfo, "long_snippet");
 
         SuggestionsCategoryInfo minimalCategory = new SuggestionsCategoryInfo(MINIMAL_CATEGORY,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
index fd054e1..e019af6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
@@ -31,6 +31,7 @@
 import org.chromium.chrome.browser.vr_shell.util.VrTransitionUtils;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.content.browser.test.util.DOMUtils;
 
 import java.util.concurrent.TimeoutException;
 
@@ -133,6 +134,26 @@
     }
 
     /**
+     * Tests that we exit fullscreen mode after exiting VR from cinema mode.
+     */
+    @Test
+    @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+    @MediumTest
+    public void testExitFullscreenAfterExitingVrFromCinemaMode()
+            throws InterruptedException, TimeoutException {
+        mVrTestFramework.loadUrlAndAwaitInitialization(
+                VrTestFramework.getHtmlTestFile("test_navigation_2d_page"), PAGE_LOAD_TIMEOUT_S);
+        VrTransitionUtils.forceEnterVr();
+        VrTransitionUtils.waitForVrEntry(POLL_TIMEOUT_LONG_MS);
+        DOMUtils.clickNode(mVrTestFramework.getFirstTabCvc(), "fullscreen");
+        mVrTestFramework.waitOnJavaScriptStep(mVrTestFramework.getFirstTabWebContents());
+
+        Assert.assertTrue(DOMUtils.isFullscreen(mVrTestFramework.getFirstTabWebContents()));
+        VrTransitionUtils.forceExitVr();
+        Assert.assertFalse(DOMUtils.isFullscreen(mVrTestFramework.getFirstTabWebContents()));
+    }
+
+    /**
      * Tests that the reported display dimensions are correct when exiting
      * from WebVR presentation to the VR browser.
      */
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 05b748a..7729581 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2530,6 +2530,13 @@
      flag_descriptions::kEnableContentSuggestionsLargeThumbnailDescription,
      kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kContentSuggestionsLargeThumbnail)},
+    {"enable-content-suggestions-thumbnail-dominant-color",
+     flag_descriptions::kEnableContentSuggestionsThumbnailDominantColorName,
+     flag_descriptions::
+         kEnableContentSuggestionsThumbnailDominantColorDescription,
+     kOsAndroid,
+     FEATURE_VALUE_TYPE(
+         chrome::android::kContentSuggestionsThumbnailDominantColor)},
     {"enable-content-suggestions-video-overlay",
      flag_descriptions::kEnableContentSuggestionsVideoOverlayName,
      flag_descriptions::kEnableContentSuggestionsVideoOverlayDescription,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 4ff5dc5..f4680f4 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -64,9 +64,10 @@
     &kChromeHomeSwipeLogic,
     &kContentSuggestionsLargeThumbnail,
     &kContentSuggestionsScrollToLoad,
-    &kContentSuggestionsVideoOverlay,
     &kContentSuggestionsSettings,
     &kContentSuggestionsShowSummary,
+    &kContentSuggestionsThumbnailDominantColor,
+    &kContentSuggestionsVideoOverlay,
     &kContextualSearchSingleActions,
     &kContextualSearchUrlActions,
     &kContextualSuggestionsCarousel,
@@ -180,15 +181,19 @@
 const base::Feature kContentSuggestionsScrollToLoad{
     "ContentSuggestionsScrollToLoad", base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kContentSuggestionsVideoOverlay{
-    "ContentSuggestionsVideoOverlay", base::FEATURE_DISABLED_BY_DEFAULT};
-
 const base::Feature kContentSuggestionsSettings{
     "ContentSuggestionsSettings", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kContentSuggestionsShowSummary{
     "ContentSuggestionsShowSummary", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kContentSuggestionsThumbnailDominantColor{
+    "ContentSuggestionsThumbnailDominantColor",
+    base::FEATURE_ENABLED_BY_DEFAULT};
+
+const base::Feature kContentSuggestionsVideoOverlay{
+    "ContentSuggestionsVideoOverlay", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kContextualSearchSingleActions{
     "ContextualSearchSingleActions", base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index 815879da..8148983 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -28,9 +28,10 @@
 extern const base::Feature kChromeHomeSwipeLogic;
 extern const base::Feature kContentSuggestionsLargeThumbnail;
 extern const base::Feature kContentSuggestionsScrollToLoad;
-extern const base::Feature kContentSuggestionsVideoOverlay;
 extern const base::Feature kContentSuggestionsSettings;
 extern const base::Feature kContentSuggestionsShowSummary;
+extern const base::Feature kContentSuggestionsThumbnailDominantColor;
+extern const base::Feature kContentSuggestionsVideoOverlay;
 extern const base::Feature kContextualSearchSingleActions;
 extern const base::Feature kContextualSearchUrlActions;
 extern const base::Feature kContextualSuggestionsCarousel;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
index d0df64f3..277b7a0 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -150,4 +150,34 @@
           entries)));
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// PasswordsPrivateImportPasswordsFunction
+
+PasswordsPrivateImportPasswordsFunction::
+    ~PasswordsPrivateImportPasswordsFunction() {}
+
+ExtensionFunction::ResponseAction
+PasswordsPrivateImportPasswordsFunction::Run() {
+  PasswordsPrivateDelegate* delegate =
+      PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(),
+                                                            true /* create */);
+  delegate->ImportPasswords(GetAssociatedWebContents());
+  return RespondNow(NoArguments());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// PasswordsPrivateExportPasswordsFunction
+
+PasswordsPrivateExportPasswordsFunction::
+    ~PasswordsPrivateExportPasswordsFunction() {}
+
+ExtensionFunction::ResponseAction
+PasswordsPrivateExportPasswordsFunction::Run() {
+  PasswordsPrivateDelegate* delegate =
+      PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(),
+                                                            true /* create */);
+  delegate->ExportPasswords(GetAssociatedWebContents());
+  return RespondNow(NoArguments());
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
index dab11b9..b1bc8bca 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -105,6 +105,40 @@
   DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateGetPasswordExceptionListFunction);
 };
 
+class PasswordsPrivateImportPasswordsFunction
+    : public UIThreadExtensionFunction {
+ public:
+  PasswordsPrivateImportPasswordsFunction() {}
+  DECLARE_EXTENSION_FUNCTION("passwordsPrivate.importPasswords",
+                             PASSWORDSPRIVATE_IMPORTPASSWORDS);
+
+ protected:
+  ~PasswordsPrivateImportPasswordsFunction() override;
+
+  // ExtensionFunction overrides.
+  ResponseAction Run() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateImportPasswordsFunction);
+};
+
+class PasswordsPrivateExportPasswordsFunction
+    : public UIThreadExtensionFunction {
+ public:
+  PasswordsPrivateExportPasswordsFunction() {}
+  DECLARE_EXTENSION_FUNCTION("passwordsPrivate.exportPasswords",
+                             PASSWORDSPRIVATE_EXPORTPASSWORDS);
+
+ protected:
+  ~PasswordsPrivateExportPasswordsFunction() override;
+
+  // ExtensionFunction overrides.
+  ResponseAction Run() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateExportPasswordsFunction);
+};
+
 }  // namespace extensions
 
 #endif  // CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORDS_PRIVATE_API_H_
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
index d561c97..f533cc4 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -126,6 +126,22 @@
 
   void SetProfile(Profile* profile) { profile_ = profile; }
 
+  void ImportPasswords(content::WebContents* web_contents) override {
+    // The testing of password importing itself should be handled via
+    // |PasswordManagerPorter|.
+    importPasswordsTriggered = true;
+  }
+
+  void ExportPasswords(content::WebContents* web_contents) override {
+    // The testing of password exporting itself should be handled via
+    // |PasswordManagerPorter|.
+    exportPasswordsTriggered = true;
+  }
+
+  // Flags for detecting whether import/export operations have been invoked.
+  bool importPasswordsTriggered = false;
+  bool exportPasswordsTriggered = false;
+
  private:
   // The current list of entries/exceptions. Cached here so that when new
   // observers are added, this delegate can send the current lists without
@@ -173,6 +189,14 @@
                                kFlagLoadAsComponent);
   }
 
+  bool importPasswordsWasTriggered() {
+    return s_test_delegate_->importPasswordsTriggered;
+  }
+
+  bool exportPasswordsWasTriggered() {
+    return s_test_delegate_->exportPasswordsTriggered;
+  }
+
  private:
   static TestDelegate* s_test_delegate_;
 
@@ -204,4 +228,16 @@
   EXPECT_TRUE(RunPasswordsSubtest("getPasswordExceptionList")) << message_;
 }
 
+IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, ImportPasswords) {
+  EXPECT_FALSE(importPasswordsWasTriggered());
+  EXPECT_TRUE(RunPasswordsSubtest("importPasswords")) << message_;
+  EXPECT_TRUE(importPasswordsWasTriggered());
+}
+
+IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, ExportPasswords) {
+  EXPECT_FALSE(exportPasswordsWasTriggered());
+  EXPECT_TRUE(RunPasswordsSubtest("exportPasswords")) << message_;
+  EXPECT_TRUE(exportPasswordsWasTriggered());
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
index 403d2db..0b891e039 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
@@ -67,6 +67,14 @@
   //     an OS-level authentication dialog if necessary.
   virtual void RequestShowPassword(size_t index,
                                    content::WebContents* web_contents) = 0;
+
+  // Trigger the password import procedure, allowing the user to select a file
+  // containing passwords to import.
+  virtual void ImportPasswords(content::WebContents* web_contents) = 0;
+
+  // Trigger the password export procedure, allowing the user to save a file
+  // containing their passwords.
+  virtual void ExportPasswords(content::WebContents* web_contents) = 0;
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index 648a51dc..afd3e38 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -20,6 +20,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h"
 #include "components/password_manager/core/browser/password_ui_utils.h"
+#include "components/password_manager/core/common/password_manager_features.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -196,6 +197,16 @@
   get_password_exception_list_callbacks_.clear();
 }
 
+void PasswordsPrivateDelegateImpl::ImportPasswords(
+    content::WebContents* web_contents) {
+  password_manager_presenter_->ImportPasswords(web_contents);
+}
+
+void PasswordsPrivateDelegateImpl::ExportPasswords(
+    content::WebContents* web_contents) {
+  password_manager_presenter_->ExportPasswords(web_contents);
+}
+
 #if !defined(OS_ANDROID)
 gfx::NativeWindow PasswordsPrivateDelegateImpl::GetNativeWindow() const {
   DCHECK(web_contents_);
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
index 2d71178..3acf163 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -47,6 +47,8 @@
   void RemovePasswordException(size_t index) override;
   void RequestShowPassword(size_t index,
                            content::WebContents* web_contents) override;
+  void ImportPasswords(content::WebContents* web_contents) override;
+  void ExportPasswords(content::WebContents* web_contents) override;
 
   // PasswordUIView implementation.
   Profile* GetProfile() override;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 8fcb692..63e6e03 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1628,15 +1628,9 @@
 const char kEnableAndroidPayIntegrationV2Description[] =
     "Enable integration with Android Pay using the second version of the API";
 
+const char kEnableAndroidSpellcheckerName[] = "Enable spell checking";
 const char kEnableAndroidSpellcheckerDescription[] =
     "Enables use of the Android spellchecker.";
-const char kEnableAndroidSpellcheckerName[] = "Enable spell checking";
-
-const char kEnableContentSuggestionsNewFaviconServerName[] =
-    "Get favicons for content suggestions from a new server.";
-const char kEnableContentSuggestionsNewFaviconServerDescription[] =
-    "If enabled, the content suggestions (on the NTP) will get favicons from a "
-    "new favicon server.";
 
 const char kEnableContentSuggestionsLargeThumbnailName[] =
     "Large thumbnails layout for content suggestions cards.";
@@ -1644,11 +1638,11 @@
     "If enabled, the content suggestions cards will use large thumbnails and "
     "some related adjustments.";
 
-const char kEnableContentSuggestionsVideoOverlayName[] =
-    "Video icon overlay on thumbnails for content suggestions cards.";
-const char kEnableContentSuggestionsVideoOverlayDescription[] =
-    "If enabled, the content suggestions cards for suggestions with a video "
-    "will show a video play icon overlay on the thumbnail.";
+const char kEnableContentSuggestionsNewFaviconServerName[] =
+    "Get favicons for content suggestions from a new server.";
+const char kEnableContentSuggestionsNewFaviconServerDescription[] =
+    "If enabled, the content suggestions (on the NTP) will get favicons from a "
+    "new favicon server.";
 
 const char kEnableContentSuggestionsSettingsName[] =
     "Show content suggestions settings.";
@@ -1661,6 +1655,18 @@
 const char kEnableContentSuggestionsShowSummaryDescription[] =
     "If enabled, the content suggestions summaries will be shown.";
 
+const char kEnableContentSuggestionsThumbnailDominantColorName[] =
+    "Use content suggestions thumbnail dominant color.";
+const char kEnableContentSuggestionsThumbnailDominantColorDescription[] =
+    "Use content suggestions thumbnail dominant color as a placeholder before "
+    "the real thumbnail is fetched (requires Chrome Home).";
+
+const char kEnableContentSuggestionsVideoOverlayName[] =
+    "Video icon overlay on thumbnails for content suggestions cards.";
+const char kEnableContentSuggestionsVideoOverlayDescription[] =
+    "If enabled, the content suggestions cards for suggestions with a video "
+    "will show a video play icon overlay on the thumbnail.";
+
 const char kEnableCopylessPasteName[] = "App Indexing (Copyless Paste)";
 const char kEnableCopylessPasteDescription[] =
     "Provide suggestions for text input, based on your recent context. For "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 1732445..e9e3bc6 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1007,17 +1007,14 @@
 extern const char kEnableAndroidPayIntegrationV2Name[];
 extern const char kEnableAndroidPayIntegrationV2Description[];
 
-extern const char kEnableAndroidSpellcheckerDescription[];
 extern const char kEnableAndroidSpellcheckerName[];
-
-extern const char kEnableContentSuggestionsNewFaviconServerName[];
-extern const char kEnableContentSuggestionsNewFaviconServerDescription[];
+extern const char kEnableAndroidSpellcheckerDescription[];
 
 extern const char kEnableContentSuggestionsLargeThumbnailName[];
 extern const char kEnableContentSuggestionsLargeThumbnailDescription[];
 
-extern const char kEnableContentSuggestionsVideoOverlayName[];
-extern const char kEnableContentSuggestionsVideoOverlayDescription[];
+extern const char kEnableContentSuggestionsNewFaviconServerName[];
+extern const char kEnableContentSuggestionsNewFaviconServerDescription[];
 
 extern const char kEnableContentSuggestionsSettingsName[];
 extern const char kEnableContentSuggestionsSettingsDescription[];
@@ -1025,6 +1022,12 @@
 extern const char kEnableContentSuggestionsShowSummaryName[];
 extern const char kEnableContentSuggestionsShowSummaryDescription[];
 
+extern const char kEnableContentSuggestionsThumbnailDominantColorName[];
+extern const char kEnableContentSuggestionsThumbnailDominantColorDescription[];
+
+extern const char kEnableContentSuggestionsVideoOverlayName[];
+extern const char kEnableContentSuggestionsVideoOverlayDescription[];
+
 extern const char kEnableCopylessPasteName[];
 extern const char kEnableCopylessPasteDescription[];
 
diff --git a/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc b/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc
index 643c1bf..7ae0618 100644
--- a/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc
@@ -291,7 +291,9 @@
 }
 
 #if defined(OS_LINUX)
-#define MAYBE_MANUAL_FirefoxApprtcInteropTest MANUAL_FirefoxApprtcInteropTest
+// Disabled due to failure, see http://crbug.com/751211.
+#define MAYBE_MANUAL_FirefoxApprtcInteropTest \
+  DISABLED_MANUAL_FirefoxApprtcInteropTest
 #else
 // Not implemented yet on Windows and Mac.
 #define MAYBE_MANUAL_FirefoxApprtcInteropTest \
@@ -300,7 +302,6 @@
 
 IN_PROC_BROWSER_TEST_F(WebRtcApprtcBrowserTest,
                        MAYBE_MANUAL_FirefoxApprtcInteropTest) {
-  base::ThreadRestrictions::ScopedAllowIO allow_io;
   DetectErrorsInJavaScript();
   ASSERT_TRUE(LaunchApprtcInstanceOnLocalhost("9999"));
   ASSERT_TRUE(LaunchColliderOnLocalHost("http://localhost:9999", "8089"));
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html
index e9cdd80..c25161c0 100644
--- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html
+++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html
@@ -58,7 +58,18 @@
       <span>$i18nRaw{managePasswordsLabel}</span>
     </div>
     <div class="settings-box first">
-      <h2>$i18n{savedPasswordsHeading}</h2>
+      <h2 class="start">$i18n{savedPasswordsHeading}</h2>
+      <template is="dom-if" if="[[showImportExportPasswords_]]">
+        <paper-button class="secondary-button header-aligned-button"
+            on-tap="onImportTap_" id="import">
+          $i18n{import}
+        </paper-button>
+        <paper-button class="secondary-button header-aligned-button"
+            on-tap="onExportTap_" id="export"
+            disabled$="[[!hasSome_(savedPasswords)]]">
+          $i18n{export}
+        </paper-button>
+      </template>
     </div>
     <div class="list-frame">
       <div id="savedPasswordsHeading" class="list-item column-header"
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
index 063cd71..b50bc3e 100644
--- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
+++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
@@ -70,6 +70,16 @@
    * @param {function(!PasswordManager.PlaintextPasswordEvent):void} callback
    */
   getPlaintextPassword(index, callback) {}
+
+  /**
+   * Triggers the dialogue for importing passwords.
+   */
+  importPasswords() {}
+
+  /**
+   * Triggers the dialogue for exporting passwords.
+   */
+  exportPasswords() {}
 }
 
 /** @typedef {chrome.passwordsPrivate.PasswordUiEntry} */
@@ -145,6 +155,16 @@
     chrome.passwordsPrivate.onPlaintextPasswordRetrieved.addListener(listener);
     chrome.passwordsPrivate.requestPlaintextPassword(index);
   }
+
+  /** @override */
+  importPasswords() {
+    chrome.passwordsPrivate.importPasswords();
+  }
+
+  /** @override */
+  exportPasswords() {
+    chrome.passwordsPrivate.exportPasswords();
+  }
 }
 
 cr.addSingletonGetter(PasswordManagerImpl);
@@ -195,6 +215,15 @@
     activePassword: Object,
 
     /** @private */
+    showImportExportPasswords_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.valueExists('showImportExportPasswords') &&
+            loadTimeData.getBoolean('showImportExportPasswords');
+      }
+    },
+
+    /** @private */
     showPasswordEditDialog_: Boolean,
 
     /** Filter on the saved passwords and exceptions. */
@@ -355,6 +384,22 @@
   },
 
   /**
+   * Fires an event that should trigger the password import process.
+   * @private
+   */
+  onImportTap_: function() {
+    this.passwordManager_.importPasswords();
+  },
+
+  /**
+   * Fires an event that should trigger the password export process.
+   * @private
+   */
+  onExportTap_: function() {
+    this.passwordManager_.exportPasswords();
+  },
+
+  /**
    * Returns true if the list exists and has items.
    * @param {Array<Object>} list
    * @return {boolean}
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
index b31b7000..d0eae22 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
@@ -10,8 +10,6 @@
 #include "ash/content/shell_content_state.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
-#include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/ash_test_environment_content.h"
@@ -1036,40 +1034,26 @@
   EXPECT_FALSE(CoversScreen(window(1)));
   EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
   EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
-  Shelf* shelf = GetPrimaryShelf();
-  EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, shelf->auto_hide_behavior());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
-  ShelfWidget* shelf_widget = shelf->shelf_widget();
-  EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar());
 
   // Start the animation and see that the old window is becoming invisible, the
-  // new one is becoming visible, the background starts transitionining and the
-  // shelf hides.
+  // new one is becoming visible, and the background starts transitionining.
   StartUserTransitionAnimation(account_id_B);
   EXPECT_EQ(kArrowBAccountIdString,
             GetWallpaperUserIdForTest());
   EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
-  EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, shelf->auto_hide_behavior());
-  EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar());
 
-  // Staring the next step should show the shelf again, but there are many
-  // subsystems missing (preferences system, ChromeLauncherController, ...)
-  // which should set the shelf to its users state. Since that isn't there we
-  // can only make sure that it stays where it is.
   AdvanceUserTransitionAnimation();
   EXPECT_EQ(kArrowBAccountIdString,
             GetWallpaperUserIdForTest());
   EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
-  EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, shelf->auto_hide_behavior());
-  EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar());
 
   // After the finalize the animation of the wallpaper should be finished.
   AdvanceUserTransitionAnimation();
-  EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
 }
 
@@ -1309,96 +1293,6 @@
   DISALLOW_COPY_AND_ASSIGN(TestWindowObserver);
 };
 
-// Test that switching between users with the shelf in the same place, the shelf
-// will get covered with a black bar instead being hidden and re-shown.
-TEST_F(MultiUserWindowManagerChromeOSTest, TestBlackBarCover) {
-  // We need to ensure this works for external connected monitors as well, so
-  // add a secondary display.
-  UpdateDisplay("500x500,500x500");
-
-  SetUpForThisManyWindows(2);
-
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-
-  multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
-  multi_user_window_manager()->SetWindowOwner(window(1), account_id_B);
-
-  // Move the second window to the second display and make sure it is not
-  // maximized for the first part of the test.
-  ASSERT_EQ(2u, display_manager()->GetNumDisplays());
-  window(1)->SetBoundsInScreen(gfx::Rect(0, 0, 100, 100),
-                               display_manager()->GetDisplayAt(1));
-
-  ASSERT_EQ(2u, Shell::GetAllRootWindowControllers().size());
-  Shelf* primary_shelf = Shell::GetAllRootWindowControllers()[0]->shelf();
-  Shelf* secondary_shelf = Shell::GetAllRootWindowControllers()[1]->shelf();
-  ShelfWidget* primary_shelf_widget = primary_shelf->shelf_widget();
-  ShelfWidget* secondary_shelf_widget = secondary_shelf->shelf_widget();
-
-  // Turn the use of delays and animation on.
-  multi_user_window_manager()->SetAnimationSpeedForTest(
-      chrome::MultiUserWindowManagerChromeOS::ANIMATION_SPEED_FAST);
-  EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior());
-  EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN,
-            secondary_shelf->auto_hide_behavior());
-  EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar());
-
-  // First test that with no maximized window we show/hide the shelf.
-  StartUserTransitionAnimation(account_id_B);
-  EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior());
-  EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN,
-            secondary_shelf->auto_hide_behavior());
-
-  // Staring the next step should show the shelf again.
-  AdvanceUserTransitionAnimation();
-  EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar());
-
-  AdvanceUserTransitionAnimation();
-  EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  primary_shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
-  secondary_shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
-
-  // Now we maximize the windows which will cause the black overlay to show up.
-  wm::GetWindowState(window(0))->Maximize();
-  wm::GetWindowState(window(1))->Maximize();
-  // We set a window observer on both windows to see that no resize is performed
-  // on our test windows.
-  TestWindowObserver window_observer;
-  window(0)->AddObserver(&window_observer);
-  window(1)->AddObserver(&window_observer);
-
-  // Start the animation and see that the shelf gets hidden by the black bar,
-  // and the AutoHide behavior remains as it was.
-  StartUserTransitionAnimation(account_id_A);
-  EXPECT_TRUE(primary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_TRUE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior());
-  EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN,
-            secondary_shelf->auto_hide_behavior());
-
-  // Starting the next step should show the shelf again.
-  AdvanceUserTransitionAnimation();
-  EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior());
-  EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN,
-            secondary_shelf->auto_hide_behavior());
-
-  AdvanceUserTransitionAnimation();
-  EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar());
-  window(0)->RemoveObserver(&window_observer);
-  window(1)->RemoveObserver(&window_observer);
-  // No resize should have been done to the window.
-  EXPECT_EQ(0, window_observer.resize_calls());
-}
-
 // Test that switching between different user won't change the activated windows
 // and the property of transient windows.
 TEST_F(MultiUserWindowManagerChromeOSTest, TransientWindowActivationTest) {
diff --git a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc
index 333c571..bd8bd68 100644
--- a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc
+++ b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc
@@ -4,10 +4,6 @@
 
 #include "chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h"
 
-#include "ash/root_window_controller.h"
-#include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_layout_manager.h"
-#include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/wallpaper/wallpaper_delegate.h"
 #include "ash/wm/mru_window_tracker.h"
@@ -215,62 +211,15 @@
 
 void UserSwitchAnimatorChromeOS::TransitionUserShelf(
     AnimationStep animation_step) {
+  if (animation_step != ANIMATION_STEP_SHOW_NEW_USER)
+    return;
+
   ChromeLauncherController* chrome_launcher_controller =
       ChromeLauncherController::instance();
-  // The shelf animation duration override.
-  int duration_override = animation_speed_ms_;
-  // Handle the shelf order of items. This is done once the old user is hidden.
-  if (animation_step == ANIMATION_STEP_SHOW_NEW_USER) {
-    // Some unit tests have no ChromeLauncherController.
-    if (chrome_launcher_controller)
-      chrome_launcher_controller->ActiveUserChanged(
-          new_account_id_.GetUserEmail());
-    // Hide the black rectangle on top of each shelf again.
-    for (aura::Window* window : ash::Shell::GetAllRootWindows()) {
-      ash::ShelfWidget* shelf = ash::Shelf::ForWindow(window)->shelf_widget();
-      shelf->HideShelfBehindBlackBar(false, duration_override);
-    }
-    // We kicked off the shelf animation above and the override can be
-    // removed.
-    duration_override = 0;
-  }
-
-  if (!animation_speed_ms_ || animation_step == ANIMATION_STEP_FINALIZE)
-    return;
-
-  // Note: The animation duration override will be set before the old user gets
-  // hidden and reset after the animations for the new user got kicked off.
-  ash::Shell::RootWindowControllerList controller =
-      ash::Shell::Get()->GetAllRootWindowControllers();
-  for (ash::Shell::RootWindowControllerList::iterator iter = controller.begin();
-       iter != controller.end(); ++iter) {
-    (*iter)->GetShelfLayoutManager()->SetAnimationDurationOverride(
-        duration_override);
-  }
-
-  if (animation_step != ANIMATION_STEP_HIDE_OLD_USER)
-    return;
-
-  // For each root window hide the shelf.
-  for (aura::Window* window : ash::Shell::GetAllRootWindows()) {
-    // Hiding the shelf will cause a resize on a maximized window.
-    // If the shelf is then shown for the following user in the same location,
-    // the window gets resized again. Since each resize can cause a considerable
-    // CPU usage and therefore effect jank, we should avoid hiding the shelf if
-    // the start and end location are the same and cover the shelf instead with
-    // a black rectangle on top.
-    ash::Shelf* shelf = ash::Shelf::ForWindow(window);
-    if (GetScreenCover(window) != NO_USER_COVERS_SCREEN &&
-        (!chrome_launcher_controller ||
-         !chrome_launcher_controller->ShelfBoundsChangesProbablyWithUser(
-             shelf, new_account_id_))) {
-      shelf->shelf_widget()->HideShelfBehindBlackBar(true, duration_override);
-    } else {
-      // This shelf change is only part of the animation and will be updated by
-      // ChromeLauncherController::ActiveUserChanged() to the new users value.
-      // Note that the user preference will not be changed.
-      shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
-    }
+  // Some unit tests have no ChromeLauncherController.
+  if (chrome_launcher_controller) {
+    chrome_launcher_controller->ActiveUserChanged(
+        new_account_id_.GetUserEmail());
   }
 }
 
diff --git a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h
index 8a2e2e29..cd036c4 100644
--- a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h
+++ b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h
@@ -79,7 +79,7 @@
   // Execute the user wallpaper animations for |animation_step|.
   void TransitionWallpaper(AnimationStep animtion_step);
 
-  // Execute the user shelf animations for |animation_step|.
+  // Update the shelf for |animation_step|.
   void TransitionUserShelf(AnimationStep animtion_step);
 
   // Execute the window animations for |animation_step|.
@@ -108,7 +108,7 @@
   AnimationStep animation_step_;
 
   // The screen cover status before the animation has started.
-  TransitioningScreenCover screen_cover_;
+  const TransitioningScreenCover screen_cover_;
 
   // Mapping users IDs to the list of windows to show for these users.
   typedef std::map<AccountId, aura::Window::Windows> UserToWindowsMap;
diff --git a/chrome/browser/ui/passwords/password_manager_porter.cc b/chrome/browser/ui/passwords/password_manager_porter.cc
index 1b6c95e..3e4e10d1 100644
--- a/chrome/browser/ui/passwords/password_manager_porter.cc
+++ b/chrome/browser/ui/passwords/password_manager_porter.cc
@@ -134,11 +134,7 @@
 void PasswordManagerPorter::FileSelected(const base::FilePath& path,
                                          int index,
                                          void* params) {
-  // We are unable to cast directly from void* to Type: reinterpret_cast will
-  // only convert between pointers and static_cast only from integral types to
-  // enums (for those types that are relevant to this example), which
-  // necessitates the use of two casts.
-  switch (static_cast<Type>(reinterpret_cast<uintptr_t>(params))) {
+  switch (reinterpret_cast<uintptr_t>(params)) {
     case PASSWORD_IMPORT:
       ImportPasswordsFromPath(path);
       break;
diff --git a/chrome/browser/ui/views/collected_cookies_views.cc b/chrome/browser/ui/views/collected_cookies_views.cc
index 4627af7b..f90e90b 100644
--- a/chrome/browser/ui/views/collected_cookies_views.cc
+++ b/chrome/browser/ui/views/collected_cookies_views.cc
@@ -57,9 +57,6 @@
 const int kInfobarVerticalPadding = 3;
 const int kInfobarHorizontalPadding = 8;
 
-// Width of the infobar frame.
-const int kInfobarBorderSize = 1;
-
 // Dimensions of the tree views.
 const int kTreeViewWidth = 400;
 const int kTreeViewHeight = 125;
@@ -140,9 +137,6 @@
  public:
   InfobarView() {
     content_ = new views::View;
-    SkColor border_color = SK_ColorGRAY;
-    content_->SetBorder(
-        views::CreateSolidBorder(kInfobarBorderSize, border_color));
 
     info_image_ = new views::ImageView();
     info_image_->SetImage(gfx::CreateVectorIcon(vector_icons::kInfoOutlineIcon,
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index d38a4f9b..3b9f798 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -1172,7 +1172,8 @@
       {"noCreditCardsFound", IDS_SETTINGS_CREDIT_CARD_NONE},
       {"noPasswordsFound", IDS_SETTINGS_PASSWORDS_NONE},
       {"noExceptionsFound", IDS_SETTINGS_PASSWORDS_EXCEPTIONS_NONE},
-  };
+      {"import", IDS_PASSWORD_MANAGER_IMPORT_BUTTON},
+      {"export", IDS_PASSWORD_MANAGER_EXPORT_BUTTON}};
 
   html_source->AddString(
       "managePasswordsLabel",
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc
index f1eea08..9b968b7 100644
--- a/chrome/browser/ui/webui/settings/md_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -40,6 +40,7 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/settings_resources.h"
 #include "chrome/grit/settings_resources_map.h"
+#include "components/password_manager/core/common/password_manager_features.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
@@ -265,6 +266,11 @@
   }
 #endif
 
+  html_source->AddBoolean(
+      "showImportExportPasswords",
+      base::FeatureList::IsEnabled(
+          password_manager::features::kPasswordImportExport));
+
   AddSettingsPageUIHandler(
       base::WrapUnique(AboutHandler::Create(html_source, profile)));
   AddSettingsPageUIHandler(
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 06fd522..f7d2558e 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -111,14 +111,7 @@
 #endif  // defined(OS_MACOSX)
 
 // Enables Basic/Advanced tabs in ClearBrowsingData.
-const base::Feature kTabsInCbd {
-  "TabsInCBD",
-#if defined(OS_ANDROID)
-      base::FEATURE_ENABLED_BY_DEFAULT
-#else
-      base::FEATURE_DISABLED_BY_DEFAULT
-#endif
-};
+const base::Feature kTabsInCbd{"TabsInCBD", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // If enabled, we'll only take thumbnails of unknown URLs (i.e. URLs that are
 // not (yet) part of TopSites) if they have an interesting transition type, i.e.
diff --git a/chrome/common/extensions/api/passwords_private.idl b/chrome/common/extensions/api/passwords_private.idl
index 06c12ae4..aedcdabf 100644
--- a/chrome/common/extensions/api/passwords_private.idl
+++ b/chrome/common/extensions/api/passwords_private.idl
@@ -88,6 +88,12 @@
     // Returns the list of password exceptions.
     // |callback|: Called with the list of password exceptions.
     static void getPasswordExceptionList(ExceptionListCallback callback);
+
+    // Triggers the Password Manager password import functionality.
+    static void importPasswords();
+
+    // Triggers the Password Manager password export functionality.
+    static void exportPasswords();
   };
 
   interface Events {
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png
index c2a498212..c8c44ef 100644
--- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png
+++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png
Binary files differ
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png
index 371c62d..18c4fe8 100644
--- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png
+++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png
Binary files differ
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png
index 35e5fd45..6467eccb 100644
--- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png
+++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png
Binary files differ
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png
index 1bcd749..a87bd36 100644
--- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png
+++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png
Binary files differ
diff --git a/chrome/test/data/extensions/api_test/passwords_private/test.js b/chrome/test/data/extensions/api_test/passwords_private/test.js
index 9dc7bccc..2756794 100644
--- a/chrome/test/data/extensions/api_test/passwords_private/test.js
+++ b/chrome/test/data/extensions/api_test/passwords_private/test.js
@@ -104,6 +104,16 @@
 
     chrome.passwordsPrivate.getPasswordExceptionList(callback);
   },
+
+  function importPasswords() {
+    chrome.passwordsPrivate.importPasswords();
+    chrome.test.succeed();
+  },
+
+  function exportPasswords() {
+    chrome.passwordsPrivate.exportPasswords();
+    chrome.test.succeed();
+  },
 ];
 
 var testToRun = window.location.search.substring(1);
diff --git a/chrome/test/data/webui/settings/privacy_page_test.js b/chrome/test/data/webui/settings/privacy_page_test.js
index c4c4c82..ec562110 100644
--- a/chrome/test/data/webui/settings/privacy_page_test.js
+++ b/chrome/test/data/webui/settings/privacy_page_test.js
@@ -117,11 +117,11 @@
       teardown(function() { page.remove(); });
 
       test('showClearBrowsingDataDialog', function() {
-        assertFalse(!!page.$$('settings-clear-browsing-data-dialog'));
+        assertFalse(!!page.$$('settings-clear-browsing-data-dialog-tabs'));
         MockInteractions.tap(page.$$('#clearBrowsingData'));
         Polymer.dom.flush();
 
-        var dialog = page.$$('settings-clear-browsing-data-dialog');
+        var dialog = page.$$('settings-clear-browsing-data-dialog-tabs');
         assertTrue(!!dialog);
 
         // Ensure that the dialog is fully opened before returning from this
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 764b213..4d70010 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -296,6 +296,50 @@
   return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
 }
 
+const net::NetworkTrafficAnnotationTag kNavigationPreloadTrafficAnnotation =
+    net::DefineNetworkTrafficAnnotation("service_worker_navigation_preload",
+                                        R"(
+    semantics {
+      sender: "Service Worker Navigation Preload"
+      description:
+        "This request is issued by a navigation to fetch the content of the "
+        "page that is being navigated to, in the case where a service worker "
+        "has been registered for the page and is using the Navigation Preload "
+        "API."
+      trigger:
+        "Navigating Chrome (by clicking on a link, bookmark, history item, "
+        "using session restore, etc)."
+      data:
+        "Arbitrary site-controlled data can be included in the URL, HTTP "
+        "headers, and request body. Requests may include cookies and "
+        "site-specific credentials."
+      destination: WEBSITE
+    }
+    policy {
+      cookies_allowed: YES
+      cookies_store: "user"
+      setting:
+        "This request can be prevented by disabling service workers, which can "
+        "be done by disabling cookie and site data under Settings, Content "
+        "Settings, Cookies."
+      chrome_policy {
+        URLBlacklist {
+          URLBlacklist: { entries: '*' }
+        }
+      }
+      chrome_policy {
+        URLWhitelist {
+          URLWhitelist { }
+        }
+      }
+    }
+    comments:
+      "Chrome would be unable to use service workers if this feature were "
+      "disabled, which could result in a degraded experience for websites that "
+      "register a service worker. Using either URLBlacklist or URLWhitelist "
+      "policies (or a combination of both) limits the scope of these requests."
+)");
+
 }  // namespace
 
 // ResponseCallback is owned by the callback that is passed to
@@ -741,7 +785,7 @@
       resource_request);
 
   // Start the network request for the URL using the network loader.
-  // TODO(falken): What to do about routing_id, request_id, traffic annotation?
+  // TODO(falken): What to do about routing_id, request_id?
   mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass;
   url_loader_client->Bind(&url_loader_client_ptr_to_pass);
   mojom::URLLoaderPtr url_loader_associated_ptr;
@@ -749,7 +793,8 @@
       mojo::MakeRequest(&url_loader_associated_ptr), -1 /* routing_id? */,
       -1 /* request_id? */, mojom::kURLLoadOptionNone, resource_request,
       std::move(url_loader_client_ptr_to_pass),
-      net::MutableNetworkTrafficAnnotationTag() /* empty? */);
+      net::MutableNetworkTrafficAnnotationTag(
+          kNavigationPreloadTrafficAnnotation));
 
   // Hook the load up to DelegatingURLLoader, which will call our
   // DelegatingURLLoaderClient.
diff --git a/content/child/blink_platform_impl.cc b/content/child/blink_platform_impl.cc
index 33d93604..bdbe41e 100644
--- a/content/child/blink_platform_impl.cc
+++ b/content/child/blink_platform_impl.cc
@@ -617,7 +617,7 @@
     if (!strcmp(name, kDataResources[i].name)) {
       base::StringPiece resource = GetContentClient()->GetDataResource(
           kDataResources[i].id, kDataResources[i].scale_factor);
-      if (kDataResources[i].is_gzipped) {
+      if (!resource.empty() && kDataResources[i].is_gzipped) {
         std::string uncompressed;
         CHECK(compression::GzipUncompress(resource.as_string(), &uncompressed));
         return WebData(uncompressed.data(), uncompressed.size());
diff --git a/device/bluetooth/bluetooth_adapter_mac_metrics.mm b/device/bluetooth/bluetooth_adapter_mac_metrics.mm
index 6a9014ef..c6ff76f8 100644
--- a/device/bluetooth/bluetooth_adapter_mac_metrics.mm
+++ b/device/bluetooth/bluetooth_adapter_mac_metrics.mm
@@ -7,6 +7,7 @@
 #import <CoreBluetooth/CoreBluetooth.h>
 #import <Foundation/Foundation.h>
 
+#include "base/mac/mac_util.h"
 #include "base/metrics/histogram_macros.h"
 
 namespace {
@@ -51,7 +52,15 @@
       case CBErrorAlreadyAdvertising:
         return MacOSBluetoothOperationsResult::CBERROR_ALREADY_ADVERTISING;
       case CBErrorConnectionFailed:
-        return MacOSBluetoothOperationsResult::CBERROR_CONNECTION_FAILED;
+        if (base::mac::IsAtLeastOS10_13()) {
+          return MacOSBluetoothOperationsResult::CBERROR_CONNECTION_FAILED;
+        } else {
+          // For macOS 10.12 or before, the value CBErrorMaxConnection has the
+          // same value than CBErrorConnectionFailed and the same description
+          // than CBErrorConnectionLimitReached.
+          return MacOSBluetoothOperationsResult::
+              CBERROR_CONNECTION_LIMIT_REACHED;
+        }
       case CBErrorConnectionLimitReached:
         return MacOSBluetoothOperationsResult::CBERROR_CONNECTION_LIMIT_REACHED;
       case CBErrorUnkownDevice:
diff --git a/extensions/browser/extension_event_histogram_value.h b/extensions/browser/extension_event_histogram_value.h
index b3c55e6..8662d15c 100644
--- a/extensions/browser/extension_event_histogram_value.h
+++ b/extensions/browser/extension_event_histogram_value.h
@@ -429,6 +429,7 @@
   WEB_VIEW_INTERNAL_ON_AUDIO_STATE_CHANGED,
   AUTOMATION_INTERNAL_ON_ACTION_RESULT,
   OMNIBOX_ON_DELETE_SUGGESTION,
+  PASSWORDS_PRIVATE_ON_SHOW_IMPORT_EXPORT_BUTTONS,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 22ba41f..2c53e7d 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1254,6 +1254,8 @@
   AUTOTESTPRIVATE_SETMOUSEREVERSESCROLL,
   METRICSPRIVATE_RECORDSPARSEHASHABLE,
   NETWORKINGPRIVATE_SELECTCELLULARMOBILENETWORK,
+  PASSWORDSPRIVATE_IMPORTPASSWORDS,
+  PASSWORDSPRIVATE_EXPORTPASSWORDS,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/guest_view/web_view/web_view_apitest.cc b/extensions/browser/guest_view/web_view/web_view_apitest.cc
index eac3214..38713481 100644
--- a/extensions/browser/guest_view/web_view/web_view_apitest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_apitest.cc
@@ -18,6 +18,7 @@
 #include "components/guest_view/browser/guest_view_manager_factory.h"
 #include "components/guest_view/browser/test_guest_view_manager.h"
 #include "content/public/browser/render_process_host.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_renderer_host.h"
@@ -293,6 +294,13 @@
 #define MAYBE_AcceptTouchEvents AcceptTouchEvents
 #endif
 IN_PROC_BROWSER_TEST_F(WebViewAPITest, MAYBE_AcceptTouchEvents) {
+  // This test only makes sense for non-OOPIF WebView, since with
+  // GuestViewCrossProcessFrames events are routed directly to the
+  // guest, so the embedder does not need to know about the installation of
+  // touch handlers.
+  if (base::FeatureList::IsEnabled(::features::kGuestViewCrossProcessFrames))
+    return;
+
   LaunchApp("web_view/accept_touch_events");
 
   content::RenderViewHost* embedder_rvh =
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm
index a40d0d916..aa43043 100644
--- a/ios/chrome/browser/context_menu/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -199,11 +199,9 @@
 // current screen view.
 - (void)testContextMenuOpenInNewTabFromTallPage {
 // TODO(crbug.com/755888): Reenable this test.
-#if !TARGET_IPHONE_SIMULATOR
   if (!IsIPadIdiom()) {
     EARL_GREY_TEST_DISABLED(@"Failing constently on iPhone devices.");
   }
-#endif
 
   // Set up test simple http server.
   std::map<GURL, std::string> responses;
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
index a4553c4e..328b69c 100644
--- a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
+++ b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
@@ -132,16 +132,6 @@
       testing::WaitUntilConditionOrTimeout(kWaitElementTimeout, condition),
       @"Waiting for tab to close");
 }
-
-// Select the tab with title |title| using UI (tab strip on iPad, stack view on
-// iPhone).
-void SelectTabUsingUI(NSString* title) {
-  if (IsCompact()) {
-    WaitAndTap(chrome_test_util::ShowTabsButton(), @"Tab switcher");
-  }
-  WaitAndTap(grey_text(title),
-             [NSString stringWithFormat:@"tab with title %@", title]);
-}
 }  // namespace
 
 // Test for the TabUsageRecorder class.
@@ -700,7 +690,7 @@
       performAction:grey_tap()];
   [ChromeEarlGrey waitForMainTabCount:(numberOfTabs + 1)];
 
-  SelectTabUsingUI(base::SysUTF8ToNSString(destinationURL.GetContent()));
+  chrome_test_util::SelectTabAtIndexInCurrentMode(numberOfTabs);
 
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
   [ChromeEarlGrey waitForWebViewContainingText:"Whee"];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm
index 36297a7..a963248 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm
@@ -351,6 +351,7 @@
     signinPromoCell.closeButtonAction = ^() {
       [weakSelf signinPromoCloseButtonAction];
     };
+    signinPromoCell.selectionStyle = UITableViewCellSelectionStyleNone;
     return signinPromoCell;
   }
 
diff --git a/ios/chrome/browser/ui/fullscreen_egtest.mm b/ios/chrome/browser/ui/fullscreen_egtest.mm
index 8457b006..4d62f45 100644
--- a/ios/chrome/browser/ui/fullscreen_egtest.mm
+++ b/ios/chrome/browser/ui/fullscreen_egtest.mm
@@ -364,7 +364,7 @@
 
   // A long page representing many lines and a link to go back.
   std::string manyLines =
-      "<p style='height:100em'>a</p>"
+      "<p style='height:200em'>a</p>"
       "<a onclick='window.history.back()' id='link'>link</a>";
   responses[URL] = manyLines;
   web::test::SetUpSimpleHttpServer(responses);
diff --git a/ios/showcase/payments/sc_payments_editor_egtest.mm b/ios/showcase/payments/sc_payments_editor_egtest.mm
index 4680242..1ab3fb997 100644
--- a/ios/showcase/payments/sc_payments_editor_egtest.mm
+++ b/ios/showcase/payments/sc_payments_editor_egtest.mm
@@ -208,13 +208,6 @@
 // states depending on the focused textfield and that they can be used to
 // navigate between the textfields.
 - (void)testInputAccessoryViewNavigationButtons {
-  // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once
-  // grey_typeText works on iOS 11.  The test failes on iOS 11 iPhone as well,
-  // but possibly for a different reason.
-  if (base::ios::IsRunningOnIOS11OrLater()) {
-    EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11.");
-  }
-
   // Initially, no error message is showing.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                           kWarningMessageAccessibilityID)]
@@ -277,30 +270,16 @@
   // Type in an address.
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(@"Address_textField")]
-      performAction:grey_typeText(@"Main St")];
+      performAction:grey_replaceText(@"Main St")];
 
-  // Assert the input accessory view's next button is enabled.
+  // Tap the input accessory view's next button.
   [[EarlGrey selectElementWithMatcher:InputAccessoryViewNextButton()]
-      assertWithMatcher:grey_enabled()];
-  // Assert the input accessory view's previous button is enabled and tap it.
-  [[[EarlGrey selectElementWithMatcher:InputAccessoryViewPreviousButton()]
-      assertWithMatcher:grey_enabled()] performAction:grey_tap()];
+      performAction:grey_tap()];
 
   // Assert the error message disappeared because an address was typed in.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                           kWarningMessageAccessibilityID)]
       assertWithMatcher:grey_notVisible()];
-
-  // Assert the province textfield is focused.
-  AssertTextFieldWithAccessibilityIDIsFirstResponder(
-      @"City/Province_textField");
-
-  // Assert the input accessory view's previous button is enabled.
-  [[EarlGrey selectElementWithMatcher:InputAccessoryViewPreviousButton()]
-      assertWithMatcher:grey_enabled()];
-  // Assert the input accessory view's next button is enabled.
-  [[EarlGrey selectElementWithMatcher:InputAccessoryViewNextButton()]
-      assertWithMatcher:grey_enabled()];
 }
 
 // Tests tapping the return key on every textfield causes the next textfield to
diff --git a/ios/testing/wait_util.mm b/ios/testing/wait_util.mm
index 9e53cc1..f5614862 100644
--- a/ios/testing/wait_util.mm
+++ b/ios/testing/wait_util.mm
@@ -13,7 +13,7 @@
 namespace testing {
 
 const NSTimeInterval kSpinDelaySeconds = 0.01;
-const NSTimeInterval kWaitForJSCompletionTimeout = 2.0;
+const NSTimeInterval kWaitForJSCompletionTimeout = 4.0;
 const NSTimeInterval kWaitForUIElementTimeout = 4.0;
 const NSTimeInterval kWaitForDownloadTimeout = 10.0;
 const NSTimeInterval kWaitForPageLoadTimeout = 10.0;
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 5e809c9..9e0eb80 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -220,6 +220,10 @@
 #define SK_SUPPORT_LEGACY_FONTMGR_API
 #endif
 
+#ifndef SK_SUPPORT_LEGACY_SAFESIZE64
+#define SK_SUPPORT_LEGACY_SAFESIZE64
+#endif
+
 ///////////////////////// Imported from BUILD.gn and skia_common.gypi
 
 /* In some places Skia can use static initializers for global initialization,
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index b65e5ee..4efbabf5 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -2953,6 +2953,12 @@
      {}
     ]
    ],
+   "fullscreen/rendering/fullscreen-pseudo-class-manual.html": [
+    [
+     "/fullscreen/rendering/fullscreen-pseudo-class-manual.html",
+     {}
+    ]
+   ],
    "geolocation-API/getCurrentPosition_permission-manual.html": [
     [
      "/geolocation-API/getCurrentPosition_permission-manual.html",
@@ -100747,6 +100753,16 @@
      {}
     ]
    ],
+   "fullscreen/rendering/fullscreen-pseudo-class-manual-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "fullscreen/rendering/fullscreen-pseudo-class-support.html": [
+    [
+     {}
+    ]
+   ],
    "fullscreen/trusted-click.js": [
     [
      {}
@@ -244814,11 +244830,11 @@
    "testharness"
   ],
   "css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt": [
-   "2a7dee5a47c1543a7071b52746fe516665f2cf4b",
+   "beb1e635a1676aa2a424a9f94f3ae106b6d3371b",
    "support"
   ],
   "css/geometry-1/DOMMatrix2DInit-validate-fixup.html": [
-   "8383666d61dec0c0e04b182e56fd1676e1942ed5",
+   "aa00e3456bf951230fb85999874795c918964cf4",
    "testharness"
   ],
   "css/geometry-1/DOMMatrixInit-validate-fixup.html": [
@@ -254305,6 +254321,18 @@
    "c7fc8323d503adb6d7f0c390a8add90c5c9e8082",
    "manual"
   ],
+  "fullscreen/rendering/fullscreen-pseudo-class-manual-expected.txt": [
+   "791c97ec5818625f661df54b8739b022c64902e9",
+   "support"
+  ],
+  "fullscreen/rendering/fullscreen-pseudo-class-manual.html": [
+   "258b3c119a6a9ea7220a339b0d8e4964b8fb2a5e",
+   "manual"
+  ],
+  "fullscreen/rendering/fullscreen-pseudo-class-support.html": [
+   "0cdfe5cf8321b6c46a75a2f75f6224970368d4ae",
+   "support"
+  ],
   "fullscreen/trusted-click.js": [
    "e401e8e8bcd97446991398d6021a9bd712c923c5",
    "support"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt
index f4686d7f..fe1a7ebc4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt
@@ -1,96 +1,188 @@
 This is a testharness.js-based test.
-Found 92 tests; 6 PASS, 86 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS {a: 1, m11: 2} (invalid)
-PASS {b: 0, m12: -1} (invalid)
-PASS {c: Infinity, m21: -Infinity} (invalid)
-PASS {d: 0, m22: NaN} (invalid)
-PASS {e: 1, m41: 1.00000001} (invalid)
-PASS {f: 0, m42: 5e-324} (invalid)
-FAIL Sanity check without dictionary ctx.getTransform is not a function
-FAIL {m13: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m14: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m23: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m24: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m31: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m32: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: -1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m34: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m43: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m44: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {is2D: undefined} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {a: 1, m11: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {b: 0, m12: undefined} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {c: 0, m21: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {c: 0, m21: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {c: -0, m21: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {c: -0, m21: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {d: Infinity, m22: Infinity} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {e: -Infinity, m41: -Infinity} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {f: NaN, m42: NaN} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {f: NaN, m42: NaN, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {f: 0, m42: null} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {f: -0, m42: null} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {a: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {b: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {c: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {d: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {e: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {f: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {a: -0, b: -0, c: -0, d: -0, e: -0, f: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m11: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m12: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m21: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m22: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m41: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m42: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m13: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m13: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m14: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m14: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m23: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m23: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m24: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m24: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m31: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m31: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m32: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m32: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m34: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m34: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m43: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m43: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m44: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m13: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m14: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m23: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m24: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m31: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m32: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: 0, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: -0, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: -1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m34: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m43: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m44: 0, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m13: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m14: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m23: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m24: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m31: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m32: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m33: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m34: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m43: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {m44: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
-FAIL {is2D: null} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+Found 184 tests; 12 PASS, 172 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS setTransform({a: 1, m11: 2}) (invalid)
+PASS addPath({a: 1, m11: 2}) (invalid)
+PASS setTransform({b: 0, m12: -1}) (invalid)
+PASS addPath({b: 0, m12: -1}) (invalid)
+PASS setTransform({c: Infinity, m21: -Infinity}) (invalid)
+PASS addPath({c: Infinity, m21: -Infinity}) (invalid)
+PASS setTransform({d: 0, m22: NaN}) (invalid)
+PASS addPath({d: 0, m22: NaN}) (invalid)
+PASS setTransform({e: 1, m41: 1.00000001}) (invalid)
+PASS addPath({e: 1, m41: 1.00000001}) (invalid)
+PASS setTransform({f: 0, m42: 5e-324}) (invalid)
+PASS addPath({f: 0, m42: 5e-324}) (invalid)
+FAIL setTransform (Sanity check without dictionary) ctx.getTransform is not a function
+FAIL addPath (Sanity check without second parameter) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m13: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m13: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m14: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m14: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m23: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m23: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m24: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m24: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m31: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m31: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m32: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m32: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: -1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: -1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m34: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m34: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m43: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m43: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m44: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m44: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({is2D: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({is2D: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({a: 1, m11: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({a: 1, m11: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({b: 0, m12: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({b: 0, m12: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({c: 0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({c: 0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({c: 0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({c: 0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({c: -0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({c: -0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({c: -0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({c: -0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({d: Infinity, m22: Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({d: Infinity, m22: Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({e: -Infinity, m41: -Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({e: -Infinity, m41: -Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({f: NaN, m42: NaN}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({f: NaN, m42: NaN}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({f: NaN, m42: NaN, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({f: NaN, m42: NaN, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({f: 0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({f: 0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({f: -0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({f: -0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({a: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({a: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({b: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({b: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({c: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({c: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({d: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({d: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({e: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({e: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({f: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({f: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m11: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m11: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m12: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m12: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m21: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m21: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m22: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m22: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m41: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m41: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m42: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m42: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m13: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m13: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m13: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m13: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m14: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m14: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m14: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m14: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m23: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m23: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m23: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m23: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m24: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m24: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m24: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m24: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m31: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m31: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m31: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m31: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m32: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m32: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m32: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m32: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m34: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m34: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m34: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m34: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m43: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m43: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m43: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m43: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m44: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m44: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m13: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m13: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m14: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m14: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m23: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m23: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m24: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m24: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m31: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m31: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m32: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m32: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: -0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: -0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: -1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: -1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m34: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m34: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m43: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m43: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m44: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m44: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m13: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m13: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m14: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m14: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m23: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m23: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m24: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m24: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m31: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m31: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m32: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m32: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m33: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m33: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m34: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m34: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m43: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m43: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({m44: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({m44: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL setTransform({is2D: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
+FAIL addPath({is2D: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html
index 523f2a1..5fb7e7d2 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html
@@ -10,8 +10,35 @@
 setup(() => {
   window.canvas = document.getElementById('canvas');
   window.ctx = canvas.getContext('2d');
+  window.ctx.fillStyle = '#000';
 });
 
+function clearCanvas(ctx) {
+  ctx.resetTransform();
+  ctx.clearRect(0, 0, window.canvas.width, window.canvas.height);
+}
+
+function drawRectWithSetTransform(ctx, transform) {
+  clearCanvas(ctx);
+  ctx.setTransform(transform);
+  ctx.fillRect(20, 20, 30, 30);
+  return window.canvas.toDataURL();
+}
+
+function drawRectWithAddPathTransform(ctx, transform) {
+  clearCanvas(ctx);
+  var path = new Path2D();
+  path.rect(20, 20, 30, 30);
+  var transformedPath = new Path2D();
+  if (transform === undefined) {
+    transformedPath.addPath(path);
+  } else {
+    transformedPath.addPath(path, transform);
+  }
+  ctx.fill(transformedPath);
+  return window.canvas.toDataURL();
+}
+
 [
   {a: 1, m11: 2},
   {b: 0, m12: -1},
@@ -23,7 +50,11 @@
   test(() => {
     ctx.resetTransform();
     assert_throws(new TypeError(), () => ctx.setTransform(dict));
-  }, `${format_dict(dict)} (invalid)`);
+  }, `setTransform(${format_dict(dict)}) (invalid)`);
+
+  test(() => {
+    assert_throws(new TypeError(), () => drawRectWithAddPathTransform(ctx, dict));
+  }, `addPath(${format_dict(dict)}) (invalid)`);
 });
 
 test(() => {
@@ -31,7 +62,14 @@
   ctx.setTransform(1, 2, 3, 4, 5, 6);
   const matrix = ctx.getTransform();
   checkMatrix(matrix, matrix2D({m11: 1, m12: 2, m21: 3, m22: 4, m41: 5, m42: 6}));
-}, `Sanity check without dictionary`);
+}, `setTransform (Sanity check without dictionary)`);
+
+test(() => {
+  var ident = matrix2D({});
+  var expectedResultURL = drawRectWithSetTransform(ctx, ident);
+  var actualResultURL = drawRectWithAddPathTransform(ctx);
+  assert_equals(actualResultURL, expectedResultURL);
+}, `addPath (Sanity check without second parameter)`);
 
 [
   // Input dict that would throw if ignore3D was false
@@ -57,10 +95,10 @@
   [{c: 0, m21: -0},                matrix2D({m21: -0})],
   [{c: -0, m21: 0},                matrix2D({m21: 0})],
   [{c: -0, m21: -0},               matrix2D({m21: -0})],
-  [{d: Infinity, m22: Infinity},   matrix2D({m22: Infinity})],
-  [{e: -Infinity, m41: -Infinity}, matrix2D({m41: -Infinity})],
-  [{f: NaN, m42: NaN},             matrix2D({m42: NaN})],
-  [{f: NaN, m42: NaN, is2D: true}, matrix2D({m42: NaN})],
+  [{d: Infinity, m22: Infinity},   matrix2D({})], // should be silently ignored
+  [{e: -Infinity, m41: -Infinity}, matrix2D({})], // should be silently ignored
+  [{f: NaN, m42: NaN},             matrix2D({})], // should be silently ignored
+  [{f: NaN, m42: NaN, is2D: true}, matrix2D({})], // should be silently ignored
   [{f: 0, m42: null},              matrix2D({m42: 0})], // null is converted to 0
   [{f: -0, m42: null},             matrix2D({m42: 0})], // null is converted to 0
   [{a: 2},                         matrix2D({m11: 2})],
@@ -134,6 +172,12 @@
     ctx.setTransform(dict);
     const matrix = ctx.getTransform();
     checkMatrix(matrix, expected);
-  }, `${format_dict(dict)}`);
-});
+  }, `setTransform(${format_dict(dict)})`);
+
+  test(() => {
+    var expectedResultURL = drawRectWithSetTransform(ctx, expected);
+    var actualResultURL = drawRectWithAddPathTransform(ctx, expected);
+    assert_equals(actualResultURL, expectedResultURL);
+  }, `addPath(${format_dict(dict)})`);
+ });
 </script>
diff --git a/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp b/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp
index 0770c6d..994654d 100644
--- a/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp
@@ -8,7 +8,6 @@
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/IDLTypes.h"
 #include "bindings/core/v8/ToV8ForCore.h"
-#include "bindings/core/v8/ToV8ForTesting.h"
 #include "bindings/core/v8/V8BindingForTesting.h"
 #include "bindings/core/v8/V8Internals.h"
 #include "bindings/core/v8/v8_test_sequence_callback.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h b/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h
index 1115b6b..b5a50968 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h
@@ -10,6 +10,7 @@
 
 #include "bindings/core/v8/IDLDictionaryBase.h"
 #include "bindings/core/v8/ScriptValue.h"
+#include "bindings/core/v8/V8BindingForTesting.h"
 #include "bindings/core/v8/V8NodeFilterCondition.h"
 #include "core/dom/Node.h"
 #include "core/typed_arrays/ArrayBufferViewHelpers.h"
@@ -79,6 +80,11 @@
   return ScriptValue(script_state, ToV8(std::forward<T>(value), script_state));
 }
 
+template <typename T>
+v8::Local<v8::Value> ToV8(V8TestingScope* scope, T value) {
+  return blink::ToV8(value, scope->GetContext()->Global(), scope->GetIsolate());
+}
+
 }  // namespace blink
 
 #endif  // ToV8ForCore_h
diff --git a/third_party/WebKit/Source/bindings/core/v8/ToV8ForTesting.h b/third_party/WebKit/Source/bindings/core/v8/ToV8ForTesting.h
deleted file mode 100644
index aad115a..0000000
--- a/third_party/WebKit/Source/bindings/core/v8/ToV8ForTesting.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ToV8ForTesting_h
-#define ToV8ForTesting_h
-
-#include "bindings/core/v8/V8BindingForTesting.h"
-
-namespace blink {
-
-template <typename T>
-v8::Local<v8::Value> ToV8(V8TestingScope* scope, T value) {
-  return blink::ToV8(value, scope->GetContext()->Global(), scope->GetIsolate());
-}
-
-}  // namespace blink
-
-#endif  // ToV8ForTesting_h
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp b/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp
index 8cfd7ef..d9e6d44 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp
@@ -9,7 +9,6 @@
 #include "bindings/core/v8/NativeValueTraitsImpl.h"
 #include "bindings/core/v8/ScriptValue.h"
 #include "bindings/core/v8/ToV8ForCore.h"
-#include "bindings/core/v8/ToV8ForTesting.h"
 #include "bindings/core/v8/V8BindingForTesting.h"
 #include "platform/wtf/Vector.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp b/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp
index ed642ff..df605cf 100644
--- a/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp
+++ b/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp
@@ -148,45 +148,25 @@
 TEST(CSSCalculationValue, RefCount) {
   RefPtr<CalculationValue> calc =
       CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll);
-  Length length_a(calc);
-  EXPECT_EQ(calc->RefCount(), 2);
 
-  Length length_b;
-  length_b = length_a;
-  EXPECT_EQ(calc->RefCount(), 3);
+  // FIXME: Test the Length construction without using the ref count value.
 
-  Length length_c(calc);
-  length_c = length_a;
-  EXPECT_EQ(calc->RefCount(), 4);
+  EXPECT_TRUE(calc->HasOneRef());
+  {
+    Length length_a(calc);
+    EXPECT_FALSE(calc->HasOneRef());
 
-  Length length_d(
-      CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll));
-  length_d = length_a;
-  EXPECT_EQ(calc->RefCount(), 5);
-}
-
-TEST(CSSCalculationValue, RefCountLeak) {
-  RefPtr<CalculationValue> calc =
-      CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll);
-  Length length_a(calc);
-
-  Length length_b = length_a;
-  for (int i = 0; i < 100; ++i)
+    Length length_b;
     length_b = length_a;
-  EXPECT_EQ(calc->RefCount(), 3);
 
-  Length length_c(length_a);
-  for (int i = 0; i < 100; ++i)
+    Length length_c(calc);
     length_c = length_a;
-  EXPECT_EQ(calc->RefCount(), 4);
 
-  Length length_d(calc);
-  for (int i = 0; i < 100; ++i)
+    Length length_d(
+        CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll));
     length_d = length_a;
-  EXPECT_EQ(calc->RefCount(), 5);
-
-  length_d = Length();
-  EXPECT_EQ(calc->RefCount(), 4);
+  }
+  EXPECT_TRUE(calc->HasOneRef());
 }
 
 TEST(CSSCalculationValue, AddToLengthUnitValues) {
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
index e42d8ec..8908b40 100644
--- a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
+++ b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
@@ -1475,23 +1475,22 @@
              .DeepEquivalent();
 }
 
-bool CanMergeLists(Element* first_list, Element* second_list) {
-  if (!first_list || !second_list || !first_list->IsHTMLElement() ||
-      !second_list->IsHTMLElement())
+bool CanMergeLists(const Element& first_list, const Element& second_list) {
+  if (!first_list.IsHTMLElement() || !second_list.IsHTMLElement())
     return false;
 
-  DCHECK(!NeedsLayoutTreeUpdate(*first_list));
-  DCHECK(!NeedsLayoutTreeUpdate(*second_list));
-  return first_list->HasTagName(
+  DCHECK(!NeedsLayoutTreeUpdate(first_list));
+  DCHECK(!NeedsLayoutTreeUpdate(second_list));
+  return first_list.HasTagName(
              second_list
-                 ->TagQName())  // make sure the list types match (ol vs. ul)
-         && HasEditableStyle(*first_list) &&
-         HasEditableStyle(*second_list)  // both lists are editable
-         && RootEditableElement(*first_list) ==
-                RootEditableElement(
-                    *second_list)  // don't cross editing boundaries
-         && IsVisiblyAdjacent(Position::InParentAfterNode(*first_list),
-                              Position::InParentBeforeNode(*second_list));
+                 .TagQName())  // make sure the list types match (ol vs. ul)
+         && HasEditableStyle(first_list) &&
+         HasEditableStyle(second_list)  // both lists are editable
+         &&
+         RootEditableElement(first_list) ==
+             RootEditableElement(second_list)  // don't cross editing boundaries
+         && IsVisiblyAdjacent(Position::InParentAfterNode(first_list),
+                              Position::InParentBeforeNode(second_list));
   // Make sure there is no visible content between this li and the previous list
 }
 
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.h b/third_party/WebKit/Source/core/editing/EditingUtilities.h
index a8b06c92..763d024 100644
--- a/third_party/WebKit/Source/core/editing/EditingUtilities.h
+++ b/third_party/WebKit/Source/core/editing/EditingUtilities.h
@@ -367,7 +367,7 @@
 
 // Boolean functions on Element
 
-bool CanMergeLists(Element* first_list, Element* second_list);
+bool CanMergeLists(const Element& first_list, const Element& second_list);
 
 CORE_EXPORT bool ElementCannotHaveEndTag(const Node&);
 
diff --git a/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp b/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp
index 6e8490c..7c9265a 100644
--- a/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp
@@ -68,6 +68,13 @@
   return true;
 }
 
+static bool CanMergeListElements(Element* first_list, Element* second_list) {
+  if (!first_list || !second_list || first_list == second_list)
+    return false;
+
+  return CanMergeLists(*first_list, *second_list);
+}
+
 DeleteSelectionCommand::DeleteSelectionCommand(
     Document& document,
     bool smart_delete,
@@ -877,10 +884,8 @@
   Node* list_item_in_second_paragraph =
       EnclosingNodeOfType(downstream_end_, IsListItem);
   if (list_item_in_first_paragraph && list_item_in_second_paragraph &&
-      list_item_in_first_paragraph->parentElement() !=
-          list_item_in_second_paragraph->parentElement() &&
-      CanMergeLists(list_item_in_first_paragraph->parentElement(),
-                    list_item_in_second_paragraph->parentElement())) {
+      CanMergeListElements(list_item_in_first_paragraph->parentElement(),
+                           list_item_in_second_paragraph->parentElement())) {
     MergeIdenticalElements(list_item_in_first_paragraph->parentElement(),
                            list_item_in_second_paragraph->parentElement(),
                            editing_state);
diff --git a/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp b/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp
index 7982de0..656997f4 100644
--- a/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp
@@ -134,14 +134,15 @@
   }
 
   GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
-  if (CanMergeLists(previous_list, new_list)) {
+  DCHECK(new_list);
+  if (previous_list && CanMergeLists(*previous_list, *new_list)) {
     MergeIdenticalElements(previous_list, new_list, editing_state);
     if (editing_state->IsAborted())
       return false;
   }
 
   GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
-  if (CanMergeLists(new_list, next_list)) {
+  if (next_list && CanMergeLists(*new_list, *next_list)) {
     MergeIdenticalElements(new_list, next_list, editing_state);
     if (editing_state->IsAborted())
       return false;
diff --git a/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp b/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp
index 22d007f..e5b5da8 100644
--- a/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp
@@ -72,10 +72,11 @@
 HTMLElement* InsertListCommand::MergeWithNeighboringLists(
     HTMLElement* passed_list,
     EditingState* editing_state) {
+  DCHECK(passed_list);
   HTMLElement* list = passed_list;
   Element* previous_list = ElementTraversal::PreviousSibling(*list);
   GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
-  if (CanMergeLists(previous_list, list)) {
+  if (previous_list && CanMergeLists(*previous_list, *list)) {
     MergeIdenticalElements(previous_list, list, editing_state);
     if (editing_state->IsAborted())
       return nullptr;
@@ -90,7 +91,7 @@
 
   HTMLElement* next_list = ToHTMLElement(next_sibling);
   GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
-  if (CanMergeLists(list, next_list)) {
+  if (CanMergeLists(*list, *next_list)) {
     MergeIdenticalElements(list, next_list, editing_state);
     if (editing_state->IsAborted())
       return nullptr;
@@ -599,7 +600,7 @@
       return;
 
     GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
-    if (CanMergeLists(previous_list, next_list))
+    if (previous_list && next_list && CanMergeLists(*previous_list, *next_list))
       MergeIdenticalElements(previous_list, next_list, editing_state);
 
     return;
diff --git a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
index 9ca0d85..7c22d392 100644
--- a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
+++ b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
@@ -1528,7 +1528,6 @@
     }
   }
 
-  SECURITY_DCHECK(current_style_->RefCount() > 0);
   if (check_for_break && !width_.FitsOnLine()) {
     // if we have floats, try to get below them.
     if (current_character_is_space_ && !ignoring_spaces_ &&
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc
index 037b3a9..c053dfb 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc
@@ -128,6 +128,11 @@
 
 }  // namespace
 
+// static
+void NGPhysicalFragmentTraits::Destruct(const NGPhysicalFragment* fragment) {
+  fragment->Destroy();
+}
+
 NGPhysicalFragment::NGPhysicalFragment(LayoutObject* layout_object,
                                        const ComputedStyle& style,
                                        NGPhysicalSize size,
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h
index 5222e74..9bd184d 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h
@@ -19,6 +19,12 @@
 class LayoutObject;
 struct NGPixelSnappedPhysicalBoxStrut;
 
+class NGPhysicalFragment;
+
+struct CORE_EXPORT NGPhysicalFragmentTraits {
+  static void Destruct(const NGPhysicalFragment*);
+};
+
 // The NGPhysicalFragment contains the output geometry from layout. The
 // fragment stores all of its information in the physical coordinate system for
 // use by paint, hit-testing etc.
@@ -39,9 +45,10 @@
 //   (See https://drafts.csswg.org/css-backgrounds-3/#the-background-image)
 // - image (<img>, svg <image>) or video (<video>) elements that are
 //   placeholders for displaying them.
-class CORE_EXPORT NGPhysicalFragment : public RefCounted<NGPhysicalFragment>,
-                                       public DisplayItemClient,
-                                       public ImageResourceObserver {
+class CORE_EXPORT NGPhysicalFragment
+    : public RefCounted<NGPhysicalFragment, NGPhysicalFragmentTraits>,
+      public DisplayItemClient,
+      public ImageResourceObserver {
  public:
   enum NGFragmentType {
     kFragmentBox = 0,
@@ -133,13 +140,6 @@
   void ShowFragmentTree() const;
 #endif
 
-  // Override RefCounted's deref() to ensure operator delete is called on the
-  // appropriate subclass type.
-  void Deref() const {
-    if (DerefBase())
-      Destroy();
-  }
-
  protected:
   NGPhysicalFragment(LayoutObject* layout_object,
                      const ComputedStyle& style,
@@ -162,6 +162,7 @@
   unsigned border_edge_ : 4;  // NGBorderEdges::Physical
 
  private:
+  friend struct NGPhysicalFragmentTraits;
   void Destroy() const;
 };
 
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
index 7389139..6a48a1f 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
@@ -90,9 +90,9 @@
   HarfBuzzFontCache::iterator result =
       FontGlobalContext::GetHarfBuzzFontCache().find(unique_id_);
   SECURITY_DCHECK(result != FontGlobalContext::GetHarfBuzzFontCache().end());
-  DCHECK_GT(result.Get()->value->RefCount(), 1);
+  DCHECK(!result.Get()->value->HasOneRef());
   result.Get()->value->Deref();
-  if (result.Get()->value->RefCount() == 1)
+  if (result.Get()->value->HasOneRef())
     FontGlobalContext::GetHarfBuzzFontCache().erase(unique_id_);
 }
 
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp
index 546d6c8..a614211f 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp
@@ -46,18 +46,17 @@
 TEST_F(HarfBuzzShaperTest, MutableUnique) {
   RefPtr<ShapeResult> result =
       ShapeResult::Create(&font, 0, TextDirection::kLtr);
-  EXPECT_EQ(1, result->RefCount());
+  EXPECT_TRUE(result->HasOneRef());
 
   // At this point, |result| has only one ref count.
   RefPtr<ShapeResult> result2 = result->MutableUnique();
   EXPECT_EQ(result.Get(), result2.Get());
-  EXPECT_EQ(2, result2->RefCount());
+  EXPECT_FALSE(result2->HasOneRef());
 
   // Since |result| has 2 ref counts, it should return a clone.
   RefPtr<ShapeResult> result3 = result->MutableUnique();
   EXPECT_NE(result.Get(), result3.Get());
-  EXPECT_EQ(1, result3->RefCount());
-  EXPECT_EQ(2, result->RefCount());
+  EXPECT_TRUE(result3->HasOneRef());
 }
 
 TEST_F(HarfBuzzShaperTest, ResolveCandidateRunsLatin) {
diff --git a/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp b/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp
index 2c30c7f..3b6e262 100644
--- a/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp
+++ b/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp
@@ -316,7 +316,7 @@
   EXPECT_EQ(10, function1());
 }
 
-class Number : public RefCounted<Number> {
+class Number {
  public:
   static RefPtr<Number> Create(int value) {
     return WTF::AdoptRef(new Number(value));
@@ -325,11 +325,20 @@
   ~Number() { value_ = 0; }
 
   int Value() const { return value_; }
+  int RefCount() const { return ref_count_; }
+
+  bool HasOneRef() const { return ref_count_ == 1; }
+  void Ref() const { ++ref_count_; }
+  void Deref() const {
+    if (--ref_count_ == 0)
+      delete this;
+  }
 
  private:
   explicit Number(int value) : value_(value) {}
 
   int value_;
+  mutable int ref_count_ = 1;
 };
 
 int MultiplyNumberByTwo(Number* number) {
@@ -338,7 +347,7 @@
 
 TEST(FunctionalTest, RefCountedStorage) {
   RefPtr<Number> five = Number::Create(5);
-  EXPECT_EQ(1, five->RefCount());
+  EXPECT_TRUE(five->HasOneRef());
   Function<int()> multiply_five_by_two_function =
       WTF::Bind(MultiplyNumberByTwo, five);
   EXPECT_EQ(2, five->RefCount());
diff --git a/third_party/WebKit/Source/platform/wtf/RefCounted.h b/third_party/WebKit/Source/platform/wtf/RefCounted.h
index 9bcd861..853357a 100644
--- a/third_party/WebKit/Source/platform/wtf/RefCounted.h
+++ b/third_party/WebKit/Source/platform/wtf/RefCounted.h
@@ -57,13 +57,6 @@
     return ref_count_ == 1;
   }
 
-  int RefCount() const {
-#if CHECK_REF_COUNTED_LIFECYCLE
-    SECURITY_DCHECK(verifier_.IsSafeToUse());
-#endif
-    return ref_count_;
-  }
-
  protected:
   RefCountedBase()
       : ref_count_(1)
@@ -135,7 +128,17 @@
 }
 #endif
 
+template <typename T, typename Traits>
+class RefCounted;
+
 template <typename T>
+struct DefaultRefCountedTraits {
+  static void Destruct(const T* x) {
+    WTF::RefCounted<T, DefaultRefCountedTraits>::DeleteInternal(x);
+  }
+};
+
+template <typename T, typename Traits = DefaultRefCountedTraits<T>>
 class RefCounted : public RefCountedBase {
   WTF_MAKE_NONCOPYABLE(RefCounted);
 
@@ -147,11 +150,15 @@
  public:
   void Deref() const {
     if (DerefBase())
-      delete static_cast<const T*>(this);
+      Traits::Destruct(static_cast<const T*>(this));
   }
 
  protected:
   RefCounted() {}
+
+ private:
+  friend struct DefaultRefCountedTraits<T>;
+  static void DeleteInternal(const T* x) { delete x; }
 };
 
 // Allows subclasses to use the default copy constructor.
diff --git a/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h b/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h
index 5b3015e..2289e8e 100644
--- a/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h
+++ b/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h
@@ -55,16 +55,31 @@
   base::AtomicRefCount ref_count_;
 };
 
-template <class T>
+template <typename T, typename Traits>
+class ThreadSafeRefCounted;
+
+template <typename T>
+struct DefaultThreadSafeRefCountedTraits {
+  static void Destruct(const T* x) {
+    WTF::ThreadSafeRefCounted<
+        T, DefaultThreadSafeRefCountedTraits>::DeleteInternal(x);
+  }
+};
+
+template <typename T, typename Traits = DefaultThreadSafeRefCountedTraits<T>>
 class ThreadSafeRefCounted : public ThreadSafeRefCountedBase {
  public:
   void Deref() {
     if (DerefBase())
-      delete static_cast<T*>(this);
+      Traits::Destruct(static_cast<T*>(this));
   }
 
  protected:
   ThreadSafeRefCounted() {}
+
+ private:
+  friend struct DefaultThreadSafeRefCountedTraits<T>;
+  static void DeleteInternal(const T* x) { delete x; }
 };
 
 }  // namespace WTF
diff --git a/third_party/WebKit/public/platform/WebPrivatePtr.h b/third_party/WebKit/public/platform/WebPrivatePtr.h
index 0fc3c6b..4dc30dd 100644
--- a/third_party/WebKit/public/platform/WebPrivatePtr.h
+++ b/third_party/WebKit/public/platform/WebPrivatePtr.h
@@ -41,7 +41,7 @@
 #endif
 
 namespace WTF {
-template <class T>
+template <class T, typename Traits>
 class ThreadSafeRefCounted;
 }
 
diff --git a/third_party/closure_compiler/externs/passwords_private.js b/third_party/closure_compiler/externs/passwords_private.js
index 78dce7da..ed89e96 100644
--- a/third_party/closure_compiler/externs/passwords_private.js
+++ b/third_party/closure_compiler/externs/passwords_private.js
@@ -108,6 +108,16 @@
 chrome.passwordsPrivate.getPasswordExceptionList = function(callback) {};
 
 /**
+ * @see https://developer.chrome.com/extensions/passwordsPrivate#method-importPasswords
+ */
+chrome.passwordsPrivate.importPasswords = function() {};
+
+/**
+ * @see https://developer.chrome.com/extensions/passwordsPrivate#method-exportPasswords
+ */
+chrome.passwordsPrivate.exportPasswords = function() {};
+
+/**
  * Fired when the saved passwords list has changed, meaning that an entry has
  * been added or removed.
  * @type {!ChromeEvent}
diff --git a/third_party/freetype/BUILD.gn b/third_party/freetype/BUILD.gn
index 0dbb1c6..fd6c35b 100644
--- a/third_party/freetype/BUILD.gn
+++ b/third_party/freetype/BUILD.gn
@@ -45,6 +45,7 @@
     "include/freetype-custom-config/ftoption.h",
     "src/src/base/ftbase.c",
     "src/src/base/ftbitmap.c",
+    "src/src/base/ftlcdfil.c",
   ]
 
   include_dirs = []
@@ -119,7 +120,6 @@
     "src/src/base/ftgasp.c",
     "src/src/base/ftglyph.c",
     "src/src/base/ftinit.c",
-    "src/src/base/ftlcdfil.c",
     "src/src/base/ftmm.c",
     "src/src/base/ftstroke.c",
     "src/src/base/fttype1.c",
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 9e6e738..ce2ddbc 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-8-1-23
-Revision: 6f2b6f8f72ffb5017ab00fca83185b21f1a9f56d
+Version: VER-2-8-1-24
+Revision: 02e80da6090c21d6e59ac955b7f56e1ad4a9850b
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
 License File: src/docs/FTL.TXT
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 6d0211a..004b3c5 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -23824,6 +23824,8 @@
   <int value="-55944747" label="disable-child-account-detection"/>
   <int value="-52483823" label="disable-new-video-renderer"/>
   <int value="-52241456" label="enable-single-click-autofill"/>
+  <int value="-50628385"
+      label="ContentSuggestionsThumbnailDominantColor:enabled"/>
   <int value="-50021298" label="ash-adjustable-large-cursor"/>
   <int value="-48920737" label="enable-smooth-scrolling"/>
   <int value="-45532639" label="enable-default-media-session"/>
@@ -24159,6 +24161,8 @@
   <int value="1000706989" label="AutomaticTabDiscarding:disabled"/>
   <int value="1002585107" label="emphasize-titles-in-omnibox-dropdown"/>
   <int value="1003002105" label="MaterialDesignBookmarks:disabled"/>
+  <int value="1004909189"
+      label="ContentSuggestionsThumbnailDominantColor:disabled"/>
   <int value="1007444341" label="enable-prefixed-encrypted-media"/>
   <int value="1015895665" label="drop-sync-credential:enabled"/>
   <int value="1018998019" label="memlog"/>
@@ -39118,6 +39122,7 @@
   <int value="125596241" label="component_updater_utils"/>
   <int value="126122632" label="web_history_expire_between_dates"/>
   <int value="129652775" label="devtools_network_resource"/>
+  <int value="129872904" label="service_worker_navigation_preload"/>
   <int value="131180348" label="indexed_db_internals_handler"/>
   <int value="131236802" label="data_reduction_proxy_secure_proxy_check"/>
   <int value="131741641" label="permission_reporting"/>
diff --git a/tools/perf/benchmarks/service_worker.py b/tools/perf/benchmarks/service_worker.py
index f9530e36..1cfc967 100644
--- a/tools/perf/benchmarks/service_worker.py
+++ b/tools/perf/benchmarks/service_worker.py
@@ -204,4 +204,7 @@
         self.DisableStory('http://localhost:8091/index.html',
                           [story.expectations.ANDROID_WEBVIEW],
                           'crbug.com/653924')
+        self.DisableStory('http://localhost:8091/index.html',
+                          [story.expectations.ALL],
+                          'crbug.com/767086')
     return StoryExpectations()
diff --git a/tools/traffic_annotation/sample_traffic_annotation.cc b/tools/traffic_annotation/sample_traffic_annotation.cc
index 6e53fa0..361059e 100644
--- a/tools/traffic_annotation/sample_traffic_annotation.cc
+++ b/tools/traffic_annotation/sample_traffic_annotation.cc
@@ -29,12 +29,13 @@
           setting: "..."
           chrome_policy {
             [POLICY_NAME] {
-                policy_options {mode: MANDATORY/RECOMMENDED/UNSET}
                 [POLICY_NAME]: ...
             }
           }
           policy_exception_justification = "..."
-        })");
+        }
+        comments: "..."
+      )");
 }
 
 // An example on one level traffic annotation.
@@ -65,7 +66,6 @@
             "Advanced. The feature is disabled by default."
           chrome_policy {
             SpellCheckServiceEnabled {
-                policy_options {mode: MANDATORY}
                 SpellCheckServiceEnabled: false
             }
           }
@@ -107,7 +107,6 @@
             "feature is enabled by default."
           chrome_policy {
             SearchSuggestEnabled {
-                policy_options {mode: MANDATORY}
                 SearchSuggestEnabled: false
             }
           }
@@ -141,7 +140,6 @@
             "'Passwords and forms'). There is no setting to disable the API."
           chrome_policy {
             PasswordManagerEnabled {
-                policy_options {mode: MANDATORY}
                 PasswordManagerEnabled: false
             }
           }
@@ -232,7 +230,6 @@
             "feature is enabled by default."
           chrome_policy {
             MetricsReportingEnabled {
-              policy_options {mode: MANDATORY}
               MetricsReportingEnabled: false
             }
           }
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index a1f3c58..68609c0 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -175,6 +175,7 @@
  <item id="safe_search_url_reporter" hash_code="119677115" content_hash_code="67393078" os_list="linux,windows"/>
  <item id="save_file_manager" hash_code="56275203" content_hash_code="56692339" os_list="linux,windows"/>
  <item id="sdch_dictionary_fetch" hash_code="47152935" deprecated="2017-09-16" content_hash_code="16764294"/>
+ <item id="service_worker_navigation_preload" hash_code="129872904" content_hash_code="79473248" os_list="linux,windows"/>
  <item id="service_worker_write_to_cache_job" hash_code="117963307" content_hash_code="18065724" os_list="linux,windows"/>
  <item id="signed_in_profile_avatar" hash_code="108903331" content_hash_code="72850619" os_list="linux,windows"/>
  <item id="speech_recognition_downstream" hash_code="26096088" content_hash_code="120733233" os_list="linux,windows"/>