diff --git a/DEPS b/DEPS
index 54b3ee98..1e33a23 100644
--- a/DEPS
+++ b/DEPS
@@ -92,7 +92,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '66725768cdf758cfb3f9abf03cbf5e5a77f42088',
+  'freetype_revision': '5a3490e054bda8a318ebde482c7fb30213cab3d9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
@@ -232,7 +232,7 @@
     Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067',
 
   'src/third_party/webrtc':
-    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '4b544defc44efd77c96a63c199c7edbda8e7e69c', # commit position 17592
+    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '19ef130fe788d5d0471fa1b301cd622ae73666b7', # commit position 17638
 
   'src/third_party/openmax_dl':
     Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 39ab003..791278ea 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1276,8 +1276,10 @@
     "subresource_filter/chrome_subresource_filter_client.h",
     "subresource_filter/navigation_throttle_util.cc",
     "subresource_filter/navigation_throttle_util.h",
-    "subresource_filter/subresource_filter_content_settings_observer_factory.cc",
-    "subresource_filter/subresource_filter_content_settings_observer_factory.h",
+    "subresource_filter/subresource_filter_content_settings_manager.cc",
+    "subresource_filter/subresource_filter_content_settings_manager.h",
+    "subresource_filter/subresource_filter_content_settings_manager_factory.cc",
+    "subresource_filter/subresource_filter_content_settings_manager_factory.h",
     "sync/chrome_sync_client.cc",
     "sync/chrome_sync_client.h",
     "sync/glue/extensions_activity_monitor.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index ffd283c..d689ae41 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -28,7 +28,6 @@
 #include "cc/base/switches.h"
 #include "chrome/browser/flag_descriptions.h"
 #include "chrome/browser/ntp_snippets/ntp_snippets_features.h"
-#include "chrome/browser/page_load_metrics/experiments/delay_navigation_throttle.h"
 #include "chrome/browser/predictors/resource_prefetch_common.h"
 #include "chrome/browser/prerender/prerender_field_trial.h"
 #include "chrome/common/channel_info.h"
@@ -807,27 +806,6 @@
      arraysize(kUseNewDoodleApiTest8), nullptr}};
 #endif  // OS_ANDROID
 
-const FeatureEntry::FeatureParam kDelayNavigation5SecondDelay[] = {
-    {DelayNavigationThrottle::kParamDelayNavigationDurationMillis, "5000"},
-    {DelayNavigationThrottle::kParamDelayNavigationProbability, "1"}};
-
-const FeatureEntry::FeatureParam kDelayNavigation5SecondDelay25Percent[] = {
-    {DelayNavigationThrottle::kParamDelayNavigationDurationMillis, "5000"},
-    {DelayNavigationThrottle::kParamDelayNavigationProbability, "0.25"}};
-
-const FeatureEntry::FeatureParam kDelayNavigation5SecondDelayRandomize[] = {
-    {DelayNavigationThrottle::kParamDelayNavigationDurationMillis, "5000"},
-    {DelayNavigationThrottle::kParamDelayNavigationProbability, "1"},
-    {DelayNavigationThrottle::kParamDelayNavigationRandomize, "true"}};
-
-const FeatureEntry::FeatureVariation kDelayNavigationFeatureVariations[] = {
-    {"(5 second delay, 100% probability)", kDelayNavigation5SecondDelay,
-     arraysize(kDelayNavigation5SecondDelay), nullptr},
-    {"(5 second delay, 25% probability)", kDelayNavigation5SecondDelay25Percent,
-     arraysize(kDelayNavigation5SecondDelay25Percent), nullptr},
-    {"(0-5 second randomized delay)", kDelayNavigation5SecondDelayRandomize,
-     arraysize(kDelayNavigation5SecondDelayRandomize), nullptr}};
-
 #if defined(OS_ANDROID)
 const FeatureEntry::FeatureParam kPersistentMenuItemEnabled[] = {
     {"persistent_menu_item_enabled", "true"}};
@@ -2591,12 +2569,6 @@
                                     chrome::android::kUseNewDoodleApi.name)},
 #endif  // OS_ANDROID
 
-    {"delay-navigation", flag_descriptions::kDelayNavigationName,
-     flag_descriptions::kDelayNavigationDescription, kOsAll,
-     FEATURE_WITH_PARAMS_VALUE_TYPE(kDelayNavigationFeature,
-                                    kDelayNavigationFeatureVariations,
-                                    "DelayNavigation")},
-
 #if defined(OS_ANDROID)
     {"enable-custom-context-menu",
      flag_descriptions::kEnableCustomContextMenuName,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index e549841b..ce91c78 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -176,6 +176,8 @@
     "app_mode/app_launch_utils.h",
     "app_mode/app_session.cc",
     "app_mode/app_session.h",
+    "app_mode/arc/arc_kiosk_app_data.cc",
+    "app_mode/arc/arc_kiosk_app_data.h",
     "app_mode/arc/arc_kiosk_app_launcher.cc",
     "app_mode/arc/arc_kiosk_app_launcher.h",
     "app_mode/arc/arc_kiosk_app_manager.cc",
@@ -188,9 +190,13 @@
     "app_mode/certificate_manager_dialog.h",
     "app_mode/kiosk_app_data.cc",
     "app_mode/kiosk_app_data.h",
+    "app_mode/kiosk_app_data_base.cc",
+    "app_mode/kiosk_app_data_base.h",
     "app_mode/kiosk_app_data_delegate.h",
     "app_mode/kiosk_app_external_loader.cc",
     "app_mode/kiosk_app_external_loader.h",
+    "app_mode/kiosk_app_icon_loader.cc",
+    "app_mode/kiosk_app_icon_loader.h",
     "app_mode/kiosk_app_launch_error.cc",
     "app_mode/kiosk_app_launch_error.h",
     "app_mode/kiosk_app_manager.cc",
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.cc
new file mode 100644
index 0000000..0fd43e7
--- /dev/null
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.cc
@@ -0,0 +1,82 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.h"
+
+#include <utility>
+
+#include "base/path_service.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
+#include "chrome/common/chrome_paths.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/scoped_user_pref_update.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace chromeos {
+
+namespace {
+
+constexpr char kIconCacheDir[] = "arc-kiosk/icon";
+
+}  // namespace
+
+ArcKioskAppData::ArcKioskAppData(const std::string& app_id,
+                                 const AccountId& account_id,
+                                 const std::string& name)
+    : KioskAppDataBase(ArcKioskAppManager::kArcKioskDictionaryName,
+                       app_id,
+                       account_id) {
+  name_ = name;
+}
+
+ArcKioskAppData::~ArcKioskAppData() = default;
+
+bool ArcKioskAppData::operator==(const std::string& other_app_id) const {
+  return app_id() == other_app_id;
+}
+
+bool ArcKioskAppData::LoadFromCache() {
+  PrefService* local_state = g_browser_process->local_state();
+  const base::DictionaryValue* dict =
+      local_state->GetDictionary(dictionary_name());
+
+  return LoadFromDictionary(*dict);
+}
+
+void ArcKioskAppData::SetCache(const std::string& name,
+                               const gfx::ImageSkia& icon) {
+  DCHECK(!name.empty());
+  DCHECK(!icon.isNull());
+  name_ = name;
+  icon_ = icon;
+
+  base::FilePath user_data_dir;
+  if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) {
+    LOG(ERROR) << "Failed to get user directory.";
+    return;
+  }
+  base::FilePath cache_dir = user_data_dir.AppendASCII(kIconCacheDir);
+
+  SaveIcon(*icon_.bitmap(), cache_dir);
+
+  PrefService* local_state = g_browser_process->local_state();
+  DictionaryPrefUpdate dict_update(local_state, dictionary_name());
+
+  SaveToDictionary(dict_update);
+}
+
+void ArcKioskAppData::OnIconLoadSuccess(const gfx::ImageSkia& icon) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  kiosk_app_icon_loader_.release();
+  icon_ = icon;
+}
+
+void ArcKioskAppData::OnIconLoadFailure() {
+  kiosk_app_icon_loader_.release();
+  LOG(ERROR) << "Icon Load Failure";
+  // Do nothing
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.h b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.h
new file mode 100644
index 0000000..428af43c
--- /dev/null
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.h
@@ -0,0 +1,47 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_ARC_ARC_KIOSK_APP_DATA_H_
+#define CHROME_BROWSER_CHROMEOS_APP_MODE_ARC_ARC_KIOSK_APP_DATA_H_
+
+#include <string>
+
+#include "base/files/file_path.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/app_mode/kiosk_app_data_base.h"
+#include "components/signin/core/account_id/account_id.h"
+#include "ui/gfx/image/image_skia.h"
+
+namespace chromeos {
+
+// Fetches from Android side and caches ARC kiosk app data such as name and
+// icon.
+class ArcKioskAppData : public KioskAppDataBase {
+ public:
+  ArcKioskAppData(const std::string& app_id,
+                  const AccountId& account_id,
+                  const std::string& name);
+  ~ArcKioskAppData() override;
+
+  // TODO(poromov@): Use appropriate app id http://crbug.com/665904
+  // Currently app_id is always package_name.
+  bool operator==(const std::string& other_app_id) const;
+
+  // Loads the locally cached data. Return false if there is none.
+  bool LoadFromCache();
+
+  // Sets the cached data.
+  void SetCache(const std::string& name, const gfx::ImageSkia& icon);
+
+  // Callbacks for KioskAppIconLoader.
+  void OnIconLoadSuccess(const gfx::ImageSkia& icon) override;
+  void OnIconLoadFailure() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ArcKioskAppData);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_APP_MODE_ARC_ARC_KIOSK_APP_DATA_H_
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc
index 6687d28f..6a4426e 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc
@@ -12,6 +12,7 @@
 #include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
@@ -96,7 +97,11 @@
 }  // namespace
 
 // static
+const char ArcKioskAppManager::kArcKioskDictionaryName[] = "arc-kiosk";
+
+// static
 void ArcKioskAppManager::RegisterPrefs(PrefRegistrySimple* registry) {
+  registry->RegisterDictionaryPref(kArcKioskDictionaryName);
   registry->RegisterListPref(kArcKioskUsersToRemove);
 }
 
@@ -108,22 +113,6 @@
       base::Bind(&PerformDelayedCryptohomeRemovals));
 }
 
-ArcKioskAppManager::ArcKioskApp::ArcKioskApp(const ArcKioskApp& other) =
-    default;
-
-ArcKioskAppManager::ArcKioskApp::ArcKioskApp(
-    const policy::ArcKioskAppBasicInfo& app_info,
-    const AccountId& account_id,
-    const std::string& name)
-    : app_info_(app_info), account_id_(account_id), name_(name) {}
-
-ArcKioskAppManager::ArcKioskApp::~ArcKioskApp() = default;
-
-bool ArcKioskAppManager::ArcKioskApp::operator==(
-    const policy::ArcKioskAppBasicInfo& app_info) const {
-  return this->app_info_ == app_info;
-}
-
 // static
 ArcKioskAppManager* ArcKioskAppManager::Get() {
   return g_arc_kiosk_app_manager;
@@ -154,14 +143,33 @@
   return auto_launch_account_id_;
 }
 
-const ArcKioskAppManager::ArcKioskApp* ArcKioskAppManager::GetAppByAccountId(
+const ArcKioskAppData* ArcKioskAppManager::GetAppByAccountId(
     const AccountId& account_id) {
-  for (auto& app : GetAllApps())
-    if (app.account_id() == account_id)
-      return &app;
+  for (auto& app : apps_) {
+    if (app->account_id() == account_id)
+      return app.get();
+  }
   return nullptr;
 }
 
+void ArcKioskAppManager::GetAllApps(Apps* apps) const {
+  apps->clear();
+  apps->reserve(apps_.size());
+  for (auto& app : apps_)
+    apps->push_back(app.get());
+}
+
+void ArcKioskAppManager::UpdateNameAndIcon(const std::string& app_id,
+                                           const std::string& name,
+                                           const gfx::ImageSkia& icon) {
+  for (auto& app : apps_) {
+    if (app->app_id() == app_id) {
+      app->SetCache(name, icon);
+      return;
+    }
+  }
+}
+
 void ArcKioskAppManager::AddObserver(ArcKioskAppManagerObserver* observer) {
   observers_.AddObserver(observer);
 }
@@ -181,8 +189,10 @@
 
   // Store current apps. We will compare old and new apps to determine which
   // apps are new, and which were deleted.
-  ArcKioskApps old_apps(std::move(apps_));
-
+  std::map<std::string, std::unique_ptr<ArcKioskAppData>> old_apps;
+  for (auto& app : apps_)
+    old_apps[app->app_id()] = std::move(app);
+  apps_.clear();
   auto_launch_account_id_.clear();
   auto_launched_with_zero_delay_ = false;
   std::string auto_login_account_id_from_settings;
@@ -206,18 +216,19 @@
       auto_launched_with_zero_delay_ = auto_launch_delay == 0;
     }
 
-    auto old_it =
-        std::find(old_apps.begin(), old_apps.end(), account.arc_kiosk_app_info);
+    // Apps are keyed by package name. http://crbug.com/665904
+    auto old_it = old_apps.find(account.arc_kiosk_app_info.package_name());
     if (old_it != old_apps.end()) {
-      apps_.push_back(std::move(*old_it));
+      apps_.push_back(std::move(old_it->second));
       old_apps.erase(old_it);
     } else {
       // Use package name when display name is not specified.
       std::string name = account.arc_kiosk_app_info.package_name();
       if (!account.arc_kiosk_app_info.display_name().empty())
         name = account.arc_kiosk_app_info.display_name();
-      apps_.push_back(
-          ArcKioskApp(account.arc_kiosk_app_info, account_id, name));
+      apps_.push_back(base::MakeUnique<ArcKioskAppData>(
+          account.arc_kiosk_app_info.package_name(), account_id, name));
+      apps_.back()->LoadFromCache();
     }
     CancelDelayedCryptohomeRemoval(cryptohome::Identification(account_id));
   }
@@ -230,7 +241,7 @@
 }
 
 void ArcKioskAppManager::ClearRemovedApps(
-    const std::vector<ArcKioskApp>& old_apps) {
+    const std::map<std::string, std::unique_ptr<ArcKioskAppData>>& old_apps) {
   // Check if currently active user must be deleted.
   bool active_user_to_be_deleted = false;
   const user_manager::User* active_user =
@@ -238,7 +249,7 @@
   if (active_user) {
     const AccountId active_account_id = active_user->GetAccountId();
     for (const auto& it : old_apps) {
-      if (it.account_id() == active_account_id) {
+      if (it.second->account_id() == active_account_id) {
         active_user_to_be_deleted = true;
         break;
       }
@@ -247,7 +258,8 @@
 
   // Remove cryptohome
   for (auto& entry : old_apps) {
-    const cryptohome::Identification cryptohome_id(entry.account_id());
+    entry.second->ClearCache();
+    const cryptohome::Identification cryptohome_id(entry.second->account_id());
     if (active_user_to_be_deleted) {
       // Schedule cryptohome removal after active user logout.
       ScheduleDelayedCryptohomeRemoval(cryptohome_id);
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h
index 2243e92..9023959 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "base/observer_list.h"
+#include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_data.h"
 #include "chrome/browser/chromeos/policy/device_local_account.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "components/signin/core/account_id/account_id.h"
@@ -25,30 +26,7 @@
 // creates a user in whose context the app then runs.
 class ArcKioskAppManager {
  public:
-  // Struct to hold full info about ARC Kiosk app. In future
-  // this structure may contain many extra fields, e.g. icon.
-  class ArcKioskApp {
-   public:
-    ArcKioskApp(const policy::ArcKioskAppBasicInfo& app_info,
-                const AccountId& account_id,
-                const std::string& name);
-    ArcKioskApp(const ArcKioskApp& other);
-    ~ArcKioskApp();
-
-    bool operator==(const std::string& app_id) const;
-    bool operator==(const policy::ArcKioskAppBasicInfo& app_info) const;
-
-    const policy::ArcKioskAppBasicInfo& app_info() const { return app_info_; }
-    const AccountId& account_id() const { return account_id_; }
-    const std::string& name() const { return name_; }
-
-   private:
-    policy::ArcKioskAppBasicInfo app_info_;
-    AccountId account_id_;
-    std::string name_;
-  };
-
-  using ArcKioskApps = std::vector<ArcKioskApp>;
+  using Apps = std::vector<ArcKioskAppData*>;
 
   class ArcKioskAppManagerObserver {
    public:
@@ -58,6 +36,8 @@
     virtual ~ArcKioskAppManagerObserver() = default;
   };
 
+  static const char kArcKioskDictionaryName[];
+
   static ArcKioskAppManager* Get();
 
   ArcKioskAppManager();
@@ -74,9 +54,13 @@
   const AccountId& GetAutoLaunchAccountId() const;
 
   // Returns app that should be started for given account id.
-  const ArcKioskApp* GetAppByAccountId(const AccountId& account_id);
+  const ArcKioskAppData* GetAppByAccountId(const AccountId& account_id);
 
-  const ArcKioskApps& GetAllApps() const { return apps_; }
+  void GetAllApps(Apps* apps) const;
+
+  void UpdateNameAndIcon(const std::string& app_id,
+                         const std::string& name,
+                         const gfx::ImageSkia& icon);
 
   void AddObserver(ArcKioskAppManagerObserver* observer);
   void RemoveObserver(ArcKioskAppManagerObserver* observer);
@@ -91,9 +75,10 @@
 
   // Removes cryptohomes of the removed apps. Terminates the session if
   // a removed app is running.
-  void ClearRemovedApps(const ArcKioskApps& old_apps);
+  void ClearRemovedApps(
+      const std::map<std::string, std::unique_ptr<ArcKioskAppData>>& old_apps);
 
-  ArcKioskApps apps_;
+  std::vector<std::unique_ptr<ArcKioskAppData>> apps_;
   AccountId auto_launch_account_id_;
   bool auto_launched_with_zero_delay_ = false;
   base::ObserverList<ArcKioskAppManagerObserver, true> observers_;
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc
index 1c33160..249147d 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc
@@ -158,12 +158,13 @@
     waiter.Wait();
     EXPECT_TRUE(waiter.was_notified());
 
-    ArcKioskAppManager::ArcKioskApps apps = manager()->GetAllApps();
+    ArcKioskAppManager::Apps apps;
+    manager()->GetAllApps(&apps);
     ASSERT_EQ(2u, apps.size());
-    ASSERT_EQ(app1, apps[0].app_info());
-    ASSERT_EQ(app2, apps[1].app_info());
-    ASSERT_EQ(app1.package_name(), apps[0].name());
-    ASSERT_EQ(app2.display_name(), apps[1].name());
+    ASSERT_EQ(app1.package_name(), apps[0]->app_id());
+    ASSERT_EQ(app2.package_name(), apps[1]->app_id());
+    ASSERT_EQ(app1.package_name(), apps[0]->name());
+    ASSERT_EQ(app2.display_name(), apps[1]->name());
     EXPECT_FALSE(manager()->GetAutoLaunchAccountId().is_valid());
     EXPECT_FALSE(manager()->current_app_was_auto_launched_with_zero_delay());
   }
@@ -178,15 +179,16 @@
     EXPECT_TRUE(waiter.was_notified());
 
     EXPECT_TRUE(manager()->GetAutoLaunchAccountId().is_valid());
-    ASSERT_EQ(2u, manager()->GetAllApps().size());
 
-    ArcKioskAppManager::ArcKioskApps apps = manager()->GetAllApps();
-    ASSERT_EQ(app1, apps[0].app_info());
-    ASSERT_EQ(app2, apps[1].app_info());
-    ASSERT_EQ(app1.package_name(), apps[0].name());
-    ASSERT_EQ(app2.display_name(), apps[1].name());
+    ArcKioskAppManager::Apps apps;
+    manager()->GetAllApps(&apps);
+    ASSERT_EQ(2u, apps.size());
+    ASSERT_EQ(app1.package_name(), apps[0]->app_id());
+    ASSERT_EQ(app2.package_name(), apps[1]->app_id());
+    ASSERT_EQ(app1.package_name(), apps[0]->name());
+    ASSERT_EQ(app2.display_name(), apps[1]->name());
     EXPECT_TRUE(manager()->GetAutoLaunchAccountId().is_valid());
-    ASSERT_EQ(apps[1].account_id(), manager()->GetAutoLaunchAccountId());
+    ASSERT_EQ(apps[1]->account_id(), manager()->GetAutoLaunchAccountId());
     EXPECT_TRUE(manager()->current_app_was_auto_launched_with_zero_delay());
   }
 
@@ -201,12 +203,13 @@
     waiter.Wait();
     EXPECT_TRUE(waiter.was_notified());
 
-    ArcKioskAppManager::ArcKioskApps apps = manager()->GetAllApps();
+    ArcKioskAppManager::Apps apps;
+    manager()->GetAllApps(&apps);
     ASSERT_EQ(2u, apps.size());
-    ASSERT_EQ(app1, apps[0].app_info());
-    ASSERT_EQ(app3, apps[1].app_info());
-    ASSERT_EQ(app1.package_name(), apps[0].name());
-    ASSERT_EQ(app3.package_name(), apps[1].name());
+    ASSERT_EQ(app1.package_name(), apps[0]->app_id());
+    ASSERT_EQ(app3.package_name(), apps[1]->app_id());
+    ASSERT_EQ(app1.package_name(), apps[0]->name());
+    ASSERT_EQ(app3.package_name(), apps[1]->name());
     // Auto launch app must be reset.
     EXPECT_FALSE(manager()->GetAutoLaunchAccountId().is_valid());
     EXPECT_FALSE(manager()->current_app_was_auto_launched_with_zero_delay());
@@ -220,7 +223,9 @@
     waiter.Wait();
     EXPECT_TRUE(waiter.was_notified());
 
-    ASSERT_EQ(0u, manager()->GetAllApps().size());
+    ArcKioskAppManager::Apps apps;
+    manager()->GetAllApps(&apps);
+    ASSERT_EQ(0u, apps.size());
     EXPECT_FALSE(manager()->GetAutoLaunchAccountId().is_valid());
   }
 }
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc
index d505ec2..71f1781 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc
@@ -12,6 +12,10 @@
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "ui/app_list/app_list_constants.h"
+#include "ui/base/layout.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/notification_blocker.h"
 
@@ -134,6 +138,16 @@
     delegate_->OnAppWindowLaunched();
 }
 
+void ArcKioskAppService::OnIconUpdated(ArcAppIcon* icon) {
+  DCHECK_EQ(icon, app_icon_.get());
+  if (icon->image_skia().isNull()) {
+    app_icon_.release();
+    return;
+  }
+  app_manager_->UpdateNameAndIcon(app_info_->package_name, app_info_->name,
+                                  app_icon_->image_skia());
+}
+
 ArcKioskAppService::ArcKioskAppService(Profile* profile) : profile_(profile) {
   ArcAppListPrefs::Get(profile_)->AddObserver(this);
   app_manager_ = ArcKioskAppManager::Get();
@@ -149,6 +163,17 @@
   maintenance_timeout_timer_.Stop();
 }
 
+void ArcKioskAppService::RequestNameAndIconUpdate() {
+  // Request only once when app_icon_ is not initialized.
+  if (!app_info_ || !app_info_->ready || app_icon_)
+    return;
+  app_icon_ = base::MakeUnique<ArcAppIcon>(profile_, app_id_,
+                                           app_list::kGridIconDimension, this);
+  app_icon_->LoadForScaleFactor(ui::GetSupportedScaleFactor(
+      display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor()));
+  // Name and icon are updated when icon is loaded in OnIconUpdated()
+}
+
 void ArcKioskAppService::PreconditionsChanged() {
   VLOG(2) << "Preconditions for kiosk app changed";
   app_id_ = GetAppId();
@@ -172,17 +197,16 @@
     VLOG(2) << "Kiosk app should be closed";
     arc::CloseTask(task_id_);
   }
+  RequestNameAndIconUpdate();
 }
 
 std::string ArcKioskAppService::GetAppId() {
   AccountId account_id = multi_user_util::GetAccountIdFromProfile(profile_);
-  const ArcKioskAppManager::ArcKioskApp* app =
-      app_manager_->GetAppByAccountId(account_id);
+  const ArcKioskAppData* app = app_manager_->GetAppByAccountId(account_id);
   if (!app)
     return std::string();
   std::unordered_set<std::string> app_ids =
-      ArcAppListPrefs::Get(profile_)->GetAppsForPackage(
-          app->app_info().package_name());
+      ArcAppListPrefs::Get(profile_)->GetAppsForPackage(app->app_id());
   if (app_ids.empty())
     return std::string();
   // TODO(poromov@): Choose appropriate app id to launch. See
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h
index ac3bf51..a737022 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h
@@ -9,6 +9,7 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_launcher.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_icon.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "components/arc/kiosk/arc_kiosk_bridge.h"
 #include "components/keyed_service/core/keyed_service.h"
@@ -35,7 +36,8 @@
       public ArcAppListPrefs::Observer,
       public ArcKioskAppManager::ArcKioskAppManagerObserver,
       public arc::ArcKioskBridge::Delegate,
-      public ArcKioskAppLauncher::Delegate {
+      public ArcKioskAppLauncher::Delegate,
+      public ArcAppIcon::Observer {
  public:
   class Delegate {
    public:
@@ -79,6 +81,9 @@
   // ArcKioskAppLauncher::Delegate overrides
   void OnAppWindowLaunched() override;
 
+  // ArcAppIcon::Observer overrides
+  void OnIconUpdated(ArcAppIcon* icon) override;
+
  private:
   explicit ArcKioskAppService(Profile* profile);
   ~ArcKioskAppService() override;
@@ -86,6 +91,8 @@
   std::string GetAppId();
   // Called when app should be started or stopped.
   void PreconditionsChanged();
+  // Updates local cache with proper name and icon.
+  void RequestNameAndIconUpdate();
 
   Profile* const profile_;
   bool maintenance_session_running_ = false;
@@ -93,6 +100,7 @@
   ArcKioskAppManager* app_manager_;
   std::string app_id_;
   std::unique_ptr<ArcAppListPrefs::AppInfo> app_info_;
+  std::unique_ptr<ArcAppIcon> app_icon_;
   int32_t task_id_ = -1;
   std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
   // Keeps track whether the app is already launched
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_data.cc b/chrome/browser/chromeos/app_mode/kiosk_app_data.cc
index 12b742c..8d9d1a876 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_data.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_data.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/webstore_data_fetcher.h"
 #include "chrome/browser/extensions/webstore_install_helper.h"
-#include "chrome/browser/image_decoder.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -45,29 +44,10 @@
 namespace {
 
 // Keys for local state data. See sample layout in KioskAppManager.
-const char kKeyName[] = "name";
-const char kKeyIcon[] = "icon";
-const char kKeyRequiredPlatformVersion[] = "required_platform_version";
+constexpr char kKeyRequiredPlatformVersion[] = "required_platform_version";
 
-const char kInvalidWebstoreResponseError[] = "Invalid Chrome Web Store reponse";
-
-// Icon file extension.
-const char kIconFileExtension[] = ".png";
-
-// Save |raw_icon| for given |app_id|.
-void SaveIconToLocalOnBlockingPool(
-    const base::FilePath& icon_path,
-    scoped_refptr<base::RefCountedString> raw_icon) {
-  DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
-
-  base::FilePath dir = icon_path.DirName();
-  if (!base::PathExists(dir))
-    CHECK(base::CreateDirectory(dir));
-
-  CHECK_EQ(static_cast<int>(raw_icon->size()),
-           base::WriteFile(icon_path,
-                           raw_icon->data().c_str(), raw_icon->size()));
-}
+constexpr char kInvalidWebstoreResponseError[] =
+    "Invalid Chrome Web Store reponse";
 
 // Returns true for valid kiosk app manifest.
 bool IsValidKioskAppManifest(const extensions::Manifest& manifest) {
@@ -203,119 +183,6 @@
 };
 
 ////////////////////////////////////////////////////////////////////////////////
-// KioskAppData::IconLoader
-// Loads locally stored icon data and decode it.
-
-class KioskAppData::IconLoader {
- public:
-  enum LoadResult {
-    SUCCESS,
-    FAILED_TO_LOAD,
-    FAILED_TO_DECODE,
-  };
-
-  IconLoader(const base::WeakPtr<KioskAppData>& client,
-             const base::FilePath& icon_path)
-      : client_(client),
-        icon_path_(icon_path),
-        load_result_(SUCCESS) {}
-
-  void Start() {
-    base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
-    base::SequencedWorkerPool::SequenceToken token = pool->GetSequenceToken();
-    task_runner_ = pool->GetSequencedTaskRunnerWithShutdownBehavior(
-        token,
-        base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(&IconLoader::LoadOnBlockingPool,
-                                      base::Unretained(this)));
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<IconLoader>;
-
-  ~IconLoader() {}
-
-  class IconImageRequest : public ImageDecoder::ImageRequest {
-   public:
-    IconImageRequest(
-        const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-        IconLoader* icon_loader)
-        : ImageRequest(task_runner), icon_loader_(icon_loader) {}
-
-    void OnImageDecoded(const SkBitmap& decoded_image) override {
-      icon_loader_->icon_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image);
-      icon_loader_->icon_.MakeThreadSafe();
-      icon_loader_->ReportResultOnBlockingPool(SUCCESS);
-      delete this;
-    }
-
-    void OnDecodeImageFailed() override {
-      icon_loader_->ReportResultOnBlockingPool(FAILED_TO_DECODE);
-      delete this;
-    }
-
-   private:
-    ~IconImageRequest() override {}
-    IconLoader* icon_loader_;
-  };
-
-  // Loads the icon from locally stored |icon_path_| on the blocking pool
-  void LoadOnBlockingPool() {
-    DCHECK(task_runner_->RunsTasksOnCurrentThread());
-
-    std::string data;
-    if (!base::ReadFileToString(base::FilePath(icon_path_), &data)) {
-      ReportResultOnBlockingPool(FAILED_TO_LOAD);
-      return;
-    }
-    raw_icon_ = base::RefCountedString::TakeString(&data);
-
-    IconImageRequest* image_request = new IconImageRequest(task_runner_, this);
-    ImageDecoder::Start(image_request, raw_icon_->data());
-  }
-
-  void ReportResultOnBlockingPool(LoadResult result) {
-    DCHECK(task_runner_->RunsTasksOnCurrentThread());
-
-    load_result_ = result;
-    BrowserThread::PostTask(
-        BrowserThread::UI,
-        FROM_HERE,
-        base::Bind(&IconLoader::ReportResultOnUIThread,
-                   base::Unretained(this)));
-  }
-
-  void NotifyClient() {
-    if (!client_)
-      return;
-
-    if (load_result_ == SUCCESS)
-      client_->OnIconLoadSuccess(icon_);
-    else
-      client_->OnIconLoadFailure();
-  }
-
-  void ReportResultOnUIThread() {
-    DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-    NotifyClient();
-    delete this;
-  }
-
-  base::WeakPtr<KioskAppData> client_;
-  base::FilePath icon_path_;
-
-  LoadResult load_result_;
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
-
-  gfx::ImageSkia icon_;
-  scoped_refptr<base::RefCountedString> raw_icon_;
-
-  DISALLOW_COPY_AND_ASSIGN(IconLoader);
-};
-
-////////////////////////////////////////////////////////////////////////////////
 // KioskAppData::WebstoreDataParser
 // Use WebstoreInstallHelper to parse the manifest and decode the icon.
 
@@ -399,12 +266,14 @@
                            const AccountId& account_id,
                            const GURL& update_url,
                            const base::FilePath& cached_crx)
-    : delegate_(delegate),
+    : KioskAppDataBase(KioskAppManager::kKioskDictionaryName,
+                       app_id,
+                       account_id),
+      delegate_(delegate),
       status_(STATUS_INIT),
-      app_id_(app_id),
-      account_id_(account_id),
       update_url_(update_url),
-      crx_file_(cached_crx) {}
+      crx_file_(cached_crx),
+      weak_factory_(this) {}
 
 KioskAppData::~KioskAppData() {}
 
@@ -417,23 +286,6 @@
   StartFetch();
 }
 
-void KioskAppData::ClearCache() {
-  PrefService* local_state = g_browser_process->local_state();
-
-  DictionaryPrefUpdate dict_update(local_state,
-                                   KioskAppManager::kKioskDictionaryName);
-
-  std::string app_key = std::string(KioskAppManager::kKeyApps) + '.' + app_id_;
-  dict_update->Remove(app_key, NULL);
-
-  if (!icon_path_.empty()) {
-    base::PostTaskWithTraits(
-        FROM_HERE, base::TaskTraits().MayBlock().WithPriority(
-                       base::TaskPriority::BACKGROUND),
-        base::Bind(base::IgnoreResult(&base::DeleteFile), icon_path_, false));
-  }
-}
-
 void KioskAppData::LoadFromInstalledApp(Profile* profile,
                                         const extensions::Extension* app) {
   SetStatus(STATUS_LOADING);
@@ -441,10 +293,10 @@
   if (!app) {
     app = extensions::ExtensionSystem::Get(profile)
               ->extension_service()
-              ->GetInstalledExtension(app_id_);
+              ->GetInstalledExtension(app_id());
   }
 
-  DCHECK_EQ(app_id_, app->id());
+  DCHECK_EQ(app_id(), app->id());
 
   name_ = app->name();
   required_platform_version_ =
@@ -455,7 +307,8 @@
       app, kIconSize, ExtensionIconSet::MATCH_BIGGER);
   extensions::ImageLoader::Get(profile)->LoadImageAsync(
       app, image, gfx::Size(kIconSize, kIconSize),
-      base::Bind(&KioskAppData::OnExtensionIconLoaded, AsWeakPtr()));
+      base::Bind(&KioskAppData::OnExtensionIconLoaded,
+                 weak_factory_.GetWeakPtr()));
 }
 
 void KioskAppData::SetCachedCrx(const base::FilePath& crx_file) {
@@ -507,10 +360,10 @@
       break;
     case STATUS_LOADING:
     case STATUS_LOADED:
-      delegate_->OnKioskAppDataChanged(app_id_);
+      delegate_->OnKioskAppDataChanged(app_id());
       break;
     case STATUS_ERROR:
-      delegate_->OnKioskAppDataLoadFailure(app_id_);
+      delegate_->OnKioskAppDataLoadFailure(app_id());
       break;
   }
 }
@@ -520,83 +373,51 @@
 }
 
 bool KioskAppData::LoadFromCache() {
-  const std::string app_key =
-      std::string(KioskAppManager::kKeyApps) + '.' + app_id_;
-  const std::string name_key = app_key + '.' + kKeyName;
-  const std::string icon_path_key = app_key + '.' + kKeyIcon;
-  const std::string required_platform_version_key =
-      app_key + '.' + kKeyRequiredPlatformVersion;
-
   PrefService* local_state = g_browser_process->local_state();
   const base::DictionaryValue* dict =
-      local_state->GetDictionary(KioskAppManager::kKioskDictionaryName);
+      local_state->GetDictionary(dictionary_name());
 
-  icon_path_.clear();
-  std::string icon_path_string;
-  if (!dict->GetString(name_key, &name_) ||
-      !dict->GetString(icon_path_key, &icon_path_string) ||
-      !dict->GetString(required_platform_version_key,
-                       &required_platform_version_)) {
+  if (!LoadFromDictionary(*dict))
     return false;
-  }
-  icon_path_ = base::FilePath(icon_path_string);
 
-  // IconLoader deletes itself when done.
-  (new IconLoader(AsWeakPtr(), icon_path_))->Start();
-  return true;
-}
-
-void KioskAppData::SetCache(const std::string& name,
-                            const base::FilePath& icon_path,
-                            const std::string& required_platform_version) {
-  name_ = name;
-  icon_path_ = icon_path;
-  required_platform_version_ = required_platform_version;
-
-  const std::string app_key =
-      std::string(KioskAppManager::kKeyApps) + '.' + app_id_;
-  const std::string name_key = app_key + '.' + kKeyName;
-  const std::string icon_path_key = app_key + '.' + kKeyIcon;
+  const std::string app_key = std::string(kKeyApps) + '.' + app_id();
   const std::string required_platform_version_key =
       app_key + '.' + kKeyRequiredPlatformVersion;
 
-  PrefService* local_state = g_browser_process->local_state();
-  DictionaryPrefUpdate dict_update(local_state,
-                                   KioskAppManager::kKioskDictionaryName);
-  dict_update->SetString(name_key, name);
-  dict_update->SetString(icon_path_key, icon_path.value());
-  dict_update->SetString(required_platform_version_key,
-                         required_platform_version);
+  return dict->GetString(required_platform_version_key,
+                         &required_platform_version_);
 }
 
 void KioskAppData::SetCache(const std::string& name,
                             const SkBitmap& icon,
                             const std::string& required_platform_version) {
+  name_ = name;
+  required_platform_version_ = required_platform_version;
   icon_ = gfx::ImageSkia::CreateFrom1xBitmap(icon);
   icon_.MakeThreadSafe();
 
-  std::vector<unsigned char> image_data;
-  CHECK(gfx::PNGCodec::EncodeBGRASkBitmap(icon, false, &image_data));
-  scoped_refptr<base::RefCountedString> raw_icon(new base::RefCountedString);
-  raw_icon->data().assign(image_data.begin(), image_data.end());
-
   base::FilePath cache_dir;
   if (delegate_)
     delegate_->GetKioskAppIconCacheDir(&cache_dir);
 
-  base::FilePath icon_path =
-      cache_dir.AppendASCII(app_id_).AddExtension(kIconFileExtension);
-  BrowserThread::GetBlockingPool()->PostTask(
-      FROM_HERE,
-      base::Bind(&SaveIconToLocalOnBlockingPool, icon_path, raw_icon));
+  SaveIcon(icon, cache_dir);
 
-  SetCache(name, icon_path, required_platform_version);
+  PrefService* local_state = g_browser_process->local_state();
+  DictionaryPrefUpdate dict_update(local_state, dictionary_name());
+  SaveToDictionary(dict_update);
+
+  const std::string app_key = std::string(kKeyApps) + '.' + app_id();
+  const std::string required_platform_version_key =
+      app_key + '.' + kKeyRequiredPlatformVersion;
+
+  dict_update->SetString(required_platform_version_key,
+                         required_platform_version);
 }
 
 void KioskAppData::OnExtensionIconLoaded(const gfx::Image& icon) {
   if (icon.IsEmpty()) {
     LOG(WARNING) << "Failed to load icon from installed app"
-                 << ", id=" << app_id_;
+                 << ", id=" << app_id();
     SetCache(name_, *extensions::util::GetDefaultAppIcon().bitmap(),
              required_platform_version_);
   } else {
@@ -608,11 +429,13 @@
 
 void KioskAppData::OnIconLoadSuccess(const gfx::ImageSkia& icon) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  kiosk_app_icon_loader_.release();
   icon_ = icon;
   SetStatus(STATUS_LOADED);
 }
 
 void KioskAppData::OnIconLoadFailure() {
+  kiosk_app_icon_loader_.release();
   // Re-fetch data from web store when failed to load cached data.
   StartFetch();
 }
@@ -635,10 +458,7 @@
   }
 
   webstore_fetcher_.reset(new extensions::WebstoreDataFetcher(
-      this,
-      GetRequestContextGetter(),
-      GURL(),
-      app_id_));
+      this, GetRequestContextGetter(), GURL(), app_id()));
   webstore_fetcher_->set_max_auto_retries(3);
   webstore_fetcher_->Start();
 }
