diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index fa4ec72c..5b19530 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -137,7 +137,7 @@
   # to configure warnings.
   is_clang =
       current_os == "mac" || current_os == "ios" || current_os == "chromeos" ||
-      current_os == "fuchsia" ||
+      current_os == "fuchsia" || current_os == "win" ||
       (current_os == "linux" && current_cpu != "s390x" &&
        current_cpu != "s390" && current_cpu != "ppc64" && current_cpu != "ppc")
 
diff --git a/cc/paint/skia_paint_canvas.cc b/cc/paint/skia_paint_canvas.cc
index 8c69d875..a01e4eb 100644
--- a/cc/paint/skia_paint_canvas.cc
+++ b/cc/paint/skia_paint_canvas.cc
@@ -8,6 +8,7 @@
 #include "cc/paint/display_item_list.h"
 #include "cc/paint/paint_recorder.h"
 #include "third_party/skia/include/core/SkAnnotation.h"
+#include "third_party/skia/include/core/SkColorSpaceXformCanvas.h"
 #include "third_party/skia/include/core/SkMetaData.h"
 #include "third_party/skia/include/utils/SkNWayCanvas.h"
 
@@ -22,8 +23,23 @@
                                  const SkSurfaceProps& props)
     : canvas_(new SkCanvas(bitmap, props)), owned_(canvas_) {}
 
+SkiaPaintCanvas::SkiaPaintCanvas(SkCanvas* canvas,
+                                 sk_sp<SkColorSpace> target_color_space)
+    : canvas_(canvas) {
+  WrapCanvasInColorSpaceXformCanvas(target_color_space);
+}
+
 SkiaPaintCanvas::~SkiaPaintCanvas() = default;
 
+void SkiaPaintCanvas::WrapCanvasInColorSpaceXformCanvas(
+    sk_sp<SkColorSpace> target_color_space) {
+  if (target_color_space) {
+    color_space_xform_canvas_ =
+        SkCreateColorSpaceXformCanvas(canvas_, target_color_space);
+    canvas_ = color_space_xform_canvas_.get();
+  }
+}
+
 SkMetaData& SkiaPaintCanvas::getMetaData() {
   return canvas_->getMetaData();
 }
diff --git a/cc/paint/skia_paint_canvas.h b/cc/paint/skia_paint_canvas.h
index 1fd313b53..a1b174a2 100644
--- a/cc/paint/skia_paint_canvas.h
+++ b/cc/paint/skia_paint_canvas.h
@@ -28,6 +28,9 @@
   explicit SkiaPaintCanvas(SkCanvas* canvas);
   explicit SkiaPaintCanvas(const SkBitmap& bitmap);
   explicit SkiaPaintCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props);
+  // If |target_color_space| is non-nullptr, then this will wrap |canvas| in a
+  // SkColorSpaceXformCanvas.
+  SkiaPaintCanvas(SkCanvas* canvas, sk_sp<SkColorSpace> target_color_space);
   ~SkiaPaintCanvas() override;
 
   SkMetaData& getMetaData() override;
@@ -139,8 +142,11 @@
   using PaintCanvas::drawPicture;
 
  private:
+  void WrapCanvasInColorSpaceXformCanvas(
+      sk_sp<SkColorSpace> target_color_space);
   SkCanvas* canvas_;
   std::unique_ptr<SkCanvas> owned_;
+  std::unique_ptr<SkCanvas> color_space_xform_canvas_;
 
   DISALLOW_COPY_AND_ASSIGN(SkiaPaintCanvas);
 };
diff --git a/chrome/VERSION b/chrome/VERSION
index 2ab7b9b..b5cad96 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=61
 MINOR=0
-BUILD=3115
+BUILD=3116
 PATCH=0
diff --git a/chrome/browser/after_startup_task_utils.cc b/chrome/browser/after_startup_task_utils.cc
index 1ba1bd5..5c032d1 100644
--- a/chrome/browser/after_startup_task_utils.cc
+++ b/chrome/browser/after_startup_task_utils.cc
@@ -13,6 +13,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/process/process_info.h"
 #include "base/rand_util.h"
+#include "base/sequence_checker.h"
 #include "base/synchronization/atomic_flag.h"
 #include "base/task_runner.h"
 #include "base/tracked_objects.h"
@@ -122,16 +123,19 @@
 
 // Observes the first visible page load and sets the startup complete
 // flag accordingly.
-class StartupObserver : public WebContentsObserver, public base::NonThreadSafe {
+class StartupObserver : public WebContentsObserver {
  public:
   StartupObserver() : weak_factory_(this) {}
-  ~StartupObserver() override { DCHECK(IsBrowserStartupComplete()); }
+  ~StartupObserver() override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    DCHECK(IsBrowserStartupComplete());
+  }
 
   void Start();
 
  private:
   void OnStartupComplete() {
-    DCHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     SetBrowserStartupIsComplete();
     delete this;
   }
@@ -156,6 +160,8 @@
 
   void WebContentsDestroyed() override { OnStartupComplete(); }
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   base::WeakPtrFactory<StartupObserver> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(StartupObserver);
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index fca71f7..7334e710 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -278,6 +278,7 @@
 }
 
 BrowserProcessImpl::~BrowserProcessImpl() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   extensions::ExtensionsBrowserClient::Set(nullptr);
 #endif
@@ -542,7 +543,7 @@
 
 metrics_services_manager::MetricsServicesManager*
 BrowserProcessImpl::GetMetricsServicesManager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!metrics_services_manager_) {
     metrics_services_manager_.reset(
         new metrics_services_manager::MetricsServicesManager(
@@ -553,28 +554,28 @@
 }
 
 metrics::MetricsService* BrowserProcessImpl::metrics_service() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return GetMetricsServicesManager()->GetMetricsService();
 }
 
 rappor::RapporServiceImpl* BrowserProcessImpl::rappor_service() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return GetMetricsServicesManager()->GetRapporServiceImpl();
 }
 
 ukm::UkmRecorder* BrowserProcessImpl::ukm_recorder() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return GetMetricsServicesManager()->GetUkmService();
 }
 
 IOThread* BrowserProcessImpl::io_thread() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(io_thread_.get());
   return io_thread_.get();
 }
 
 WatchDogThread* BrowserProcessImpl::watchdog_thread() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_watchdog_thread_)
     CreateWatchdogThread();
   DCHECK(watchdog_thread_.get() != NULL);
@@ -582,26 +583,26 @@
 }
 
 ProfileManager* BrowserProcessImpl::profile_manager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_profile_manager_)
     CreateProfileManager();
   return profile_manager_.get();
 }
 
 PrefService* BrowserProcessImpl::local_state() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_local_state_)
     CreateLocalState();
   return local_state_.get();
 }
 
 net::URLRequestContextGetter* BrowserProcessImpl::system_request_context() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return io_thread()->system_url_request_context_getter();
 }
 
 variations::VariationsService* BrowserProcessImpl::variations_service() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return GetMetricsServicesManager()->GetVariationsService();
 }
 
@@ -619,7 +620,7 @@
 }
 
 NotificationUIManager* BrowserProcessImpl::notification_ui_manager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 // TODO(miguelg) return NULL for MAC as well once native notifications
 // are enabled by default.
 #if defined(OS_ANDROID)
@@ -642,12 +643,12 @@
 }
 
 message_center::MessageCenter* BrowserProcessImpl::message_center() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return message_center::MessageCenter::Get();
 }
 
 policy::BrowserPolicyConnector* BrowserProcessImpl::browser_policy_connector() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_browser_policy_connector_) {
     DCHECK(!browser_policy_connector_);
     browser_policy_connector_ = platform_part_->CreateBrowserPolicyConnector();
@@ -661,21 +662,21 @@
 }
 
 IconManager* BrowserProcessImpl::icon_manager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_icon_manager_)
     CreateIconManager();
   return icon_manager_.get();
 }
 
 GpuProfileCache* BrowserProcessImpl::gpu_profile_cache() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!gpu_profile_cache_.get())
     gpu_profile_cache_.reset(GpuProfileCache::Create());
   return gpu_profile_cache_.get();
 }
 
 GpuModeManager* BrowserProcessImpl::gpu_mode_manager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!gpu_mode_manager_.get())
     gpu_mode_manager_.reset(new GpuModeManager());
   return gpu_mode_manager_.get();
@@ -684,7 +685,7 @@
 void BrowserProcessImpl::CreateDevToolsHttpProtocolHandler(
     const std::string& ip,
     uint16_t port) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if !defined(OS_ANDROID)
   // StartupBrowserCreator::LaunchBrowser can be run multiple times when browser
   // is started with several profiles or existing browser process is reused.
@@ -695,7 +696,7 @@
 }
 
 void BrowserProcessImpl::CreateDevToolsAutoOpener() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if !defined(OS_ANDROID)
   // StartupBrowserCreator::LaunchBrowser can be run multiple times when browser
   // is started with several profiles or existing browser process is reused.
@@ -705,21 +706,21 @@
 }
 
 bool BrowserProcessImpl::IsShuttingDown() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // TODO(crbug.com/560486): Fix the tests that make the check of
   // |tearing_down_| necessary here.
   return shutting_down_ || tearing_down_;
 }
 
 printing::PrintJobManager* BrowserProcessImpl::print_job_manager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return print_job_manager_.get();
 }
 
 printing::PrintPreviewDialogController*
     BrowserProcessImpl::print_preview_dialog_controller() {
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!print_preview_dialog_controller_.get())
     CreatePrintPreviewDialogController();
   return print_preview_dialog_controller_.get();
@@ -732,7 +733,7 @@
 printing::BackgroundPrintingManager*
     BrowserProcessImpl::background_printing_manager() {
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!background_printing_manager_.get())
     CreateBackgroundPrintingManager();
   return background_printing_manager_.get();
@@ -743,7 +744,7 @@
 }
 
 IntranetRedirectDetector* BrowserProcessImpl::intranet_redirect_detector() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!intranet_redirect_detector_.get())
     CreateIntranetRedirectDetector();
   return intranet_redirect_detector_.get();
@@ -801,14 +802,14 @@
 }
 
 gcm::GCMDriver* BrowserProcessImpl::gcm_driver() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!gcm_driver_)
     CreateGCMDriver();
   return gcm_driver_.get();
 }
 
 memory::TabManager* BrowserProcessImpl::GetTabManager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
   if (!tab_manager_.get())
     tab_manager_.reset(new memory::TabManager());
@@ -825,7 +826,7 @@
 
 physical_web::PhysicalWebDataSource*
 BrowserProcessImpl::GetPhysicalWebDataSource() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if defined(OS_ANDROID)
   if (!physical_web_data_source_) {
     CreatePhysicalWebDataSource();
@@ -875,14 +876,14 @@
 }
 
 DownloadRequestLimiter* BrowserProcessImpl::download_request_limiter() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!download_request_limiter_.get())
     download_request_limiter_ = new DownloadRequestLimiter();
   return download_request_limiter_.get();
 }
 
 BackgroundModeManager* BrowserProcessImpl::background_mode_manager() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if BUILDFLAG(ENABLE_BACKGROUND)
   if (!background_mode_manager_.get())
     CreateBackgroundModeManager();
@@ -901,7 +902,7 @@
 }
 
 StatusTray* BrowserProcessImpl::status_tray() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!status_tray_.get())
     CreateStatusTray();
   return status_tray_.get();
@@ -909,7 +910,7 @@
 
 safe_browsing::SafeBrowsingService*
 BrowserProcessImpl::safe_browsing_service() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_safe_browsing_service_)
     CreateSafeBrowsingService();
   return safe_browsing_service_.get();
@@ -917,7 +918,7 @@
 
 safe_browsing::ClientSideDetectionService*
     BrowserProcessImpl::safe_browsing_detection_service() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (safe_browsing_service())
     return safe_browsing_service()->safe_browsing_detection_service();
   return NULL;
@@ -925,7 +926,7 @@
 
 subresource_filter::ContentRulesetService*
 BrowserProcessImpl::subresource_filter_ruleset_service() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_subresource_filter_ruleset_service_)
     CreateSubresourceFilterRulesetService();
   return subresource_filter_ruleset_service_.get();
@@ -1321,7 +1322,7 @@
 }
 
 void BrowserProcessImpl::Pin() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // CHECK(!IsShuttingDown());
   if (IsShuttingDown()) {
@@ -1333,7 +1334,7 @@
 }
 
 void BrowserProcessImpl::Unpin() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   release_last_reference_callstack_ = base::debug::StackTrace();
 
   shutting_down_ = true;
diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h
index ac66b06..b3f81e36 100644
--- a/chrome/browser/browser_process_impl.h
+++ b/chrome/browser/browser_process_impl.h
@@ -18,7 +18,7 @@
 #include "base/debug/stack_trace.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -65,7 +65,6 @@
 
 // Real implementation of BrowserProcess that creates and returns the services.
 class BrowserProcessImpl : public BrowserProcess,
-                           public base::NonThreadSafe,
                            public KeepAliveStateObserver {
  public:
   // |local_state_task_runner| must be a shutdown-blocking task runner.
@@ -354,6 +353,8 @@
   std::unique_ptr<physical_web::PhysicalWebDataSource>
       physical_web_data_source_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(BrowserProcessImpl);
 };
 
diff --git a/chrome/browser/browser_process_platform_part_chromeos.cc b/chrome/browser/browser_process_platform_part_chromeos.cc
index c8340b7..08f4c21 100644
--- a/chrome/browser/browser_process_platform_part_chromeos.cc
+++ b/chrome/browser/browser_process_platform_part_chromeos.cc
@@ -32,7 +32,9 @@
 BrowserProcessPlatformPart::BrowserProcessPlatformPart()
     : created_profile_helper_(false) {}
 
-BrowserProcessPlatformPart::~BrowserProcessPlatformPart() {}
+BrowserProcessPlatformPart::~BrowserProcessPlatformPart() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
 
 void BrowserProcessPlatformPart::InitializeAutomaticRebootManager() {
   DCHECK(!automatic_reboot_manager_);
@@ -95,7 +97,7 @@
 }
 
 chromeos::ProfileHelper* BrowserProcessPlatformPart::profile_helper() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!created_profile_helper_)
     CreateProfileHelper();
   return profile_helper_.get();
diff --git a/chrome/browser/browser_process_platform_part_chromeos.h b/chrome/browser/browser_process_platform_part_chromeos.h
index e0c970e1..11348eff 100644
--- a/chrome/browser/browser_process_platform_part_chromeos.h
+++ b/chrome/browser/browser_process_platform_part_chromeos.h
@@ -11,7 +11,7 @@
 #include "base/compiler_specific.h"
 #include "base/containers/flat_set.h"
 #include "base/macros.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "chrome/browser/browser_process_platform_part_base.h"
 
 namespace chromeos {
@@ -38,8 +38,7 @@
 
 class ScopedKeepAlive;
 
-class BrowserProcessPlatformPart : public BrowserProcessPlatformPartBase,
-                                   public base::NonThreadSafe {
+class BrowserProcessPlatformPart : public BrowserProcessPlatformPartBase {
  public:
   BrowserProcessPlatformPart();
   ~BrowserProcessPlatformPart() override;
@@ -132,6 +131,8 @@
 
   base::flat_set<std::string> compatible_cros_components_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(BrowserProcessPlatformPart);
 };
 
diff --git a/chrome/browser/chromeos/drive/debug_info_collector.cc b/chrome/browser/chromeos/drive/debug_info_collector.cc
index bfbb7a5..1ed296b 100644
--- a/chrome/browser/chromeos/drive/debug_info_collector.cc
+++ b/chrome/browser/chromeos/drive/debug_info_collector.cc
@@ -110,9 +110,8 @@
 
   blocking_task_runner_->PostTaskAndReply(
       FROM_HERE,
-      base::Bind(&IterateFileCacheInternal,
-                 metadata_,
-                 google_apis::CreateRelayCallback(iteration_callback)),
+      base::BindOnce(&IterateFileCacheInternal, metadata_,
+                     google_apis::CreateRelayCallback(iteration_callback)),
       completion_callback);
 }
 
diff --git a/chrome/browser/chromeos/drive/download_handler.cc b/chrome/browser/chromeos/drive/download_handler.cc
index 4be75ca..96b7b38 100644
--- a/chrome/browser/chromeos/drive/download_handler.cc
+++ b/chrome/browser/chromeos/drive/download_handler.cc
@@ -287,8 +287,9 @@
     return;
 
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, base::Bind(&DownloadHandler::FreeDiskSpaceIfNeededImmediately,
-                            weak_ptr_factory_.GetWeakPtr()),
+      FROM_HERE,
+      base::BindOnce(&DownloadHandler::FreeDiskSpaceIfNeededImmediately,
+                     weak_ptr_factory_.GetWeakPtr()),
       free_disk_space_delay_);
 
   has_pending_free_disk_space_ = true;
@@ -322,12 +323,11 @@
   // Remove any persisted Drive DownloadItem. crbug.com/171384
   if (IsPersistedDriveDownload(drive_tmp_download_path_, download)) {
     // Remove download later, since doing it here results in a crash.
-    BrowserThread::PostTask(BrowserThread::UI,
-                            FROM_HERE,
-                            base::Bind(&DownloadHandler::RemoveDownload,
-                                       weak_ptr_factory_.GetWeakPtr(),
-                                       static_cast<void*>(manager),
-                                       download->GetId()));
+    BrowserThread::PostTask(
+        BrowserThread::UI, FROM_HERE,
+        base::BindOnce(&DownloadHandler::RemoveDownload,
+                       weak_ptr_factory_.GetWeakPtr(),
+                       static_cast<void*>(manager), download->GetId()));
   }
 }
 
diff --git a/chrome/browser/chromeos/drive/file_system_util.cc b/chrome/browser/chromeos/drive/file_system_util.cc
index 6be109e..dbb73a7 100644
--- a/chrome/browser/chromeos/drive/file_system_util.cc
+++ b/chrome/browser/chromeos/drive/file_system_util.cc
@@ -193,7 +193,8 @@
   FileSystemInterface* file_system = GetFileSystemByProfile(profile);
   if (!file_system || !IsUnderDriveMountPoint(path)) {
     content::BrowserThread::GetBlockingPool()->PostTask(
-        FROM_HERE, base::Bind(callback, FILE_ERROR_FAILED, base::FilePath()));
+        FROM_HERE,
+        base::BindOnce(callback, FILE_ERROR_FAILED, base::FilePath()));
     return;
   }
 
@@ -215,7 +216,7 @@
                                  true /* is_recursive */, callback);
   } else {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, FILE_ERROR_OK));
+        FROM_HERE, base::BindOnce(callback, FILE_ERROR_OK));
   }
 }
 
diff --git a/chrome/browser/chromeos/drive/fileapi/async_file_util.cc b/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
index a2fae23..bb3debda 100644
--- a/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
+++ b/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
@@ -55,15 +55,14 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&fileapi_internal::RunFileSystemCallback,
-                 file_system_getter, function,
-                 on_error_callback.is_null() ?
-                 base::Closure() :
-                 base::Bind(&google_apis::RunTaskWithTaskRunner,
-                            base::ThreadTaskRunnerHandle::Get(),
-                            on_error_callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&fileapi_internal::RunFileSystemCallback,
+                     file_system_getter, function,
+                     on_error_callback.is_null()
+                         ? base::Closure()
+                         : base::Bind(&google_apis::RunTaskWithTaskRunner,
+                                      base::ThreadTaskRunnerHandle::Get(),
+                                      on_error_callback)));
 }
 
 // Runs CreateOrOpenFile callback based on the given |error| and |file|.
diff --git a/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.cc b/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.cc
index e42ce7f..df019a6 100644
--- a/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.cc
+++ b/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.cc
@@ -38,8 +38,8 @@
       entry->file_specific_info().is_hosted_document()) {
     url = GURL(entry->file_specific_info().alternate_url());
   }
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE, base::Bind(callback, url));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(callback, url));
 }
 
 // Called on the UI thread after
@@ -52,14 +52,14 @@
   FileSystemInterface* const file_system =
       fileapi_internal::GetFileSystemFromUrl(url);
   if (!file_system) {
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE, base::Bind(callback, GURL()));
+    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                            base::BindOnce(callback, GURL()));
     return;
   }
   const base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
   if (file_path.empty()) {
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE, base::Bind(callback, GURL()));
+    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                            base::BindOnce(callback, GURL()));
     return;
   }
 
@@ -136,9 +136,8 @@
     const storage::URLCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&GetRedirectURLForContentsOnUIThread, url, callback));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&GetRedirectURLForContentsOnUIThread, url, callback));
 }
 
 }  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc b/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
index 684d8415..033d62d 100644
--- a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
+++ b/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
@@ -341,9 +341,9 @@
                      base::File::FLAG_APPEND)) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
-        base::Bind(callback,
-                   Passed(base::File(base::File::FILE_ERROR_FAILED)),
-                   base::Closure()));
+        base::BindOnce(callback,
+                       Passed(base::File(base::File::FILE_ERROR_FAILED)),
+                       base::Closure()));
     return;
   }
 
diff --git a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.cc b/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.cc
index 6953256..878d3e5 100644
--- a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.cc
+++ b/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.cc
@@ -28,16 +28,14 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(
-          &fileapi_internal::RunFileSystemCallback,
-          file_system_getter,
-          base::Bind(&fileapi_internal::CreateWritableSnapshotFile,
-                     drive_path, google_apis::CreateRelayCallback(callback)),
-          google_apis::CreateRelayCallback(base::Bind(
-              callback, base::File::FILE_ERROR_FAILED, base::FilePath(),
-              base::Closure()))));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(
+          &fileapi_internal::RunFileSystemCallback, file_system_getter,
+          base::Bind(&fileapi_internal::CreateWritableSnapshotFile, drive_path,
+                     google_apis::CreateRelayCallback(callback)),
+          google_apis::CreateRelayCallback(
+              base::Bind(callback, base::File::FILE_ERROR_FAILED,
+                         base::FilePath(), base::Closure()))));
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/drive/write_on_cache_file.cc b/chrome/browser/chromeos/drive/write_on_cache_file.cc
index 0430801..0cfbbd3 100644
--- a/chrome/browser/chromeos/drive/write_on_cache_file.cc
+++ b/chrome/browser/chromeos/drive/write_on_cache_file.cc
@@ -41,8 +41,9 @@
 
   base::PostTaskWithTraitsAndReply(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
-      base::Bind(file_io_task_callback, error, local_cache_path),
-      base::Bind(&RunCloseCallbackAndReplyTask, close_callback, reply, error));
+      base::BindOnce(file_io_task_callback, error, local_cache_path),
+      base::BindOnce(&RunCloseCallbackAndReplyTask, close_callback, reply,
+                     error));
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
index a2e8168..3c4fac88 100644
--- a/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
@@ -37,8 +37,8 @@
   is_starting_up_ = true;
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
-      base::Bind(&DeviceEventRouter::StartupDelayed,
-                 weak_factory_.GetWeakPtr()),
+      base::BindOnce(&DeviceEventRouter::StartupDelayed,
+                     weak_factory_.GetWeakPtr()),
       startup_time_delta_);
 }
 
@@ -130,8 +130,8 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
-      base::Bind(&DeviceEventRouter::SuspendDoneDelayed,
-                 weak_factory_.GetWeakPtr()),
+      base::BindOnce(&DeviceEventRouter::SuspendDoneDelayed,
+                     weak_factory_.GetWeakPtr()),
       resume_time_delta_);
 }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.cc b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
index 3e469d7..c667b28c 100644
--- a/chrome/browser/chromeos/extensions/file_manager/event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
@@ -540,8 +540,8 @@
 
     if (is_on_drive) {
       // For Drive, file watching is done via OnDirectoryChanged().
-      base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                    base::Bind(callback, true));
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(callback, true));
     } else {
       // For local files, start watching using FileWatcher.
       watcher->WatchLocalFile(
@@ -555,8 +555,8 @@
     file_watchers_[watch_path] = std::move(watcher);
   } else {
     iter->second->AddExtension(extension_id);
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  base::Bind(callback, true));
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(callback, true));
   }
 }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc
index 1972a4b..c981b2c 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc
@@ -184,8 +184,8 @@
     // function.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
-        base::Bind(&FileSelectorImpl::FileSelectionCanceled,
-                   base::Unretained(this), static_cast<void*>(NULL)));
+        base::BindOnce(&FileSelectorImpl::FileSelectionCanceled,
+                       base::Unretained(this), static_cast<void*>(NULL)));
   }
 }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
index f0de2b0..9e476e8 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
@@ -114,7 +114,7 @@
     // The callback will take a reference to the function and keep it alive.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
-        base::Bind(
+        base::BindOnce(
             &FileBrowserHandlerInternalSelectFileFunction::OnFilePathSelected,
             function, success_, selected_path_));
     delete this;
@@ -300,8 +300,10 @@
 
   // Let's check that the file has the expected content.
   const std::string expected_contents = "hello from test extension.";
-  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
-      base::Bind(&ExpectFileContentEquals, selected_path, expected_contents));
+  content::BrowserThread::PostTask(
+      content::BrowserThread::FILE, FROM_HERE,
+      base::BindOnce(&ExpectFileContentEquals, selected_path,
+                     expected_contents));
 
   // Make sure test doesn't finish until we check on file thread that the
   // selected file's content is as expected.
diff --git a/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc b/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc
index 529bc17..9a56685 100644
--- a/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc
@@ -104,8 +104,9 @@
     SendDriveFileTransferEvent();
   } else if (no_pending_task) {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::Bind(&JobEventRouter::SendDriveFileTransferEvent,
-                              weak_factory_.GetWeakPtr()),
+        FROM_HERE,
+        base::BindOnce(&JobEventRouter::SendDriveFileTransferEvent,
+                       weak_factory_.GetWeakPtr()),
         event_delay_);
   }
 }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index fd96aa9..cfdd9e3b 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -138,9 +138,8 @@
 
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&NotifyCopyProgress,
-                 profile_id, *operation_id, type,
-                 source_url, destination_url, size));
+      base::BindOnce(&NotifyCopyProgress, profile_id, *operation_id, type,
+                     source_url, destination_url, size));
 }
 
 // Notifies the copy completion to extensions via event router.
@@ -172,9 +171,8 @@
 
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&NotifyCopyCompletion,
-                 profile_id, *operation_id,
-                 source_url, destination_url, error));
+      base::BindOnce(&NotifyCopyCompletion, profile_id, *operation_id,
+                     source_url, destination_url, error));
 }
 
 // Starts the copy operation via FileSystemOperationRunner.
@@ -237,7 +235,7 @@
     const std::string& hash) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                          base::Bind(callback, hash));
+                          base::BindOnce(callback, hash));
 }
 
 // Calls a response callback on the UI thread.
@@ -247,7 +245,7 @@
     const base::File::Info& file_info) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                          base::Bind(callback, result, file_info));
+                          base::BindOnce(callback, result, file_info));
 }
 
 }  // namespace
@@ -311,7 +309,7 @@
     bool success) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                          base::Bind(callback, success));
+                          base::BindOnce(callback, success));
 }
 
 void PostNotificationCallbackTaskToUIThread(
@@ -319,7 +317,7 @@
     storage::WatcherManager::ChangeType type) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                          base::Bind(callback, type));
+                          base::BindOnce(callback, type));
 }
 
 }  // namespace
@@ -356,10 +354,11 @@
   file_manager::EventRouter* const event_router =
       file_manager::EventRouterFactory::GetForProfile(GetProfile());
 
-  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                          base::Bind(&FileWatchFunctionBase::RunAsyncOnIOThread,
-                                     this, file_system_context, file_system_url,
-                                     event_router->GetWeakPtr()));
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::BindOnce(&FileWatchFunctionBase::RunAsyncOnIOThread, this,
+                     file_system_context, file_system_url,
+                     event_router->GetWeakPtr()));
   return true;
 }
 
@@ -375,7 +374,7 @@
   if (!watcher_manager) {
     BrowserThread::PostTask(
         BrowserThread::UI, FROM_HERE,
-        base::Bind(
+        base::BindOnce(
             &FileWatchFunctionBase::PerformFallbackFileWatchOperationOnUIThread,
             this, file_system_url, event_router));
     return;
@@ -498,10 +497,11 @@
     uint64_t* remaining_size = new uint64_t(0);
     base::PostTaskWithTraitsAndReply(
         FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
-        base::Bind(&GetSizeStatsAsync, volume->mount_path(), total_size,
-                   remaining_size),
-        base::Bind(&FileManagerPrivateGetSizeStatsFunction::OnGetSizeStats,
-                   this, base::Owned(total_size), base::Owned(remaining_size)));
+        base::BindOnce(&GetSizeStatsAsync, volume->mount_path(), total_size,
+                       remaining_size),
+        base::BindOnce(&FileManagerPrivateGetSizeStatsFunction::OnGetSizeStats,
+                       this, base::Owned(total_size),
+                       base::Owned(remaining_size)));
   }
   return true;
 }
@@ -667,16 +667,17 @@
       file_manager::util::GetDownloadsMountPointName(GetProfile())) {
     return BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
-        base::Bind(&GetFileMetadataOnIOThread, file_system_context, source_url_,
-                   storage::FileSystemOperation::GET_METADATA_FIELD_SIZE,
-                   base::Bind(&FileManagerPrivateInternalStartCopyFunction::
-                                  RunAfterGetFileMetadata,
-                              this)));
+        base::BindOnce(&GetFileMetadataOnIOThread, file_system_context,
+                       source_url_,
+                       storage::FileSystemOperation::GET_METADATA_FIELD_SIZE,
+                       base::Bind(&FileManagerPrivateInternalStartCopyFunction::
+                                      RunAfterGetFileMetadata,
+                                  this)));
   }
 
   return BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(
+      base::BindOnce(
           &FileManagerPrivateInternalStartCopyFunction::RunAfterFreeDiskSpace,
           this, true));
 }
@@ -759,10 +760,9 @@
           GetProfile(), render_frame_host());
 
   // We don't much take care about the result of cancellation.
-  BrowserThread::PostTask(
-      BrowserThread::IO,
-      FROM_HERE,
-      base::Bind(&CancelCopyOnIOThread, file_system_context, params->copy_id));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(&CancelCopyOnIOThread,
+                                         file_system_context, params->copy_id));
   SendResponse(true);
   return true;
 }
@@ -873,10 +873,11 @@
       &ComputeChecksumRespondOnUIThread,
       base::Bind(&FileManagerPrivateInternalComputeChecksumFunction::Respond,
                  this));
-  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                          base::Bind(&FileStreamMd5Digester::GetMd5Digest,
-                                     base::Unretained(digester_.get()),
-                                     base::Passed(&reader), result_callback));
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::BindOnce(&FileStreamMd5Digester::GetMd5Digest,
+                     base::Unretained(digester_.get()), base::Passed(&reader),
+                     result_callback));
 
   return true;
 }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
index a8864b93..304c7c7 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
@@ -102,11 +102,11 @@
       // readable from avfs/fuse if needed.
       base::PostTaskWithTraits(
           FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
-          base::Bind(&EnsureReadableFilePermissionAsync, path,
-                     google_apis::CreateRelayCallback(
-                         base::Bind(&FileManagerPrivateAddMountFunction::
-                                        RunAfterMarkCacheFileAsMounted,
-                                    this, path.BaseName()))));
+          base::BindOnce(&EnsureReadableFilePermissionAsync, path,
+                         google_apis::CreateRelayCallback(
+                             base::Bind(&FileManagerPrivateAddMountFunction::
+                                            RunAfterMarkCacheFileAsMounted,
+                                        this, path.BaseName()))));
     } else {
       RunAfterMarkCacheFileAsMounted(
           path.BaseName(), drive::FILE_ERROR_OK, path);
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc
index cc9fb9fc..2358ebb6 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc
@@ -357,8 +357,8 @@
   }
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::Bind(&GetSelectedFileInfoInternal, profile, base::Passed(&params)));
+      FROM_HERE, base::BindOnce(&GetSelectedFileInfoInternal, profile,
+                                base::Passed(&params)));
 }
 
 void SetupProfileFileAccessPermissions(int render_view_process_id,
diff --git a/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc b/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc
index a8a4589..caf05486 100644
--- a/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc
+++ b/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc
@@ -243,8 +243,8 @@
         (current_offset + 1 < *entry->metadata->size) && (current_length - 1);
     const int task_id =
         tracker_.PostTask(base::ThreadTaskRunnerHandle::Get().get(), FROM_HERE,
-                          base::Bind(callback, 1 /* chunk_length */, has_more,
-                                     base::File::FILE_OK));
+                          base::BindOnce(callback, 1 /* chunk_length */,
+                                         has_more, base::File::FILE_OK));
     task_ids.push_back(task_id);
     current_offset++;
     current_length--;
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_reader_unittest.cc b/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_reader_unittest.cc
index 8238e15..95c271e0 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_reader_unittest.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_reader_unittest.cc
@@ -55,7 +55,7 @@
 
     if (return_error_ != net::OK) {
       base::ThreadTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE, base::Bind(callback, return_error_));
+          FROM_HERE, base::BindOnce(callback, return_error_));
       return net::ERR_IO_PENDING;
     }
 
@@ -63,14 +63,14 @@
     memcpy(buf->data(), fake_data.c_str(), buf_len);
 
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, buf_len));
+        FROM_HERE, base::BindOnce(callback, buf_len));
     return net::ERR_IO_PENDING;
   }
 
   int64_t GetLength(const net::Int64CompletionCallback& callback) override {
     DCHECK_EQ(net::OK, return_error_);
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, kFileSize));
+        FROM_HERE, base::BindOnce(callback, kFileSize));
     return net::ERR_IO_PENDING;
   }
 
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_writer_unittest.cc b/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_writer_unittest.cc
index 7227b1d..dce5438b 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_writer_unittest.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_writer_unittest.cc
@@ -62,7 +62,8 @@
     pending_bytes_ += buf_len;
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
-        base::Bind(callback, write_error_ == net::OK ? buf_len : write_error_));
+        base::BindOnce(callback,
+                       write_error_ == net::OK ? buf_len : write_error_));
     return net::ERR_IO_PENDING;
   }
 
@@ -71,7 +72,7 @@
     DCHECK_EQ(net::OK, write_error_);
     ++(*cancel_counter_);
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, net::OK));
+        FROM_HERE, base::BindOnce(callback, net::OK));
     return net::ERR_IO_PENDING;
   }
 
@@ -80,7 +81,7 @@
     flush_log_->push_back(pending_bytes_);
     pending_bytes_ = 0;
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, net::OK));
+        FROM_HERE, base::BindOnce(callback, net::OK));
     return net::ERR_IO_PENDING;
   }
 
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc
index 51d1f5b3..997eff81 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc
@@ -47,9 +47,8 @@
     util::FileSystemURLParser parser(url);
     if (!parser.Parse()) {
       BrowserThread::PostTask(
-          BrowserThread::IO,
-          FROM_HERE,
-          base::Bind(callback, base::File::FILE_ERROR_SECURITY));
+          BrowserThread::IO, FROM_HERE,
+          base::BindOnce(callback, base::File::FILE_ERROR_SECURITY));
       return;
     }
 