@@ -674,15 +494,12 @@
   }
 
   // WebstoreDataParser deletes itself when done.
-  (new WebstoreDataParser(AsWeakPtr()))->Start(app_id_,
-                                               manifest,
-                                               icon_url,
-                                               GetRequestContextGetter());
+  (new WebstoreDataParser(weak_factory_.GetWeakPtr()))
+      ->Start(app_id(), manifest, icon_url, GetRequestContextGetter());
 }
 
 void KioskAppData::OnWebstoreResponseParseFailure(const std::string& error) {
-  LOG(ERROR) << "Webstore failed for kiosk app " << app_id_
-             << ", " << error;
+  LOG(ERROR) << "Webstore failed for kiosk app " << app_id() << ", " << error;
   webstore_fetcher_.reset();
   SetStatus(STATUS_ERROR);
 }
@@ -703,7 +520,8 @@
   if (crx_file_.empty())
     return;
 
-  scoped_refptr<CrxLoader> crx_loader(new CrxLoader(AsWeakPtr(), crx_file_));
+  scoped_refptr<CrxLoader> crx_loader(
+      new CrxLoader(weak_factory_.GetWeakPtr(), crx_file_));
   crx_loader->Start();
 }
 
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_data.h b/chrome/browser/chromeos/app_mode/kiosk_app_data.h
index 7f5d5c9..2baa6a7 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_data.h
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_data.h
@@ -10,11 +10,10 @@
 
 #include "base/files/file_path.h"
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/app_mode/kiosk_app_data_base.h"
 #include "chrome/browser/extensions/webstore_data_fetcher_delegate.h"
 #include "components/signin/core/account_id/account_id.h"
-#include "ui/gfx/image/image_skia.h"
 #include "url/gurl.h"
 
 class Profile;
@@ -38,7 +37,7 @@
 
 // Fetches an app's web store data and manages the cached info such as name
 // and icon.
-class KioskAppData : public base::SupportsWeakPtr<KioskAppData>,
+class KioskAppData : public KioskAppDataBase,
                      public extensions::WebstoreDataFetcherDelegate {
  public:
   enum Status {
@@ -59,9 +58,6 @@
   // from web store.
   void Load();
 
-  // Clears locally cached data.
-  void ClearCache();
-
   // Loads app data from the app installed in the given profile.
   void LoadFromInstalledApp(Profile* profile, const extensions::Extension* app);
 
@@ -75,11 +71,7 @@
   // Returns true if the update url points to Webstore.
   bool IsFromWebStore() const;
 
-  const std::string& app_id() const { return app_id_; }
-  const AccountId& account_id() const { return account_id_; }
-  const std::string& name() const { return name_; }
   const GURL& update_url() const { return update_url_; }
-  const gfx::ImageSkia& icon() const { return icon_; }
   const std::string& required_platform_version() const {
     return required_platform_version_;
   }
@@ -94,9 +86,12 @@
       const GURL& update_url,
       const std::string& required_platform_version);
 
+  // Callbacks for KioskAppIconLoader.
+  void OnIconLoadSuccess(const gfx::ImageSkia& icon) override;
+  void OnIconLoadFailure() override;
+
  private:
   class CrxLoader;
-  class IconLoader;
   class WebstoreDataParser;
 
   void SetStatus(Status status);
@@ -109,21 +104,12 @@
 
   // Sets the cached data.
   void SetCache(const std::string& name,
-                const base::FilePath& icon_path,
-                const std::string& required_platform_version);
-
-  // Helper to set the cached data using a SkBitmap icon.
-  void SetCache(const std::string& name,
                 const SkBitmap& icon,
                 const std::string& required_platform_version);
 
   // Callback for extensions::ImageLoader.
   void OnExtensionIconLoaded(const gfx::Image& icon);
 
-  // Callbacks for IconLoader.
-  void OnIconLoadSuccess(const gfx::ImageSkia& icon);
-  void OnIconLoadFailure();
-
   // Callbacks for WebstoreDataParser
   void OnWebstoreParseSuccess(const SkBitmap& icon,
                               const std::string& required_platform_version);
@@ -154,18 +140,15 @@
   KioskAppDataDelegate* delegate_;  // not owned.
   Status status_;
 
-  std::string app_id_;
-  AccountId account_id_;
-  std::string name_;
   GURL update_url_;
-  gfx::ImageSkia icon_;
   std::string required_platform_version_;
 
   std::unique_ptr<extensions::WebstoreDataFetcher> webstore_fetcher_;
-  base::FilePath icon_path_;
 
   base::FilePath crx_file_;
 
+  base::WeakPtrFactory<KioskAppData> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(KioskAppData);
 };
 
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_data_base.cc b/chrome/browser/chromeos/app_mode/kiosk_app_data_base.cc
new file mode 100644
index 0000000..759a887
--- /dev/null
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_data_base.cc
@@ -0,0 +1,130 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/app_mode/kiosk_app_data_base.h"
+
+#include <utility>
+
+#include "base/files/file_util.h"
+#include "base/memory/ptr_util.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/threading/sequenced_worker_pool.h"
+#include "chrome/browser/browser_process.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/scoped_user_pref_update.h"
+#include "content/public/browser/browser_thread.h"
+#include "ui/gfx/codec/png_codec.h"
+
+using content::BrowserThread;
+
+namespace chromeos {
+
+namespace {
+
+// Keys for local state data.
+constexpr char kKeyName[] = "name";
+constexpr char kKeyIcon[] = "icon";
+
+// Icon file extension.
+constexpr char kIconFileExtension[] = ".png";
+
+// Save |raw_icon| for given |app_id|.
+void SaveIconToLocalOnBlockingPool(const base::FilePath& icon_path,
+                                   std::vector<unsigned char> image_data) {
+  DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
+
+  const base::FilePath dir = icon_path.DirName();
+  if (!base::PathExists(dir) && !base::CreateDirectory(dir)) {
+    LOG(ERROR) << "Failed to create directory to store kiosk icons";
+    return;
+  }
+
+  const int wrote = base::WriteFile(
+      icon_path, reinterpret_cast<char*>(image_data.data()), image_data.size());
+  if (wrote != static_cast<int>(image_data.size())) {
+    LOG(ERROR) << "Failed to write kiosk icon file";
+  }
+}
+
+}  // namespace
+
+// static
+const char KioskAppDataBase::kKeyApps[] = "apps";
+
+KioskAppDataBase::KioskAppDataBase(const std::string& dictionary_name,
+                                   const std::string& app_id,
+                                   const AccountId& account_id)
+    : dictionary_name_(dictionary_name),
+      app_id_(app_id),
+      account_id_(account_id) {}
+
+KioskAppDataBase::~KioskAppDataBase() = default;
+
+void KioskAppDataBase::SaveToDictionary(DictionaryPrefUpdate& dict_update) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  const std::string app_key = std::string(kKeyApps) + '.' + app_id_;
+  const std::string name_key = app_key + '.' + kKeyName;
+  const std::string icon_path_key = app_key + '.' + kKeyIcon;
+
+  dict_update->SetString(name_key, name_);
+  dict_update->SetString(icon_path_key, icon_path_.value());
+}
+
+bool KioskAppDataBase::LoadFromDictionary(const base::DictionaryValue& dict) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  const std::string app_key =
+      std::string(KioskAppDataBase::kKeyApps) + '.' + app_id_;
+  const std::string name_key = app_key + '.' + kKeyName;
+  const std::string icon_path_key = app_key + '.' + kKeyIcon;
+
+  std::string icon_path_string;
+  if (!dict.GetString(name_key, &name_) ||
+      !dict.GetString(icon_path_key, &icon_path_string)) {
+    return false;
+  }
+  icon_path_ = base::FilePath(icon_path_string);
+
+  kiosk_app_icon_loader_ = base::MakeUnique<KioskAppIconLoader>(this);
+  kiosk_app_icon_loader_->Start(icon_path_);
+  return true;
+}
+
+void KioskAppDataBase::SaveIcon(const SkBitmap& icon,
+                                const base::FilePath& cache_dir) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  std::vector<unsigned char> image_data;
+  if (!gfx::PNGCodec::EncodeBGRASkBitmap(icon, false, &image_data)) {
+    LOG(ERROR) << "Failed to encode kiosk icon";
+    return;
+  }
+
+  const base::FilePath icon_path =
+      cache_dir.AppendASCII(app_id_).AddExtension(kIconFileExtension);
+  BrowserThread::GetBlockingPool()->PostTask(
+      FROM_HERE, base::Bind(&SaveIconToLocalOnBlockingPool, icon_path,
+                            base::Passed(std::move(image_data))));
+
+  icon_path_ = icon_path;
+}
+
+void KioskAppDataBase::ClearCache() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  PrefService* local_state = g_browser_process->local_state();
+
+  DictionaryPrefUpdate dict_update(local_state, dictionary_name());
+
+  const std::string app_key =
+      std::string(KioskAppDataBase::kKeyApps) + '.' + app_id_;
+  dict_update->Remove(app_key, nullptr);
+
+  if (!icon_path_.empty()) {
+    base::PostTaskWithTraits(
+        FROM_HERE,
+        base::TaskTraits().MayBlock().WithPriority(
+            base::TaskPriority::BACKGROUND),
+        base::Bind(base::IgnoreResult(&base::DeleteFile), icon_path_, false));
+  }
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_data_base.h b/chrome/browser/chromeos/app_mode/kiosk_app_data_base.h
new file mode 100644
index 0000000..626c599
--- /dev/null
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_data_base.h
@@ -0,0 +1,77 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_DATA_BASE_H_
+#define CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_DATA_BASE_H_
+
+#include <memory>
+#include <string>
+
+#include "base/files/file_path.h"
+#include "chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.h"
+#include "components/prefs/scoped_user_pref_update.h"
+#include "components/signin/core/account_id/account_id.h"
+#include "ui/gfx/image/image_skia.h"
+
+namespace base {
+class DictionaryValue;
+}
+
+namespace chromeos {
+
+class KioskAppDataBase : public KioskAppIconLoader::Delegate {
+ public:
+  // Dictionary key for apps.
+  static const char kKeyApps[];
+
+  const std::string& dictionary_name() const { return dictionary_name_; }
+  const std::string& app_id() const { return app_id_; }
+  const AccountId& account_id() const { return account_id_; }
+  const std::string& name() const { return name_; }
+  const gfx::ImageSkia& icon() const { return icon_; }
+
+  // Callbacks for KioskAppIconLoader.
+  void OnIconLoadSuccess(const gfx::ImageSkia& icon) override = 0;
+  void OnIconLoadFailure() override = 0;
+
+  // Clears locally cached data.
+  void ClearCache();
+
+ protected:
+  KioskAppDataBase(const std::string& dictionary_name,
+                   const std::string& app_id,
+                   const AccountId& account_id);
+  ~KioskAppDataBase() override;
+
+  // Helper to save name and icon to provided dictionary.
+  void SaveToDictionary(DictionaryPrefUpdate& dict_update);
+
+  // Helper to load name and icon from provided dictionary.
+  bool LoadFromDictionary(const base::DictionaryValue& dict);
+
+  // Helper to cache |icon| to |cache_dir|.
+  void SaveIcon(const SkBitmap& icon, const base::FilePath& cache_dir);
+
+  // In protected section to allow derived classes to modify.
+  std::string name_;
+  gfx::ImageSkia icon_;
+
+  // Should be released when callbacks are called.
+  std::unique_ptr<KioskAppIconLoader> kiosk_app_icon_loader_;
+
+ private:
+  // Name of a dictionary that holds kiosk app info in Local State.
+  const std::string dictionary_name_;
+
+  const std::string app_id_;
+  const AccountId account_id_;
+
+  base::FilePath icon_path_;
+
+  DISALLOW_COPY_AND_ASSIGN(KioskAppDataBase);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_DATA_BASE_H_
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.cc b/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.cc
new file mode 100644
index 0000000..cb46f50a
--- /dev/null
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.cc
@@ -0,0 +1,97 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.h"
+
+#include <vector>
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/threading/sequenced_worker_pool.h"
+#include "chrome/browser/image_decoder.h"
+#include "content/public/browser/browser_thread.h"
+
+using content::BrowserThread;
+
+namespace chromeos {
+
+class IconImageRequest : public ImageDecoder::ImageRequest {
+ public:
+  IconImageRequest(const scoped_refptr<base::SequencedTaskRunner>& task_runner,
+                   KioskAppIconLoader::ResultCallback result_callback)
+      : ImageRequest(task_runner), result_callback_(result_callback) {}
+
+  void OnImageDecoded(const SkBitmap& decoded_image) override {
+    gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image);
+    image.MakeThreadSafe();
+    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+                            base::Bind(result_callback_, image));
+    delete this;
+  }
+
+  void OnDecodeImageFailed() override {
+    LOG(ERROR) << "Failed to decode icon image.";
+    BrowserThread::PostTask(
+        BrowserThread::UI, FROM_HERE,
+        base::Bind(result_callback_, base::Optional<gfx::ImageSkia>()));
+    delete this;
+  }
+
+ private:
+  ~IconImageRequest() override = default;
+  KioskAppIconLoader::ResultCallback result_callback_;
+};
+
+void LoadOnBlockingPool(
+    const base::FilePath& icon_path,
+    scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
+    KioskAppIconLoader::ResultCallback result_callback) {
+  DCHECK(callback_task_runner->RunsTasksOnCurrentThread());
+
+  std::string data;
+  if (!base::ReadFileToString(base::FilePath(icon_path), &data)) {
+    LOG(ERROR) << "Failed to read icon file.";
+    BrowserThread::PostTask(
+        BrowserThread::UI, FROM_HERE,
+        base::Bind(result_callback, base::Optional<gfx::ImageSkia>()));
+    return;
+  }
+
+  // IconImageRequest will delete itself on completion of ImageDecoder callback.
+  IconImageRequest* image_request =
+      new IconImageRequest(callback_task_runner, result_callback);
+  ImageDecoder::Start(image_request,
+                      std::vector<uint8_t>(data.begin(), data.end()));
+}
+
+KioskAppIconLoader::KioskAppIconLoader(Delegate* delegate)
+    : delegate_(delegate), weak_factory_(this) {}
+
+KioskAppIconLoader::~KioskAppIconLoader() = default;
+
+void KioskAppIconLoader::Start(const base::FilePath& icon_path) {
+  base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
+  base::SequencedWorkerPool::SequenceToken token = pool->GetSequenceToken();
+  task_runner_ = pool->GetSequencedTaskRunnerWithShutdownBehavior(
+      token, base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
+  task_runner_->PostTask(
+      FROM_HERE,
+      base::Bind(&LoadOnBlockingPool, icon_path, task_runner_,
+                 base::Bind(&KioskAppIconLoader::OnImageDecodingFinished,
+                            weak_factory_.GetWeakPtr())));
+}
+
+void KioskAppIconLoader::OnImageDecodingFinished(
+    base::Optional<gfx::ImageSkia> result) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  if (result.has_value()) {
+    delegate_->OnIconLoadSuccess(result.value());
+  } else {
+    delegate_->OnIconLoadFailure();
+  }
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.h b/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.h
new file mode 100644
index 0000000..345ee9a
--- /dev/null
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.h
@@ -0,0 +1,65 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_ICON_LOADER_H_
+#define CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_ICON_LOADER_H_
+
+#include "base/callback_forward.h"
+#include "base/memory/ref_counted_memory.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/sequenced_task_runner.h"
+#include "ui/gfx/image/image_skia.h"
+
+namespace base {
+class FilePath;
+}
+
+namespace chromeos {
+
+// Loads locally stored icon data and decodes it.
+class KioskAppIconLoader {
+ public:
+  enum LoadResult {
+    SUCCESS,
+    FAILED_TO_LOAD,
+    FAILED_TO_DECODE,
+  };
+
+  class Delegate {
+   public:
+    virtual void OnIconLoadSuccess(const gfx::ImageSkia& icon) = 0;
+    virtual void OnIconLoadFailure() = 0;
+
+   protected:
+    virtual ~Delegate() = default;
+  };
+
+  using ResultCallback =
+      base::Callback<void(base::Optional<gfx::ImageSkia> result)>;
+
+  explicit KioskAppIconLoader(Delegate* delegate);
+
+  ~KioskAppIconLoader();
+
+  void Start(const base::FilePath& icon_path);
+
+ private:
+  void OnImageDecodingFinished(base::Optional<gfx::ImageSkia> result);
+
+  // Delegate always lives longer than this class as it's owned by delegate.
+  Delegate* const delegate_;
+
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+
+  gfx::ImageSkia icon_;
+
+  base::WeakPtrFactory<KioskAppIconLoader> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(KioskAppIconLoader);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_ICON_LOADER_H_
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
index a4bba2a..3554db54 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
@@ -163,7 +163,6 @@
 
 // static
 const char KioskAppManager::kKioskDictionaryName[] = "kiosk";
-const char KioskAppManager::kKeyApps[] = "apps";
 const char KioskAppManager::kKeyAutoLoginState[] = "auto_login_state";
 const char KioskAppManager::kIconCacheDir[] = "kiosk/icon";
 const char KioskAppManager::kCrxCacheDir[] = "kiosk/crx";
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h
index 7d7bbdf..d15455f9 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h
@@ -87,7 +87,6 @@
   //     "auto_login_enabled": true  //
   //   }
   static const char kKioskDictionaryName[];
-  static const char kKeyApps[];
   static const char kKeyAutoLoginState[];
 
   // Sub directory under DIR_USER_DATA to store cached icon files.
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
index dafab9a..8cb8d09 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
@@ -325,7 +325,7 @@
     PrefService* local_state = g_browser_process->local_state();
     DictionaryPrefUpdate dict_update(local_state,
                                      KioskAppManager::kKioskDictionaryName);
-    dict_update->Set(KioskAppManager::kKeyApps, std::move(apps_dict));
+    dict_update->Set(KioskAppDataBase::kKeyApps, std::move(apps_dict));
 
     // Make the app appear in device settings.
     base::ListValue device_local_accounts;
@@ -542,7 +542,7 @@
   const base::DictionaryValue* dict =
       local_state->GetDictionary(KioskAppManager::kKioskDictionaryName);
   const base::DictionaryValue* apps_dict;
-  EXPECT_TRUE(dict->GetDictionary(KioskAppManager::kKeyApps, &apps_dict));
+  EXPECT_TRUE(dict->GetDictionary(KioskAppDataBase::kKeyApps, &apps_dict));
   EXPECT_TRUE(apps_dict->HasKey("app_1"));
 
   manager()->ClearAppData("app_1");
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 3dc6832..e0ce219 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2785,11 +2785,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-const char kDelayNavigationName[] = "Delay navigations";
-
-const char kDelayNavigationDescription[] =
-    "Add a fixed delay to main frame navigations.";
-
 const char kDebugShortcutsDescription[] =
     "Enables additional keyboard shortcuts that are useful for debugging "
     "Ash.";
diff --git a/chrome/browser/media/webrtc/webrtc_rtp_browsertest.cc b/chrome/browser/media/webrtc/webrtc_rtp_browsertest.cc
index 79a36f45..5de342e 100644
--- a/chrome/browser/media/webrtc/webrtc_rtp_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_rtp_browsertest.cc
@@ -19,9 +19,6 @@
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream);
-
-    command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures,
-                                    "RTCRtpReceiver");
   }
 
  protected:
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index c6b845311..1a14e35 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -226,7 +226,7 @@
   }
   // TODO(melandory): remove saving_and_filling_passwords_enabled_ check from
   // here once we decide to switch to new settings behavior for everyone.
-  return *saving_and_filling_passwords_enabled_ && !IsOffTheRecord() &&
+  return *saving_and_filling_passwords_enabled_ && !IsIncognito() &&
          IsFillingEnabledForCurrentPage();
 }
 
@@ -445,7 +445,7 @@
 
 password_manager::PasswordStore*
 ChromePasswordManagerClient::GetPasswordStore() const {
-  // Always use EXPLICIT_ACCESS as the password manager checks IsOffTheRecord
+  // Always use EXPLICIT_ACCESS as the password manager checks IsIncognito
   // itself when it shouldn't access the PasswordStore.
   // TODO(gcasto): Is is safe to change this to
   // ServiceAccessType::IMPLICIT_ACCESS?
@@ -502,7 +502,7 @@
   return ssl_errors;
 }
 
-bool ChromePasswordManagerClient::IsOffTheRecord() const {
+bool ChromePasswordManagerClient::IsIncognito() const {
   return web_contents()->GetBrowserContext()->IsOffTheRecord();
 }
 
@@ -580,7 +580,7 @@
           GetPrefs()) ||
       !GetPrefs()->GetBoolean(
           password_manager::prefs::kCredentialsEnableAutosignin) ||
-      IsOffTheRecord())
+      IsIncognito())
     return;
 
 #if defined(OS_ANDROID)
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h
index 5747e99e..72f995f 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.h
+++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -82,7 +82,7 @@
   password_manager::PasswordSyncState GetPasswordSyncState() const override;
   bool WasLastNavigationHTTPError() const override;
   bool DidLastPageLoadEncounterSSLErrors() const override;
-  bool IsOffTheRecord() const override;
+  bool IsIncognito() const override;
   const password_manager::PasswordManager* GetPasswordManager() const override;
   autofill::AutofillManager* GetAutofillManagerForMainFrame() override;
   const GURL& GetMainFrameURL() const override;
diff --git a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
index 9b602a2..9b8bc58 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
@@ -292,14 +292,14 @@
             client->GetPasswordSyncState());
 }
 
-TEST_F(ChromePasswordManagerClientTest, IsOffTheRecordTest) {
+TEST_F(ChromePasswordManagerClientTest, IsIncognitoTest) {
   ChromePasswordManagerClient* client = GetClient();
 
   profile()->ForceIncognito(true);
-  EXPECT_TRUE(client->IsOffTheRecord());
+  EXPECT_TRUE(client->IsIncognito());
 
   profile()->ForceIncognito(false);
-  EXPECT_FALSE(client->IsOffTheRecord());
+  EXPECT_FALSE(client->IsIncognito());
 }
 
 TEST_F(ChromePasswordManagerClientTest,
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
index baad20b7..02b40db 100644
--- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
+++ b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.h"
+#include "chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.h"
 #include "chrome/browser/ui/android/content_settings/subresource_filter_infobar_delegate.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings_types.h"
@@ -22,8 +22,8 @@
     content::WebContents* web_contents)
     : web_contents_(web_contents), shown_for_navigation_(false) {
   DCHECK(web_contents);
-  // Ensure the content settings observer is initialized.
-  SubresourceFilterContentSettingsObserverFactory::EnsureForProfile(
+  // Ensure the content settings manager is initialized.
+  SubresourceFilterContentSettingsManagerFactory::EnsureForProfile(
       Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
 }
 
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
new file mode 100644
index 0000000..42cf2fb
--- /dev/null
+++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
@@ -0,0 +1,82 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h"
+
+#include "base/logging.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
+#include "components/content_settings/core/browser/content_settings_details.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings.h"
+#include "components/content_settings/core/common/content_settings_pattern.h"
+#include "url/gurl.h"
+
+SubresourceFilterContentSettingsManager::
+    SubresourceFilterContentSettingsManager(Profile* profile)
+    : settings_map_(HostContentSettingsMapFactory::GetForProfile(profile)) {
+  DCHECK(profile);
+  DCHECK(settings_map_);
+  settings_map_->AddObserver(this);
+}
+
+SubresourceFilterContentSettingsManager::
+    ~SubresourceFilterContentSettingsManager() {}
+
+void SubresourceFilterContentSettingsManager::Shutdown() {
+  settings_map_->RemoveObserver(this);
+  settings_map_ = nullptr;
+}
+
+void SubresourceFilterContentSettingsManager::OnContentSettingChanged(
+    const ContentSettingsPattern& primary_pattern,
+    const ContentSettingsPattern& secondary_pattern,
+    ContentSettingsType content_type,
+    std::string resource_identifier) {
+  if (content_type != CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER)
+    return;
+
+  const ContentSettingsDetails details(primary_pattern, secondary_pattern,
+                                       content_type, resource_identifier);
+  if (details.update_all()) {
+    ContentSetting global_setting = settings_map_->GetDefaultContentSetting(
+        CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, nullptr);
+    if (global_setting == CONTENT_SETTING_BLOCK) {
+      ChromeSubresourceFilterClient::LogAction(
+          kActionContentSettingsBlockedGlobal);
+    } else if (global_setting == CONTENT_SETTING_ALLOW) {
+      ChromeSubresourceFilterClient::LogAction(
+          kActionContentSettingsAllowedGlobal);
+    } else {
+      NOTREACHED();
+    }
+    return;
+  }
+
+  // Remove this DCHECK if extension APIs or admin policies are given the
+  // ability to set secondary patterns for this setting.
+  DCHECK(secondary_pattern == ContentSettingsPattern::Wildcard());
+
+  DCHECK(primary_pattern.IsValid());
+
+  // An invalid URL indicates that this is a wildcard pattern.
+  GURL url = GURL(primary_pattern.ToString());
+  if (!url.is_valid()) {
+    ChromeSubresourceFilterClient::LogAction(
+        kActionContentSettingsWildcardUpdate);
+    return;
+  }
+
+  ContentSetting setting = settings_map_->GetContentSetting(
+      url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER,
+      std::string());
+  if (setting == CONTENT_SETTING_BLOCK) {
+    ChromeSubresourceFilterClient::LogAction(kActionContentSettingsBlocked);
+  } else if (setting == CONTENT_SETTING_ALLOW) {
+    ChromeSubresourceFilterClient::LogAction(kActionContentSettingsAllowed);
+  } else {
+    NOTREACHED();
+  }
+}
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h
new file mode 100644
index 0000000..530e4362
--- /dev/null
+++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h
@@ -0,0 +1,43 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_MANAGER_H_
+#define CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_MANAGER_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "components/content_settings/core/browser/content_settings_observer.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+class ContentSettingsPattern;
+class HostContentSettingsMap;
+class Profile;
+
+// This class observes subresource filter content settings changes for metrics
+// collection.
+class SubresourceFilterContentSettingsManager
+    : public KeyedService,
+      public content_settings::Observer {
+ public:
+  explicit SubresourceFilterContentSettingsManager(Profile* profile);
+  ~SubresourceFilterContentSettingsManager() override;
+
+ private:
+  // KeyedService:
+  void Shutdown() override;
+
+  // content_settings::Observer:
+  void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern,
+                               const ContentSettingsPattern& secondary_pattern,
+                               ContentSettingsType content_type,
+                               std::string resource_identifier) override;
+
+  HostContentSettingsMap* settings_map_;
+
+  DISALLOW_COPY_AND_ASSIGN(SubresourceFilterContentSettingsManager);
+};
+
+#endif  // CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_MANAGER_H_
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.cc
new file mode 100644
index 0000000..a710f41c
--- /dev/null
+++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.cc
@@ -0,0 +1,36 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.h"
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+// static
+void SubresourceFilterContentSettingsManagerFactory::EnsureForProfile(
+    Profile* profile) {
+  GetInstance()->GetServiceForBrowserContext(profile, true /* create */);
+}
+
+// static
+SubresourceFilterContentSettingsManagerFactory*
+SubresourceFilterContentSettingsManagerFactory::GetInstance() {
+  return base::Singleton<SubresourceFilterContentSettingsManagerFactory>::get();
+}
+
+SubresourceFilterContentSettingsManagerFactory::
+    SubresourceFilterContentSettingsManagerFactory()
+    : BrowserContextKeyedServiceFactory(
+          "SubresourceFilterContentSettingsManager",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+KeyedService*
+SubresourceFilterContentSettingsManagerFactory::BuildServiceInstanceFor(
+    content::BrowserContext* profile) const {
+  return new SubresourceFilterContentSettingsManager(
+      static_cast<Profile*>(profile));
+}
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.h b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.h
similarity index 69%
rename from chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.h
rename to chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.h
index fffa762..ead85d07 100644
--- a/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.h
+++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_OBSERVER_FACTORY_H_
-#define CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_OBSERVER_FACTORY_H_
+#ifndef CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_MANAGER_FACTORY_H_
+#define CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_MANAGER_FACTORY_H_
 
 #include "base/macros.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
@@ -13,20 +13,20 @@
 
 // This class is responsible for instantiating a profile-scoped object which
 // observes changes to content settings.
-class SubresourceFilterContentSettingsObserverFactory
+class SubresourceFilterContentSettingsManagerFactory
     : public BrowserContextKeyedServiceFactory {
  public:
   static void EnsureForProfile(Profile* profile);
 
-  static SubresourceFilterContentSettingsObserverFactory* GetInstance();
+  static SubresourceFilterContentSettingsManagerFactory* GetInstance();
 
-  SubresourceFilterContentSettingsObserverFactory();
+  SubresourceFilterContentSettingsManagerFactory();
 
  private:
   KeyedService* BuildServiceInstanceFor(
       content::BrowserContext* profile) const override;
 
-  DISALLOW_COPY_AND_ASSIGN(SubresourceFilterContentSettingsObserverFactory);
+  DISALLOW_COPY_AND_ASSIGN(SubresourceFilterContentSettingsManagerFactory);
 };
 
-#endif  // CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_OBSERVER_FACTORY_H_
+#endif  // CHROME_BROWSER_SUBRESOURCE_FILTER_SUBRESOURCE_FILTER_CONTENT_SETTINGS_MANAGER_FACTORY_H_
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory_unittest.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory_unittest.cc
similarity index 85%
rename from chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory_unittest.cc
rename to chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory_unittest.cc
index a6d95bc4..39f683b 100644
--- a/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory_unittest.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.h"
+#include "chrome/browser/subresource_filter/subresource_filter_content_settings_manager_factory.h"
 
 #include "base/macros.h"
 #include "base/test/histogram_tester.h"
@@ -17,13 +17,13 @@
 
 const char kActionsHistogram[] = "SubresourceFilter.Actions";
 
-class SubresourceFilterContentSettingsObserverFactoryTest
+class SubresourceFilterContentSettingsManagerFactoryTest
     : public testing::Test {
  public:
-  SubresourceFilterContentSettingsObserverFactoryTest() {}
+  SubresourceFilterContentSettingsManagerFactoryTest() {}
 
   void SetUp() override {
-    SubresourceFilterContentSettingsObserverFactory::EnsureForProfile(
+    SubresourceFilterContentSettingsManagerFactory::EnsureForProfile(
         &testing_profile_);
     histogram_tester().ExpectTotalCount(kActionsHistogram, 0);
   }
@@ -39,16 +39,16 @@
   TestingProfile testing_profile_;
   base::HistogramTester histogram_tester_;
 
-  DISALLOW_COPY_AND_ASSIGN(SubresourceFilterContentSettingsObserverFactoryTest);
+  DISALLOW_COPY_AND_ASSIGN(SubresourceFilterContentSettingsManagerFactoryTest);
 };
 
-TEST_F(SubresourceFilterContentSettingsObserverFactoryTest, IrrelevantSetting) {
+TEST_F(SubresourceFilterContentSettingsManagerFactoryTest, IrrelevantSetting) {
   GetSettingsMap()->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_POPUPS,
                                              CONTENT_SETTING_ALLOW);
   histogram_tester().ExpectTotalCount(kActionsHistogram, 0);
 }
 
-TEST_F(SubresourceFilterContentSettingsObserverFactoryTest, DefaultSetting) {
+TEST_F(SubresourceFilterContentSettingsManagerFactoryTest, DefaultSetting) {
   GetSettingsMap()->SetDefaultContentSetting(
       CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, CONTENT_SETTING_ALLOW);
   histogram_tester().ExpectBucketCount(kActionsHistogram,
@@ -61,7 +61,7 @@
                                        kActionContentSettingsBlockedGlobal, 1);
 }
 
-TEST_F(SubresourceFilterContentSettingsObserverFactoryTest, UrlSetting) {
+TEST_F(SubresourceFilterContentSettingsManagerFactoryTest, UrlSetting) {
   GURL url("https://www.example.test/");
 
   GetSettingsMap()->SetContentSettingDefaultScope(
@@ -78,7 +78,7 @@
                                        kActionContentSettingsAllowed, 1);
 }
 
-TEST_F(SubresourceFilterContentSettingsObserverFactoryTest, WildcardUpdate) {
+TEST_F(SubresourceFilterContentSettingsManagerFactoryTest, WildcardUpdate) {
   ContentSettingsPattern primary_pattern =
       ContentSettingsPattern::FromString("[*.]example.test");
   ContentSettingsPattern secondary_pattern = ContentSettingsPattern::Wildcard();
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.cc
deleted file mode 100644
index e530987..0000000
--- a/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.h"
-
-#include <string>
-
-#include "base/logging.h"
-#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
-#include "components/content_settings/core/browser/content_settings_details.h"
-#include "components/content_settings/core/browser/content_settings_observer.h"
-#include "components/content_settings/core/browser/host_content_settings_map.h"
-#include "components/content_settings/core/common/content_settings.h"
-#include "components/content_settings/core/common/content_settings_pattern.h"
-#include "components/content_settings/core/common/content_settings_types.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "components/keyed_service/core/keyed_service.h"
-#include "url/gurl.h"
-
-namespace {
-
-// This class observers subresource filter content settings changes for metrics
-// collection.
-//
-// TODO(csharrison): Consider moving this class to its own file if the
-// subresource filter needs to keep other profile-scoped state.
-class SubresourceFilterContentSettingsObserver
-    : public KeyedService,
-      public content_settings::Observer {
- public:
-  explicit SubresourceFilterContentSettingsObserver(Profile* profile)
-      : settings_map_(HostContentSettingsMapFactory::GetForProfile(profile)) {
-    DCHECK(profile);
-    DCHECK(settings_map_);
-    settings_map_->AddObserver(this);
-  }
-
-  ~SubresourceFilterContentSettingsObserver() override {}
-
- private:
-  // KeyedService:
-  void Shutdown() override {
-    settings_map_->RemoveObserver(this);
-    settings_map_ = nullptr;
-  }
-
-  // content_settings::Observer:
-  void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern,
-                               const ContentSettingsPattern& secondary_pattern,
-                               ContentSettingsType content_type,
-                               std::string resource_identifier) override {
-    if (content_type != CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER)
-      return;
-
-    const ContentSettingsDetails details(primary_pattern, secondary_pattern,
-                                         content_type, resource_identifier);
-    if (details.update_all()) {
-      ContentSetting global_setting = settings_map_->GetDefaultContentSetting(
-          CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, nullptr);
-      if (global_setting == CONTENT_SETTING_BLOCK) {
-        ChromeSubresourceFilterClient::LogAction(
-            kActionContentSettingsBlockedGlobal);
-      } else if (global_setting == CONTENT_SETTING_ALLOW) {
-        ChromeSubresourceFilterClient::LogAction(
-            kActionContentSettingsAllowedGlobal);
-      } else {
-        NOTREACHED();
-      }
-      return;
-    }
-
-    // Remove this DCHECK if extension APIs or admin policies are given the
-    // ability to set secondary patterns for this setting.
-    DCHECK(secondary_pattern == ContentSettingsPattern::Wildcard());
-
-    DCHECK(primary_pattern.IsValid());
-
-    // An invalid URL indicates that this is a wildcard pattern.
-    GURL url = GURL(primary_pattern.ToString());
-    if (!url.is_valid()) {
-      ChromeSubresourceFilterClient::LogAction(
-          kActionContentSettingsWildcardUpdate);
-      return;
-    }
-
-    ContentSetting setting = settings_map_->GetContentSetting(
-        url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER,
-        std::string());
-    if (setting == CONTENT_SETTING_BLOCK) {
-      ChromeSubresourceFilterClient::LogAction(kActionContentSettingsBlocked);
-    } else if (setting == CONTENT_SETTING_ALLOW) {
-      ChromeSubresourceFilterClient::LogAction(kActionContentSettingsAllowed);
-    } else {
-      NOTREACHED();
-    }
-  }
-
-  HostContentSettingsMap* settings_map_;
-
-  DISALLOW_COPY_AND_ASSIGN(SubresourceFilterContentSettingsObserver);
-};
-
-}  // namespace
-
-// static
-void SubresourceFilterContentSettingsObserverFactory::EnsureForProfile(
-    Profile* profile) {
-  GetInstance()->GetServiceForBrowserContext(profile, true /* create */);
-}
-
-// static
-SubresourceFilterContentSettingsObserverFactory*
-SubresourceFilterContentSettingsObserverFactory::GetInstance() {
-  return base::Singleton<
-      SubresourceFilterContentSettingsObserverFactory>::get();
-}
-
-SubresourceFilterContentSettingsObserverFactory::
-    SubresourceFilterContentSettingsObserverFactory()
-    : BrowserContextKeyedServiceFactory(
-          "SubresourceFilterContentSettingsObserver",
-          BrowserContextDependencyManager::GetInstance()) {}
-
-KeyedService*
-SubresourceFilterContentSettingsObserverFactory::BuildServiceInstanceFor(
-    content::BrowserContext* profile) const {
-  return new SubresourceFilterContentSettingsObserver(
-      static_cast<Profile*>(profile));
-}
diff --git a/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc b/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc
index 480c624def..ded2b60 100644
--- a/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc
@@ -129,21 +129,27 @@
     apps_list.Append(std::move(app_info));
   }
 
-  const auto& arc_apps = ArcKioskAppManager::Get()->GetAllApps();
+  ArcKioskAppManager::Apps arc_apps;
+  ArcKioskAppManager::Get()->GetAllApps(&arc_apps);
   for (size_t i = 0; i < arc_apps.size(); ++i) {
     std::unique_ptr<base::DictionaryValue> app_info(
         new base::DictionaryValue());
     app_info->SetBoolean("isApp", true);
     app_info->SetBoolean("isAndroidApp", true);
-    app_info->SetString("id", arc_apps[i].app_info().package_name());
+    app_info->SetString("id", arc_apps[i]->app_id());
     app_info->SetString("account_email",
-                        arc_apps[i].account_id().GetUserEmail());
-    app_info->SetString("label", arc_apps[i].name());
+                        arc_apps[i]->account_id().GetUserEmail());
+    app_info->SetString("label", arc_apps[i]->name());
 
-    std::string icon_url =
-        webui::GetBitmapDataUrl(*ResourceBundle::GetSharedInstance()
-                                     .GetImageNamed(IDR_APP_DEFAULT_ICON)
-                                     .ToSkBitmap());
+    std::string icon_url;
+    if (arc_apps[i]->icon().isNull()) {
+      icon_url =
+          webui::GetBitmapDataUrl(*ResourceBundle::GetSharedInstance()
+                                       .GetImageNamed(IDR_APP_DEFAULT_ICON)
+                                       .ToSkBitmap());
+    } else {
+      icon_url = webui::GetBitmapDataUrl(*arc_apps[i]->icon().bitmap());
+    }
     app_info->SetString("iconUrl", icon_url);
 
     apps_list.Append(std::move(app_info));
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index ea3a026..4a0ff237c 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3379,7 +3379,7 @@
     "../browser/status_icons/status_icon_unittest.cc",
     "../browser/status_icons/status_tray_unittest.cc",
     "../browser/storage/durable_storage_permission_context_unittest.cc",
-    "../browser/subresource_filter/subresource_filter_content_settings_observer_factory_unittest.cc",
+    "../browser/subresource_filter/subresource_filter_content_settings_manager_factory_unittest.cc",
     "../browser/sync/profile_sync_service_factory_unittest.cc",
     "../browser/sync/sync_startup_tracker_unittest.cc",
     "../browser/task_profiler/task_profiler_data_serializer_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc
index bc71766..8d7d7258 100644
--- a/components/autofill/core/browser/autofill_download_manager.cc
+++ b/components/autofill/core/browser/autofill_download_manager.cc
@@ -56,9 +56,9 @@
             "fill out web forms in a single click.' in Chromium's settings "
             "under 'Passwords and forms'. The feature is enabled by default."
           chrome_policy {
-            AutofillEnabled {
+            AutoFillEnabled {
                 policy_options {mode: MANDATORY}
-                AutofillEnabled: false
+                AutoFillEnabled: false
             }
           }
         })");
@@ -90,9 +90,9 @@
           "fill out web forms in a single click.' in Chromium's settings "
           "under 'Passwords and forms'. The feature is enabled by default."
         chrome_policy {
-          AutofillEnabled {
+          AutoFillEnabled {
               policy_options {mode: MANDATORY}
-              AutofillEnabled: false
+              AutoFillEnabled: false
           }
         }
       })");
diff --git a/components/drive/change_list_processor_unittest.cc b/components/drive/change_list_processor_unittest.cc
index da26090..bffb86dd 100644
--- a/components/drive/change_list_processor_unittest.cc
+++ b/components/drive/change_list_processor_unittest.cc
@@ -8,6 +8,7 @@
 #include <stdint.h>
 #include <utility>
 
+#include "base/command_line.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
@@ -22,6 +23,7 @@
 #include "components/drive/file_system_core_util.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "google_apis/drive/drive_api_parser.h"
+#include "google_apis/drive/drive_switches.h"
 #include "google_apis/drive/test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -117,9 +119,11 @@
                                fake_free_disk_space_getter_.get()));
     ASSERT_TRUE(cache_->Initialize());
 
-    metadata_.reset(new internal::ResourceMetadata(
-        metadata_storage_.get(), cache_.get(),
-        base::ThreadTaskRunnerHandle::Get()));
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(
+        google_apis::kEnableTeamDrives);
+    metadata_.reset(
+        new internal::ResourceMetadata(metadata_storage_.get(), cache_.get(),
+                                       base::ThreadTaskRunnerHandle::Get()));
     ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize());
   }
 
@@ -658,5 +662,72 @@
   EXPECT_EQ(new_file_local.title(), entry.title());
 }
 
+TEST_F(ChangeListProcessorTest, DeltaTeamDriveChange) {
+  const char kTeamDriveId[] = "ID_OF_TEAM_DRIVE";
+  const char kOldName[] = "Old Name";
+  const char kNewName[] = "New Name";
+
+  ResourceEntry team_drive;
+  team_drive.set_title(kOldName);
+  team_drive.set_resource_id(kTeamDriveId);
+  team_drive.set_parent_local_id(util::kDriveTeamDrivesDirLocalId);
+
+  std::vector<std::unique_ptr<ChangeList>> change_lists;
+  change_lists.push_back(base::MakeUnique<ChangeList>());
+  change_lists[0]->mutable_entries()->push_back(team_drive);
+  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp + 1);
+  change_lists[0]->mutable_parent_resource_ids()->push_back("");
+
+  // Apply the changelist and check the effect.
+  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
+
+  FileChange changed_files;
+  EXPECT_EQ(FILE_ERROR_OK,
+            ApplyChangeList(std::move(change_lists), &changed_files));
+
+  int64_t changestamp = 0;
+  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
+  EXPECT_EQ(kBaseResourceListChangestamp + 1, changestamp);
+
+  ResourceEntry entry;
+  EXPECT_EQ(
+      FILE_ERROR_OK,
+      metadata_->GetResourceEntryByPath(
+          util::GetDriveTeamDrivesRootPath().AppendASCII(kOldName), &entry));
+  EXPECT_EQ(kTeamDriveId, entry.resource_id());
+
+  // Change to Team Drive entry is also conted as a file change.
+  EXPECT_EQ(1U, changed_files.size());
+
+  // Second change, which updates Team Drive name
+  change_lists.clear();
+  change_lists.push_back(base::MakeUnique<ChangeList>());
+  team_drive.set_title(kNewName);
+  change_lists[0]->mutable_entries()->push_back(team_drive);
+  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp + 2);
+  change_lists[0]->mutable_parent_resource_ids()->push_back("");
+  EXPECT_EQ(FILE_ERROR_OK,
+            ApplyChangeList(std::move(change_lists), &changed_files));
+  EXPECT_EQ(
+      FILE_ERROR_OK,
+      metadata_->GetResourceEntryByPath(
+          util::GetDriveTeamDrivesRootPath().AppendASCII(kNewName), &entry));
+  EXPECT_EQ(kTeamDriveId, entry.resource_id());
+
+  // Delete the team drive.
+  change_lists.clear();
+  change_lists.push_back(base::MakeUnique<ChangeList>());
+  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp + 3);
+  team_drive.set_deleted(true);
+  change_lists[0]->mutable_parent_resource_ids()->push_back("");
+  change_lists[0]->mutable_entries()->push_back(team_drive);
+  EXPECT_EQ(FILE_ERROR_OK,
+            ApplyChangeList(std::move(change_lists), &changed_files));
+  EXPECT_EQ(
+      FILE_ERROR_NOT_FOUND,
+      metadata_->GetResourceEntryByPath(
+          util::GetDriveTeamDrivesRootPath().AppendASCII(kNewName), &entry));
+}
+
 }  // namespace internal
 }  // namespace drive