@@ -75,11 +74,9 @@
 
     // If the file system got unmounted, then abort the reading operation.
     if (!file_system_.get()) {
-      BrowserThread::PostTask(
-          BrowserThread::IO,
-          FROM_HERE,
-          base::Bind(
-              callback, 0, false /* has_more */, base::File::FILE_ERROR_ABORT));
+      BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                              base::BindOnce(callback, 0, false /* has_more */,
+                                             base::File::FILE_ERROR_ABORT));
       return;
     }
 
@@ -103,9 +100,9 @@
     if (!file_system_.get()) {
       BrowserThread::PostTask(
           BrowserThread::IO, FROM_HERE,
-          base::Bind(callback,
-                     base::Passed(base::WrapUnique<EntryMetadata>(NULL)),
-                     base::File::FILE_ERROR_ABORT));
+          base::BindOnce(callback,
+                         base::Passed(base::WrapUnique<EntryMetadata>(NULL)),
+                         base::File::FILE_ERROR_ABORT));
       return;
     }
 
@@ -151,8 +148,8 @@
     if (result == base::File::FILE_OK)
       file_handle_ = file_handle;
 
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
+    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                            base::BindOnce(callback, result));
   }
 
   // Forwards a metadata to the IO thread.
@@ -164,9 +161,8 @@
     abort_callback_ = AbortCallback();
 
     BrowserThread::PostTask(
-        BrowserThread::IO,
-        FROM_HERE,
-        base::Bind(callback, base::Passed(&metadata), result));
+        BrowserThread::IO, FROM_HERE,
+        base::BindOnce(callback, base::Passed(&metadata), result));
   }
 
   // Forwards a response of reading from a file to the IO thread.
@@ -180,10 +176,9 @@
     if (!has_more)
       abort_callback_ = AbortCallback();
 
-    BrowserThread::PostTask(
-        BrowserThread::IO,
-        FROM_HERE,
-        base::Bind(chunk_received_callback, chunk_length, has_more, result));
+    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                            base::BindOnce(chunk_received_callback,
+                                           chunk_length, has_more, result));
   }
 
   AbortCallback abort_callback_;
@@ -213,7 +208,7 @@
   // destructor.
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&OperationRunner::CloseRunnerOnUIThread, runner_));
+      base::BindOnce(&OperationRunner::CloseRunnerOnUIThread, runner_));
 
   // If a read is in progress, mark it as completed.
   TRACE_EVENT_ASYNC_END0("file_system_provider", "FileStreamReader::Read",
@@ -227,15 +222,11 @@
   state_ = INITIALIZING;
 
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&OperationRunner::OpenFileOnUIThread,
-                 runner_,
-                 url_,
-                 base::Bind(&FileStreamReader::OnOpenFileCompleted,
-                            weak_ptr_factory_.GetWeakPtr(),
-                            pending_closure,
-                            error_callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&OperationRunner::OpenFileOnUIThread, runner_, url_,
+                     base::Bind(&FileStreamReader::OnOpenFileCompleted,
+                                weak_ptr_factory_.GetWeakPtr(), pending_closure,
+                                error_callback)));
 }
 
 void FileStreamReader::OnOpenFileCompleted(
@@ -257,14 +248,11 @@
 
   // Verify the last modification time.
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&OperationRunner::GetMetadataOnUIThread,
-                 runner_,
-                 base::Bind(&FileStreamReader::OnInitializeCompleted,
-                            weak_ptr_factory_.GetWeakPtr(),
-                            pending_closure,
-                            error_callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&OperationRunner::GetMetadataOnUIThread, runner_,
+                     base::Bind(&FileStreamReader::OnInitializeCompleted,
+                                weak_ptr_factory_.GetWeakPtr(), pending_closure,
+                                error_callback)));
 }
 
 void FileStreamReader::OnInitializeCompleted(
@@ -391,16 +379,11 @@
 
   current_length_ = 0;
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&OperationRunner::ReadFileOnUIThread,
-                 runner_,
-                 buffer,
-                 current_offset_,
-                 buffer_length,
-                 base::Bind(&FileStreamReader::OnReadChunkReceived,
-                            weak_ptr_factory_.GetWeakPtr(),
-                            callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&OperationRunner::ReadFileOnUIThread, runner_, buffer,
+                     current_offset_, buffer_length,
+                     base::Bind(&FileStreamReader::OnReadChunkReceived,
+                                weak_ptr_factory_.GetWeakPtr(), callback)));
 }
 
 void FileStreamReader::GetLengthAfterInitialized(
@@ -409,14 +392,11 @@
   DCHECK_EQ(INITIALIZED, state_);
 
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(
-          &OperationRunner::GetMetadataOnUIThread,
-          runner_,
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(
+          &OperationRunner::GetMetadataOnUIThread, runner_,
           base::Bind(&FileStreamReader::OnGetMetadataForGetLengthReceived,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     callback)));
+                     weak_ptr_factory_.GetWeakPtr(), callback)));
 }
 
 void FileStreamReader::OnReadChunkReceived(
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
index 9851d30d..f6e2d30 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
@@ -40,9 +40,8 @@
     util::FileSystemURLParser parser(url);
     if (!parser.Parse()) {
       BrowserThread::PostTask(
-          BrowserThread::IO,
-          FROM_HERE,
-          base::Bind(callback, base::File::FILE_ERROR_SECURITY));
+          BrowserThread::IO, FROM_HERE,
+          base::BindOnce(callback, base::File::FILE_ERROR_SECURITY));
       return;
     }
 
@@ -66,9 +65,8 @@
     // If the file system got unmounted, then abort the writing operation.
     if (!file_system_.get()) {
       BrowserThread::PostTask(
-          BrowserThread::IO,
-          FROM_HERE,
-          base::Bind(callback, base::File::FILE_ERROR_ABORT));
+          BrowserThread::IO, FROM_HERE,
+          base::BindOnce(callback, base::File::FILE_ERROR_ABORT));
       return;
     }
 
@@ -115,8 +113,8 @@
     if (result == base::File::FILE_OK)
       file_handle_ = file_handle;
 
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
+    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                            base::BindOnce(callback, result));
   }
 
   // Forwards a response of writing to a file to the IO thread.
@@ -126,8 +124,8 @@
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
     abort_callback_ = AbortCallback();
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
+    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                            base::BindOnce(callback, result));
   }
 
   AbortCallback abort_callback_;
@@ -151,7 +149,7 @@
   if (state_ != CANCELLING) {
     BrowserThread::PostTask(
         BrowserThread::UI, FROM_HERE,
-        base::Bind(&OperationRunner::CloseRunnerOnUIThread, runner_));
+        base::BindOnce(&OperationRunner::CloseRunnerOnUIThread, runner_));
   }
 
   // If a write is in progress, mark it as completed.
@@ -167,15 +165,11 @@
   state_ = INITIALIZING;
 
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&OperationRunner::OpenFileOnUIThread,
-                 runner_,
-                 url_,
-                 base::Bind(&FileStreamWriter::OnOpenFileCompleted,
-                            weak_ptr_factory_.GetWeakPtr(),
-                            pending_closure,
-                            error_callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&OperationRunner::OpenFileOnUIThread, runner_, url_,
+                     base::Bind(&FileStreamWriter::OnOpenFileCompleted,
+                                weak_ptr_factory_.GetWeakPtr(), pending_closure,
+                                error_callback)));
 }
 
 void FileStreamWriter::OnOpenFileCompleted(
@@ -262,9 +256,9 @@
   // files.
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&OperationRunner::CloseRunnerOnUIThread, runner_));
-  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                base::Bind(callback, net::OK));
+      base::BindOnce(&OperationRunner::CloseRunnerOnUIThread, runner_));
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(callback, net::OK));
 
   // If a write is in progress, mark it as completed.
   TRACE_EVENT_ASYNC_END0("file_system_provider", "FileStreamWriter::Write",
@@ -279,7 +273,8 @@
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
-      base::Bind(callback, state_ == INITIALIZED ? net::OK : net::ERR_FAILED));
+      base::BindOnce(callback,
+                     state_ == INITIALIZED ? net::OK : net::ERR_FAILED));
 
   return net::ERR_IO_PENDING;
 }
@@ -327,17 +322,12 @@
   state_ = EXECUTING;
 
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&OperationRunner::WriteFileOnUIThread,
-                 runner_,
-                 buffer,
-                 current_offset_,
-                 buffer_length,
-                 base::Bind(&FileStreamWriter::OnWriteFileCompleted,
-                            weak_ptr_factory_.GetWeakPtr(),
-                            buffer_length,
-                            callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(
+          &OperationRunner::WriteFileOnUIThread, runner_, buffer,
+          current_offset_, buffer_length,
+          base::Bind(&FileStreamWriter::OnWriteFileCompleted,
+                     weak_ptr_factory_.GetWeakPtr(), buffer_length, callback)));
 }
 
 }  // namespace file_system_provider
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc b/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc
index 1ad0dd0..5d62b9de 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc
@@ -54,9 +54,9 @@
                    std::unique_ptr<EntryMetadata> metadata,
                    base::File::Error result) {
   if (result != base::File::FILE_OK) {
-    BrowserThread::PostTask(BrowserThread::IO,
-                            FROM_HERE,
-                            base::Bind(callback, result, base::File::Info()));
+    BrowserThread::PostTask(
+        BrowserThread::IO, FROM_HERE,
+        base::BindOnce(callback, result, base::File::Info()));
     return;
   }
 
@@ -78,9 +78,9 @@
 
   file_info.is_symbolic_link = false;  // Not supported.
 
-  BrowserThread::PostTask(BrowserThread::IO,
-                          FROM_HERE,
-                          base::Bind(callback, base::File::FILE_OK, file_info));
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::BindOnce(callback, base::File::FILE_OK, file_info));
 }
 
 // Executes ReadDirectory on the UI thread.
@@ -105,9 +105,9 @@
     base::File::Error result,
     const storage::AsyncFileUtil::EntryList& entry_list,
     bool has_more) {
-  BrowserThread::PostTask(BrowserThread::IO,
-                          FROM_HERE,
-                          base::Bind(callback, result, entry_list, has_more));
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::BindOnce(callback, result, entry_list, has_more));
 }
 
 // Executes CreateDirectory on the UI thread.
@@ -138,8 +138,8 @@
           ? base::File::FILE_OK
           : result;
 
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE, base::Bind(callback, error));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(callback, error));
 }
 
 // Executes DeleteEntry on the UI thread.
@@ -160,8 +160,8 @@
 // Routes the response of DeleteEntry back to the IO thread.
 void OnDeleteEntry(const storage::AsyncFileUtil::StatusCallback& callback,
                    base::File::Error result) {
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(callback, result));
 }
 
 // Executes CreateFile on the UI thread.
@@ -190,8 +190,8 @@
   const base::File::Error error =
       result == base::File::FILE_ERROR_EXISTS ? base::File::FILE_OK : result;
 
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE, base::Bind(callback, error, created));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(callback, error, created));
 }
 
 // Executes CopyEntry on the UI thread.
@@ -217,8 +217,8 @@
 // IO thread.
 void OnCopyEntry(const storage::AsyncFileUtil::StatusCallback& callback,
                  base::File::Error result) {
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(callback, result));
 }
 
 // Executes MoveEntry on the UI thread.
@@ -244,8 +244,8 @@
 // IO thread.
 void OnMoveEntry(const storage::AsyncFileUtil::StatusCallback& callback,
                  base::File::Error result) {
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(callback, result));
 }
 
 // Executes Truncate on the UI thread.
@@ -266,8 +266,8 @@
 // Routes the response of Truncate back to the IO thread.
 void OnTruncate(const storage::AsyncFileUtil::StatusCallback& callback,
                 base::File::Error result) {
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(callback, result));
 }
 
 }  // namespace
@@ -302,12 +302,9 @@
     const EnsureFileExistsCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&CreateFileOnUIThread,
-                 base::Passed(&context),
-                 url,
-                 base::Bind(&OnCreateFileForEnsureFileExists, callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&CreateFileOnUIThread, base::Passed(&context), url,
+                     base::Bind(&OnCreateFileForEnsureFileExists, callback)));
 }
 
 void ProviderAsyncFileUtil::CreateDirectory(
@@ -318,14 +315,10 @@
     const StatusCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&CreateDirectoryOnUIThread,
-                 base::Passed(&context),
-                 url,
-                 exclusive,
-                 recursive,
-                 base::Bind(&OnCreateDirectory, exclusive, callback)));
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&CreateDirectoryOnUIThread, base::Passed(&context), url,
+                     exclusive, recursive,
+                     base::Bind(&OnCreateDirectory, exclusive, callback)));
 }
 
 void ProviderAsyncFileUtil::GetFileInfo(
@@ -336,8 +329,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&GetFileInfoOnUIThread, base::Passed(&context), url, fields,
-                 base::Bind(&OnGetFileInfo, fields, callback)));
+      base::BindOnce(&GetFileInfoOnUIThread, base::Passed(&context), url,
+                     fields, base::Bind(&OnGetFileInfo, fields, callback)));
 }
 
 void ProviderAsyncFileUtil::ReadDirectory(
@@ -345,12 +338,10 @@
     const storage::FileSystemURL& url,
     const ReadDirectoryCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  BrowserThread::PostTask(BrowserThread::UI,
-                          FROM_HERE,
-                          base::Bind(&ReadDirectoryOnUIThread,
-                                     base::Passed(&context),
-                                     url,
-                                     base::Bind(&OnReadDirectory, callback)));
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&ReadDirectoryOnUIThread, base::Passed(&context), url,
+                     base::Bind(&OnReadDirectory, callback)));
 }
 
 void ProviderAsyncFileUtil::Touch(
@@ -369,13 +360,10 @@
     int64_t length,
     const StatusCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  BrowserThread::PostTask(BrowserThread::UI,
-                          FROM_HERE,
-                          base::Bind(&TruncateOnUIThread,
-                                     base::Passed(&context),
-                                     url,
-                                     length,
-                                     base::Bind(&OnTruncate, callback)));
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&TruncateOnUIThread, base::Passed(&context), url, length,
+                     base::Bind(&OnTruncate, callback)));
 }
 
 void ProviderAsyncFileUtil::CopyFileLocal(
@@ -388,13 +376,10 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   // TODO(mtomasz): Consier adding support for options (preserving last modified
   // time) as well as the progress callback.
-  BrowserThread::PostTask(BrowserThread::UI,
-                          FROM_HERE,
-                          base::Bind(&CopyEntryOnUIThread,
-                                     base::Passed(&context),
-                                     src_url,
-                                     dest_url,
-                                     base::Bind(&OnCopyEntry, callback)));
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&CopyEntryOnUIThread, base::Passed(&context), src_url,
+                     dest_url, base::Bind(&OnCopyEntry, callback)));
 }
 
 void ProviderAsyncFileUtil::MoveFileLocal(
@@ -406,13 +391,10 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   // TODO(mtomasz): Consier adding support for options (preserving last modified
   // time) as well as the progress callback.
-  BrowserThread::PostTask(BrowserThread::UI,
-                          FROM_HERE,
-                          base::Bind(&MoveEntryOnUIThread,
-                                     base::Passed(&context),
-                                     src_url,
-                                     dest_url,
-                                     base::Bind(&OnMoveEntry, callback)));
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&MoveEntryOnUIThread, base::Passed(&context), src_url,
+                     dest_url, base::Bind(&OnMoveEntry, callback)));
 }
 
 void ProviderAsyncFileUtil::CopyInForeignFile(
@@ -429,13 +411,11 @@
     const storage::FileSystemURL& url,
     const StatusCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  BrowserThread::PostTask(BrowserThread::UI,
-                          FROM_HERE,
-                          base::Bind(&DeleteEntryOnUIThread,
-                                     base::Passed(&context),
-                                     url,
-                                     false,  // recursive
-                                     base::Bind(&OnDeleteEntry, callback)));
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&DeleteEntryOnUIThread, base::Passed(&context), url,
+                     false,  // recursive
+                     base::Bind(&OnDeleteEntry, callback)));
 }
 
 void ProviderAsyncFileUtil::DeleteDirectory(
@@ -443,13 +423,11 @@
     const storage::FileSystemURL& url,
     const StatusCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  BrowserThread::PostTask(BrowserThread::UI,
-                          FROM_HERE,
-                          base::Bind(&DeleteEntryOnUIThread,
-                                     base::Passed(&context),
-                                     url,
-                                     false,  // recursive
-                                     base::Bind(&OnDeleteEntry, callback)));
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&DeleteEntryOnUIThread, base::Passed(&context), url,
+                     false,  // recursive
+                     base::Bind(&OnDeleteEntry, callback)));
 }
 
 void ProviderAsyncFileUtil::DeleteRecursively(
@@ -457,13 +435,11 @@
     const storage::FileSystemURL& url,
     const StatusCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  BrowserThread::PostTask(BrowserThread::UI,
-                          FROM_HERE,
-                          base::Bind(&DeleteEntryOnUIThread,
-                                     base::Passed(&context),
-                                     url,
-                                     true,  // recursive
-                                     base::Bind(&OnDeleteEntry, callback)));
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::BindOnce(&DeleteEntryOnUIThread, base::Passed(&context), url,
+                     true,  // recursive
+                     base::Bind(&OnDeleteEntry, callback)));
 }
 
 void ProviderAsyncFileUtil::CreateSnapshotFile(
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/watcher_manager.cc b/chrome/browser/chromeos/file_system_provider/fileapi/watcher_manager.cc
index 0a2b63a7..c479bcb 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/watcher_manager.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/watcher_manager.cc
@@ -25,14 +25,14 @@
                                   base::File::Error error) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                          base::Bind(callback, error));
+                          base::BindOnce(callback, error));
 }
 
 void CallNotificationCallbackOnIOThread(const NotificationCallback& callback,
                                         ChangeType type) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                          base::Bind(callback, type));
+                          base::BindOnce(callback, type));
 }
 
 void AddWatcherOnUIThread(const storage::FileSystemURL& url,
@@ -83,10 +83,10 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&AddWatcherOnUIThread, url, recursive,
-                 base::Bind(&CallStatusCallbackOnIOThread, callback),
-                 base::Bind(&CallNotificationCallbackOnIOThread,
-                            notification_callback)));
+      base::BindOnce(&AddWatcherOnUIThread, url, recursive,
+                     base::Bind(&CallStatusCallbackOnIOThread, callback),
+                     base::Bind(&CallNotificationCallbackOnIOThread,
+                                notification_callback)));
 }
 
 void WatcherManager::RemoveWatcher(const storage::FileSystemURL& url,
@@ -95,8 +95,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&RemoveWatcherOnUIThread, url, recursive,
-                 base::Bind(&CallStatusCallbackOnIOThread, callback)));
+      base::BindOnce(&RemoveWatcherOnUIThread, url, recursive,
+                     base::Bind(&CallStatusCallbackOnIOThread, callback)));
 }
 
 }  // namespace file_system_provider
diff --git a/chrome/browser/chromeos/file_system_provider/queue.cc b/chrome/browser/chromeos/file_system_provider/queue.cc
index 66e8d995..b626c986 100644
--- a/chrome/browser/chromeos/file_system_provider/queue.cc
+++ b/chrome/browser/chromeos/file_system_provider/queue.cc
@@ -47,7 +47,8 @@
 #endif
   pending_.push_back(Task(token, callback));
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
+      FROM_HERE,
+      base::BindOnce(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
 }
 
 void Queue::Complete(size_t token) {
@@ -55,7 +56,8 @@
   DCHECK(it != executed_.end());
   executed_.erase(it);
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
+      FROM_HERE,
+      base::BindOnce(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
 }
 
 void Queue::MaybeRun() {
@@ -94,7 +96,7 @@
       pending_.erase(it);
       base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE,
-          base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
+          base::BindOnce(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
       return;
     }
   }
diff --git a/chrome/browser/chromeos/file_system_provider/scoped_file_opener_unittest.cc b/chrome/browser/chromeos/file_system_provider/scoped_file_opener_unittest.cc
index 319831f..f87e6ce 100644
--- a/chrome/browser/chromeos/file_system_provider/scoped_file_opener_unittest.cc
+++ b/chrome/browser/chromeos/file_system_provider/scoped_file_opener_unittest.cc
@@ -97,7 +97,7 @@
     const ProvidedFileSystemInterface::OpenFileCallback open_callback =
         file_system.open_callback();
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(open_callback, 123, base::File::FILE_OK));
+        FROM_HERE, base::BindOnce(open_callback, 123, base::File::FILE_OK));
   }
 
   // Wait until the open callback is called asynchonously.
diff --git a/chrome/browser/process_singleton.h b/chrome/browser/process_singleton.h
index 3d126cd9..f0effd2 100644
--- a/chrome/browser/process_singleton.h
+++ b/chrome/browser/process_singleton.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_PROCESS_SINGLETON_H_
 #define CHROME_BROWSER_PROCESS_SINGLETON_H_
 
+#include "base/sequence_checker.h"
 #include "build/build_config.h"
 
 #if defined(OS_WIN)
@@ -21,7 +22,6 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/process/process.h"
-#include "base/threading/non_thread_safe.h"
 #include "ui/gfx/native_widget_types.h"
 
 #if defined(OS_POSIX) && !defined(OS_ANDROID)
@@ -47,7 +47,7 @@
 // - the Windows implementation uses an invisible global message window;
 // - the Linux implementation uses a Unix domain socket in the user data dir.
 
-class ProcessSingleton : public base::NonThreadSafe {
+class ProcessSingleton {
  public:
   // Used to send the reason of remote hang process termination as histogram.
   enum RemoteHungProcessTerminateReason {
@@ -218,6 +218,8 @@
   scoped_refptr<LinuxWatcher> watcher_;
 #endif
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(ProcessSingleton);
 };
 
diff --git a/chrome/browser/process_singleton_posix.cc b/chrome/browser/process_singleton_posix.cc
index c684f51..1962d655 100644
--- a/chrome/browser/process_singleton_posix.cc
+++ b/chrome/browser/process_singleton_posix.cc
@@ -754,6 +754,7 @@
 }
 
 ProcessSingleton::~ProcessSingleton() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
 ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcess() {
diff --git a/chrome/browser/process_singleton_startup_lock.cc b/chrome/browser/process_singleton_startup_lock.cc
index f564de7..939fb236 100644
--- a/chrome/browser/process_singleton_startup_lock.cc
+++ b/chrome/browser/process_singleton_startup_lock.cc
@@ -12,7 +12,9 @@
     : locked_(true),
       original_callback_(original_callback) {}
 
-ProcessSingletonStartupLock::~ProcessSingletonStartupLock() {}
+ProcessSingletonStartupLock::~ProcessSingletonStartupLock() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
 
 ProcessSingleton::NotificationCallback
 ProcessSingletonStartupLock::AsNotificationCallback() {
@@ -21,7 +23,7 @@
 }
 
 void ProcessSingletonStartupLock::Unlock() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   locked_ = false;
 
   // Replay the command lines of the messages which were received while the
diff --git a/chrome/browser/process_singleton_startup_lock.h b/chrome/browser/process_singleton_startup_lock.h
index 9aa69ad..eb3d1fc 100644
--- a/chrome/browser/process_singleton_startup_lock.h
+++ b/chrome/browser/process_singleton_startup_lock.h
@@ -12,7 +12,7 @@
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "chrome/browser/process_singleton.h"
 
 // Provides a ProcessSingleton::NotificationCallback that can queue up
@@ -23,7 +23,7 @@
 // when the process is prepared to handle command-line invocations.
 //
 // Once unlocked, notifications are forwarded to a wrapped NotificationCallback.
-class ProcessSingletonStartupLock : public base::NonThreadSafe {
+class ProcessSingletonStartupLock {
  public:
   explicit ProcessSingletonStartupLock(
       const ProcessSingleton::NotificationCallback& original_callback);
@@ -51,6 +51,8 @@
   std::vector<DelayedStartupMessage> saved_startup_messages_;
   ProcessSingleton::NotificationCallback original_callback_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(ProcessSingletonStartupLock);
 };
 
diff --git a/chrome/browser/process_singleton_win.cc b/chrome/browser/process_singleton_win.cc
index 1004257..3d83b26 100644
--- a/chrome/browser/process_singleton_win.cc
+++ b/chrome/browser/process_singleton_win.cc
@@ -269,6 +269,7 @@
 }
 
 ProcessSingleton::~ProcessSingleton() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (lock_file_ != INVALID_HANDLE_VALUE)
     ::CloseHandle(lock_file_);
 }
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index e84b8c78..bc4e7fe 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2710,10 +2710,6 @@
 crbug.com/707359 [ Mac ] fast/css-grid-layout/grid-self-baseline-vertical-rl-04.html [ Failure ]
 crbug.com/707359 [ Mac ] fast/css-grid-layout/grid-self-baseline-vertical-rl-05.html [ Failure ]
 
-# [css-align]
-crbug.com/668639 external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html [ Failure ]
-crbug.com/668639 external/wpt/css/css-align-3/self-alignment/place-self-shorthand-006.html [ Failure ]
-
 # [selectors-4]
 crbug.com/706118 external/wpt/css/selectors4/hover-001-manual.html [ Skip ]
 crbug.com/576815 external/wpt/css/selectors4/selectors-dir-selector-ltr-001.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt
index 9880226f..8ac700e 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties-expected.txt
@@ -31,12 +31,12 @@
 PASS flexbox.style.justifyContent is ""
 PASS window.getComputedStyle(flexbox, null).justifyContent is "normal"
 PASS flexbox.style.alignSelf is ""
-PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
-PASS window.getComputedStyle(document.documentElement, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
+PASS window.getComputedStyle(document.documentElement, null).alignSelf is "auto"
 PASS flexbox.style.alignSelf is ""
-PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
 PASS flexbox.style.alignSelf is "auto"
-PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
 PASS flexbox.style.alignSelf is "flex-start"
 PASS window.getComputedStyle(flexbox, null).alignSelf is "flex-start"
 PASS flexbox.style.alignSelf is "flex-end"
@@ -48,41 +48,41 @@
 PASS flexbox.style.alignSelf is "baseline"
 PASS window.getComputedStyle(flexbox, null).alignSelf is "baseline"
 PASS flexbox.style.alignSelf is ""
-PASS window.getComputedStyle(flexbox, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexbox, null).alignSelf is "auto"
 PASS flexbox.style.alignItems is ""
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
 PASS flexbox.style.alignItems is ""
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
 PASS flexbox.style.alignItems is ""
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
 PASS flexbox.style.alignItems is "flex-start"
 PASS flexitem.style.alignSelf is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "flex-start"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "flex-start"
+FAIL window.getComputedStyle(flexitem, null).alignSelf should be flex-start. Was auto.
 PASS flexbox.style.alignItems is "flex-end"
 PASS window.getComputedStyle(flexbox, null).alignItems is "flex-end"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "flex-end"
+FAIL window.getComputedStyle(flexitem, null).alignSelf should be flex-end. Was auto.
 PASS flexbox.style.alignItems is "center"
 PASS window.getComputedStyle(flexbox, null).alignItems is "center"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "center"
+FAIL window.getComputedStyle(flexitem, null).alignSelf should be center. Was auto.
 PASS flexbox.style.alignItems is "stretch"
 PASS window.getComputedStyle(flexbox, null).alignItems is "stretch"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "stretch"
+FAIL window.getComputedStyle(flexitem, null).alignSelf should be stretch. Was auto.
 PASS flexbox.style.alignItems is "baseline"
 PASS window.getComputedStyle(flexbox, null).alignItems is "baseline"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "baseline"
+FAIL window.getComputedStyle(flexitem, null).alignSelf should be baseline. Was auto.
 PASS flexbox.style.alignItems is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
 PASS flexbox.style.alignItems is ""
 PASS window.getComputedStyle(flexbox, null).alignItems is "normal"
-PASS window.getComputedStyle(flexitem, null).alignSelf is "normal"
+PASS window.getComputedStyle(flexitem, null).alignSelf is "auto"
 PASS window.getComputedStyle(detachedFlexbox, null).alignSelf is ""
 PASS window.getComputedStyle(detachedFlexItem, null).alignSelf is ""
 PASS flexbox.style.flexDirection is ""
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html
index b95bb5a1..75e796e3 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/css-properties.html
@@ -84,17 +84,17 @@
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).justifyContent', 'normal');
 
 shouldBeEqualToString('flexbox.style.alignSelf', '');
-// The initial value is 'auto', which will be resolved depending on parent's style (except for the 'document' element).
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
-shouldBeEqualToString('window.getComputedStyle(document.documentElement, null).alignSelf', 'normal');
+// The initial value is 'auto'.
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
+shouldBeEqualToString('window.getComputedStyle(document.documentElement, null).alignSelf', 'auto');
 
 flexbox.style.alignSelf = 'foo';
 shouldBeEqualToString('flexbox.style.alignSelf', '');
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
 
 flexbox.style.alignSelf = 'auto';
 shouldBeEqualToString('flexbox.style.alignSelf', 'auto');
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
 
 flexbox.style.alignSelf = 'flex-start';
 shouldBeEqualToString('flexbox.style.alignSelf', 'flex-start');
@@ -118,26 +118,26 @@
 
 flexbox.style.alignSelf = '';
 shouldBeEqualToString('flexbox.style.alignSelf', '');
-shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignSelf', 'auto');
 
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('flexitem.style.alignSelf', '');
-// The initial value is 'auto', which will be resolved to 'normal' in case of flexbox containers.
+// The initial value is 'auto'.
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
 
 flexbox.style.alignItems = 'foo';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('flexitem.style.alignSelf', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
 
 // The 'auto' value is not valid for the align-items property.
 flexbox.style.alignItems = 'auto';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('flexitem.style.alignSelf', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
 
 flexbox.style.alignItems = 'flex-start';
 shouldBeEqualToString('flexbox.style.alignItems', 'flex-start');
@@ -168,12 +168,12 @@
 flexbox.style.alignItems = '';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
 
 flexbox.style.display = 'none';
 shouldBeEqualToString('flexbox.style.alignItems', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).alignItems', 'normal');
-shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'normal');
+shouldBeEqualToString('window.getComputedStyle(flexitem, null).alignSelf', 'auto');
 flexbox.style.display = 'flex';
 
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html
index 7aa3e88..4af3ad5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-align-3/default-alignment/place-items-shorthand-006.html
@@ -10,7 +10,7 @@
 <script>
     var values = ["normal", "stretch"].concat(selfPositionValues, baselineValues);
     values.forEach(function(alignValue) {
-        ["", "auto"].concat(values).forEach(function(justifyValue) {
+        [""].concat(values).forEach(function(justifyValue) {
             var value = (alignValue + " " + justifyValue).trim();
             test(function() {
                 checkPlaceShorhand("place-items", alignValue, justifyValue)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/scroll-into-view/check-scroll-position.html b/third_party/WebKit/LayoutTests/external/wpt/scroll-into-view/check-scroll-position.html
deleted file mode 100644
index 200491a..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/scroll-into-view/check-scroll-position.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE HTML>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<title> Check End Position of ScrollIntoView</title>
-<div id='container' style='height: 2500px; width: 2500px;'>
-  <div id='content' style='height: 500px; width: 500px;margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;margin-bottom: 1000px'>
-  </div>
-</div>
-<script>
-
-var frames = 0;
-var content_height = 500;
-var content_width = 500;
-var window_height = document.documentElement.clientHeight;
-var window_width = document.documentElement.clientWidth;
-var content = document.getElementById('content');
-
-function animate (funct, x, y, next) {
-  if (frames < 500) {
-    ++frames;
-    requestAnimationFrame(animate.bind(null, funct, x, y, next));
-  } else {
-    funct.step(function() {
-      assert_approx_equals(window.scrollX, x, 1);
-      assert_approx_equals(window.scrollY, y, 1);
-      funct.done();
-      if (next)
-        next();
-    });
-  }
-}
-
-var checkNearest = async_test("Smooth ScrollIntoView should scroll the element to the 'nearest' position");
-checkNearest.step(function() {
-  content.scrollIntoView(
-    {behavior: 'smooth', block: 'nearest', inlinePosition: 'nearest'});
-  frames = 0;
-  var x = content.offsetLeft + content_width - window_width;
-  var y = content.offsetTop + content_height - window_height;
-  animate(checkNearest, x, y, test2);
-});
-
-var checkStart = async_test("Smooth ScrollIntoView should scroll the element to the 'start' position");
-function test2() {
-  checkStart.step(function() {
-    content.scrollIntoView(
-      {behavior: 'smooth', block: 'start', inlinePosition: 'start'});
-    frames = 0;
-    animate(checkStart, content.offsetLeft, content.offsetTop, test3);
-  });
-}
-
-var checkCenter = async_test("Smooth ScrollIntoView should scroll the element to the 'center' position");
-function test3() {
-  checkCenter.step(function() {
-    content.scrollIntoView(
-      {behavior: 'smooth', block: 'center', inlinePosition: 'center'});
-    frames = 0;
-    var x = content.offsetLeft + (content_width - window_width) / 2;
-    var y = content.offsetTop + (content_height - window_height) / 2;
-    animate(checkCenter, x, y, test4);
-  });
-}
-
-var checkEnd = async_test("Smooth ScrollIntoView should scroll the element to the 'end' position");
-function test4() {
-  checkEnd.step(function() {
-    content.scrollIntoView(
-      {behavior: 'smooth', block: 'end', inlinePosition: 'end'});
-    frames = 0;
-    var x = content.offsetLeft + content_width - window_width;
-    var y = content.offsetTop + content_height - window_height;
-    animate(checkEnd, x, y, null);
-  });
-}
-
-</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js
new file mode 100644
index 0000000..8c2c2c66
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js
@@ -0,0 +1,66 @@
+function match_query(query_string) {
+  return self.location.search.substr(1) == query_string;
+}
+
+function navigate_test(e) {
+  var port = e.data.port;
+  var url = e.data.url;
+
+  return clients.matchAll({ includeUncontrolled : true })
+    .then(function(client_list) {
+        for (var i = 0; i < client_list.length; i++) {
+          var client = client_list[i];
+          if (client.frameType == 'nested') {
+            return client.navigate(url);
+          }
+        }
+        port.postMessage('Could not locate window client.');
+      })
+    .then(function(new_client) {
+        if (new_client === null)
+          port.postMessage(new_client);
+        else
+          port.postMessage(new_client.url);
+      })
+    .catch(function(error) {
+        port.postMessage(error.name);
+      });
+}
+
+function getTestClient() {
+  return clients.matchAll({ includeUncontrolled: true })
+    .then(function(client_list) {
+        for (var i = 0; i < client_list.length; i++) {
+          var client = client_list[i];
+
+          if (/windowclient-navigate\.https\.html/.test(client.url)) {
+            return client;
+          }
+        }
+
+        throw new Error('Service worker was unable to locate test client.');
+      });
+}
+
+function waitForMessage(client) {
+  var channel = new MessageChannel();
+  client.postMessage({ port: channel.port2 }, [channel.port2]);
+
+  return new Promise(function(resolve) {
+        channel.port1.onmessage = resolve;
+      });
+}
+
+// The worker must remain in the "installing" state for the duration of some
+// sub-tests. In order to achieve this coordination without relying on global
+// state, the worker must create a message channel with the client from within
+// the "install" event handler.
+if (match_query('installing')) {
+  self.addEventListener('install', function(e) {
+      e.waitUntil(getTestClient().then(waitForMessage));
+    });
+}
+
+self.addEventListener('message', function(e) {
+    e.waitUntil(navigate_test(e));
+  });
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/synced-state.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/synced-state.https.html
index d842378b..c4a9b66 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/synced-state.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/synced-state.https.html
@@ -5,60 +5,89 @@
 <script src="resources/test-helpers.sub.js"></script>
 <script>
 // Tests that ServiceWorker objects representing the same Service Worker
-// entity have the same state. JS object equality is not tested, since the spec
-// does not require it.
+// entity have the same state. JS-level equality is now required according to
+// the spec.
+'use strict';
+
+function nextChange(worker) {
+  return new Promise(function(resolve, reject) {
+      worker.addEventListener('statechange', function handler(event) {
+          try {
+            worker.removeEventListener('statechange', handler);
+            resolve(event.currentTarget.state);
+          } catch (err) {
+            reject(err);
+          }
+        });
+    });
+}
+
 promise_test(function(t) {
     var scope = 'resources/synced-state';
     var script = 'resources/empty-worker.js';
+    var registration, worker;
+
     return service_worker_unregister_and_register(t, script, scope)
-      .then(function(registration) {
-          return new Promise(function(resolve) {
-              var step = 0;
-              registration.installing.addEventListener('statechange',
-                                                       function(e) {
-                  step++;
-                  if (step == 1) {
-                    assert_equals(e.currentTarget.state, 'installed',
-                                  'original SW should be installed');
-                    assert_equals(registration.installing, null,
-                                  'in installed, .installing should be null');
-                    // The Activate algorithm may have cleared the waiting worker
-                    // by now.
-                    if (registration.waiting) {
-                      assert_equals(registration.waiting.state, 'installed',
-                                    'in installed, .waiting should be installed');
-                      assert_equals(registration.active, null,
-                                    'in installed, .active should be null');
-                    } else {
-                      assert_equals(registration.active.state, 'activating',
-                                    'in installed, .active should be activating');
-                    }
-                  } else if (step == 2) {
-                    assert_equals(e.currentTarget.state, 'activating',
-                                  'original SW should be activating');
-                    assert_equals(registration.installing, null,
-                                  'in activating, .installing should be null');
-                    assert_equals(registration.waiting, null,
-                                  'in activating, .waiting should be null');
-                    assert_equals(
-                        registration.active.state, 'activating',
-                        'in activating, .active should be activating');
-                  } else if (step == 3) {
-                    assert_equals(e.currentTarget.state, 'activated',
-                                  'original SW should be activated');
-                    assert_equals(registration.installing, null,
-                                  'in activated, .installing should be null');
-                    assert_equals(registration.waiting, null,
-                                  'in activated, .waiting should be null');
-                    assert_equals(registration.active.state, 'activated',
-                                  'in activated .active should be activated');
-                    resolve();
-                  }
-                })
-            })
+      .then(function(r) {
+          registration = r;
+          worker = registration.installing;
+
+          t.add_cleanup(function() {
+              r.unregister();
+            });
+
+          return nextChange(worker);
+        })
+      .then(function(state) {
+          assert_equals(state, 'installed',
+                        'original SW should be installed');
+          assert_equals(registration.installing, null,
+                        'in installed, .installing should be null');
+          assert_equals(registration.waiting, worker,
+                        'in installed, .waiting should be equal to the ' +
+                          'original worker');
+          assert_equals(registration.waiting.state, 'installed',
+                        'in installed, .waiting should be installed');
+          assert_equals(registration.active, null,
+                        'in installed, .active should be null');
+
+          return nextChange(worker);
+        })
+      .then(function(state) {
+          assert_equals(state, 'activating',
+                        'original SW should be activating');
+          assert_equals(registration.installing, null,
+                        'in activating, .installing should be null');
+          assert_equals(registration.waiting, null,
+                        'in activating, .waiting should be null');
+          assert_equals(registration.active, worker,
+                        'in activating, .active should be equal to the ' +
+                          'original worker');
+          assert_equals(
+              registration.active.state, 'activating',
+              'in activating, .active should be activating');
+
+          return nextChange(worker);
+        })
+      .then(function(state) {
+          assert_equals(state, 'activated',
+                        'original SW should be activated');
+          assert_equals(registration.installing, null,
+                        'in activated, .installing should be null');
+          assert_equals(registration.waiting, null,
+                        'in activated, .waiting should be null');
+          assert_equals(registration.active, worker,
+                        'in activated, .active should be equal to the ' +
+                          'original worker');
+          assert_equals(registration.active.state, 'activated',
+                        'in activated .active should be activated');
         })
       .then(function() {
-          return service_worker_unregister_and_done(t, scope);
+          return navigator.serviceWorker.getRegistration(scope);
+        })
+      .then(function(r) {
+          assert_equals(r, registration, 'getRegistration should return the ' +
+                                         'same object');
         });
   }, 'worker objects for the same entity have the same state');
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/windowclient-navigate.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/windowclient-navigate.https.html
new file mode 100644
index 0000000..8fb467a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/windowclient-navigate.https.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<title>Service Worker: WindowClient.navigate() tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<body>
+<script>
+'use strict';
+
+const SCOPE = 'resources/blank.html';
+const SCRIPT_URL = 'resources/windowclient-navigate-worker.js';
+const CROSS_ORIGIN_URL = get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() +
+    'resources/blank.html';
+
+navigate_test({
+    description: 'normal',
+    dest_url: 'blank.html?navigate',
+    expected: normalizeURL(SCOPE) + '?navigate',
+  });
+
+navigate_test({
+    description: 'blank url',
+    dest_url: '',
+    expected: normalizeURL(SCRIPT_URL)
+  });
+
+navigate_test({
+    description: 'in scope but not controlled test on installing worker',
+    dest_url: 'blank.html?navigate',
+    expected: 'TypeError',
+    wait_state: 'installing',
+  });
+
+navigate_test({
+    description: 'in scope but not controlled test on active worker',
+    dest_url: 'blank.html?navigate',
+    expected: 'TypeError',
+    should_be_reload: false,
+  });
+
+navigate_test({
+    description: 'out of scope',
+    src_url: '/common/blank.html',
+    dest_url: 'blank.html?navigate',
+    expected: 'TypeError',
+  });
+
+navigate_test({
+    description: 'cross orgin url',
+    dest_url: CROSS_ORIGIN_URL,
+    expected: null
+  });
+
+navigate_test({
+    description: 'invalid url (http://[example.com])',
+    dest_url: 'http://[example].com',
+    expected: 'TypeError'
+  });
+
+navigate_test({
+    description: 'invalid url (view-source://example.com)',
+    dest_url: 'view-source://example.com',
+    expected: 'TypeError'
+  });
+
+navigate_test({
+    description: 'invalid url (file:///)',
+    dest_url: 'file:///',
+    expected: 'TypeError'
+  });
+
+navigate_test({
+    description: 'invalid url (about:blank)',
+    dest_url: 'about:blank',
+    expected: 'TypeError'
+  });
+
+function navigate_test(override_parameters) {
+  // default parameters
+  var parameters = {
+    description: null,
+    src_url: SCOPE,
+    dest_url: null,
+    expected: null,
+    wait_state: 'activated',
+    scope: SCOPE,
+    should_be_reload: true
+  };
+  var key;
+
+  for (key in override_parameters)
+    parameters[key] = override_parameters[key];
+
+  promise_test(function(test) {
+    var service_worker;
+    var client_frame;
+    var registration;
+    var pausedLifecyclePort;
+    var script_url = SCRIPT_URL;
+
+    // For in-scope-but-not-controlled test on installing worker,
+    // if the wait_state is "installing", then append the query to script_url.
+    if (parameters.wait_state == 'installing') {
+      script_url += '?' + parameters.wait_state;
+
+      navigator.serviceWorker.addEventListener('message', function(event) {
+          pausedLifecyclePort = event.data.port;
+        });
+    }
+
+    var cleanup = function() {
+      if (client_frame && client_frame) {
+        client_frame.remove();
+      }
+
+      // Some tests require that the worker remain in a given lifecycle phase.
+      // "Clean up" logic for these tests requires signaling the worker to
+      // release the hold; this allows the worker to be properly discarded
+      // prior to the execution of additional tests.
+      if (pausedLifecyclePort) {
+        // The value of the posted message is inconsequential. A string is
+        // specified here solely to aid in test debugging.
+        pausedLifecyclePort.postMessage('continue lifecycle');
+      }
+
+      if (registration) {
+        return registration.unregister();
+      }
+    };
+
+    var test_body = with_iframe(parameters.src_url)
+      .then(function(frame) {
+          client_frame = frame;
+          return service_worker_unregister_and_register(
+              test, script_url, parameters.scope);
+        })
+      .then(function(r) {
+          registration = r;
+          service_worker = registration.installing;
+          return wait_for_state(test, service_worker, parameters.wait_state);
+        })
+      .then(function() {
+          if (parameters.should_be_reload) {
+            client_frame.remove();
+            return with_iframe(parameters.src_url);
+          }
+          return client_frame;
+        })
+      .then(function(frame) {
+          client_frame = frame;
+          return new Promise(function(resolve) {
+              var channel = new MessageChannel();
+              channel.port1.onmessage = test.step_func(resolve);
+              service_worker.postMessage({
+                  port: channel.port2,
+                  url: parameters.dest_url
+                }, [channel.port2]);
+            });
+        })
+      .then(function(response) {
+          assert_equals(response.data, parameters.expected);
+        });
+
+    // Ensure that test "clean up" is deferred until after the test body
+    // executes. `Test#add_cleanup` cannot be used for this purpose because the
+    // operation is asynchronous, and `add_cleanup` does not support
+    // asynchronous operations at the time of this writing. See
+    // https://github.com/w3c/web-platform-tests/issues/6075
+    // Ensure also that test failure is not hidden by successful cleanup
+    // operation.
+    return test_body
+      .then(cleanup, cleanup)
+      .then(function() { return test_body; });
+  }, parameters.description);
+}
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html
index 008235b..6104f18 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes-expected.html
@@ -8,18 +8,18 @@
 }
 .grid { display: grid; }
 .flex { display: flex; }
-.itemsCenter {
-   align-items: center;
-   justify-items: center;
+.selfCenter {
+   align-self: center;
+   justify-self: center;
 }
 </style>
 
 <p>Grid item created as anonymous box to contain the text element. The text element should be centered in both axis due to the Default Alignment 'center' value on its container.</p>
-<div class="container grid itemsCenter">
-    <div>foobar</div>
+<div class="container grid">
+    <div class="selfCenter">foobar</div>
 </div>
 
-<p>Flex item created as anonymous box to contain the text element. The text element should be centered in both axis due to the Default Alignment 'center' value on its container.</p>
-<div class="container flex itemsCenter">
-    <div>foobar</div>
+<p>Flex item created as anonymous box to contain the text element. The text element should be centered in cross axis due to the Default Alignment 'center' value on its container.</p>
+<div class="container flex">
+    <div class="selfCenter">foobar</div>
 </div>
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html
index f7de8d7..e05e095 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/alignment-and-anomymous-boxes.html
@@ -19,7 +19,7 @@
     foobar
 </div>
 
-<p>Flex item created as anonymous box to contain the text element. The text element should be centered in both axis due to the Default Alignment 'center' value on its container.</p>
+<p>Flex item created as anonymous box to contain the text element. The text element should be centered in cross axis due to the Default Alignment 'center' value on its container.</p>
 <div class="container flex itemsCenter">
     foobar
 </div>
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt b/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt
index b1a3b03c5..1e0e745 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/alignment/ensure-flexbox-compatibility-with-initial-values-expected.txt
@@ -6,37 +6,37 @@
 
 Verifying initial values are supported when grid is ENABLED.
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'normal') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'normal') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'normal') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 PASS CSS.supports('align-items', 'normal') is true
-PASS CSS.supports('align-self', 'normal') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'normal') is true
 PASS CSS.supports('justify-content', 'normal') is true
 
 Verifying initial values are supported when grid is DISABLED.
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'stretch') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'stretch') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'stretch') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS CSS.supports('align-items', 'stretch') is true
-PASS CSS.supports('align-self', 'stretch') is true
+PASS CSS.supports('align-self', 'auto') is true
 PASS CSS.supports('align-content', 'stretch') is true
 PASS CSS.supports('justify-content', 'flex-start') is true
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html b/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html
index 5bd8055..b767aa9 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/new-alignment-values-invalid-if-grid-not-enabled.html
@@ -29,10 +29,10 @@
     container.style.webkitAlignItems = value;
     if (gridEnabled) {
         checkValues(container, "alignItems", "align-items", value, computedValue);
-        checkValues(item, "alignSelf", "align-self", "auto", computedValue);
+        checkValues(item, "alignSelf", "align-self", "auto", "auto");
     } else {
         checkValues(container, "alignItems", "align-items", "flex-end", "flex-end");
-        checkValues(item, "alignSelf", "align-self", "auto", "flex-end");
+        checkValues(item, "alignSelf", "align-self", "auto", "auto");
     }
 }
 
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html
index 149c1a0..8e81f78 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-align-self.html
@@ -16,6 +16,10 @@
     align-self: stretch;
 }
 
+#alignSelfNormal {
+    align-self: normal;
+}
+
 #alignSelfStart {
     align-self: start;
 }
@@ -89,6 +93,7 @@
 <div id="alignSelfFirstBaseline"></div>
 <div id="alignSelfLastBaseline"></div>
 <div id="alignSelfStretch"></div>
+<div id="alignSelfNormal"></div>
 <div id="alignSelfStart"></div>
 <div id="alignSelfEnd"></div>
 <div id="alignSelfCenter"></div>
@@ -120,6 +125,8 @@
     checkValues(alignSelfLastBaseline, "alignSelf", "align-self", "", "last baseline");
     var alignSelfStretch = document.getElementById("alignSelfStretch");
     checkValues(alignSelfStretch, "alignSelf", "align-self", "", "stretch");
+    var alignSelfNormal = document.getElementById("alignSelfNormal");
+    checkValues(alignSelfNormal, "alignSelf", "align-self", "", "normal");
     var alignSelfStart = document.getElementById("alignSelfStart");
     checkValues(alignSelfStart, "alignSelf", "align-self", "", "start");
     var alignSelfEnd = document.getElementById("alignSelfEnd");
@@ -160,7 +167,7 @@
 test(function() {
     element = document.createElement("div");
     document.body.appendChild(element);
-    checkValues(element, "alignSelf", "align-self", "", "normal");
+    checkValues(element, "alignSelf", "align-self", "", "auto");
 }, "Test initial value of align-self through JS");
 
 test(function() {
@@ -186,16 +193,19 @@
     element.style.alignSelf = "self-start";
     checkValues(element, "alignSelf", "align-self",  "self-start", "self-start");
 
+    element.style.alignSelf = "normal";
+    checkValues(element, "alignSelf", "align-self",  "normal", "normal");
+
     element.style.alignSelf = "auto";
-    checkValues(element, "alignSelf", "align-self",  "auto", "normal");
+    checkValues(element, "alignSelf", "align-self",  "auto", "auto");
 
     container.style.display = "flex";
     element.style.alignSelf = "auto";
-    checkValues(element, "alignSelf", "align-self",  "auto", "normal");
+    checkValues(element, "alignSelf", "align-self",  "auto", "auto");
 
     container.style.display = "grid";
     element.style.alignSelf = "auto";
-    checkValues(element, "alignSelf", "align-self",  "auto", "normal");
+    checkValues(element, "alignSelf", "align-self",  "auto", "auto");
 
     element.style.alignSelf = "self-end";
     checkValues(element, "alignSelf", "align-self",  "self-end", "self-end");
@@ -203,7 +213,7 @@
 
 test(function() {
     document.documentElement.style.alignSelf = "auto";
-    checkValues(document.documentElement, "alignSelf", "align-self",  "auto", "normal");
+    checkValues(document.documentElement, "alignSelf", "align-self",  "auto", "auto");
 }, "Test 'auto' value resolution for the root node");
 
 test(function() {
@@ -214,6 +224,9 @@
 
     checkBadValues(element, "alignSelf", "align-self",  "auto safe");
     checkBadValues(element, "alignSelf", "align-self",  "auto left");
+    checkBadValues(element, "alignSelf", "align-self",  "normal unsafe");
+    checkBadValues(element, "alignSelf", "align-self",  "normal stretch");
+    checkBadValues(element, "alignSelf", "align-self",  "baseline normal");
     checkBadValues(element, "alignSelf", "align-self",  "baseline safe");
     checkBadValues(element, "alignSelf", "align-self",  "baseline center");
     checkBadValues(element, "alignSelf", "align-self",  "stretch unsafe");
@@ -239,35 +252,35 @@
 
 test(function() {
     container.style.display = "";
-    checkInitialValues(element, "alignSelf", "align-self", "center", "normal");
+    checkInitialValues(element, "alignSelf", "align-self", "center", "auto");
 }, "Test the value 'initial'");
 
 test(function() {
     container.style.display = "grid";
-    checkInitialValues(element, "alignSelf", "align-self", "left safe", "normal");
+    checkInitialValues(element, "alignSelf", "align-self", "left safe", "auto");
 }, "Test the value 'initial' for grid containers");
 
 test(function() {
     container.style.display = "flex";
-    checkInitialValues(element, "alignSelf", "align-self", "right unsafe", "normal");
+    checkInitialValues(element, "alignSelf", "align-self", "right unsafe", "auto");
 }, "Test the value 'initial' for flex containers");
 
 test(function() {
     container.style.display = "";
     element.style.position = "absolute";
-    checkInitialValues(element, "alignSelf", "align-self", "left", "normal");
+    checkInitialValues(element, "alignSelf", "align-self", "left", "auto");
 }, "Test the value 'initial' for positioned elements");
 
 test(function() {
     container.style.display = "grid";
     element.style.position = "absolute";
-    checkInitialValues(element, "alignSelf", "align-self", "right", "normal");
+    checkInitialValues(element, "alignSelf", "align-self", "right", "auto");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
     container.style.display = "flex";
     element.style.position = "absolute";
-    checkInitialValues(element, "alignSelf", "align-self", "end", "normal");
+    checkInitialValues(element, "alignSelf", "align-self", "end", "auto");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements-expected.txt b/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements-expected.txt
deleted file mode 100644
index 7f36c08..0000000
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements-expected.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-CONSOLE MESSAGE: line 17: 
-CONSOLE MESSAGE: line 18: *** Test 'auto' value resolution for the document root node. ***
-CONSOLE MESSAGE: line 96: 
-CONSOLE MESSAGE: line 97: *** Test 'auto' value resolution for the shadow DOM root node. ***
-CONSOLE MESSAGE: line 104: 
-CONSOLE MESSAGE: line 149: 
-CONSOLE MESSAGE: line 150: *** Test 'auto' value resolution for the shadow DOM 'slotted' elements. ***
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = 1 duplicate test name: "Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values."
-PASS Check out how the DOM's root element resolves the align-self 'auto' values. 
-PASS Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values. 
-PASS Check out how the DOM's root element deals with 'auto' value in align-items. 
-PASS Check out how the DOM's root element resolves the justify-self 'auto' values. 
-PASS Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values. 
-PASS Check out how the DOM's root element deals with 'auto' value in justify-items. 
-PASS Check out how the DOM's root element justify-items's value with 'legacy' keyword is used to resolve any descendant's justify-items 'auto' values. 
-PASS Check out how the DOM's root element recomputes its descendant's style when 'legacy' keyword is removed from its justify-items value. 
-PASS Shadow Node inherits from ShadowHost to resolve the 'auto' values for align-self. 
-PASS Shadow Node inherits from ShadowHost to resolve the 'auto' values for justify-self. 
-PASS Check out how the 'legacy' keyword in justify-items propagates from the DOM Tree to the Shadow Node. 
-PASS Check out how align-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned. 
-PASS Check out how justify-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned. 
-PASS Check out how the 'legacy' keyword in justify-items affects the 'slotted' elements while 'slot' is not assigned. 
-PASS Check out how align-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned. 
-PASS Check out how justify-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned. 
-PASS Check out how the 'legacy' keyword affects the 'slotted' elements after the 'slot' is assigned. 
-PASS The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the align-self 'auto' values because Blink does not support slots in the flat tree. 
-PASS The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the justify-self 'auto' values because Blink does not support slots in the flat tree. 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html
index f55eb56..2143395 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-alignment-of-root-elements.html
@@ -21,7 +21,7 @@
     document.documentElement.style.alignSelf = "center";
     checkValues(document.documentElement, "alignSelf", "align-self", "center", "center");
     document.documentElement.style.alignSelf = "auto";
-    checkValues(document.documentElement, "alignSelf", "align-self", "auto", "normal");
+    checkValues(document.documentElement, "alignSelf", "align-self", "auto", "auto");
 }, "Check out how the DOM's root element resolves the align-self 'auto' values.");
 
 test(function() {
@@ -30,11 +30,11 @@
     document.body.style.alignItems = "auto"; // The 'auto' value is not valid for align-items.
     document.body.style.alignSelf = "auto";
     checkValues(document.body, "alignItems", "align-items", "", "normal");
-    checkValues(document.body, "alignSelf", "align-self", "auto", "center");
+    checkValues(document.body, "alignSelf", "align-self", "auto", "auto");
     block.style.alignItems = ""; // Default value is 'normal' for align-items.
     block.style.alignSelf = "auto";
     checkValues(block, "alignItems", "align-items", "", "normal");
-    checkValues(block, "alignSelf", "align-self", "auto", "normal");
+    checkValues(block, "alignSelf", "align-self", "auto", "auto");
 }, "Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values.");
 
 test(function() {
@@ -48,7 +48,7 @@
     document.documentElement.style.justifySelf = "left";
     checkValues(document.documentElement, "justifySelf", "justify-self", "left", "left");
     document.documentElement.style.justifySelf = "auto";
-    checkValues(document.documentElement, "justifySelf", "justify-self", "auto", "normal");
+    checkValues(document.documentElement, "justifySelf", "justify-self", "auto", "auto");
 }, "Check out how the DOM's root element resolves the justify-self 'auto' values.");
 
 test(function() {
@@ -58,18 +58,18 @@
     document.body.style.justifyItems = "auto";
     document.body.style.justifySelf = "auto";
     checkValues(document.body, "justifyItems", "justify-items", "auto", "normal");
-    checkValues(document.body, "justifySelf", "justify-self", "auto", "center");
+    checkValues(document.body, "justifySelf", "justify-self", "auto", "auto");
     block.style.justifyItems = "auto";
     block.style.justifySelf = "auto";
     checkValues(block, "justifyItems", "justify-items",  "auto", "normal");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "normal");
-}, "Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values.");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
+}, "Check out how the DOM's root element justify-items's value is used to resolve its children's justify-self 'auto' values.");
 
 test(function() {
     document.documentElement.style.justifyItems = "auto";
     checkValues(document.documentElement, "justifyItems", "justify-items", "auto", "normal");
-    checkValues(document.body, "justifySelf", "justify-self",  "auto", "normal");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(document.body, "justifySelf", "justify-self",  "auto", "auto");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
 }, "Check out how the DOM's root element deals with 'auto' value in justify-items.");
 
 test(function() {
@@ -78,19 +78,19 @@
     document.body.style.justifyItems = "auto";
     document.body.style.justifySelf = "auto";
     checkValues(document.body, "justifyItems", "justify-items",  "auto", "legacy center");
-    checkValues(document.body, "justifySelf", "justify-self",  "auto", "center");
+    checkValues(document.body, "justifySelf", "justify-self",  "auto", "auto");
     block.style.justifyItems = "auto";
     block.style.justifySelf = "auto";
     checkValues(block, "justifyItems", "justify-items",  "auto", "legacy center");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "center");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
 }, "Check out how the DOM's root element justify-items's value with 'legacy' keyword is used to resolve any descendant's justify-items 'auto' values.");
 
 test(function() {
     document.documentElement.style.justifyItems = "auto";
     checkValues(document.body, "justifyItems", "justify-items",  "auto", "normal");
-    checkValues(document.body, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(document.body, "justifySelf", "justify-self",  "auto", "auto");
     checkValues(block, "justifyItems", "justify-items",  "auto", "normal");
-    checkValues(block, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(block, "justifySelf", "justify-self",  "auto", "auto");
 }, "Check out how the DOM's root element recomputes its descendant's style when 'legacy' keyword is removed from its justify-items value.");
 
 console.log("");
@@ -112,7 +112,7 @@
     shadowNode.style.alignItems = "";
     checkValues(shadowNode, "alignItems", "align-items", "", "normal");
     shadowNode.style.alignSelf = "auto";
-    checkValues(shadowNode, "alignSelf", "align-self", "auto", "center");
+    checkValues(shadowNode, "alignSelf", "align-self", "auto", "auto");
 }, "Shadow Node inherits from ShadowHost to resolve the 'auto' values for align-self.");
 
 test(function() {
@@ -123,7 +123,7 @@
     shadowNode.style.justifyItems = "";
     checkValues(shadowNode, "justifyItems", "justify-items", "", "normal");
     shadowNode.style.justifySelf = "auto";
-    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "center");
+    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto");
 }, "Shadow Node inherits from ShadowHost to resolve the 'auto' values for justify-self.");
 
 test(function() {
@@ -132,14 +132,14 @@
     shadowNode.style.justifySelf = "auto";
     checkValues(shadowHost, "justifyItems", "justify-items", "auto", "normal");
     checkValues(shadowNode, "justifyItems", "justify-items", "right", "right");
-    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "normal");
+    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto");
 
     checkValues(shadowHost, "justifyItems", "justify-items", "auto", "normal");
     document.documentElement.style.justifyItems = "legacy center";
     checkValues(document.documentElement, "justifyItems", "justify-items",  "legacy center", "legacy center");
     checkValues(shadowHost, "justifyItems", "justify-items",  "auto", "legacy center");
     checkValues(shadowNode, "justifyItems", "justify-items", "right", "right");
-    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "center");
+    checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto");
     shadowNode.style.justifyItems = "auto";
     checkValues(shadowNode, "justifyItems", "justify-items", "auto", "legacy center");
     document.documentElement.style.justifyItems = "auto";
@@ -161,7 +161,7 @@
     slotted.style.alignSelf = "start";
     checkValues(slotted, "alignSelf", "align-self", "start", "start");
     slotted.style.alignSelf = "auto";
-    checkValues(slotted, "alignSelf", "align-self", "auto", "normal");
+    checkValues(slotted, "alignSelf", "align-self", "auto", "auto");
 }, "Check out how align-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned.");
 
 test(function() {
@@ -174,7 +174,7 @@
     slotted.style.justifySelf = "start";
     checkValues(slotted, "justifySelf", "justify-self", "start", "start");
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "normal");
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto");
 }, "Check out how justify-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned.");
 
 test(function() {
@@ -188,11 +188,11 @@
     slotted.style.justifyItems = "auto";
     checkValues(slotted, "justifyItems", "justify-items",  "auto", "normal");
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(slotted, "justifySelf", "justify-self",  "auto", "auto");
     shadowNode.style.justifyItems = "auto";
     checkValues(shadowNode, "justifyItems", "justify-items", "auto", "legacy center");
     checkValues(slotted, "justifyItems", "justify-items", "auto", "normal");
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "normal");
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto");
     document.documentElement.style.justifyItems = "auto";
 }, "Check out how the 'legacy' keyword in justify-items affects the 'slotted' elements while 'slot' is not assigned.");
 
@@ -211,7 +211,7 @@
     slotted.style.alignSelf = "start";
     checkValues(slotted, "alignSelf", "align-self", "start", "start");
     slotted.style.alignSelf = "auto";
-    checkValues(slotted, "alignSelf", "align-self", "auto", "right");
+    checkValues(slotted, "alignSelf", "align-self", "auto", "auto");
 }, "Check out how align-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned.");
 
 test(function() {
@@ -224,7 +224,7 @@
     slotted.style.justifySelf = "start";
     checkValues(slotted, "justifySelf", "justify-self", "start", "start");
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "right");
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto");
 }, "Check out how justify-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned.");
 
 test(function() {
@@ -238,11 +238,11 @@
     slotted.style.justifyItems = "auto";
     checkValues(slotted, "justifyItems", "justify-items", "auto", "normal"); // Shadow host is not the parent now, but ShadowNode.
     slotted.style.justifySelf = "auto";
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "right"); // Shadow host is not the parent now, but ShadowNode.
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); // Shadow host is not the parent now, but ShadowNode.
     shadowNode.style.justifyItems = "auto";
     checkValues(shadowNode, "justifyItems", "justify-items", "auto", "legacy center");
     checkValues(slotted, "justifyItems", "justify-items", "auto", "legacy center"); // Now that shadowNode is auto, 'legacy' applies.
-    checkValues(slotted, "justifySelf", "justify-self", "auto", "center"); // Now that shadowNode is auto, 'legacy' applies.
+    checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); // Now that shadowNode is auto, 'legacy' applies.
     document.documentElement.style.justifyItems = "auto";
 }, "Check out how the 'legacy' keyword affects the 'slotted' elements after the 'slot' is assigned.");
 
@@ -256,7 +256,7 @@
     slot.style.alignSelf = "left";
     checkValues(slot, "alignSelf", "align-self",  "left", "left");
     slot.style.alignSelf = "auto";
-    checkValues(slot, "alignSelf", "align-self",  "auto", "normal");
+    checkValues(slot, "alignSelf", "align-self",  "auto", "auto");
 }, "The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the align-self 'auto' values because Blink does not support slots in the flat tree.");
 
 test(function() {
@@ -270,7 +270,7 @@
     slot.style.justifySelf = "left";
     checkValues(slot, "justifySelf", "justify-self",  "left", "left");
     slot.style.justifySelf = "auto";
-    checkValues(slot, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(slot, "justifySelf", "justify-self",  "auto", "auto");
 }, "The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the justify-self 'auto' values because Blink does not support slots in the flat tree.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html
index 4a4b760..4e11e1e 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-justify-self.html
@@ -16,6 +16,10 @@
     justify-self: stretch;
 }
 
+#justifySelfNormal {
+    justify-self: normal;
+}
+
 #justifySelfStart {
     justify-self: start;
 }
@@ -89,6 +93,7 @@
 <div id="justifySelfFirstBaseline"></div>
 <div id="justifySelfLastBaseline"></div>
 <div id="justifySelfStretch"></div>
+<div id="justifySelfNormal"></div>
 <div id="justifySelfStart"></div>
 <div id="justifySelfEnd"></div>
 <div id="justifySelfCenter"></div>
@@ -120,6 +125,8 @@
     checkValues(justifySelfLastBaseline, "justifySelf", "justify-self", "", "last baseline");
     var justifySelfStretch = document.getElementById("justifySelfStretch");
     checkValues(justifySelfStretch, "justifySelf", "justify-self", "", "stretch");
+    var justifySelfNormal = document.getElementById("justifySelfNormal");
+    checkValues(justifySelfNormal, "justifySelf", "justify-self", "", "normal");
     var justifySelfStart = document.getElementById("justifySelfStart");
     checkValues(justifySelfStart, "justifySelf", "justify-self", "", "start");
     var justifySelfEnd = document.getElementById("justifySelfEnd");
@@ -160,7 +167,7 @@
 test(function() {
     element = document.createElement("div");
     document.body.appendChild(element);
-    checkValues(element, "justifySelf", "justify-self", "", "normal");
+    checkValues(element, "justifySelf", "justify-self", "", "auto");
 }, "Test initial value of justify-self through JS");
 
 test(function() {
@@ -186,16 +193,19 @@
     element.style.justifySelf = "self-start";
     checkValues(element, "justifySelf", "justify-self",  "self-start", "self-start");
 
+    element.style.justifySelf = "normal";
+    checkValues(element, "justifySelf", "justify-self",  "normal", "normal");
+
     element.style.justifySelf = "auto";
-    checkValues(element, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");
 
     container.style.display = "flex";
     element.style.justifySelf = "auto";
-    checkValues(element, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");
 
     container.style.display = "grid";
     element.style.justifySelf = "auto";
-    checkValues(element, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");
 
     element.style.justifySelf = "self-end";
     checkValues(element, "justifySelf", "justify-self",  "self-end", "self-end");
@@ -203,7 +213,7 @@
 
 test(function() {
     document.documentElement.style.justifySelf = "auto";
-    checkValues(document.documentElement, "justifySelf", "justify-self",  "auto", "normal");
+    checkValues(document.documentElement, "justifySelf", "justify-self",  "auto", "auto");
 }, "Test 'auto' value resolution for the root node");
 
 test(function() {
@@ -215,6 +225,9 @@
     checkBadValues(element, "justifySelf", "justify-self",  "unsafe auto");
     checkBadValues(element, "justifySelf", "justify-self",  "auto safe");
     checkBadValues(element, "justifySelf", "justify-self",  "auto left");
+    checkBadValues(element, "justifySelf", "justify-self",  "normal unsafe");
+    checkBadValues(element, "justifySelf", "justify-self",  "normal stretch");
+    checkBadValues(element, "justifySelf", "justify-self",  "baseline normal");
     checkBadValues(element, "justifySelf", "justify-self",  "baseline safe");
     checkBadValues(element, "justifySelf", "justify-self",  "baseline center");
     checkBadValues(element, "justifySelf", "justify-self",  "stretch unsafe");
@@ -240,35 +253,35 @@
 
 test(function() {
     container.style.display = "";
-    checkInitialValues(element, "justifySelf", "justify-self", "center", "normal");
+    checkInitialValues(element, "justifySelf", "justify-self", "center", "auto");
 }, "Test the value 'initial'");
 
 test(function() {
     container.style.display = "grid";
-    checkInitialValues(element, "justifySelf", "justify-self", "left safe", "normal");
+    checkInitialValues(element, "justifySelf", "justify-self", "left safe", "auto");
 }, "Test the value 'initial' for grid containers");
 
 test(function() {
     container.style.display = "flex";
-    checkInitialValues(element, "justifySelf", "justify-self", "right unsafe", "normal");
+    checkInitialValues(element, "justifySelf", "justify-self", "right unsafe", "auto");
 }, "Test the value 'initial' for flex containers");
 
 test(function() {
     container.style.display = "";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifySelf", "justify-self", "left", "normal");
+    checkInitialValues(element, "justifySelf", "justify-self", "left", "auto");
 }, "Test the value 'initial' for positioned elements");
 
 test(function() {
     container.style.display = "grid";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifySelf", "justify-self", "right", "normal");
+    checkInitialValues(element, "justifySelf", "justify-self", "right", "auto");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
     container.style.display = "flex";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifySelf", "justify-self", "end", "normal");
+    checkInitialValues(element, "justifySelf", "justify-self", "end", "auto");
 }, "Test the value 'initial' for positioned elements in grid containers");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html
index 36cf4816..1da45347 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-content.html
@@ -49,6 +49,9 @@
 #placeContentStartSafe {
     place-content: start safe;
 }
+#placeContentBaselineSafe {
+    place-content: baseline safe;
+}
 #placeContentStartEndLeft {
     place-content: start end left;
 }
@@ -204,8 +207,8 @@
 }, "Test setting 'start safe' as incorrect value through CSS.");
 
 test(function() {
-    checkValues(placeContentStartSafe, "placeContent", "place-content", "", "normal normal");
-    checkPlaceContentValues(placeContentStartSafe, "", "normal", "normal");
+    checkValues(placeContentBaselineSafe, "placeContent", "place-content", "", "normal normal");
+    checkPlaceContentValues(placeContentBaselineSafe, "", "normal", "normal");
 }, "Test setting 'baseline safe' as incorrect value through CSS.");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html
index 407da5cc..712bd1e9 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-items.html
@@ -58,6 +58,9 @@
 #placeItemsStartSafe {
   place-items: start safe;
 }
+#placeItemsBaselineSafe {
+  place-items: baseline safe;
+}
 #placeItemsStartEndLeft {
   place-items: start end left;
 }