diff --git a/components/drive/chromeos/change_list_processor.cc b/components/drive/chromeos/change_list_processor.cc
index 3eb96bb..6bee2ba 100644
--- a/components/drive/chromeos/change_list_processor.cc
+++ b/components/drive/chromeos/change_list_processor.cc
@@ -81,8 +81,7 @@
   size_t entries_index = 0;
   for (size_t i = 0; i < items.size(); ++i) {
     if (ConvertChangeResourceToResourceEntry(
-            *items[i],
-            &entries_[entries_index],
+            *items[i], &entries_[entries_index],
             &parent_resource_ids_[entries_index])) {
       ++entries_index;
     }
@@ -348,6 +347,7 @@
 
 FileError ChangeListProcessor::ApplyEntry(const ResourceEntry& entry) {
   DCHECK(!entry.deleted());
+  DCHECK(!entry.resource_id().empty());
   DCHECK(parent_resource_id_map_.count(entry.resource_id()));
   const std::string& parent_resource_id =
       parent_resource_id_map_[entry.resource_id()];
@@ -465,6 +465,11 @@
     ResourceMetadata* resource_metadata,
     ResourceEntry* entry,
     const std::string& parent_resource_id) {
+  if (entry->parent_local_id() == util::kDriveTeamDrivesDirLocalId) {
+    // When |entry| is a root directory of a Team Drive, the parent directory
+    // of it is "/team_drives", which doesn't have resource ID.
+    return FILE_ERROR_OK;
+  }
   std::string parent_local_id;
   if (parent_resource_id.empty()) {
     // Entries without parents should go under "other" directory.
diff --git a/components/drive/chromeos/change_list_processor.h b/components/drive/chromeos/change_list_processor.h
index 0c23efa..ea8e215 100644
--- a/components/drive/chromeos/change_list_processor.h
+++ b/components/drive/chromeos/change_list_processor.h
@@ -16,7 +16,6 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "components/drive/file_errors.h"
-#include "components/drive/file_errors.h"
 #include "url/gurl.h"
 
 namespace base {
diff --git a/components/drive/file_system_core_util.cc b/components/drive/file_system_core_util.cc
index bd668da..f3df85a3 100644
--- a/components/drive/file_system_core_util.cc
+++ b/components/drive/file_system_core_util.cc
@@ -80,6 +80,13 @@
   return drive_root_path;
 }
 
+const base::FilePath& GetDriveTeamDrivesRootPath() {
+  CR_DEFINE_STATIC_LOCAL(
+      base::FilePath, team_drives_root_path,
+      (GetDriveGrandRootPath().AppendASCII(kDriveTeamDrivesDirName)));
+  return team_drives_root_path;
+}
+
 std::string EscapeCacheFileName(const std::string& filename) {
   // This is based on net/base/escape.cc: net::(anonymous namespace)::Escape
   std::string escaped;
diff --git a/components/drive/file_system_core_util.h b/components/drive/file_system_core_util.h
index 43bbc743..6b1eef1 100644
--- a/components/drive/file_system_core_util.h
+++ b/components/drive/file_system_core_util.h
@@ -42,6 +42,9 @@
 // Returns the path of the directory representing "My Drive".
 const base::FilePath& GetDriveMyDriveRootPath();
 
+// Returns the path of the directory representing "Team Drives".
+const base::FilePath& GetDriveTeamDrivesRootPath();
+
 // Escapes a file name in Drive cache.
 // Replaces percent ('%'), period ('.') and slash ('/') with %XX (hex)
 std::string EscapeCacheFileName(const std::string& filename);
diff --git a/components/drive/resource_entry_conversion.cc b/components/drive/resource_entry_conversion.cc
index 52eda29b..7b719f8 100644
--- a/components/drive/resource_entry_conversion.cc
+++ b/components/drive/resource_entry_conversion.cc
@@ -26,12 +26,18 @@
 
   ResourceEntry converted;
   std::string parent_resource_id;
-  if (input.file() &&
-      !ConvertFileResourceToResourceEntry(*input.file(), &converted,
-                                          &parent_resource_id))
+  if (input.type() == google_apis::ChangeResource::TEAM_DRIVE) {
+    converted.mutable_file_info()->set_is_directory(true);
+    converted.set_parent_local_id(util::kDriveTeamDrivesDirLocalId);
+    if (input.team_drive())
+      ConvertTeamDriveResourceToResourceEntry(*input.team_drive(), &converted);
+    converted.set_resource_id(input.team_drive_id());
+  } else {
+    if (input.file() && !ConvertFileResourceToResourceEntry(
+                            *input.file(), &converted, &parent_resource_id))
       return false;
-
-  converted.set_resource_id(input.file_id());
+    converted.set_resource_id(input.file_id());
+  }
   converted.set_deleted(converted.deleted() || input.is_deleted());
   converted.set_modification_date(input.modification_date().ToInternalValue());
 
@@ -128,6 +134,14 @@
   return true;
 }
 
+void ConvertTeamDriveResourceToResourceEntry(
+    const google_apis::TeamDriveResource& input,
+    ResourceEntry* out_entry) {
+  DCHECK(out_entry);
+  out_entry->set_title(input.name());
+  out_entry->set_base_name(input.name());
+}
+
 void ConvertResourceEntryToFileInfo(const ResourceEntry& entry,
                                     base::File::Info* file_info) {
   file_info->size = entry.file_info().size();
diff --git a/components/drive/resource_entry_conversion.h b/components/drive/resource_entry_conversion.h
index 2de228e..b0d2f162 100644
--- a/components/drive/resource_entry_conversion.h
+++ b/components/drive/resource_entry_conversion.h
@@ -12,6 +12,7 @@
 namespace google_apis {
 class ChangeResource;
 class FileResource;
+class TeamDriveResource;
 }
 
 namespace drive {
@@ -44,6 +45,11 @@
     ResourceEntry* out_entry,
     std::string* out_parent_resource_id);
 
+// Converts a TeamDriveResource into a drive::ResourceEntry.
+void ConvertTeamDriveResourceToResourceEntry(
+    const google_apis::TeamDriveResource& input,
+    ResourceEntry* out_entry);
+
 // Converts the resource entry to the platform file info.
 void ConvertResourceEntryToFileInfo(const ResourceEntry& entry,
                                     base::File::Info* file_info);
diff --git a/components/drive/resource_entry_conversion_unittest.cc b/components/drive/resource_entry_conversion_unittest.cc
index f5e93f5..971063c 100644
--- a/components/drive/resource_entry_conversion_unittest.cc
+++ b/components/drive/resource_entry_conversion_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/time/time.h"
 #include "components/drive/drive.pb.h"
 #include "components/drive/drive_api_util.h"
+#include "components/drive/file_system_core_util.h"
 #include "google_apis/drive/drive_api_parser.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -393,4 +394,56 @@
   }
 }
 
+TEST(ResourceEntryConversionTest,
+     ConvertTeamDriveChangeResourceToResourceEntry) {
+  google_apis::ChangeResource change_resource;
+  change_resource.set_type(google_apis::ChangeResource::TEAM_DRIVE);
+  change_resource.set_team_drive(
+      base::WrapUnique(new google_apis::TeamDriveResource));
+  change_resource.set_team_drive_id("team_drive_id");
+  change_resource.set_modification_date(GetTestTime());
+  change_resource.set_deleted(false);
+
+  google_apis::TeamDriveResource* team_drive_resource =
+      change_resource.mutable_team_drive();
+  team_drive_resource->set_name("ABC Team Drive");
+  team_drive_resource->set_id("team_drive_id");
+
+  ResourceEntry entry;
+  std::string parent_resource_id;
+  EXPECT_TRUE(ConvertChangeResourceToResourceEntry(change_resource, &entry,
+                                                   &parent_resource_id));
+
+  EXPECT_EQ(change_resource.team_drive_id(), entry.resource_id());
+  EXPECT_EQ(team_drive_resource->name(), entry.title());
+  EXPECT_EQ(team_drive_resource->name(), entry.base_name());
+  EXPECT_EQ(change_resource.modification_date().ToInternalValue(),
+            entry.modification_date());
+  EXPECT_EQ(util::kDriveTeamDrivesDirLocalId, entry.parent_local_id());
+  EXPECT_EQ("", parent_resource_id);
+  EXPECT_FALSE(entry.deleted());
+}
+
+TEST(ResourceEntryConversionTest,
+     ConvertTeamDriveRemovalChangeResourceToResourceEntry) {
+  google_apis::ChangeResource change_resource;
+  change_resource.set_type(google_apis::ChangeResource::TEAM_DRIVE);
+  change_resource.set_team_drive_id("team_drive_id");
+  change_resource.set_modification_date(GetTestTime());
+  change_resource.set_deleted(true);
+  // team_drive field is not filled for a deleted change resource.
+
+  ResourceEntry entry;
+  std::string parent_resource_id;
+  EXPECT_TRUE(ConvertChangeResourceToResourceEntry(change_resource, &entry,
+                                                   &parent_resource_id));
+
+  EXPECT_EQ(change_resource.team_drive_id(), entry.resource_id());
+  EXPECT_EQ(change_resource.modification_date().ToInternalValue(),
+            entry.modification_date());
+  EXPECT_EQ(util::kDriveTeamDrivesDirLocalId, entry.parent_local_id());
+  EXPECT_EQ("", parent_resource_id);
+  EXPECT_TRUE(entry.deleted());
+}
+
 }  // namespace drive
diff --git a/components/password_manager/content/browser/credential_manager_impl.cc b/components/password_manager/content/browser/credential_manager_impl.cc
index 2af0eb70..14261cc 100644
--- a/components/password_manager/content/browser/credential_manager_impl.cc
+++ b/components/password_manager/content/browser/credential_manager_impl.cc
@@ -200,7 +200,7 @@
 }
 
 bool CredentialManagerImpl::IsZeroClickAllowed() const {
-  return *auto_signin_enabled_ && !client_->IsOffTheRecord();
+  return *auto_signin_enabled_ && !client_->IsIncognito();
 }
 
 GURL CredentialManagerImpl::GetOrigin() const {
diff --git a/components/password_manager/content/browser/credential_manager_impl_unittest.cc b/components/password_manager/content/browser/credential_manager_impl_unittest.cc
index a9f347e40..4032c52 100644
--- a/components/password_manager/content/browser/credential_manager_impl_unittest.cc
+++ b/components/password_manager/content/browser/credential_manager_impl_unittest.cc
@@ -59,7 +59,7 @@
   MOCK_CONST_METHOD0(IsSavingAndFillingEnabledForCurrentPage, bool());
   MOCK_CONST_METHOD0(IsFillingEnabledForCurrentPage, bool());
   MOCK_METHOD0(OnCredentialManagerUsed, bool());
-  MOCK_CONST_METHOD0(IsOffTheRecord, bool());
+  MOCK_CONST_METHOD0(IsIncognito, bool());
   MOCK_METHOD0(NotifyUserAutoSigninPtr, bool());
   MOCK_METHOD1(NotifyUserCouldBeAutoSignedInPtr,
                bool(autofill::PasswordForm* form));
@@ -224,7 +224,7 @@
         .WillByDefault(testing::Return(true));
     ON_CALL(*client_, OnCredentialManagerUsed())
         .WillByDefault(testing::Return(true));
-    ON_CALL(*client_, IsOffTheRecord()).WillByDefault(testing::Return(false));
+    ON_CALL(*client_, IsIncognito()).WillByDefault(testing::Return(false));
 
     NavigateAndCommit(GURL("https://example.com/test.html"));
 
@@ -1298,7 +1298,7 @@
 }
 
 TEST_F(CredentialManagerImplTest, NoResetSkipZeroClickAfterPromptInIncognito) {
-  EXPECT_CALL(*client_, IsOffTheRecord()).WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(*client_, IsIncognito()).WillRepeatedly(testing::Return(true));
   // Turn on the global zero-click flag which should be overriden by Incognito.
   client_->set_zero_click_enabled(true);
   form_.skip_zero_click = true;
@@ -1333,7 +1333,7 @@
 }
 
 TEST_F(CredentialManagerImplTest, IncognitoZeroClickRequestCredential) {
-  EXPECT_CALL(*client_, IsOffTheRecord()).WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(*client_, IsIncognito()).WillRepeatedly(testing::Return(true));
   store_->AddLogin(form_);
 
   std::vector<GURL> federations;
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index ba04364ea1..eb88be6 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -377,7 +377,7 @@
 
 void PasswordFormManager::PermanentlyBlacklist() {
   DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState());
-  DCHECK(!client_->IsOffTheRecord());
+  DCHECK(!client_->IsIncognito());
 
   if (!new_blacklisted_) {
     new_blacklisted_ = base::MakeUnique<PasswordForm>(observed_form_);
@@ -417,7 +417,7 @@
 
 void PasswordFormManager::Save() {
   DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState());
-  DCHECK(!client_->IsOffTheRecord());
+  DCHECK(!client_->IsIncognito());
 
   if ((user_action_ == kUserActionNone) &&
       DidPreferenceChange(best_matches_, pending_credentials_.username_value)) {
@@ -630,7 +630,7 @@
   // via affiliation-based matching (we want to autofill them).
   // TODO(engedy): Clean this up. See: https://crbug.com/476519.
   bool wait_for_username =
-      client_->IsOffTheRecord() ||
+      client_->IsIncognito() ||
       (!IsValidAndroidFacetURI(preferred_match_->signon_realm) &&
        (observed_form_.action.GetWithEmptyPath() !=
             preferred_match_->action.GetWithEmptyPath() ||
@@ -676,7 +676,7 @@
   // username, or the user selected one of the non-preferred matches,
   // thus requiring a swap of preferred bits.
   DCHECK(!IsNewLogin() && pending_credentials_.preferred);
-  DCHECK(!client_->IsOffTheRecord());
+  DCHECK(!client_->IsIncognito());
 
   UpdateMetadataForUsage(&pending_credentials_);
 
diff --git a/components/password_manager/core/browser/password_generation_manager_unittest.cc b/components/password_manager/core/browser/password_generation_manager_unittest.cc
index 57ed658..9a08022 100644
--- a/components/password_manager/core/browser/password_generation_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_generation_manager_unittest.cc
@@ -83,7 +83,7 @@
  public:
   MOCK_CONST_METHOD0(GetPasswordSyncState, PasswordSyncState());
   MOCK_CONST_METHOD0(IsSavingAndFillingEnabledForCurrentPage, bool());
-  MOCK_CONST_METHOD0(IsOffTheRecord, bool());
+  MOCK_CONST_METHOD0(IsIncognito, bool());
 
   explicit MockPasswordManagerClient(std::unique_ptr<PrefService> prefs)
       : prefs_(std::move(prefs)),
@@ -278,7 +278,7 @@
   // Disable password manager by going incognito. Even though password
   // syncing is enabled, generation should still
   // be disabled.
-  EXPECT_CALL(*client_, IsOffTheRecord()).WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(*client_, IsIncognito()).WillRepeatedly(testing::Return(true));
   PrefService* prefs = client_->GetPrefs();
   prefs->SetBoolean(prefs::kCredentialsEnableService, true);
   EXPECT_CALL(*client_, GetPasswordSyncState())
diff --git a/components/password_manager/core/browser/password_manager_client.cc b/components/password_manager/core/browser/password_manager_client.cc
index 93bed56..6ed6f1e 100644
--- a/components/password_manager/core/browser/password_manager_client.cc
+++ b/components/password_manager/core/browser/password_manager_client.cc
@@ -48,7 +48,7 @@
   return false;
 }
 
-bool PasswordManagerClient::IsOffTheRecord() const {
+bool PasswordManagerClient::IsIncognito() const {
   return false;
 }
 
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h
index 92dad1f3..5e854e1 100644
--- a/components/password_manager/core/browser/password_manager_client.h
+++ b/components/password_manager/core/browser/password_manager_client.h
@@ -171,7 +171,7 @@
   virtual bool DidLastPageLoadEncounterSSLErrors() const;
 
   // If this browsing session should not be persisted.
-  virtual bool IsOffTheRecord() const;
+  virtual bool IsIncognito() const;
 
   // Returns the PasswordManager associated with this client. The non-const
   // version calls the const one.
diff --git a/components/payments/core/strings_util.cc b/components/payments/core/strings_util.cc
index 266aeaf..8c405e5 100644
--- a/components/payments/core/strings_util.cc
+++ b/components/payments/core/strings_util.cc
@@ -10,6 +10,24 @@
 
 namespace payments {
 
+base::string16 GetShippingAddressSelectorInfoMessage(
+    PaymentShippingType shipping_type) {
+  switch (shipping_type) {
+    case payments::PaymentShippingType::DELIVERY:
+      return l10n_util::GetStringUTF16(
+          IDS_PAYMENTS_SELECT_DELIVERY_ADDRESS_FOR_DELIVERY_METHODS);
+    case payments::PaymentShippingType::PICKUP:
+      return l10n_util::GetStringUTF16(
+          IDS_PAYMENTS_SELECT_PICKUP_ADDRESS_FOR_PICKUP_METHODS);
+    case payments::PaymentShippingType::SHIPPING:
+      return l10n_util::GetStringUTF16(
+          IDS_PAYMENTS_SELECT_SHIPPING_ADDRESS_FOR_SHIPPING_METHODS);
+    default:
+      NOTREACHED();
+      return base::string16();
+  }
+}
+
 base::string16 GetShippingAddressSectionString(
     PaymentShippingType shipping_type) {
   switch (shipping_type) {
diff --git a/components/payments/core/strings_util.h b/components/payments/core/strings_util.h
index 9653025..3d72567 100644
--- a/components/payments/core/strings_util.h
+++ b/components/payments/core/strings_util.h
@@ -10,6 +10,11 @@
 
 namespace payments {
 
+// Gets the informational message to be displayed in the shipping address
+// selector view when there are no valid shipping options.
+base::string16 GetShippingAddressSelectorInfoMessage(
+    PaymentShippingType shipping_type);
+
 // Gets the appropriate display string for the Shipping Address string for the
 // given PaymentShippingType.
 base::string16 GetShippingAddressSectionString(
diff --git a/content/renderer/media/media_stream_video_capturer_source.cc b/content/renderer/media/media_stream_video_capturer_source.cc
index 62cf8d1..1eccdda 100644
--- a/content/renderer/media/media_stream_video_capturer_source.cc
+++ b/content/renderer/media/media_stream_video_capturer_source.cc
@@ -655,7 +655,8 @@
 base::Optional<media::VideoCaptureFormat>
 MediaStreamVideoCapturerSource::GetCurrentFormatImpl() const {
   DCHECK(!IsOldVideoConstraints());
-  return capture_params_.requested_format;
+  return base::Optional<media::VideoCaptureFormat>(
+      capture_params_.requested_format);
 }
 
 void MediaStreamVideoCapturerSource::OnRunStateChanged(bool is_running) {
diff --git a/content/renderer/media/mock_media_stream_video_source.cc b/content/renderer/media/mock_media_stream_video_source.cc
index 1e36c2fc..f459bf1 100644
--- a/content/renderer/media/mock_media_stream_video_source.cc
+++ b/content/renderer/media/mock_media_stream_video_source.cc
@@ -104,7 +104,7 @@
 
 base::Optional<media::VideoCaptureFormat>
 MockMediaStreamVideoSource::GetCurrentFormatImpl() const {
-  return format_;
+  return base::Optional<media::VideoCaptureFormat>(format_);
 }
 
 void MockMediaStreamVideoSource::DeliverVideoFrame(
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.cc b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
index 42ae7eb..548b1380 100644
--- a/content/renderer/pepper/pepper_media_stream_video_track_host.cc
+++ b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
@@ -447,9 +447,10 @@
       const override {
     DCHECK(!IsOldVideoConstraints());
     if (host_) {
-      return media::VideoCaptureFormat(
-          host_->plugin_frame_size_, kDefaultOutputFrameRate,
-          ToPixelFormat(host_->plugin_frame_format_));
+      return base::Optional<media::VideoCaptureFormat>(
+          media::VideoCaptureFormat(
+              host_->plugin_frame_size_, kDefaultOutputFrameRate,
+              ToPixelFormat(host_->plugin_frame_format_)));
     }
     return base::Optional<media::VideoCaptureFormat>();
   }
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
index 64f4188..f4cd54b4 100644
--- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -48,6 +48,10 @@
     self.Fail('conformance/textures/misc/texture-corner-case-videos.html',
               bug=701060)
 
+    # canvas.commit() promise synchronization isn't fully reliable yet.
+    self.Fail('conformance/offscreencanvas/offscreencanvas-resize.html',
+              bug=709484)
+
     self.Fail('conformance2/rendering/depth-stencil-feedback-loop.html',
         bug=660844) # WebGL 2.0.1
     self.Fail('conformance2/rendering/rendering-sampling-feedback-loop.html',
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
index cd14908..cdd41f4 100644
--- a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
@@ -105,6 +105,10 @@
     self.Fail('conformance/textures/misc/texture-corner-case-videos.html',
               bug=701060)
 
+    # canvas.commit() promise synchronization isn't fully reliable yet.
+    self.Fail('conformance/offscreencanvas/offscreencanvas-resize.html',
+              bug=709484)
+
     # Passthrough command decoder
     self.Fail('conformance/extensions/ext-sRGB.html',
         ['passthrough'], bug=679696)
diff --git a/google_apis/drive/drive_api_parser.h b/google_apis/drive/drive_api_parser.h
index d45bb56e..477ccfb 100644
--- a/google_apis/drive/drive_api_parser.h
+++ b/google_apis/drive/drive_api_parser.h
@@ -411,8 +411,10 @@
   // The ID of this Team Drive. The ID is the same as the top-level folder for
   // this Team Drive.
   const std::string& id() const { return id_; }
+  void set_id(const std::string& id) { id_ = id; }
   // The name of this Team Drive.
   const std::string& name() const { return name_; }
+  void set_name(const std::string& name) { name_ = name; }
   // Capabilities the current user has on this Team Drive.
   const TeamDriveCapabilities& capabilities() const { return capabilities_; }
 
@@ -875,6 +877,9 @@
   void set_team_drive(std::unique_ptr<TeamDriveResource> team_drive) {
     team_drive_ = std::move(team_drive);
   }
+  void set_team_drive_id(const std::string& team_drive_id) {
+    team_drive_id_ = team_drive_id;
+  }
   void set_modification_date(const base::Time& modification_date) {
     modification_date_ = modification_date;
   }
diff --git a/google_apis/drive/drive_switches.cc b/google_apis/drive/drive_switches.cc
index 581e0680..33d4ac1 100644
--- a/google_apis/drive/drive_switches.cc
+++ b/google_apis/drive/drive_switches.cc
@@ -6,11 +6,8 @@
 #include "google_apis/drive/drive_switches.h"
 
 namespace google_apis {
-namespace {
 // Enables or disables Team Drives integration.
-constexpr char kEnableTeamDrives[] = "team-drives";
-
-}
+const char kEnableTeamDrives[] = "team-drives";
 
 TeamDrivesIntegrationStatus GetTeamDrivesIntegrationSwitch() {
   return base::CommandLine::ForCurrentProcess()->HasSwitch(kEnableTeamDrives) ?
diff --git a/google_apis/drive/drive_switches.h b/google_apis/drive/drive_switches.h
index 1c7460f..a4143ad 100644
--- a/google_apis/drive/drive_switches.h
+++ b/google_apis/drive/drive_switches.h
@@ -15,6 +15,9 @@
 // Whether Team Drives integration is enabled or not.
 TeamDrivesIntegrationStatus GetTeamDrivesIntegrationSwitch();
 
+// For tests which require specific commandline switch settings.
+extern const char kEnableTeamDrives[];
+
 }  // namespace switches
 
 #endif  // GOOGLE_APIS_DRIVE_DRIVE_SWITHES_H_
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
index 46b9ca0c..b0cbd424 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
@@ -55,7 +55,7 @@
   void AutomaticPasswordSave(
       std::unique_ptr<password_manager::PasswordFormManager> saved_form_manager)
       override;
-  bool IsOffTheRecord() const override;
+  bool IsIncognito() const override;
   PrefService* GetPrefs() override;
   password_manager::PasswordStore* GetPasswordStore() const override;
   void NotifyUserAutoSignin(
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
index 855df5c3..6c7c82a 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -88,7 +88,7 @@
   NOTIMPLEMENTED();
 }
 
-bool IOSChromePasswordManagerClient::IsOffTheRecord() const {
+bool IOSChromePasswordManagerClient::IsIncognito() const {
   return (delegate_.browserState)->IsOffTheRecord();
 }
 
@@ -120,7 +120,7 @@
 
 bool IOSChromePasswordManagerClient::IsSavingAndFillingEnabledForCurrentPage()
     const {
-  return *saving_passwords_enabled_ && !IsOffTheRecord() &&
+  return *saving_passwords_enabled_ && !IsIncognito() &&
          !DidLastPageLoadEncounterSSLErrors() &&
          IsFillingEnabledForCurrentPage();
 }
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index 38699bb..d79a421 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -289,7 +289,7 @@
     passwordManager_.reset(new PasswordManager(passwordManagerClient_.get()));
     passwordManagerDriver_.reset(new IOSChromePasswordManagerDriver(self));
     if (experimental_flags::IsPasswordGenerationEnabled() &&
-        !passwordManagerClient_->IsOffTheRecord()) {
+        !passwordManagerClient_->IsIncognito()) {
       passwordGenerationManager_.reset(new PasswordGenerationManager(
           passwordManagerClient_.get(), passwordManagerDriver_.get()));
       passwordGenerationAgent_.reset([[PasswordGenerationAgent alloc]
diff --git a/ios/chrome/browser/passwords/password_controller_off_the_record_unittest.mm b/ios/chrome/browser/passwords/password_controller_off_the_record_unittest.mm
index f88d68c..a273e041 100644
--- a/ios/chrome/browser/passwords/password_controller_off_the_record_unittest.mm
+++ b/ios/chrome/browser/passwords/password_controller_off_the_record_unittest.mm
@@ -21,7 +21,7 @@
 class IncognitoPasswordManagerClient
     : public password_manager::StubPasswordManagerClient {
  public:
-  bool IsOffTheRecord() const override { return true; }
+  bool IsIncognito() const override { return true; }
 };
 
 }  // namespace
diff --git a/ios/chrome/browser/payments/payment_request.h b/ios/chrome/browser/payments/payment_request.h
index a0d32d0..881260a1 100644
--- a/ios/chrome/browser/payments/payment_request.h
+++ b/ios/chrome/browser/payments/payment_request.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "components/payments/core/payment_options_provider.h"
 #include "ios/web/public/payments/payment_request.h"
 
 namespace autofill {
@@ -26,12 +27,12 @@
 // |personal_data_manager| and manages shared resources and user selections for
 // the current PaymentRequest flow. It must be initialized with a non-null
 // instance of |personal_data_manager| that outlives this class.
-class PaymentRequest {
+class PaymentRequest : payments::PaymentOptionsProvider {
  public:
   // |personal_data_manager| should not be null and should outlive this object.
   PaymentRequest(const web::PaymentRequest& web_payment_request,
                  autofill::PersonalDataManager* personal_data_manager);
-  ~PaymentRequest();
+  ~PaymentRequest() override;
 
   autofill::PersonalDataManager* GetPersonalDataManager() const {
     return personal_data_manager_;
@@ -42,16 +43,18 @@
     return web_payment_request_.details;
   }
 
-  // Returns the payment options from |web_payment_request_|.
-  const web::PaymentOptions& payment_options() const {
-    return web_payment_request_.options;
-  }
-
   // Updates the payment details of the |web_payment_request_|. It also updates
   // the cached references to the shipping options in |web_payment_request_| as
   // well as the reference to the selected shipping option.
   void set_payment_details(const web::PaymentDetails& details);
 
+  // PaymentOptionsProvider:
+  bool request_shipping() const override;
+  bool request_payer_name() const override;
+  bool request_payer_phone() const override;
+  bool request_payer_email() const override;
+  payments::PaymentShippingType shipping_type() const override;
+
   // Returns the payments::CurrencyFormatter instance for this PaymentRequest.
   // Note: Having multiple currencies per PaymentRequest flow is not supported;
   // hence the CurrencyFormatter is cached here.
diff --git a/ios/chrome/browser/payments/payment_request.mm b/ios/chrome/browser/payments/payment_request.mm
index 86625b5..e138bae 100644
--- a/ios/chrome/browser/payments/payment_request.mm
+++ b/ios/chrome/browser/payments/payment_request.mm
@@ -39,6 +39,26 @@
   PopulateShippingOptionCache();
 }
 
+bool PaymentRequest::request_shipping() const {
+  return web_payment_request_.options.request_shipping;
+}
+
+bool PaymentRequest::request_payer_name() const {
+  return web_payment_request_.options.request_payer_name;
+}
+
+bool PaymentRequest::request_payer_phone() const {
+  return web_payment_request_.options.request_payer_phone;
+}
+
+bool PaymentRequest::request_payer_email() const {
+  return web_payment_request_.options.request_payer_email;
+}
+
+payments::PaymentShippingType PaymentRequest::shipping_type() const {
+  return web_payment_request_.options.shipping_type;
+}
+
 payments::CurrencyFormatter* PaymentRequest::GetOrCreateCurrencyFormatter() {
   if (!currency_formatter_) {
     currency_formatter_.reset(new payments::CurrencyFormatter(
diff --git a/ios/chrome/browser/payments/payment_request_coordinator.mm b/ios/chrome/browser/payments/payment_request_coordinator.mm
index 4d6e403..fbb42b08 100644
--- a/ios/chrome/browser/payments/payment_request_coordinator.mm
+++ b/ios/chrome/browser/payments/payment_request_coordinator.mm
@@ -224,7 +224,7 @@
       card, cvc, _paymentRequest->billing_profiles(),
       GetApplicationContext()->GetApplicationLocale());
 
-  if (_paymentRequest->payment_options().request_shipping) {
+  if (_paymentRequest->request_shipping()) {
     autofill::AutofillProfile* shippingAddress =
         _paymentRequest->selected_shipping_profile();
     // TODO(crbug.com/602666): User should get here only if they have selected
@@ -239,7 +239,7 @@
     paymentResponse.shipping_option = shippingOption->id;
   }
 
-  if (_paymentRequest->payment_options().request_payer_name) {
+  if (_paymentRequest->request_payer_name()) {
     autofill::AutofillProfile* contactInfo =
         _paymentRequest->selected_contact_profile();
     // TODO(crbug.com/602666): User should get here only if they have selected
@@ -250,7 +250,7 @@
                              GetApplicationContext()->GetApplicationLocale());
   }
 
-  if (_paymentRequest->payment_options().request_payer_email) {
+  if (_paymentRequest->request_payer_email()) {
     autofill::AutofillProfile* contactInfo =
         _paymentRequest->selected_contact_profile();
     // TODO(crbug.com/602666): User should get here only if they have selected
@@ -260,7 +260,7 @@
         contactInfo->GetRawInfo(autofill::EMAIL_ADDRESS);
   }
 
-  if (_paymentRequest->payment_options().request_payer_phone) {
+  if (_paymentRequest->request_payer_phone()) {
     autofill::AutofillProfile* contactInfo =
         _paymentRequest->selected_contact_profile();
     // TODO(crbug.com/602666): User should get here only if they have selected
diff --git a/ios/chrome/browser/payments/payment_request_util.h b/ios/chrome/browser/payments/payment_request_util.h
index dd76b60..ea2533e1 100644
--- a/ios/chrome/browser/payments/payment_request_util.h
+++ b/ios/chrome/browser/payments/payment_request_util.h
@@ -8,6 +8,7 @@
 #import <Foundation/Foundation.h>
 
 #include "base/strings/string16.h"
+#include "components/payments/core/payment_options_provider.h"
 
 namespace autofill {
 class AutofillProfile;
@@ -44,27 +45,13 @@
 
 // Returns the title for the shipping section of the payment summary view given
 // the shipping type specified in |payment_request|.
-NSString* GetShippingSectionTitle(const PaymentRequest& payment_request);
-
-// Returns the title for the shipping address selection view given the shipping
-// type specified in |payment_request|.
-NSString* GetShippingAddressSelectorTitle(
-    const PaymentRequest& payment_request);
-
-// Returns the informational message to be displayed in the shipping address
-// selection view given the shipping type specified in |payment_request|.
-NSString* GetShippingAddressSelectorInfoMessage(
-    const PaymentRequest& payment_request);
+NSString* GetShippingSectionTitle(payments::PaymentShippingType shipping_type);
 
 // Returns the error message to be displayed in the shipping address selection
 // view given the shipping type specified in |payment_request|.
 NSString* GetShippingAddressSelectorErrorMessage(
     const PaymentRequest& payment_request);
 
-// Returns the title for the shipping option selection view given the shipping
-// type specified in |payment_request|.
-NSString* GetShippingOptionSelectorTitle(const PaymentRequest& payment_request);
-
 // Returns the error message to be displayed in the shipping option selection
 // view given the shipping type specified in |payment_request|.
 NSString* GetShippingOptionSelectorErrorMessage(
diff --git a/ios/chrome/browser/payments/payment_request_util.mm b/ios/chrome/browser/payments/payment_request_util.mm
index 7e231e37..1abbfb6 100644
--- a/ios/chrome/browser/payments/payment_request_util.mm
+++ b/ios/chrome/browser/payments/payment_request_util.mm
@@ -79,13 +79,13 @@
   return !label.empty() ? base::SysUTF16ToNSString(label) : nil;
 }
 
-NSString* GetShippingSectionTitle(const PaymentRequest& payment_request) {
-  switch (payment_request.payment_options().shipping_type) {
-    case web::PaymentShippingType::SHIPPING:
+NSString* GetShippingSectionTitle(payments::PaymentShippingType shipping_type) {
+  switch (shipping_type) {
+    case payments::PaymentShippingType::SHIPPING:
       return l10n_util::GetNSString(IDS_PAYMENTS_SHIPPING_SUMMARY_LABEL);
-    case web::PaymentShippingType::DELIVERY:
+    case payments::PaymentShippingType::DELIVERY:
       return l10n_util::GetNSString(IDS_PAYMENTS_DELIVERY_SUMMARY_LABEL);
-    case web::PaymentShippingType::PICKUP:
+    case payments::PaymentShippingType::PICKUP:
       return l10n_util::GetNSString(IDS_PAYMENTS_PICKUP_SUMMARY_LABEL);
     default:
       NOTREACHED();
@@ -93,50 +93,17 @@
   }
 }
 
-NSString* GetShippingAddressSelectorTitle(
-    const PaymentRequest& payment_request) {
-  switch (payment_request.payment_options().shipping_type) {
-    case web::PaymentShippingType::SHIPPING:
-      return l10n_util::GetNSString(IDS_PAYMENTS_SHIPPING_ADDRESS_LABEL);
-    case web::PaymentShippingType::DELIVERY:
-      return l10n_util::GetNSString(IDS_PAYMENTS_DELIVERY_ADDRESS_LABEL);
-    case web::PaymentShippingType::PICKUP:
-      return l10n_util::GetNSString(IDS_PAYMENTS_PICKUP_ADDRESS_LABEL);
-    default:
-      NOTREACHED();
-      return nil;
-  }
-}
-
-NSString* GetShippingAddressSelectorInfoMessage(
-    const PaymentRequest& payment_request) {
-  switch (payment_request.payment_options().shipping_type) {
-    case web::PaymentShippingType::SHIPPING:
-      return l10n_util::GetNSString(
-          IDS_PAYMENTS_SELECT_SHIPPING_ADDRESS_FOR_SHIPPING_METHODS);
-    case web::PaymentShippingType::DELIVERY:
-      return l10n_util::GetNSString(
-          IDS_PAYMENTS_SELECT_DELIVERY_ADDRESS_FOR_DELIVERY_METHODS);
-    case web::PaymentShippingType::PICKUP:
-      return l10n_util::GetNSString(
-          IDS_PAYMENTS_SELECT_PICKUP_ADDRESS_FOR_PICKUP_METHODS);
-    default:
-      NOTREACHED();
-      return nil;
-  }
-}
-
 NSString* GetShippingAddressSelectorErrorMessage(
     const PaymentRequest& payment_request) {
   if (!payment_request.payment_details().error.empty())
     return base::SysUTF16ToNSString(payment_request.payment_details().error);
 
-  switch (payment_request.payment_options().shipping_type) {
-    case web::PaymentShippingType::SHIPPING:
+  switch (payment_request.shipping_type()) {
+    case payments::PaymentShippingType::SHIPPING:
       return l10n_util::GetNSString(IDS_PAYMENTS_UNSUPPORTED_SHIPPING_ADDRESS);
-    case web::PaymentShippingType::DELIVERY:
+    case payments::PaymentShippingType::DELIVERY:
       return l10n_util::GetNSString(IDS_PAYMENTS_UNSUPPORTED_DELIVERY_ADDRESS);
-    case web::PaymentShippingType::PICKUP:
+    case payments::PaymentShippingType::PICKUP:
       return l10n_util::GetNSString(IDS_PAYMENTS_UNSUPPORTED_PICKUP_ADDRESS);
     default:
       NOTREACHED();
@@ -144,32 +111,17 @@
   }
 }
 
-NSString* GetShippingOptionSelectorTitle(
-    const PaymentRequest& payment_request) {
-  switch (payment_request.payment_options().shipping_type) {
-    case web::PaymentShippingType::SHIPPING:
-      return l10n_util::GetNSString(IDS_PAYMENTS_SHIPPING_OPTION_LABEL);
-    case web::PaymentShippingType::DELIVERY:
-      return l10n_util::GetNSString(IDS_PAYMENTS_DELIVERY_OPTION_LABEL);
-    case web::PaymentShippingType::PICKUP:
-      return l10n_util::GetNSString(IDS_PAYMENTS_PICKUP_OPTION_LABEL);
-    default:
-      NOTREACHED();
-      return nil;
-  }
-}
-
 NSString* GetShippingOptionSelectorErrorMessage(
     const PaymentRequest& payment_request) {
   if (!payment_request.payment_details().error.empty())
     return base::SysUTF16ToNSString(payment_request.payment_details().error);
 
-  switch (payment_request.payment_options().shipping_type) {
-    case web::PaymentShippingType::SHIPPING:
+  switch (payment_request.shipping_type()) {
+    case payments::PaymentShippingType::SHIPPING:
       return l10n_util::GetNSString(IDS_PAYMENTS_UNSUPPORTED_SHIPPING_OPTION);
-    case web::PaymentShippingType::DELIVERY:
+    case payments::PaymentShippingType::DELIVERY:
       return l10n_util::GetNSString(IDS_PAYMENTS_UNSUPPORTED_DELIVERY_OPTION);
-    case web::PaymentShippingType::PICKUP:
+    case payments::PaymentShippingType::PICKUP:
       return l10n_util::GetNSString(IDS_PAYMENTS_UNSUPPORTED_PICKUP_OPTION);
     default:
       NOTREACHED();
diff --git a/ios/chrome/browser/payments/payment_request_view_controller.mm b/ios/chrome/browser/payments/payment_request_view_controller.mm
index eb9e74a2..8539777b3 100644
--- a/ios/chrome/browser/payments/payment_request_view_controller.mm
+++ b/ios/chrome/browser/payments/payment_request_view_controller.mm
@@ -15,6 +15,7 @@
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/payments/core/currency_formatter.h"
+#include "components/payments/core/strings_util.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/payments/cells/autofill_profile_item.h"
 #import "ios/chrome/browser/payments/cells/page_info_item.h"
@@ -52,8 +53,8 @@
 using ::payment_request_util::GetPhoneNumberLabelFromAutofillProfile;
 using ::payment_request_util::GetEmailLabelFromAutofillProfile;
 using ::payment_request_util::GetShippingSectionTitle;
-using ::payment_request_util::GetShippingAddressSelectorTitle;
-using ::payment_request_util::GetShippingOptionSelectorTitle;
+using ::payments::GetShippingOptionSectionString;
+using ::payments::GetShippingAddressSectionString;
 
 // String used as the "URL" to take the user to the settings page for card and
 // address options. Needs to be URL-like; otherwise, the link will not appear
@@ -243,7 +244,8 @@
 
   CollectionViewTextItem* shippingTitle =
       [[CollectionViewTextItem alloc] initWithType:ItemTypeShippingTitle];
-  shippingTitle.text = GetShippingSectionTitle(*_paymentRequest);
+  shippingTitle.text =
+      GetShippingSectionTitle(_paymentRequest->shipping_type());
   [model setHeader:shippingTitle
       forSectionWithIdentifier:SectionIdentifierShipping];
 
@@ -263,7 +265,8 @@
     CollectionViewDetailItem* addAddressItem = [[CollectionViewDetailItem alloc]
         initWithType:ItemTypeAddShippingAddress];
     shippingAddressItem = addAddressItem;
-    addAddressItem.text = GetShippingAddressSelectorTitle(*_paymentRequest);
+    addAddressItem.text = SysUTF16ToNSString(
+        GetShippingAddressSectionString(_paymentRequest->shipping_type()));
     addAddressItem.detailText = [l10n_util::GetNSString(IDS_ADD)
         uppercaseStringWithLocale:[NSLocale currentLocale]];
     addAddressItem.accessibilityTraits |= UIAccessibilityTraitButton;
@@ -294,8 +297,8 @@
         [[CollectionViewDetailItem alloc]
             initWithType:ItemTypeSelectShippingOption];
     shippingOptionItem = selectShippingOptionItem;
-    selectShippingOptionItem.text =
-        GetShippingOptionSelectorTitle(*_paymentRequest);
+    selectShippingOptionItem.text = base::SysUTF16ToNSString(
+        GetShippingOptionSectionString(_paymentRequest->shipping_type()));
     selectShippingOptionItem.accessoryType =
         MDCCollectionViewCellAccessoryDisclosureIndicator;
     selectShippingOptionItem.accessibilityTraits |= UIAccessibilityTraitButton;
diff --git a/ios/chrome/browser/payments/shipping_address_selection_view_controller.mm b/ios/chrome/browser/payments/shipping_address_selection_view_controller.mm
index c44cea8..9591aadc 100644
--- a/ios/chrome/browser/payments/shipping_address_selection_view_controller.mm
+++ b/ios/chrome/browser/payments/shipping_address_selection_view_controller.mm
@@ -8,6 +8,7 @@
 
 #include "base/strings/sys_string_conversions.h"
 #include "components/autofill/core/browser/autofill_profile.h"
+#include "components/payments/core/strings_util.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/application_context.h"
 #import "ios/chrome/browser/payments/cells/autofill_profile_item.h"
@@ -35,8 +36,8 @@
 using ::payment_request_util::GetNameLabelFromAutofillProfile;
 using ::payment_request_util::GetShippingAddressLabelFromAutofillProfile;
 using ::payment_request_util::GetPhoneNumberLabelFromAutofillProfile;
-using ::payment_request_util::GetShippingAddressSelectorTitle;
-using ::payment_request_util::GetShippingAddressSelectorInfoMessage;
+using ::payments::GetShippingAddressSelectorInfoMessage;
+using ::payments::GetShippingAddressSectionString;
 
 NSString* const kShippingAddressSelectionCollectionViewID =
     @"kShippingAddressSelectionCollectionViewID";
@@ -78,7 +79,8 @@
 - (instancetype)initWithPaymentRequest:(PaymentRequest*)paymentRequest {
   DCHECK(paymentRequest);
   if ((self = [super initWithStyle:CollectionViewControllerStyleAppBar])) {
-    self.title = GetShippingAddressSelectorTitle(*paymentRequest);
+    self.title = base::SysUTF16ToNSString(
+        GetShippingAddressSectionString(paymentRequest->shipping_type()));
 
     // Set up leading (return) button.
     UIBarButtonItem* returnButton =
@@ -120,7 +122,9 @@
     messageItem.text = _errorMessage;
     messageItem.image = NativeImage(IDR_IOS_PAYMENTS_WARNING);
   } else {
-    messageItem.text = GetShippingAddressSelectorInfoMessage(*_paymentRequest);
+    messageItem.text =
+        base::SysUTF16ToNSString(GetShippingAddressSelectorInfoMessage(
+            _paymentRequest->shipping_type()));
   }
   [model addItem:messageItem
       toSectionWithIdentifier:SectionIdentifierShippingAddress];
diff --git a/ios/chrome/browser/payments/shipping_option_selection_view_controller.mm b/ios/chrome/browser/payments/shipping_option_selection_view_controller.mm
index 14b23ee..303212d 100644
--- a/ios/chrome/browser/payments/shipping_option_selection_view_controller.mm
+++ b/ios/chrome/browser/payments/shipping_option_selection_view_controller.mm
@@ -8,10 +8,10 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/payments/core/currency_formatter.h"
+#include "components/payments/core/strings_util.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/payments/cells/payments_text_item.h"
 #include "ios/chrome/browser/payments/payment_request.h"
-#import "ios/chrome/browser/payments/payment_request_util.h"
 #import "ios/chrome/browser/payments/shipping_option_selection_view_controller_actions.h"
 #import "ios/chrome/browser/ui/autofill/cells/status_item.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
@@ -32,7 +32,7 @@
 #endif
 
 namespace {
-using ::payment_request_util::GetShippingOptionSelectorTitle;
+using ::payments::GetShippingOptionSectionString;
 
 NSString* const kShippingOptionSelectionCollectionViewID =
     @"kShippingOptionSelectionCollectionViewID";
@@ -73,7 +73,8 @@
 - (instancetype)initWithPaymentRequest:(PaymentRequest*)paymentRequest {
   DCHECK(paymentRequest);
   if ((self = [super initWithStyle:CollectionViewControllerStyleAppBar])) {
-    self.title = GetShippingOptionSelectorTitle(*paymentRequest);
+    self.title = base::SysUTF16ToNSString(
+        GetShippingOptionSectionString(paymentRequest->shipping_type()));
 
     // Set up leading (return) button.
     UIBarButtonItem* returnButton =
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 8217bab..a3edd8a 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -25,7 +25,6 @@
 #include "base/mac/bind_objc_block.h"
 #include "base/mac/bundle_locations.h"
 #include "base/mac/foundation_util.h"
-#import "base/mac/scoped_nsobject.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
@@ -270,17 +269,6 @@
   Overlap
 };
 
-struct HeaderDefinition {
-  // The header view.
-  base::scoped_nsobject<UIView> view;
-  // How to place the view, and its behaviour when the headers move.
-  HeaderBehaviour behaviour;
-  // Reduces the height of a header to adjust for shadows.
-  CGFloat heightAdjustement;
-  // Nudges that particular header up by this number of points.
-  CGFloat inset;
-};
-
 const CGFloat kIPadFindBarOverlap = 11;
 
 bool IsURLAllowedInIncognito(const GURL& url) {
@@ -298,6 +286,65 @@
 
 }  // namespace
 
+#pragma mark - HeaderDefinition helper
+
+@interface HeaderDefinition : NSObject
+
+// The header view.
+@property(nonatomic, strong) UIView* view;
+// How to place the view, and its behaviour when the headers move.
+@property(nonatomic, assign) HeaderBehaviour behaviour;
+// Reduces the height of a header to adjust for shadows.
+@property(nonatomic, assign) CGFloat heightAdjustement;
+// Nudges that particular header up by this number of points.
+@property(nonatomic, assign) CGFloat inset;
+
+- (instancetype)initWithView:(UIView*)view
+             headerBehaviour:(HeaderBehaviour)behaviour
+            heightAdjustment:(CGFloat)heightAdjustment
+                       inset:(CGFloat)inset;
+
++ (instancetype)definitionWithView:(UIView*)view
+                   headerBehaviour:(HeaderBehaviour)behaviour
+                  heightAdjustment:(CGFloat)heightAdjustment
+                             inset:(CGFloat)inset;
+
+@end
+
+@implementation HeaderDefinition
+@synthesize view = _view;
+@synthesize behaviour = _behaviour;
+@synthesize heightAdjustement = _heightAdjustement;
+@synthesize inset = _inset;
+
++ (instancetype)definitionWithView:(UIView*)view
+                   headerBehaviour:(HeaderBehaviour)behaviour
+                  heightAdjustment:(CGFloat)heightAdjustment
+                             inset:(CGFloat)inset {
+  return [[self alloc] initWithView:view
+                    headerBehaviour:behaviour
+                   heightAdjustment:heightAdjustment
+                              inset:inset];
+}
+
+- (instancetype)initWithView:(UIView*)view
+             headerBehaviour:(HeaderBehaviour)behaviour
+            heightAdjustment:(CGFloat)heightAdjustment
+                       inset:(CGFloat)inset {
+  self = [super init];
+  if (self) {
+    _view = view;
+    _behaviour = behaviour;
+    _heightAdjustement = heightAdjustment;
+    _inset = inset;
+  }
+  return self;
+}
+
+@end
+
+#pragma mark - BVC
+
 @interface BrowserViewController ()<AppRatingPromptDelegate,
                                     ContextualSearchControllerDelegate,
                                     ContextualSearchPanelMotionObserver,
@@ -532,6 +579,10 @@
 // is NONE if there is no visible page or visible page is a native page.
 @property(nonatomic, assign, readonly) web::UserAgentType userAgentType;
 
+// Returns the header views, all the chrome on top of the page, including the
+// ones that cannot be scrolled off screen by full screen.
+@property(nonatomic, strong, readonly) NSArray<HeaderDefinition*>* headerViews;
+
 // BVC initialization:
 // If the BVC is initialized with a valid browser state & tab model immediately,
 // the path is straightforward: functionality is enabled, and the UI is built
@@ -733,15 +784,12 @@
 // The LogoAnimationControllerOwner to be used for the next logo transition
 // animation.
 - (id<LogoAnimationControllerOwner>)currentLogoAnimationControllerOwner;
-// Returns the header views, all the chrome on top of the page, including the
-// ones that cannot be scrolled off screen by full screen.
-- (const std::vector<HeaderDefinition>)headerViews;
 // Returns the footer view if one exists (e.g. the voice search bar).
 - (UIView*)footerView;
 // Returns the height of the header view for the tab model's current tab.
 - (CGFloat)headerHeight;
 // Sets the frame for the headers.
-- (void)setFramesForHeaders:(const std::vector<HeaderDefinition>)headers
+- (void)setFramesForHeaders:(NSArray<HeaderDefinition*>*)headers
                    atOffset:(CGFloat)headerOffset;
 // Returns the y coordinate for the footer's frame when animating the footer
 // in/out of fullscreen.
@@ -2647,43 +2695,45 @@
   return 0.0;
 }
 
-- (const std::vector<HeaderDefinition>)headerViews {
-  std::vector<HeaderDefinition> results;
+- (NSArray<HeaderDefinition*>*)headerViews {
+  NSMutableArray<HeaderDefinition*>* results = [[NSMutableArray alloc] init];
   if (![self isViewLoaded])
     return results;
 
   if (!IsIPadIdiom()) {
     if ([_toolbarController view]) {
-      HeaderDefinition header = {
-          base::scoped_nsobject<UIView>([_toolbarController view]), Hideable,
-          [ToolbarController toolbarDropShadowHeight], 0.0,
-      };
-      results.push_back(header);
+      [results addObject:[HeaderDefinition
+                             definitionWithView:[_toolbarController view]
+                                headerBehaviour:Hideable
+                               heightAdjustment:[ToolbarController
+                                                    toolbarDropShadowHeight]
+                                          inset:0.0]];
     }
   } else {
     if ([_tabStripController view]) {
-      HeaderDefinition header = {
-          base::scoped_nsobject<UIView>([_tabStripController view]), Hideable,
-          0.0, 0.0,
-      };
-      results.push_back(header);
+      [results addObject:[HeaderDefinition
+                             definitionWithView:[_tabStripController view]
+                                headerBehaviour:Hideable
+                               heightAdjustment:0.0
+                                          inset:0.0]];
     }
     if ([_toolbarController view]) {
-      HeaderDefinition header = {
-          base::scoped_nsobject<UIView>([_toolbarController view]), Hideable,
-          [ToolbarController toolbarDropShadowHeight], 0.0,
-      };
-      results.push_back(header);
+      [results addObject:[HeaderDefinition
+                             definitionWithView:[_toolbarController view]
+                                headerBehaviour:Hideable
+                               heightAdjustment:[ToolbarController
+                                                    toolbarDropShadowHeight]
+                                          inset:0.0]];
     }
     if ([_findBarController view]) {
-      HeaderDefinition header = {
-          base::scoped_nsobject<UIView>([_findBarController view]), Overlap,
-          0.0, kIPadFindBarOverlap,
-      };
-      results.push_back(header);
+      [results addObject:[HeaderDefinition
+                             definitionWithView:[_findBarController view]
+                                headerBehaviour:Overlap
+                               heightAdjustment:0.0
+                                          inset:kIPadFindBarOverlap]];
     }
   }
-  return results;
+  return [results copy];
 }
 
 - (UIView*)footerView {
@@ -2704,10 +2754,10 @@
     return 0;
   }
 
-  const std::vector<HeaderDefinition> views = [self headerViews];
+  NSArray<HeaderDefinition*>* views = [self headerViews];
 
   CGFloat height = [self headerOffset];
-  for (const auto& header : views) {
+  for (HeaderDefinition* header in views) {
     if (header.view && header.behaviour == Hideable) {
       height += CGRectGetHeight([header.view frame]) -
                 header.heightAdjustement - header.inset;
@@ -2722,8 +2772,8 @@
 }
 
 - (CGFloat)currentHeaderOffset {
-  const std::vector<HeaderDefinition> headers = [self headerViews];
-  if (!headers.size())
+  NSArray<HeaderDefinition*>* headers = [self headerViews];
+  if (!headers.count)
     return 0.0;
 
   // Prerender tab does not have a toolbar, return |headerHeight| as promised by
@@ -2753,10 +2803,10 @@
     [controller setToolbarInsetsForHeaderOffset:offset];
 }
 
-- (void)setFramesForHeaders:(const std::vector<HeaderDefinition>)headers
+- (void)setFramesForHeaders:(NSArray<HeaderDefinition*>*)headers
                    atOffset:(CGFloat)headerOffset {
   CGFloat height = [self headerOffset];
-  for (const auto& header : headers) {
+  for (HeaderDefinition* header in headers) {
     CGRect frame = [header.view frame];
     frame.origin.y = height - headerOffset - header.inset;
     [header.view setFrame:frame];
@@ -2780,7 +2830,7 @@
     footerFrame.origin.y = [self footerYForHeaderOffset:headerOffset];
   }
 
-  const std::vector<HeaderDefinition> headers = [self headerViews];
+  NSArray<HeaderDefinition*>* headers = [self headerViews];
   void (^block)(void) = ^{
     [self setFramesForHeaders:headers atOffset:headerOffset];
     footer.frame = footerFrame;
@@ -2820,7 +2870,7 @@
     footerFrame.origin.y = [self footerYForHeaderOffset:headerOffset];
   }
 
-  const std::vector<HeaderDefinition> headers = [self headerViews];
+  NSArray<HeaderDefinition*>* headers = [self headerViews];
   void (^block)(void) = ^{
     [self setFramesForHeaders:headers atOffset:headerOffset];
     footer.frame = footerFrame;
diff --git a/ios/web/payments/payment_request.cc b/ios/web/payments/payment_request.cc
index 4d059b85..8b6d3b2 100644
--- a/ios/web/payments/payment_request.cc
+++ b/ios/web/payments/payment_request.cc
@@ -242,7 +242,7 @@
       request_payer_email(false),
       request_payer_phone(false),
       request_shipping(false),
-      shipping_type(PaymentShippingType::SHIPPING) {}
+      shipping_type(payments::PaymentShippingType::SHIPPING) {}
 PaymentOptions::~PaymentOptions() = default;
 
 bool PaymentOptions::operator==(const PaymentOptions& other) const {
@@ -272,12 +272,12 @@
   value.GetString(kPaymentOptionsShippingType, &shipping_type);
   if (shipping_type ==
       base::ASCIIToUTF16(kPaymentOptionsShippingTypeDelivery)) {
-    this->shipping_type = PaymentShippingType::DELIVERY;
+    this->shipping_type = payments::PaymentShippingType::DELIVERY;
   } else if (shipping_type ==
              base::ASCIIToUTF16(kPaymentOptionsShippingTypePickup)) {
-    this->shipping_type = PaymentShippingType::PICKUP;
+    this->shipping_type = payments::PaymentShippingType::PICKUP;
   } else {
-    this->shipping_type = PaymentShippingType::SHIPPING;
+    this->shipping_type = payments::PaymentShippingType::SHIPPING;
   }
 
   return true;
diff --git a/ios/web/payments/payment_request_unittest.cc b/ios/web/payments/payment_request_unittest.cc
index 284f0dc..3aeaee1 100644
--- a/ios/web/payments/payment_request_unittest.cc
+++ b/ios/web/payments/payment_request_unittest.cc
@@ -250,7 +250,7 @@
   PaymentOptions payment_options;
   payment_options.request_payer_phone = true;
   payment_options.request_shipping = true;
-  payment_options.shipping_type = PaymentShippingType::DELIVERY;
+  payment_options.shipping_type = payments::PaymentShippingType::DELIVERY;
   expected_request.options = payment_options;
 
   EXPECT_TRUE(output_request.FromDictionaryValue(request_dict));
@@ -544,12 +544,13 @@
   options2.request_shipping = true;
   EXPECT_EQ(options1, options2);
 
-  // PaymentShippingType::SHIPPING is the default value for shipping_type.
-  options1.shipping_type = PaymentShippingType::SHIPPING;
+  // payments::PaymentShippingType::SHIPPING is the default value for
+  // shipping_type.
+  options1.shipping_type = payments::PaymentShippingType::SHIPPING;
   EXPECT_EQ(options1, options2);
-  options1.shipping_type = PaymentShippingType::PICKUP;
+  options1.shipping_type = payments::PaymentShippingType::PICKUP;
   EXPECT_NE(options1, options2);
-  options2.shipping_type = PaymentShippingType::PICKUP;
+  options2.shipping_type = payments::PaymentShippingType::PICKUP;
   EXPECT_EQ(options1, options2);
 }
 
diff --git a/ios/web/public/payments/payment_request.h b/ios/web/public/payments/payment_request.h
index a2e9d5e1e..4452690 100644
--- a/ios/web/public/payments/payment_request.h
+++ b/ios/web/public/payments/payment_request.h
@@ -12,6 +12,7 @@
 #include "components/payments/core/basic_card_response.h"
 #include "components/payments/core/payment_address.h"
 #include "components/payments/core/payment_method_data.h"
+#include "components/payments/core/payment_options_provider.h"
 
 // C++ bindings for the PaymentRequest API. Conforms to the following specs:
 // https://w3c.github.io/browser-payment-api/ (18 July 2016 editor's draft)
@@ -170,14 +171,6 @@
   base::string16 error;
 };
 
-// Possible values for affecting the payment request user interface for
-// gathering the shipping address.
-enum class PaymentShippingType : int {
-  SHIPPING = 0,
-  DELIVERY = 1,
-  PICKUP = 2,
-};
-
 // Information describing a shipping option.
 class PaymentOptions {
  public:
@@ -216,7 +209,7 @@
   // If request_shipping is set to true, then this field may only be used to
   // influence the way the user agent presents the user interface for gathering
   // the shipping address.
-  PaymentShippingType shipping_type;
+  payments::PaymentShippingType shipping_type;
 };
 
 // All of the information provided by a page making a request for payment.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/case-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/case-expected.txt
index de35893..c4535c31 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/case-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/case-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 285 tests; 279 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 285 tests; 280 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS createElement abc 
 PASS setAttribute abc 
 PASS getAttribute abc 
@@ -21,7 +21,7 @@
 FAIL getElementsByTagName a:ä assert_array_equals: lengths differ, expected 0 got 3
 PASS getElementsByTagName ä 
 PASS createElement Ä 
-FAIL setAttribute Ä assert_equals: expected "Ä" but got "ä"
+PASS setAttribute Ä 
 PASS getAttribute Ä 
 FAIL getElementsByTagName a:Ä assert_array_equals: lengths differ, expected 0 got 3
 PASS getElementsByTagName Ä 
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-MessageChannel-transfer.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-MessageChannel-transfer.html
index 6e321e01..5b2b908f 100644
--- a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-MessageChannel-transfer.html
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-MessageChannel-transfer.html
@@ -12,16 +12,20 @@
     ctx.fillStyle = '#0f0';
     ctx.fillRect(0, 0, 10, 10);
     ctx.commit();
-    setTimeout(function() { // synchronization barrier to allow commit to propagate
-      var canvas2 = document.createElement('canvas');
-      canvas2.width = canvas2.height = 10;
-      var ctx2 = canvas2.getContext('2d');
-      ctx2.drawImage(canvas, 0, 0);
-      var pixel = ctx2.getImageData(0, 0, 1, 1).data;
-      t.step(function() {
-        assert_array_equals(pixel, [0, 255, 0, 255]);
-      });
-      t.done();
+    // TODO(junov): Use the Promise returned by commit to schedule after the
+    // commit. (crbug.com/709484)
+    setTimeout(function() {
+      setTimeout(function() {
+        var canvas2 = document.createElement('canvas');
+        canvas2.width = canvas2.height = 10;
+        var ctx2 = canvas2.getContext('2d');
+        ctx2.drawImage(canvas, 0, 0);
+        var pixel = ctx2.getImageData(0, 0, 1, 1).data;
+        t.step(function() {
+          assert_array_equals(pixel, [0, 255, 0, 255]);
+        });
+        t.done();
+      }, 0);
     }, 0);
   }
   channel.port1.postMessage(offscreen, [offscreen]);
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-commit-frameless-doc.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-commit-frameless-doc.html
index 10542b10..76f51827 100644
--- a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-commit-frameless-doc.html
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-commit-frameless-doc.html
@@ -41,13 +41,17 @@
   c.width = 50;
   c.height = 50;
   var ctx2 = c.getContext("2d");
+  // TODO(junov): Use the Promise returned by commit to schedule after the
+  // commit. (crbug.com/709484)
   setTimeout(function() {
-    ctx2.drawImage(canvas, 0, 0);
-    var pixels = ctx2.getImageData(0, 0, 1, 1).data;
-    t.step(function() {
-      assert_array_equals(pixels, [0, 0, 255, 255]);
-    });
-    t.done();
+    setTimeout(function() {
+      ctx2.drawImage(canvas, 0, 0);
+      var pixels = ctx2.getImageData(0, 0, 1, 1).data;
+      t.step(function() {
+        assert_array_equals(pixels, [0, 0, 255, 255]);
+      });
+      t.done();
+    }, 0);
   }, 0);
 }, "Verify that the placeholder canvas can be used as an image source");
 </script>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html
index 398869e..3a6e3c9 100644
--- a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html
@@ -25,18 +25,20 @@
       assert_array_equals(pixel, expectedValue, "Verify that commit() is not synchronous.");
     });
 
-    // The call to setTimeout acts as a synchronization barrier to guarantee that
-    // the commit has propagated.
+    // TODO(junov): Use the Promise returned by commit to schedule after the
+    // commit. (crbug.com/709484)
     setTimeout(function() {
-      createImageBitmap(canvas).then(image => {
-        testCtx.drawImage(image, 0, 0);
-        t.step( function() {
-          var pixel = testCtx.getImageData(0, 0, 1, 1).data;
-          var expectedValue = [0, 255, 0, 255];
-          assert_array_equals(pixel, expectedValue, "Verify that async update of placeholder propagated through createImageData");
+      setTimeout(function() {
+        createImageBitmap(canvas).then(image => {
+          testCtx.drawImage(image, 0, 0);
+          t.step( function() {
+            var pixel = testCtx.getImageData(0, 0, 1, 1).data;
+            var expectedValue = [0, 255, 0, 255];
+            assert_array_equals(pixel, expectedValue, "Verify that async update of placeholder propagated through createImageData");
+          });
+          t.done();
         });
-        t.done();
-      });
+      }, 0);
     }, 0);
   });
 }, "Test whether createImageBitmap on a placeholder canvas captures the image committed to the associated OffscreenCanvas.");
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-image-source.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-image-source.html
index fa2b295..73d40a40 100644
--- a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-image-source.html
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-placeholder-image-source.html
@@ -16,23 +16,24 @@
 ctx.commit();
 verifyImage(canvas, [0, 0, 0, 0], "Verify that OffscreenCanvas.commit() does not propagate the image synchronously to the placeholder canvas.");
 
+// TODO(junov): Use the Promise returned by commit to schedule after the
+// commit. (crbug.com/709484)
 setTimeout(function() {
-  // setTimeout is a synchronization barrier that guarantees
-  // that the offscreen commit has been processed by the event loop,
-  // as long as the timeout event is queued after the call to commit().
-  var green = [0, 255, 0, 255];
-  verifyImage(canvas, green, "verify that drawImage works with placeholder canvas as a source.");
-  var testImage = new Image();
-  testImage.src = canvas.toDataURL();
-  testImage.onload = function() {
-    verifyImage(canvas, green, "verify that toDataURL works on placeholder canvas.");
-    canvas.toBlob(blob => {
-      createImageBitmap(blob).then(image => {
-      	verifyImage(image, green, "verify that toBlob works on placeholder canvas.");
-      	t.done();
-      })
-    });
-  }
+  setTimeout(function() {
+    var green = [0, 255, 0, 255];
+    verifyImage(canvas, green, "verify that drawImage works with placeholder canvas as a source.");
+    var testImage = new Image();
+    testImage.src = canvas.toDataURL();
+    testImage.onload = function() {
+      verifyImage(canvas, green, "verify that toDataURL works on placeholder canvas.");
+      canvas.toBlob(blob => {
+        createImageBitmap(blob).then(image => {
+          verifyImage(image, green, "verify that toBlob works on placeholder canvas.");
+          t.done();
+        })
+      });
+    }
+  }, 0);
 }, 0);
 
 function verifyImage(image, expectedColor, description) {
@@ -45,4 +46,4 @@
     assert_array_equals(pixel, expectedColor, description);
   });
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-resize.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-resize.html
index 432d9b3b..0b58369 100644
--- a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-resize.html
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-resize.html
@@ -93,31 +93,34 @@
       t.done();
     }
   });
-  // Set timeout acts as a sync barrier to allow commit to propagate
-  setTimeout(function(){
-    t.step(function() {
-      // Verify that commit() asynchronously updates the size of its placeholder canvas.
-      assert_equals(placeholder.width, 10);
-      assert_equals(placeholder.height, 20);     
-    });
-    t.step(function() {
-      // Verify that width/height attributes are still settable even though they have no effect.
-      placeholder.width = 50;
-      placeholder.height = 60;
-      assert_equals(placeholder.width, 50);
-      assert_equals(placeholder.height, 60);     
-    });
-    createImageBitmap(placeholder).then(image => {
+  // TODO(junov): Use the Promise returned by commit to schedule after the
+  // commit. (crbug.com/709484)
+  setTimeout(function() {
+    setTimeout(function() {
       t.step(function() {
-        // Verify that an image grabbed from the placeholder has the correct dimensions
-        assert_equals(image.width, 30);
-        assert_equals(image.height, 40);          
+        // Verify that commit() asynchronously updates the size of its placeholder canvas.
+        assert_equals(placeholder.width, 10);
+        assert_equals(placeholder.height, 20);     
       });
-      asyncStepsCompleted = asyncStepsCompleted + 1;
-      if (asyncStepsCompleted == 2) {
-        t.done();
-      }
-    });
+      t.step(function() {
+        // Verify that width/height attributes are still settable even though they have no effect.
+        placeholder.width = 50;
+        placeholder.height = 60;
+        assert_equals(placeholder.width, 50);
+        assert_equals(placeholder.height, 60);     
+      });
+      createImageBitmap(placeholder).then(image => {
+        t.step(function() {
+          // Verify that an image grabbed from the placeholder has the correct dimensions
+          assert_equals(image.width, 30);
+          assert_equals(image.height, 40);          
+        });
+        asyncStepsCompleted = asyncStepsCompleted + 1;
+        if (asyncStepsCompleted == 2) {
+          t.done();
+        }
+      });
+    }, 0);
   }, 0);
 }, "Verify that resizing an OffscreenCanvas with a 2d context propagates the new size to its placeholder canvas asynchronously, upon commit.");
 
@@ -180,7 +183,7 @@
         t.done();
       }
     });
-  }, 0);
+  }, 1);
 }, "Verify that resizing an OffscreenCanvas with a webgl context propagates the new size to its placeholder canvas asynchronously, upon commit.");
 
 async_test(function(t){
@@ -210,7 +213,7 @@
       assert_array_equals(pixel3, [0, 0, 0, 0]);
     });
     t.done();
-  });
+  }, 1);
 
 }, "Verify that drawImage uses the size of the committed frame as the intinsic size of a placeholder canvas.");
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-test.html b/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-test.html
index 51d4c9c..fbf7bef 100644
--- a/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-test.html
+++ b/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-test.html
@@ -18,7 +18,10 @@
     promise_test(TestWorkerCompileAndInstantiate, "wasm worker compile test");
     promise_test(TestPromiseCompileSyncInstantiate, "wasm sync instantiate");
     promise_test(TestPromiseCompileAsyncInstantiateFromBuffer, "wasm async instantiate from buffer");
-    promise_test(TestPromiseCompileAsyncInstantiateFromModule, "wasm async instantiate from module"); 
+    promise_test(TestPromiseCompileAsyncInstantiateFromModule, "wasm async instantiate from module");
+    promise_test(TestCompileFromPromise, "wasm async compile from promised bytes");
+    promise_test(TestInstantiateFromPromise, "wasm async instantiate from promised bytes");
+    promise_test(TestInstantiateFromPromiseChain, "wasm async compile, then async instantiate from promised bytes");
   </script>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-tests.js b/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-tests.js
index 9d1b678..f246109 100644
--- a/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-tests.js
+++ b/third_party/WebKit/LayoutTests/fast/wasm/wasm-limits-tests.js
@@ -93,3 +93,26 @@
     },
     assert_unreached);
 }
+
+
+function TestCompileFromPromise() {
+  return Promise.resolve(createTestBuffers(limit).large)
+    .then(WebAssembly.compile)
+    .then(m => assert_true(m instanceof WebAssembly.Module))
+}
+
+function TestInstantiateFromPromise() {
+  return Promise.resolve(createTestBuffers(limit).large)
+    .then(WebAssembly.instantiate)
+    .then(pair => {
+      assert_true(pair.module instanceof WebAssembly.Module);
+      assert_true(pair.instance instanceof WebAssembly.Instance);
+    });
+}
+
+function TestInstantiateFromPromiseChain() {
+  return Promise.resolve(createTestBuffers(limit).large)
+    .then(WebAssembly.compile)
+    .then(WebAssembly.instantiate)
+    .then(i => assert_true(i instanceof WebAssembly.Instance))
+}
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-plugin-in-iframe-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-plugin-in-iframe-expected.txt
index 5e903ec..63e97a7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-plugin-in-iframe-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-plugin-in-iframe-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Mixed Content: The page at 'https://127.0.0.1:8443/security/mixedContent/resources/frame-with-insecure-plugin.html' was loaded over HTTPS, but requested an insecure plugin resource 'http://example.test:8000/security/mixedContent/resources/dummy.swf'. This content should also be served over HTTPS.
+CONSOLE WARNING: line 5: Mixed Content: The page at 'https://127.0.0.1:8443/security/mixedContent/resources/frame-with-insecure-plugin.html' was loaded over HTTPS, but requested an insecure plugin resource 'http://example.test:8000/security/mixedContent/resources/dummy.swf'. This content should also be served over HTTPS.
 CONSOLE MESSAGE: Blink Test Plugin: initializing
 This test loads a secure iframe that loads an insecure plugin. We should get a mixed content callback because the insecure plugin can script the secure origin.
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/offscreencanvas-placeholder-read-blocked-no-crossorigin.html b/third_party/WebKit/LayoutTests/http/tests/security/offscreencanvas-placeholder-read-blocked-no-crossorigin.html
index dfb9643..c33418b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/offscreencanvas-placeholder-read-blocked-no-crossorigin.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/offscreencanvas-placeholder-read-blocked-no-crossorigin.html
@@ -16,20 +16,28 @@
     t.step(function() {
       canvas.toDataURL(); // Succeeds by not throwing
     });
-    setTimeout(function() { // sync barrier for commit() propagation
-      t.step(function() {
-        assert_throws("SecurityError", function() {
-          canvas.toDataURL();
-        }, "Check toDataURL blocked.");
-      });
-      ctx.commit(); // Second frame does not reset origin-clean flag.
-      setTimeout(function() { // sync barrier for commit() propagation
+    // TODO(junov): Use the Promise returned by commit to schedule after the
+    // commit. (crbug.com/709484)
+    setTimeout(function() {
+      setTimeout(function() {
         t.step(function() {
           assert_throws("SecurityError", function() {
             canvas.toDataURL();
-          });
+          }, "Check toDataURL blocked.");
         });
-        t.done();
+        ctx.commit(); // Second frame does not reset origin-clean flag.
+        // TODO(junov): Use the Promise returned by commit to schedule after the
+        // commit. (crbug.com/709484)
+        setTimeout(function() {
+          setTimeout(function() {
+            t.step(function() {
+              assert_throws("SecurityError", function() {
+                canvas.toDataURL();
+              });
+            });
+            t.done();
+          }, 0);
+        }, 0);
       }, 0);
     }, 0);
   }
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/promise-access-control-deny.html b/third_party/WebKit/LayoutTests/http/tests/security/promise-access-control-deny.html
index 3b8ac11..5e1ece7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/promise-access-control-deny.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/promise-access-control-deny.html
@@ -16,7 +16,7 @@
         if (window.testRunner) {
             testRunner.notifyDone();
         }
-    }, 0);
+    }, 1);
 };
 </script>
 <script src='http://localhost:8000/security/resources/promise-access-control.php?allow=false' onload='finishTest()'></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/wasm/resources/load_wasm.js b/third_party/WebKit/LayoutTests/http/tests/wasm/resources/load_wasm.js
index a0a0e5a..eca4b8d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/wasm/resources/load_wasm.js
+++ b/third_party/WebKit/LayoutTests/http/tests/wasm/resources/load_wasm.js
@@ -14,8 +14,5 @@
             if (!response.ok) throw new Error(response.statusText);
             return response.arrayBuffer();
         })
-        .then(data => {
-            var mod = new WebAssembly.Module(data);
-            return mod;
-        });
+        .then(WebAssembly.compile);
 }
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/color-fill-currentColor-and-css.html b/third_party/WebKit/LayoutTests/paint/invalidation/svg/color-fill-currentColor-and-css.html
index abf8f91a5..bd9cc506 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/color-fill-currentColor-and-css.html
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/color-fill-currentColor-and-css.html
@@ -12,7 +12,7 @@
     ani.currentTime = 1000;
     ani.pause();
     runAfterLayoutAndPaint(finishRepaintTest);
-  }, 0);
+  }, 1);
 }
 </script>
 <style>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css1/color_and_background/background_attachment-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css1/color_and_background/background_attachment-expected.png
index 5bf168b3..74f6c50 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css1/color_and_background/background_attachment-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css1/color_and_background/background_attachment-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t0602-c13-inheritance-00-e-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t0602-c13-inheritance-00-e-expected.png
index 013f9148..62a812e3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t0602-c13-inheritance-00-e-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t0602-c13-inheritance-00-e-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-02-d-agi-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-02-d-agi-expected.png
index 0cde0c3..97444fe4 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-02-d-agi-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-02-d-agi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-03-d-agi-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-03-d-agi-expected.png
index 5ec4d0a..7d9282f 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-03-d-agi-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-03-d-agi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-04-d-agi-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-04-d-agi-expected.png
index 5ee13704..f4ecf05f6 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-04-d-agi-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css2.1/t100801-c544-valgn-04-d-agi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/css3-modsel-35-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/css3-modsel-35-expected.png
index d3fdeaa3..999aaa2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/css3-modsel-35-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/css3-modsel-35-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/font-feature-settings-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/font-feature-settings-rendering-expected.png
index 71e7d0c..c3d047ed 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/font-feature-settings-rendering-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/font-feature-settings-rendering-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-30-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-30-expected.png
index fc85172..21df23c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-30-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-30-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-34-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-34-expected.png
index 5decae1d..a3383b82 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-34-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-34-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-35-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-35-expected.png
index d3fdeaa3..999aaa2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-35-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-35-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-7-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-7-expected.png
index 2b27f3a..9a75fbc 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-7-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-7-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75-expected.png
index 04dcfee..3b9cdff 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75b-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75b-expected.png
index 04dcfee..3b9cdff 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75b-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-75b-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-79-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-79-expected.png
index cf98aeb8..c672df7 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-79-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-79-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-8-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-8-expected.png
index 6cc3604..00de5f4 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-8-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-8-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-80-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-80-expected.png
index ae7d92a8..f845909 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-80-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/html/css3-modsel-80-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-30-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-30-expected.png
index fc85172..21df23c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-30-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-30-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-34-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-34-expected.png
index 5decae1d..a3383b82 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-34-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-34-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-35-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-35-expected.png
index d3fdeaa3..999aaa2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-35-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-35-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-7-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-7-expected.png
index 2b27f3a..9a75fbc 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-7-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-7-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75-expected.png
index 04dcfee..3b9cdff 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75b-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75b-expected.png
index 04dcfee..3b9cdff 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75b-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-75b-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-79-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-79-expected.png
index cf98aeb8..c672df7 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-79-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-79-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-8-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-8-expected.png
index 6cc3604..00de5f4 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-8-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-8-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-80-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-80-expected.png
index ae7d92a8..f845909 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-80-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xhtml/css3-modsel-80-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-30-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-30-expected.png
index 1780167..3d8bc0e 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-30-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-30-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-34-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-34-expected.png
index 64835e4e..716d998 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-34-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-34-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-35-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-35-expected.png
index e277f6b..62a57fae 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-35-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-35-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-7-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-7-expected.png
index 3608a5f..0ff1f8a 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-7-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-7-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75-expected.png
index fe670be..d25480d 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75b-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75b-expected.png
index fe670be..d25480d 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75b-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-75b-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-79-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-79-expected.png
index bb1aec8..c215e79b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-79-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-79-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-8-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-8-expected.png
index 2777d21..57f75c2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-8-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-8-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-80-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-80-expected.png
index e88ae43..c244f355 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-80-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/selectors3/xml/css3-modsel-80-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/body-generated-image-propagated-to-root-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/body-generated-image-propagated-to-root-expected.png
index 0551d72..6fd06c63b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/body-generated-image-propagated-to-root-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/body-generated-image-propagated-to-root-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/block/float/intruding-painted-twice-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/block/float/intruding-painted-twice-expected.png
index 3f5e3ff..76088710 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/block/float/intruding-painted-twice-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/block/float/intruding-painted-twice-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-huge-assert-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-huge-assert-expected.png
index 71cd982..4610e913 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-huge-assert-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-huge-assert-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/css-generated-content/before-with-first-letter-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/css-generated-content/before-with-first-letter-expected.png
index 18c11d2..85526a1 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/css-generated-content/before-with-first-letter-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/css-generated-content/before-with-first-letter-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/css/first-letter-detach-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/css/first-letter-detach-expected.png
index 1c9bd68f..6ddb3da 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/css/first-letter-detach-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/css/first-letter-detach-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/css/font-face-opentype-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/css/font-face-opentype-expected.png
index 23e910eb..c0e44b4a 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/css/font-face-opentype-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/css/font-face-opentype-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/button/button-inner-block-reuse-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/button/button-inner-block-reuse-expected.png
index 40f5931a..33698dc 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/button/button-inner-block-reuse-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/button/button-inner-block-reuse-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/absolute-position-percentage-height-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/absolute-position-percentage-height-expected.png
index 8cded51..84aac0c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/absolute-position-percentage-height-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/absolute-position-percentage-height-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/image-resize-width-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/image-resize-width-expected.png
index beeee5a..7d0cb17a 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/image-resize-width-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/image-resize-width-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/ruby/base-shorter-than-text-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/ruby/base-shorter-than-text-expected.png
index 644b0aa..5b3ec769 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/ruby/base-shorter-than-text-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/ruby/base-shorter-than-text-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/selectors/034-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/selectors/034-expected.png
index 5decae1d..a3383b82 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/selectors/034-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/selectors/034-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-expected.png
index ab1cc0f..c3bf1ef 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-vertical-expected.png
index 1d09ed2c..c083106 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-vertical-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/table/border-collapsing/border-collapsing-head-foot-vertical-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/table/rtl-cell-display-none-assert-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/table/rtl-cell-display-none-assert-expected.png
index 99ca40c5..6f67262 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/table/rtl-cell-display-none-assert-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/table/rtl-cell-display-none-assert-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text-autosizing/tables/table-cell-inflation-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text-autosizing/tables/table-cell-inflation-expected.png
index b3b07113..288ec4c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text-autosizing/tables/table-cell-inflation-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text-autosizing/tables/table-cell-inflation-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-kerning-and-ligatures-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-kerning-and-ligatures-expected.png
index afe949f..612c87a0 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-kerning-and-ligatures-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-kerning-and-ligatures-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-multiple-renderers-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-multiple-renderers-expected.png
index 766a1e4..e2ec597 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-multiple-renderers-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-multiple-renderers-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-small-caps-punctuation-size-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-small-caps-punctuation-size-expected.png
index eb62961..2f0b4c20 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-small-caps-punctuation-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-small-caps-punctuation-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-spacing-features-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-spacing-features-expected.png
index d9027ab..3f79d63 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-spacing-features-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/atsui-spacing-features-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/chromium-linux-fontconfig-renderstyle-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/chromium-linux-fontconfig-renderstyle-expected.png
index dea6ae3..738b7c74 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/chromium-linux-fontconfig-renderstyle-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/chromium-linux-fontconfig-renderstyle-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-initial-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-initial-expected.png
index c1af2c2..ea924a2f 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-initial-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-initial-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/003-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/003-expected.png
index eb235dd..51868cf7 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/003-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/003-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/bold-bengali-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/bold-bengali-expected.png
index c0e488c..24dbc45 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/bold-bengali-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/bold-bengali-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-complex-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-complex-expected.png
index 17540d2..f166fecf3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-complex-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-complex-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-simple-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-simple-expected.png
index 17540d2..f166fecf3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-simple-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-simple-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-vertical-expected.png
index cbc55fbf..3f7fdff8 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-vertical-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/justify-ideograph-vertical-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/midword-break-before-surrogate-pair-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/midword-break-before-surrogate-pair-expected.png
index e762601..539d519 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/midword-break-before-surrogate-pair-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/midword-break-before-surrogate-pair-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/should-use-atsui-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/should-use-atsui-expected.png
index 0555f8c..4f54abb 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/should-use-atsui-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/should-use-atsui-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-ltr-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-ltr-expected.txt
index d4279356..baad1c26 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-ltr-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-ltr-expected.txt
@@ -1,68 +1,7 @@
-FAIL Size of text does not scale smoothly, reported widths highlighted in red do not match reference row.
+PASS Size of text scales smoothly and width scales with font size as expected.
 PASS successfullyParsed is true
 
 TEST COMPLETE
 Font Size Scaling (LTR, Latin)
 Size of the text should scale smoothly. Reported width should be within 0.02px of that of the highlighted reference row.
-Font SizeWidthNormalizedDiffContent
-10.00177.30212.76-0.01Pack my box with five dozen liquor jugs.
-10.25177.30207.57-5.20Pack my box with five dozen liquor jugs.
-10.50195.03222.8910.13Pack my box with five dozen liquor jugs.
-10.75195.03217.714.94Pack my box with five dozen liquor jugs.
-11.00195.03212.76-0.00Pack my box with five dozen liquor jugs.
-11.25195.03208.03-4.73Pack my box with five dozen liquor jugs.
-11.50212.77222.029.25Pack my box with five dozen liquor jugs.
-11.75212.77217.294.53Pack my box with five dozen liquor jugs.
-12.00212.77212.770.00Pack my box with five dozen liquor jugs.
-12.25212.77208.42-4.34Pack my box with five dozen liquor jugs.
-12.50230.48221.268.50Pack my box with five dozen liquor jugs.
-12.75230.48216.934.16Pack my box with five dozen liquor jugs.
-13.00230.48212.75-0.01Pack my box with five dozen liquor jugs.
-13.25230.48208.74-4.03Pack my box with five dozen liquor jugs.
-13.50248.22220.647.87Pack my box with five dozen liquor jugs.
-13.75248.22216.633.86Pack my box with five dozen liquor jugs.
-14.00248.22212.76-0.01Pack my box with five dozen liquor jugs.
-14.25248.22209.03-3.74Pack my box with five dozen liquor jugs.
-14.50265.95220.107.33Pack my box with five dozen liquor jugs.
-14.75265.95216.373.60Pack my box with five dozen liquor jugs.
-15.00265.95212.76-0.00Pack my box with five dozen liquor jugs.
-15.25265.95209.27-3.49Pack my box with five dozen liquor jugs.
-15.50283.69219.636.86Pack my box with five dozen liquor jugs.
-15.75283.69216.143.38Pack my box with five dozen liquor jugs.
-16.00283.69212.770.00Pack my box with five dozen liquor jugs.
-16.25283.69209.49-3.27Pack my box with five dozen liquor jugs.
-16.50301.41219.206.44Pack my box with five dozen liquor jugs.
-16.75301.41215.933.17Pack my box with five dozen liquor jugs.
-17.00301.41212.76-0.01Pack my box with five dozen liquor jugs.
-17.25301.41209.67-3.09Pack my box with five dozen liquor jugs.
-17.50319.14218.846.07Pack my box with five dozen liquor jugs.
-17.75319.14215.762.99Pack my box with five dozen liquor jugs.
-18.00319.14212.76-0.01Pack my box with five dozen liquor jugs.
-18.25319.14209.85-2.92Pack my box with five dozen liquor jugs.
-18.50336.88218.515.75Pack my box with five dozen liquor jugs.
-18.75336.88215.602.83Pack my box with five dozen liquor jugs.
-19.00336.88212.76-0.00Pack my box with five dozen liquor jugs.
-19.25336.88210.00-2.77Pack my box with five dozen liquor jugs.
-19.50354.61218.225.46Pack my box with five dozen liquor jugs.
-19.75354.61215.462.69Pack my box with five dozen liquor jugs.
-20.00354.61212.770.00Pack my box with five dozen liquor jugs.
-20.25354.61210.14-2.63Pack my box with five dozen liquor jugs.
-20.50372.33217.955.18Pack my box with five dozen liquor jugs.
-20.75372.33215.322.56Pack my box with five dozen liquor jugs.
-21.00372.33212.76-0.01Pack my box with five dozen liquor jugs.
-21.25372.33210.26-2.51Pack my box with five dozen liquor jugs.
-21.50390.06217.714.94Pack my box with five dozen liquor jugs.
-21.75390.06215.212.44Pack my box with five dozen liquor jugs.
-22.00390.06212.76-0.00Pack my box with five dozen liquor jugs.
-22.25390.06210.37-2.39Pack my box with five dozen liquor jugs.
-22.50407.80217.494.73Pack my box with five dozen liquor jugs.
-22.75407.80215.102.34Pack my box with five dozen liquor jugs.
-23.00407.80212.76-0.00Pack my box with five dozen liquor jugs.
-23.25407.80210.48-2.29Pack my box with five dozen liquor jugs.
-23.50425.53217.294.53Pack my box with five dozen liquor jugs.
-23.75425.53215.012.24Pack my box with five dozen liquor jugs.
-24.00425.53212.770.00Pack my box with five dozen liquor jugs.
-24.25425.53210.57-2.19Pack my box with five dozen liquor jugs.
-24.50443.25217.104.34Pack my box with five dozen liquor jugs.
-24.75443.25214.912.14Pack my box with five dozen liquor jugs.
 
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-pixel-expected.png
index 9f48f497..13f80b7 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-pixel-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-pixel-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-rtl-expected.txt
index 9f3a3104..906d1ed 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-rtl-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-rtl-expected.txt
@@ -1,68 +1,7 @@
-FAIL Size of text does not scale smoothly, reported widths highlighted in red do not match reference row.
+PASS Size of text scales smoothly and width scales with font size as expected.
 PASS successfullyParsed is true
 
 TEST COMPLETE
 Font Size Scaling (RTL, Arabic)
 Size of the text should scale smoothly. Reported width should be within 0.02px of that of the highlighted reference row.
-Font SizeWidthNormalizedDiffContent
-10.00154.06184.88-0.02 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-10.25154.06180.37-4.52 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-10.50169.47193.688.79 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-10.75169.47189.174.28 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-11.00169.47184.88-0.02 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-11.25169.47180.77-4.12 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-11.50184.89192.938.04 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-11.75184.89188.823.93 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-12.00184.89184.890.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-12.25184.89181.12-3.77 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-12.50200.30192.287.39 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-12.75200.30188.513.62 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-13.00200.30184.89-0.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-13.25200.30181.40-3.49 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-13.50215.69191.726.83 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-13.75215.69188.243.35 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-14.00215.69184.88-0.02 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-14.25215.69181.63-3.26 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-14.50231.11191.266.37 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-14.75231.11188.023.13 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-15.00231.11184.89-0.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-15.25231.11181.86-3.03 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-15.50246.52190.855.96 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-15.75246.52187.822.93 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-16.00246.52184.89-0.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-16.25246.52182.04-2.85 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-16.50261.92190.495.60 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-16.75261.92187.652.75 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-17.00261.92184.89-0.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-17.25261.92182.21-2.68 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-17.50277.34190.185.29 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-17.75277.34187.502.61 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-18.00277.34184.900.01 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-18.25277.34182.36-2.53 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-18.50292.73189.884.99 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-18.75292.73187.352.46 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-19.00292.73184.88-0.01 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-19.25292.73182.48-2.41 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-19.50308.14189.634.73 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-19.75308.14187.222.33 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-20.00308.14184.88-0.01 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-20.25308.14182.60-2.29 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-20.50323.56189.404.51 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-20.75323.56187.122.23 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-21.00323.56184.890.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-21.25323.56182.72-2.17 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-21.50338.97189.194.30 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-21.75338.97187.022.13 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-22.00338.97184.890.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-22.25338.97182.81-2.08 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-22.50354.36188.994.10 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-22.75354.36186.912.02 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-23.00354.36184.88-0.01 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-23.25354.36182.90-2.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-23.50369.78188.823.93 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-23.75369.78186.841.95 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-24.00369.78184.890.00 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-24.25369.78182.98-1.91 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-24.50385.19188.663.77 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
-24.75385.19186.761.87 أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ‎
 
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-vertical-expected.txt
index 64c6924..f3dc2272 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-vertical-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-vertical-expected.txt
@@ -1,68 +1,7 @@
-FAIL Size of text does not scale smoothly, reported logical widths highlighted in red do not match reference row.
+PASS Size of text scales smoothly and logical width scales with font size as expected.
 PASS successfullyParsed is true
 
 TEST COMPLETE
 Font Size Scaling (vertical-rl, Latin)
 Size of the text should scale smoothly. Reported height (logical width) should be within 0.02px of that of the highlighted reference row.
-Font SizeWidthNormalizedDiffContent
-10.00212.33254.79-0.00Flygande bäckasiner söka hwila på mjuka tuvor.
-10.25212.31248.56-6.24Flygande bäckasiner söka hwila på mjuka tuvor.
-10.50233.59266.9612.17Flygande bäckasiner söka hwila på mjuka tuvor.
-10.75233.58260.745.94Flygande bäckasiner söka hwila på mjuka tuvor.
-11.00233.56254.80-0.00Flygande bäckasiner söka hwila på mjuka tuvor.
-11.25233.55249.12-5.68Flygande bäckasiner söka hwila på mjuka tuvor.
-11.50254.83265.9111.11Flygande bäckasiner söka hwila på mjuka tuvor.
-11.75254.81260.235.44Flygande bäckasiner söka hwila på mjuka tuvor.
-12.00254.80254.800.00Flygande bäckasiner söka hwila på mjuka tuvor.
-12.25254.78249.58-5.22Flygande bäckasiner söka hwila på mjuka tuvor.
-12.50276.05265.0010.21Flygande bäckasiner söka hwila på mjuka tuvor.
-12.75276.05259.815.01Flygande bäckasiner söka hwila på mjuka tuvor.
-13.00276.03254.800.00Flygande bäckasiner söka hwila på mjuka tuvor.
-13.25276.02249.98-4.82Flygande bäckasiner söka hwila på mjuka tuvor.
-13.50297.28264.259.45Flygande bäckasiner söka hwila på mjuka tuvor.
-13.75297.28259.454.65Flygande bäckasiner söka hwila på mjuka tuvor.
-14.00297.27254.800.00Flygande bäckasiner söka hwila på mjuka tuvor.
-14.25297.25250.32-4.48Flygande bäckasiner söka hwila på mjuka tuvor.
-14.50318.52263.608.80Flygande bäckasiner söka hwila på mjuka tuvor.
-14.75318.50259.124.32Flygande bäckasiner söka hwila på mjuka tuvor.
-15.00318.50254.800.00Flygande bäckasiner söka hwila på mjuka tuvor.
-15.25318.48250.61-4.19Flygande bäckasiner söka hwila på mjuka tuvor.
-15.50339.75263.038.24Flygande bäckasiner söka hwila på mjuka tuvor.
-15.75339.73258.854.05Flygande bäckasiner söka hwila på mjuka tuvor.
-16.00339.73254.800.00Flygande bäckasiner söka hwila på mjuka tuvor.
-16.25339.72250.87-3.93Flygande bäckasiner söka hwila på mjuka tuvor.
-16.50360.98262.537.74Flygande bäckasiner söka hwila på mjuka tuvor.
-16.75360.97258.603.81Flygande bäckasiner söka hwila på mjuka tuvor.
-17.00360.95254.79-0.01Flygande bäckasiner söka hwila på mjuka tuvor.
-17.25360.95251.10-3.70Flygande bäckasiner söka hwila på mjuka tuvor.
-17.50382.22262.097.30Flygande bäckasiner söka hwila på mjuka tuvor.
-17.75382.20258.393.59Flygande bäckasiner söka hwila på mjuka tuvor.
-18.00382.19254.79-0.01Flygande bäckasiner söka hwila på mjuka tuvor.
-18.25382.17251.29-3.51Flygande bäckasiner söka hwila på mjuka tuvor.
-18.50403.45261.706.90Flygande bäckasiner söka hwila på mjuka tuvor.
-18.75403.44258.203.40Flygande bäckasiner söka hwila på mjuka tuvor.
-19.00403.42254.79-0.00Flygande bäckasiner söka hwila på mjuka tuvor.
-19.25403.41251.47-3.32Flygande bäckasiner söka hwila på mjuka tuvor.
-19.50424.69261.356.55Flygande bäckasiner söka hwila på mjuka tuvor.
-19.75424.67258.033.23Flygande bäckasiner söka hwila på mjuka tuvor.
-20.00424.66254.79-0.00Flygande bäckasiner söka hwila på mjuka tuvor.
-20.25424.64251.64-3.16Flygande bäckasiner söka hwila på mjuka tuvor.
-20.50445.92261.036.23Flygande bäckasiner söka hwila på mjuka tuvor.
-20.75445.91257.873.08Flygande bäckasiner söka hwila på mjuka tuvor.
-21.00445.89254.79-0.00Flygande bäckasiner söka hwila på mjuka tuvor.
-21.25445.88251.79-3.01Flygande bäckasiner söka hwila på mjuka tuvor.
-21.50467.16260.745.94Flygande bäckasiner söka hwila på mjuka tuvor.
-21.75467.14257.732.94Flygande bäckasiner söka hwila på mjuka tuvor.
-22.00467.13254.80-0.00Flygande bäckasiner söka hwila på mjuka tuvor.
-22.25467.11251.92-2.87Flygande bäckasiner söka hwila på mjuka tuvor.
-22.50488.39260.485.68Flygande bäckasiner söka hwila på mjuka tuvor.
-22.75488.38257.602.81Flygande bäckasiner söka hwila på mjuka tuvor.
-23.00488.36254.80-0.00Flygande bäckasiner söka hwila på mjuka tuvor.
-23.25488.34252.05-2.75Flygande bäckasiner söka hwila på mjuka tuvor.
-23.50509.63260.235.44Flygande bäckasiner söka hwila på mjuka tuvor.
-23.75509.61257.492.69Flygande bäckasiner söka hwila på mjuka tuvor.
-24.00509.59254.800.00Flygande bäckasiner söka hwila på mjuka tuvor.
-24.25509.58252.16-2.63Flygande bäckasiner söka hwila på mjuka tuvor.
-24.50530.86260.015.22Flygande bäckasiner söka hwila på mjuka tuvor.
-24.75530.84257.382.58Flygande bäckasiner söka hwila på mjuka tuvor.
 
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-webfont-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-webfont-expected.txt
index e98a0965..24a8cf4 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-webfont-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/sub-pixel/text-scaling-webfont-expected.txt
@@ -1,68 +1,7 @@
-FAIL Size of text does not scale smoothly, reported widths highlighted in red do not match reference row.
+PASS Size of text scales smoothly and width scales with font size as expected.
 PASS successfullyParsed is true
 
 TEST COMPLETE
 Font Size Scaling (WebFont, Latin)
 Size of the text should scale smoothly. Reported width should be within 0.02px of that of the highlighted reference row.
-Font SizeWidthNormalizedDiffContent
-10.00246.25295.500.00My faxed joke won a pager in the cable TV quiz show.
-10.25246.22288.26-7.24My faxed joke won a pager in the cable TV quiz show.
-10.50270.92309.6314.13My faxed joke won a pager in the cable TV quiz show.
-10.75270.89302.396.89My faxed joke won a pager in the cable TV quiz show.
-11.00270.88295.500.00My faxed joke won a pager in the cable TV quiz show.
-11.25270.84288.90-6.60My faxed joke won a pager in the cable TV quiz show.
-11.50295.55308.4012.90My faxed joke won a pager in the cable TV quiz show.
-11.75295.52301.806.30My faxed joke won a pager in the cable TV quiz show.
-12.00295.50295.500.00My faxed joke won a pager in the cable TV quiz show.
-12.25295.47289.44-6.06My faxed joke won a pager in the cable TV quiz show.
-12.50320.17307.3711.87My faxed joke won a pager in the cable TV quiz show.
-12.75320.16301.325.82My faxed joke won a pager in the cable TV quiz show.
-13.00320.13295.500.00My faxed joke won a pager in the cable TV quiz show.
-13.25320.09289.90-5.60My faxed joke won a pager in the cable TV quiz show.
-13.50344.80306.4910.99My faxed joke won a pager in the cable TV quiz show.
-13.75344.78300.905.40My faxed joke won a pager in the cable TV quiz show.
-14.00344.75295.500.00My faxed joke won a pager in the cable TV quiz show.
-14.25344.72290.29-5.21My faxed joke won a pager in the cable TV quiz show.
-14.50369.42305.7310.23My faxed joke won a pager in the cable TV quiz show.
-14.75369.41300.535.03My faxed joke won a pager in the cable TV quiz show.
-15.00369.38295.500.00My faxed joke won a pager in the cable TV quiz show.
-15.25369.34290.63-4.87My faxed joke won a pager in the cable TV quiz show.
-15.50394.05305.079.57My faxed joke won a pager in the cable TV quiz show.
-15.75394.03300.214.71My faxed joke won a pager in the cable TV quiz show.
-16.00394.00295.500.00My faxed joke won a pager in the cable TV quiz show.
-16.25393.97290.93-4.57My faxed joke won a pager in the cable TV quiz show.
-16.50418.67304.498.99My faxed joke won a pager in the cable TV quiz show.
-16.75418.66299.934.43My faxed joke won a pager in the cable TV quiz show.
-17.00418.63295.500.00My faxed joke won a pager in the cable TV quiz show.
-17.25418.59291.20-4.30My faxed joke won a pager in the cable TV quiz show.
-17.50443.30303.988.48My faxed joke won a pager in the cable TV quiz show.
-17.75443.28299.684.18My faxed joke won a pager in the cable TV quiz show.
-18.00443.25295.500.00My faxed joke won a pager in the cable TV quiz show.
-18.25443.22291.43-4.07My faxed joke won a pager in the cable TV quiz show.
-18.50467.92303.528.02My faxed joke won a pager in the cable TV quiz show.
-18.75467.91299.463.96My faxed joke won a pager in the cable TV quiz show.
-19.00467.88295.500.00My faxed joke won a pager in the cable TV quiz show.
-19.25467.84291.64-3.86My faxed joke won a pager in the cable TV quiz show.
-19.50492.55303.117.61My faxed joke won a pager in the cable TV quiz show.
-19.75492.53299.263.76My faxed joke won a pager in the cable TV quiz show.
-20.00492.50295.500.00My faxed joke won a pager in the cable TV quiz show.
-20.25492.48291.84-3.66My faxed joke won a pager in the cable TV quiz show.
-20.50517.17302.737.23My faxed joke won a pager in the cable TV quiz show.
-20.75517.16299.083.58My faxed joke won a pager in the cable TV quiz show.
-21.00517.13295.500.00My faxed joke won a pager in the cable TV quiz show.
-21.25517.11292.01-3.49My faxed joke won a pager in the cable TV quiz show.
-21.50541.80302.406.90My faxed joke won a pager in the cable TV quiz show.
-21.75541.78298.913.41My faxed joke won a pager in the cable TV quiz show.
-22.00541.75295.500.00My faxed joke won a pager in the cable TV quiz show.
-22.25541.73292.17-3.33My faxed joke won a pager in the cable TV quiz show.
-22.50566.42302.096.59My faxed joke won a pager in the cable TV quiz show.
-22.75566.41298.763.26My faxed joke won a pager in the cable TV quiz show.
-23.00566.38295.500.00My faxed joke won a pager in the cable TV quiz show.
-23.25566.36292.31-3.19My faxed joke won a pager in the cable TV quiz show.
-23.50591.05301.816.31My faxed joke won a pager in the cable TV quiz show.
-23.75591.03298.633.13My faxed joke won a pager in the cable TV quiz show.
-24.00591.00295.500.00My faxed joke won a pager in the cable TV quiz show.
-24.25590.98292.45-3.05My faxed joke won a pager in the cable TV quiz show.
-24.50615.67301.556.05My faxed joke won a pager in the cable TV quiz show.
-24.75615.66298.503.00My faxed joke won a pager in the cable TV quiz show.
 
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-soft-hyphen-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-soft-hyphen-expected.png
index 03d4383..514866619 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-soft-hyphen-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-soft-hyphen-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/Kusa-Makura-background-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
index de86892..8c5c1e9 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
index 21f004b..1e2f3acb 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-rl-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
index 9135f4e..e0491b6 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/vertical-align-table-baseline-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/vertical-align-table-baseline-expected.png
index a0a59379..6b46355 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/vertical-align-table-baseline-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/vertical-align-table-baseline-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fonts/monospace-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fonts/monospace-expected.png
index 084a132..0f39344 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fonts/monospace-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fonts/monospace-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fonts/sans-serif-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fonts/sans-serif-expected.png
index b5c10e7..6a3e82e 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fonts/sans-serif-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fonts/sans-serif-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fonts/serif-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fonts/serif-expected.png
index cceb2c3..55eb1cc33 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fonts/serif-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fonts/serif-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-image-shape-expected.png b/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-image-shape-expected.png
index a1dac53..261855ce 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-image-shape-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-image-shape-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png
index b8f6af6..9b6320d 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-01-t-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
index 1a823bb1..aa4d695 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-03-b-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
index 047e6b0f..aff26f2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-04-t-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
index 243fb05..252d674 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/font-face-cascade-order-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/font-face-cascade-order-expected.png
index 655790f9..fddeaa0 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/font-face-cascade-order-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/font-face-cascade-order-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.png
index 44f08c6a..40f8bb2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt
index 5980a1e..c0b753b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt
@@ -43,11 +43,11 @@
           LayoutSVGTSpan {tspan} at (17.77,28.34) size 67.22x27.22
             LayoutSVGInlineText {#text} at (35.55,28.34) size 49.44x27.22
               chunk 1 text run 1 at (40.00,50.00) startOffset 0 endOffset 6 width 40.00: "ffffff"
-        LayoutSVGText {text} at (20,61.67) size 33.33x16.66 contains 1 chunk(s)
-          LayoutSVGInlineText {#text} at (20,61.67) size 33.33x16.66
-            chunk 1 text run 1 at (20.00,75.00) startOffset 0 endOffset 5 width 32.78: "'faQ'"
+        LayoutSVGText {text} at (20,61.67) size 32.77x16.66 contains 1 chunk(s)
+          LayoutSVGInlineText {#text} at (20,61.67) size 32.77x16.66
+            chunk 1 text run 1 at (20.00,75.00) startOffset 0 endOffset 5 width 31.67: "'faQ'"
         LayoutSVGRect {rect} at (17.77,8.89) size 85x13.87 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=17.77] [y=8.89] [width=85.00] [height=13.88]
         LayoutSVGRect {rect} at (17.77,28.34) size 67.22x27.22 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=17.77] [y=28.34] [width=67.22] [height=27.22]
-        LayoutSVGRect {rect} at (20,61.67) size 33.33x16.66 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=20.00] [y=61.67] [width=33.33] [height=16.66]
+        LayoutSVGRect {rect} at (20,61.67) size 32.77x16.66 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=20.00] [y=61.67] [width=32.77] [height=16.66]
       LayoutText {#text} at (0,0) size 0x0
       LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
index e54fe5a..2628727 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
index e54fe5a..2628727 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
index 63d8d529..0a9d2fe 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-zoom-coords-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-zoom-coords-expected.txt
index 8d7ebc5..e5e4afc 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-zoom-coords-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-zoom-coords-expected.txt
@@ -79,9 +79,9 @@
 PASS image2.bottom is 125.00
 PASS text2.left is 175.00
 PASS text2.top is 132.66
-FAIL text2.width should be 47.98. Was 47.421878814697266.
+FAIL text2.width should be 47.98. Was 47.85938262939453.
 FAIL text2.height should be 6.02. Was 5.921872138977051.
-FAIL text2.right should be 222.98. Was 222.421875.
+FAIL text2.right should be 222.98. Was 222.859375.
 FAIL text2.bottom should be 138.7. Was 138.59375.
 
 PASS svg3.left is 900.00
diff --git a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug139524-2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug139524-2-expected.png
index 908bfc39..1d6e6f5 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug139524-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug139524-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug5838-expected.png b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug5838-expected.png
index 3654324..101ec96 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug5838-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/bugs/bug5838-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/transforms/transforms-with-zoom-expected.png b/third_party/WebKit/LayoutTests/platform/linux/transforms/transforms-with-zoom-expected.png
index 90795ca..f1ec620 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/transforms/transforms-with-zoom-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/transforms/transforms-with-zoom-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-shape-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-shape-expected.png
index 0606f19b..5f70429 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-shape-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-shape-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-loading/css1/color_and_background/background_attachment-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-loading/css1/color_and_background/background_attachment-expected.png
new file mode 100644
index 0000000..74f6c50
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-loading/css1/color_and_background/background_attachment-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 822b8272..7c29e01 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
index b577f25..40f10a4 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 822b8272..7c29e01 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/popup-menu-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/popup-menu-appearance-expected.png
index b577f25..40f10a4 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/popup-menu-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
index 5dfce33..208513a 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -4130,6 +4130,7 @@
     method createDataChannel
     method createOffer
     method getLocalStreams
+    method getReceivers
     method getRemoteStreams
     method getStats
     method getStreamById
@@ -4149,6 +4150,16 @@
     attribute @@toStringTag
     getter candidate
     method constructor
+interface RTCRtpContributingSource
+    attribute @@toStringTag
+    getter source
+    getter timestamp
+    method constructor
+interface RTCRtpReceiver
+    attribute @@toStringTag
+    getter track
+    method constructor
+    method getContributingSources
 interface RTCSessionDescription
     attribute @@toStringTag
     getter sdp
@@ -7410,6 +7421,7 @@
     method createDataChannel
     method createOffer
     method getLocalStreams
+    method getReceivers
     method getRemoteStreams
     method getStats
     method getStreamById
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
index b9ef410..d35a263 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -4058,6 +4058,7 @@
     method createDataChannel
     method createOffer
     method getLocalStreams
+    method getReceivers
     method getRemoteStreams
     method getStats
     method getStreamById
@@ -4077,6 +4078,16 @@
     attribute @@toStringTag
     getter candidate
     method constructor
+interface RTCRtpContributingSource
+    attribute @@toStringTag
+    getter source
+    getter timestamp
+    method constructor
+interface RTCRtpReceiver
+    attribute @@toStringTag
+    getter track
+    method constructor
+    method getContributingSources
 interface RTCSessionDescription
     attribute @@toStringTag
     getter sdp
@@ -7338,6 +7349,7 @@
     method createDataChannel
     method createOffer
     method getLocalStreams
+    method getReceivers
     method getRemoteStreams
     method getStats
     method getStreamById
diff --git a/third_party/WebKit/LayoutTests/whitespace.txt b/third_party/WebKit/LayoutTests/whitespace.txt
index f062b30f..949d9db 100644
--- a/third_party/WebKit/LayoutTests/whitespace.txt
+++ b/third_party/WebKit/LayoutTests/whitespace.txt
@@ -15,4 +15,3 @@
 T'was the sound of a broken interval record.
 
 But the data was inacurate.
-
diff --git a/third_party/WebKit/Source/core/dom/AttributeCollection.h b/third_party/WebKit/Source/core/dom/AttributeCollection.h
index 30f1cb59..304aa899 100644
--- a/third_party/WebKit/Source/core/dom/AttributeCollection.h
+++ b/third_party/WebKit/Source/core/dom/AttributeCollection.h
@@ -142,7 +142,8 @@
   iterator end = this->end();
   unsigned index = 0;
   for (iterator it = begin(); it != end; ++it, ++index) {
-    if (it->GetName().MatchesPossiblyIgnoringCase(name, should_ignore_case))
+    if (it->GetName().MatchesPossiblyIgnoringASCIICase(name,
+                                                       should_ignore_case))
       return index;
   }
   return kNotFound;
@@ -204,14 +205,14 @@
     // and all HTML/SVG attributes have a null namespace!
     if (!it->GetName().HasPrefix()) {
       if (should_ignore_attribute_case &&
-          DeprecatedEqualIgnoringCase(name, it->LocalName()))
+          EqualIgnoringASCIICase(name, it->LocalName()))
         return index;
     } else {
-      // FIXME: Would be faster to do this comparison without calling toString,
+      // FIXME: Would be faster to do this comparison without calling ToString,
       // which generates a temporary string by concatenation. But this branch is
       // only reached if the attribute name has a prefix, which is rare in HTML.
-      if (EqualPossiblyIgnoringCase(name, it->GetName().ToString(),
-                                    should_ignore_attribute_case))
+      if (EqualPossiblyIgnoringASCIICase(name, it->GetName().ToString(),
+                                         should_ignore_attribute_case))
         return index;
     }
   }
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.cpp b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
index 5e2afbd..399b9b80 100644
--- a/third_party/WebKit/Source/core/dom/ContainerNode.cpp
+++ b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
@@ -279,11 +279,6 @@
   if (!ref_child)
     return AppendChild(new_child, exception_state);
 