@@ -207,8 +210,8 @@
 }, "Test setting 'start safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeItemsStartSafe, "placeItems", "place-items", "", "normal normal");
-  checkPlaceItemsValues(placeItemsStartSafe, "", "normal", "normal");
+  checkValues(placeItemsBaselineSafe, "placeItems", "place-items", "", "normal normal");
+  checkPlaceItemsValues(placeItemsBaselineSafe, "", "normal", "normal");
 }, "Test setting 'baseline safe' as incorrect value through CSS.");
 
 test(function() {
@@ -224,16 +227,16 @@
 }, "Test setting values through JS.");
 
 test(function() {
-  checkPlaceItemsValuesBadJS("auto normal", "normal", "normal");
-  checkPlaceItemsValuesBadJS("space-between", "normal", "normal");
-  checkPlaceItemsValuesBadJS("center safe", "normal", "normal");
-  checkPlaceItemsValuesBadJS("center self-start center", "normal", "normal");
-  checkPlaceItemsValuesBadJS("asrt", "normal", "normal");
-  checkPlaceItemsValuesBadJS("auto", "normal", "normal");
-  checkPlaceItemsValuesBadJS("10px", "normal", "normal");
-  checkPlaceItemsValuesBadJS("stretch safe", "normal", "normal");
-  checkPlaceItemsValuesBadJS("self-start start end", "normal", "normal");
-  checkPlaceItemsValuesBadJS("", "normal", "normal");
+  checkPlaceItemsValuesBadJS("auto normal");
+  checkPlaceItemsValuesBadJS("space-between");
+  checkPlaceItemsValuesBadJS("center safe");
+  checkPlaceItemsValuesBadJS("center self-start center");
+  checkPlaceItemsValuesBadJS("asrt", "normal");
+  checkPlaceItemsValuesBadJS("auto", "normal");
+  checkPlaceItemsValuesBadJS("10px", "normal");
+  checkPlaceItemsValuesBadJS("stretch safe");
+  checkPlaceItemsValuesBadJS("self-start start end");
+  checkPlaceItemsValuesBadJS("");
 }, "Test setting incorrect values through JS.");
 
 test(function() {
diff --git a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html
index a8e6c0e..4967bdc 100644
--- a/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html
+++ b/third_party/WebKit/LayoutTests/fast/alignment/parse-place-self.html
@@ -58,6 +58,9 @@
 #placeSelfStartSafe {
   place-self: start safe;
 }
+#placeSelfBaselineSafe {
+  place-self: baseline safe;
+}
 #placeSelfStartEndLeft {
   place-self: start end left;
 }
@@ -113,7 +116,7 @@
 {
   element.style.placeSelf = "";
   element.style.placeSelf = value;
-  checkPlaceSelfValues(element, "", "normal", "normal")
+  checkPlaceSelfValues(element, "", "auto", "auto")
 }
 
 test(function() {
@@ -122,8 +125,8 @@
 }, "Test getting the Computed Value of place-self's longhand properties when setting 'normal' value through CSS.");
 
 test(function() {
-  checkValues(placeSelfCenterAuto, "placeSelf", "place-self", "", "center normal");
-  checkPlaceSelfValues(placeSelfCenterAuto, "", "center", "normal");
+  checkValues(placeSelfCenterAuto, "placeSelf", "place-self", "", "center auto");
+  checkPlaceSelfValues(placeSelfCenterAuto, "", "center", "auto");
 }, "Test getting the Computed Value of place-self's longhand properties when setting 'center auto' value through CSS.");
 
 test(function() {
@@ -182,38 +185,38 @@
 }, "Test getting the Computed Value of place-self's longhand properties when setting 'start baseline' value through CSS.");
 
 test(function() {
-  checkValues(placeSelfAuto, "placeSelf", "place-self", "", "normal normal");
-  checkPlaceSelfValues(placeSelfAuto, "", "normal", "normal");
+  checkValues(placeSelfEmpty, "placeSelf", "place-self", "", "auto auto");
+  checkPlaceSelfValues(placeSelfEmpty, "", "auto", "auto");
 }, "Test setting '' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfAuto, "placeSelf", "place-self", "", "normal normal");
-  checkPlaceSelfValues(placeSelfAuto, "", "normal", "normal");
+  checkValues(placeSelfAuto, "placeSelf", "place-self", "", "auto auto");
+  checkPlaceSelfValues(placeSelfAuto, "", "auto", "auto");
 }, "Test setting 'auto' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfNone, "placeSelf", "place-self", "", "normal normal");
-  checkPlaceSelfValues(placeSelfNone, "", "normal", "normal");
+  checkValues(placeSelfNone, "placeSelf", "place-self", "", "auto auto");
+  checkPlaceSelfValues(placeSelfNone, "", "auto", "auto");
 }, "Test setting 'none' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfSafe, "placeSelf", "place-self", "", "normal normal");
-  checkPlaceSelfValues(placeSelfSafe, "", "normal", "normal");
+  checkValues(placeSelfSafe, "placeSelf", "place-self", "", "auto auto");
+  checkPlaceSelfValues(placeSelfSafe, "", "auto", "auto");
 }, "Test setting 'safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfStartSafe, "placeSelf", "place-self", "", "normal normal");
-  checkPlaceSelfValues(placeSelfStartSafe, "", "normal", "normal");
+  checkValues(placeSelfStartSafe, "placeSelf", "place-self", "", "auto auto");
+  checkPlaceSelfValues(placeSelfStartSafe, "", "auto", "auto");
 }, "Test setting 'start safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfStartSafe, "placeSelf", "place-self", "", "normal normal");
-  checkPlaceSelfValues(placeSelfStartSafe, "", "normal", "normal");
+  checkValues(placeSelfBaselineSafe, "placeSelf", "place-self", "", "auto auto");
+  checkPlaceSelfValues(placeSelfBaselineSafe, "", "auto", "auto");
 }, "Test setting 'baseline safe' as incorrect value through CSS.");
 
 test(function() {
-  checkValues(placeSelfStartEndLeft, "placeSelf", "place-self", "", "normal normal");
-  checkPlaceSelfValues(placeSelfStartEndLeft, "", "normal", "normal");
+  checkValues(placeSelfStartEndLeft, "placeSelf", "place-self", "", "auto auto");
+  checkPlaceSelfValues(placeSelfStartEndLeft, "", "auto", "auto");
 }, "Test setting 'start end left' as incorrect value through CSS.");
 
 test(function() {
@@ -221,35 +224,36 @@
   checkPlaceSelfValuesJS("center start", "center", "start");
   checkPlaceSelfValuesJS("self-start end", "self-start", "end");
   checkPlaceSelfValuesJS("normal end", "normal", "end");
+  checkPlaceSelfValuesJS("auto right", "auto", "right");
 }, "Test setting values through JS.");
 
 test(function() {
-  checkPlaceSelfValuesBadJS("space-between", "normal", "normal");
-  checkPlaceSelfValuesBadJS("center safe", "normal", "normal");
-  checkPlaceSelfValuesBadJS("center self-start center", "normal", "normal");
-  checkPlaceSelfValuesBadJS("asrt", "normal", "normal");
-  checkPlaceSelfValuesBadJS("10px", "normal", "normal");
-  checkPlaceSelfValuesBadJS("stretch safe", "normal", "normal");
-  checkPlaceSelfValuesBadJS("self-start start end", "normal", "normal");
-  checkPlaceSelfValuesBadJS("", "normal", "normal");
+  checkPlaceSelfValuesBadJS("space-between");
+  checkPlaceSelfValuesBadJS("center safe");
+  checkPlaceSelfValuesBadJS("center self-start center");
+  checkPlaceSelfValuesBadJS("asrt");
+  checkPlaceSelfValuesBadJS("10px");
+  checkPlaceSelfValuesBadJS("stretch safe");
+  checkPlaceSelfValuesBadJS("self-start start end");
+  checkPlaceSelfValuesBadJS("");
 }, "Test setting incorrect values through JS.");
 
 test(function() {
   element = document.createElement("div");
   document.body.appendChild(element);
-  checkValues(element, "placeSelf", "place-self", "", "normal normal");
+  checkValues(element, "placeSelf", "place-self", "", "auto auto");
   element.style.placeSelf = "center";
   checkPlaceSelfValues(element, "center", "center", "center");
   element.style.placeSelf = "initial";
-  checkValues(element, "placeSelf", "place-self", "initial", "normal normal");
-  checkPlaceSelfValues(element, "initial", "normal", "normal");
+  checkValues(element, "placeSelf", "place-self", "initial", "auto auto");
+  checkPlaceSelfValues(element, "initial", "auto", "auto");
 }, "Test the 'initial' value of the place-self shorthand and its longhand properties' Computed value");
 
 test(function() {
   document.body.style.placeSelf = "start";
   var anotherElement = document.createElement("div");
   document.body.appendChild(anotherElement);
-  checkPlaceSelfValues(anotherElement, "", "normal", "normal");
+  checkPlaceSelfValues(anotherElement, "", "auto", "auto");
   anotherElement.style.placeSelf = "inherit";
   checkPlaceSelfValues(anotherElement, "inherit", "start", "start");
 }, "Test the 'inherit' value of the place-self shorthand and its longhand properties' Computed value");
diff --git a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt
index cdc5172..e1e19f09 100644
--- a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-listing-expected.txt
@@ -60,7 +60,7 @@
 -webkit-writing-mode: horizontal-tb
 align-content: normal
 align-items: normal
-align-self: normal
+align-self: auto
 alignment-baseline: auto
 animation-delay: 0s
 animation-direction: normal
@@ -181,7 +181,7 @@
 isolation: auto
 justify-content: normal
 justify-items: normal
-justify-self: normal
+justify-self: auto
 left: auto
 letter-spacing: normal
 lighting-color: rgb(255, 255, 255)
diff --git a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
index 0fc97ee..95a01f87 100644
--- a/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
@@ -60,7 +60,7 @@
 -webkit-writing-mode: horizontal-tb
 align-content: normal
 align-items: normal
-align-self: normal
+align-self: auto
 alignment-baseline: auto
 animation-delay: 0s
 animation-direction: normal
@@ -181,7 +181,7 @@
 isolation: auto
 justify-content: normal
 justify-items: normal
-justify-self: normal
+justify-self: auto
 left: auto
 letter-spacing: normal
 lighting-color: rgb(255, 255, 255)
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/windowclient-navigate-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/windowclient-navigate-worker.js
deleted file mode 100644
index 10e86d3..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/windowclient-navigate-worker.js
+++ /dev/null
@@ -1,51 +0,0 @@
-function match_query(query_string) {
-  return self.location.search.substr(1) == query_string;
-}
-
-function receive_event(event_name) {
-  return new Promise(function(resolve) {
-        var handler = function(e) {
-            resolve(e);
-            // To allow waitUntil to be called inside execution of the microtask
-            // enqueued by above resolve function.
-            e.waitUntil(Promise.resolve());
-        };
-        self.addEventListener(event_name, handler, false);
-      });
-}
-
-function navigate_test(e) {
-  var port = e.data.port;
-  var url = e.data.url;
-
-  return clients.matchAll({ includeUncontrolled : true })
-    .then(function(client_list) {
-        for (var i = 0; i < client_list.length; i++) {
-          var client = client_list[i];
-          if (client.frameType == 'nested') {
-            return client.navigate(url);
-          }
-        }
-        port.postMessage('Could not found window client.');
-      })
-    .then(function(new_client) {
-        if (new_client === null)
-          port.postMessage(new_client);
-        else
-          port.postMessage(new_client.url);
-      })
-    .catch(function(error) {
-        port.postMessage(error.name);
-      });
-}
-if (match_query('installing')) {
-  // If the query string is "?installing", then do test on installing worker.
-  // This is only for in-scope-but-not-controlled test.
-  receive_event('install').then(function(e) {
-      e.waitUntil(receive_event('message').then(navigate_test));
-    });
-} else {
-  receive_event('message').then(function(e) {
-      e.waitUntil(navigate_test(e));
-    });
-}
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/state.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/state.html
deleted file mode 100644
index ddc08d5..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/state.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="resources/test-helpers.js"></script>
-<body>
-<script>
-(function () {
-    var t = async_test('Service Worker state property and "statechange" event');
-    var currentState = 'test-is-starting';
-    var scope = 'resources/state/';
-
-    service_worker_unregister_and_register(
-        t, 'resources/empty-worker.js', scope)
-      .then(t.step_func(function(registration) {
-          var sw = registration.installing;
-          sw.addEventListener('statechange', t.step_func(onStateChange(sw)));
-          assert_equals(sw.state, 'installing',
-                        'the service worker should be in "installing" state.');
-          checkStateTransition(sw.state);
-        }))
-      .catch(unreached_rejection(t));
-
-    function checkStateTransition(newState) {
-        switch (currentState) {
-        case 'test-is-starting':
-            break; // anything goes
-        case 'installing':
-            assert_in_array(newState, ['installed', 'redundant']);
-            break;
-        case 'installed':
-            assert_in_array(newState, ['activating', 'redundant']);
-            break;
-        case 'activating':
-            assert_in_array(newState, ['activated', 'redundant']);
-            break;
-        case 'activated':
-            assert_equals(newState, 'redundant');
-            break;
-        case 'redundant':
-            assert_unreached('a ServiceWorker should not transition out of ' +
-                             'the "redundant" state');
-            break;
-        default:
-            assert_unreached('should not transition into unknown state "' +
-                             newState + '"');
-            break;
-        }
-        currentState = newState;
-    }
-
-    function onStateChange(expectedTarget) {
-        return function(event) {
-            assert_true(event.target instanceof ServiceWorker,
-                        'the target of the statechange event should be a ' +
-                        'ServiceWorker.');
-            assert_equals(event.target, expectedTarget,
-                          'the target of the statechange event should be ' +
-                          'the installing ServiceWorker');
-            assert_equals(event.type, 'statechange',
-                          'the type of the event should be "statechange".');
-
-            checkStateTransition(event.target.state);
-
-            if (event.target.state == 'activated')
-                service_worker_unregister_and_done(t, scope);
-        };
-    }
-}());
-</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/synced-state.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/synced-state.html
deleted file mode 100644
index 52940e0d..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/synced-state.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!doctype html>
-<title>ServiceWorker: worker objects have synced state</title>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="resources/test-helpers.js"></script>
-<script>
-// Tests that ServiceWorker objects representing the same Service Worker
-// entity have the same state. JS-level equality is now required according to
-// the spec.
-promise_test(function(t) {
-    var scope = 'resources/synced-state';
-    var script = 'resources/empty-worker.js';
-    var registration;
-    return service_worker_unregister_and_register(t, script, scope)
-      .then(function(r) {
-          var step = 0;
-          registration = r;
-          add_completion_callback(function() { r.unregister(); });
-          return new Promise(function(resolve) {
-              r.installing.addEventListener('statechange', function(e) {
-                  step++;
-                  if (step == 1) {
-                    assert_equals(e.currentTarget.state, 'installed',
-                                  'original SW should be installed');
-                    assert_equals(r.installing, null,
-                                  'in installed, .installing should be null');
-                    assert_equals(r.waiting.state, 'installed',
-                                  'in installed, the state of .waiting ' +
-                                  'should be installed');
-                    assert_equals(r.active, null,
-                                  'in installed, .active should be null');
-                    assert_equals(r.waiting, e.currentTarget,
-                                  '.waiting should be equal to the original ' +
-                                  'SW in installed');
-                  } else if (step == 2) {
-                    assert_equals(e.currentTarget.state, 'activating',
-                                  'original SW should be activating');
-                    assert_equals(r.installing, null,
-                                  'in activating, .installing should be null');
-                    assert_equals(r.waiting, null,
-                                  'in activating, .waiting should be null');
-                    assert_equals(r.active.state, 'activating',
-                                  'in activating, the state of .active ' +
-                                  'should be activating');
-                    assert_equals(r.active, e.currentTarget,
-                                  '.active should be equal to the original ' +
-                                  'SW in activating');
-                  } else if (step == 3) {
-                    assert_equals(e.currentTarget.state, 'activated',
-                                  'original SW should be activated');
-                    assert_equals(r.installing, null,
-                                  'in activated, .installing should be null');
-                    assert_equals(r.waiting, null,
-                                  'in activated, .waiting should be null');
-                    assert_equals(r.active.state, 'activated',
-                                  'in activated, the state of .active should ' +
-                                  'be activated');
-                    assert_equals(r.active, e.currentTarget,
-                                  '.active should be equal to the original ' +
-                                  'SW in activated');
-                    resolve();
-                  }
-                });
-            });
-        })
-      .then(function() {
-          return navigator.serviceWorker.getRegistration(scope);
-        })
-      .then(function(r) {
-          assert_equals(r, registration, 'getRegistration should return the ' +
-                                         'same object with the registered one');
-        });
-  }, 'worker objects for the same entity have the same state');
-</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/windowclient-navigate.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/windowclient-navigate.html
deleted file mode 100644
index bde2ce8..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/windowclient-navigate.html
+++ /dev/null
@@ -1,140 +0,0 @@
-<!DOCTYPE html>
-<title>Service Worker: WindowClient.navigate() tests</title>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="../resources/get-host-info.js"></script>
-<script src="resources/test-helpers.js"></script>
-<body>
-<script>
-
-const SCOPE = 'resources/blank.html';
-const SCRIPT_URL = 'resources/windowclient-navigate-worker.js';
-const CROSS_ORIGIN_URL = get_host_info()['HTTP_REMOTE_ORIGIN'] +
-    '/serviceworker/resources/blank.html';
-
-navigate_test({
-    description: 'normal test',
-    dest_url: 'blank.html?navigate',
-    expected: normalizeURL(SCOPE) + '?navigate',
-  });
-
-navigate_test({
-    description: 'blank url test',
-    dest_url: '',
-    expected: normalizeURL(SCRIPT_URL)
-  });
-
-navigate_test({
-    description: 'in scope but not controlled test on installing worker',
-    dest_url: 'blank.html?navigate',
-    expected: 'TypeError',
-    wait_state: 'installing',
-  });
-
-navigate_test({
-    description: 'in scope but not controlled test on active worker',
-    dest_url: 'blank.html?navigate',
-    expected: 'TypeError',
-    should_be_reload: false,
-  });
-
-navigate_test({
-    description: 'out scope test',
-    src_url: 'out_scope/blank.html',
-    dest_url: 'blank.html?navigate',
-    expected: 'TypeError',
-  });
-
-navigate_test({
-    description: 'cross orgin url test',
-    dest_url: CROSS_ORIGIN_URL,
-    expected: null
-  });
-
-navigate_test({
-    description: 'invalid url(http://[example.com]) test',
-    dest_url: 'http://[example].com',
-    expected: 'TypeError'
-  });
-
-navigate_test({
-    description: 'invalid url(view-source://example.com) test',
-    dest_url: 'view-source://example.com',
-    expected: 'TypeError'
-  });
-
-navigate_test({
-    description: 'invalid url(file:///) test',
-    dest_url: 'file:///',
-    expected: 'TypeError'
-  });
-
-navigate_test({
-    description: 'invalid url(about:blank) test',
-    dest_url: 'about:blank',
-    expected: 'TypeError'
-  });
-
-function navigate_test(override_parameters) {
-  // default parameters
-  var parameters = {
-    description: null,
-    src_url: SCOPE,
-    dest_url: null,
-    expected: null,
-    wait_state: 'activated',
-    scope: SCOPE,
-    should_be_reload: true
-  };
-
-  for (key in override_parameters)
-    parameters[key] = override_parameters[key];
-
-  promise_test(function(test) {
-    var service_worker;
-    var client_frame;
-    var script_url = SCRIPT_URL;
-
-    // For in-scope-but-not-controlled test on installing worker,
-    // if the wait_state is "installing", then append the query to script_url.
-    if (parameters.wait_state == 'installing')
-      script_url += '?' + parameters.wait_state;
-
-    return with_iframe(parameters.src_url)
-      .then(function(frame) {
-          client_frame = frame;
-          return service_worker_unregister_and_register(
-              test, script_url, parameters.scope);
-        })
-      .then(function(registration) {
-          service_worker = registration.installing;
-          return wait_for_state(test, service_worker, parameters.wait_state);
-        })
-      .then(function(state) {
-          if (parameters.should_be_reload) {
-            client_frame.remove();
-            return with_iframe(parameters.src_url);
-          }
-          return client_frame;
-        })
-      .then(function(frame) {
-          client_frame = frame;
-          return new Promise(function(resolve) {
-              var channel = new MessageChannel();
-              channel.port1.onmessage = test.step_func(resolve);
-              service_worker.postMessage({
-                  port: channel.port2,
-                  url: parameters.dest_url
-                }, [channel.port2]);
-            });
-        })
-      .then(function(response) {
-          client_frame && client_frame.remove()
-          assert_equals(response.data, parameters.expected);
-          return service_worker_unregister_and_done(test, parameters.scope);
-        })
-  }, parameters.description);
-}
-
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt b/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt
index f69ece8..3f261c2 100644
--- a/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/svg/css/getComputedStyle-listing-expected.txt
@@ -60,7 +60,7 @@
 -webkit-writing-mode: horizontal-tb
 align-content: normal
 align-items: normal
-align-self: normal
+align-self: auto
 alignment-baseline: auto
 animation-delay: 0s
 animation-direction: normal
@@ -181,7 +181,7 @@
 isolation: auto
 justify-content: normal
 justify-items: normal
-justify-self: normal
+justify-self: auto
 left: auto
 letter-spacing: normal
 lighting-color: rgb(255, 255, 255)
diff --git a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
index 894fa7d..b723540 100644
--- a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
+++ b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
@@ -109,8 +109,6 @@
   "$blink_core_output_dir/fileapi/BlobPropertyBag.h",
   "$blink_core_output_dir/fileapi/FilePropertyBag.cpp",
   "$blink_core_output_dir/fileapi/FilePropertyBag.h",
-  "$blink_core_output_dir/frame/ScrollIntoViewOptions.cpp",
-  "$blink_core_output_dir/frame/ScrollIntoViewOptions.h",
   "$blink_core_output_dir/frame/ScrollOptions.cpp",
   "$blink_core_output_dir/frame/ScrollOptions.h",
   "$blink_core_output_dir/frame/ScrollToOptions.cpp",
@@ -222,8 +220,6 @@
   "$bindings_core_v8_output_dir/NodeOrString.h",
   "$bindings_core_v8_output_dir/RadioNodeListOrElement.cpp",
   "$bindings_core_v8_output_dir/RadioNodeListOrElement.h",