-  // Make sure adding the new child is OK.
-  if (!CheckAcceptChild(new_child, 0, exception_state))
-    return new_child;
-  DCHECK(new_child);
-
   // NotFoundError: Raised if refChild is not a child of this node
   if (ref_child->parentNode() != this) {
     exception_state.ThrowDOMException(
@@ -301,6 +296,11 @@
       return AppendChild(new_child, exception_state);
   }
 
+  // Make sure adding the new child is OK.
+  if (!CheckAcceptChild(new_child, 0, exception_state))
+    return new_child;
+  DCHECK(new_child);
+
   NodeVector targets;
   if (!CollectChildrenAndRemoveFromOldParentWithCheck(
           ref_child, nullptr, *new_child, targets, exception_state))
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index a2390f6..869b1be9 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -393,8 +393,8 @@
   if (!GetElementData())
     return;
   if (GetElementData()->style_attribute_is_dirty_ &&
-      EqualPossiblyIgnoringCase(local_name, styleAttr.LocalName(),
-                                ShouldIgnoreAttributeCase())) {
+      EqualPossiblyIgnoringASCIICase(local_name, styleAttr.LocalName(),
+                                     ShouldIgnoreAttributeCase())) {
     DCHECK(IsStyledElement());
     SynchronizeStyleAttributeInternal();
     return;
@@ -1243,7 +1243,7 @@
 
   SynchronizeAttribute(local_name);
   const AtomicString& case_adjusted_local_name =
-      ShouldIgnoreAttributeCase() ? local_name.DeprecatedLower() : local_name;
+      ShouldIgnoreAttributeCase() ? local_name.LowerASCII() : local_name;
 
   if (!GetElementData()) {
     SetAttributeInternal(
@@ -2463,7 +2463,7 @@
   }
 
   if (!IsHTMLElement() && attr_node->GetDocument().IsHTMLDocument() &&
-      attr_node->name() != attr_node->name().DeprecatedLower())
+      attr_node->name() != attr_node->name().LowerASCII())
     UseCounter::Count(
         GetDocument(),
         UseCounter::
@@ -2630,7 +2630,7 @@
     return;
 
   AtomicString local_name =
-      ShouldIgnoreAttributeCase() ? name.DeprecatedLower() : name;
+      ShouldIgnoreAttributeCase() ? name.LowerASCII() : name;
   size_t index = GetElementData()->Attributes().FindIndex(local_name, false);
   if (index == kNotFound) {
     if (UNLIKELY(local_name == styleAttr) &&
@@ -2675,8 +2675,7 @@
     return false;
   SynchronizeAttribute(local_name);
   return GetElementData()->Attributes().FindIndex(
-             ShouldIgnoreAttributeCase() ? local_name.DeprecatedLower()
-                                         : local_name,
+             ShouldIgnoreAttributeCase() ? local_name.LowerASCII() : local_name,
              false) != kNotFound;
 }
 
@@ -3888,7 +3887,7 @@
   if (AttrNodeList* attr_node_list = this->GetAttrNodeList()) {
     bool should_ignore_case = ShouldIgnoreAttributeCase();
     for (const auto& attr : *attr_node_list) {
-      if (attr->GetQualifiedName().MatchesPossiblyIgnoringCase(
+      if (attr->GetQualifiedName().MatchesPossiblyIgnoringASCIICase(
               name, should_ignore_case))
         return attr.Get();
     }
diff --git a/third_party/WebKit/Source/core/dom/QualifiedName.h b/third_party/WebKit/Source/core/dom/QualifiedName.h
index 087ef73..f5f099a 100644
--- a/third_party/WebKit/Source/core/dom/QualifiedName.h
+++ b/third_party/WebKit/Source/core/dom/QualifiedName.h
@@ -135,11 +135,11 @@
                                     NamespaceURI() == other.NamespaceURI());
   }
 
-  bool MatchesPossiblyIgnoringCase(const QualifiedName& other,
-                                   bool should_ignore_case) const {
+  bool MatchesPossiblyIgnoringASCIICase(const QualifiedName& other,
+                                        bool should_ignore_case) const {
     return impl_ == other.impl_ ||
-           (EqualPossiblyIgnoringCase(LocalName(), other.LocalName(),
-                                      should_ignore_case) &&
+           (EqualPossiblyIgnoringASCIICase(LocalName(), other.LocalName(),
+                                           should_ignore_case) &&
             NamespaceURI() == other.NamespaceURI());
   }
 
diff --git a/third_party/WebKit/Source/core/frame/DOMTimer.cpp b/third_party/WebKit/Source/core/frame/DOMTimer.cpp
index 9451ccb..4307546 100644
--- a/third_party/WebKit/Source/core/frame/DOMTimer.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMTimer.cpp
@@ -88,8 +88,10 @@
     user_gesture_token_ = UserGestureIndicator::CurrentToken();
   }
 
+  // TODO(delphick): Remove the single shot guard here so that this affects
+  // setInterval as well.
   double interval_milliseconds =
-      std::max(kOneMillisecond, interval * kOneMillisecond);
+      std::max(single_shot ? 0.0 : kOneMillisecond, interval * kOneMillisecond);
   if (interval_milliseconds < kMinimumInterval &&
       nesting_level_ >= kMaxTimerNestingLevel)
     interval_milliseconds = kMinimumInterval;
diff --git a/third_party/WebKit/Source/core/frame/DOMTimerTest.cpp b/third_party/WebKit/Source/core/frame/DOMTimerTest.cpp
index 54973591..a8d0c332 100644
--- a/third_party/WebKit/Source/core/frame/DOMTimerTest.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMTimerTest.cpp
@@ -23,6 +23,8 @@
 
 namespace {
 
+const double kThreshold = 0.000001;
+
 class DOMTimerTest : public RenderingTest {
  public:
   ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
@@ -32,9 +34,9 @@
   // setTimeout(..., 1) are 1, 1, 1, 1, 4, 4, ... as a minumum clamp of 4m
   // is applied from the 5th iteration onwards.
   const std::vector<Matcher<double>> kExpectedTimings = {
-      DoubleNear(1., 0.000001), DoubleNear(1., 0.000001),
-      DoubleNear(1., 0.000001), DoubleNear(1., 0.000001),
-      DoubleNear(4., 0.000001), DoubleNear(4., 0.000001),
+      DoubleNear(1., kThreshold), DoubleNear(1., kThreshold),
+      DoubleNear(1., kThreshold), DoubleNear(1., kThreshold),
+      DoubleNear(4., kThreshold), DoubleNear(4., kThreshold),
   };
 
   void SetUp() override {
@@ -62,6 +64,11 @@
                                        exception_state);
   }
 
+  double ToDoubleValue(v8::Local<v8::Value> value, v8::HandleScope& scope) {
+    NonThrowableExceptionState exceptionState;
+    return ToDouble(scope.GetIsolate(), value, exceptionState);
+  }
+
   void ExecuteScriptAndWaitUntilIdle(const char* script_text) {
     ScriptSourceCode script(script_text);
     GetDocument().GetFrame()->Script().ExecuteScriptInMainWorld(script);
@@ -69,8 +76,27 @@
   }
 };
 
-const char* g_k_set_timeout_script_text =
-    "var id;"
+const char* const kSetTimeout0ScriptText =
+    "var last = performance.now();"
+    "var elapsed;"
+    "function setTimeoutCallback() {"
+    "  var current = performance.now();"
+    "  elapsed = current - last;"
+    "  times.push(elapsed);"
+    "}"
+    "setTimeout(setTimeoutCallback, 0);";
+
+TEST_F(DOMTimerTest, setTimeout_ZeroIsNotClampedToOne) {
+  v8::HandleScope scope(v8::Isolate::GetCurrent());
+
+  ExecuteScriptAndWaitUntilIdle(kSetTimeout0ScriptText);
+
+  double time = ToDoubleValue(EvalExpression("elapsed"), scope);
+
+  EXPECT_THAT(time, DoubleNear(0., kThreshold));
+}
+
+const char* const kSetTimeoutNestedScriptText =
     "var last = performance.now();"
     "var times = [];"
     "function nestSetTimeouts() {"
@@ -87,14 +113,14 @@
 TEST_F(DOMTimerTest, setTimeout_ClampsAfter4Nestings) {
   v8::HandleScope scope(v8::Isolate::GetCurrent());
 
-  ExecuteScriptAndWaitUntilIdle(g_k_set_timeout_script_text);
+  ExecuteScriptAndWaitUntilIdle(kSetTimeoutNestedScriptText);
 
   auto times(ToDoubleArray(EvalExpression("times"), scope));
 
   EXPECT_THAT(times, ElementsAreArray(kExpectedTimings));
 }
 
-const char* g_k_set_interval_script_text =
+const char* const kSetIntervalScriptText =
     "var last = performance.now();"
     "var times = [];"
     "var id = setInterval(function() {"
@@ -110,7 +136,7 @@
 TEST_F(DOMTimerTest, setInterval_ClampsAfter4Iterations) {
   v8::HandleScope scope(v8::Isolate::GetCurrent());
 
-  ExecuteScriptAndWaitUntilIdle(g_k_set_interval_script_text);
+  ExecuteScriptAndWaitUntilIdle(kSetIntervalScriptText);
 
   auto times(ToDoubleArray(EvalExpression("times"), scope));
 
@@ -120,12 +146,12 @@
 TEST_F(DOMTimerTest, setInterval_NestingResetsForLaterCalls) {
   v8::HandleScope scope(v8::Isolate::GetCurrent());
 
-  ExecuteScriptAndWaitUntilIdle(g_k_set_interval_script_text);
+  ExecuteScriptAndWaitUntilIdle(kSetIntervalScriptText);
 
   // Run the setIntervalScript again to verify that the clamp imposed for
   // nesting beyond 4 levels is reset when setInterval is called again in the
   // original scope but after the original setInterval has completed.
-  ExecuteScriptAndWaitUntilIdle(g_k_set_interval_script_text);
+  ExecuteScriptAndWaitUntilIdle(kSetIntervalScriptText);
 
   auto times(ToDoubleArray(EvalExpression("times"), scope));
 
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index 264ef204..e5f88b2 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -1526,6 +1526,9 @@
   if (owner)
     owner->DispatchLoad();
 
+  TRACE_EVENT_INSTANT1("devtools.timeline", "MarkLoad",
+                       TRACE_EVENT_SCOPE_THREAD, "data",
+                       InspectorMarkLoadEvent::Data(GetFrame()));
   probe::loadEventFired(GetFrame());
 }
 
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
index 24d1891..a1089a06 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
@@ -106,12 +106,6 @@
   InspectorAgent::Trace(visitor);
 }
 
-void InspectorTraceEvents::LoadEventFired(LocalFrame* frame) {
-  TRACE_EVENT_INSTANT1("devtools.timeline", "MarkLoad",
-                      TRACE_EVENT_SCOPE_THREAD, "data",
-                      InspectorMarkLoadEvent::Data(frame));
-}
-
 void InspectorTraceEvents::WillSendRequest(
     LocalFrame* frame,
     unsigned long identifier,
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h
index dfb12f5..bf1399e 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h
@@ -76,7 +76,7 @@
             protocol::UberDispatcher*,
             protocol::DictionaryValue*) override;
   void Dispose() override;
-  void LoadEventFired(LocalFrame*);
+
   void WillSendRequest(LocalFrame*,
                        unsigned long identifier,
                        DocumentLoader*,
diff --git a/third_party/WebKit/Source/core/probe/CoreProbes.json5 b/third_party/WebKit/Source/core/probe/CoreProbes.json5
index 9d78dbb2..77111ae 100644
--- a/third_party/WebKit/Source/core/probe/CoreProbes.json5
+++ b/third_party/WebKit/Source/core/probe/CoreProbes.json5
@@ -167,7 +167,6 @@
         "didFinishLoading",
         "didReceiveData",
         "didReceiveResourceResponse",
-        "loadEventFired",
         "ParseHTML",
         "willSendRequest",
       ]
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl
index 4c793b3..8a61a27 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl
@@ -113,7 +113,7 @@
     [CallWith=ScriptState] Promise<RTCStatsReport> getStats();
 
     // https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-getreceivers
-    [RuntimeEnabled=RTCRtpReceiver] sequence<RTCRtpReceiver> getReceivers();
+    sequence<RTCRtpReceiver> getReceivers();
 
     // https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api
     // TODO(guidou): The label argument should have [TreatNullAs=EmptyString]
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCRtpContributingSource.idl b/third_party/WebKit/Source/modules/peerconnection/RTCRtpContributingSource.idl
index 3c0f1e3..0a0ff1fc 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCRtpContributingSource.idl
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCRtpContributingSource.idl
@@ -3,9 +3,7 @@
 // found in the LICENSE file.
 
 // https://w3c.github.io/webrtc-pc/#dom-rtcrtpcontributingsource
-[
-    RuntimeEnabled=RTCRtpReceiver,
-] interface RTCRtpContributingSource {
+interface RTCRtpContributingSource {
     readonly attribute DOMHighResTimeStamp timestamp;
     readonly attribute unsigned long       source;
 
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCRtpReceiver.idl b/third_party/WebKit/Source/modules/peerconnection/RTCRtpReceiver.idl
index f18aaf9..c4cb2d6 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCRtpReceiver.idl
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCRtpReceiver.idl
@@ -3,9 +3,7 @@
 // found in the LICENSE file.
 
 // https://w3c.github.io/webrtc-pc/#rtcrtpreceiver-interface
-[
-    RuntimeEnabled=RTCRtpReceiver,
-] interface RTCRtpReceiver {
+interface RTCRtpReceiver {
     readonly attribute MediaStreamTrack track;
     sequence<RTCRtpContributingSource> getContributingSources();
 
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
index 82898e6e..fd6a857f 100644
--- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
+++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
@@ -814,10 +814,6 @@
       name: "RootLayerScrolling",
     },
     {
-      name: "RTCRtpReceiver",
-      status: "experimental",
-    },
-    {
       name: "ScriptedSpeech",
       status: "stable",
     },
diff --git a/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.cpp b/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.cpp
index 90cb57f..9fc1cb7 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.cpp
@@ -291,7 +291,7 @@
   decoded_size += o->DecodedSize();
   encoded_size += o->EncodedSize();
   overhead_size += o->OverheadSize();
-  encoded_size_duplicated_in_data_ur_ls +=
+  encoded_size_duplicated_in_data_urls +=
       o->Url().ProtocolIsData() ? o->EncodedSize() : 0;
 }
 
diff --git a/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.h b/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.h
index ad6047a3..3838e67 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/MemoryCache.h
@@ -90,7 +90,7 @@
     size_t decoded_size;
     size_t encoded_size;
     size_t overhead_size;
-    size_t encoded_size_duplicated_in_data_ur_ls;
+    size_t encoded_size_duplicated_in_data_urls;
 
     TypeStatistic()
         : count(0),
@@ -98,7 +98,7 @@
           decoded_size(0),
           encoded_size(0),
           overhead_size(0),
-          encoded_size_duplicated_in_data_ur_ls(0) {}
+          encoded_size_duplicated_in_data_urls(0) {}
 
     void AddResource(Resource*);
   };
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
index e17a24a7..fc5b5325 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
@@ -305,7 +305,7 @@
                                          RevalidationPolicy policy,
                                          bool is_static_data) {
   if (policy == kUse && resource->GetStatus() == ResourceStatus::kCached &&
-      !validated_ur_ls_.Contains(resource->Url())) {
+      !validated_urls_.Contains(resource->Url())) {
     // Loaded from MemoryCache.
     DidLoadResourceFromMemoryCache(identifier, resource,
                                    request.GetResourceRequest());
@@ -315,7 +315,7 @@
     return;
 
   if (policy == kUse && !resource->StillNeedsLoad() &&
-      !validated_ur_ls_.Contains(request.GetResourceRequest().Url())) {
+      !validated_urls_.Contains(request.GetResourceRequest().Url())) {
     // Resources loaded from memory cache should be reported the first time
     // they're used.
     RefPtr<ResourceTimingInfo> info = ResourceTimingInfo::Create(
@@ -329,10 +329,10 @@
       resource_timing_report_timer_.StartOneShot(0, BLINK_FROM_HERE);
   }
 
-  if (validated_ur_ls_.size() >= kMaxValidatedURLsSize) {
-    validated_ur_ls_.Clear();
+  if (validated_urls_.size() >= kMaxValidatedURLsSize) {
+    validated_urls_.Clear();
   }
-  validated_ur_ls_.insert(request.GetResourceRequest().Url());
+  validated_urls_.insert(request.GetResourceRequest().Url());
 }
 
 void ResourceFetcher::DidLoadResourceFromMemoryCache(
@@ -968,7 +968,7 @@
   // or other factors that require separate requests.
   if (type != Resource::kRaw) {
     if (!Context().IsLoadComplete() &&
-        validated_ur_ls_.Contains(existing_resource->Url()))
+        validated_urls_.Contains(existing_resource->Url()))
       return kUse;
     if (existing_resource->IsLoading())
       return kUse;
@@ -1096,24 +1096,24 @@
     preloads_ = new HeapListHashSet<Member<Resource>>;
   preloads_->insert(resource);
 
-  if (preloaded_ur_ls_for_test_)
-    preloaded_ur_ls_for_test_->insert(resource->Url().GetString());
+  if (preloaded_urls_for_test_)
+    preloaded_urls_for_test_->insert(resource->Url().GetString());
 }
 
 void ResourceFetcher::EnableIsPreloadedForTest() {
-  if (preloaded_ur_ls_for_test_)
+  if (preloaded_urls_for_test_)
     return;
-  preloaded_ur_ls_for_test_ = WTF::WrapUnique(new HashSet<String>);
+  preloaded_urls_for_test_ = WTF::WrapUnique(new HashSet<String>);
 
   if (preloads_) {
     for (const auto& resource : *preloads_)
-      preloaded_ur_ls_for_test_->insert(resource->Url().GetString());
+      preloaded_urls_for_test_->insert(resource->Url().GetString());
   }
 }
 
 bool ResourceFetcher::IsPreloadedForTest(const KURL& url) const {
-  DCHECK(preloaded_ur_ls_for_test_);
-  return preloaded_ur_ls_for_test_->Contains(url.GetString());
+  DCHECK(preloaded_urls_for_test_);
+  return preloaded_urls_for_test_->Contains(url.GetString());
 }
 
 void ResourceFetcher::ClearPreloads(ClearPreloadsPolicy policy) {
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.h
index af547b94..8b1d0b3 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.h
@@ -225,7 +225,7 @@
 
   Member<FetchContext> context_;
 
-  HashSet<String> validated_ur_ls_;
+  HashSet<String> validated_urls_;
   mutable DocumentResourceMap document_resources_;
 
   Member<HeapListHashSet<Member<Resource>>> preloads_;
@@ -261,7 +261,7 @@
   };
   DeadResourceStatsRecorder dead_stats_recorder_;
 
-  std::unique_ptr<HashSet<String>> preloaded_ur_ls_for_test_;
+  std::unique_ptr<HashSet<String>> preloaded_urls_for_test_;
 
   // 28 bits left
   bool auto_load_images_ : 1;
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp
index 4670840..10d9b50 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceTest.cpp
@@ -25,13 +25,13 @@
 
   // From blink::Platform:
   void CacheMetadata(const WebURL& url, int64_t, const char*, size_t) override {
-    cached_ur_ls_.push_back(url);
+    cached_urls_.push_back(url);
   }
 
-  const Vector<WebURL>& CachedURLs() const { return cached_ur_ls_; }
+  const Vector<WebURL>& CachedURLs() const { return cached_urls_; }
 
  private:
-  Vector<WebURL> cached_ur_ls_;
+  Vector<WebURL> cached_urls_;
 };
 
 ResourceResponse CreateTestResourceResponse() {
diff --git a/third_party/WebKit/Source/platform/wtf/text/WTFString.cpp b/third_party/WebKit/Source/platform/wtf/text/WTFString.cpp
index 9eb60a78..b200e85 100644
--- a/third_party/WebKit/Source/platform/wtf/text/WTFString.cpp
+++ b/third_party/WebKit/Source/platform/wtf/text/WTFString.cpp
@@ -294,6 +294,12 @@
   return impl_->UpperUnicode(locale_identifier);
 }
 
+String String::LowerASCII() const {
+  if (!impl_)
+    return String();
+  return impl_->LowerASCII();
+}
+
 String String::UpperASCII() const {
   if (!impl_)
     return String();
diff --git a/third_party/WebKit/Source/platform/wtf/text/WTFString.h b/third_party/WebKit/Source/platform/wtf/text/WTFString.h
index 2c3efa37..d1271e1 100644
--- a/third_party/WebKit/Source/platform/wtf/text/WTFString.h
+++ b/third_party/WebKit/Source/platform/wtf/text/WTFString.h
@@ -297,6 +297,9 @@
   String LowerUnicode(const AtomicString& locale_identifier) const;
   String UpperUnicode(const AtomicString& locale_identifier) const;
 
+  // Returns a lowercase version of the string.
+  // This function converts ASCII characters only.
+  String LowerASCII() const;
   // Returns a uppercase version of the string.
   // This function converts ASCII characters only.
   String UpperASCII() const;
@@ -472,10 +475,10 @@
   return !(a == b);
 }
 
-inline bool EqualPossiblyIgnoringCase(const String& a,
-                                      const String& b,
-                                      bool ignore_case) {
-  return ignore_case ? DeprecatedEqualIgnoringCase(a, b) : (a == b);
+inline bool EqualPossiblyIgnoringASCIICase(const String& a,
+                                           const String& b,
+                                           bool ignore_case) {
+  return ignore_case ? EqualIgnoringASCIICase(a, b) : (a == b);
 }
 
 inline bool EqualIgnoringNullity(const String& a, const String& b) {
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index a37fbc1..971087d 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
 Version: VER-2-7-1-updates
-Revision: 66725768cdf758cfb3f9abf03cbf5e5a77f42088
+Revision: 5a3490e054bda8a318ebde482c7fb30213cab3d9
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
 License File: src/docs/FTL.TXT
diff --git a/third_party/freetype/include/freetype-custom-config/ftoption.h b/third_party/freetype/include/freetype-custom-config/ftoption.h
index 9941f49..49e8cf5 100644
--- a/third_party/freetype/include/freetype-custom-config/ftoption.h
+++ b/third_party/freetype/include/freetype-custom-config/ftoption.h
@@ -936,6 +936,7 @@
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
 #define  TT_USE_BYTECODE_INTERPRETER
 
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
 #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1
 #define  TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 #endif
@@ -944,6 +945,7 @@
 #define  TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
 #endif
 #endif
+#endif
 
 
   /*
diff --git a/tools/perf/benchmarks/tab_switching.py b/tools/perf/benchmarks/tab_switching.py
index 89c6f986..ed75b50 100644
--- a/tools/perf/benchmarks/tab_switching.py
+++ b/tools/perf/benchmarks/tab_switching.py
@@ -9,8 +9,6 @@
 from telemetry import benchmark
 
 
-@benchmark.Owner(emails=['vovoy@chromium.org'],
-                 component='OS>Performance')
 @benchmark.Enabled('has tabs')
 @benchmark.Disabled('mac-reference')  # http://crbug.com/612774
 @benchmark.Disabled('android')  # http://crbug.com/460084
@@ -25,8 +23,7 @@
   test = tab_switching.TabSwitching
 
   def CreateStorySet(self, options):
-    return page_sets.SystemHealthStorySet(platform='desktop',
-                                          case='multitab:misc')
+    return page_sets.Typical25PageSet(run_no_page_interactions=True)
 
   @classmethod
   def Name(cls):
diff --git a/tools/perf/measurements/tab_switching.py b/tools/perf/measurements/tab_switching.py
index 5b8868e..dd64dfa 100644
--- a/tools/perf/measurements/tab_switching.py
+++ b/tools/perf/measurements/tab_switching.py
@@ -10,44 +10,114 @@
 Power usage is also measured.
 """
 
+import json
+import time
+
+from telemetry.core import util
 from telemetry.page import legacy_page_test
 from telemetry.value import histogram
 from telemetry.value import histogram_util
 
 from metrics import keychain_metric
+from metrics import power
+
+# TODO: Revisit this test once multitab support is finalized.
 
 
 class TabSwitching(legacy_page_test.LegacyPageTest):
+
+  # Amount of time to measure, in seconds.
+  SAMPLE_TIME = 30
+
   def __init__(self):
     super(TabSwitching, self).__init__()
-    self._first_histogram = None
+    self.first_page_in_storyset = True
+    self._power_metric = None
 
   def CustomizeBrowserOptions(self, options):
     keychain_metric.KeychainMetric.CustomizeBrowserOptions(options)
 
-    options.AppendExtraBrowserArgs(['--enable-stats-collection-bindings'])
+    options.AppendExtraBrowserArgs([
+        '--enable-stats-collection-bindings'
+    ])
+    # Enable background networking so we can test its impact on power usage.
+    options.disable_background_networking = False
+    power.PowerMetric.CustomizeBrowserOptions(options)
 
-  @classmethod
-  def _GetTabSwitchHistogram(cls, tab_to_switch):
-    histogram_name = 'MPArch.RWH_TabSwitchPaintDuration'
-    histogram_type = histogram_util.BROWSER_HISTOGRAM
-    return histogram_util.GetHistogram(
-        histogram_type, histogram_name, tab_to_switch)
+  def WillStartBrowser(self, platform):
+    self.first_page_in_storyset = True
+    self._power_metric = power.PowerMetric(platform, TabSwitching.SAMPLE_TIME)
 
-  def DidNavigateToPage(self, page, tab):
-    """record the starting histogram"""
-    self._first_histogram = self._GetTabSwitchHistogram(tab)
+  def TabForPage(self, page, browser):
+    del page  # unused
+    if self.first_page_in_storyset:
+      # The initial browser window contains a single tab, navigate that tab
+      # rather than creating a new one.
+      self.first_page_in_storyset = False
+      return browser.tabs[0]
+
+    return browser.tabs.New()
+
+  def StopBrowserAfterPage(self, browser, page):
+    # Restart the browser after the last page in the pageset.
+    return len(browser.tabs) >= len(page.story_set.stories)
 
   def ValidateAndMeasurePage(self, page, tab, results):
-    """record the ending histogram for the tab switching metric."""
-    last_histogram = self._GetTabSwitchHistogram(tab)
-    total_diff_histogram = histogram_util.SubtractHistogram(last_histogram,
-                            self._first_histogram)
+    """On the last tab, cycle through each tab that was opened and then record
+    a single histogram for the tab switching metric."""
+    browser = tab.browser
+    if len(browser.tabs) != len(page.story_set.stories):
+      return
 
+    if browser.tabs < 2:
+      raise Exception('Should have at least two tabs for tab switching')
+
+    # Measure power usage of tabs after quiescence.
+    util.WaitFor(tab.HasReachedQuiescence, 60)
+
+    if browser.platform.CanMonitorPower():
+      self._power_metric.Start(page, tab)
+      time.sleep(TabSwitching.SAMPLE_TIME)
+      self._power_metric.Stop(page, tab)
+      self._power_metric.AddResults(tab, results,)
+
+    histogram_name = 'MPArch.RWH_TabSwitchPaintDuration'
+    histogram_type = histogram_util.BROWSER_HISTOGRAM
     display_name = 'MPArch_RWH_TabSwitchPaintDuration'
+    first_histogram = histogram_util.GetHistogram(
+        histogram_type, histogram_name, tab)
+    prev_histogram = first_histogram
+
+    for tab_to_switch in browser.tabs:
+      tab_to_switch.Activate()
+      def _IsDone():
+        # pylint: disable=W0640
+        cur_histogram = histogram_util.GetHistogram(
+            histogram_type, histogram_name, tab_to_switch)
+        diff_histogram = histogram_util.SubtractHistogram(
+            cur_histogram, prev_histogram)
+        # TODO(deanliao): Add SubtractHistogramRawValue to process histogram
+        #     object instead of JSON string.
+        diff_histogram_count = json.loads(diff_histogram).get('count', 0)
+        return diff_histogram_count > 0
+      util.WaitFor(_IsDone, 30)
+
+      # We need to get histogram again instead of getting cur_histogram as
+      # variables modified inside inner function cannot be retrieved. However,
+      # inner function can see external scope's variables.
+      prev_histogram = histogram_util.GetHistogram(
+          histogram_type, histogram_name, tab_to_switch)
+
+    last_histogram = prev_histogram
+    total_diff_histogram = histogram_util.SubtractHistogram(last_histogram,
+                                                            first_histogram)
     results.AddSummaryValue(
         histogram.HistogramValue(None, display_name, 'ms',
-            raw_value_json=total_diff_histogram,
-            important=False))
+                                 raw_value_json=total_diff_histogram,
+                                 important=False))
 
     keychain_metric.KeychainMetric().AddResults(tab, results)
+
+  def DidRunPage(self, platform):
+    del platform  # unused
+    self._power_metric.Close()
diff --git a/tools/perf/measurements/tab_switching_unittest.py b/tools/perf/measurements/tab_switching_unittest.py
index d16fcc4..79efbb1 100644
--- a/tools/perf/measurements/tab_switching_unittest.py
+++ b/tools/perf/measurements/tab_switching_unittest.py
@@ -3,15 +3,12 @@
 # found in the LICENSE file.
 
 import contextlib
-from measurements import tab_switching
-import mock
-from page_sets.system_health import multi_tab_stories
-from telemetry import benchmark
-from telemetry import story as story_module
 from telemetry.internal.results import page_test_results
 from telemetry.testing import page_test_test_case
-from telemetry.testing import options_for_unittests
-from telemetry.value import histogram
+
+from measurements import tab_switching
+
+import mock
 
 
 class BrowserForTest(object):
@@ -33,12 +30,6 @@
     story.story_set = self
     self.stories.append(story)
 
-INTEGRATION_TEST_TAB_COUNT = 3
-
-class EmptyMultiTabStory(multi_tab_stories.MultiTabStory):
-  NAME = 'multitab:test:empty'
-  URL_LIST = ['about:blank'] * INTEGRATION_TEST_TAB_COUNT
-  URL = URL_LIST[0]
 
 class TabSwitchingUnittest(page_test_test_case.PageTestTestCase):
   @staticmethod
@@ -72,9 +63,22 @@
 
     # Mock histogram result to test _IsDone really works.
     expected_histogram = [
-        # DidNavigateToPage() calls GetHistogram() once
+        # To get first_histogram for last tab (tab_1).
         '{"count": 0, "buckets": []}',
-        # ValidateAndMeasurePage() calls GetHistogram() once
+        # First _IsDone check for tab_0. Retry.
+        '{"count": 0, "buckets": []}',
+        # Second _IsDone check for tab_0. Retry.
+        '{"count": 0, "buckets": []}',
+        # Third _IsDone check for tab_0. Pass.
+        '{"count": 1, "buckets": [{"low": 1, "high": 2, "count": 1}]}',
+        # To get prev_histogram. End of tab_0 loop.
+        '{"count": 1, "buckets": [{"low": 1, "high": 2, "count": 1}]}',
+        # First _IsDone check for tab_1. Retry.
+        '{"count": 1, "buckets": [{"low": 1, "high": 2, "count": 1}]}',
+        # Second _IsDone check for tab_1. Pass.
+        '{"count": 2, "buckets": [{"low": 1, "high": 2, "count": 1},'
+        '{"low": 2, "high": 3, "count": 1}]}',
+        # To get prev_histogram. End of tab_1 loop.
         '{"count": 2, "buckets": [{"low": 1, "high": 2, "count": 1},'
         '{"low": 2, "high": 3, "count": 1}]}',
         ]
@@ -84,34 +88,10 @@
         mock.patch('telemetry.value.histogram_util.GetHistogram',
                    mock_get_histogram),
         mock.patch('metrics.keychain_metric.KeychainMetric')):
-      measure.DidNavigateToPage(story_set.stories[0], browser.tabs[-1])
       measure.ValidateAndMeasurePage(story_set.stories[0], browser.tabs[-1],
                                      page_test_results.PageTestResults())
       self.assertEqual(len(expected_histogram),
                        len(mock_get_histogram.mock_calls))
-      # The last tab is passed to DidNavigateToPage() and
-      # ValidateAndMeasurePage()
       expected_calls = [mock.call(mock.ANY, mock.ANY, t) for t in
-                        [browser.tabs[-1]] * 2]
+                        [tab_1] + [tab_0] * 4 + [tab_1] * 3]
       self.assertEqual(expected_calls, mock_get_histogram.mock_calls)
-
-  @benchmark.Enabled('has tabs')
-  @benchmark.Disabled('mac-reference')
-  @benchmark.Disabled('android')
-  def testTabSwitching(self):
-    """IT of TabSwitching measurement and multi-tab story"""
-    ps = story_module.StorySet()
-    ps.AddStory(EmptyMultiTabStory(ps, False))
-    measurement = tab_switching.TabSwitching()
-    options = options_for_unittests.GetCopy()
-    results = self.RunMeasurement(measurement, ps, options=options)
-    self.assertEquals(len(results.failures), 0)
-
-    self.assertEquals(len(results.all_summary_values), 1)
-    summary = results.all_summary_values[0]
-    self.assertIsInstance(summary, histogram.HistogramValue)
-    self.assertEquals(summary.name, 'MPArch_RWH_TabSwitchPaintDuration')
-    histogram_count = sum([b.count for b in summary.buckets])
-    self.assertEquals(histogram_count, INTEGRATION_TEST_TAB_COUNT)
-    histogram_mean = summary.GetRepresentativeNumber()
-    self.assertGreater(histogram_mean, 0)
diff --git a/tools/perf/page_sets/system_health/multi_tab_stories.py b/tools/perf/page_sets/system_health/multi_tab_stories.py
index a9ab0c7..6841758 100644
--- a/tools/perf/page_sets/system_health/multi_tab_stories.py
+++ b/tools/perf/page_sets/system_health/multi_tab_stories.py
@@ -12,7 +12,7 @@
 from telemetry import benchmark
 
 
-class MultiTabStory(system_health_story.SystemHealthStory):
+class _MultiTabStory(system_health_story.SystemHealthStory):
   ABSTRACT_STORY = True
 
   def RunNavigateSteps(self, action_runner):
@@ -40,7 +40,7 @@
 
 
 @benchmark.Disabled('all')  # crbug.com/704197
-class MultiTabTypical24Story(MultiTabStory):
+class MultiTabTypical24Story(_MultiTabStory):
   NAME = 'multitab:misc:typical24'
   TAGS = [story_tags.TABS_SWITCHING]
   URL_LIST = [
diff --git a/tools/resource_prefetch_predictor/README.md b/tools/resource_prefetch_predictor/README.md
new file mode 100644
index 0000000..77ff51ff
--- /dev/null
+++ b/tools/resource_prefetch_predictor/README.md
@@ -0,0 +1,18 @@
+# Description
+This directory contains tools related to src/chrome/predictors, and especially
+`resource_prefetch_predictor`.
+
+# Prerequisites
+The following assumes a Chrome for Android setup, on Ubuntu 14.04LTS.
+
+To use these tools, you need:
+* Python protocol buffer library
+* Protocol buffer Python modules to read the database
+* SQLite >= 3.9
+
+# Installation
+* Install an updated protobuf library: `pip install --user protobuf`
+* Generated protocol buffers in the path: Assuming that the build directory is
+`out/Release` and chromium's `src/` is `$CHROMIUM_SRC`, `export
+PYTHONPATH=$PYTHONPATH:${CHROMIUM_SRC}/out/Release/pyproto/chrome/browser/predictors/`
+* SQLite from the Android SDK is recent enough, make sure that `${CHROMIUM_SRC}/third_party/android_tools/sdk/platform-tools` is in the path.