-  "$bindings_core_v8_output_dir/ScrollIntoViewOptionsOrBoolean.cpp",
-  "$bindings_core_v8_output_dir/ScrollIntoViewOptionsOrBoolean.h",
   "$bindings_core_v8_output_dir/StringOrArrayBuffer.cpp",
   "$bindings_core_v8_output_dir/StringOrArrayBuffer.h",
   "$bindings_core_v8_output_dir/StringOrArrayBufferOrArrayBufferView.cpp",
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp
index 178e7b44..7100cc4 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp
@@ -17,25 +17,15 @@
 
 namespace blink {
 
-ScriptCustomElementDefinitionBuilder*
-    ScriptCustomElementDefinitionBuilder::stack_ = nullptr;
-
 ScriptCustomElementDefinitionBuilder::ScriptCustomElementDefinitionBuilder(
     ScriptState* script_state,
     CustomElementRegistry* registry,
     const ScriptValue& constructor,
     ExceptionState& exception_state)
-    : prev_(stack_),
-      script_state_(script_state),
+    : script_state_(script_state),
       registry_(registry),
       constructor_value_(constructor.V8Value()),
-      exception_state_(exception_state) {
-  stack_ = this;
-}
-
-ScriptCustomElementDefinitionBuilder::~ScriptCustomElementDefinitionBuilder() {
-  stack_ = prev_;
-}
+      exception_state_(exception_state) {}
 
 bool ScriptCustomElementDefinitionBuilder::CheckConstructorIntrinsics() {
   DCHECK(script_state_->World().IsMainWorld());
@@ -54,26 +44,15 @@
 }
 
 bool ScriptCustomElementDefinitionBuilder::CheckConstructorNotRegistered() {
-  if (ScriptCustomElementDefinition::ForConstructor(script_state_.Get(),
-                                                    registry_, constructor_)) {
-    // Constructor is already registered.
-    exception_state_.ThrowDOMException(
-        kNotSupportedError,
-        "this constructor has already been used with this registry");
-    return false;
-  }
-  for (auto builder = prev_; builder; builder = builder->prev_) {
-    CHECK(!builder->constructor_.IsEmpty());
-    if (registry_ != builder->registry_ ||
-        constructor_ != builder->constructor_) {
-      continue;
-    }
-    exception_state_.ThrowDOMException(
-        kNotSupportedError,
-        "this constructor is already being defined in this registry");
-    return false;
-  }
-  return true;
+  if (!ScriptCustomElementDefinition::ForConstructor(script_state_.Get(),
+                                                     registry_, constructor_))
+    return true;
+
+  // Constructor is already registered.
+  exception_state_.ThrowDOMException(
+      kNotSupportedError,
+      "this constructor has already been used with this registry");
+  return false;
 }
 
 bool ScriptCustomElementDefinitionBuilder::ValueForName(
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.h b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.h
index 5ba1190..c65a67e 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.h
@@ -35,7 +35,7 @@
       CustomElementRegistry*,
       const ScriptValue& constructor_script_value,
       ExceptionState&);
-  ~ScriptCustomElementDefinitionBuilder();
+  ~ScriptCustomElementDefinitionBuilder() = default;
 
   bool CheckConstructorIntrinsics() override;
   bool CheckConstructorNotRegistered() override;
@@ -46,7 +46,6 @@
  private:
   static ScriptCustomElementDefinitionBuilder* stack_;
 
-  ScriptCustomElementDefinitionBuilder* prev_;
   RefPtr<ScriptState> script_state_;
   Member<CustomElementRegistry> registry_;
   v8::Local<v8::Value> constructor_value_;
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni
index e997194..9dad1a5 100644
--- a/third_party/WebKit/Source/core/core_idl_files.gni
+++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -559,7 +559,6 @@
                     "events/WheelEventInit.idl",
                     "fileapi/BlobPropertyBag.idl",
                     "fileapi/FilePropertyBag.idl",
-                    "frame/ScrollIntoViewOptions.idl",
                     "frame/ScrollOptions.idl",
                     "frame/ScrollToOptions.idl",
                     "html/AssignedNodesOptions.idl",
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
index 37a14173..2ce9f012 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -2797,9 +2797,7 @@
     : CSSValue(kIdentifierClass) {
   switch (item_position) {
     case kItemPositionAuto:
-      // The 'auto' values might have been already resolved.
-      NOTREACHED();
-      value_id_ = CSSValueNormal;
+      value_id_ = CSSValueAuto;
       break;
     case kItemPositionNormal:
       value_id_ = CSSValueNormal;
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
index 7132869..6da185f 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -503,13 +503,7 @@
   CSSValueList* result = CSSValueList::CreateSpaceSeparated();
   if (data.PositionType() == kLegacyPosition)
     result->Append(*CSSIdentifierValue::Create(CSSValueLegacy));
-  if (data.GetPosition() == kItemPositionAuto) {
-    // To avoid needing to copy the RareNonInheritedData, we repurpose the
-    // 'auto' flag to not just mean 'auto' prior to running the StyleAdjuster
-    // but also mean 'normal' after running it.
-    result->Append(*CSSIdentifierValue::Create(
-        ComputedStyle::InitialDefaultAlignment().GetPosition()));
-  } else if (data.GetPosition() == kItemPositionBaseline) {
+  if (data.GetPosition() == kItemPositionBaseline) {
     result->Append(
         *CSSValuePair::Create(CSSIdentifierValue::Create(CSSValueBaseline),
                               CSSIdentifierValue::Create(CSSValueBaseline),
@@ -2613,7 +2607,10 @@
     case CSSPropertyIsolation:
       return CSSIdentifierValue::Create(style.Isolation());
     case CSSPropertyJustifyItems:
-      return ValueForItemPositionWithOverflowAlignment(style.JustifyItems());
+      return ValueForItemPositionWithOverflowAlignment(
+          style.JustifyItems().GetPosition() == kItemPositionAuto
+              ? ComputedStyle::InitialDefaultAlignment()
+              : style.JustifyItems());
     case CSSPropertyJustifySelf:
       return ValueForItemPositionWithOverflowAlignment(style.JustifySelf());
     case CSSPropertyLeft:
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
index bb67e278..051088e 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
@@ -159,38 +159,6 @@
   style.SetPosition(EPosition::kStatic);
 }
 
-void StyleAdjuster::AdjustStyleForAlignment(
-    ComputedStyle& style,
-    const ComputedStyle& layout_parent_style) {
-  // To avoid needing to copy the RareNonInheritedData, we repurpose the 'auto'
-  // flag to not just mean 'auto' prior to running the StyleAdjuster but also
-  // mean 'normal' after running it.
-
-  // If the inherited value of justify-items includes the 'legacy' keyword,
-  // 'auto' computes to the the inherited value.  Otherwise, 'auto' computes to
-  // 'normal'.
-  if (style.JustifyItemsPosition() == kItemPositionAuto) {
-    if (layout_parent_style.JustifyItemsPositionType() == kLegacyPosition)
-      style.SetJustifyItems(layout_parent_style.JustifyItems());
-  }
-
-  // The 'auto' keyword computes the computed value of justify-items on the
-  // parent (minus any legacy keywords), or 'normal' if the box has no parent.
-  if (style.JustifySelfPosition() == kItemPositionAuto) {
-    if (layout_parent_style.JustifyItemsPositionType() == kLegacyPosition)
-      style.SetJustifySelfPosition(layout_parent_style.JustifyItemsPosition());
-    else if (layout_parent_style.JustifyItemsPosition() != kItemPositionAuto)
-      style.SetJustifySelf(layout_parent_style.JustifyItems());
-  }
-
-  // The 'auto' keyword computes the computed value of align-items on the parent
-  // or 'normal' if the box has no parent.
-  if (style.AlignSelfPosition() == kItemPositionAuto &&
-      layout_parent_style.AlignItemsPosition() !=
-          ComputedStyle::InitialDefaultAlignment().GetPosition())
-    style.SetAlignSelf(layout_parent_style.AlignItems());
-}
-
 static void AdjustStyleForHTMLElement(ComputedStyle& style,
                                       HTMLElement& element) {
   // <div> and <span> are the most common elements on the web, we skip all the
@@ -511,7 +479,6 @@
     if (isSVGTextElement(*element))
       style.ClearMultiCol();
   }
-  AdjustStyleForAlignment(style, layout_parent_style);
 
   // If this node is sticky it marks the creation of a sticky subtree, which we
   // must track to properly handle document lifecycle in some cases.
@@ -521,6 +488,14 @@
   // inheritance from the ancestor and there is no harm to setting it again.
   if (style.GetPosition() == EPosition::kSticky)
     style.SetSubtreeIsSticky(true);
+
+  // If the inherited value of justify-items includes the 'legacy' keyword,
+  // 'auto' computes to the the inherited value.  Otherwise, 'auto' computes to
+  // 'normal'.
+  if (style.JustifyItemsPosition() == kItemPositionAuto) {
+    if (parent_style.JustifyItemsPositionType() == kLegacyPosition)
+      style.SetJustifyItems(parent_style.JustifyItems());
+  }
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h
index 9690f9d8..3ca8e7c 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h
+++ b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.h
@@ -42,8 +42,6 @@
                                   const ComputedStyle& layout_parent_style,
                                   Element*);
   static void AdjustStyleForEditing(ComputedStyle&);
-  static void AdjustStyleForAlignment(ComputedStyle&,
-                                      const ComputedStyle& parent_style);
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn
index deefadc..9940172 100644
--- a/third_party/WebKit/Source/core/dom/BUILD.gn
+++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -37,8 +37,6 @@
     "ChildNodeList.h",
     "ClassCollection.cpp",
     "ClassCollection.h",
-    "ClassList.cpp",
-    "ClassList.h",
     "ClassicPendingScript.cpp",
     "ClassicPendingScript.h",
     "ClassicScript.cpp",
diff --git a/third_party/WebKit/Source/core/dom/ClassList.cpp b/third_party/WebKit/Source/core/dom/ClassList.cpp
deleted file mode 100644
index 31b4dbbe38..0000000
--- a/third_party/WebKit/Source/core/dom/ClassList.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-#include "core/dom/ClassList.h"
-
-namespace blink {
-
-ClassList::ClassList(Element* element)
-    : DOMTokenList(nullptr), element_(element) {}
-
-DEFINE_TRACE(ClassList) {
-  visitor->Trace(element_);
-  DOMTokenList::Trace(visitor);
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/ClassList.h b/third_party/WebKit/Source/core/dom/ClassList.h
deleted file mode 100644
index d411f854..0000000
--- a/third_party/WebKit/Source/core/dom/ClassList.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-#ifndef ClassList_h
-#define ClassList_h
-
-#include <memory>
-#include "core/HTMLNames.h"
-#include "core/dom/DOMTokenList.h"
-#include "core/dom/Element.h"
-#include "core/dom/SpaceSplitString.h"
-
-namespace blink {
-
-class Element;
-
-class ClassList final : public DOMTokenList {
- public:
-  static ClassList* Create(Element* element) { return new ClassList(element); }
-  DECLARE_VIRTUAL_TRACE();
-
- private:
-  explicit ClassList(Element*);
-
-  void setValue(const AtomicString& value) override {
-    element_->setAttribute(HTMLNames::classAttr, value);
-  }
-
-  Member<Element> element_;
-};
-
-}  // namespace blink
-
-#endif  // ClassList_h
diff --git a/third_party/WebKit/Source/core/dom/DOMTokenList.cpp b/third_party/WebKit/Source/core/dom/DOMTokenList.cpp
index 8e651e5..11dbfc79 100644
--- a/third_party/WebKit/Source/core/dom/DOMTokenList.cpp
+++ b/third_party/WebKit/Source/core/dom/DOMTokenList.cpp
@@ -25,6 +25,7 @@
 #include "core/dom/DOMTokenList.h"
 
 #include "bindings/core/v8/ExceptionState.h"
+#include "core/dom/Element.h"
 #include "core/dom/ExceptionCode.h"
 #include "core/html/parser/HTMLParserIdioms.h"
 #include "platform/wtf/AutoReset.h"
@@ -32,6 +33,10 @@
 
 namespace blink {
 
+DEFINE_TRACE(DOMTokenList) {
+  visitor->Trace(element_);
+}
+
 // This implements the common part of the following operations:
 // https://dom.spec.whatwg.org/#dom-domtokenlist-add
 // https://dom.spec.whatwg.org/#dom-domtokenlist-remove
@@ -214,8 +219,7 @@
 }
 
 void DOMTokenList::setValue(const AtomicString& value) {
-  if (observer_)
-    observer_->ValueWasSet(value);
+  element_->setAttribute(attribute_name_, value);
 }
 
 void DOMTokenList::DidUpdateAttributeValue(const AtomicString& old_value,
diff --git a/third_party/WebKit/Source/core/dom/DOMTokenList.h b/third_party/WebKit/Source/core/dom/DOMTokenList.h
index 5ef9f8d..f494264 100644
--- a/third_party/WebKit/Source/core/dom/DOMTokenList.h
+++ b/third_party/WebKit/Source/core/dom/DOMTokenList.h
@@ -26,6 +26,7 @@
 #define DOMTokenList_h
 
 #include "core/CoreExport.h"
+#include "core/dom/QualifiedName.h"
 #include "core/dom/SpaceSplitString.h"
 #include "platform/bindings/ScriptWrappable.h"
 #include "platform/heap/Handle.h"
@@ -34,28 +35,20 @@
 
 namespace blink {
 
+class Element;
 class ExceptionState;
 
-class CORE_EXPORT DOMTokenListObserver : public GarbageCollectedMixin {
- public:
-  // Called when the value property is set, even if the tokens in
-  // the set have not changed.
-  virtual void ValueWasSet(const AtomicString& value) = 0;
-
-  DEFINE_INLINE_VIRTUAL_TRACE() {}
-};
-
 class CORE_EXPORT DOMTokenList : public GarbageCollectedFinalized<DOMTokenList>,
                                  public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
   WTF_MAKE_NONCOPYABLE(DOMTokenList);
 
  public:
-  static DOMTokenList* Create(DOMTokenListObserver* observer = nullptr) {
-    return new DOMTokenList(observer);
+  static DOMTokenList* Create(Element& element, const QualifiedName& attr) {
+    return new DOMTokenList(element, attr);
   }
-
   virtual ~DOMTokenList() {}
+  DECLARE_VIRTUAL_TRACE();
 
   unsigned length() const { return tokens_.size(); }
   const AtomicString item(unsigned index) const;
@@ -70,9 +63,7 @@
   bool supports(const AtomicString&, ExceptionState&);
 
   const AtomicString& value() const { return value_; }
-  // DOMTokenListObserver::ValueWasSet or setValue override should update the
-  // associated attribute value.
-  virtual void setValue(const AtomicString&);
+  void setValue(const AtomicString&);
 
   // This function should be called when the associated attribute value was
   // updated.
@@ -80,15 +71,13 @@
                                const AtomicString& new_value);
 
   const SpaceSplitString& Tokens() const { return tokens_; }
-  void SetObserver(DOMTokenListObserver* observer) { observer_ = observer; }
 
   const AtomicString& toString() const { return value(); }
 
-  DEFINE_INLINE_VIRTUAL_TRACE() { visitor->Trace(observer_); }
-
  protected:
-  DOMTokenList(DOMTokenListObserver* observer) : observer_(observer) {}
-
+  DOMTokenList(Element& element, const QualifiedName& attr)
+      : element_(element), attribute_name_(attr) {}
+  Element& GetElement() const { return *element_; }
   void AddInternal(const AtomicString&);
   void RemoveInternal(const AtomicString&);
 
@@ -104,7 +93,8 @@
 
   SpaceSplitString tokens_;
   AtomicString value_;
-  WeakMember<DOMTokenListObserver> observer_;
+  const Member<Element> element_;
+  const QualifiedName attribute_name_;
   bool is_in_update_step_ = false;
 };
 
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 18ec4fe..65a83f2 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -30,7 +30,6 @@
 #include "bindings/core/v8/Dictionary.h"
 #include "bindings/core/v8/ExceptionMessages.h"
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/ScrollIntoViewOptionsOrBoolean.h"
 #include "bindings/core/v8/V8DOMActivityLogger.h"
 #include "core/CSSValueKeywords.h"
 #include "core/SVGNames.h"
@@ -52,9 +51,9 @@
 #include "core/dom/AXObjectCache.h"
 #include "core/dom/Attr.h"
 #include "core/dom/CSSSelectorWatch.h"
-#include "core/dom/ClassList.h"
 #include "core/dom/ClientRect.h"
 #include "core/dom/ClientRectList.h"
+#include "core/dom/DOMTokenList.h"
 #include "core/dom/DatasetDOMStringMap.h"
 #include "core/dom/ElementDataCache.h"
 #include "core/dom/ElementIntersectionObserverData.h"
@@ -96,7 +95,6 @@
 #include "core/frame/LocalDOMWindow.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/LocalFrameView.h"
-#include "core/frame/ScrollIntoViewOptions.h"
 #include "core/frame/ScrollToOptions.h"
 #include "core/frame/Settings.h"
 #include "core/frame/UseCounter.h"
@@ -143,7 +141,6 @@
 #include "platform/graphics/CompositorMutableProperties.h"
 #include "platform/graphics/CompositorMutation.h"
 #include "platform/scroll/ScrollableArea.h"
-#include "platform/scroll/SmoothScrollSequencer.h"
 #include "platform/wtf/BitVector.h"
 #include "platform/wtf/HashFunctions.h"
 #include "platform/wtf/text/CString.h"
@@ -441,88 +438,27 @@
   EnsureElementRareData().SetNonce(nonce);
 }
 
-void Element::scrollIntoView(ScrollIntoViewOptionsOrBoolean arg) {
-  ScrollIntoViewOptions options;
-  if (arg.isBoolean()) {
-    if (arg.getAsBoolean())
-      options.setBlock("start");
-    else
-      options.setBlock("end");
-    options.setInlinePosition("nearest");
-  } else if (arg.isScrollIntoViewOptions()) {
-    options = arg.getAsScrollIntoViewOptions();
-    if (!RuntimeEnabledFeatures::cssomSmoothScrollEnabled() &&
-        options.behavior() == "smooth") {
-      options.setBehavior("instant");
-    }
-  }
-  scrollIntoViewWithOptions(options);
-}
-
 void Element::scrollIntoView(bool align_to_top) {
-  ScrollIntoViewOptionsOrBoolean arg;
-  arg.setBoolean(align_to_top);
-  scrollIntoView(arg);
-}
-
-static ScrollAlignment ToPhysicalAlignment(const ScrollIntoViewOptions& options,
-                                           ScrollOrientation axis,
-                                           bool is_horizontal_writing_mode) {
-  String alignment =
-      ((axis == kHorizontalScroll && is_horizontal_writing_mode) ||
-       (axis == kVerticalScroll && !is_horizontal_writing_mode))
-          ? options.inlinePosition()
-          : options.block();
-
-  if (alignment == "center")
-    return ScrollAlignment::kAlignCenterAlways;
-  if (alignment == "nearest")
-    return ScrollAlignment::kAlignToEdgeIfNeeded;
-  if (alignment == "start") {
-    return (axis == kHorizontalScroll) ? ScrollAlignment::kAlignLeftAlways
-                                       : ScrollAlignment::kAlignTopAlways;
-  }
-  if (alignment == "end") {
-    return (axis == kHorizontalScroll) ? ScrollAlignment::kAlignRightAlways
-                                       : ScrollAlignment::kAlignBottomAlways;
-  }
-
-  // Default values
-  if (is_horizontal_writing_mode) {
-    return (axis == kHorizontalScroll) ? ScrollAlignment::kAlignToEdgeIfNeeded
-                                       : ScrollAlignment::kAlignTopAlways;
-  }
-  return (axis == kHorizontalScroll) ? ScrollAlignment::kAlignLeftAlways
-                                     : ScrollAlignment::kAlignToEdgeIfNeeded;
-}
-
-void Element::scrollIntoViewWithOptions(const ScrollIntoViewOptions& options) {
   GetDocument().EnsurePaintLocationDataValidForNode(this);
 
-  if (!GetLayoutObject() || !GetDocument().GetPage())
+  if (!GetLayoutObject())
     return;
 
   bool make_visible_in_visual_viewport =
       !GetDocument().GetPage()->GetSettings().GetInertVisualViewport();
 
-  ScrollBehavior behavior = (options.behavior() == "smooth")
-                                ? kScrollBehaviorSmooth
-                                : kScrollBehaviorAuto;
-
-  bool is_horizontal_writing_mode =
-      GetComputedStyle()->IsHorizontalWritingMode();
-  ScrollAlignment align_x = ToPhysicalAlignment(options, kHorizontalScroll,
-                                                is_horizontal_writing_mode);
-  ScrollAlignment align_y =
-      ToPhysicalAlignment(options, kVerticalScroll, is_horizontal_writing_mode);
-
-  GetDocument().GetPage()->GetSmoothScrollSequencer()->AbortAnimations();
   LayoutRect bounds = BoundingBox();
-  GetLayoutObject()->ScrollRectToVisible(
-      bounds, align_x, align_y, kProgrammaticScroll,
-      make_visible_in_visual_viewport, behavior);
-
-  GetDocument().GetPage()->GetSmoothScrollSequencer()->RunQueuedAnimations();
+  // Align to the top / bottom and to the closest edge.
+  if (align_to_top)
+    GetLayoutObject()->ScrollRectToVisible(
+        bounds, ScrollAlignment::kAlignToEdgeIfNeeded,
+        ScrollAlignment::kAlignTopAlways, kProgrammaticScroll,
+        make_visible_in_visual_viewport);
+  else
+    GetLayoutObject()->ScrollRectToVisible(
+        bounds, ScrollAlignment::kAlignToEdgeIfNeeded,
+        ScrollAlignment::kAlignBottomAlways, kProgrammaticScroll,
+        make_visible_in_visual_viewport);
 
   GetDocument().SetSequentialFocusNavigationStartingPoint(this);
 }
@@ -3575,9 +3511,8 @@
 DOMTokenList& Element::classList() {
   ElementRareData& rare_data = EnsureElementRareData();
   if (!rare_data.GetClassList()) {
-    ClassList* class_list = ClassList::Create(this);
-    class_list->DidUpdateAttributeValue(g_null_atom,
-                                        getAttribute(HTMLNames::classAttr));
+    DOMTokenList* class_list = DOMTokenList::Create(*this, classAttr);
+    class_list->DidUpdateAttributeValue(g_null_atom, getAttribute(classAttr));
     rare_data.SetClassList(class_list);
   }
   return *rare_data.GetClassList();
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h
index 5323a536..692a381 100644
--- a/third_party/WebKit/Source/core/dom/Element.h
+++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -65,8 +65,6 @@
 class PseudoStyleRequest;
 class ResizeObservation;
 class ResizeObserver;
-class ScrollIntoViewOptions;
-class ScrollIntoViewOptionsOrBoolean;
 class ScrollState;
 class ScrollStateCallback;
 class ScrollToOptions;
@@ -229,9 +227,7 @@
   // attributes.
   AttributeCollection AttributesWithoutUpdate() const;
 
-  void scrollIntoView(ScrollIntoViewOptionsOrBoolean);
   void scrollIntoView(bool align_to_top = true);
-  void scrollIntoViewWithOptions(const ScrollIntoViewOptions&);
   void scrollIntoViewIfNeeded(bool center_if_needed = true);
 
   int OffsetLeft();
diff --git a/third_party/WebKit/Source/core/dom/Element.idl b/third_party/WebKit/Source/core/dom/Element.idl
index b9ea6a7..47867a1 100644
--- a/third_party/WebKit/Source/core/dom/Element.idl
+++ b/third_party/WebKit/Source/core/dom/Element.idl
@@ -93,8 +93,8 @@
     // return DOMRectList and DOMRect respectively.
     ClientRectList getClientRects();
     ClientRect getBoundingClientRect();
-
-    void scrollIntoView(optional (ScrollIntoViewOptions or boolean)? arg);
+    // FIXME: scrollIntoView() should have a ScrollIntoViewOptions dictionary argument.
+    void scrollIntoView(optional boolean alignWithTop);
     [RuntimeEnabled=CSSOMSmoothScroll, ImplementedAs=scrollTo] void scroll(optional ScrollToOptions options);
     [RuntimeEnabled=CSSOMSmoothScroll, ImplementedAs=scrollTo] void scroll(unrestricted double x, unrestricted double y);
     [RuntimeEnabled=CSSOMSmoothScroll] void scrollTo(optional ScrollToOptions options);
diff --git a/third_party/WebKit/Source/core/dom/ElementRareData.h b/third_party/WebKit/Source/core/dom/ElementRareData.h
index 1da0c8c..5f1919b 100644
--- a/third_party/WebKit/Source/core/dom/ElementRareData.h
+++ b/third_party/WebKit/Source/core/dom/ElementRareData.h
@@ -27,8 +27,8 @@
 #include "core/css/cssom/InlineStylePropertyMap.h"
 #include "core/dom/AccessibleNode.h"
 #include "core/dom/Attr.h"
-#include "core/dom/ClassList.h"
 #include "core/dom/CompositorProxiedPropertySet.h"
+#include "core/dom/DOMTokenList.h"
 #include "core/dom/DatasetDOMStringMap.h"
 #include "core/dom/ElementIntersectionObserverData.h"
 #include "core/dom/NamedNodeMap.h"
@@ -96,8 +96,8 @@
   }
   void ClearComputedStyle() { computed_style_ = nullptr; }
 
-  ClassList* GetClassList() const { return class_list_.Get(); }
-  void SetClassList(ClassList* class_list) {
+  DOMTokenList* GetClassList() const { return class_list_.Get(); }
+  void SetClassList(DOMTokenList* class_list) {
     class_list_ = class_list;
     ScriptWrappableVisitor::WriteBarrier(this, class_list_);
   }
@@ -204,7 +204,7 @@
 
   Member<DatasetDOMStringMap> dataset_;
   Member<ElementShadow> shadow_;
-  Member<ClassList> class_list_;
+  Member<DOMTokenList> class_list_;
   Member<NamedNodeMap> attribute_map_;
   Member<AttrNodeList> attr_node_list_;
   Member<InlineCSSStyleDeclaration> cssom_wrapper_;
diff --git a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
index 5b1c1a49..63417b4 100644
--- a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
+++ b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
@@ -152,29 +152,27 @@
 
 }  // namespace
 
+TextIteratorTextNodeHandler::TextIteratorTextNodeHandler(
+    const TextIteratorBehavior& behavior,
+    TextIteratorTextState* text_state)
+    : behavior_(behavior), text_state_(*text_state) {}
+
 template <typename Strategy>
 TextIteratorAlgorithm<Strategy>::TextIteratorAlgorithm(
     const PositionTemplate<Strategy>& start,
     const PositionTemplate<Strategy>& end,
     const TextIteratorBehavior& behavior)
-    : offset_(0),
-      start_container_(nullptr),
+    : start_container_(nullptr),
       start_offset_(0),
       end_container_(nullptr),
       end_offset_(0),
       needs_another_newline_(false),
-      text_box_(nullptr),
-      remaining_text_box_(nullptr),
-      first_letter_text_(nullptr),
       last_text_node_(nullptr),
-      last_text_node_ended_with_collapsed_space_(false),
-      sorted_text_boxes_position_(0),
       behavior_(AdjustBehaviorFlags<Strategy>(behavior)),
-      needs_handle_pre_formatted_text_node_(false),
-      handled_first_letter_(false),
       should_stop_(false),
       handle_shadow_root_(false),
-      text_state_(behavior_) {
+      text_state_(behavior_),
+      text_node_handler_(behavior_, &text_state_) {
   DCHECK(start.IsNotNull());
   DCHECK(end.IsNotNull());
 
@@ -195,6 +193,22 @@
              end.ComputeContainerNode(), end.ComputeOffsetInContainerNode());
 }
 
+void TextIteratorTextNodeHandler::Initialize(Node* start_container,
+                                             int start_offset,
+                                             Node* end_container,
+                                             int end_offset) {
+  // This function should be called only once.
+  DCHECK(!start_container_);
+  DCHECK_EQ(start_offset_, 0);
+  DCHECK(!end_container_);
+  DCHECK_EQ(end_offset_, 0);
+
+  start_container_ = start_container;
+  start_offset_ = start_offset;
+  end_container_ = end_container;
+  end_offset_ = end_offset;
+}
+
 template <typename Strategy>
 void TextIteratorAlgorithm<Strategy>::Initialize(Node* start_container,
                                                  int start_offset,
@@ -203,6 +217,9 @@
   DCHECK(start_container);
   DCHECK(end_container);
 
+  text_node_handler_.Initialize(start_container, start_offset, end_container,
+                                end_offset);
+
   // Remember the range - this does not change.
   start_container_ = start_container;
   start_offset_ = start_offset;
@@ -264,8 +281,7 @@
   return layout_object && layout_object->IsAtomicInlineLevel();
 }
 
-template <typename Strategy>
-bool TextIteratorAlgorithm<Strategy>::HandleRemainingTextRuns() {
+bool TextIteratorTextNodeHandler::HandleRemainingTextRuns() {
   if (ShouldProceedToRemainingText())
     ProceedToRemainingText();
   // Handle remembered text box
@@ -307,7 +323,7 @@
     return;
   }
 
-  if (HandleRemainingTextRuns())
+  if (text_node_handler_.HandleRemainingTextRuns())
     return;
 
   while (node_ && (node_ != past_end_node_ || shadow_depth_ > 0)) {
@@ -511,8 +527,7 @@
              EVisibility::kVisible;
 }
 
-template <typename Strategy>
-bool TextIteratorAlgorithm<Strategy>::ShouldHandleFirstLetter(
+bool TextIteratorTextNodeHandler::ShouldHandleFirstLetter(
     const LayoutText& layout_text) const {
   if (handled_first_letter_)
     return false;
@@ -522,8 +537,7 @@
   return offset_ < static_cast<int>(text_fragment.TextStartOffset());
 }
 
-template <typename Strategy>
-void TextIteratorAlgorithm<Strategy>::HandlePreFormattedTextNode() {
+void TextIteratorTextNodeHandler::HandlePreFormattedTextNode() {
   // TODO(xiaochengh): Get rid of repeated computation of these fields.
   LayoutText* const layout_object = text_node_->GetLayoutObject();
   const String str = layout_object->GetText();
@@ -592,8 +606,11 @@
   DCHECK_NE(last_text_node_, node_)
       << "We should never call HandleTextNode on the same node twice";
   last_text_node_ = ToText(node_);
+  return text_node_handler_.HandleTextNode(ToText(node_));
+}
 
-  text_node_ = ToText(node_);
+bool TextIteratorTextNodeHandler::HandleTextNode(Text* node) {
+  text_node_ = node;
   offset_ = text_node_ == start_container_ ? start_offset_ : 0;
   handled_first_letter_ = false;
   first_letter_text_ = nullptr;
@@ -646,8 +663,7 @@
 }
 
 // Restore the collapsed space for copy & paste. See http://crbug.com/318925
-template <typename Strategy>
-size_t TextIteratorAlgorithm<Strategy>::RestoreCollapsedTrailingSpace(
+size_t TextIteratorTextNodeHandler::RestoreCollapsedTrailingSpace(
     InlineTextBox* next_text_box,
     size_t subrun_end) {
   if (next_text_box || !text_box_->Root().NextRootBox() ||
@@ -675,8 +691,7 @@
   return subrun_end;
 }
 
-template <typename Strategy>
-void TextIteratorAlgorithm<Strategy>::HandleTextBox() {
+void TextIteratorTextNodeHandler::HandleTextBox() {
   LayoutText* layout_object =
       first_letter_text_ ? first_letter_text_ : text_node_->GetLayoutObject();
   const unsigned text_start_offset = layout_object->TextStartOffset();
@@ -814,8 +829,7 @@
   }
 }
 
-template <typename Strategy>
-bool TextIteratorAlgorithm<Strategy>::ShouldProceedToRemainingText() const {
+bool TextIteratorTextNodeHandler::ShouldProceedToRemainingText() const {
   if (text_box_ || !remaining_text_box_)
     return false;
   if (text_node_ != end_container_)
@@ -823,16 +837,14 @@
   return offset_ < end_offset_;
 }
 
-template <typename Strategy>
-void TextIteratorAlgorithm<Strategy>::ProceedToRemainingText() {
+void TextIteratorTextNodeHandler::ProceedToRemainingText() {
   text_box_ = remaining_text_box_;
   remaining_text_box_ = 0;
   first_letter_text_ = nullptr;
   offset_ = text_node_->GetLayoutObject()->TextStartOffset();
 }
 
-template <typename Strategy>
-void TextIteratorAlgorithm<Strategy>::HandleTextNodeFirstLetter(
+void TextIteratorTextNodeHandler::HandleTextNodeFirstLetter(
     LayoutTextFragment* layout_object) {
   handled_first_letter_ = true;
 
@@ -873,8 +885,7 @@
   return false;
 }
 
-template <typename Strategy>
-bool TextIteratorAlgorithm<Strategy>::FixLeadingWhiteSpaceForReplacedElement(
+bool TextIteratorTextNodeHandler::FixLeadingWhiteSpaceForReplacedElement(
     Node* parent) {
   // This is a hacky way for white space fixup in legacy layout. With LayoutNG,
   // we can get rid of this function.
@@ -912,9 +923,9 @@
     return true;
   }
 
-  DCHECK_EQ(last_text_node_, text_node_);
+  DCHECK_EQ(last_text_node_, text_node_handler_.GetNode());
   if (last_text_node_) {
-    if (FixLeadingWhiteSpaceForReplacedElement(
+    if (text_node_handler_.FixLeadingWhiteSpaceForReplacedElement(
             Strategy::Parent(*last_text_node_)))
       return false;
   }
@@ -1216,8 +1227,7 @@
                  1);
 }
 
-template <typename Strategy>
-void TextIteratorAlgorithm<Strategy>::ResetCollapsedWhiteSpaceFixup() {
+void TextIteratorTextNodeHandler::ResetCollapsedWhiteSpaceFixup() {
   // This is a hacky way for white space fixup in legacy layout. With LayoutNG,
   // we can get rid of this function.
   last_text_node_ended_with_collapsed_space_ = false;
@@ -1231,14 +1241,23 @@
                                                    int text_end_offset) {
   text_state_.SpliceBuffer(c, text_node, offset_base_node, text_start_offset,
                            text_end_offset);
+  text_node_handler_.ResetCollapsedWhiteSpaceFixup();
+}
+
+void TextIteratorTextNodeHandler::SpliceBuffer(UChar c,
+                                               Node* text_node,
+                                               Node* offset_base_node,
+                                               int text_start_offset,
+                                               int text_end_offset) {
+  text_state_.SpliceBuffer(c, text_node, offset_base_node, text_start_offset,
+                           text_end_offset);
   ResetCollapsedWhiteSpaceFixup();
 }
 
-template <typename Strategy>
-void TextIteratorAlgorithm<Strategy>::EmitText(Node* text_node,
-                                               LayoutText* layout_object,
-                                               int text_start_offset,
-                                               int text_end_offset) {
+void TextIteratorTextNodeHandler::EmitText(Node* text_node,
+                                           LayoutText* layout_object,
+                                           int text_start_offset,
+                                           int text_end_offset) {
   text_state_.EmitText(text_node, layout_object, text_start_offset,
                        text_end_offset);
   ResetCollapsedWhiteSpaceFixup();
diff --git a/third_party/WebKit/Source/core/editing/iterators/TextIterator.h b/third_party/WebKit/Source/core/editing/iterators/TextIterator.h
index 473874d..2c3e4ec4 100644
--- a/third_party/WebKit/Source/core/editing/iterators/TextIterator.h
+++ b/third_party/WebKit/Source/core/editing/iterators/TextIterator.h
@@ -49,6 +49,102 @@
 String PlainText(const EphemeralRangeInFlatTree&,
                  const TextIteratorBehavior& = TextIteratorBehavior());
 
+// TODO(xiaochengh): Move the class to dedicated files.
+// TextIteratorTextNodeHandler extracts plain text from a text node by calling
+// HandleTextNode() function. It should be used only by TextIterator.
+class TextIteratorTextNodeHandler final {
+  STACK_ALLOCATED();
+
+ public:
+  TextIteratorTextNodeHandler(const TextIteratorBehavior&,
+                              TextIteratorTextState*);
+
+  // Initializes the full iteration range of the TextIterator. This function
+  // should be called only once from TextIterator::Initialize.
+  // TODO(xiaochengh): TextNodeHandler doesn't need to know the full iteration
+  // range; The offset range in the current node suffices. Remove this function.
+  void Initialize(Node* start_container,
+                  int start_offset,
+                  Node* end_container,
+                  int end_offset);
+
+  Text* GetNode() const { return text_node_; }
+
+  // Returns true if more text is emitted without traversing to the next node.
+  bool HandleRemainingTextRuns();
+
+  // Returns true if a leading white space is emitted before a replaced element.
+  bool FixLeadingWhiteSpaceForReplacedElement(Node*);
+
+  void ResetCollapsedWhiteSpaceFixup();
+
+  // TODO(xiaochengh): Make the return type |void|. The current return value is
+  // not very meaningful.
+  bool HandleTextNode(Text*);
+
+ private:
+  void HandlePreFormattedTextNode();
+  void HandleTextBox();
+  void HandleTextNodeFirstLetter(LayoutTextFragment*);
+  bool ShouldHandleFirstLetter(const LayoutText&) const;
+  bool ShouldProceedToRemainingText() const;
+  void ProceedToRemainingText();
+  size_t RestoreCollapsedTrailingSpace(InlineTextBox* next_text_box,
+                                       size_t subrun_end);
+
+  // Used when the visibility of the style should not affect text gathering.
+  bool IgnoresStyleVisibility() const {
+    return behavior_.IgnoresStyleVisibility();
+  }
+
+  void SpliceBuffer(UChar,
+                    Node* text_node,
+                    Node* offset_base_node,
+                    int text_start_offset,
+                    int text_end_offset);
+  void EmitText(Node* text_node,
+                LayoutText* layout_object,
+                int text_start_offset,
+                int text_end_offset);
+
+  // The range.
+  Member<Node> start_container_;
+  int start_offset_ = 0;
+  Member<Node> end_container_;
+  int end_offset_ = 0;
+
+  // The current text node and offset, from which text is being emitted.
+  Member<Text> text_node_;
+  int offset_ = 0;
+
+  InlineTextBox* text_box_ = nullptr;
+
+  // Remember if we are in the middle of handling a pre-formatted text node.
+  bool needs_handle_pre_formatted_text_node_ = false;
+  // Used when deciding text fragment created by :first-letter should be looked
+  // into.
+  bool handled_first_letter_ = false;
+  // Used when iteration over :first-letter text to save pointer to
+  // remaining text box.
+  InlineTextBox* remaining_text_box_ = nullptr;
+  // Used to point to LayoutText object for :first-letter.
+  LayoutText* first_letter_text_ = nullptr;
+
+  // Used to do the whitespace collapsing logic.
+  bool last_text_node_ended_with_collapsed_space_ = false;
+
+  // Used when text boxes are out of order (Hebrew/Arabic w/ embeded LTR text)
+  Vector<InlineTextBox*> sorted_text_boxes_;
+  size_t sorted_text_boxes_position_ = 0;
+
+  const TextIteratorBehavior behavior_;
+
+  // Contains state of emitted text.
+  TextIteratorTextState& text_state_;
+
+  DISALLOW_COPY_AND_ASSIGN(TextIteratorTextNodeHandler);
+};
+
 // Iterates through the DOM range, returning all the text, and 0-length
 // boundaries at points where replaced elements break up the text flow.  The
 // text comes back in chunks so as to optimize for performance of the iteration.
@@ -141,34 +237,13 @@
   // not always clearly control the iteration progress. Should consider removing
   // the return values and control the iteration in a cleaner way.
   bool HandleTextNode();
-  void HandlePreFormattedTextNode();
   bool HandleReplacedElement();
   bool HandleNonTextNode();
-
-  void HandleTextBox();
-  void HandleTextNodeFirstLetter(LayoutTextFragment*);
-  bool ShouldHandleFirstLetter(const LayoutText&) const;
-  bool ShouldProceedToRemainingText() const;
-  void ProceedToRemainingText();
-  void ResetCollapsedWhiteSpaceFixup();
-
-  // Returns true if more text is emitted without traversing to the next node.
-  bool HandleRemainingTextRuns();
-
-  // Returns true if a leading white space is emitted before a replaced element.
-  bool FixLeadingWhiteSpaceForReplacedElement(Node* parent);
-
   void SpliceBuffer(UChar,
                     Node* text_node,
                     Node* offset_base_node,
                     int text_start_offset,
                     int text_end_offset);
-  void EmitText(Node* text_node,
-                LayoutText* layout_object,
-                int text_start_offset,
-                int text_end_offset);
-  size_t RestoreCollapsedTrailingSpace(InlineTextBox* next_text_box,
-                                       size_t subrun_end);
 
   // Used by selection preservation code. There should be one character emitted
   // between every VisiblePosition in the Range used to create the TextIterator.
@@ -223,7 +298,6 @@
   // Current position, not necessarily of the text being returned, but position
   // as we walk through the DOM tree.
   Member<Node> node_;
-  int offset_;
   IterationProgress iteration_progress_;
   FullyClippedStateStackAlgorithm<Strategy> fully_clipped_stack_;
   int shadow_depth_;
@@ -238,34 +312,14 @@
   Member<Node> end_node_;
   Member<Node> past_end_node_;
 
-  // The current text node, from which text is being emitted.
-  Member<Text> text_node_;
-
   // Used when there is still some pending text from the current node; when
   // these are false and 0, we go back to normal iterating.
   bool needs_another_newline_;
-  InlineTextBox* text_box_;
-  // Used when iteration over :first-letter text to save pointer to
-  // remaining text box.
-  InlineTextBox* remaining_text_box_;
-  // Used to point to LayoutText object for :first-letter.
-  LayoutText* first_letter_text_;
 
-  // Used to do the whitespace collapsing logic.
   Member<Text> last_text_node_;
-  bool last_text_node_ended_with_collapsed_space_;
-
-  // Used when text boxes are out of order (Hebrew/Arabic w/ embeded LTR text)
-  Vector<InlineTextBox*> sorted_text_boxes_;
-  size_t sorted_text_boxes_position_;
 
   const TextIteratorBehavior behavior_;
 
-  // Remember if we are in the middle of handling a pre-formatted text node.
-  bool needs_handle_pre_formatted_text_node_;
-  // Used when deciding text fragment created by :first-letter should be looked
-  // into.
-  bool handled_first_letter_;
   // Used when stopsOnFormControls() is true to determine if the iterator should
   // keep advancing.
   bool should_stop_;
@@ -275,6 +329,11 @@
 
   // Contains state of emitted text.
   TextIteratorTextState text_state_;
+
+  // Helper for extracting text content from text nodes.
+  // TODO(xiaochengh): We should store a pointer here, so that we can use
+  // forward declaration and switch it to Layout NG easier.
+  TextIteratorTextNodeHandler text_node_handler_;
 };
 
 extern template class CORE_EXTERN_TEMPLATE_EXPORT
diff --git a/third_party/WebKit/Source/core/exported/BUILD.gn b/third_party/WebKit/Source/core/exported/BUILD.gn
index 088f61d..fdc5c0ee 100644
--- a/third_party/WebKit/Source/core/exported/BUILD.gn
+++ b/third_party/WebKit/Source/core/exported/BUILD.gn
@@ -30,17 +30,22 @@
     "WebInputMethodControllerImpl.cpp",
     "WebInputMethodControllerImpl.h",
     "WebMemoryStatistics.cpp",
+    "WebPageImportanceSignals.cpp",
     "WebPerformance.cpp",
     "WebPluginContainerBase.cpp",
     "WebPluginContainerBase.h",
+    "WebPluginScriptForbiddenScope.cpp",
     "WebRange.cpp",
     "WebRenderTheme.cpp",
+    "WebScopedUserGesture.cpp",
     "WebScriptController.cpp",
     "WebScriptSource.cpp",
     "WebSecurityPolicy.cpp",
     "WebSelection.cpp",
     "WebSelector.cpp",
     "WebSerializedScriptValue.cpp",
+    "WebUserGestureIndicator.cpp",
+    "WebUserGestureToken.cpp",
     "WebViewBase.h",
   ]
 
diff --git a/third_party/WebKit/Source/web/WebPageImportanceSignals.cpp b/third_party/WebKit/Source/core/exported/WebPageImportanceSignals.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/WebPageImportanceSignals.cpp
rename to third_party/WebKit/Source/core/exported/WebPageImportanceSignals.cpp
diff --git a/third_party/WebKit/Source/web/WebPluginScriptForbiddenScope.cpp b/third_party/WebKit/Source/core/exported/WebPluginScriptForbiddenScope.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/WebPluginScriptForbiddenScope.cpp
rename to third_party/WebKit/Source/core/exported/WebPluginScriptForbiddenScope.cpp
diff --git a/third_party/WebKit/Source/web/WebScopedUserGesture.cpp b/third_party/WebKit/Source/core/exported/WebScopedUserGesture.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/WebScopedUserGesture.cpp
rename to third_party/WebKit/Source/core/exported/WebScopedUserGesture.cpp
diff --git a/third_party/WebKit/Source/web/WebUserGestureIndicator.cpp b/third_party/WebKit/Source/core/exported/WebUserGestureIndicator.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/WebUserGestureIndicator.cpp
rename to third_party/WebKit/Source/core/exported/WebUserGestureIndicator.cpp
diff --git a/third_party/WebKit/Source/web/WebUserGestureToken.cpp b/third_party/WebKit/Source/core/exported/WebUserGestureToken.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/WebUserGestureToken.cpp
rename to third_party/WebKit/Source/core/exported/WebUserGestureToken.cpp
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index c0f23e6..2e8f1551 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -1180,21 +1180,6 @@
   return GetFrame()->DevicePixelRatio();
 }
 
-void LocalDOMWindow::scrollViewportTo(ScrollableArea* viewport,
-                                      const ScrollOffset& offset,
-                                      ScrollBehavior scroll_behavior) const {
-  if (SmoothScrollSequencer* sequencer =
-          GetFrame()->GetPage()->GetSmoothScrollSequencer()) {
-    sequencer->AbortAnimations();
-    if (scroll_behavior == kScrollBehaviorSmooth) {
-      sequencer->QueueAnimation(viewport, offset);
-      sequencer->RunQueuedAnimations();
-    } else {
-      viewport->SetScrollOffset(offset, kProgrammaticScroll, scroll_behavior);
-    }
-  }
-}
-
 void LocalDOMWindow::scrollBy(double x,
                               double y,
                               ScrollBehavior scroll_behavior) const {
@@ -1222,7 +1207,8 @@
   ScrollOffset scaled_delta(x * GetFrame()->PageZoomFactor(),
                             y * GetFrame()->PageZoomFactor());
 
-  scrollViewportTo(viewport, current_offset + scaled_delta, scroll_behavior);
+  viewport->SetScrollOffset(current_offset + scaled_delta, kProgrammaticScroll,
+                            scroll_behavior);
 }
 
 void LocalDOMWindow::scrollBy(const ScrollToOptions& scroll_to_options) const {
@@ -1263,7 +1249,8 @@
   ScrollableArea* viewport = page->GetSettings().GetInertVisualViewport()
                                  ? view->LayoutViewportScrollableArea()
                                  : view->GetScrollableArea();
-  scrollViewportTo(viewport, layout_offset, kScrollBehaviorAuto);
+  viewport->SetScrollOffset(layout_offset, kProgrammaticScroll,
+                            kScrollBehaviorAuto);
 }
 
 void LocalDOMWindow::scrollTo(const ScrollToOptions& scroll_to_options) const {
@@ -1310,7 +1297,8 @@
   ScrollableArea::ScrollBehaviorFromString(scroll_to_options.behavior(),
                                            scroll_behavior);
 
-  scrollViewportTo(viewport, ScrollOffset(scaled_x, scaled_y), scroll_behavior);
+  viewport->SetScrollOffset(ScrollOffset(scaled_x, scaled_y),
+                            kProgrammaticScroll, scroll_behavior);
 }
 
 void LocalDOMWindow::moveBy(int x, int y) const {
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
index 987f1cad..2ad0b6a 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
@@ -195,9 +195,6 @@
 
   // FIXME: ScrollBehaviorSmooth is currently unsupported in VisualViewport.
   // crbug.com/434497
-  void scrollViewportTo(ScrollableArea*,
-                        const ScrollOffset&,
-                        ScrollBehavior) const;
   void scrollBy(double x, double y, ScrollBehavior = kScrollBehaviorAuto) const;
   void scrollBy(const ScrollToOptions&) const;
   void scrollTo(double x, double y) const;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
index 0e838fd5..eb769944 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
@@ -2127,13 +2127,6 @@
   return &page->GetChromeClient();
 }
 
-SmoothScrollSequencer* LocalFrameView::GetSmoothScrollSequencer() const {
-  Page* page = GetFrame().GetPage();
-  if (!page)
-    return nullptr;
-  return page->GetSmoothScrollSequencer();
-}
-
 void LocalFrameView::ContentsResized() {
   if (frame_->IsMainFrame() && frame_->GetDocument()) {
     if (TextAutosizer* text_autosizer =
@@ -4617,20 +4610,14 @@
 LayoutRect LocalFrameView::ScrollIntoView(const LayoutRect& rect_in_content,
                                           const ScrollAlignment& align_x,
                                           const ScrollAlignment& align_y,
-                                          bool is_smooth,
                                           ScrollType scroll_type) {
   LayoutRect view_rect(VisibleContentRect());
   LayoutRect expose_rect = ScrollAlignment::GetRectToExpose(
       view_rect, rect_in_content, align_x, align_y);
   if (expose_rect != view_rect) {
-    ScrollOffset target_offset(expose_rect.X().ToFloat(),
-                               expose_rect.Y().ToFloat());
-    if (is_smooth) {
-      DCHECK(scroll_type == kProgrammaticScroll);
-      GetSmoothScrollSequencer()->QueueAnimation(this, target_offset);
-    } else {
-      SetScrollOffset(target_offset, scroll_type);
-    }
+    SetScrollOffset(
+        ScrollOffset(expose_rect.X().ToFloat(), expose_rect.Y().ToFloat()),
+        scroll_type);
   }
 
   // Scrolling the LocalFrameView cannot change the input rect's location
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.h b/third_party/WebKit/Source/core/frame/LocalFrameView.h
index d4dfe865..7c6e9386 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.h
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.h
@@ -51,7 +51,6 @@
 #include "platform/graphics/GraphicsLayerClient.h"
 #include "platform/scroll/ScrollTypes.h"
 #include "platform/scroll/Scrollbar.h"
-#include "platform/scroll/SmoothScrollSequencer.h"
 #include "platform/wtf/Allocator.h"
 #include "platform/wtf/AutoReset.h"
 #include "platform/wtf/Forward.h"
@@ -471,7 +470,6 @@
   LayoutRect ScrollIntoView(const LayoutRect& rect_in_content,
                             const ScrollAlignment& align_x,
                             const ScrollAlignment& align_y,
-                            bool is_smooth,
                             ScrollType = kProgrammaticScroll) override;
 
   // The window that hosts the LocalFrameView. The LocalFrameView will
@@ -479,8 +477,6 @@
   // coordinate space.
   PlatformChromeClient* GetChromeClient() const;
 
-  SmoothScrollSequencer* GetSmoothScrollSequencer() const override;
-
   // Functions for child manipulation and inspection.
   bool IsSelfVisible() const {
     return self_visible_;
diff --git a/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp b/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp
index d89b8b0..cc76a0e 100644
--- a/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp
+++ b/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp
@@ -209,7 +209,6 @@
 LayoutRect RootFrameViewport::ScrollIntoView(const LayoutRect& rect_in_content,
                                              const ScrollAlignment& align_x,
                                              const ScrollAlignment& align_y,
-                                             bool is_smooth,
                                              ScrollType scroll_type) {
   // We want to move the rect into the viewport that excludes the scrollbars so
   // we intersect the visual viewport with the scrollbar-excluded frameView
@@ -230,13 +229,8 @@
   LayoutRect target_viewport = ScrollAlignment::GetRectToExpose(
       view_rect_in_content, rect_in_content, align_x, align_y);
   if (target_viewport != view_rect_in_content) {
-    ScrollOffset target_offset(target_viewport.X(), target_viewport.Y());
-    if (is_smooth) {
-      DCHECK(scroll_type == kProgrammaticScroll);
-      GetSmoothScrollSequencer()->QueueAnimation(this, target_offset);
-    } else {
-      SetScrollOffset(target_offset, scroll_type);
-    }
+    SetScrollOffset(ScrollOffset(target_viewport.X(), target_viewport.Y()),
+                    scroll_type);
   }
 
   // RootFrameViewport only changes the viewport relative to the document so we
@@ -437,10 +431,6 @@
   return LayoutViewport().GetChromeClient();
 }
 
-SmoothScrollSequencer* RootFrameViewport::GetSmoothScrollSequencer() const {
-  return LayoutViewport().GetSmoothScrollSequencer();
-}
-
 void RootFrameViewport::ServiceScrollAnimations(double monotonic_time) {
   ScrollableArea::ServiceScrollAnimations(monotonic_time);
   LayoutViewport().ServiceScrollAnimations(monotonic_time);
diff --git a/third_party/WebKit/Source/core/frame/RootFrameViewport.h b/third_party/WebKit/Source/core/frame/RootFrameViewport.h
index 473b4d2..2c276dad 100644
--- a/third_party/WebKit/Source/core/frame/RootFrameViewport.h
+++ b/third_party/WebKit/Source/core/frame/RootFrameViewport.h
@@ -61,7 +61,6 @@
   LayoutRect ScrollIntoView(const LayoutRect& rect_in_content,
                             const ScrollAlignment& align_x,
                             const ScrollAlignment& align_y,
-                            bool is_smooth,
                             ScrollType = kProgrammaticScroll) override;
   IntRect VisibleContentRect(
       IncludeScrollbarsInRect = kExcludeScrollbars) const override;
@@ -96,7 +95,6 @@
   ScrollResult UserScroll(ScrollGranularity, const FloatSize&) override;
   bool ScrollAnimatorEnabled() const override;
   PlatformChromeClient* GetChromeClient() const override;
-  SmoothScrollSequencer* GetSmoothScrollSequencer() const override;
   void ServiceScrollAnimations(double) override;
   void UpdateCompositorScrollAnimations() override;
   void CancelProgrammaticScrollAnimation() override;
diff --git a/third_party/WebKit/Source/core/frame/RootFrameViewportTest.cpp b/third_party/WebKit/Source/core/frame/RootFrameViewportTest.cpp
index b22aace..54d335f 100644
--- a/third_party/WebKit/Source/core/frame/RootFrameViewportTest.cpp
+++ b/third_party/WebKit/Source/core/frame/RootFrameViewportTest.cpp
@@ -307,15 +307,15 @@
   // resized (as is the case when the ChromeOS keyboard comes up) but not
   // scaled.
   visual_viewport->SetViewportSize(IntSize(100, 100));
-  root_frame_viewport->ScrollIntoView(
-      LayoutRect(100, 250, 50, 50), ScrollAlignment::kAlignToEdgeIfNeeded,
-      ScrollAlignment::kAlignToEdgeIfNeeded, false);
+  root_frame_viewport->ScrollIntoView(LayoutRect(100, 250, 50, 50),
+                                      ScrollAlignment::kAlignToEdgeIfNeeded,
+                                      ScrollAlignment::kAlignToEdgeIfNeeded);
   EXPECT_SIZE_EQ(ScrollOffset(50, 150), layout_viewport->GetScrollOffset());
   EXPECT_SIZE_EQ(ScrollOffset(0, 50), visual_viewport->GetScrollOffset());
 
-  root_frame_viewport->ScrollIntoView(
-      LayoutRect(25, 75, 50, 50), ScrollAlignment::kAlignToEdgeIfNeeded,
-      ScrollAlignment::kAlignToEdgeIfNeeded, false);
+  root_frame_viewport->ScrollIntoView(LayoutRect(25, 75, 50, 50),
+                                      ScrollAlignment::kAlignToEdgeIfNeeded,
+                                      ScrollAlignment::kAlignToEdgeIfNeeded);
   EXPECT_SIZE_EQ(ScrollOffset(25, 75), layout_viewport->GetScrollOffset());
   EXPECT_SIZE_EQ(ScrollOffset(0, 0), visual_viewport->GetScrollOffset());
 
@@ -324,15 +324,15 @@
   visual_viewport->SetScale(2);
   root_frame_viewport->SetScrollOffset(ScrollOffset(), kProgrammaticScroll);
 
-  root_frame_viewport->ScrollIntoView(
-      LayoutRect(50, 75, 50, 75), ScrollAlignment::kAlignToEdgeIfNeeded,
-      ScrollAlignment::kAlignToEdgeIfNeeded, false);
+  root_frame_viewport->ScrollIntoView(LayoutRect(50, 75, 50, 75),
+                                      ScrollAlignment::kAlignToEdgeIfNeeded,
+                                      ScrollAlignment::kAlignToEdgeIfNeeded);
   EXPECT_SIZE_EQ(ScrollOffset(0, 0), layout_viewport->GetScrollOffset());
   EXPECT_SIZE_EQ(ScrollOffset(50, 75), visual_viewport->GetScrollOffset());
 
-  root_frame_viewport->ScrollIntoView(
-      LayoutRect(190, 290, 10, 10), ScrollAlignment::kAlignToEdgeIfNeeded,
-      ScrollAlignment::kAlignToEdgeIfNeeded, false);
+  root_frame_viewport->ScrollIntoView(LayoutRect(190, 290, 10, 10),
+                                      ScrollAlignment::kAlignToEdgeIfNeeded,
+                                      ScrollAlignment::kAlignToEdgeIfNeeded);
   EXPECT_SIZE_EQ(ScrollOffset(100, 150), layout_viewport->GetScrollOffset());
   EXPECT_SIZE_EQ(ScrollOffset(50, 75), visual_viewport->GetScrollOffset());
 
@@ -347,21 +347,19 @@
   root_frame_viewport->ScrollIntoView(
       LayoutRect(root_frame_viewport->VisibleContentRect(kExcludeScrollbars)),
       ScrollAlignment::kAlignToEdgeIfNeeded,
-      ScrollAlignment::kAlignToEdgeIfNeeded, false);
+      ScrollAlignment::kAlignToEdgeIfNeeded);
   EXPECT_SIZE_EQ(ScrollOffset(50, 50), layout_viewport->GetScrollOffset());
   EXPECT_SIZE_EQ(ScrollOffset(0, 10), visual_viewport->GetScrollOffset());
 
   root_frame_viewport->ScrollIntoView(
       LayoutRect(root_frame_viewport->VisibleContentRect(kExcludeScrollbars)),
-      ScrollAlignment::kAlignCenterAlways, ScrollAlignment::kAlignCenterAlways,
-      false);
+      ScrollAlignment::kAlignCenterAlways, ScrollAlignment::kAlignCenterAlways);
   EXPECT_SIZE_EQ(ScrollOffset(50, 50), layout_viewport->GetScrollOffset());
   EXPECT_SIZE_EQ(ScrollOffset(0, 10), visual_viewport->GetScrollOffset());
 
   root_frame_viewport->ScrollIntoView(
       LayoutRect(root_frame_viewport->VisibleContentRect(kExcludeScrollbars)),
-      ScrollAlignment::kAlignTopAlways, ScrollAlignment::kAlignTopAlways,
-      false);
+      ScrollAlignment::kAlignTopAlways, ScrollAlignment::kAlignTopAlways);
   EXPECT_SIZE_EQ(ScrollOffset(50, 50), layout_viewport->GetScrollOffset());
   EXPECT_SIZE_EQ(ScrollOffset(0, 10), visual_viewport->GetScrollOffset());
 }
diff --git a/third_party/WebKit/Source/core/frame/ScrollIntoViewOptions.idl b/third_party/WebKit/Source/core/frame/ScrollIntoViewOptions.idl
deleted file mode 100644
index 49a2c831..0000000
--- a/third_party/WebKit/Source/core/frame/ScrollIntoViewOptions.idl
+++ /dev/null
@@ -1,6 +0,0 @@
-enum ScrollLogicalPosition { "start", "center", "end", "nearest" };
-
-dictionary ScrollIntoViewOptions : ScrollOptions {
-    ScrollLogicalPosition block = "center";
-    ScrollLogicalPosition inlinePosition = "center";
-};
\ No newline at end of file
diff --git a/third_party/WebKit/Source/core/html/BUILD.gn b/third_party/WebKit/Source/core/html/BUILD.gn
index f36dc1f..d5556ac 100644
--- a/third_party/WebKit/Source/core/html/BUILD.gn
+++ b/third_party/WebKit/Source/core/html/BUILD.gn
@@ -297,6 +297,8 @@
     "forms/DateTimeChooser.h",
     "forms/DateTimeChooserClient.cpp",
     "forms/DateTimeChooserClient.h",
+    "forms/DateTimeChooserImpl.cpp",
+    "forms/DateTimeChooserImpl.h",
     "forms/DateTimeEditElement.cpp",
     "forms/DateTimeEditElement.h",
     "forms/DateTimeFieldElement.cpp",
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
index 89a1579..a76ad509 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
@@ -227,14 +227,6 @@
   return true;
 }
 
-void HTMLIFrameElement::SandboxValueWasSet(const AtomicString& value) {
-  setAttribute(sandboxAttr, value);
-}
-
-void HTMLIFrameElement::AllowValueWasSet(const AtomicString& value) {
-  setAttribute(allowAttr, value);
-}
-
 ReferrerPolicy HTMLIFrameElement::ReferrerPolicyAttribute() {
   return referrer_policy_;
 }
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
index c92f127..353ed16 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
@@ -47,9 +47,6 @@
   DOMTokenList* sandbox() const;
   DOMTokenList* allow() const;
 
-  void SandboxValueWasSet(const AtomicString&);
-  void AllowValueWasSet(const AtomicString&);
-
  private:
   explicit HTMLIFrameElement(Document&);
 
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.cpp b/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.cpp
index c5e2d30..0e43dc3 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.cpp
@@ -13,15 +13,7 @@
 namespace blink {
 
 HTMLIFrameElementAllow::HTMLIFrameElementAllow(HTMLIFrameElement* element)
-    : DOMTokenList(this), element_(element) {}
-
-HTMLIFrameElementAllow::~HTMLIFrameElementAllow() {}
-
-DEFINE_TRACE(HTMLIFrameElementAllow) {
-  visitor->Trace(element_);
-  DOMTokenList::Trace(visitor);
-  DOMTokenListObserver::Trace(visitor);
-}
+    : DOMTokenList(*element, HTMLNames::allowAttr) {}
 
 Vector<WebFeaturePolicyFeature>
 HTMLIFrameElementAllow::ParseAllowedFeatureNames(
@@ -63,9 +55,4 @@
   return GetDefaultFeatureNameMap().Contains(token_value.GetString());
 }
 
-void HTMLIFrameElementAllow::ValueWasSet(const AtomicString& value) {
-  DCHECK(element_);
-  element_->AllowValueWasSet(value);
-}
-
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.h b/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.h
index 2d8620e..46c2e62a 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.h
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElementAllow.h
@@ -14,31 +14,19 @@
 
 class HTMLIFrameElement;
 
-class CORE_EXPORT HTMLIFrameElementAllow final : public DOMTokenList,
-                                                 public DOMTokenListObserver {
-  USING_GARBAGE_COLLECTED_MIXIN(HTMLIFrameElementAllow);
-
+class CORE_EXPORT HTMLIFrameElementAllow final : public DOMTokenList {
  public:
   static HTMLIFrameElementAllow* Create(HTMLIFrameElement* element) {
     return new HTMLIFrameElementAllow(element);
   }
 
-  ~HTMLIFrameElementAllow() override;
-
   // Returns unique set of valid feature names.
   Vector<WebFeaturePolicyFeature> ParseAllowedFeatureNames(
       String& invalid_tokens_error_message) const;
 
-  DECLARE_VIRTUAL_TRACE();
-
  private:
   explicit HTMLIFrameElementAllow(HTMLIFrameElement*);
   bool ValidateTokenValue(const AtomicString&, ExceptionState&) const override;
-
-  // DOMTokenListObserver.
-  void ValueWasSet(const AtomicString&) override;
-
-  Member<HTMLIFrameElement> element_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.cpp b/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.cpp
index e448528..3885b445 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.cpp
@@ -30,15 +30,7 @@
 }  // namespace
 
 HTMLIFrameElementSandbox::HTMLIFrameElementSandbox(HTMLIFrameElement* element)
-    : DOMTokenList(this), element_(element) {}
-
-HTMLIFrameElementSandbox::~HTMLIFrameElementSandbox() {}
-
-DEFINE_TRACE(HTMLIFrameElementSandbox) {
-  visitor->Trace(element_);
-  DOMTokenList::Trace(visitor);
-  DOMTokenListObserver::Trace(visitor);
-}
+    : DOMTokenList(*element, HTMLNames::sandboxAttr) {}
 
 bool HTMLIFrameElementSandbox::ValidateTokenValue(
     const AtomicString& token_value,
@@ -46,8 +38,4 @@
   return IsTokenSupported(token_value);
 }
 
-void HTMLIFrameElementSandbox::ValueWasSet(const AtomicString& value) {
-  element_->SandboxValueWasSet(value);
-}
-
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.h b/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.h
index be934bf0c..9686cfc4 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.h
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElementSandbox.h
@@ -12,27 +12,15 @@
 
 class HTMLIFrameElement;
 
-class HTMLIFrameElementSandbox final : public DOMTokenList,
-                                       public DOMTokenListObserver {
-  USING_GARBAGE_COLLECTED_MIXIN(HTMLIFrameElementSandbox);
-
+class HTMLIFrameElementSandbox final : public DOMTokenList {
  public:
   static HTMLIFrameElementSandbox* Create(HTMLIFrameElement* element) {
     return new HTMLIFrameElementSandbox(element);
   }
 
-  ~HTMLIFrameElementSandbox() override;
-
-  DECLARE_VIRTUAL_TRACE();
-
  private:
   explicit HTMLIFrameElementSandbox(HTMLIFrameElement*);
   bool ValidateTokenValue(const AtomicString&, ExceptionState&) const override;
-
-  // DOMTokenListObserver.
-  void ValueWasSet(const AtomicString&) override;
-
-  Member<HTMLIFrameElement> element_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
index e9782c7..7c3d856 100644
--- a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
@@ -51,7 +51,7 @@
                                         bool created_by_parser)
     : HTMLElement(linkTag, document),
       link_loader_(LinkLoader::Create(this)),
-      sizes_(DOMTokenList::Create(this)),
+      sizes_(DOMTokenList::Create(*this, HTMLNames::sizesAttr)),
       rel_list_(this, RelList::Create(this)),
       created_by_parser_(created_by_parser) {}
 
@@ -269,10 +269,6 @@
   return TaskRunnerHelper::Get(TaskType::kNetworking, &GetDocument());
 }
 
-void HTMLLinkElement::ValueWasSet(const AtomicString& value) {
-  setAttribute(HTMLNames::sizesAttr, value);
-}
-
 bool HTMLLinkElement::SheetLoaded() {
   DCHECK(GetLinkStyle());
   return GetLinkStyle()->SheetLoaded();
@@ -368,7 +364,6 @@
   visitor->Trace(rel_list_);
   HTMLElement::Trace(visitor);
   LinkLoaderClient::Trace(visitor);
-  DOMTokenListObserver::Trace(visitor);
 }
 
 DEFINE_TRACE_WRAPPERS(HTMLLinkElement) {
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.h b/third_party/WebKit/Source/core/html/HTMLLinkElement.h
index bfa52ca..809be07 100644
--- a/third_party/WebKit/Source/core/html/HTMLLinkElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.h
@@ -44,8 +44,7 @@
 class LinkImport;
 
 class CORE_EXPORT HTMLLinkElement final : public HTMLElement,
-                                          public LinkLoaderClient,
-                                          private DOMTokenListObserver {
+                                          public LinkLoaderClient {
   DEFINE_WRAPPERTYPEINFO();
   USING_GARBAGE_COLLECTED_MIXIN(HTMLLinkElement);
 
@@ -150,9 +149,6 @@
   void DidSendDOMContentLoadedForLinkPrerender() override;
   RefPtr<WebTaskRunner> GetLoadingTaskRunner() override;
 
-  // From DOMTokenListObserver
-  void ValueWasSet(const AtomicString&) final;
-
   Member<LinkResource> link_;
   Member<LinkLoader> link_loader_;
 
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
index 778ed1e..b0d3bcc 100644
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -2441,10 +2441,6 @@
   return controls_list_.Get();
 }
 
-void HTMLMediaElement::ControlsListValueWasSet(const AtomicString& value) {
-  setAttribute(controlslistAttr, value);
-}
-
 double HTMLMediaElement::volume() const {
   return volume_;
 }
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.h b/third_party/WebKit/Source/core/html/HTMLMediaElement.h
index 06953a5e..ef1bfae 100644
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.h
@@ -210,7 +210,6 @@
       const RecordMetricsBehavior = RecordMetricsBehavior::kDoNotRecord) const;
   DOMTokenList* controlsList() const;
   HTMLMediaElementControlsList* ControlsListInternal() const;
-  void ControlsListValueWasSet(const AtomicString&);
   double volume() const;
   void setVolume(double, ExceptionState& = ASSERT_NO_EXCEPTION);
   bool muted() const;
diff --git a/third_party/WebKit/Source/core/html/HTMLOutputElement.cpp b/third_party/WebKit/Source/core/html/HTMLOutputElement.cpp
index ebf92488..541cac26 100644
--- a/third_party/WebKit/Source/core/html/HTMLOutputElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLOutputElement.cpp
@@ -39,7 +39,7 @@
     : HTMLFormControlElement(HTMLNames::outputTag, document),
       is_default_value_mode_(true),
       default_value_(""),
-      tokens_(DOMTokenList::Create(this)) {}
+      tokens_(DOMTokenList::Create(*this, HTMLNames::forAttr)) {}
 
 HTMLOutputElement::~HTMLOutputElement() {}
 
@@ -105,10 +105,6 @@
   setTextContent(value);
 }
 
-void HTMLOutputElement::ValueWasSet(const AtomicString& value) {
-  setAttribute(HTMLNames::forAttr, value);
-}
-
 String HTMLOutputElement::defaultValue() const {
   return default_value_;
 }
@@ -130,7 +126,6 @@
 DEFINE_TRACE(HTMLOutputElement) {
   visitor->Trace(tokens_);
   HTMLFormControlElement::Trace(visitor);
-  DOMTokenListObserver::Trace(visitor);
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLOutputElement.h b/third_party/WebKit/Source/core/html/HTMLOutputElement.h
index 4405d9fe..e1d018f 100644
--- a/third_party/WebKit/Source/core/html/HTMLOutputElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLOutputElement.h
@@ -36,10 +36,8 @@
 
 namespace blink {
 
-class CORE_EXPORT HTMLOutputElement final : public HTMLFormControlElement,
-                                            private DOMTokenListObserver {
+class CORE_EXPORT HTMLOutputElement final : public HTMLFormControlElement {
   DEFINE_WRAPPERTYPEINFO();
-  USING_GARBAGE_COLLECTED_MIXIN(HTMLOutputElement);
 
  public:
   static HTMLOutputElement* Create(Document&);
@@ -71,9 +69,6 @@
   void ResetImpl() override;
   int tabIndex() const override;
 
-  // DOMTokenListObserver function
-  void ValueWasSet(const AtomicString&) final;
-
   bool is_default_value_mode_;
   String default_value_;
   Member<DOMTokenList> tokens_;
diff --git a/third_party/WebKit/Source/core/html/RelList.cpp b/third_party/WebKit/Source/core/html/RelList.cpp
index ac391bc..fa494ed 100644
--- a/third_party/WebKit/Source/core/html/RelList.cpp
+++ b/third_party/WebKit/Source/core/html/RelList.cpp
@@ -4,16 +4,17 @@
 
 #include "core/html/RelList.h"
 
+#include "core/HTMLNames.h"
 #include "core/dom/Document.h"
+#include "core/dom/Element.h"
 #include "core/origin_trials/OriginTrials.h"
 #include "platform/RuntimeEnabledFeatures.h"
 #include "platform/wtf/HashMap.h"
 
 namespace blink {
 
-using namespace HTMLNames;
-
-RelList::RelList(Element* element) : DOMTokenList(nullptr), element_(element) {}
+RelList::RelList(Element* element)
+    : DOMTokenList(*element, HTMLNames::relAttr) {}
 
 static HashSet<AtomicString>& SupportedTokens() {
   DEFINE_STATIC_LOCAL(HashSet<AtomicString>, tokens, ());
@@ -44,13 +45,8 @@
   if (SupportedTokens().Contains(token_value))
     return true;
   return OriginTrials::linkServiceWorkerEnabled(
-             element_->GetExecutionContext()) &&
+             GetElement().GetExecutionContext()) &&
          token_value == "serviceworker";
 }
 
-DEFINE_TRACE(RelList) {
-  visitor->Trace(element_);
-  DOMTokenList::Trace(visitor);
-}
-
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/RelList.h b/third_party/WebKit/Source/core/html/RelList.h
index ff60b46d3..82a307b 100644
--- a/third_party/WebKit/Source/core/html/RelList.h
+++ b/third_party/WebKit/Source/core/html/RelList.h
@@ -5,28 +5,17 @@
 #ifndef RelList_h
 #define RelList_h
 
-#include "core/HTMLNames.h"
 #include "core/dom/DOMTokenList.h"
-#include "core/dom/Element.h"
-#include "core/dom/SpaceSplitString.h"
 
 namespace blink {
 
 class RelList final : public DOMTokenList {
  public:
   static RelList* Create(Element* element) { return new RelList(element); }
-  DECLARE_VIRTUAL_TRACE();
 
  private:
   explicit RelList(Element*);
-
-  void setValue(const AtomicString& value) override {
-    element_->setAttribute(HTMLNames::relAttr, value);
-  }
-
   bool ValidateTokenValue(const AtomicString&, ExceptionState&) const override;
-
-  Member<Element> element_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/web/DateTimeChooserImpl.cpp b/third_party/WebKit/Source/core/html/forms/DateTimeChooserImpl.cpp
similarity index 99%
rename from third_party/WebKit/Source/web/DateTimeChooserImpl.cpp
rename to third_party/WebKit/Source/core/html/forms/DateTimeChooserImpl.cpp
index c0e9e9e..47fe8e9 100644
--- a/third_party/WebKit/Source/web/DateTimeChooserImpl.cpp
+++ b/third_party/WebKit/Source/core/html/forms/DateTimeChooserImpl.cpp
@@ -28,7 +28,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "web/DateTimeChooserImpl.h"
+#include "core/html/forms/DateTimeChooserImpl.h"
 
 #include "core/InputTypeNames.h"
 #include "core/frame/LocalFrameView.h"
diff --git a/third_party/WebKit/Source/web/DateTimeChooserImpl.h b/third_party/WebKit/Source/core/html/forms/DateTimeChooserImpl.h
similarity index 94%
rename from third_party/WebKit/Source/web/DateTimeChooserImpl.h
rename to third_party/WebKit/Source/core/html/forms/DateTimeChooserImpl.h
index 32585ed..e0404230 100644
--- a/third_party/WebKit/Source/web/DateTimeChooserImpl.h
+++ b/third_party/WebKit/Source/core/html/forms/DateTimeChooserImpl.h
@@ -31,9 +31,10 @@
 #ifndef DateTimeChooserImpl_h
 #define DateTimeChooserImpl_h
 
+#include <memory>
+#include "core/CoreExport.h"
 #include "core/html/forms/DateTimeChooser.h"
 #include "core/page/PagePopupClient.h"
-#include <memory>
 
 namespace blink {
 
@@ -41,8 +42,9 @@
 class DateTimeChooserClient;
 class PagePopup;
 
-class DateTimeChooserImpl final : public DateTimeChooser,
-                                  public PagePopupClient {
+class CORE_EXPORT DateTimeChooserImpl final
+    : public NON_EXPORTED_BASE(DateTimeChooser),
+      public NON_EXPORTED_BASE(PagePopupClient) {
  public:
   static DateTimeChooserImpl* Create(ChromeClient*,
                                      DateTimeChooserClient*,
diff --git a/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp b/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp
index 985cf2c..9a41b09 100644
--- a/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp
+++ b/third_party/WebKit/Source/core/html/forms/TextControlInnerElements.cpp
@@ -89,9 +89,6 @@
   style->SetUserModify(EUserModify::kReadOnly);
   style->SetUnique();
 
-  if (const ComputedStyle* parent_style = ParentComputedStyle())
-    StyleAdjuster::AdjustStyleForAlignment(*style, *parent_style);
-
   return style.Release();
 }
 
@@ -149,8 +146,6 @@
   // Using StyleAdjuster::adjustComputedStyle updates unwanted style. We'd like
   // to apply only editing-related and alignment-related.
   StyleAdjuster::AdjustStyleForEditing(*inner_editor_style);
-  if (const ComputedStyle* parent_style = ParentComputedStyle())
-    StyleAdjuster::AdjustStyleForAlignment(*inner_editor_style, *parent_style);
   return inner_editor_style.Release();
 }
 
diff --git a/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.cpp b/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.cpp
index 0011dfe..d1fdd44 100644
--- a/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.cpp
+++ b/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.cpp
@@ -21,15 +21,7 @@
 
 HTMLMediaElementControlsList::HTMLMediaElementControlsList(
     HTMLMediaElement* element)
-    : DOMTokenList(this), element_(element) {}
-
-HTMLMediaElementControlsList::~HTMLMediaElementControlsList() = default;
-
-DEFINE_TRACE(HTMLMediaElementControlsList) {
-  visitor->Trace(element_);
-  DOMTokenList::Trace(visitor);
-  DOMTokenListObserver::Trace(visitor);
-}
+    : DOMTokenList(*element, HTMLNames::controlslistAttr) {}
 
 bool HTMLMediaElementControlsList::ValidateTokenValue(
     const AtomicString& token_value,
@@ -41,10 +33,6 @@
   return false;
 }
 
-void HTMLMediaElementControlsList::ValueWasSet(const AtomicString& value) {
-  element_->ControlsListValueWasSet(value);
-}
-
 bool HTMLMediaElementControlsList::ShouldHideDownload() const {
   return Tokens().Contains(kNoDownload);
 }
diff --git a/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.h b/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.h
index 8c8d684..ebfce6e 100644
--- a/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.h
+++ b/third_party/WebKit/Source/core/html/media/HTMLMediaElementControlsList.h
@@ -13,19 +13,12 @@
 
 class HTMLMediaElement;
 
-class HTMLMediaElementControlsList final : public DOMTokenList,
-                                           public DOMTokenListObserver {
-  USING_GARBAGE_COLLECTED_MIXIN(HTMLMediaElementControlsList);
-
+class HTMLMediaElementControlsList final : public DOMTokenList {
  public:
   static HTMLMediaElementControlsList* Create(HTMLMediaElement* element) {
     return new HTMLMediaElementControlsList(element);
   }
 
-  ~HTMLMediaElementControlsList() override;
-
-  DECLARE_VIRTUAL_TRACE();
-
   // Whether the list dictates to hide a certain control.
   CORE_EXPORT bool ShouldHideDownload() const;
   CORE_EXPORT bool ShouldHideFullscreen() const;
@@ -34,11 +27,6 @@
  private:
   explicit HTMLMediaElementControlsList(HTMLMediaElement*);
   bool ValidateTokenValue(const AtomicString&, ExceptionState&) const override;
-
-  // DOMTokenListObserver.
-  void ValueWasSet(const AtomicString&) override;
-
-  Member<HTMLMediaElement> element_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index 382ef45..da017f7 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -662,8 +662,7 @@
                                     const ScrollAlignment& align_x,
                                     const ScrollAlignment& align_y,
                                     ScrollType scroll_type,
-                                    bool make_visible_in_visual_viewport,
-                                    ScrollBehavior scroll_behavior) {
+                                    bool make_visible_in_visual_viewport) {
   DCHECK(scroll_type == kProgrammaticScroll || scroll_type == kUserScroll);
   // Presumably the same issue as in setScrollTop. See crbug.com/343132.
   DisableCompositingQueryAsserts disabler;
@@ -684,18 +683,14 @@
         !ContainingBlock()->Style()->LineClamp().IsNone();
   }
 
-  bool is_smooth = scroll_behavior == kScrollBehaviorSmooth ||
-                   (scroll_behavior == kScrollBehaviorAuto &&
-                    Style()->GetScrollBehavior() == kScrollBehaviorSmooth);
-
   if (HasOverflowClip() && !restricted_by_line_clamp) {
     // Don't scroll to reveal an overflow layer that is restricted by the
     // -webkit-line-clamp property. This will prevent us from revealing text
     // hidden by the slider in Safari RSS.
     // TODO(eae): We probably don't need this any more as we don't share any
     //            code with the Safari RSS reeder.
-    new_rect = GetScrollableArea()->ScrollIntoView(
-        rect_to_scroll, align_x, align_y, is_smooth, scroll_type);
+    new_rect = GetScrollableArea()->ScrollIntoView(rect_to_scroll, align_x,
+                                                   align_y, scroll_type);
     if (new_rect.IsEmpty())
       return;
   } else if (!parent_box && CanBeProgramaticallyScrolled()) {
@@ -704,10 +699,10 @@
       if (!IsDisallowedAutoscroll(owner_element, frame_view)) {
         if (make_visible_in_visual_viewport) {
           frame_view->GetScrollableArea()->ScrollIntoView(
-              rect_to_scroll, align_x, align_y, is_smooth, scroll_type);
+              rect_to_scroll, align_x, align_y, scroll_type);
         } else {
           frame_view->LayoutViewportScrollableArea()->ScrollIntoView(
-              rect_to_scroll, align_x, align_y, is_smooth, scroll_type);
+              rect_to_scroll, align_x, align_y, scroll_type);
         }
         if (owner_element && owner_element->GetLayoutObject()) {
           if (frame_view->SafeToPropagateScrollToParent()) {
@@ -737,11 +732,9 @@
   if (GetFrame()->GetPage()->GetAutoscrollController().AutoscrollInProgress())
     parent_box = EnclosingScrollableBox();
 
-  if (parent_box) {
+  if (parent_box)
     parent_box->ScrollRectToVisible(new_rect, align_x, align_y, scroll_type,
-                                    make_visible_in_visual_viewport,
-                                    scroll_behavior);
-  }
+                                    make_visible_in_visual_viewport);
 }
 
 void LayoutBox::AbsoluteRects(Vector<IntRect>& rects,
@@ -2890,15 +2883,14 @@
     // Flexbox Items, which obviously should have a container.
     return false;
   }
-  const ComputedStyle* parent_style = IsAnonymous() ? cb->Style() : nullptr;
   if (cb->IsHorizontalWritingMode() != IsHorizontalWritingMode())
     return style
                .ResolvedAlignSelf(cb->SelfAlignmentNormalBehavior(this),
-                                  parent_style)
+                                  cb->Style())
                .GetPosition() == kItemPositionStretch;
   return style
              .ResolvedJustifySelf(cb->SelfAlignmentNormalBehavior(this),
-                                  parent_style)
+                                  cb->Style())
              .GetPosition() == kItemPositionStretch;
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.h b/third_party/WebKit/Source/core/layout/LayoutBox.h
index 464f77a..d2b3f86 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.h
@@ -588,8 +588,7 @@
                            const ScrollAlignment& align_x,
                            const ScrollAlignment& align_y,
                            ScrollType = kProgrammaticScroll,
-                           bool make_visible_in_visual_viewport = true,
-                           ScrollBehavior = kScrollBehaviorAuto);
+                           bool make_visible_in_visual_viewport = true);
 
   LayoutRectOutsets MarginBoxOutsets() const override {
     return margin_box_outsets_;
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
index 79ca9899..3b10dde9 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -325,14 +325,13 @@
   intrinsic_size_along_main_axis_.erase(child);
 }
 
-// TODO (lajava): Is this function still needed ? Every time the flex
-// container's align-items value changes we propagate the diff to its children
-// (see ComputedStyle::stylePropagationDiff).
 void LayoutFlexibleBox::StyleDidChange(StyleDifference diff,
                                        const ComputedStyle* old_style) {
   LayoutBlock::StyleDidChange(diff, old_style);
 
-  if (old_style && old_style->AlignItemsPosition() == kItemPositionStretch &&
+  if (old_style &&
+      old_style->ResolvedAlignItems(SelfAlignmentNormalBehavior())
+              .GetPosition() == kItemPositionStretch &&
       diff.NeedsFullLayout()) {
     // Flex items that were previously stretching need to be relayed out so we
     // can compute new available cross axis space. This is only necessary for
@@ -1706,8 +1705,7 @@
     const LayoutBox& child) const {
   ItemPosition align =
       child.StyleRef()
-          .ResolvedAlignSelf(SelfAlignmentNormalBehavior(),
-                             child.IsAnonymous() ? Style() : nullptr)
+          .ResolvedAlignSelf(SelfAlignmentNormalBehavior(), Style())
           .GetPosition();
   DCHECK_NE(align, kItemPositionAuto);
   DCHECK_NE(align, kItemPositionNormal);
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 7fc73fa..99bc7c6 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -97,12 +97,67 @@
   DirtyGrid();
 }
 
+StyleSelfAlignmentData LayoutGrid::SelfAlignmentForChild(
+    GridAxis axis,
+    const LayoutBox& child,
+    const ComputedStyle* style) const {
+  return axis == kGridRowAxis ? JustifySelfForChild(child, style)
+                              : AlignSelfForChild(child, style);
+}
+
+bool LayoutGrid::SelfAlignmentChangedToStretch(GridAxis axis,
+                                               const ComputedStyle& old_style,
+                                               const ComputedStyle& new_style,
+                                               const LayoutBox& child) const {
+  return SelfAlignmentForChild(axis, child, &old_style).GetPosition() !=
+             kItemPositionStretch &&
+         SelfAlignmentForChild(axis, child, &new_style).GetPosition() ==
+             kItemPositionStretch;
+}
+
+bool LayoutGrid::SelfAlignmentChangedFromStretch(GridAxis axis,
+                                                 const ComputedStyle& old_style,
+                                                 const ComputedStyle& new_style,
+                                                 const LayoutBox& child) const {
+  return SelfAlignmentForChild(axis, child, &old_style).GetPosition() ==
+             kItemPositionStretch &&
+         SelfAlignmentForChild(axis, child, &new_style).GetPosition() !=
+             kItemPositionStretch;
+}
+
 void LayoutGrid::StyleDidChange(StyleDifference diff,
                                 const ComputedStyle* old_style) {
   LayoutBlock::StyleDidChange(diff, old_style);
   if (!old_style)
     return;
 
+  const ComputedStyle& new_style = StyleRef();
+  if (old_style &&
+      old_style->ResolvedAlignItems(SelfAlignmentNormalBehavior(this))
+              .GetPosition() == kItemPositionStretch &&
+      diff.NeedsFullLayout()) {
+    // Style changes on the grid container implying stretching (to-stretch) or
+    // shrinking (from-stretch) require the affected items to be laid out again.
+    // These logic only applies to 'stretch' since the rest of the alignment
+    // values don't change the size of the box.
+    // In any case, the items' overrideSize will be cleared and recomputed (if
+    // necessary)  as part of the Grid layout logic, triggered by this style
+    // change.
+    for (LayoutBox* child = FirstInFlowChildBox(); child;
+         child = child->NextInFlowSiblingBox()) {
+      if (SelfAlignmentChangedToStretch(kGridRowAxis, *old_style, new_style,
+                                        *child) ||
+          SelfAlignmentChangedFromStretch(kGridRowAxis, *old_style, new_style,
+                                          *child) ||
+          SelfAlignmentChangedToStretch(kGridColumnAxis, *old_style, new_style,
+                                        *child) ||
+          SelfAlignmentChangedFromStretch(kGridColumnAxis, *old_style,
+                                          new_style, *child)) {
+        child->SetNeedsLayout(LayoutInvalidationReason::kGridChanged);
+      }
+    }
+  }
+
   // FIXME: The following checks could be narrowed down if we kept track of
   // which type of grid items we have:
   // - explicit grid size changes impact negative explicitely positioned and
@@ -1530,29 +1585,21 @@
 }
 
 StyleSelfAlignmentData LayoutGrid::AlignSelfForChild(
-    const LayoutBox& child) const {
-  if (!child.IsAnonymous()) {
-    return child.StyleRef().ResolvedAlignSelf(
-        SelfAlignmentNormalBehavior(&child));
-  }
-  // All the 'auto' values has been solved by the StyleAdjuster, but it's
-  // possible that some grid items generate Anonymous boxes, which need to be
-  // solved during layout.
+    const LayoutBox& child,
+    const ComputedStyle* style) const {
+  if (!style)
+    style = Style();
   return child.StyleRef().ResolvedAlignSelf(SelfAlignmentNormalBehavior(&child),
-                                            Style());
+                                            style);
 }
 
 StyleSelfAlignmentData LayoutGrid::JustifySelfForChild(
-    const LayoutBox& child) const {
-  if (!child.IsAnonymous()) {
-    return child.StyleRef().ResolvedJustifySelf(
-        SelfAlignmentNormalBehavior(&child));
-  }
-  // All the 'auto' values has been solved by the StyleAdjuster, but it's
-  // possible that some grid items generate Anonymous boxes, which need to be
-  // solved during layout.
+    const LayoutBox& child,
+    const ComputedStyle* style) const {
+  if (!style)
+    style = Style();
   return child.StyleRef().ResolvedJustifySelf(
-      SelfAlignmentNormalBehavior(&child), Style());
+      SelfAlignmentNormalBehavior(&child), style);
 }
 
 GridTrackSizingDirection LayoutGrid::FlowAwareDirectionForChild(
@@ -1780,11 +1827,9 @@
 
 bool LayoutGrid::IsBaselineAlignmentForChild(const LayoutBox& child,
                                              GridAxis baseline_axis) const {
-  bool is_column_axis_baseline = baseline_axis == kGridColumnAxis;
-  ItemPosition align = is_column_axis_baseline
-                           ? AlignSelfForChild(child).GetPosition()
-                           : JustifySelfForChild(child).GetPosition();
-  bool has_auto_margins = is_column_axis_baseline
+  ItemPosition align =
+      SelfAlignmentForChild(baseline_axis, child).GetPosition();
+  bool has_auto_margins = baseline_axis == kGridColumnAxis
                               ? HasAutoMarginsInColumnAxis(child)
                               : HasAutoMarginsInRowAxis(child);
   return IsBaselinePosition(align) && !has_auto_margins;
@@ -1804,9 +1849,8 @@
                                            : col_axis_alignment_context_;
   auto* context = contexts_map.at(span.StartLine());
   DCHECK(context);
-  ItemPosition align = is_column_axis_baseline
-                           ? AlignSelfForChild(child).GetPosition()
-                           : JustifySelfForChild(child).GetPosition();
+  ItemPosition align =
+      SelfAlignmentForChild(baseline_axis, child).GetPosition();
   return context->GetSharedGroup(child, align);
 }
 
@@ -1924,9 +1968,8 @@
   auto add_result = contexts_map.insert(span.StartLine(), nullptr);
 
   // Looking for a compatible baseline-sharing group.
-  ItemPosition align = is_column_axis_baseline
-                           ? AlignSelfForChild(child).GetPosition()
-                           : JustifySelfForChild(child).GetPosition();
+  ItemPosition align =
+      SelfAlignmentForChild(baseline_axis, child).GetPosition();
   if (add_result.is_new_entry) {
     add_result.stored_value->value =
         WTF::MakeUnique<BaselineContext>(child, align, ascent, descent);
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.h b/third_party/WebKit/Source/core/layout/LayoutGrid.h
index cf5354f..7a82d7a 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.h
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.h
@@ -128,6 +128,14 @@
                 LayoutObject* before_child = nullptr) override;
   void RemoveChild(LayoutObject*) override;
 
+  bool SelfAlignmentChangedToStretch(GridAxis,
+                                     const ComputedStyle& old_style,
+                                     const ComputedStyle& new_style,
+                                     const LayoutBox&) const;
+  bool SelfAlignmentChangedFromStretch(GridAxis,
+                                       const ComputedStyle& old_style,
+                                       const ComputedStyle& new_style,
+                                       const LayoutBox&) const;
   void StyleDidChange(StyleDifference, const ComputedStyle*) override;
 
   Optional<LayoutUnit> AvailableSpaceForGutters(GridTrackSizingDirection) const;
@@ -212,8 +220,16 @@
   LayoutUnit AvailableAlignmentSpaceForChildBeforeStretching(
       LayoutUnit grid_area_breadth_for_child,
       const LayoutBox&) const;
-  StyleSelfAlignmentData JustifySelfForChild(const LayoutBox&) const;
-  StyleSelfAlignmentData AlignSelfForChild(const LayoutBox&) const;
+  StyleSelfAlignmentData JustifySelfForChild(
+      const LayoutBox&,
+      const ComputedStyle* = nullptr) const;
+  StyleSelfAlignmentData AlignSelfForChild(
+      const LayoutBox&,
+      const ComputedStyle* = nullptr) const;
+  StyleSelfAlignmentData SelfAlignmentForChild(
+      GridAxis,
+      const LayoutBox& child,
+      const ComputedStyle* = nullptr) const;
   void ApplyStretchAlignmentToChildIfNeeded(LayoutBox&);
   bool HasAutoSizeInColumnAxis(const LayoutBox& child) const {
     return IsHorizontalWritingMode() ? child.StyleRef().Height().IsAuto()
diff --git a/third_party/WebKit/Source/core/layout/LayoutListBox.cpp b/third_party/WebKit/Source/core/layout/LayoutListBox.cpp
index fb7cbd9..d3a45d6 100644
--- a/third_party/WebKit/Source/core/layout/LayoutListBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutListBox.cpp
@@ -133,7 +133,7 @@
     DCHECK(Layer()->GetScrollableArea());
     Layer()->GetScrollableArea()->ScrollIntoView(
         rect, ScrollAlignment::kAlignToEdgeIfNeeded,
-        ScrollAlignment::kAlignToEdgeIfNeeded, false);
+        ScrollAlignment::kAlignToEdgeIfNeeded);
   }
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index 1639492..1f6b5b50 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -631,15 +631,13 @@
                                        const ScrollAlignment& align_x,
                                        const ScrollAlignment& align_y,
                                        ScrollType scroll_type,
-                                       bool make_visible_in_visual_viewport,
-                                       ScrollBehavior scroll_behavior) {
+                                       bool make_visible_in_visual_viewport) {
   LayoutBox* enclosing_box = this->EnclosingBox();
   if (!enclosing_box)
     return false;
 
   enclosing_box->ScrollRectToVisible(rect, align_x, align_y, scroll_type,
-                                     make_visible_in_visual_viewport,
-                                     scroll_behavior);
+                                     make_visible_in_visual_viewport);
   return true;
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h
index ed845f2..34ccc620 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -280,8 +280,7 @@
       const ScrollAlignment& align_x = ScrollAlignment::kAlignCenterIfNeeded,
       const ScrollAlignment& align_y = ScrollAlignment::kAlignCenterIfNeeded,
       ScrollType = kProgrammaticScroll,
-      bool make_visible_in_visual_viewport = true,
-      ScrollBehavior = kScrollBehaviorAuto);
+      bool make_visible_in_visual_viewport = true);
 
   // Convenience function for getting to the nearest enclosing box of a
   // LayoutObject.
diff --git a/third_party/WebKit/Source/core/layout/ScrollAlignment.cpp b/third_party/WebKit/Source/core/layout/ScrollAlignment.cpp
index f9756ff..b91cd6b 100644
--- a/third_party/WebKit/Source/core/layout/ScrollAlignment.cpp
+++ b/third_party/WebKit/Source/core/layout/ScrollAlignment.cpp
@@ -59,10 +59,6 @@
     kScrollAlignmentTop, kScrollAlignmentTop, kScrollAlignmentTop};
 const ScrollAlignment ScrollAlignment::kAlignBottomAlways = {
     kScrollAlignmentBottom, kScrollAlignmentBottom, kScrollAlignmentBottom};
-const ScrollAlignment ScrollAlignment::kAlignLeftAlways = {
-    kScrollAlignmentLeft, kScrollAlignmentLeft, kScrollAlignmentLeft};
-const ScrollAlignment ScrollAlignment::kAlignRightAlways = {
-    kScrollAlignmentRight, kScrollAlignmentRight, kScrollAlignmentRight};
 
 #define MIN_INTERSECT_FOR_REVEAL 32
 
diff --git a/third_party/WebKit/Source/core/layout/ScrollAlignment.h b/third_party/WebKit/Source/core/layout/ScrollAlignment.h
index cfa070b..4d162cc7 100644
--- a/third_party/WebKit/Source/core/layout/ScrollAlignment.h
+++ b/third_party/WebKit/Source/core/layout/ScrollAlignment.h
@@ -84,8 +84,6 @@
   static const ScrollAlignment kAlignCenterAlways;
   static const ScrollAlignment kAlignTopAlways;
   static const ScrollAlignment kAlignBottomAlways;
-  static const ScrollAlignment kAlignLeftAlways;
-  static const ScrollAlignment kAlignRightAlways;
 
   ScrollAlignmentBehavior rect_visible_;
   ScrollAlignmentBehavior rect_hidden_;
diff --git a/third_party/WebKit/Source/core/page/Page.cpp b/third_party/WebKit/Source/core/page/Page.cpp
index a8096785..25b883e 100644
--- a/third_party/WebKit/Source/core/page/Page.cpp
+++ b/third_party/WebKit/Source/core/page/Page.cpp
@@ -61,7 +61,6 @@
 #include "platform/graphics/GraphicsLayer.h"
 #include "platform/loader/fetch/ResourceFetcher.h"
 #include "platform/plugins/PluginData.h"
-#include "platform/scroll/SmoothScrollSequencer.h"
 #include "public/platform/Platform.h"
 
 namespace blink {
@@ -173,13 +172,6 @@
   return *page_scale_constraints_set_;
 }
 
-SmoothScrollSequencer* Page::GetSmoothScrollSequencer() {
-  if (!smooth_scroll_sequencer_)
-    smooth_scroll_sequencer_ = new SmoothScrollSequencer();
-
-  return smooth_scroll_sequencer_.Get();
-}
-
 const PageScaleConstraintsSet& Page::GetPageScaleConstraintsSet() const {
   return *page_scale_constraints_set_;
 }
@@ -634,7 +626,6 @@
   visitor->Trace(context_menu_controller_);
   visitor->Trace(pointer_lock_controller_);
   visitor->Trace(scrolling_coordinator_);
-  visitor->Trace(smooth_scroll_sequencer_);
   visitor->Trace(browser_controls_);
   visitor->Trace(console_message_storage_);
   visitor->Trace(event_handler_registry_);
diff --git a/third_party/WebKit/Source/core/page/Page.h b/third_party/WebKit/Source/core/page/Page.h
index 9e0b4de..f1ef9635 100644
--- a/third_party/WebKit/Source/core/page/Page.h
+++ b/third_party/WebKit/Source/core/page/Page.h
@@ -66,7 +66,6 @@
 class PointerLockController;
 class ScopedPageSuspender;
 class ScrollingCoordinator;
-class SmoothScrollSequencer;
 class Settings;
 class ConsoleMessageStorage;
 class SpellCheckerClient;
@@ -178,8 +177,6 @@
 
   ScrollingCoordinator* GetScrollingCoordinator();
 
-  SmoothScrollSequencer* GetSmoothScrollSequencer();
-
   ClientRectList* NonFastScrollableRects(const LocalFrame*);
 
   Settings& GetSettings() const { return *settings_; }
@@ -305,7 +302,6 @@
   const std::unique_ptr<PageScaleConstraintsSet> page_scale_constraints_set_;
   const Member<PointerLockController> pointer_lock_controller_;
   Member<ScrollingCoordinator> scrolling_coordinator_;
-  Member<SmoothScrollSequencer> smooth_scroll_sequencer_;
   const Member<BrowserControls> browser_controls_;
   const Member<ConsoleMessageStorage> console_message_storage_;
   const Member<EventHandlerRegistry> event_handler_registry_;
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
index 948b6c2..a268a74f 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -209,13 +209,6 @@
   return nullptr;
 }
 
-SmoothScrollSequencer* PaintLayerScrollableArea::GetSmoothScrollSequencer()
-    const {
-  if (Page* page = Box().GetFrame()->GetPage())
-    return page->GetSmoothScrollSequencer();
-  return nullptr;
-}
-
 GraphicsLayer* PaintLayerScrollableArea::LayerForScrolling() const {
   return Layer()->HasCompositedLayerMapping()
              ? Layer()->GetCompositedLayerMapping()->ScrollingContentsLayer()
@@ -1738,7 +1731,6 @@
     const LayoutRect& rect,
     const ScrollAlignment& align_x,
     const ScrollAlignment& align_y,
-    bool is_smooth,
     ScrollType scroll_type) {
   LayoutRect local_expose_rect(
       Box()
@@ -1752,14 +1744,8 @@
   ScrollOffset old_scroll_offset = GetScrollOffset();
   ScrollOffset new_scroll_offset(ClampScrollOffset(RoundedIntSize(
       ToScrollOffset(FloatPoint(r.Location()) + old_scroll_offset))));
-  if (is_smooth) {
-    DCHECK(scroll_type == kProgrammaticScroll);
-    GetSmoothScrollSequencer()->QueueAnimation(this, new_scroll_offset);
-  } else {
-    SetScrollOffset(new_scroll_offset, scroll_type, kScrollBehaviorInstant);
-  }
-  ScrollOffset scroll_offset_difference =
-      ClampScrollOffset(new_scroll_offset) - old_scroll_offset;
+  SetScrollOffset(new_scroll_offset, scroll_type, kScrollBehaviorInstant);
+  ScrollOffset scroll_offset_difference = GetScrollOffset() - old_scroll_offset;
   local_expose_rect.Move(-LayoutSize(scroll_offset_difference));
 
   LayoutRect intersect =
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h
index ff607f8f..c396827 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h
@@ -240,8 +240,6 @@
 
   PlatformChromeClient* GetChromeClient() const override;
 
-  SmoothScrollSequencer* GetSmoothScrollSequencer() const override;
-
   // For composited scrolling, we allocate an extra GraphicsLayer to hold
   // onto the scrolling content. The layer can be shifted on the GPU and
   // composited at little cost.
@@ -394,7 +392,6 @@
   LayoutRect ScrollIntoView(const LayoutRect&,
                             const ScrollAlignment& align_x,
                             const ScrollAlignment& align_y,
-                            bool is_smooth,
                             ScrollType = kProgrammaticScroll) override;
 
   // Returns true if scrollable area is in the FrameView's collection of
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
index b23deae..ded0880d 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -199,7 +199,6 @@
   }
 
   if (!old_style->LoadingCustomFontsEqual(*new_style) ||
-      old_style->AlignItems() != new_style->AlignItems() ||
       old_style->JustifyItems() != new_style->JustifyItems())
     return kInherit;
 
@@ -220,9 +219,6 @@
 StyleSelfAlignmentData ResolvedSelfAlignment(
     const StyleSelfAlignmentData& value,
     ItemPosition normal_value_behavior) {
-  // To avoid needing to copy the RareNonInheritedData, we repurpose the 'auto'
-  // flag to not just mean 'auto' prior to running the StyleAdjuster but also
-  // mean 'normal' after running it.
   if (value.GetPosition() == kItemPositionNormal ||
       value.GetPosition() == kItemPositionAuto)
     return {normal_value_behavior, kOverflowAlignmentDefault};
@@ -244,9 +240,6 @@
   if (!parent_style || AlignSelfPosition() != kItemPositionAuto)
     return ResolvedSelfAlignment(AlignSelf(), normal_value_behaviour);
 
-  // We shouldn't need to resolve any 'auto' value in post-adjusment
-  // ComputedStyle, but some layout models can generate anonymous boxes that may
-  // need 'auto' value resolution during layout.
   // The 'auto' keyword computes to the parent's align-items computed value.
   return parent_style->ResolvedAlignItems(normal_value_behaviour);
 }
@@ -266,9 +259,6 @@
   if (!parent_style || JustifySelfPosition() != kItemPositionAuto)
     return ResolvedSelfAlignment(JustifySelf(), normal_value_behaviour);
 
-  // We shouldn't need to resolve any 'auto' value in post-adjusment
-  // ComputedStyle, but some layout models can generate anonymous boxes that may
-  // need 'auto' value resolution during layout.
   // The auto keyword computes to the parent's justify-items computed value.
   return parent_style->ResolvedJustifyItems(normal_value_behaviour);
 }
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
index 67a66e0..caf0271 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -357,8 +357,7 @@
 }
 
 enum ItemPosition {
-  kItemPositionAuto,  // It will mean 'normal' after running the StyleAdjuster
-                      // to avoid resolving the initial values.
+  kItemPositionAuto,
   kItemPositionNormal,
   kItemPositionStretch,
   kItemPositionBaseline,
diff --git a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.idl b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.idl
index c47e8b9..e3f885f 100644
--- a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.idl
+++ b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.idl
@@ -35,7 +35,7 @@
     [RuntimeEnabled=NetInfoDownlinkMax, MeasureAs=NetInfoDownlinkMax] readonly attribute Megabit downlinkMax;
     [RuntimeEnabled=NetInfoDownlinkMax, MeasureAs=NetInfoOnChange] attribute EventHandler onchange;
     [MeasureAs=NetInfoOnTypeChange] attribute EventHandler ontypechange;
-    [MeasureAs=NetInfoEffectiveType] readonly attribute EffectiveConnectionType effectiveType;
+    [RuntimeEnabled=NetInfoEffectiveType, MeasureAs=NetInfoEffectiveType] readonly attribute EffectiveConnectionType effectiveType;
     [RuntimeEnabled=NetInfoRtt, MeasureAs=NetInfoRtt] readonly attribute Milliseconds rtt;  
     [RuntimeEnabled=NetInfoDownlink, MeasureAs=NetInfoDownlink] readonly attribute Megabit downlink;
 };
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index 6dcc0b1b..e3caa04 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -1386,8 +1386,6 @@
     "scroll/ScrollbarThemeOverlay.cpp",
     "scroll/ScrollbarThemeOverlay.h",
     "scroll/ScrollbarThemeOverlayMock.h",
-    "scroll/SmoothScrollSequencer.cpp",
-    "scroll/SmoothScrollSequencer.h",
     "speech/PlatformSpeechSynthesisUtterance.cpp",
     "speech/PlatformSpeechSynthesisUtterance.h",
     "speech/PlatformSpeechSynthesisVoice.cpp",
diff --git a/third_party/WebKit/Source/platform/geometry/FloatSize.h b/third_party/WebKit/Source/platform/geometry/FloatSize.h
index 0dbbafe..138c452 100644
--- a/third_party/WebKit/Source/platform/geometry/FloatSize.h
+++ b/third_party/WebKit/Source/platform/geometry/FloatSize.h
@@ -199,7 +199,4 @@
 
 }  // namespace blink
 
-// Allows this class to be stored in a HeapVector.
-WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::FloatSize);
-
 #endif  // FloatSize_h
diff --git a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
index 64a496b5..ecded67 100644
--- a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
+++ b/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
@@ -30,6 +30,7 @@
 
 #include "platform/graphics/UnacceleratedImageBufferSurface.h"
 
+#include "platform/RuntimeEnabledFeatures.h"
 #include "platform/graphics/skia/SkiaUtils.h"
 #include "platform/wtf/PassRefPtr.h"
 #include "third_party/skia/include/core/SkSurface.h"
@@ -56,7 +57,12 @@
 
   // Always save an initial frame, to support resetting the top level matrix
   // and clip.
-  canvas_ = WTF::WrapUnique(new SkiaPaintCanvas(surface_->getCanvas()));
+  canvas_ = WTF::WrapUnique(new SkiaPaintCanvas(
+      surface_->getCanvas(),
+      RuntimeEnabledFeatures::colorCorrectRenderingEnabled() &&
+              color_params.UsesOutputSpaceBlending()
+          ? color_params.GetSkColorSpace()
+          : nullptr));
   canvas_->save();
 
   if (initialization_mode == kInitializeImagePixels)
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp
index fa52e694..2b792551 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp
+++ b/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp
@@ -30,6 +30,7 @@
 
 #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h"
 
+#include "platform/RuntimeEnabledFeatures.h"
 #include "platform/graphics/gpu/SharedGpuContext.h"
 #include "platform/graphics/skia/SkiaUtils.h"
 #include "platform/wtf/PtrUtil.h"
@@ -62,7 +63,12 @@
   if (!surface_)
     return;
 
-  canvas_ = WTF::WrapUnique(new SkiaPaintCanvas(surface_->getCanvas()));
+  canvas_ = WTF::WrapUnique(new SkiaPaintCanvas(
+      surface_->getCanvas(),
+      RuntimeEnabledFeatures::colorCorrectRenderingEnabled() &&
+              color_params.UsesOutputSpaceBlending()
+          ? color_params.GetSkColorSpace()
+          : nullptr));
   Clear();
 
   // Always save an initial frame, to support resetting the top level matrix
diff --git a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp
index 1ced7257..b717e08 100644
--- a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp
@@ -10,7 +10,6 @@
 #include "platform/geometry/IntSize.h"
 #include "platform/graphics/GraphicsLayer.h"
 #include "platform/scroll/ScrollableArea.h"
-#include "platform/scroll/SmoothScrollSequencer.h"
 #include "platform/wtf/PtrUtil.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebCompositorSupport.h"
@@ -40,15 +39,12 @@
   NotifyOffsetChanged(offset);
 }
 
-void ProgrammaticScrollAnimator::AnimateToOffset(
-    const ScrollOffset& offset,
-    bool sequenced_for_smooth_scroll) {
+void ProgrammaticScrollAnimator::AnimateToOffset(const ScrollOffset& offset) {
   if (run_state_ == RunState::kPostAnimationCleanup)
     ResetAnimationState();
 
   start_time_ = 0.0;
   target_offset_ = offset;
-  sequenced_for_smooth_scroll_ = sequenced_for_smooth_scroll;
   animation_curve_ = CompositorScrollOffsetAnimationCurve::Create(
       CompositorOffsetFromBlinkOffset(target_offset_),
       CompositorScrollOffsetAnimationCurve::kScrollDurationDeltaBased);
@@ -80,7 +76,6 @@
 
   if (is_finished) {
     run_state_ = RunState::kPostAnimationCleanup;
-    AnimationFinished();
   } else if (!scrollable_area_->ScheduleAnimation()) {
     NotifyOffsetChanged(offset);
     ResetAnimationState();
@@ -174,16 +169,6 @@
     int group_id) {
   DCHECK_NE(run_state_, RunState::kRunningOnCompositorButNeedsUpdate);
   ScrollAnimatorCompositorCoordinator::CompositorAnimationFinished(group_id);
-  AnimationFinished();
-}
-
-void ProgrammaticScrollAnimator::AnimationFinished() {
-  if (sequenced_for_smooth_scroll_) {
-    sequenced_for_smooth_scroll_ = false;
-    if (SmoothScrollSequencer* sequencer =
-            GetScrollableArea()->GetSmoothScrollSequencer())
-      sequencer->RunQueuedAnimations();
-  }
 }
 
 DEFINE_TRACE(ProgrammaticScrollAnimator) {
diff --git a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h
index 8f1240fa..f8a365c 100644
--- a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h
+++ b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h
@@ -30,8 +30,7 @@
   virtual ~ProgrammaticScrollAnimator();
 
   void ScrollToOffsetWithoutAnimation(const ScrollOffset&);
-  void AnimateToOffset(const ScrollOffset&,
-                       bool sequenced_for_smooth_scroll = false);
+  void AnimateToOffset(const ScrollOffset&);
 
   // ScrollAnimatorCompositorCoordinator implementation.
   void ResetAnimationState() override;
@@ -53,13 +52,11 @@
   explicit ProgrammaticScrollAnimator(ScrollableArea*);
 
   void NotifyOffsetChanged(const ScrollOffset&);
-  void AnimationFinished();
 
   Member<ScrollableArea> scrollable_area_;
   std::unique_ptr<CompositorScrollOffsetAnimationCurve> animation_curve_;
   ScrollOffset target_offset_;
   double start_time_;
-  bool sequenced_for_smooth_scroll_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollTypes.h b/third_party/WebKit/Source/platform/scroll/ScrollTypes.h
index 7be2896..63a564a 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollTypes.h
+++ b/third_party/WebKit/Source/platform/scroll/ScrollTypes.h
@@ -181,8 +181,6 @@
 
 enum ScrollbarOrientation { kHorizontalScrollbar, kVerticalScrollbar };
 
-enum ScrollOrientation { kHorizontalScroll, kVerticalScroll };
-
 enum ScrollbarMode { kScrollbarAuto, kScrollbarAlwaysOff, kScrollbarAlwaysOn };
 
 enum ScrollbarControlSize { kRegularScrollbar, kSmallScrollbar };
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp
index 09a44edf..769acc3 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp
@@ -37,7 +37,6 @@
 #include "platform/scroll/MainThreadScrollingReason.h"
 #include "platform/scroll/ProgrammaticScrollAnimator.h"
 #include "platform/scroll/ScrollbarTheme.h"
-#include "platform/scroll/SmoothScrollSequencer.h"
 
 static const int kPixelsPerLineStep = 40;
 static const float kMinFractionToStepWhenPaging = 0.875f;
@@ -228,7 +227,7 @@
   CancelScrollAnimation();
 
   if (scroll_behavior == kScrollBehaviorSmooth)
-    GetProgrammaticScrollAnimator().AnimateToOffset(offset, true);
+    GetProgrammaticScrollAnimator().AnimateToOffset(offset);
   else
     GetProgrammaticScrollAnimator().ScrollToOffsetWithoutAnimation(offset);
 }
@@ -256,7 +255,6 @@
 LayoutRect ScrollableArea::ScrollIntoView(const LayoutRect& rect_in_content,
                                           const ScrollAlignment& align_x,
                                           const ScrollAlignment& align_y,
-                                          bool is_smooth,
                                           ScrollType) {
   // TODO(bokan): This should really be implemented here but ScrollAlignment is
   // in Core which is a dependency violation.
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableArea.h b/third_party/WebKit/Source/platform/scroll/ScrollableArea.h
index 728ac9b5..a84fe5c 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollableArea.h
+++ b/third_party/WebKit/Source/platform/scroll/ScrollableArea.h
@@ -53,7 +53,6 @@
 struct ScrollAlignment;
 class ScrollAnchor;
 class ScrollAnimatorBase;
-class SmoothScrollSequencer;
 class CompositorAnimationTimeline;
 
 enum IncludeScrollbarsInRect {
@@ -78,10 +77,6 @@
 
   virtual PlatformChromeClient* GetChromeClient() const { return 0; }
 
-  virtual SmoothScrollSequencer* GetSmoothScrollSequencer() const {
-    return nullptr;
-  }
-
   virtual ScrollResult UserScroll(ScrollGranularity, const ScrollOffset&);
 
   virtual void SetScrollOffset(const ScrollOffset&,
@@ -104,7 +99,6 @@
   virtual LayoutRect ScrollIntoView(const LayoutRect& rect_in_content,
                                     const ScrollAlignment& align_x,
                                     const ScrollAlignment& align_y,
-                                    bool is_smooth,
                                     ScrollType = kProgrammaticScroll);
 
   static bool ScrollBehaviorFromString(const String&, ScrollBehavior&);
diff --git a/third_party/WebKit/Source/platform/scroll/SmoothScrollSequencer.cpp b/third_party/WebKit/Source/platform/scroll/SmoothScrollSequencer.cpp
deleted file mode 100644
index f4ba71b..0000000
--- a/third_party/WebKit/Source/platform/scroll/SmoothScrollSequencer.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "platform/scroll/SmoothScrollSequencer.h"
-
-#include "platform/scroll/ProgrammaticScrollAnimator.h"
-#include "platform/scroll/ScrollableArea.h"
-
-namespace blink {
-
-SmoothScrollSequencer::SmoothScrollSequencer() {}
-
-void SmoothScrollSequencer::QueueAnimation(ScrollableArea* scrollable,
-                                           ScrollOffset offset) {
-  ScrollerAndOffsetPair scroller_offset(scrollable, offset);
-  queue_.push_back(scroller_offset);
-}
-
-void SmoothScrollSequencer::RunQueuedAnimations() {
-  if (queue_.IsEmpty()) {
-    current_scrollable_ = nullptr;
-    return;
-  }
-  ScrollerAndOffsetPair scroller_offset = queue_.back();
-  queue_.pop_back();
-  ScrollableArea* scrollable = scroller_offset.first;
-  current_scrollable_ = scrollable;
-  ScrollOffset offset = scroller_offset.second;
-  scrollable->SetScrollOffset(offset, kProgrammaticScroll,
-                              kScrollBehaviorSmooth);
-}
-
-void SmoothScrollSequencer::AbortAnimations() {
-  if (current_scrollable_) {
-    current_scrollable_->GetProgrammaticScrollAnimator().CancelAnimation();
-    current_scrollable_ = nullptr;
-  }
-  queue_.clear();
-}
-
-DEFINE_TRACE(SmoothScrollSequencer) {
-  visitor->Trace(queue_);
-  visitor->Trace(current_scrollable_);
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scroll/SmoothScrollSequencer.h b/third_party/WebKit/Source/platform/scroll/SmoothScrollSequencer.h
deleted file mode 100644
index 3c72499..0000000
--- a/third_party/WebKit/Source/platform/scroll/SmoothScrollSequencer.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#ifndef SmoothScrollSequencer_h
-#define SmoothScrollSequencer_h
-
-#include <utility>
-#include "platform/heap/Handle.h"
-#include "platform/scroll/ScrollTypes.h"
-
-namespace blink {
-
-class ScrollableArea;
-
-// A sequencer that queues the nested scrollers from inside to outside,
-// so that they can be animated from outside to inside when smooth scroll
-// is called.
-class PLATFORM_EXPORT SmoothScrollSequencer final
-    : public GarbageCollected<SmoothScrollSequencer> {
- public:
-  SmoothScrollSequencer();
-  // Add a scroll offset animation to the back of a queue.
-  void QueueAnimation(ScrollableArea*, ScrollOffset);
-
-  // Run the animation at the back of the queue.
-  void RunQueuedAnimations();
-
-  // Abort the currently running animation and all the animations in the queue.
-  void AbortAnimations();
-
-  DECLARE_TRACE();
-
- private:
-  typedef std::pair<Member<ScrollableArea>, ScrollOffset> ScrollerAndOffsetPair;
-  HeapVector<ScrollerAndOffsetPair> queue_;
-  Member<ScrollableArea> current_scrollable_;
-};
-
-}  // namespace blink
-
-#endif  // SmoothScrollSequencer_h
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn
index 9dce615..e535237 100644
--- a/third_party/WebKit/Source/web/BUILD.gn
+++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -56,8 +56,6 @@
     "CompositorWorkerProxyClientImpl.h",
     "ContextMenuClientImpl.cpp",
     "ContextMenuClientImpl.h",
-    "DateTimeChooserImpl.cpp",
-    "DateTimeChooserImpl.h",
     "DedicatedWorkerMessagingProxyProviderImpl.cpp",
     "DedicatedWorkerMessagingProxyProviderImpl.h",
     "DevToolsEmulator.cpp",
@@ -157,7 +155,6 @@
     "WebMetaElement.cpp",
     "WebNode.cpp",
     "WebOptionElement.cpp",
-    "WebPageImportanceSignals.cpp",
     "WebPagePopupImpl.cpp",
     "WebPagePopupImpl.h",
     "WebPepperSocket.cpp",
@@ -167,10 +164,8 @@
     "WebPluginContainerImpl.cpp",
     "WebPluginContainerImpl.h",
     "WebPluginDocument.cpp",
-    "WebPluginScriptForbiddenScope.cpp",
     "WebRemoteFrameImpl.cpp",
     "WebRemoteFrameImpl.h",
-    "WebScopedUserGesture.cpp",
     "WebScopedWindowFocusAllowedIndicator.cpp",
     "WebSearchableFormData.cpp",
     "WebSelectElement.cpp",
@@ -185,8 +180,6 @@
     "WebTextCheckingCompletionImpl.cpp",
     "WebTextCheckingCompletionImpl.h",
     "WebTextCheckingResult.cpp",
-    "WebUserGestureIndicator.cpp",
-    "WebUserGestureToken.cpp",
     "WebUserMediaRequest.cpp",
     "WebViewImpl.cpp",
     "WebViewImpl.h",
@@ -296,7 +289,6 @@
     "tests/ScrollbarsTest.cpp",
     "tests/ScrollingCoordinatorTest.cpp",
     "tests/ShadowDOMV0Test.cpp",
-    "tests/SmoothScrollTest.cpp",
     "tests/SpinLockTest.cpp",
     "tests/TextFinderTest.cpp",
     "tests/TextSelectionRepaintTest.cpp",
diff --git a/third_party/WebKit/Source/web/ChromeClientImpl.cpp b/third_party/WebKit/Source/web/ChromeClientImpl.cpp
index aa57f9a..51d3615 100644
--- a/third_party/WebKit/Source/web/ChromeClientImpl.cpp
+++ b/third_party/WebKit/Source/web/ChromeClientImpl.cpp
@@ -52,6 +52,7 @@
 #include "core/html/forms/ColorChooserClient.h"
 #include "core/html/forms/DateTimeChooser.h"
 #include "core/html/forms/DateTimeChooserClient.h"
+#include "core/html/forms/DateTimeChooserImpl.h"
 #include "core/layout/HitTestResult.h"
 #include "core/layout/LayoutPart.h"
 #include "core/layout/compositing/CompositedSelection.h"
@@ -115,7 +116,6 @@
 #include "web/AudioOutputDeviceClientImpl.h"
 #include "web/ColorChooserPopupUIController.h"
 #include "web/ColorChooserUIController.h"
-#include "web/DateTimeChooserImpl.h"
 #include "web/DevToolsEmulator.h"
 #include "web/ExternalDateTimeChooser.h"
 #include "web/ExternalPopupMenu.h"
diff --git a/third_party/WebKit/Source/web/tests/SmoothScrollTest.cpp b/third_party/WebKit/Source/web/tests/SmoothScrollTest.cpp
deleted file mode 100644
index 8f74a32..0000000
--- a/third_party/WebKit/Source/web/tests/SmoothScrollTest.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "bindings/core/v8/ScrollIntoViewOptionsOrBoolean.h"
-#include "core/frame/ScrollIntoViewOptions.h"
-#include "core/frame/ScrollToOptions.h"
-#include "public/web/WebScriptSource.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "web/WebLocalFrameImpl.h"
-#include "web/tests/sim/SimCompositor.h"
-#include "web/tests/sim/SimDisplayItemList.h"
-#include "web/tests/sim/SimRequest.h"
-#include "web/tests/sim/SimTest.h"
-
-namespace blink {
-
-namespace {
-
-class SmoothScrollTest : public SimTest {};
-
-TEST_F(SmoothScrollTest, InstantScroll) {
-  v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
-  WebView().Resize(WebSize(800, 600));
-  SimRequest request("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-  request.Complete(
-      "<div id='space' style='height: 1000px'></div>"
-      "<div id='content' style='height: 1000px'></div>");
-
-  Compositor().BeginFrame();
-  ASSERT_EQ(Window().scrollY(), 0);
-  Element* content = GetDocument().getElementById("content");
-  ScrollIntoViewOptionsOrBoolean arg;
-  ScrollIntoViewOptions options;
-  options.setBlock("start");
-  arg.setScrollIntoViewOptions(options);
-  content->scrollIntoView(arg);
-
-  ASSERT_EQ(Window().scrollY(), content->OffsetTop());
-}
-
-TEST_F(SmoothScrollTest, SmoothScroll) {
-  v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
-  WebView().Resize(WebSize(800, 600));
-  SimRequest request("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-  request.Complete(
-      "<div id='space' style='height: 1000px'></div>"
-      "<div id='content' style='height: 1000px'></div>");
-
-  Element* content = GetDocument().getElementById("content");
-  ScrollIntoViewOptionsOrBoolean arg;
-  ScrollIntoViewOptions options;
-  options.setBlock("start");
-  options.setBehavior("smooth");
-  arg.setScrollIntoViewOptions(options);
-  Compositor().BeginFrame();
-  ASSERT_EQ(Window().scrollY(), 0);
-
-  content->scrollIntoView(arg);
-  // Scrolling the container
-  Compositor().BeginFrame();  // update run_state_.
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(Window().scrollY(), 299);
-
-  // Finish scrolling the container
-  Compositor().BeginFrame(1);
-  ASSERT_EQ(Window().scrollY(), content->OffsetTop());
-}
-
-TEST_F(SmoothScrollTest, NestedContainer) {
-  v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
-  WebView().Resize(WebSize(800, 600));
-  SimRequest request("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-  request.Complete(
-      "<div id='space' style='height: 1000px'></div>"
-      "<div id='container' style='height: 600px; overflow: scroll'>"
-      "  <div id='space1' style='height: 1000px'></div>"
-      "  <div id='content' style='height: 1000px'></div>"
-      "</div>");
-
-  Element* container = GetDocument().getElementById("container");
-  Element* content = GetDocument().getElementById("content");
-  ScrollIntoViewOptionsOrBoolean arg;
-  ScrollIntoViewOptions options;
-  options.setBlock("start");
-  options.setBehavior("smooth");
-  arg.setScrollIntoViewOptions(options);
-  Compositor().BeginFrame();
-  ASSERT_EQ(Window().scrollY(), 0);
-  ASSERT_EQ(container->scrollTop(), 0);
-
-  content->scrollIntoView(arg);
-  // Scrolling the outer container
-  Compositor().BeginFrame();  // update run_state_.
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(Window().scrollY(), 299);
-  ASSERT_EQ(container->scrollTop(), 0);
-
-  // Finish scrolling the outer container
-  Compositor().BeginFrame(1);
-  ASSERT_EQ(Window().scrollY(), container->OffsetTop());
-  ASSERT_EQ(container->scrollTop(), 0);
-
-  // Scrolling the inner container
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(container->scrollTop(), 299);
-
-  // Finish scrolling the inner container
-  Compositor().BeginFrame(1);
-  ASSERT_EQ(container->scrollTop(),
-            content->OffsetTop() - container->OffsetTop());
-}
-
-TEST_F(SmoothScrollTest, NewScrollIntoViewAbortsCurrentAnimation) {
-  v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
-  WebView().Resize(WebSize(800, 600));
-  SimRequest request("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-  request.Complete(
-      "<div id='container2' style='height: 1000px; overflow: scroll'>"
-      "  <div id='space2' style='height: 1200px'></div>"
-      "  <div id='content2' style='height: 1000px'></div>"
-      "</div>"
-      "<div id='container1' style='height: 600px; overflow: scroll'>"
-      "  <div id='space1' style='height: 1000px'></div>"
-      "  <div id='content1' style='height: 1000px'></div>"
-      "</div>");
-
-  Element* container1 = GetDocument().getElementById("container1");
-  Element* container2 = GetDocument().getElementById("container2");
-  Element* content1 = GetDocument().getElementById("content1");
-  Element* content2 = GetDocument().getElementById("content2");
-  ScrollIntoViewOptionsOrBoolean arg;
-  ScrollIntoViewOptions options;
-  options.setBlock("start");
-  options.setBehavior("smooth");
-  arg.setScrollIntoViewOptions(options);
-
-  Compositor().BeginFrame();
-  ASSERT_EQ(Window().scrollY(), 0);
-  ASSERT_EQ(container1->scrollTop(), 0);
-  ASSERT_EQ(container2->scrollTop(), 0);
-
-  content1->scrollIntoView(arg);
-  Compositor().BeginFrame();  // update run_state_.
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(Window().scrollY(), 299);
-  ASSERT_EQ(container1->scrollTop(), 0);
-
-  content2->scrollIntoView(arg);
-  Compositor().BeginFrame();  // update run_state_.
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(Window().scrollY(), 61);
-  ASSERT_EQ(container1->scrollTop(), 0);  // container1 should not scroll.
-
-  Compositor().BeginFrame(1);
-  ASSERT_EQ(Window().scrollY(), container2->OffsetTop());
-  ASSERT_EQ(container2->scrollTop(), 0);
-
-  // Scrolling content2 in container2
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(container2->scrollTop(), 300);
-
-  // Finish all the animation to make sure there is no another animation queued
-  // on container1.
-  while (Compositor().NeedsBeginFrame()) {
-    Compositor().BeginFrame();
-  }
-  ASSERT_EQ(Window().scrollY(), container2->OffsetTop());
-  ASSERT_EQ(container2->scrollTop(),
-            content2->OffsetTop() - container2->OffsetTop());
-  ASSERT_EQ(container1->scrollTop(), 0);
-}
-
-TEST_F(SmoothScrollTest, ScrollWindowAbortsCurrentAnimation) {
-  v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
-  WebView().Resize(WebSize(800, 600));
-  SimRequest request("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-  request.Complete(
-      "<div id='space' style='height: 1000px'></div>"
-      "<div id='container' style='height: 600px; overflow: scroll'>"
-      "  <div id='space1' style='height: 1000px'></div>"
-      "  <div id='content' style='height: 1000px'></div>"
-      "</div>");
-
-  Element* container = GetDocument().getElementById("container");
-  Element* content = GetDocument().getElementById("content");
-  ScrollIntoViewOptionsOrBoolean arg;
-  ScrollIntoViewOptions options;
-  options.setBlock("start");
-  options.setBehavior("smooth");
-  arg.setScrollIntoViewOptions(options);
-  Compositor().BeginFrame();
-  ASSERT_EQ(Window().scrollY(), 0);
-  ASSERT_EQ(container->scrollTop(), 0);
-
-  content->scrollIntoView(arg);
-  // Scrolling the outer container
-  Compositor().BeginFrame();  // update run_state_.
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(Window().scrollY(), 299);
-  ASSERT_EQ(container->scrollTop(), 0);
-
-  ScrollToOptions window_option;
-  window_option.setLeft(0);
-  window_option.setTop(0);
-  window_option.setBehavior("smooth");
-  Window().scrollTo(window_option);
-  Compositor().BeginFrame();  // update run_state_.
-  Compositor().BeginFrame();  // Set start_time = now.
-  Compositor().BeginFrame(0.2);
-  ASSERT_EQ(Window().scrollY(), 58);
-
-  Compositor().BeginFrame(1);
-  ASSERT_EQ(Window().scrollY(), 0);
-  ASSERT_EQ(container->scrollTop(), 0);
-}
-
-TEST_F(SmoothScrollTest, BlockAndInlineSettings) {
-  v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
-  WebView().Resize(WebSize(800, 600));
-  SimRequest request("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-  request.Complete(
-      "<div id='container' style='height: 2500px; width: 2500px;'>"
-      "<div id='content' style='height: 500px; width: 500px;"
-      "margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;"
-      "margin-bottom: 1000px'></div></div>");
-
-  int content_height = 500;
-  int content_width = 500;
-  int window_height = 600;
-  int window_width = 800;
-
-  Element* content = GetDocument().getElementById("content");
-  ScrollIntoViewOptionsOrBoolean arg1, arg2, arg3, arg4;
-  ScrollIntoViewOptions options;
-  ASSERT_EQ(Window().scrollY(), 0);
-
-  options.setBlock("nearest");
-  options.setInlinePosition("nearest");
-  arg1.setScrollIntoViewOptions(options);
-  content->scrollIntoView(arg1);
-  ASSERT_EQ(Window().scrollX(),
-            content->OffsetLeft() + content_width - window_width);
-  ASSERT_EQ(Window().scrollY(),
-            content->OffsetTop() + content_height - window_height);
-
-  options.setBlock("start");
-  options.setInlinePosition("start");
-  arg2.setScrollIntoViewOptions(options);
-  content->scrollIntoView(arg2);
-  ASSERT_EQ(Window().scrollX(), content->OffsetLeft());
-  ASSERT_EQ(Window().scrollY(), content->OffsetTop());
-
-  options.setBlock("center");
-  options.setInlinePosition("center");
-  arg3.setScrollIntoViewOptions(options);
-  content->scrollIntoView(arg3);
-  ASSERT_EQ(Window().scrollX(),
-            content->OffsetLeft() + (content_width - window_width) / 2);
-  ASSERT_EQ(Window().scrollY(),
-            content->OffsetTop() + (content_height - window_height) / 2);
-
-  options.setBlock("end");
-  options.setInlinePosition("end");
-  arg4.setScrollIntoViewOptions(options);
-  content->scrollIntoView(arg4);
-  ASSERT_EQ(Window().scrollX(),
-            content->OffsetLeft() + content_width - window_width);
-  ASSERT_EQ(Window().scrollY(),
-            content->OffsetTop() + content_height - window_height);
-}
-
-}  // namespace
-
-}  // namespace blink
diff --git a/third_party/WebKit/public/web/WebPageImportanceSignals.h b/third_party/WebKit/public/web/WebPageImportanceSignals.h
index e9aab4b..f1983b9 100644
--- a/third_party/WebKit/public/web/WebPageImportanceSignals.h
+++ b/third_party/WebKit/public/web/WebPageImportanceSignals.h
@@ -19,15 +19,15 @@
   WebPageImportanceSignals() { Reset(); }
 
   bool HadFormInteraction() const { return had_form_interaction_; }
-  void SetHadFormInteraction();
+  BLINK_EXPORT void SetHadFormInteraction();
   bool IssuedNonGetFetchFromScript() const {
     return issued_non_get_fetch_from_script_;
   }
-  void SetIssuedNonGetFetchFromScript();
+  BLINK_EXPORT void SetIssuedNonGetFetchFromScript();
 
   BLINK_EXPORT void Reset();
 #if BLINK_IMPLEMENTATION
-  void OnCommitLoad();
+  BLINK_EXPORT void OnCommitLoad();
 #endif
 
   void SetObserver(WebViewClient* observer) { observer_ = observer; }
diff --git a/third_party/polymer/README.chromium b/third_party/polymer/README.chromium
index 1e601cd1..40a1a74 100644
--- a/third_party/polymer/README.chromium
+++ b/third_party/polymer/README.chromium
@@ -1,7 +1,7 @@
 Name: Polymer
 Short Name: polymer
 URL: http://www.polymer-project.org
-Version: 1.5.2
+Version: 1.9.1
 Revision: (see v1_0/components_summary.txt)
 License: BSD
 License File: LICENSE.polymer
diff --git a/third_party/polymer/v1_0/bower.json b/third_party/polymer/v1_0/bower.json
index 9f3f0ec..6f6c80a 100644
--- a/third_party/polymer/v1_0/bower.json
+++ b/third_party/polymer/v1_0/bower.json
@@ -60,7 +60,7 @@
     "paper-toggle-button": "PolymerElements/paper-toggle-button#1.3.0",
     "paper-toolbar": "PolymerElements/paper-toolbar#1.1.6",
     "paper-tooltip": "PolymerElements/paper-tooltip#1.1.3",
-    "polymer": "Polymer/polymer#1.8.1",
+    "polymer": "Polymer/polymer#1.9.1",
     "web-animations-js": "web-animations/web-animations-js#2.2.2"
   }
 }
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/bower.json b/third_party/polymer/v1_0/components-chromium/polymer/bower.json
index 41962a4..c49ba078 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/polymer/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "polymer",
-  "version": "1.8.1",
+  "version": "1.9.1",
   "main": [
     "polymer.html",
     "polymer-mini.html",
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
index 0a223a3..8558fbdc 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
@@ -241,65 +241,6 @@
 }
 }
 };
-}());(function () {
-function resolveCss(cssText, ownerDocument) {
-return cssText.replace(CSS_URL_RX, function (m, pre, url, post) {
-return pre + '\'' + resolve(url.replace(/["']/g, ''), ownerDocument) + '\'' + post;
-});
-}
-function resolveAttrs(element, ownerDocument) {
-for (var name in URL_ATTRS) {
-var a$ = URL_ATTRS[name];
-for (var i = 0, l = a$.length, a, at, v; i < l && (a = a$[i]); i++) {
-if (name === '*' || element.localName === name) {
-at = element.attributes[a];
-v = at && at.value;
-if (v && v.search(BINDING_RX) < 0) {
-at.value = a === 'style' ? resolveCss(v, ownerDocument) : resolve(v, ownerDocument);
-}
-}
-}
-}
-}
-function resolve(url, ownerDocument) {
-if (url && ABS_URL.test(url)) {
-return url;
-}
-var resolver = getUrlResolver(ownerDocument);
-resolver.href = url;
-return resolver.href || url;
-}
-var tempDoc;
-var tempDocBase;
-function resolveUrl(url, baseUri) {
-if (!tempDoc) {
-tempDoc = document.implementation.createHTMLDocument('temp');
-tempDocBase = tempDoc.createElement('base');
-tempDoc.head.appendChild(tempDocBase);
-}
-tempDocBase.href = baseUri;
-return resolve(url, tempDoc);
-}
-function getUrlResolver(ownerDocument) {
-return ownerDocument.body.__urlResolver || (ownerDocument.body.__urlResolver = ownerDocument.createElement('a'));
-}
-var CSS_URL_RX = /(url\()([^)]*)(\))/g;
-var URL_ATTRS = {
-'*': [
-'href',
-'src',
-'style',
-'url'
-],
-form: ['action']
-};
-var ABS_URL = /(^\/)|(^#)|(^[\w-\d]*:)/;
-var BINDING_RX = /\{\{|\[\[/;
-Polymer.ResolveUrl = {
-resolveCss: resolveCss,
-resolveAttrs: resolveAttrs,
-resolveUrl: resolveUrl
-};
 }());Polymer.Path = {
 root: function (path) {
 var dotIndex = path.indexOf('.');
@@ -2085,6 +2026,8 @@
 }
 },
 _afterClientsReady: function () {
+this.importPath = this._importPath;
+this.rootPath = Polymer.rootPath;
 this._executeStaticEffects();
 this._applyConfig(this._config, this._aboveConfig);
 this._flushHandlers();
@@ -2423,13 +2366,7 @@
 });
 }());Polymer.Base._addFeature({
 resolveUrl: function (url) {
-var module = Polymer.DomModule.import(this.is);
-var root = '';
-if (module) {
-var assetPath = module.getAttribute('assetpath') || '';
-root = Polymer.ResolveUrl.resolveUrl(assetPath, module.ownerDocument.baseURI);
-}
-return Polymer.ResolveUrl.resolveUrl(url, root);
+return Polymer.ResolveUrl.resolveUrl(url, this._importPath);
 }
 });Polymer.CssParse = function () {
 return {
@@ -4754,9 +4691,17 @@
 attached: function () {
 if (this.__isDetached) {
 this.__isDetached = false;
-var parent = Polymer.dom(Polymer.dom(this).parentNode);
+var refNode;
+var parentNode = Polymer.dom(this).parentNode;
+if (parentNode.localName == this.is) {
+refNode = parentNode;
+parentNode = Polymer.dom(parentNode).parentNode;
+} else {
+refNode = this;
+}
+var parent = Polymer.dom(parentNode);
 for (var i = 0; i < this._instances.length; i++) {
-this._attachInstance(i, parent);
+this._attachInstance(i, parent, refNode);
 }
 }
 },
@@ -5040,10 +4985,10 @@
 return inst;
 }
 },
-_attachInstance: function (idx, parent) {
+_attachInstance: function (idx, parent, refNode) {
 var inst = this._instances[idx];
 if (!inst.isPlaceholder) {
-parent.insertBefore(inst.root, this);
+parent.insertBefore(inst.root, refNode);
 }
 },
 _detachAndRemoveInstance: function (idx) {
@@ -5076,6 +5021,12 @@
 var beforeRow = this._instances[idx + 1];
 var beforeNode = beforeRow && !beforeRow.isPlaceholder ? beforeRow._children[0] : this;
 var parentNode = Polymer.dom(this).parentNode;
+if (parentNode.localName == this.is) {
+if (beforeNode == this) {
+beforeNode = parentNode;
+}
+parentNode = Polymer.dom(parentNode).parentNode;
+}
 Polymer.dom(parentNode).insertBefore(inst.root, beforeNode);
 this._instances[idx] = inst;
 return inst;
@@ -5271,7 +5222,11 @@
 this._debounceTemplate(this._render);
 },
 detached: function () {
-if (!this.parentNode || this.parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE && (!Polymer.Settings.hasShadow || !(this.parentNode instanceof ShadowRoot))) {
+var parentNode = this.parentNode;
+if (parentNode && parentNode.localName == this.is) {
+parentNode = Polymer.dom(parentNode).parentNode;
+}
+if (!parentNode || parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE && (!Polymer.Settings.hasShadow || !(parentNode instanceof ShadowRoot))) {
 this._teardownInstance();
 }
 },
@@ -5304,20 +5259,26 @@
 }
 },
 _ensureInstance: function () {
+var refNode;
 var parentNode = Polymer.dom(this).parentNode;
+if (parentNode && parentNode.localName == this.is) {
+refNode = parentNode;
+parentNode = Polymer.dom(parentNode).parentNode;
+} else {
+refNode = this;
+}
 if (parentNode) {
-var parent = Polymer.dom(parentNode);
 if (!this._instance) {
 this._instance = this.stamp();
 var root = this._instance.root;
-parent.insertBefore(root, this);
+Polymer.dom(parentNode).insertBefore(root, refNode);
 } else {
 var c$ = this._instance._children;
 if (c$ && c$.length) {
-var lastChild = Polymer.dom(this).previousSibling;
+var lastChild = Polymer.dom(refNode).previousSibling;
 if (lastChild !== c$[c$.length - 1]) {
 for (var i = 0, n; i < c$.length && (n = c$[i]); i++) {
-parent.insertBefore(n, this);
+Polymer.dom(parentNode).insertBefore(n, refNode);
 }
 }
 }
@@ -5382,8 +5343,15 @@
 this._prepConstructor();
 },
 _insertChildren: function () {
-var parentDom = Polymer.dom(Polymer.dom(this).parentNode);
-parentDom.insertBefore(this.root, this);
+var refNode;
+var parentNode = Polymer.dom(this).parentNode;
+if (parentNode.localName == this.is) {
+refNode = parentNode;
+parentNode = Polymer.dom(parentNode).parentNode;
+} else {
+refNode = this;
+}
+Polymer.dom(parentNode).insertBefore(this.root, refNode);
 },
 _removeChildren: function () {
 if (this._children) {
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
index 40fa73f..b3e3aa0 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
@@ -782,7 +782,7 @@
 return value != null ? value : undefined;
 }
 }
-});Polymer.version = "1.8.1";Polymer.Base._addFeature({
+});Polymer.version = "1.9.1";Polymer.Base._addFeature({
 _registerFeatures: function () {
 this._prepIs();
 this._prepBehaviors();
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
index 143aa7a3..1d21ad1 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
@@ -1,7 +1,80 @@
-Polymer.Base._addFeature({
+(function () {
+function resolveCss(cssText, ownerDocument) {
+return cssText.replace(CSS_URL_RX, function (m, pre, url, post) {
+return pre + '\'' + resolve(url.replace(/["']/g, ''), ownerDocument) + '\'' + post;
+});
+}
+function resolveAttrs(element, ownerDocument) {
+for (var name in URL_ATTRS) {
+var a$ = URL_ATTRS[name];
+for (var i = 0, l = a$.length, a, at, v; i < l && (a = a$[i]); i++) {
+if (name === '*' || element.localName === name) {
+at = element.attributes[a];
+v = at && at.value;
+if (v && v.search(BINDING_RX) < 0) {
+at.value = a === 'style' ? resolveCss(v, ownerDocument) : resolve(v, ownerDocument);
+}
+}
+}
+}
+}
+function resolve(url, ownerDocument) {
+if (url && ABS_URL.test(url)) {
+return url;
+}
+var resolver = getUrlResolver(ownerDocument);
+resolver.href = url;
+return resolver.href || url;
+}
+var tempDoc;
+var tempDocBase;
+function resolveUrl(url, baseUri) {
+if (!tempDoc) {
+tempDoc = document.implementation.createHTMLDocument('temp');
+tempDocBase = tempDoc.createElement('base');
+tempDoc.head.appendChild(tempDocBase);
+}
+tempDocBase.href = baseUri;
+return resolve(url, tempDoc);
+}
+function getUrlResolver(ownerDocument) {
+return ownerDocument.body.__urlResolver || (ownerDocument.body.__urlResolver = ownerDocument.createElement('a'));
+}
+function pathFromUrl(url) {
+return url.substring(0, url.lastIndexOf('/') + 1);
+}
+var CSS_URL_RX = /(url\()([^)]*)(\))/g;
+var URL_ATTRS = {
+'*': [
+'href',
+'src',
+'style',
+'url'
+],
+form: ['action']
+};
+var ABS_URL = /(^\/)|(^#)|(^[\w-\d]*:)/;
+var BINDING_RX = /\{\{|\[\[/;
+Polymer.ResolveUrl = {
+resolveCss: resolveCss,
+resolveAttrs: resolveAttrs,
+resolveUrl: resolveUrl,
+pathFromUrl: pathFromUrl
+};
+Polymer.rootPath = Polymer.Settings.rootPath || pathFromUrl(document.baseURI || window.location.href);
+}());Polymer.Base._addFeature({
 _prepTemplate: function () {
+var module;
 if (this._template === undefined) {
-this._template = Polymer.DomModule.import(this.is, 'template');
+module = Polymer.DomModule.import(this.is);
+this._template = module && module.querySelector('template');
+}
+if (module) {
+var assetPath = module.getAttribute('assetpath') || '';
+var importURL = Polymer.ResolveUrl.resolveUrl(assetPath, module.ownerDocument.baseURI);
+this._importPath = Polymer.ResolveUrl.pathFromUrl(importURL);
+} else {
+this._importPath = '';
 }
 if (this._template && this._template.hasAttribute('is')) {
 this._warn(this._logf('_prepTemplate', 'top-level Polymer template ' + 'must not be a type-extension, found', this._template, 'Move inside simple <template>.'));
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt
index 4ab9fb5..297737c 100644
--- a/third_party/polymer/v1_0/components_summary.txt
+++ b/third_party/polymer/v1_0/components_summary.txt
@@ -348,7 +348,7 @@
 
 Name: polymer
 Repository: https://github.com/Polymer/polymer.git
-Tree: v1.8.1
-Revision: d89302fc3755b04ad4171f431e719a08b5b816f3
-Tree link: https://github.com/Polymer/polymer/tree/v1.8.1
+Tree: v1.9.1
+Revision: 9f3381a3d92c62d64cbf0296f7c967898a30d63d
+Tree link: https://github.com/Polymer/polymer/tree/v1.9.1
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 7d0095a..2013e30f 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -137,10 +137,11 @@
 
       # if CrWinClang is modified, please update CrWinClangGoma in the same way.
       'CrWinClang': 'clang_official_release_bot_minimal_symbols_x86',
-
       'CrWinClang(dbg)': 'clang_debug_bot_minimal_symbols_x86',
+      'CrWinClang(shared)': 'clang_minimal_symbols_shared_release_bot_x86',
       'CrWinClang64': 'clang_official_release_bot_minimal_symbols',
       'CrWinClang64(dll)': 'clang_shared_release_bot',
+      'CrWinClang64(dbg)': 'win_clang_debug_bot',
       'CrWinClangGoma': 'clang_official_optimize_release_bot_minimal_symbols_x86',
       'CrWinGoma': 'release_bot_x86',
       'CrWinGoma(dll)': 'shared_release_bot_x86',
@@ -170,8 +171,6 @@
       'CrWinAsan': 'asan_clang_fuzzer_static_v8_heap_x86_full_symbols_release',
       'CrWinAsan(dll)': 'asan_clang_shared_v8_heap_x86_full_symbols_release',
       'CrWinAsanCov': 'asan_clang_edge_fuzzer_static_v8_heap_x86_full_symbols_release',
-      'CrWinClang(shared)': 'clang_minimal_symbols_shared_release_bot_x86',
-      'CrWinClang64(dbg)': 'win_clang_debug_bot',
       'CrWinClangLLD': 'clang_tot_official_static_use_lld_x86',
       'CrWinClangLLD64': 'clang_tot_shared_release_use_lld',
       'CrWinClngLLD64dbg': 'clang_tot_full_symbols_shared_debug_use_lld',
@@ -1040,7 +1039,10 @@
     ],
 
     'clang_debug_bot_minimal_symbols_x86': [
-      'clang', 'debug_bot', 'minimal_symbols', 'x86',
+      # Now that the default win bots use clang, use a "clang" bot to make sure
+      # things stay compilable with msvc. TODO(thakis): Having a "clang" bot
+      # check that is very confusing, so rename the bot to "msvc".
+      'no_clang', 'debug_bot', 'minimal_symbols', 'x86',
     ],
 
     'clang_release_bot_minimal_symbols_x86': [
@@ -1048,15 +1050,24 @@
     ],
 
     'clang_minimal_symbols_shared_release_bot_x86': [
-      'clang', 'minimal_symbols', 'shared_release_bot', 'x86',
+      # Now that the default win bots use clang, use a "clang" bot to make sure
+      # things stay compilable with msvc. TODO(thakis): Having a "clang" bot
+      # check that is very confusing, so rename the bot to "msvc".
+      'no_clang', 'minimal_symbols', 'shared_release_bot', 'x86',
     ],
 
     'clang_official_release_bot_minimal_symbols': [
-      'clang', 'official', 'release_bot', 'minimal_symbols',
+      # Now that the default win bots use clang, use a "clang" bot to make sure
+      # things stay compilable with msvc. TODO(thakis): Having a "clang" bot
+      # check that is very confusing, so rename the bot to "msvc".
+      'no_clang', 'official', 'release_bot', 'minimal_symbols',
     ],
 
     'clang_official_release_bot_minimal_symbols_x86': [
-      'clang', 'official', 'release_bot', 'minimal_symbols', 'x86',
+      # Now that the default win bots use clang, use a "clang" bot to make sure
+      # things stay compilable with msvc. TODO(thakis): Having a "clang" bot
+      # check that is very confusing, so rename the bot to "msvc".
+      'no_clang', 'official', 'release_bot', 'minimal_symbols', 'x86',
     ],
 
     'clang_official_optimize_release_bot_minimal_symbols_x86': [
@@ -1072,7 +1083,10 @@
     ],
 
     'clang_shared_release_bot': [
-      'clang', 'shared_release_bot',
+      # Now that the default win bots use clang, use a "clang" bot to make sure
+      # things stay compilable with msvc. TODO(thakis): Having a "clang" bot
+      # check that is very confusing, so rename the bot to "msvc".
+      'no_clang', 'shared_release_bot',
     ],
 
     'clang_tot_asan_lsan_static_release': [
@@ -1473,7 +1487,10 @@
     ],
 
     'win_clang_debug_bot': [
-      'clang', 'debug_bot', 'minimal_symbols',
+      # Now that the default win bots use clang, use a "clang" bot to make sure
+      # things stay compilable with msvc. TODO(thakis): Having a "clang" bot
+      # check that is very confusing, so rename the bot to "msvc".
+      'no_clang', 'debug_bot', 'minimal_symbols',
     ],
 
     'windows_analyze': [
@@ -1563,11 +1580,11 @@
     },
 
     'chrome_pgo_phase_1': {
-      'gn_args': 'chrome_pgo_phase=1',
+      'gn_args': 'chrome_pgo_phase=1 is_clang=false',
     },
 
     'chrome_pgo_phase_2': {
-      'gn_args': 'chrome_pgo_phase=2',
+      'gn_args': 'chrome_pgo_phase=2 is_clang=false',
     },
 
     'chrome_with_codecs': {
@@ -1595,6 +1612,10 @@
       'gn_args': 'is_clang=true',
     },
 
+    'no_clang': {
+      'gn_args': 'is_clang=false',
+    },
+
     'cronet': {
       'gn_args': ('disable_file_support=true disable_ftp_support=true '
                   'enable_websockets=false use_platform_icu_alternatives=true '
@@ -1839,7 +1860,8 @@
     },
 
     'syzyasan': {
-      'gn_args': 'is_syzyasan=true',
+      # TODO(thakis): Figure out SyzyASan + clang story.
+      'gn_args': 'is_syzyasan=true is_clang=false',
     },
 
     'thin_lto': {