diff --git a/DEPS b/DEPS
index d031f80..4664246 100644
--- a/DEPS
+++ b/DEPS
@@ -79,7 +79,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'e201ebc995151adbe0e15cd88d7277d41c40ddbf',
+  'skia_revision': 'b1b80f7de4224c5083dfc1475e1988b2ce839a65',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -91,7 +91,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '2c9cc8b6e81017b4b6f1655645191bc6a4e5eaeb',
+  'angle_revision': '342b83d49c4d2d9ee5a51b89f8a60bf0cff1dfe9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -135,7 +135,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'b4706e73204bf551ca2f85fce8cbe23ef7d0df31',
+  'catapult_revision': '3318544c51d46d3165d7fb9929da58bb2049574b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/WATCHLISTS b/WATCHLISTS
index ea64d68..4d539d9 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1362,6 +1362,12 @@
       'filepath': 'content/browser/site_instance|'\
         'content/browser/browsing_instance',
     },
+    'smb': {
+      'filepath': 'chrome/browser/chromeos/file_system_provider'\
+                  '|chrome/browser/chromeos/smb_client'\
+                  '|chromeos/dbus/fake_smb_provider_client'\
+                  '|chromeos/dbus/smb_provider_client',
+    },
     'spellcheck': {
       'filepath': 'chrome/browser/spellchecker/'\
                   '|chrome/browser/renderer_context_menu/spelling_'\
@@ -2229,6 +2235,7 @@
     'site_instance': ['ajwong+watch@chromium.org',
                       'creis+watch@chromium.org',
                       'nasko+codewatch@chromium.org'],
+    'smb': ['cros-enterprise-lax+smbwatch@chromium.org'],
     'spellcheck': ['groby+spellwatch@chromium.org',
                    'rlp+watch@chromium.org',
                    'rouslan+spell@chromium.org',
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
index 879c282..47577948 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
@@ -129,12 +129,6 @@
       static_cast<int>(duration_ms)));
 }
 
-void AwRenderViewHostExt::RenderViewCreated(
-    content::RenderViewHost* render_view_host) {
-  web_contents()->GetMainFrame()->Send(new AwViewMsg_SetBackgroundColor(
-      web_contents()->GetMainFrame()->GetRoutingID(), background_color_));
-}
-
 void AwRenderViewHostExt::RenderViewHostChanged(
     content::RenderViewHost* old_host,
     content::RenderViewHost* new_host) {
@@ -154,6 +148,10 @@
   registry_.AddInterface(
       base::Bind(&web_restrictions::WebRestrictionsMojoImplementation::Create,
                  AwBrowserContext::GetDefault()->GetWebRestrictionProvider()));
+  if (!frame_host->GetParent()) {
+    frame_host->Send(new AwViewMsg_SetBackgroundColor(
+        frame_host->GetRoutingID(), background_color_));
+  }
 }
 
 void AwRenderViewHostExt::DidFinishNavigation(
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.h b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
index a6f9c3a..911cd66 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.h
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
@@ -81,7 +81,6 @@
 
  private:
   // content::WebContentsObserver implementation.
-  void RenderViewCreated(content::RenderViewHost* view_host) override;
   void RenderViewHostChanged(content::RenderViewHost* old_host,
                              content::RenderViewHost* new_host) override;
   void RenderFrameCreated(content::RenderFrameHost* frame_host) override;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 51afc04..e84daab 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -68,11 +68,12 @@
       # This is required solely for base/third_party/dmg_fp/dtoa_wrapper.cc.
       "-Wno-char-subscripts",
 
-      # Ideally all product code (but no test code) in chrome would have this
-      # flag. But this isn't trivial so start with //base as a minimum
+      # Ideally all product code (but no test code) in chrome would have these
+      # flags. But this isn't trivial so start with //base as a minimum
       # requirement.
       # https://groups.google.com/a/chromium.org/d/topic/chromium-dev/B9Q5KTD7iCo/discussion
       "-Wglobal-constructors",
+      "-Wexit-time-destructors",
     ]
   }
 }
diff --git a/base/android/linker/BUILD.gn b/base/android/linker/BUILD.gn
index f664045..7850f8a 100644
--- a/base/android/linker/BUILD.gn
+++ b/base/android/linker/BUILD.gn
@@ -6,6 +6,17 @@
 
 assert(is_android)
 
+declare_args() {
+  # Set this variable to true to enable GDB support in release builds.
+  #
+  # The default is to disable it to reduce the likelyhood of runtime crashes
+  # on devices that use machine translation (i.e. that run ARM binaries on
+  # x86 CPUs with a translation layer like Intel's Houdini). For full details
+  # see https://crbug.com/796938.
+  #
+  chromium_android_linker_enable_release_debugging = false
+}
+
 shared_library("chromium_android_linker") {
   sources = [
     "android_dlext.h",
@@ -15,6 +26,11 @@
     "linker_jni.h",
   ]
 
+  # Disable GDB support for release builds, unless explicitly wanted.
+  if (!is_debug && !chromium_android_linker_enable_release_debugging) {
+    defines = [ "LEGACY_LINKER_DISABLE_DEBUGGER_SUPPORT" ]
+  }
+
   # The NDK contains the crazy_linker here:
   #   '<(android_ndk_root)/crazy_linker.gyp:crazy_linker'
   # However, we use our own fork.  See bug 384700.
diff --git a/base/android/linker/legacy_linker_jni.cc b/base/android/linker/legacy_linker_jni.cc
index 5208deea..97308aa6 100644
--- a/base/android/linker/legacy_linker_jni.cc
+++ b/base/android/linker/legacy_linker_jni.cc
@@ -454,6 +454,11 @@
   if (!InitSDKVersionInfo(env))
     return false;
 
+// Disable debugger support when needed. See https://crbug.com/796938
+#if defined(LEGACY_LINKER_DISABLE_DEBUGGER_SUPPORT)
+  crazy_set_debugger_support(false);
+#endif
+
   // Register native methods.
   jclass linker_class;
   if (!InitClassReference(env,
diff --git a/base/memory/shared_memory.h b/base/memory/shared_memory.h
index 9a41598..2ab7870 100644
--- a/base/memory/shared_memory.h
+++ b/base/memory/shared_memory.h
@@ -226,7 +226,7 @@
   // before being mapped.
   bool external_section_ = false;
   string16 name_;
-#else
+#elif !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
   // If valid, points to the same memory region as shm_, but with readonly
   // permissions.
   SharedMemoryHandle readonly_shm_;
diff --git a/base/memory/shared_memory_android.cc b/base/memory/shared_memory_android.cc
index c426ac3b..c126767 100644
--- a/base/memory/shared_memory_android.cc
+++ b/base/memory/shared_memory_android.cc
@@ -33,21 +33,13 @@
     return false;
   }
 
-  int err = ashmem_set_prot_region(shm_.GetHandle(),
-                                   PROT_READ | PROT_WRITE | PROT_EXEC);
+  int flags = PROT_READ | PROT_WRITE | (options.executable ? PROT_EXEC : 0);
+  int err = ashmem_set_prot_region(shm_.GetHandle(), flags);
   if (err < 0) {
     DLOG(ERROR) << "Error " << err << " when setting protection of ashmem";
     return false;
   }
 
-  // Android doesn't appear to have a way to drop write access on an ashmem
-  // segment for a single descriptor.  http://crbug.com/320865
-  readonly_shm_ = shm_.Duplicate();
-  if (!readonly_shm_.IsValid()) {
-    DPLOG(ERROR) << "dup() failed";
-    return false;
-  }
-
   requested_size_ = options.size;
 
   return true;
@@ -65,4 +57,19 @@
   return false;
 }
 
+void SharedMemory::Close() {
+  if (shm_.IsValid()) {
+    shm_.Close();
+    shm_ = SharedMemoryHandle();
+  }
+}
+
+SharedMemoryHandle SharedMemory::GetReadOnlyHandle() const {
+  // There are no read-only Ashmem descriptors on Android.
+  // Instead, the protection mask is a property of the region itself.
+  SharedMemoryHandle handle = shm_.Duplicate();
+  handle.SetReadOnly();
+  return handle;
+}
+
 }  // namespace base
diff --git a/base/memory/shared_memory_handle.h b/base/memory/shared_memory_handle.h
index 22b9737..e8b1a797c 100644
--- a/base/memory/shared_memory_handle.h
+++ b/base/memory/shared_memory_handle.h
@@ -174,6 +174,21 @@
                      size_t size,
                      const base::UnguessableToken& guid);
   AHardwareBuffer* GetMemoryObject() const;
+
+  // Marks the current file descriptor as read-only, for the purpose of
+  // mapping. This is independent of the region's read-only status.
+  void SetReadOnly() { read_only_ = true; }
+
+  // Returns true iff the descriptor is to be used for read-only
+  // mappings.
+  bool IsReadOnly() const { return read_only_; }
+
+  // Returns true iff the corresponding region is read-only.
+  bool IsRegionReadOnly() const;
+
+  // Try to set the region read-only. This will fail any future attempt
+  // at read-write mapping.
+  bool SetRegionReadOnly() const;
 #endif
 
 #if defined(OS_POSIX) && !defined(OS_FUCHSIA)
@@ -199,6 +214,8 @@
  private:
 #if defined(OS_MACOSX) && !defined(OS_IOS)
   friend class SharedMemory;
+  friend bool CheckReadOnlySharedMemoryHandleForTesting(
+      SharedMemoryHandle handle);
 
   Type type_ = MACH;
 
@@ -218,6 +235,8 @@
     };
   };
 #elif defined(OS_ANDROID)
+  friend class SharedMemory;
+
   // Each instance of a SharedMemoryHandle is either INVALID, or backed by an
   // ashmem fd, or backed by an AHardwareBuffer. |type_| determines the backing
   // member.
@@ -225,6 +244,7 @@
   FileDescriptor file_descriptor_;
   AHardwareBuffer* memory_object_ = nullptr;
   bool ownership_passes_to_ipc_ = false;
+  bool read_only_ = false;
 #elif defined(OS_FUCHSIA)
   zx_handle_t handle_ = ZX_HANDLE_INVALID;
   bool ownership_passes_to_ipc_ = false;
diff --git a/base/memory/shared_memory_handle_android.cc b/base/memory/shared_memory_handle_android.cc
index 69d3203..2704213 100644
--- a/base/memory/shared_memory_handle_android.cc
+++ b/base/memory/shared_memory_handle_android.cc
@@ -4,6 +4,7 @@
 
 #include "base/memory/shared_memory_handle.h"
 
+#include <sys/mman.h>
 #include <unistd.h>
 
 #include "base/android/android_hardware_buffer_compat.h"
@@ -11,9 +12,19 @@
 #include "base/posix/eintr_wrapper.h"
 #include "base/posix/unix_domain_socket.h"
 #include "base/unguessable_token.h"
+#include "third_party/ashmem/ashmem.h"
 
 namespace base {
 
+static int GetAshmemRegionProtectionMask(int fd) {
+  int prot = ashmem_get_prot_region(fd);
+  if (prot < 0) {
+    DPLOG(ERROR) << "ashmem_get_prot_region";
+    return -1;
+  }
+  return prot;
+}
+
 SharedMemoryHandle::SharedMemoryHandle() {}
 
 SharedMemoryHandle::SharedMemoryHandle(
@@ -154,11 +165,15 @@
       return SharedMemoryHandle();
     case Type::ASHMEM: {
       DCHECK(IsValid());
+      SharedMemoryHandle result;
       int duped_handle = HANDLE_EINTR(dup(file_descriptor_.fd));
-      if (duped_handle < 0)
-        return SharedMemoryHandle();
-      return SharedMemoryHandle(FileDescriptor(duped_handle, true), GetSize(),
-                                GetGUID());
+      if (duped_handle >= 0) {
+        result = SharedMemoryHandle(FileDescriptor(duped_handle, true),
+                                    GetSize(), GetGUID());
+        if (IsReadOnly())
+          result.SetReadOnly();
+      }
+      return result;
     }
     case Type::ANDROID_HARDWARE_BUFFER:
       DCHECK(IsValid());
@@ -195,4 +210,33 @@
   }
 }
 
+bool SharedMemoryHandle::IsRegionReadOnly() const {
+  if (type_ != Type::ASHMEM)
+    return false;
+
+  int prot = GetAshmemRegionProtectionMask(file_descriptor_.fd);
+  return (prot >= 0 && (prot & PROT_WRITE) == 0);
+}
+
+bool SharedMemoryHandle::SetRegionReadOnly() const {
+  DCHECK_EQ(type_, Type::ASHMEM);
+  int fd = file_descriptor_.fd;
+  int prot = GetAshmemRegionProtectionMask(fd);
+  if (prot < 0)
+    return false;
+
+  if ((prot & PROT_WRITE) == 0) {
+    // Region is already read-only.
+    return true;
+  }
+
+  prot &= ~PROT_WRITE;
+  int ret = ashmem_set_prot_region(fd, prot);
+  if (ret != 0) {
+    DPLOG(ERROR) << "ashmem_set_prot_region";
+    return false;
+  }
+  return true;
+}
+
 }  // namespace base
diff --git a/base/memory/shared_memory_posix.cc b/base/memory/shared_memory_posix.cc
index f0e4f95..f9d71f4 100644
--- a/base/memory/shared_memory_posix.cc
+++ b/base/memory/shared_memory_posix.cc
@@ -281,6 +281,22 @@
       return false;
     bytes = ashmem_bytes;
   }
+
+  // Sanity check. This shall catch invalid uses of the SharedMemory APIs
+  // but will not protect against direct mmap() attempts.
+  if (shm_.IsReadOnly()) {
+    // Use a DCHECK() to call writable mappings with read-only descriptors
+    // in debug builds immediately. Return an error for release builds
+    // or during unit-testing (assuming a ScopedLogAssertHandler was installed).
+    DCHECK(read_only_)
+        << "Trying to map a region writable with a read-only descriptor.";
+    if (!read_only_) {
+      return false;
+    }
+    if (!shm_.SetRegionReadOnly()) {  // Ensure the region is read-only.
+      return false;
+    }
+  }
 #endif
 
   memory_ = mmap(nullptr, bytes, PROT_READ | (read_only_ ? 0 : PROT_WRITE),
@@ -326,6 +342,7 @@
   return handle_copy;
 }
 
+#if !defined(OS_ANDROID)
 void SharedMemory::Close() {
   if (shm_.IsValid()) {
     shm_.Close();
@@ -337,7 +354,6 @@
   }
 }
 
-#if !defined(OS_ANDROID)
 // For the given shmem named |mem_name|, return a filename to mmap()
 // (and possibly create).  Modifies |filename|.  Return false on
 // error, or true of we are happy.
@@ -361,11 +377,11 @@
   *path = temp_dir.AppendASCII(name_base + mem_name);
   return true;
 }
-#endif  // !defined(OS_ANDROID)
 
 SharedMemoryHandle SharedMemory::GetReadOnlyHandle() const {
   CHECK(readonly_shm_.IsValid());
   return readonly_shm_.Duplicate();
 }
+#endif  // !defined(OS_ANDROID)
 
 }  // namespace base
diff --git a/base/memory/shared_memory_unittest.cc b/base/memory/shared_memory_unittest.cc
index d3c31dbd..b8f1978 100644
--- a/base/memory/shared_memory_unittest.cc
+++ b/base/memory/shared_memory_unittest.cc
@@ -11,12 +11,15 @@
 
 #include "base/atomicops.h"
 #include "base/base_switches.h"
+#include "base/bind.h"
 #include "base/command_line.h"
+#include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/shared_memory_handle.h"
 #include "base/process/kill.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
 #include "base/test/multiprocess_test.h"
@@ -382,6 +385,11 @@
                         contents.size()));
   EXPECT_TRUE(readonly_shmem.Unmap());
 
+#if defined(OS_ANDROID)
+  // On Android, mapping a region through a read-only descriptor makes the
+  // region read-only. Any writable mapping attempt should fail.
+  ASSERT_FALSE(writable_shmem.Map(contents.size()));
+#else
   // Make sure the writable instance is still writable.
   ASSERT_TRUE(writable_shmem.Map(contents.size()));
   StringPiece new_contents = "Goodbye";
@@ -389,6 +397,7 @@
   EXPECT_EQ(new_contents,
             StringPiece(static_cast<const char*>(writable_shmem.memory()),
                         new_contents.size()));
+#endif
 
   // We'd like to check that if we send the read-only segment to another
   // process, then that other process can't reopen it read/write.  (Since that
@@ -594,6 +603,29 @@
 }
 #endif  // !defined(OS_IOS)
 
+#if defined(OS_ANDROID)
+// This test is restricted to Android since there is no way on other platforms
+// to guarantee that a region can never be mapped with PROT_EXEC. E.g. on
+// Linux, anonymous shared regions come from /dev/shm which can be mounted
+// without 'noexec'. In this case, anything can perform an mprotect() to
+// change the protection mask of a given page.
+TEST(SharedMemoryTest, AnonymousIsNotExecutableByDefault) {
+  const uint32_t kTestSize = 1 << 16;
+
+  SharedMemory shared_memory;
+  SharedMemoryCreateOptions options;
+  options.size = kTestSize;
+
+  EXPECT_TRUE(shared_memory.Create(options));
+  EXPECT_TRUE(shared_memory.Map(shared_memory.requested_size()));
+
+  errno = 0;
+  EXPECT_EQ(-1, mprotect(shared_memory.memory(), shared_memory.requested_size(),
+                         PROT_READ | PROT_EXEC));
+  EXPECT_EQ(EACCES, errno);
+}
+#endif  // OS_ANDROID
+
 // Android supports a different permission model than POSIX for its "ashmem"
 // shared memory implementation. So the tests about file permissions are not
 // included on Android. Fuchsia does not use a file-backed shared memory
@@ -844,4 +876,86 @@
                         ::testing::Values(Mode::DisableDevShm));
 #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
 
+#if defined(OS_ANDROID)
+TEST(SharedMemoryTest, ReadOnlyRegions) {
+  const uint32_t kDataSize = 1024;
+  SharedMemory memory;
+  SharedMemoryCreateOptions options;
+  options.size = kDataSize;
+  EXPECT_TRUE(memory.Create(options));
+
+  EXPECT_FALSE(memory.handle().IsRegionReadOnly());
+
+  // Check that it is possible to map the region directly from the fd.
+  int region_fd = memory.handle().GetHandle();
+  EXPECT_GE(region_fd, 0);
+  void* address = mmap(nullptr, kDataSize, PROT_READ | PROT_WRITE, MAP_SHARED,
+                       region_fd, 0);
+  bool success = address && address != MAP_FAILED;
+  ASSERT_TRUE(address);
+  ASSERT_NE(address, MAP_FAILED);
+  if (success) {
+    EXPECT_EQ(0, munmap(address, kDataSize));
+  }
+
+  ASSERT_TRUE(memory.handle().SetRegionReadOnly());
+  EXPECT_TRUE(memory.handle().IsRegionReadOnly());
+
+  // Check that it is no longer possible to map the region read/write.
+  errno = 0;
+  address = mmap(nullptr, kDataSize, PROT_READ | PROT_WRITE, MAP_SHARED,
+                 region_fd, 0);
+  success = address && address != MAP_FAILED;
+  ASSERT_FALSE(success);
+  ASSERT_EQ(EPERM, errno);
+  if (success) {
+    EXPECT_EQ(0, munmap(address, kDataSize));
+  }
+}
+
+TEST(SharedMemoryTest, ReadOnlyDescriptors) {
+  const uint32_t kDataSize = 1024;
+  SharedMemory memory;
+  SharedMemoryCreateOptions options;
+  options.size = kDataSize;
+  EXPECT_TRUE(memory.Create(options));
+
+  EXPECT_FALSE(memory.handle().IsRegionReadOnly());
+
+  // Getting a read-only descriptor should not make the region read-only itself.
+  SharedMemoryHandle ro_handle = memory.GetReadOnlyHandle();
+  EXPECT_FALSE(memory.handle().IsRegionReadOnly());
+
+  // Mapping a writable region from a read-only descriptor should not
+  // be possible, it will DCHECK() in debug builds (see test below),
+  // while returning false on release ones.
+  {
+    bool dcheck_fired = false;
+    logging::ScopedLogAssertHandler log_assert(
+        base::BindRepeating([](bool* flag, const char*, int, base::StringPiece,
+                               base::StringPiece) { *flag = true; },
+                            base::Unretained(&dcheck_fired)));
+
+    SharedMemory rw_region(ro_handle.Duplicate(), /* read_only */ false);
+    EXPECT_FALSE(rw_region.Map(kDataSize));
+    EXPECT_EQ(DCHECK_IS_ON() ? true : false, dcheck_fired);
+  }
+
+  // Nor shall it turn the region read-only itself.
+  EXPECT_FALSE(ro_handle.IsRegionReadOnly());
+
+  // Mapping a read-only region from a read-only descriptor should work.
+  SharedMemory ro_region(ro_handle.Duplicate(), /* read_only */ true);
+  EXPECT_TRUE(ro_region.Map(kDataSize));
+
+  // And it should turn the region read-only too.
+  EXPECT_TRUE(ro_handle.IsRegionReadOnly());
+  EXPECT_TRUE(memory.handle().IsRegionReadOnly());
+  EXPECT_FALSE(memory.Map(kDataSize));
+
+  ro_handle.Close();
+}
+
+#endif  // OS_ANDROID
+
 }  // namespace base
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
index 7f7b372..0214f5a8 100644
--- a/base/metrics/field_trial.cc
+++ b/base/metrics/field_trial.cc
@@ -229,7 +229,20 @@
   *guid = base::UnguessableToken::Deserialize(high, low);
   return true;
 }
-#endif
+
+// Extract a read-only SharedMemoryHandle from an existing |shared_memory|
+// handle. Note that on Android, this also makes the whole region read-only.
+SharedMemoryHandle GetSharedMemoryReadOnlyHandle(SharedMemory* shared_memory) {
+  SharedMemoryHandle result = shared_memory->GetReadOnlyHandle();
+#if defined(OS_ANDROID)
+  // On Android, turn the region read-only. This prevents any future
+  // writable mapping attempts, but the original one in |shm| survives
+  // and is still usable in the current process.
+  result.SetRegionReadOnly();
+#endif  // OS_ANDROID
+  return result;
+}
+#endif  // !OS_NACL
 
 }  // namespace
 
@@ -1306,10 +1319,8 @@
       global_->field_trial_allocator_.get());
 
 #if !defined(OS_NACL)
-  // Set |readonly_allocator_handle_| so we can pass it to be inherited and
-  // via the command line.
-  global_->readonly_allocator_handle_ =
-      global_->field_trial_allocator_->shared_memory()->GetReadOnlyHandle();
+  global_->readonly_allocator_handle_ = GetSharedMemoryReadOnlyHandle(
+      global_->field_trial_allocator_->shared_memory());
 #endif
 }
 
diff --git a/base/metrics/field_trial.h b/base/metrics/field_trial.h
index f794803f..c58666c 100644
--- a/base/metrics/field_trial.h
+++ b/base/metrics/field_trial.h
@@ -650,6 +650,7 @@
   FRIEND_TEST_ALL_PREFIXES(FieldTrialListTest, ClearParamsFromSharedMemory);
   FRIEND_TEST_ALL_PREFIXES(FieldTrialListTest,
                            SerializeSharedMemoryHandleMetadata);
+  FRIEND_TEST_ALL_PREFIXES(FieldTrialListTest, CheckReadOnlySharedMemoryHandle);
 
   // Serialization is used to pass information about the handle to child
   // processes. It passes a reference to the relevant OS resource, and it passes
diff --git a/base/metrics/field_trial_unittest.cc b/base/metrics/field_trial_unittest.cc
index 56f7278..406f561 100644
--- a/base/metrics/field_trial_unittest.cc
+++ b/base/metrics/field_trial_unittest.cc
@@ -20,6 +20,8 @@
 #include "base/test/gtest_util.h"
 #include "base/test/mock_entropy_provider.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/test_shared_memory_util.h"
+#include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -75,7 +77,7 @@
 
 }  // namespace
 
-class FieldTrialTest : public testing::Test {
+class FieldTrialTest : public ::testing::Test {
  public:
   FieldTrialTest() : trial_list_(nullptr) {}
 
@@ -1383,4 +1385,25 @@
 }
 #endif  // !defined(OS_NACL)
 
+// Verify that the field trial shared memory handle is really read-only, and
+// does not allow writable mappings. Test disabled on NaCl, Windows and Fuchsia
+// which don't support/implement GetFieldTrialHandle(). For Fuchsia, see
+// crbug.com/752368
+#if !defined(OS_NACL) && !defined(OS_WIN) && !defined(OS_FUCHSIA)
+TEST(FieldTrialListTest, CheckReadOnlySharedMemoryHandle) {
+  FieldTrialList field_trial_list(nullptr);
+  FieldTrialList::CreateFieldTrial("Trial1", "Group1");
+
+  test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.Init();
+
+  FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
+
+  SharedMemoryHandle handle = FieldTrialList::GetFieldTrialHandle();
+  ASSERT_TRUE(handle.IsValid());
+
+  ASSERT_TRUE(CheckReadOnlySharedMemoryHandleForTesting(handle));
+}
+#endif  // !OS_NACL && !OS_WIN && !OS_FUCHSIA
+
 }  // namespace base
diff --git a/base/metrics/user_metrics_action.h b/base/metrics/user_metrics_action.h
index 3eca3ddb..454ed83 100644
--- a/base/metrics/user_metrics_action.h
+++ b/base/metrics/user_metrics_action.h
@@ -19,7 +19,7 @@
 // Please see tools/metrics/actions/extract_actions.py for details.
 struct UserMetricsAction {
   const char* str_;
-  explicit UserMetricsAction(const char* str) : str_(str) {}
+  explicit constexpr UserMetricsAction(const char* str) noexcept : str_(str) {}
 };
 
 }  // namespace base
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
index f9365f6b..a47173ce 100644
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
+++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
@@ -65,7 +65,7 @@
 
   std::unique_ptr<SchedulerSingleThreadTaskRunnerManager>
       single_thread_task_runner_manager_;
-  TaskTracker task_tracker_;
+  TaskTracker task_tracker_ = {"Test"};
 
  private:
   Thread service_thread_;
diff --git a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
index 11ad614..43624a4 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
+++ b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
@@ -107,7 +107,7 @@
 
   std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool_;
 
-  TaskTracker task_tracker_;
+  TaskTracker task_tracker_ = {"Test"};
   Thread service_thread_;
 
  private:
@@ -779,7 +779,7 @@
 }
 
 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitOne) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   DelayedTaskManager delayed_task_manager;
   scoped_refptr<TaskRunner> service_thread_task_runner =
       MakeRefCounted<TestSimpleTaskRunner>();
@@ -800,7 +800,7 @@
 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, VerifyStandbyThread) {
   constexpr size_t worker_capacity = 3;
 
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   DelayedTaskManager delayed_task_manager;
   scoped_refptr<TaskRunner> service_thread_task_runner =
       MakeRefCounted<TestSimpleTaskRunner>();
@@ -1322,7 +1322,7 @@
 TEST(TaskSchedulerWorkerPoolOverWorkerCapacityTest, VerifyCleanup) {
   constexpr size_t kWorkerCapacity = 3;
 
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   DelayedTaskManager delayed_task_manager;
   scoped_refptr<TaskRunner> service_thread_task_runner =
       MakeRefCounted<TestSimpleTaskRunner>();
diff --git a/base/task_scheduler/scheduler_worker_pool_unittest.cc b/base/task_scheduler/scheduler_worker_pool_unittest.cc
index 1bade00..053abf7 100644
--- a/base/task_scheduler/scheduler_worker_pool_unittest.cc
+++ b/base/task_scheduler/scheduler_worker_pool_unittest.cc
@@ -150,7 +150,7 @@
 
   std::unique_ptr<SchedulerWorkerPool> worker_pool_;
 
-  TaskTracker task_tracker_;
+  TaskTracker task_tracker_ = {"Test"};
   Thread service_thread_;
   DelayedTaskManager delayed_task_manager_;
 
diff --git a/base/task_scheduler/scheduler_worker_stack_unittest.cc b/base/task_scheduler/scheduler_worker_stack_unittest.cc
index ededad0f..20432029 100644
--- a/base/task_scheduler/scheduler_worker_stack_unittest.cc
+++ b/base/task_scheduler/scheduler_worker_stack_unittest.cc
@@ -62,7 +62,7 @@
   scoped_refptr<SchedulerWorker> worker_c_;
 
  private:
-  TaskTracker task_tracker_;
+  TaskTracker task_tracker_ = {"Test"};
 };
 
 }  // namespace
diff --git a/base/task_scheduler/scheduler_worker_unittest.cc b/base/task_scheduler/scheduler_worker_unittest.cc
index 5400cbb..a890621 100644
--- a/base/task_scheduler/scheduler_worker_unittest.cc
+++ b/base/task_scheduler/scheduler_worker_unittest.cc
@@ -255,7 +255,7 @@
     EXPECT_LE(num_run_tasks_, created_sequences_.size());
   }
 
-  TaskTracker task_tracker_;
+  TaskTracker task_tracker_ = {"Test"};
 
   // Synchronizes access to all members below.
   mutable SchedulerLock lock_;
@@ -512,7 +512,7 @@
 // Verify that calling SchedulerWorker::Cleanup() from GetWork() causes
 // the SchedulerWorker's thread to exit.
 TEST(TaskSchedulerWorkerTest, WorkerCleanupFromGetWork) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   // Will be owned by SchedulerWorker.
   MockedControllableCleanupDelegate* delegate =
       new StrictMock<MockedControllableCleanupDelegate>(&task_tracker);
@@ -530,7 +530,7 @@
 }
 
 TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringWork) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   // Will be owned by SchedulerWorker.
   // No mock here as that's reasonably covered by other tests and the delegate
   // may destroy on a different thread. Mocks aren't designed with that in mind.
@@ -554,7 +554,7 @@
 }
 
 TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringWait) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   // Will be owned by SchedulerWorker.
   // No mock here as that's reasonably covered by other tests and the delegate
   // may destroy on a different thread. Mocks aren't designed with that in mind.
@@ -575,7 +575,7 @@
 }
 
 TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringShutdown) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   // Will be owned by SchedulerWorker.
   // No mock here as that's reasonably covered by other tests and the delegate
   // may destroy on a different thread. Mocks aren't designed with that in mind.
@@ -601,7 +601,7 @@
 
 // Verify that Start() is a no-op after Cleanup().
 TEST(TaskSchedulerWorkerTest, CleanupBeforeStart) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   // Will be owned by SchedulerWorker.
   // No mock here as that's reasonably covered by other tests and the delegate
   // may destroy on a different thread. Mocks aren't designed with that in mind.
@@ -648,7 +648,7 @@
 }  // namespace
 
 TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringJoin) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   // Will be owned by SchedulerWorker.
   // No mock here as that's reasonably covered by other tests and the
   // delegate may destroy on a different thread. Mocks aren't designed with that
@@ -729,7 +729,7 @@
 }  // namespace
 
 TEST(TaskSchedulerWorkerTest, BumpPriorityOfAliveThreadDuringShutdown) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
 
   std::unique_ptr<ExpectThreadPriorityDelegate> delegate(
       new ExpectThreadPriorityDelegate);
@@ -793,7 +793,7 @@
 }  // namespace
 
 TEST(TaskSchedulerWorkerTest, BackwardCompatibilityEnabled) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   auto delegate = std::make_unique<CoInitializeDelegate>();
   CoInitializeDelegate* const delegate_raw = delegate.get();
 
@@ -820,7 +820,7 @@
 }
 
 TEST(TaskSchedulerWorkerTest, BackwardCompatibilityDisabled) {
-  TaskTracker task_tracker;
+  TaskTracker task_tracker("Test");
   auto delegate = std::make_unique<CoInitializeDelegate>();
   CoInitializeDelegate* const delegate_raw = delegate.get();
 
diff --git a/base/task_scheduler/task_scheduler_impl.cc b/base/task_scheduler/task_scheduler_impl.cc
index 624865c..cf514bc 100644
--- a/base/task_scheduler/task_scheduler_impl.cc
+++ b/base/task_scheduler/task_scheduler_impl.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/metrics/field_trial_params.h"
+#include "base/strings/string_util.h"
 #include "base/task_scheduler/delayed_task_manager.h"
 #include "base/task_scheduler/environment_config.h"
 #include "base/task_scheduler/scheduler_worker_pool_params.h"
@@ -30,6 +31,8 @@
       task_tracker_(std::move(task_tracker)),
       single_thread_task_runner_manager_(task_tracker_.get(),
                                          &delayed_task_manager_) {
+  DCHECK(!histogram_label.empty());
+
   static_assert(arraysize(worker_pools_) == ENVIRONMENT_COUNT,
                 "The size of |worker_pools_| must match ENVIRONMENT_COUNT.");
   static_assert(
@@ -38,13 +41,10 @@
 
   for (int environment_type = 0; environment_type < ENVIRONMENT_COUNT;
        ++environment_type) {
-    std::string worker_pool_histogram_label(histogram_label);
-    if (!worker_pool_histogram_label.empty())
-      worker_pool_histogram_label += ".";
-    worker_pool_histogram_label +=
-        kEnvironmentParams[environment_type].name_suffix;
     worker_pools_[environment_type] = std::make_unique<SchedulerWorkerPoolImpl>(
-        std::move(worker_pool_histogram_label),
+        JoinString(
+            {histogram_label, kEnvironmentParams[environment_type].name_suffix},
+            "."),
         kEnvironmentParams[environment_type].name_suffix,
         kEnvironmentParams[environment_type].priority_hint, task_tracker_.get(),
         &delayed_task_manager_);
diff --git a/base/task_scheduler/task_scheduler_impl.h b/base/task_scheduler/task_scheduler_impl.h
index d7c3493..7f99f5ae 100644
--- a/base/task_scheduler/task_scheduler_impl.h
+++ b/base/task_scheduler/task_scheduler_impl.h
@@ -51,7 +51,7 @@
 #endif
 
   // Creates a TaskSchedulerImpl with a production TaskTracker.
-  //|histogram_label| is used to label histograms.
+  //|histogram_label| is used to label histograms, it must not be empty.
   explicit TaskSchedulerImpl(StringPiece histogram_label);
 
   // For testing only. Creates a TaskSchedulerImpl with a custom TaskTracker.
diff --git a/base/task_scheduler/task_tracker.cc b/base/task_scheduler/task_tracker.cc
index 7ba855ea..12e3ec1 100644
--- a/base/task_scheduler/task_tracker.cc
+++ b/base/task_scheduler/task_tracker.cc
@@ -75,18 +75,18 @@
 
 HistogramBase* GetTaskLatencyHistogram(StringPiece histogram_label,
                                        StringPiece task_type_suffix) {
+  DCHECK(!histogram_label.empty());
+  DCHECK(!task_type_suffix.empty());
   // Mimics the UMA_HISTOGRAM_TIMES macro except we don't specify bounds with
   // TimeDeltas as FactoryTimeGet assumes millisecond granularity. The minimums
   // and maximums were chosen to place the 1ms mark at around the 70% range
   // coverage for buckets giving us good info for tasks that have a latency
   // below 1ms (most of them) and enough info to assess how bad the latency is
   // for tasks that exceed this threshold.
-  std::string histogram_name = "TaskScheduler.TaskLatencyMicroseconds.";
-  if (!histogram_label.empty()) {
-    histogram_label.AppendToString(&histogram_name);
-    histogram_name.push_back('.');
-  }
-  task_type_suffix.AppendToString(&histogram_name);
+  std::string histogram_name =
+      JoinString({"TaskScheduler.TaskLatencyMicroseconds", histogram_label,
+                  task_type_suffix},
+                 ".");
   return Histogram::FactoryGet(histogram_name, 1, 20000, 50,
                                HistogramBase::kUmaTargetedHistogramFlag);
 }
diff --git a/base/task_scheduler/task_tracker.h b/base/task_scheduler/task_tracker.h
index fc856b47..df6157cf 100644
--- a/base/task_scheduler/task_tracker.h
+++ b/base/task_scheduler/task_tracker.h
@@ -85,10 +85,10 @@
 // TaskPriority::USER_BLOCKING.
 class BASE_EXPORT TaskTracker {
  public:
-  // |histogram_label| is used as a suffix for histograms (optional)
+  // |histogram_label| is used as a suffix for histograms, it must not be empty.
   // |max_num_scheduled_background_sequences| is the maximum number of
   // background sequences that can be scheduled concurrently (default to max())
-  TaskTracker(StringPiece histogram_label = StringPiece(),
+  TaskTracker(StringPiece histogram_label,
               int max_num_scheduled_background_sequences =
                   std::numeric_limits<int>::max());
   virtual ~TaskTracker();
diff --git a/base/task_scheduler/task_tracker_posix.h b/base/task_scheduler/task_tracker_posix.h
index a8a0d33c..4689f7a1 100644
--- a/base/task_scheduler/task_tracker_posix.h
+++ b/base/task_scheduler/task_tracker_posix.h
@@ -27,7 +27,7 @@
 // TaskTracker can run tasks.
 class BASE_EXPORT TaskTrackerPosix : public TaskTracker {
  public:
-  TaskTrackerPosix(StringPiece name = StringPiece());
+  TaskTrackerPosix(StringPiece name);
   ~TaskTrackerPosix() override;
 
   // Sets the MessageLoopForIO with which to setup FileDescriptorWatcher in the
diff --git a/base/task_scheduler/task_tracker_posix_unittest.cc b/base/task_scheduler/task_tracker_posix_unittest.cc
index 7ee5c809..6eb16425 100644
--- a/base/task_scheduler/task_tracker_posix_unittest.cc
+++ b/base/task_scheduler/task_tracker_posix_unittest.cc
@@ -42,7 +42,7 @@
 
  protected:
   Thread service_thread_;
-  TaskTrackerPosix tracker_;
+  TaskTrackerPosix tracker_ = {"Test"};
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TaskSchedulerTaskTrackerPosixTest);
diff --git a/base/task_scheduler/task_tracker_unittest.cc b/base/task_scheduler/task_tracker_unittest.cc
index f00f221..df78b74 100644
--- a/base/task_scheduler/task_tracker_unittest.cc
+++ b/base/task_scheduler/task_tracker_unittest.cc
@@ -232,7 +232,7 @@
     return num_tasks_executed_;
   }
 
-  TaskTracker tracker_;
+  TaskTracker tracker_ = {"Test"};
   testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer_;
 
  private:
@@ -901,7 +901,7 @@
 TEST_F(TaskSchedulerTaskTrackerTest,
        WillScheduleBackgroundSequenceWithMaxBackgroundSequences) {
   constexpr int kMaxNumDispatchedBackgroundSequences = 2;
-  TaskTracker tracker(StringPiece(), kMaxNumDispatchedBackgroundSequences);
+  TaskTracker tracker("Test", kMaxNumDispatchedBackgroundSequences);
 
   // Simulate posting |kMaxNumDispatchedBackgroundSequences| background tasks
   // and scheduling the associated sequences. This should succeed.
@@ -980,7 +980,7 @@
 TEST_F(TaskSchedulerTaskTrackerTest,
        RunNextBackgroundTaskWithEarlierPendingBackgroundTask) {
   constexpr int kMaxNumDispatchedBackgroundSequences = 1;
-  TaskTracker tracker(StringPiece(), kMaxNumDispatchedBackgroundSequences);
+  TaskTracker tracker("Test", kMaxNumDispatchedBackgroundSequences);
   testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
 
   // Simulate posting a background task and scheduling the associated sequence.
@@ -1050,7 +1050,7 @@
 
  private:
   void Run() override {
-    TaskTracker tracker;
+    TaskTracker tracker("Test");
 
     // Waiting is allowed by default. Expect TaskTracker to disallow it before
     // running a task without the WithBaseSyncPrimitives() trait.
@@ -1109,38 +1109,38 @@
 TEST(TaskSchedulerTaskTrackerHistogramTest, TaskLatency) {
   auto statistics_recorder = StatisticsRecorder::CreateTemporaryForTesting();
 
-  TaskTracker tracker;
+  TaskTracker tracker("Test");
   testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
 
   struct {
     const TaskTraits traits;
     const char* const expected_histogram;
   } tests[] = {{{TaskPriority::BACKGROUND},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "BackgroundTaskPriority"},
                {{MayBlock(), TaskPriority::BACKGROUND},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "BackgroundTaskPriority_MayBlock"},
                {{WithBaseSyncPrimitives(), TaskPriority::BACKGROUND},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "BackgroundTaskPriority_MayBlock"},
                {{TaskPriority::USER_VISIBLE},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "UserVisibleTaskPriority"},
                {{MayBlock(), TaskPriority::USER_VISIBLE},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "UserVisibleTaskPriority_MayBlock"},
                {{WithBaseSyncPrimitives(), TaskPriority::USER_VISIBLE},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "UserVisibleTaskPriority_MayBlock"},
                {{TaskPriority::USER_BLOCKING},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "UserBlockingTaskPriority"},
                {{MayBlock(), TaskPriority::USER_BLOCKING},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "UserBlockingTaskPriority_MayBlock"},
                {{WithBaseSyncPrimitives(), TaskPriority::USER_BLOCKING},
-                "TaskScheduler.TaskLatencyMicroseconds."
+                "TaskScheduler.TaskLatencyMicroseconds.Test."
                 "UserBlockingTaskPriority_MayBlock"}};
 
   for (const auto& test : tests) {
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index e260022..e6e7752aa 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -117,6 +117,8 @@
     "test_pending_task.h",
     "test_reg_util_win.cc",
     "test_reg_util_win.h",
+    "test_shared_memory_util.cc",
+    "test_shared_memory_util.h",
     "test_shortcut_win.cc",
     "test_shortcut_win.h",
     "test_simple_task_runner.cc",
diff --git a/base/test/scoped_task_environment.cc b/base/test/scoped_task_environment.cc
index e93ad5b..fb6236b 100644
--- a/base/test/scoped_task_environment.cc
+++ b/base/test/scoped_task_environment.cc
@@ -233,7 +233,9 @@
 }
 
 ScopedTaskEnvironment::TestTaskTracker::TestTaskTracker()
-    : can_run_tasks_cv_(&lock_), task_completed_(&lock_) {}
+    : internal::TaskSchedulerImpl::TaskTrackerImpl("ScopedTaskEnvironment"),
+      can_run_tasks_cv_(&lock_),
+      task_completed_(&lock_) {}
 
 void ScopedTaskEnvironment::TestTaskTracker::AllowRunTasks() {
   AutoLock auto_lock(lock_);
diff --git a/base/test/test_shared_memory_util.cc b/base/test/test_shared_memory_util.cc
new file mode 100644
index 0000000..35d2aeeb
--- /dev/null
+++ b/base/test/test_shared_memory_util.cc
@@ -0,0 +1,129 @@
+// 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 "base/test/test_shared_memory_util.h"
+
+#include <gtest/gtest.h>
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "base/logging.h"
+#include "build/build_config.h"
+
+#if defined(OS_POSIX) && !defined(OS_NACL)
+#include <errno.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#endif
+
+#if defined(OS_FUCHSIA)
+#include <zircon/process.h>
+#include <zircon/rights.h>
+#include <zircon/syscalls.h>
+#endif
+
+#if defined(OS_MACOSX) && !defined(OS_IOS)
+#include <mach/mach_vm.h>
+#endif
+
+#if defined(OS_WIN)
+#include <aclapi.h>
+#endif
+
+namespace base {
+
+#if !defined(OS_NACL)
+
+static const size_t kDataSize = 1024;
+
+// Common routine used with Posix file descriptors. Check that shared memory
+// file descriptor |fd| does not allow writable mappings. Return true on
+// success, false otherwise.
+#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
+static bool CheckReadOnlySharedMemoryFdPosix(int fd) {
+// Note that the error on Android is EPERM, unlike other platforms where
+// it will be EACCES.
+#if defined(OS_ANDROID)
+  const int kExpectedErrno = EPERM;
+#else
+  const int kExpectedErrno = EACCES;
+#endif
+  errno = 0;
+  void* address =
+      mmap(nullptr, kDataSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+  const bool success = (address != nullptr) && (address != MAP_FAILED);
+  if (success) {
+    LOG(ERROR) << "mmap() should have failed!";
+    munmap(address, kDataSize);  // Cleanup.
+    return false;
+  }
+  if (errno != kExpectedErrno) {
+    LOG(ERROR) << "Expected mmap() to return " << kExpectedErrno
+               << " but returned " << errno << ": " << strerror(errno) << "\n";
+    return false;
+  }
+  return true;
+}
+#endif  // OS_POSIX && !OS_FUCHSIA
+
+#if defined(OS_FUCHSIA)
+// Fuchsia specific implementation.
+bool CheckReadOnlySharedMemoryHandleForTesting(SharedMemoryHandle handle) {
+  const uint32_t flags = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE;
+  uintptr_t addr;
+  const zx_handle_t root = zx_vmar_root_self();
+  const zx_status_t status =
+      zx_vmar_map(root, 0, handle.GetHandle(), 0U, kDataSize, flags, &addr);
+  if (status == ZX_OK) {
+    LOG(ERROR) << "zx_vmar_map() should have failed!";
+    zx_vmar_unmap(root, addr, kDataSize);
+    return false;
+  }
+  if (status != ZX_ERR_ACCESS_DENIED) {
+    LOG(ERROR) << "Expected zx_vmar_map() to return " << ZX_ERR_ACCESS_DENIED
+               << " (ZX_ERR_ACCESS_DENIED) but returned " << status << "\n";
+    return false;
+  }
+  return true;
+}
+#elif defined(OS_MACOSX) && !defined(OS_IOS)
+// For OSX, the code has to deal with both POSIX and MACH handles.
+bool CheckReadOnlySharedMemoryHandleForTesting(SharedMemoryHandle handle) {
+  if (handle.type_ == SharedMemoryHandle::POSIX)
+    return CheckReadOnlySharedMemoryFdPosix(handle.file_descriptor_.fd);
+
+  mach_vm_address_t memory;
+  const kern_return_t kr = mach_vm_map(
+      mach_task_self(), &memory, kDataSize, 0, VM_FLAGS_ANYWHERE,
+      handle.memory_object_, 0, FALSE, VM_PROT_READ | VM_PROT_WRITE,
+      VM_PROT_READ | VM_PROT_WRITE | VM_PROT_IS_MASK, VM_INHERIT_NONE);
+  if (kr == KERN_SUCCESS) {
+    LOG(ERROR) << "mach_vm_map() should have failed!";
+    mach_vm_deallocate(mach_task_self(), memory, kDataSize);  // Cleanup.
+    return false;
+  }
+  return true;
+}
+#elif defined(OS_WIN)
+bool CheckReadOnlySharedMemoryHandleForTesting(SharedMemoryHandle handle) {
+  void* memory = MapViewOfFile(handle.GetHandle(),
+                               FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, kDataSize);
+  if (memory != nullptr) {
+    LOG(ERROR) << "MapViewOfFile() should have failed!";
+    UnmapViewOfFile(memory);
+    return false;
+  }
+  return true;
+}
+#else
+bool CheckReadOnlySharedMemoryHandleForTesting(SharedMemoryHandle handle) {
+  return CheckReadOnlySharedMemoryFdPosix(handle.GetHandle());
+}
+#endif
+
+#endif  // !OS_NACL
+
+}  // namespace base
diff --git a/base/test/test_shared_memory_util.h b/base/test/test_shared_memory_util.h
new file mode 100644
index 0000000..ee657da
--- /dev/null
+++ b/base/test/test_shared_memory_util.h
@@ -0,0 +1,20 @@
+// 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 BASE_TEST_TEST_SHARED_MEMORY_UTIL_H_
+#define BASE_TEST_TEST_SHARED_MEMORY_UTIL_H_
+
+#include "base/memory/shared_memory_handle.h"
+
+namespace base {
+
+// Check that the shared memory |handle| cannot be used to perform
+// a writable mapping with low-level system APIs like mmap(). Return true
+// in case of success (i.e. writable mappings are _not_ allowed), or false
+// otherwise.
+bool CheckReadOnlySharedMemoryHandleForTesting(SharedMemoryHandle handle);
+
+}  // namespace base
+
+#endif  // BASE_TEST_TEST_SHARED_MEMORY_UTIL_H_
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 6278645..96eec6b 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1416,16 +1416,14 @@
       _srcjar_path = invoker.srcjar_path
     }
     if (defined(invoker.output)) {
-      _post_process = defined(invoker.post_process_script)
       _packaged_resources_path = invoker.output
-      if (_post_process) {
-        _process_resources_target_name = "${target_name}__intermediate"
-        _packaged_resources_path =
-            get_path_info(_packaged_resources_path, "dir") + "/" +
-            get_path_info(_packaged_resources_path, "name") +
-            ".intermediate.ap_"
-        _srcjar_path = "${_srcjar_path}.intermediate.srcjar"
-      }
+    }
+    if (defined(invoker.post_process_script)) {
+      _process_resources_target_name = "${target_name}__intermediate"
+      _packaged_resources_path =
+          get_path_info(_packaged_resources_path, "dir") + "/" +
+          get_path_info(_packaged_resources_path, "name") + ".intermediate.ap_"
+      _srcjar_path = "${_srcjar_path}.intermediate.srcjar"
     }
     action(_process_resources_target_name) {
       set_sources_assignment_filter([])
@@ -1656,22 +1654,30 @@
       }
     }
 
-    if (defined(_packaged_resources_path) && _post_process) {
+    if (defined(invoker.post_process_script)) {
       action(target_name) {
         depfile = "${target_gen_dir}/${target_name}.d"
         script = invoker.post_process_script
         args = [
-                 "--depfile",
-                 rebase_path(depfile, root_build_dir),
-                 "--apk-path",
-                 rebase_path(_packaged_resources_path, root_build_dir),
-                 "--output",
-                 rebase_path(invoker.output, root_build_dir),
-                 "--srcjar-in",
-                 rebase_path(_srcjar_path, root_build_dir),
-                 "--srcjar-out",
-                 rebase_path(invoker.srcjar_path, root_build_dir),
-               ] + invoker.post_process_args
+          "--depfile",
+          rebase_path(depfile, root_build_dir),
+          "--apk-path",
+          rebase_path(_packaged_resources_path, root_build_dir),
+          "--output",
+          rebase_path(invoker.output, root_build_dir),
+          "--srcjar-in",
+          rebase_path(_srcjar_path, root_build_dir),
+          "--srcjar-out",
+          rebase_path(invoker.srcjar_path, root_build_dir),
+        ]
+        if (defined(invoker.shared_resources_whitelist)) {
+          args += [
+            "--r-text-whitelist",
+            rebase_path(invoker.shared_resources_whitelist, root_build_dir),
+            "--r-text",
+            rebase_path(invoker.r_text_out_path, root_build_dir),
+          ]
+        }
         inputs = [
           _srcjar_path,
           _packaged_resources_path,
@@ -1680,8 +1686,9 @@
           invoker.output,
           invoker.srcjar_path,
         ]
-        public_deps =
-            [ ":${_process_resources_target_name}" ] + invoker.post_process_deps
+        public_deps = [
+          ":${_process_resources_target_name}",
+        ]
       }
     }
   }
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 0704250..33ea74a 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2004,8 +2004,6 @@
       version_name = _version_name
       if (defined(invoker.post_process_package_resources_script)) {
         post_process_script = invoker.post_process_package_resources_script
-        post_process_deps = invoker.post_process_package_resources_deps
-        post_process_args = invoker.post_process_package_resources_args
       }
       srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
       r_text_out_path = "${target_gen_dir}/${target_name}_R.txt"
diff --git a/chrome/android/java/res/values-sw600dp/values.xml b/chrome/android/java/res/values-sw600dp/values.xml
index 92800b6..2b91507 100644
--- a/chrome/android/java/res/values-sw600dp/values.xml
+++ b/chrome/android/java/res/values-sw600dp/values.xml
@@ -1,8 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2011 The Chromium Authors. All rights reserved.
+<!-- Copyright (C) 2011 The Android Open Source Project
 
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- Full Screen Constants -->
@@ -23,4 +32,9 @@
 
     <!-- Compositor Tab Title Text -->
     <bool name="compositor_tab_title_fake_bold_text">false</bool>
+
+    <!-- Whether the device is a tablet or large tablet. Used to determine which resources the OS
+         loaded. -->
+    <bool name="is_tablet">true</bool>
+    <bool name="is_large_tablet">false</bool>
 </resources>
diff --git a/ui/android/java/res/values-sw720dp-v17/values.xml b/chrome/android/java/res/values-sw720dp-v17/values.xml
similarity index 87%
rename from ui/android/java/res/values-sw720dp-v17/values.xml
rename to chrome/android/java/res/values-sw720dp-v17/values.xml
index 5803c25..499949e 100644
--- a/ui/android/java/res/values-sw720dp-v17/values.xml
+++ b/chrome/android/java/res/values-sw720dp-v17/values.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2017 The Chromium Authors. All rights reserved.
+<!-- Copyright 2016 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.
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
index 1271fca..3789a6f 100644
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -64,6 +64,11 @@
     <!-- Our manage space activity. Default pre-KitKat to be nothing. -->
     <string name="manage_space_activity"></string>
 
+    <!-- Whether the device is a tablet or large tablet. Used to determine which resources the OS
+         loaded. -->
+    <bool name="is_tablet">false</bool>
+    <bool name="is_large_tablet">false</bool>
+
     <!-- Value for scaleX to mirror drawables correctly for LTR / RTL layouts. -->
     <integer name="automirror_scale_x">1</integer>
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
index 1af2d8531..41676d3f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
@@ -112,10 +112,11 @@
         // switcher resources. Overriding the smallestScreenWidthDp in the Configuration ensures
         // Android will load the tab strip resources. See crbug.com/588838.
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            if (DeviceFormFactor.isTablet()) {
+            int smallestDeviceWidthDp = DeviceFormFactor.getSmallestDeviceWidthDp();
+
+            if (smallestDeviceWidthDp >= DeviceFormFactor.MINIMUM_TABLET_WIDTH_DP) {
                 Configuration overrideConfiguration = new Configuration();
-                overrideConfiguration.smallestScreenWidthDp =
-                        DeviceFormFactor.getSmallestDeviceWidthDp();
+                overrideConfiguration.smallestScreenWidthDp = smallestDeviceWidthDp;
                 applyOverrideConfiguration(overrideConfiguration);
             }
         }
@@ -125,7 +126,14 @@
     @Override
     public void preInflationStartup() {
         mHadWarmStart = LibraryLoader.isInitialized();
-        mIsTablet = DeviceFormFactor.isTablet();
+        // On some devices, OEM modifications have been made to the resource loader that cause the
+        // DeviceFormFactor calculation of whether a device is using tablet resources to be
+        // incorrect. Check which resources were actually loaded and set the DeviceFormFactor
+        // values. See crbug.com/662338.
+        boolean isTablet = getResources().getBoolean(R.bool.is_tablet);
+        boolean isLargeTablet = getResources().getBoolean(R.bool.is_large_tablet);
+        DeviceFormFactor.setIsTablet(isTablet, isLargeTablet);
+        mIsTablet = isTablet;
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
index 0f6b678..0d303514 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -48,6 +48,7 @@
 import org.chromium.content.browser.SpeechRecognition;
 import org.chromium.net.NetworkChangeNotifier;
 import org.chromium.policy.CombinedPolicyProvider;
+import org.chromium.ui.base.DeviceFormFactor;
 
 import java.io.File;
 import java.util.Locale;
@@ -409,6 +410,8 @@
                         Log.e(TAG, "Killing process because of locale change.");
                         Process.killProcess(Process.myPid());
                     }
+
+                    DeviceFormFactor.resetValuesIfNeeded(mApplication);
                 }
             }
         };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java b/chrome/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java
index 86c8321..79b2b005 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java
@@ -13,6 +13,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.AppHooks;
+import org.chromium.chrome.browser.util.ViewUtils;
 
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -26,6 +27,7 @@
 public class PartnerBookmarksReader {
     private static final String TAG = "PartnerBMReader";
     private static Set<FaviconUpdateObserver> sFaviconUpdateObservers = new HashSet<>();
+    private static final float DESIRED_FAVICON_SIZE_DP = 16.0f;
 
     static final String LAST_EMPTY_READ_PREFS_NAME = "PartnerBookmarksReader.last_empty_read";
 
@@ -173,7 +175,8 @@
         };
         return nativeAddPartnerBookmark(mNativePartnerBookmarksReader, url, title, isFolder,
                 parentId, favicon, touchicon,
-                mFaviconThrottle.shouldFetchFromServerIfNecessary(url), callback);
+                mFaviconThrottle.shouldFetchFromServerIfNecessary(url),
+                ViewUtils.dpToPx(mContext, DESIRED_FAVICON_SIZE_DP), callback);
     }
 
     /**
@@ -397,7 +400,8 @@
     private native void nativeDestroy(long nativePartnerBookmarksReader);
     private native long nativeAddPartnerBookmark(long nativePartnerBookmarksReader, String url,
             String title, boolean isFolder, long parentId, byte[] favicon, byte[] touchicon,
-            boolean fetchUncachedFaviconsFromServer, FetchFaviconCallback callback);
+            boolean fetchUncachedFaviconsFromServer, int desiredFaviconSizePx,
+            FetchFaviconCallback callback);
     private native void nativePartnerBookmarksCreationComplete(long nativePartnerBookmarksReader);
     private static native String nativeGetNativeUrlString(String url);
     private static native void nativeDisablePartnerBookmarksEditing();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
index 821e478b..1336d35 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
@@ -1,4 +1,7 @@
+# Chrome settings:
 twellington@chromium.org
+
+# Site settings:
 finnur@chromium.org
 
 # COMPONENT: UI>Settings
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java
index 75589ce1..6642ed7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java
@@ -24,6 +24,8 @@
 
     protected static final int CONFIRM_DEVICE_CREDENTIAL_REQUEST_CODE = 2;
 
+    protected static final String HAS_BEEN_SUSPENDED_KEY = "has_been_suspended";
+
     private static boolean sPreventLockDevice = false;
 
     private FragmentManager mFragmentManager;
@@ -39,6 +41,15 @@
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        // On Android L, an empty |outState| would degrade to null in |onCreate|, making Chrome
+        // unable to distinguish the first time launch. Insert a value into |outState| to prevent
+        // that.
+        outState.putBoolean(HAS_BEEN_SUSPENDED_KEY, true);
+    }
+
+    @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if (requestCode == CONFIRM_DEVICE_CREDENTIAL_REQUEST_CODE) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/FloatLabelLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/FloatLabelLayout.java
index 70105ef5..78bfb65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/FloatLabelLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/FloatLabelLayout.java
@@ -98,8 +98,8 @@
         mLabel.setVisibility(INVISIBLE);
         mLabel.setText(mHint);
         mLabel.setFocusable(true);
-        ViewCompat.setPivotX(mLabel, 0f);
-        ViewCompat.setPivotY(mLabel, 0f);
+        mLabel.setPivotX(0f);
+        mLabel.setPivotY(0f);
 
         ApiCompatibilityUtils.setTextAppearance(mLabel,
                 a.getResourceId(R.styleable.FloatLabelLayout_floatLabelTextAppearance,
@@ -240,8 +240,8 @@
             ViewCompat.setTranslationY(mLabel, mLabel.getHeight());
 
             float scale = mEditText.getTextSize() / mLabel.getTextSize();
-            ViewCompat.setScaleX(mLabel, scale);
-            ViewCompat.setScaleY(mLabel, scale);
+            mLabel.setScaleX(scale);
+            mLabel.setScaleY(scale);
 
             ViewCompat.animate(mLabel)
                     .translationY(0f)
@@ -263,8 +263,8 @@
     private void hideLabel(boolean animate) {
         if (animate) {
             float scale = mEditText.getTextSize() / mLabel.getTextSize();
-            ViewCompat.setScaleX(mLabel, 1f);
-            ViewCompat.setScaleY(mLabel, 1f);
+            mLabel.setScaleX(1f);
+            mLabel.setScaleY(1f);
             ViewCompat.setTranslationY(mLabel, 0f);
 
             ViewCompat.animate(mLabel)
diff --git a/chrome/app/bookmarks_strings.grdp b/chrome/app/bookmarks_strings.grdp
index 82cce61a..d9c77f14 100644
--- a/chrome/app/bookmarks_strings.grdp
+++ b/chrome/app/bookmarks_strings.grdp
@@ -236,6 +236,15 @@
   </message>
   <!-- End of Bookmarks Sync Promo strings. -->
 
+  <!-- Begin of Bookmarks Sync Promo strings for Desktop Identity Consistency. -->
+  <message name="IDS_BOOKMARK_DICE_PROMO_SIGNIN_MESSAGE" desc="Text of the sync promo displayed at the bottom of the bookmark bubble asking the user to sign in and enable sync.">
+    To get your bookmarks on all your devices, sign in and turn on sync.
+  </message>
+  <message name="IDS_BOOKMARK_DICE_PROMO_SYNC_MESSAGE" desc="Text of the sync promo displayed at the bottom of the bookmark bubble asking the user to enable sync.">
+    To get your bookmarks on all your devices, turn on sync.
+  </message>
+  <!-- End of Bookmarks Sync Promo strings for Desktop Identity Consistency. -->
+
   <!-- Begin of Desktop to iOS Promo strings. -->
   <if expr="is_win">
     <message name="IDS_BOOKMARK_BUBBLE_DESKTOP_TO_IOS_PROMO_TITLE" desc="Title for Chrome iOS promotion appearing in the bookmark bubble after a bookmark is saved.">
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 36f2b47..cb6123e 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -11098,6 +11098,12 @@
       <message name="IDS_VR_COMPONENT_APPLY" desc="Text to be shown on the button to apply a new component update.">
         Apply
       </message>
+      <message name="IDS_VR_BUTTON_TRACKPAD" desc="The label for the trackpad on the VR controller.">
+        Scroll / Click
+      </message>
+      <message name="IDS_VR_BUTTON_EXIT" desc="The label for the exit button on the VR controller.">
+        Exit Fullscreen
+      </message>
     </if>
   </messages>
  </release>
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index a8686cd..4b367df 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -77,6 +77,7 @@
     "sad_tab.icon",
     "security.icon",
     "settings.icon",
+    "signin_button_drop_down_arrow.icon",
     "smartphone.icon",
     "supervisor_account.icon",
     "supervisor_account_circle.icon",
diff --git a/chrome/app/vector_icons/signin_button_drop_down_arrow.icon b/chrome/app/vector_icons/signin_button_drop_down_arrow.icon
new file mode 100644
index 0000000..70258ec
--- /dev/null
+++ b/chrome/app/vector_icons/signin_button_drop_down_arrow.icon
@@ -0,0 +1,10 @@
+// Copyright 2018 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.
+
+CANVAS_DIMENSIONS, 24,
+MOVE_TO, 8, 5,
+R_V_LINE_TO, 14,
+R_LINE_TO, 11, -7,
+CLOSE,
+END
diff --git a/chrome/browser/android/bookmarks/partner_bookmarks_reader.cc b/chrome/browser/android/bookmarks/partner_bookmarks_reader.cc
index 8453fd5..42cc6cf 100644
--- a/chrome/browser/android/bookmarks/partner_bookmarks_reader.cc
+++ b/chrome/browser/android/bookmarks/partner_bookmarks_reader.cc
@@ -151,6 +151,7 @@
     const JavaParamRef<jbyteArray>& favicon,
     const JavaParamRef<jbyteArray>& touchicon,
     jboolean fetch_uncached_favicons_from_server,
+    jint desired_favicon_size_px,
     const JavaParamRef<jobject>& j_callback) {
   base::string16 url;
   base::string16 title;
@@ -185,6 +186,7 @@
         Java_FetchFaviconCallback_onFaviconFetch(env, j_callback);
         GetFavicon(
             GURL(url), profile_, fetch_uncached_favicons_from_server,
+            desired_favicon_size_px,
             base::BindOnce(&PartnerBookmarksReader::OnFaviconFetched,
                            base::Unretained(this),
                            ScopedJavaGlobalRef<jobject>(env, j_callback)));
@@ -214,17 +216,20 @@
 void PartnerBookmarksReader::GetFavicon(const GURL& page_url,
                                         Profile* profile,
                                         bool fallback_to_server,
+                                        int desired_favicon_size_px,
                                         FaviconFetchedCallback callback) {
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
       base::BindOnce(&PartnerBookmarksReader::GetFaviconImpl,
                      base::Unretained(this), page_url, profile,
-                     fallback_to_server, std::move(callback)));
+                     fallback_to_server, desired_favicon_size_px,
+                     std::move(callback)));
 }
 
 void PartnerBookmarksReader::GetFaviconImpl(const GURL& page_url,
                                             Profile* profile,
                                             bool fallback_to_server,
+                                            int desired_favicon_size_px,
                                             FaviconFetchedCallback callback) {
   if (!GetLargeIconService()) {
     std::move(callback).Run(
@@ -233,7 +238,8 @@
   }
 
   GetFaviconFromCacheOrServer(page_url, fallback_to_server,
-                              false /* from_server */, std::move(callback));
+                              false /* from_server */, desired_favicon_size_px,
+                              std::move(callback));
 }
 
 favicon::LargeIconService* PartnerBookmarksReader::GetLargeIconService() {
@@ -248,13 +254,14 @@
     const GURL& page_url,
     bool fallback_to_server,
     bool from_server,
+    int desired_favicon_size_px,
     FaviconFetchedCallback callback) {
   GetLargeIconService()->GetLargeIconOrFallbackStyle(
-      page_url, kPartnerBookmarksMinimumFaviconSizePx, 0,
+      page_url, kPartnerBookmarksMinimumFaviconSizePx, desired_favicon_size_px,
       base::Bind(&PartnerBookmarksReader::OnGetFaviconFromCacheFinished,
                  base::Unretained(this), page_url,
                  base::Passed(std::move(callback)), fallback_to_server,
-                 from_server),
+                 from_server, desired_favicon_size_px),
       &favicon_task_tracker_);
 }
 
@@ -263,6 +270,7 @@
     FaviconFetchedCallback callback,
     bool fallback_to_server,
     bool from_server,
+    int desired_favicon_size_px,
     const favicon_base::LargeIconResult& result) {
   // |from_server| tells us if we fetched the image from the cache after we went
   // to server for it, so this successful cache retrieval should actually return
@@ -305,15 +313,17 @@
         })");
   GetLargeIconService()
       ->GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
-          page_url, kPartnerBookmarksMinimumFaviconSizePx, 0,
-          false /* may_page_url_be_private */, traffic_annotation,
+          page_url, kPartnerBookmarksMinimumFaviconSizePx,
+          desired_favicon_size_px, false /* may_page_url_be_private */,
+          traffic_annotation,
           base::Bind(&PartnerBookmarksReader::OnGetFaviconFromServerFinished,
-                     base::Unretained(this), page_url,
+                     base::Unretained(this), page_url, desired_favicon_size_px,
                      base::Passed(std::move(callback))));
 }
 
 void PartnerBookmarksReader::OnGetFaviconFromServerFinished(
     const GURL& page_url,
+    int desired_favicon_size_px,
     FaviconFetchedCallback callback,
     favicon_base::GoogleFaviconServerRequestStatus status) {
   if (status != favicon_base::GoogleFaviconServerRequestStatus::SUCCESS) {
@@ -334,7 +344,8 @@
   // The icon was successfully retrieved from the server, now we just have to
   // retrieve it from the cache where it was stored.
   GetFaviconFromCacheOrServer(page_url, false /* fallback_to_server */,
-                              true /* from_server */, std::move(callback));
+                              true /* from_server */, desired_favicon_size_px,
+                              std::move(callback));
 }
 
 void PartnerBookmarksReader::OnFaviconFetched(
diff --git a/chrome/browser/android/bookmarks/partner_bookmarks_reader.h b/chrome/browser/android/bookmarks/partner_bookmarks_reader.h
index 728c702..447d617 100644
--- a/chrome/browser/android/bookmarks/partner_bookmarks_reader.h
+++ b/chrome/browser/android/bookmarks/partner_bookmarks_reader.h
@@ -41,6 +41,7 @@
       const base::android::JavaParamRef<jbyteArray>& favicon,
       const base::android::JavaParamRef<jbyteArray>& touchicon,
       jboolean fetch_uncached_favicons_from_server,
+      jint desired_favicon_size_px,
       // Callback<FaviconFetchResult>
       const base::android::JavaParamRef<jobject>& j_callback);
   void PartnerBookmarksCreationComplete(
@@ -83,23 +84,28 @@
   void GetFavicon(const GURL& page_url,
                   Profile* profile,
                   bool fallback_to_server,
+                  int desired_favicon_size_px,
                   FaviconFetchedCallback callback);
   void GetFaviconImpl(const GURL& page_url,
                       Profile* profile,
                       bool fallback_to_server,
+                      int desired_favicon_size_px,
                       FaviconFetchedCallback callback);
   void GetFaviconFromCacheOrServer(const GURL& page_url,
                                    bool fallback_to_server,
                                    bool from_server,
+                                   int desired_favicon_size_px,
                                    FaviconFetchedCallback callback);
   void OnGetFaviconFromCacheFinished(
       const GURL& page_url,
       FaviconFetchedCallback callback,
       bool fallback_to_server,
       bool from_server,
+      int desired_favicon_size_px,
       const favicon_base::LargeIconResult& result);
   void OnGetFaviconFromServerFinished(
       const GURL& page_url,
+      int desired_favicon_size_px,
       FaviconFetchedCallback callback,
       favicon_base::GoogleFaviconServerRequestStatus status);
   void OnFaviconFetched(const base::android::JavaRef<jobject>& j_callback,
diff --git a/chrome/browser/android/vr_shell/vr_controller.cc b/chrome/browser/android/vr_shell/vr_controller.cc
index b6cb0a3..bfc3295 100644
--- a/chrome/browser/android/vr_shell/vr_controller.cc
+++ b/chrome/browser/android/vr_shell/vr_controller.cc
@@ -183,6 +183,12 @@
   return base::TimeTicks::Now();
 }
 
+vr::PlatformController::Handedness VrController::GetHandedness() const {
+  return handedness_ == GVR_CONTROLLER_RIGHT_HANDED
+             ? vr::PlatformController::kRightHanded
+             : vr::PlatformController::kLeftHanded;
+}
+
 gfx::Quaternion VrController::Orientation() const {
   const gvr::Quatf& orientation = controller_state_->GetOrientation();
   return gfx::Quaternion(orientation.qx, orientation.qy, orientation.qz,
diff --git a/chrome/browser/android/vr_shell/vr_controller.h b/chrome/browser/android/vr_shell/vr_controller.h
index 58b09339..8f94968 100644
--- a/chrome/browser/android/vr_shell/vr_controller.h
+++ b/chrome/browser/android/vr_shell/vr_controller.h
@@ -84,6 +84,7 @@
   base::TimeTicks GetLastOrientationTimestamp() const override;
   base::TimeTicks GetLastTouchTimestamp() const override;
   base::TimeTicks GetLastButtonTimestamp() const override;
+  vr::PlatformController::Handedness GetHandedness() const override;
 
  private:
   enum GestureDetectorState {
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
index b71efbd..ae9eb05 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
@@ -611,11 +611,11 @@
                              GetWebVrFrameTransportOptions());
 }
 
-void VrShellGl::UpdateController(const gfx::Transform& head_pose,
+void VrShellGl::UpdateController(const vr::RenderInfo& render_info,
                                  base::TimeTicks current_time) {
   TRACE_EVENT0("gpu", "VrShellGl::UpdateController");
   gvr::Mat4f gvr_head_pose;
-  TransformToGvrMat(head_pose, &gvr_head_pose);
+  TransformToGvrMat(render_info.head_pose, &gvr_head_pose);
   controller_->UpdateState(gvr_head_pose);
   gfx::Point3F laser_origin = controller_->GetPointerStart();
 
@@ -624,13 +624,13 @@
     controller_data.connected = false;
   browser_->UpdateGamepadData(controller_data);
 
-  HandleControllerInput(laser_origin, vr::GetForwardVector(head_pose),
-                        current_time);
+  HandleControllerInput(laser_origin, render_info, current_time);
 }
 
 void VrShellGl::HandleControllerInput(const gfx::Point3F& laser_origin,
-                                      const gfx::Vector3dF& head_direction,
+                                      const vr::RenderInfo& render_info,
                                       base::TimeTicks current_time) {
+  gfx::Vector3dF head_direction = vr::GetForwardVector(render_info.head_pose);
   if (is_exiting_) {
     // When we're exiting, we don't show the reticle and the only input
     // processing we do is to handle immediate exits.
@@ -682,10 +682,11 @@
   controller_model.opacity = controller_->GetOpacity();
   controller_model.laser_direction = controller_direction;
   controller_model.laser_origin = laser_origin;
+  controller_model.handedness = controller_->GetHandedness();
   controller_model_ = controller_model;
 
   vr::ReticleModel reticle_model;
-  ui_->input_manager()->HandleInput(current_time, controller_model,
+  ui_->input_manager()->HandleInput(current_time, render_info, controller_model,
                                     &reticle_model, &gesture_list);
   ui_->OnControllerUpdated(controller_model, reticle_model);
 }
@@ -897,7 +898,7 @@
 
   // WebVR handles controller input in OnVsync.
   if (!ShouldDrawWebVr())
-    UpdateController(render_info_primary_.head_pose, current_time);
+    UpdateController(render_info_primary_, current_time);
 
   bool textures_changed = ui_->scene()->UpdateTextures();
 
@@ -1280,9 +1281,9 @@
     // rendering as WebVR uses the gamepad api. To ensure we always handle input
     // like app button presses, update the controller here, but not in
     // DrawFrame.
-    gfx::Transform head_pose;
-    device::GvrDelegate::GetGvrPoseWithNeckModel(gvr_api_.get(), &head_pose);
-    UpdateController(head_pose, frame_time);
+    device::GvrDelegate::GetGvrPoseWithNeckModel(
+        gvr_api_.get(), &render_info_primary_.head_pose);
+    UpdateController(render_info_primary_, frame_time);
   } else {
     DrawFrame(-1, frame_time);
   }
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.h b/chrome/browser/android/vr_shell/vr_shell_gl.h
index 6005117..801d631 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.h
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.h
@@ -148,12 +148,12 @@
   void DrawWebVr();
   bool WebVrPoseByteIsValid(int pose_index_byte);
 
-  void UpdateController(const gfx::Transform& head_pose,
+  void UpdateController(const vr::RenderInfo& render_info,
                         base::TimeTicks current_time);
 
   void SendImmediateExitRequestIfNecessary();
   void HandleControllerInput(const gfx::Point3F& laser_origin,
-                             const gfx::Vector3dF& head_direction,
+                             const vr::RenderInfo& render_info,
                              base::TimeTicks current_time);
   void HandleControllerAppButtonActivity(
       const gfx::Vector3dF& controller_direction);
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index 3d355da..5e4c6e7 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -3685,13 +3685,7 @@
 
 // Tests that a webview inside an iframe can load and that it is destroyed when
 // the iframe is detached.
-// Flakily times out under MSan. crbug.com/793422
-#if defined(MEMORY_SANITIZER)
-#define MAYBE_LoadWebviewInsideIframe DISABLED_LoadWebviewInsideIframe
-#else
-#define MAYBE_LoadWebviewInsideIframe LoadWebviewInsideIframe
-#endif
-IN_PROC_BROWSER_TEST_P(WebViewTest, MAYBE_LoadWebviewInsideIframe) {
+IN_PROC_BROWSER_TEST_P(WebViewTest, LoadWebviewInsideIframe) {
   TestHelper("testLoadWebviewInsideIframe",
              "web_view/load_webview_inside_iframe", NEEDS_TEST_SERVER);
 
diff --git a/chrome/browser/autofill/autofill_metrics_browsertest.cc b/chrome/browser/autofill/autofill_metrics_browsertest.cc
index 0cfefc37..d55030c9 100644
--- a/chrome/browser/autofill/autofill_metrics_browsertest.cc
+++ b/chrome/browser/autofill/autofill_metrics_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <map>
 #include <memory>
 #include <utility>
 
@@ -31,11 +32,25 @@
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "url/gurl.h"
 
-class AutofillMetricsMetricsBrowserTest : public InProcessBrowserTest {
- public:
-  AutofillMetricsMetricsBrowserTest() {}
+namespace {
 
-  ~AutofillMetricsMetricsBrowserTest() override {}
+bool ContainsHost(
+    const std::map<ukm::SourceId, std::unique_ptr<ukm::UkmSource>>& sources,
+    const std::string& host) {
+  for (const auto& kv : sources) {
+    if (host == kv.second->url().host())
+      return true;
+  }
+  return false;
+}
+
+}  // namespace
+
+class AutofillMetricsBrowserTest : public InProcessBrowserTest {
+ public:
+  AutofillMetricsBrowserTest() {}
+
+  ~AutofillMetricsBrowserTest() override {}
 
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -62,10 +77,10 @@
   std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(AutofillMetricsMetricsBrowserTest);
+  DISALLOW_COPY_AND_ASSIGN(AutofillMetricsBrowserTest);
 };
 
-IN_PROC_BROWSER_TEST_F(AutofillMetricsMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(AutofillMetricsBrowserTest,
                        CorrectSourceForCrossSiteEmbeddedAddressForm) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -83,12 +98,13 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
 
-IN_PROC_BROWSER_TEST_F(AutofillMetricsMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(AutofillMetricsBrowserTest,
                        CorrectSourceForCrossSiteEmbeddedCreditCardForm) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -106,39 +122,36 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
 
-// Flaky test, see crbug.com/793672
-IN_PROC_BROWSER_TEST_F(AutofillMetricsMetricsBrowserTest,
-                       DISABLED_CorrectSourceForUnownedAddressCheckout) {
+IN_PROC_BROWSER_TEST_F(AutofillMetricsBrowserTest,
+                       CorrectSourceForUnownedAddressCheckout) {
   GURL main_frame_url = embedded_test_server()->GetURL(
       "a.com", "/autofill_unowned_address_checkout.html");
   ui_test_utils::NavigateToURL(browser(), main_frame_url);
 
   // Make sure the UKM were logged for the main frame url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_EQ(main_frame_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
 }
 
-// Flaky test, see crbug.com/793638
-IN_PROC_BROWSER_TEST_F(AutofillMetricsMetricsBrowserTest,
-                       DISABLED_CorrectSourceForUnownedCreditCardCheckout) {
+IN_PROC_BROWSER_TEST_F(AutofillMetricsBrowserTest,
+                       CorrectSourceForUnownedCreditCardCheckout) {
   GURL main_frame_url = embedded_test_server()->GetURL(
       "a.com", "/autofill_unowned_credit_card_checkout.html");
   ui_test_utils::NavigateToURL(browser(), main_frame_url);
 
   // Make sure the UKM were logged for the main frame url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_EQ(main_frame_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
 }
 
 IN_PROC_BROWSER_TEST_F(
-    AutofillMetricsMetricsBrowserTest,
+    AutofillMetricsBrowserTest,
     CorrectSourceForCrossSiteEmbeddedUnownedAddressCheckout) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -156,13 +169,14 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
 
 IN_PROC_BROWSER_TEST_F(
-    AutofillMetricsMetricsBrowserTest,
+    AutofillMetricsBrowserTest,
     CorrectSourceForCrossSiteEmbeddedUnownedCreditCardCheckout) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -180,31 +194,32 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
 
-class SitePerProcessAutofillMetricsMetricsBrowserTest
-    : public AutofillMetricsMetricsBrowserTest {
+class SitePerProcessAutofillMetricsBrowserTest
+    : public AutofillMetricsBrowserTest {
  public:
-  SitePerProcessAutofillMetricsMetricsBrowserTest() {}
+  SitePerProcessAutofillMetricsBrowserTest() {}
 
-  ~SitePerProcessAutofillMetricsMetricsBrowserTest() override {}
+  ~SitePerProcessAutofillMetricsBrowserTest() override {}
 
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    AutofillMetricsMetricsBrowserTest::SetUpCommandLine(command_line);
+    AutofillMetricsBrowserTest::SetUpCommandLine(command_line);
 
     // Append --site-per-process flag.
     content::IsolateAllSitesForTesting(command_line);
   }
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(SitePerProcessAutofillMetricsMetricsBrowserTest);
+  DISALLOW_COPY_AND_ASSIGN(SitePerProcessAutofillMetricsBrowserTest);
 };
 
-IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsBrowserTest,
                        CorrectSourceForCrossSiteEmbeddedAddressForm) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -223,12 +238,13 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
 
-IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsBrowserTest,
                        CorrectSourceForCrossSiteEmbeddedCreditCardForm) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -247,39 +263,36 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
 
-// Flaky test, see crbug.com/793578
-IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsMetricsBrowserTest,
-                       DISABLED_CorrectSourceForUnownedAddressCheckout) {
+IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsBrowserTest,
+                       CorrectSourceForUnownedAddressCheckout) {
   GURL main_frame_url = embedded_test_server()->GetURL(
       "a.com", "/autofill_unowned_address_checkout.html");
   ui_test_utils::NavigateToURL(browser(), main_frame_url);
 
   // Make sure the UKM were logged for the main frame url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_EQ(main_frame_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
 }
 
-// Flaky test, see crbug.com/793634
-IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsMetricsBrowserTest,
-                       DISABLED_CorrectSourceForUnownedCreditCardCheckout) {
+IN_PROC_BROWSER_TEST_F(SitePerProcessAutofillMetricsBrowserTest,
+                       CorrectSourceForUnownedCreditCardCheckout) {
   GURL main_frame_url = embedded_test_server()->GetURL(
       "a.com", "/autofill_unowned_credit_card_checkout.html");
   ui_test_utils::NavigateToURL(browser(), main_frame_url);
 
   // Make sure the UKM were logged for the main frame url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_EQ(main_frame_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
 }
 
 IN_PROC_BROWSER_TEST_F(
-    SitePerProcessAutofillMetricsMetricsBrowserTest,
+    SitePerProcessAutofillMetricsBrowserTest,
     CorrectSourceForCrossSiteEmbeddedUnownedAddressCheckout) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -298,13 +311,14 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
 
 IN_PROC_BROWSER_TEST_F(
-    SitePerProcessAutofillMetricsMetricsBrowserTest,
+    SitePerProcessAutofillMetricsBrowserTest,
     CorrectSourceForCrossSiteEmbeddedUnownedCreditCardCheckout) {
   GURL main_frame_url =
       embedded_test_server()->GetURL("a.com", "/autofill_iframe_embedder.html");
@@ -323,7 +337,8 @@
 
   // Make sure the UKM were logged for the main frame url and none for the
   // iframe url.
-  for (const auto& kv : test_ukm_recorder_->GetSources()) {
-    EXPECT_NE(iframe_url.host(), kv.second->url().host());
-  }
+  EXPECT_TRUE(
+      ContainsHost(test_ukm_recorder_->GetSources(), main_frame_url.host()));
+  EXPECT_FALSE(
+      ContainsHost(test_ukm_recorder_->GetSources(), iframe_url.host()));
 }
diff --git a/chrome/browser/browsing_data/counters/passwords_counter_browsertest.cc b/chrome/browser/browsing_data/counters/passwords_counter_browsertest.cc
index c03d5a8..c0b7ca4d 100644
--- a/chrome/browser/browsing_data/counters/passwords_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/counters/passwords_counter_browsertest.cc
@@ -264,6 +264,10 @@
   WaitForCounting();
   EXPECT_EQ(3u, GetResult());
 
+  SetDeletionPeriodPref(browsing_data::TimePeriod::OLDER_THAN_30_DAYS);
+  WaitForCounting();
+  EXPECT_EQ(1u, GetResult());
+
   SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   WaitForCounting();
   EXPECT_EQ(4u, GetResult());
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.cc b/chrome/browser/chromeos/login/ui/login_display_host.cc
index 74d725c..9e1f86d 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host.cc
@@ -8,7 +8,9 @@
 #include "chrome/browser/chromeos/login/app_launch_controller.h"
 #include "chrome/browser/chromeos/login/arc_kiosk_controller.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h"
+#include "chrome/browser/chromeos/login/existing_user_controller.h"
 #include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
 #include "chrome/browser/chromeos/mobile_config.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/system/device_disabling_manager.h"
@@ -131,4 +133,49 @@
   auth_prewarmer_.reset();
 }
 
+void LoginDisplayHost::CompleteLogin(const UserContext& user_context) {
+  ExistingUserController* controller =
+      ExistingUserController::current_controller();
+  if (controller)
+    controller->CompleteLogin(user_context);
+}
+
+void LoginDisplayHost::OnGaiaScreenReady() {
+  ExistingUserController* controller =
+      ExistingUserController::current_controller();
+  if (controller)
+    controller->OnGaiaScreenReady();
+}
+
+void LoginDisplayHost::SetDisplayEmail(const std::string& email) {
+  ExistingUserController* controller =
+      ExistingUserController::current_controller();
+  if (controller)
+    controller->SetDisplayEmail(email);
+}
+
+void LoginDisplayHost::SetDisplayAndGivenName(const std::string& display_name,
+                                              const std::string& given_name) {
+  ExistingUserController* controller =
+      ExistingUserController::current_controller();
+  if (controller)
+    controller->SetDisplayAndGivenName(display_name, given_name);
+}
+
+void LoginDisplayHost::LoadWallpaper(const AccountId& account_id) {
+  WallpaperManager::Get()->ShowUserWallpaper(account_id);
+}
+
+void LoginDisplayHost::LoadSigninWallpaper() {
+  WallpaperManager::Get()->ShowSigninWallpaper();
+}
+
+bool LoginDisplayHost::IsUserWhitelisted(const AccountId& account_id) {
+  ExistingUserController* controller =
+      ExistingUserController::current_controller();
+  if (!controller)
+    return true;
+  return controller->IsUserWhitelisted(account_id);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.h b/chrome/browser/chromeos/login/ui/login_display_host.h
index c8181dd3..dbbfbdc 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host.h
@@ -112,6 +112,32 @@
   // Returns whether current host is for voice interaction OOBE.
   virtual bool IsVoiceInteractionOobe() = 0;
 
+  // Confirms sign in by provided credentials in |user_context|.
+  // Used for new user login via GAIA extension.
+  void CompleteLogin(const UserContext& user_context);
+
+  // Notify the backend controller when the GAIA UI is finished loading.
+  void OnGaiaScreenReady();
+
+  // Sets the displayed email for the next login attempt. If it succeeds,
+  // user's displayed email value will be updated to |email|.
+  void SetDisplayEmail(const std::string& email);
+
+  // Sets the displayed name and given name for the next login attempt. If it
+  // succeeds, user's displayed name and give name values will be updated to
+  // |display_name| and |given_name|.
+  void SetDisplayAndGivenName(const std::string& display_name,
+                              const std::string& given_name);
+
+  // Load wallpaper for given |account_id|.
+  void LoadWallpaper(const AccountId& account_id);
+
+  // Loads the default sign-in wallpaper.
+  void LoadSigninWallpaper();
+
+  // Returns true if user is allowed to log in by domain policy.
+  bool IsUserWhitelisted(const AccountId& account_id);
+
  protected:
   // Default LoginDisplayHost. Child class sets the reference.
   static LoginDisplayHost* default_host_;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_views.cc b/chrome/browser/chromeos/login/ui/login_display_host_views.cc
index d5e1da0d..548785d 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_views.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_views.cc
@@ -17,10 +17,29 @@
 
 namespace chromeos {
 
-LoginDisplayHostViews::LoginDisplayHostViews() : weak_factory_(this) {}
+namespace {
+
+void ScheduleCompletionCallbacks(std::vector<base::OnceClosure>&& callbacks) {
+  for (auto& callback : callbacks) {
+    if (callback.is_null())
+      continue;
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                  std::move(callback));
+  }
+}
+
+}  // namespace
+
+LoginDisplayHostViews::LoginDisplayHostViews() : weak_factory_(this) {
+  DCHECK(default_host() == nullptr);
+  default_host_ = this;
+}
 
 LoginDisplayHostViews::~LoginDisplayHostViews() {
+  DCHECK_EQ(default_host_, this);
+  default_host_ = nullptr;
   LoginScreenClient::Get()->SetDelegate(nullptr);
+  ScheduleCompletionCallbacks(std::move(completion_callbacks_));
 }
 
 LoginDisplay* LoginDisplayHostViews::CreateLoginDisplay(
@@ -48,7 +67,8 @@
 }
 
 void LoginDisplayHostViews::Finalize(base::OnceClosure completion_callback) {
-  NOTIMPLEMENTED();
+  completion_callbacks_.push_back(std::move(completion_callback));
+  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
 }
 
 void LoginDisplayHostViews::SetStatusAreaVisible(bool visible) {
@@ -66,7 +86,7 @@
 
 void LoginDisplayHostViews::StartUserAdding(
     base::OnceClosure completion_callback) {
-  NOTIMPLEMENTED();
+  completion_callbacks_.push_back(std::move(completion_callback));
 }
 
 void LoginDisplayHostViews::CancelUserAdding() {
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_views.h b/chrome/browser/chromeos/login/ui/login_display_host_views.h
index c5d4ffa..5518867 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_views.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_views.h
@@ -70,6 +70,10 @@
   AuthenticateUserCallback on_authenticated_;
 
   std::unique_ptr<ExistingUserController> existing_user_controller_;
+
+  // Called after host deletion.
+  std::vector<base::OnceClosure> completion_callbacks_;
+
   base::WeakPtrFactory<LoginDisplayHostViews> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(LoginDisplayHostViews);
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.cc b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.cc
index f6258fb..680c8171 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.cc
+++ b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.cc
@@ -75,27 +75,20 @@
   if (user != user_manager::UserManager::Get()->GetPrimaryUser())
     return nullptr;
 
+  // Guest sessions don't get user policy, but a UserNetworkConfigurationUpdater
+  // can be created for them anyway.
+  const bool allow_trusted_certs_from_policy =
+      user->GetType() != user_manager::USER_TYPE_GUEST;
+
   ProfilePolicyConnector* profile_connector =
       ProfilePolicyConnectorFactory::GetForBrowserContext(context);
 
   return UserNetworkConfigurationUpdater::CreateForUserPolicy(
-             profile, AllowTrustedCertsFromPolicy(user), *user,
+             profile, allow_trusted_certs_from_policy, *user,
              profile_connector->policy_service(),
              chromeos::NetworkHandler::Get()
                  ->managed_network_configuration_handler())
       .release();
 }
 
-// static
-bool UserNetworkConfigurationUpdaterFactory::AllowTrustedCertsFromPolicy(
-    const user_manager::User* user) {
-  user_manager::UserType user_type = user->GetType();
-
-  // Disallow trusted root certs for public sessions.
-  // Also, guest sessions don't get user policy, but a
-  // UserNetworkCofnigurationUpdater can be created for them anyway.
-  return user_type != user_manager::USER_TYPE_GUEST &&
-         user_type != user_manager::USER_TYPE_PUBLIC_ACCOUNT;
-}
-
 }  // namespace policy
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h
index 4cb06ef4..946721c 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h
+++ b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h
@@ -14,10 +14,6 @@
 struct DefaultSingletonTraits;
 }  // namespace base
 
-namespace user_manager {
-class User;
-}
-
 class Profile;
 
 namespace policy {
@@ -50,8 +46,6 @@
   KeyedService* BuildServiceInstanceFor(
       content::BrowserContext* context) const override;
 
-  static bool AllowTrustedCertsFromPolicy(const user_manager::User* user);
-
   DISALLOW_COPY_AND_ASSIGN(UserNetworkConfigurationUpdaterFactory);
 };
 
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc
index 7d5f871..15a54a6 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc
+++ b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc
@@ -302,7 +302,7 @@
 };
 
 IN_PROC_BROWSER_TEST_F(PolicyProvidedTrustRootsPublicSessionTest,
-                       NotAllowedInPublicSession) {
+                       AllowedInPublicSession) {
   StartLogin();
   WaitForSessionStart();
 
@@ -312,8 +312,7 @@
   ASSERT_TRUE(browser);
 
   SetRootCertONCPolicy(browser->profile());
-  EXPECT_EQ(net::ERR_CERT_AUTHORITY_INVALID,
-            VerifyTestServerCert(browser->profile()));
+  EXPECT_EQ(net::OK, VerifyTestServerCert(browser->profile()));
 }
 
 }  // namespace policy
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.cc b/chrome/browser/chromeos/smb_client/smb_file_system.cc
index 94b86d3..8e5c6e8 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system.cc
+++ b/chrome/browser/chromeos/smb_client/smb_file_system.cc
@@ -278,10 +278,19 @@
     const base::FilePath& entry_path,
     bool recursive,
     const storage::AsyncFileUtil::StatusCallback& callback) {
-  NOTIMPLEMENTED();
+  GetSmbProviderClient()->DeleteEntry(
+      GetMountId(), entry_path, recursive,
+      base::BindOnce(&SmbFileSystem::HandleRequestDeleteEntryCallback,
+                     weak_ptr_factory_.GetWeakPtr(), callback));
   return CreateAbortCallback();
 }
 
+void SmbFileSystem::HandleRequestDeleteEntryCallback(
+    const storage::AsyncFileUtil::StatusCallback& callback,
+    smbprovider::ErrorType error) const {
+  callback.Run(TranslateError(error));
+}
+
 AbortCallback SmbFileSystem::CopyEntry(
     const base::FilePath& source_path,
     const base::FilePath& target_path,
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.h b/chrome/browser/chromeos/smb_client/smb_file_system.h
index 78c20e1..6e49139 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system.h
+++ b/chrome/browser/chromeos/smb_client/smb_file_system.h
@@ -201,6 +201,10 @@
       const storage::AsyncFileUtil::StatusCallback& callback,
       smbprovider::ErrorType error) const;
 
+  void HandleRequestDeleteEntryCallback(
+      const storage::AsyncFileUtil::StatusCallback& callback,
+      smbprovider::ErrorType error) const;
+
   base::File::Error RunUnmountCallback(
       const ProviderId& provider_id,
       const std::string& file_system_id,
diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc
index 12a78dd..e8fa011 100644
--- a/chrome/browser/chromeos/status/network_menu.cc
+++ b/chrome/browser/chromeos/status/network_menu.cc
@@ -18,13 +18,17 @@
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/webui/chromeos/internet_config_dialog.h"
 #include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
+#include "chromeos/chromeos_switches.h"
 #include "chromeos/network/device_state.h"
 #include "chromeos/network/network_connect.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/network_util.h"
+#include "components/onc/onc_constants.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/models/menu_model.h"
@@ -339,7 +343,12 @@
 void NetworkMenuModel::ShowOther(const std::string& type) const {
   // Note: this UI is deprecated and generally unused. If |type| is 'cellular'
   // this will do nothing.
-  NetworkConfigView::ShowForType(type);
+  if (chromeos::switches::IsNetworkSettingsConfigEnabled()) {
+    chromeos::InternetConfigDialog::ShowDialogForNetworkType(
+        chromeos::network_util::TranslateShillTypeToONC(type));
+  } else {
+    NetworkConfigView::ShowForType(type);
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/download/notification/download_notification_browsertest.cc b/chrome/browser/download/notification/download_notification_browsertest.cc
index e7d7055e..9bb2671 100644
--- a/chrome/browser/download/notification/download_notification_browsertest.cc
+++ b/chrome/browser/download/notification/download_notification_browsertest.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/download/download_core_service.h"
 #include "chrome/browser/download/download_core_service_factory.h"
 #include "chrome/browser/download/download_prefs.h"
-#include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/browser/ui/browser.h"
@@ -38,6 +37,9 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/url_request/url_request_slow_download_job.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/message_center/message_center.h"
+#include "ui/message_center/message_center_observer.h"
+#include "ui/message_center/public/cpp/message_center_switches.h"
 #include "url/gurl.h"
 
 namespace {
@@ -64,11 +66,181 @@
     {"charlie@invalid.domain",   "10003", "hashcharl", "Charlie"},
 };
 
+template <typename T>
+bool IsInNotifications(
+    const T& notifications,
+    const std::string& id) {
+  for (const auto& notification : notifications) {
+    if (notification->id() == id)
+      return true;
+  }
+  return false;
+}
+
+// Base class observing notification events.
+class MessageCenterChangeObserver
+    : public message_center::MessageCenterObserver {
+ public:
+  MessageCenterChangeObserver() {
+    message_center::MessageCenter::Get()->AddObserver(this);
+  }
+
+  ~MessageCenterChangeObserver() override {
+    message_center::MessageCenter::Get()->RemoveObserver(this);
+  }
+
+ protected:
+  void RunLoop() {
+    base::MessageLoop::ScopedNestableTaskAllower allow(
+        base::MessageLoop::current());
+    run_loop_->Run();
+  }
+
+  void QuitRunLoop() {
+    run_loop_->Quit();
+  }
+
+  void ResetRunLoop() {
+    run_loop_.reset(new base::RunLoop);
+  }
+
+ private:
+  std::unique_ptr<base::RunLoop> run_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(MessageCenterChangeObserver);
+};
+
+// Class observing of "ADD" notification events.
+class NotificationAddObserver : public MessageCenterChangeObserver {
+ public:
+  NotificationAddObserver() : count_(1) {}
+  explicit NotificationAddObserver(int count) : count_(count) {
+    MessageCenterChangeObserver();
+  }
+  ~NotificationAddObserver() override {}
+
+  bool Wait() {
+    if (count_ <= 0)
+      return count_ == 0;
+
+    waiting_ = true;
+    ResetRunLoop();
+    RunLoop();
+    waiting_ = false;
+    return count_ == 0;
+  }
+
+  // message_center::MessageCenterObserver:
+  void OnNotificationAdded(const std::string& notification_id) override {
+    count_--;
+
+    notification_ids_.push_back(notification_id);
+
+    if (waiting_ && count_ == 0)
+      QuitRunLoop();
+  }
+
+  const std::string& notification_id() const { return notification_ids_.at(0); }
+  const std::vector<std::string>& notification_ids() const {
+    return notification_ids_;
+  }
+
+ private:
+  std::vector<std::string> notification_ids_;
+  bool waiting_ = false;
+  int count_;
+
+  DISALLOW_COPY_AND_ASSIGN(NotificationAddObserver);
+};
+
+// Class observing of "UPDATE" notification events.
+class NotificationUpdateObserver : public MessageCenterChangeObserver {
+ public:
+  NotificationUpdateObserver() {}
+  explicit NotificationUpdateObserver(const std::string& id)
+      : target_notification_id_(id) {}
+  ~NotificationUpdateObserver() override {}
+
+  std::string Wait() {
+    if (!notification_id_.empty())
+      return notification_id_;
+
+    waiting_ = true;
+    ResetRunLoop();
+    RunLoop();
+    waiting_ = false;
+
+    std::string notification_id(notification_id_);
+    notification_id_.clear();
+    return notification_id;
+  }
+
+  void OnNotificationUpdated(const std::string& notification_id) override {
+    if (notification_id_.empty()) {
+      if (!target_notification_id_.empty() &&
+          target_notification_id_ != notification_id) {
+        return;
+      }
+
+      notification_id_ = notification_id;
+
+      if (waiting_)
+        QuitRunLoop();
+    }
+  }
+
+  void Reset() {
+    notification_id_.clear();
+  }
+
+ private:
+  std::string notification_id_;
+  std::string target_notification_id_;
+  bool waiting_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(NotificationUpdateObserver);
+};
+
+// Class observing of "REMOVE" notification events.
+class NotificationRemoveObserver : public MessageCenterChangeObserver {
+ public:
+  NotificationRemoveObserver() {}
+  ~NotificationRemoveObserver() override {}
+
+  std::string Wait() {
+    if (!notification_id_.empty())
+      return notification_id_;
+
+    waiting_ = true;
+    ResetRunLoop();
+    RunLoop();
+    waiting_ = false;
+    return notification_id_;
+  }
+
+  // message_center::MessageCenterObserver:
+  void OnNotificationRemoved(
+      const std::string& notification_id, bool by_user) override {
+    if (notification_id_.empty()) {
+      notification_id_ = notification_id;
+
+      if (waiting_)
+        QuitRunLoop();
+    }
+  }
+
+ private:
+  std::string notification_id_;
+  bool waiting_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(NotificationRemoveObserver);
+};
+
 class TestChromeDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
  public:
   explicit TestChromeDownloadManagerDelegate(Profile* profile)
       : ChromeDownloadManagerDelegate(profile), opened_(false) {}
-  ~TestChromeDownloadManagerDelegate() override = default;
+  ~TestChromeDownloadManagerDelegate() override {}
 
   // ChromeDownloadManagerDelegate override:
   void OpenDownload(content::DownloadItem* item) override { opened_ = true; }
@@ -87,22 +259,14 @@
   bool opened_;
 };
 
-// Utility method to retrieve a notification object by id. Warning: this will
-// check the last display service that was created. If there's a normal and an
-// incognito one, you may want to be explicit.
-base::Optional<message_center::Notification> GetNotification(
-    const std::string& id) {
-  return NotificationDisplayServiceTester::Get()->GetNotification(id);
+// Utility method to retrieve a message center.
+message_center::MessageCenter* GetMessageCenter() {
+  return message_center::MessageCenter::Get();
 }
 
-// Waits for a notification to be updated/added on |display_service|.
-void WaitForDownloadNotificationForDisplayService(
-    NotificationDisplayServiceTester* display_service) {
-  base::RunLoop run_loop;
-  display_service->SetNotificationAddedClosure(base::BindRepeating(
-      [](base::RunLoop* run_loop) { run_loop->Quit(); }, &run_loop));
-  run_loop.Run();
-  display_service->SetNotificationAddedClosure(base::RepeatingClosure());
+// Utility method to retrieve a notification object by id.
+message_center::Notification* GetNotification(const std::string& id) {
+  return GetMessageCenter()->FindVisibleNotificationById(id);
 }
 
 }  // anonnymous namespace
@@ -110,19 +274,17 @@
 // Base class for tests
 class DownloadNotificationTestBase : public InProcessBrowserTest {
  public:
-  DownloadNotificationTestBase() = default;
-  ~DownloadNotificationTestBase() override = default;
+  ~DownloadNotificationTestBase() override {}
 
   void SetUpOnMainThread() override {
     ASSERT_TRUE(embedded_test_server()->Start());
 
-    display_service_ = std::make_unique<NotificationDisplayServiceTester>(
-        browser()->profile());
-
     content::BrowserThread::PostTask(
         content::BrowserThread::IO, FROM_HERE,
         base::BindOnce(&net::URLRequestSlowDownloadJob::AddUrlHandler));
 
+    GetMessageCenter()->DisableTimersForTest();
+
     ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir());
     ASSERT_TRUE(SetDownloadsDirectory(browser()));
   }
@@ -148,24 +310,9 @@
     return content::BrowserContext::GetDownloadManager(browser->profile());
   }
 
-  // Requests to complete the download and wait for it.
-  void CompleteTheDownload(size_t wait_count = 1u) {
-    content::DownloadTestObserverTerminal download_terminal_observer(
-        GetDownloadManager(browser()), wait_count,
-        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
-    ui_test_utils::NavigateToURL(
-        browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
-    download_terminal_observer.WaitForFinished();
-  }
-
-  std::unique_ptr<NotificationDisplayServiceTester> display_service_;
-  std::unique_ptr<NotificationDisplayServiceTester> incognito_display_service_;
-
+ private:
   // Location of the downloads directory for these tests
   base::ScopedTempDir downloads_directory_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DownloadNotificationTestBase);
 };
 
 //////////////////////////////////////////////////
@@ -174,8 +321,7 @@
 
 class DownloadNotificationTest : public DownloadNotificationTestBase {
  public:
-  DownloadNotificationTest() = default;
-  ~DownloadNotificationTest() override = default;
+  ~DownloadNotificationTest() override {}
 
   void SetUpOnMainThread() override {
     Profile* profile = browser()->profile();
@@ -208,10 +354,6 @@
     DownloadCoreServiceFactory::GetForBrowserContext(incognito_profile)
         ->SetDownloadManagerDelegateForTesting(
             std::move(incognito_test_delegate));
-
-    incognito_display_service_ =
-        std::make_unique<NotificationDisplayServiceTester>(
-            incognito_browser()->profile());
   }
 
   TestChromeDownloadManagerDelegate* GetIncognitoDownloadManagerDelegate()
@@ -228,34 +370,23 @@
         GURL(net::URLRequestSlowDownloadJob::kKnownSizeUrl));
   }
 
-  // Returns the correct display service for the given Browser. If |browser| is
-  // null, returns the service for browser().
-  NotificationDisplayServiceTester* GetDisplayServiceForBrowser(
-      Browser* browser) {
-    return (browser && browser == DownloadNotificationTest::incognito_browser())
-               ? incognito_display_service_.get()
-               : display_service_.get();
-  }
-
-  void WaitForDownloadNotification(Browser* browser = nullptr) {
-    WaitForDownloadNotificationForDisplayService(
-        GetDisplayServiceForBrowser(browser));
-  }
-
   void CreateDownloadForBrowserAndURL(Browser* browser, GURL url) {
     // Starts a download.
+    NotificationAddObserver download_start_notification_observer;
     ui_test_utils::NavigateToURL(browser, url);
+    EXPECT_TRUE(download_start_notification_observer.Wait());
 
     // Confirms that a notification is created.
-    WaitForDownloadNotification(browser);
-    auto download_notifications =
-        GetDisplayServiceForBrowser(browser)->GetDisplayedNotificationsForType(
-            NotificationHandler::Type::DOWNLOAD);
-    ASSERT_EQ(1u, download_notifications.size());
-    notification_id_ = download_notifications[0].id();
+    notification_id_ = download_start_notification_observer.notification_id();
     EXPECT_FALSE(notification_id_.empty());
     ASSERT_TRUE(notification());
 
+    // Confirms that there is only one notification.
+    message_center::NotificationList::Notifications
+        visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+    EXPECT_EQ(1u, visible_notifications.size());
+    EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id_));
+
     // Confirms that a download is also started.
     std::vector<content::DownloadItem*> downloads;
     GetDownloadManager(browser)->GetAllDownloads(&downloads);
@@ -264,42 +395,9 @@
     ASSERT_TRUE(download_item_);
   }
 
-  void CloseNotification() {
-    EXPECT_TRUE(notification());
-    display_service_->RemoveNotification(NotificationHandler::Type::DOWNLOAD,
-                                         notification_id(), true /* by_user */);
-    EXPECT_FALSE(notification());
-    EXPECT_EQ(0u, GetDownloadNotifications().size());
-  }
-
-  void VerifyDownloadState(content::DownloadItem::DownloadState state) {
-    std::vector<content::DownloadItem*> downloads;
-    GetDownloadManager(browser())->GetAllDownloads(&downloads);
-    ASSERT_EQ(1u, downloads.size());
-    EXPECT_EQ(state, downloads[0]->GetState());
-  }
-
-  void VerifyUpdatePropagatesToNotification(content::DownloadItem* item) {
-    bool notification_updated = false;
-    display_service_->SetNotificationAddedClosure(base::BindRepeating(
-        [](bool* updated) { *updated = true; }, &notification_updated));
-    item->UpdateObservers();
-    EXPECT_TRUE(notification_updated);
-    display_service_->SetNotificationAddedClosure(base::RepeatingClosure());
-  }
-
-  void InterruptTheDownload() {
-    content::DownloadTestObserverInterrupted download_interrupted_observer(
-        GetDownloadManager(browser()), 1u, /* wait_count */
-        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
-    ui_test_utils::NavigateToURL(
-        browser(), GURL(net::URLRequestSlowDownloadJob::kErrorDownloadUrl));
-    download_interrupted_observer.WaitForFinished();
-  }
-
   content::DownloadItem* download_item() const { return download_item_; }
   std::string notification_id() const { return notification_id_; }
-  base::Optional<message_center::Notification> notification() const {
+  message_center::Notification* notification() const {
     return GetNotification(notification_id_);
   }
   Browser* incognito_browser() const { return incognito_browser_; }
@@ -307,17 +405,11 @@
     return DownloadPrefs::FromDownloadManager(GetDownloadManager(browser()))->
       DownloadPath();
   }
-  std::vector<message_center::Notification> GetDownloadNotifications() {
-    return display_service_->GetDisplayedNotificationsForType(
-        NotificationHandler::Type::DOWNLOAD);
-  }
 
  private:
   content::DownloadItem* download_item_ = nullptr;
   Browser* incognito_browser_ = nullptr;
   std::string notification_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(DownloadNotificationTest);
 };
 
 IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, DownloadFile) {
@@ -326,32 +418,47 @@
   EXPECT_EQ(l10n_util::GetStringFUTF16(
                 IDS_DOWNLOAD_STATUS_IN_PROGRESS_TITLE,
                 download_item()->GetFileNameToReportUser().LossyDisplayName()),
-            notification()->title());
-  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS, notification()->type());
+            GetNotification(notification_id())->title());
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
+            GetNotification(notification_id())->type());
 
   // Confirms that the download update is delivered to the notification.
-  EXPECT_TRUE(notification());
-  VerifyUpdatePropagatesToNotification(download_item());
+  NotificationUpdateObserver download_notification_periodically_update_observer;
+  download_item()->UpdateObservers();
+  download_notification_periodically_update_observer.Wait();
 
-  CompleteTheDownload();
+  // Requests to complete the download.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
+
+  // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
+  while (download_item()->GetState() != content::DownloadItem::COMPLETE) {
+    download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
+  }
 
   // Checks strings.
-  ASSERT_TRUE(notification());
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_COMPLETE_TITLE),
-            notification()->title());
+            GetNotification(notification_id())->title());
   EXPECT_EQ(download_item()->GetFileNameToReportUser().LossyDisplayName(),
-            notification()->message());
+            GetNotification(notification_id())->message());
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
-            notification()->type());
+            GetNotification(notification_id())->type());
 
   // Confirms that there is only one notification.
-  ASSERT_EQ(1u, GetDownloadNotifications().size());
+  message_center::NotificationList::Notifications
+      visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(1u, visible_notifications.size());
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id()));
+
+  // Opens the message center.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
 
   // Try to open the downloaded item by clicking the notification.
   EXPECT_FALSE(GetDownloadManagerDelegate()->opened());
-  display_service_->SimulateClick(NotificationHandler::Type::DOWNLOAD,
-                                  notification_id(), base::nullopt,
-                                  base::nullopt);
+  GetMessageCenter()->ClickOnNotification(notification_id());
   EXPECT_TRUE(GetDownloadManagerDelegate()->opened());
 
   EXPECT_FALSE(GetNotification(notification_id()));
@@ -375,13 +482,22 @@
             download_item()->GetDangerType());
   EXPECT_TRUE(download_item()->IsDangerous());
 
-  // Clicks the "keep" button.
-  display_service_->SimulateClick(NotificationHandler::Type::DOWNLOAD,
-                                  notification_id(), 1,  // 2nd button: "Keep"
-                                  base::nullopt);
+  // Opens the message center.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
 
-  // The notification is closed and re-shown.
-  EXPECT_TRUE(notification());
+  NotificationRemoveObserver notification_close_observer;
+  NotificationAddObserver notification_add_observer;
+
+  // Cicks the "keep" button.
+  notification()->ButtonClick(1);  // 2nd button: "Keep"
+  // Clicking makes the message center closed.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_TRANSIENT);
+
+  // Confirms that the notification is closed and re-shown.
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+  notification_add_observer.Wait();
+  EXPECT_EQ(notification_id(), notification_add_observer.notification_id());
+  EXPECT_EQ(1u, GetMessageCenter()->GetVisibleNotifications().size());
 
   // Checks the download status.
   EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED,
@@ -417,23 +533,29 @@
             download_item()->GetDangerType());
   EXPECT_TRUE(download_item()->IsDangerous());
 
+  // Opens the message center.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
   // Ensures the notification exists.
-  EXPECT_TRUE(notification());
+  EXPECT_EQ(1u, GetMessageCenter()->GetVisibleNotifications().size());
+
+  NotificationRemoveObserver notification_close_observer;
 
   // Clicks the "Discard" button.
-  display_service_->SimulateClick(NotificationHandler::Type::DOWNLOAD,
-                                  notification_id(),
-                                  0,  // 1st button: "Discard"
-                                  base::nullopt);
+  notification()->ButtonClick(0);  // 1st button: "Discard"
+  // Clicking makes the message center closed.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_TRANSIENT);
 
-  EXPECT_FALSE(notification());
+  // Confirms that the notification is closed.
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+
+  // Ensures the notification has closed.
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
 
   // Wait for the download completion.
   download_terminal_observer.WaitForFinished();
 
   // Checks there is neither any download nor any notification.
-  EXPECT_FALSE(notification());
-  EXPECT_EQ(0u, GetDownloadNotifications().size());
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
   std::vector<content::DownloadItem*> downloads;
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
   EXPECT_EQ(0u, downloads.size());
@@ -455,61 +577,58 @@
   // Wait for the download completion.
   download_terminal_observer.WaitForFinished();
 
-  WaitForDownloadNotification();
-  EXPECT_FALSE(notification()->image().IsEmpty());
+  // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
+  while (GetNotification(notification_id())->image().IsEmpty()) {
+    download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
+  }
 }
 
 IN_PROC_BROWSER_TEST_F(DownloadNotificationTest,
                        CloseNotificationAfterDownload) {
   CreateDownload();
 
-  CompleteTheDownload();
+  // Requests to complete the download.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
-  CloseNotification();
+  // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
+  while (download_item()->GetState() != content::DownloadItem::COMPLETE) {
+    download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
+  }
 
-  VerifyDownloadState(content::DownloadItem::COMPLETE);
+  // Opens the message center.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
+
+  // Closes the notification.
+  NotificationRemoveObserver notification_close_observer;
+  GetMessageCenter()->RemoveNotification(notification_id(), true /* by_user */);
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
+
+  // Confirms that a download is also started.
+  std::vector<content::DownloadItem*> downloads;
+  GetDownloadManager(browser())->GetAllDownloads(&downloads);
+  EXPECT_EQ(1u, downloads.size());
+  EXPECT_EQ(content::DownloadItem::COMPLETE, downloads[0]->GetState());
 }
 
 IN_PROC_BROWSER_TEST_F(DownloadNotificationTest,
                        CloseNotificationWhileDownloading) {
   CreateDownload();
 
-  CloseNotification();
+  // Closes the notification.
+  NotificationRemoveObserver notification_close_observer;
+  GetMessageCenter()->RemoveNotification(notification_id(), true /* by_user */);
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
 
-  VerifyDownloadState(content::DownloadItem::IN_PROGRESS);
-
-  CompleteTheDownload();
-
-  EXPECT_TRUE(notification());
-}
-
-IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, InterruptDownload) {
-  CreateDownload();
-
-  InterruptTheDownload();
-
-  EXPECT_EQ(1u, GetDownloadNotifications().size());
-  ASSERT_TRUE(notification());
-
-  // Checks strings.
-  EXPECT_EQ(l10n_util::GetStringFUTF16(
-                IDS_DOWNLOAD_STATUS_DOWNLOAD_FAILED_TITLE,
-                download_item()->GetFileNameToReportUser().LossyDisplayName()),
-            notification()->title());
-  EXPECT_NE(notification()->message().find(l10n_util::GetStringFUTF16(
-                IDS_DOWNLOAD_STATUS_INTERRUPTED,
-                l10n_util::GetStringUTF16(
-                    IDS_DOWNLOAD_INTERRUPTED_DESCRIPTION_NETWORK_ERROR))),
-            std::string::npos);
-  EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
-            notification()->type());
-}
-
-IN_PROC_BROWSER_TEST_F(DownloadNotificationTest,
-                       InterruptDownloadAfterClosingNotification) {
-  CreateDownload();
-
-  CloseNotification();
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
 
   // Confirms that a download is still in progress.
   std::vector<content::DownloadItem*> downloads;
@@ -519,24 +638,116 @@
   EXPECT_EQ(content::DownloadItem::IN_PROGRESS, downloads[0]->GetState());
 
   // Installs observers before requesting the completion.
+  NotificationAddObserver download_notification_add_observer;
+  content::DownloadTestObserverTerminal download_terminal_observer(
+      download_manager,
+      1u, /* wait_count */
+      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
+
+  // Requests to complete the download and wait for it.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
+  download_terminal_observer.WaitForFinished();
+
+  // Waits that new notification.
+  download_notification_add_observer.Wait();
+
+  // Confirms that there is only one notification.
+  message_center::NotificationList::Notifications
+      visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(1u, visible_notifications.size());
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id()));
+}
+
+IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, InterruptDownload) {
+  CreateDownload();
+
+  // Installs observers before requesting.
+  NotificationUpdateObserver
+      download_notification_update_observer(notification_id());
+  content::DownloadTestObserverInterrupted download_terminal_observer(
+      GetDownloadManager(browser()),
+      1u, /* wait_count */
+      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
+
+  // Requests to fail the download and wait for it.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kErrorDownloadUrl));
+  download_terminal_observer.WaitForFinished();
+
+  // Waits that new notification.
+  download_notification_update_observer.Wait();
+
+  // Confirms that there is only one notification.
+  message_center::NotificationList::Notifications
+      visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(1u, visible_notifications.size());
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id()));
+
+  // Checks strings.
+  EXPECT_EQ(l10n_util::GetStringFUTF16(
+                IDS_DOWNLOAD_STATUS_DOWNLOAD_FAILED_TITLE,
+                download_item()->GetFileNameToReportUser().LossyDisplayName()),
+            GetNotification(notification_id())->title());
+  EXPECT_NE(GetNotification(notification_id())->message().find(
+                l10n_util::GetStringFUTF16(
+                    IDS_DOWNLOAD_STATUS_INTERRUPTED,
+                    l10n_util::GetStringUTF16(
+                        IDS_DOWNLOAD_INTERRUPTED_DESCRIPTION_NETWORK_ERROR))),
+            std::string::npos);
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
+            GetNotification(notification_id())->type());
+}
+
+IN_PROC_BROWSER_TEST_F(DownloadNotificationTest,
+                       InterruptDownloadAfterClosingNotification) {
+  CreateDownload();
+
+  // Closes the notification.
+  NotificationRemoveObserver notification_close_observer;
+  GetMessageCenter()->RemoveNotification(notification_id(), true /* by_user */);
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
+
+  // Confirms that a download is still in progress.
+  std::vector<content::DownloadItem*> downloads;
+  content::DownloadManager* download_manager = GetDownloadManager(browser());
+  download_manager->GetAllDownloads(&downloads);
+  EXPECT_EQ(1u, downloads.size());
+  EXPECT_EQ(content::DownloadItem::IN_PROGRESS, downloads[0]->GetState());
+
+  // Installs observers before requesting the completion.
+  NotificationAddObserver download_notification_add_observer;
   content::DownloadTestObserverInterrupted download_terminal_observer(
       download_manager,
       1u, /* wait_count */
       content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
 
-  InterruptTheDownload();
+  // Requests to fail the download and wait for it.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kErrorDownloadUrl));
+  download_terminal_observer.WaitForFinished();
+
+  // Waits that new notification.
+  download_notification_add_observer.Wait();
 
   // Confirms that there is only one notification.
-  EXPECT_EQ(1u, GetDownloadNotifications().size());
-  ASSERT_TRUE(notification());
+  message_center::NotificationList::Notifications
+      visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(1u, visible_notifications.size());
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id()));
 }
 
 IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, DownloadRemoved) {
   CreateDownload();
 
-  EXPECT_TRUE(notification());
+  NotificationRemoveObserver notification_close_observer;
   download_item()->Remove();
-  EXPECT_FALSE(notification());
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+
+  // Confirms that the notification is removed.
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
 
   // Confirms that the download item is removed.
   std::vector<content::DownloadItem*> downloads;
@@ -549,27 +760,43 @@
   GURL url2(net::URLRequestSlowDownloadJob::kKnownSizeUrl);
 
   // Starts the 1st download.
+  NotificationAddObserver download_start_notification_observer1;
   ui_test_utils::NavigateToURL(browser(), url1);
-  WaitForDownloadNotification();
-  auto notifications = GetDownloadNotifications();
-  ASSERT_EQ(1u, notifications.size());
-  std::string notification_id1 = notifications[0].id();
+  EXPECT_TRUE(download_start_notification_observer1.Wait());
+  std::string notification_id1 =
+      download_start_notification_observer1.notification_id();
   EXPECT_FALSE(notification_id1.empty());
 
   // Confirms that there is a download.
   std::vector<content::DownloadItem*> downloads;
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
-  ASSERT_EQ(1u, downloads.size());
+  EXPECT_EQ(1u, downloads.size());
   content::DownloadItem* download1 = downloads[0];
 
-  // Starts the 2nd download.
+  // Confirms that there is a notifications.
+  message_center::NotificationList::Notifications
+      visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(1u, visible_notifications.size());
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id1));
+
+  // Confirms that there is a popup notifications.
+  message_center::NotificationList::PopupNotifications
+      popup_notifications = GetMessageCenter()->GetPopupNotifications();
+  EXPECT_EQ(1u, popup_notifications.size());
+  EXPECT_TRUE(IsInNotifications(popup_notifications, notification_id1));
+
+  // Starts the 2nd download and waits for a notification.
+  NotificationAddObserver download_start_notification_observer2(2);
   ui_test_utils::NavigateToURL(browser(), url2);
-  WaitForDownloadNotification();
+  // 2 notifications should be added. One is for new download (url2), and the
+  // other one is for reshowing the existing download (url1) as a low-priority
+  // notification.
+  EXPECT_TRUE(download_start_notification_observer2.Wait());
 
   // Confirms that there are 2 downloads.
   downloads.clear();
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
-  ASSERT_EQ(2u, downloads.size());
+  EXPECT_EQ(2u, downloads.size());
   content::DownloadItem* download2;
   if (download1 == downloads[0])
     download2 = downloads[1];
@@ -579,18 +806,31 @@
     NOTREACHED();
   EXPECT_NE(download1, download2);
 
-  notifications = GetDownloadNotifications();
   // Confirms that there are 2 notifications.
-  EXPECT_EQ(2u, notifications.size());
+  visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(2u, visible_notifications.size());
 
   std::string notification_id2;
-  for (const auto& notification : notifications) {
-    if (notification.id() == notification_id1)
+  for (auto* notification : visible_notifications) {
+    if (notification->id() == notification_id1) {
       continue;
-
-    notification_id2 = notification.id();
+    } else if (notification->type() ==
+               message_center::NOTIFICATION_TYPE_PROGRESS) {
+      notification_id2 = (notification->id());
+    }
   }
-  EXPECT_FALSE(notification_id2.empty());
+  EXPECT_TRUE(!notification_id2.empty());
+
+  // Confirms that the both notifications are visible either as popup or in the
+  // message center.
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id1));
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id2));
+
+  // Confirms that the new one is popup, and the old one is not.
+  popup_notifications = GetMessageCenter()->GetPopupNotifications();
+  EXPECT_EQ(1u, popup_notifications.size());
+  EXPECT_FALSE(IsInNotifications(popup_notifications, notification_id1));
+  EXPECT_TRUE(IsInNotifications(popup_notifications, notification_id2));
 
   // Confirms that the old one is low priority, and the new one is default.
   const int in_progress_priority1 =
@@ -602,23 +842,39 @@
 
   // Confirms that the updates of both download are delivered to the
   // notifications.
-  VerifyUpdatePropagatesToNotification(download1);
-  VerifyUpdatePropagatesToNotification(download2);
-
-  // Confirms the correct type of notification while download is in progress.
-  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
-            GetNotification(notification_id1)->type());
-  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
-            GetNotification(notification_id2)->type());
+  NotificationUpdateObserver
+      notification_periodically_update_observer1(notification_id1);
+  download1->UpdateObservers();
+  notification_periodically_update_observer1.Wait();
+  NotificationUpdateObserver
+      notification_periodically_update_observer2(notification_id2);
+  download2->UpdateObservers();
+  notification_periodically_update_observer2.Wait();
 
   // Requests to complete the downloads.
-  CompleteTheDownload(2);
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
-  // Confirms that the both notifications are visible.
-  notifications = GetDownloadNotifications();
-  EXPECT_EQ(2u, notifications.size());
-  ASSERT_TRUE(GetNotification(notification_id1));
-  ASSERT_TRUE(GetNotification(notification_id2));
+  // Waits for the completion of downloads.
+  NotificationUpdateObserver download_change_notification_observer;
+  while (download1->GetState() != content::DownloadItem::COMPLETE ||
+         download2->GetState() != content::DownloadItem::COMPLETE) {
+    download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
+  }
+
+  // Confirms that the both notifications are visible either as popup or in the
+  // message center.
+  visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(2u, visible_notifications.size());
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id1));
+  EXPECT_TRUE(IsInNotifications(visible_notifications, notification_id2));
+
+  // Confirms that the both are popup'd.
+  popup_notifications = GetMessageCenter()->GetPopupNotifications();
+  EXPECT_EQ(2u, popup_notifications.size());
+  EXPECT_TRUE(IsInNotifications(popup_notifications, notification_id1));
+  EXPECT_TRUE(IsInNotifications(popup_notifications, notification_id2));
 
   // Confirms that both increase in priority when finished.
   EXPECT_GT(GetNotification(notification_id1)->priority(),
@@ -637,58 +893,95 @@
                        DownloadMultipleFilesOneByOne) {
   CreateDownload();
   content::DownloadItem* first_download_item = download_item();
+  content::DownloadItem* second_download_item = nullptr;
   std::string first_notification_id = notification_id();
+  std::string second_notification_id;
 
-  CompleteTheDownload();
+  // Requests to complete the first download.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
+
+  // Waits for completion of the first download.
+  NotificationUpdateObserver
+      download_change_notification_observer1(first_notification_id);
+  while (first_download_item->GetState() != content::DownloadItem::COMPLETE) {
+    download_change_notification_observer1.Wait();
+    download_change_notification_observer1.Reset();
+  }
   EXPECT_EQ(content::DownloadItem::COMPLETE, first_download_item->GetState());
 
   // Checks the message center.
-  EXPECT_TRUE(notification());
+  EXPECT_EQ(1u, GetMessageCenter()->GetVisibleNotifications().size());
 
   // Starts the second download.
   GURL url(net::URLRequestSlowDownloadJob::kKnownSizeUrl);
+  NotificationAddObserver download_start_notification_observer;
   ui_test_utils::NavigateToURL(browser(), url);
-  WaitForDownloadNotification();
+  EXPECT_TRUE(download_start_notification_observer.Wait());
 
   // Confirms that the second notification is created.
-  auto notifications = GetDownloadNotifications();
-  ASSERT_EQ(2u, notifications.size());
-  std::string second_notification_id =
-      notifications[(notifications[0].id() == notification_id() ? 1 : 0)].id();
+  second_notification_id =
+      download_start_notification_observer.notification_id();
   EXPECT_FALSE(second_notification_id.empty());
   ASSERT_TRUE(GetNotification(second_notification_id));
 
+  // Confirms that there are two notifications, including the second
+  // notification.
+  message_center::NotificationList::Notifications
+      visible_notifications = GetMessageCenter()->GetVisibleNotifications();
+  EXPECT_EQ(2u, visible_notifications.size());
+  EXPECT_TRUE(IsInNotifications(visible_notifications, first_notification_id));
+  EXPECT_TRUE(IsInNotifications(visible_notifications, second_notification_id));
+
   // Confirms that the second download is also started.
   std::vector<content::DownloadItem*> downloads;
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
   EXPECT_EQ(2u, downloads.size());
   EXPECT_TRUE(first_download_item == downloads[0] ||
               first_download_item == downloads[1]);
-  content::DownloadItem* second_download_item =
-      downloads[first_download_item == downloads[0] ? 1 : 0];
+  // Stores the second download.
+  if (first_download_item == downloads[0])
+    second_download_item = downloads[1];
+  else
+    second_download_item = downloads[0];
 
   EXPECT_EQ(content::DownloadItem::IN_PROGRESS,
             second_download_item->GetState());
 
   // Requests to complete the second download.
-  CompleteTheDownload();
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
-  EXPECT_EQ(2u, GetDownloadNotifications().size());
+  // Waits for completion of the second download.
+  NotificationUpdateObserver
+      download_change_notification_observer2(second_notification_id);
+  while (second_download_item->GetState() != content::DownloadItem::COMPLETE) {
+    download_change_notification_observer2.Wait();
+    download_change_notification_observer2.Reset();
+  }
+
+  // Opens the message center.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
+  // Checks the message center.
+  EXPECT_EQ(2u, GetMessageCenter()->GetVisibleNotifications().size());
 }
 
 IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, CancelDownload) {
   CreateDownload();
 
-  // Cancels the notification by clicking the "cancel" button.
-  display_service_->SimulateClick(NotificationHandler::Type::DOWNLOAD,
-                                  notification_id(), 1, base::nullopt);
-  EXPECT_FALSE(notification());
-  EXPECT_EQ(0u, GetDownloadNotifications().size());
+  // Opens the message center.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
 
-  // Confirms that the download is cancelled.
+  // Cancels the notification by clicking the "cancel' button.
+  NotificationRemoveObserver notification_close_observer;
+  notification()->ButtonClick(1);
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
+
+  // Confirms that a download is also cancelled.
   std::vector<content::DownloadItem*> downloads;
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
-  ASSERT_EQ(1u, downloads.size());
+  EXPECT_EQ(1u, downloads.size());
   EXPECT_EQ(content::DownloadItem::CANCELLED, downloads[0]->GetState());
 }
 
@@ -696,12 +989,30 @@
                        DownloadCancelledByUserExternally) {
   CreateDownload();
 
-  // Cancels the notification through the DownloadItem.
+  // Cancels the notification by clicking the "cancel' button.
+  NotificationRemoveObserver notification_close_observer;
   download_item()->Cancel(true /* by_user */);
-  EXPECT_FALSE(notification());
-  EXPECT_EQ(0u, GetDownloadNotifications().size());
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
 
-  // Confirms that the download is cancelled.
+  // Confirms that a download is also cancelled.
+  std::vector<content::DownloadItem*> downloads;
+  GetDownloadManager(browser())->GetAllDownloads(&downloads);
+  EXPECT_EQ(1u, downloads.size());
+  EXPECT_EQ(content::DownloadItem::CANCELLED, downloads[0]->GetState());
+}
+
+IN_PROC_BROWSER_TEST_F(DownloadNotificationTest,
+                       DownloadCancelledExternally) {
+  CreateDownload();
+
+  // Cancels the notification by clicking the "cancel' button.
+  NotificationRemoveObserver notification_close_observer;
+  download_item()->Cancel(false /* by_user */);
+  EXPECT_EQ(notification_id(), notification_close_observer.Wait());
+  EXPECT_EQ(0u, GetMessageCenter()->GetVisibleNotifications().size());
+
+  // Confirms that a download is also cancelled.
   std::vector<content::DownloadItem*> downloads;
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
   EXPECT_EQ(1u, downloads.size());
@@ -719,36 +1030,41 @@
   EXPECT_EQ(l10n_util::GetStringFUTF16(
                 IDS_DOWNLOAD_STATUS_IN_PROGRESS_TITLE,
                 download_item()->GetFileNameToReportUser().LossyDisplayName()),
-            notification()->title());
-  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS, notification()->type());
+            GetNotification(notification_id())->title());
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
+            GetNotification(notification_id())->type());
   EXPECT_TRUE(download_item()->GetBrowserContext()->IsOffTheRecord());
 
   // Requests to complete the download.
-  content::DownloadTestObserverTerminal download_terminal_observer(
-      GetDownloadManager(incognito_browser()), 1,
-      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
   ui_test_utils::NavigateToURL(
       incognito_browser(),
       GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
-  download_terminal_observer.WaitForFinished();
+
+  // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
+  while (download_item()->GetState() != content::DownloadItem::COMPLETE) {
+    download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
+  }
 
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_COMPLETE_TITLE),
-            notification()->title());
+            GetNotification(notification_id())->title());
   EXPECT_EQ(download_item()->GetFileNameToReportUser().LossyDisplayName(),
-            notification()->message());
+            GetNotification(notification_id())->message());
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
-            notification()->type());
+            GetNotification(notification_id())->type());
+
+  // Opens the message center.
+  GetMessageCenter()->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
 
   // Try to open the downloaded item by clicking the notification.
-  EXPECT_TRUE(incognito_display_service_->GetNotification(notification_id()));
   EXPECT_FALSE(GetIncognitoDownloadManagerDelegate()->opened());
-  incognito_display_service_->SimulateClick(NotificationHandler::Type::DOWNLOAD,
-                                            notification_id(), base::nullopt,
-                                            base::nullopt);
+  GetMessageCenter()->ClickOnNotification(notification_id());
   EXPECT_TRUE(GetIncognitoDownloadManagerDelegate()->opened());
   EXPECT_FALSE(GetDownloadManagerDelegate()->opened());
 
-  EXPECT_FALSE(incognito_display_service_->GetNotification(notification_id()));
+  EXPECT_FALSE(GetNotification(notification_id()));
   chrome::CloseWindow(incognito_browser());
 }
 
@@ -760,13 +1076,11 @@
   GURL url_normal(net::URLRequestSlowDownloadJob::kKnownSizeUrl);
 
   // Starts the incognito download.
+  NotificationAddObserver download_start_notification_observer1;
   ui_test_utils::NavigateToURL(incognito_browser(), url_incognito);
-  WaitForDownloadNotification(incognito_browser());
-  auto incognito_notifications =
-      incognito_display_service_->GetDisplayedNotificationsForType(
-          NotificationHandler::Type::DOWNLOAD);
-  ASSERT_EQ(1u, incognito_notifications.size());
-  std::string notification_id1 = incognito_notifications[0].id();
+  EXPECT_TRUE(download_start_notification_observer1.Wait());
+  std::string notification_id1 =
+      download_start_notification_observer1.notification_id();
   EXPECT_FALSE(notification_id1.empty());
 
   // Confirms that there is a download.
@@ -779,11 +1093,11 @@
   content::DownloadItem* download_incognito = downloads[0];
 
   // Starts the normal download.
+  NotificationAddObserver download_start_notification_observer2;
   ui_test_utils::NavigateToURL(browser(), url_normal);
-  WaitForDownloadNotification();
-  auto normal_notifications = GetDownloadNotifications();
-  ASSERT_EQ(1u, normal_notifications.size());
-  std::string notification_id2 = normal_notifications[0].id();
+  EXPECT_TRUE(download_start_notification_observer2.Wait());
+  std::string notification_id2 =
+      download_start_notification_observer2.notification_id();
   EXPECT_FALSE(notification_id2.empty());
 
   // Confirms that there are 2 downloads.
@@ -798,34 +1112,33 @@
   EXPECT_EQ(download_incognito, downloads[0]);
 
   // Confirms the types of download notifications are correct.
-  auto incognito_notification =
-      incognito_display_service_->GetNotification(notification_id1);
-  ASSERT_TRUE(incognito_notification);
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
-            incognito_notification->type());
-  EXPECT_EQ(-1, incognito_notification->progress());
-
-  auto normal_notification =
-      display_service_->GetNotification(notification_id2);
-  ASSERT_TRUE(normal_notification);
+            GetNotification(notification_id1)->type());
+  EXPECT_EQ(-1, GetNotification(notification_id1)->progress());
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
-            normal_notification->type());
-  EXPECT_LE(0, normal_notification->progress());
+            GetNotification(notification_id2)->type());
+  EXPECT_LE(0, GetNotification(notification_id2)->progress());
 
   EXPECT_TRUE(download_incognito->GetBrowserContext()->IsOffTheRecord());
   EXPECT_FALSE(download_normal->GetBrowserContext()->IsOffTheRecord());
 
-  // Request to complete the normal download.
-  CompleteTheDownload();
+  // Requests to complete the downloads.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
+
+  // Waits for the completion of downloads.
+  NotificationUpdateObserver download_change_notification_observer;
+  while (download_normal->GetState() != content::DownloadItem::COMPLETE ||
+         download_incognito->GetState() != content::DownloadItem::COMPLETE) {
+    download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
+  }
 
   // Confirms the types of download notifications are correct.
-  incognito_notification =
-      incognito_display_service_->GetNotification(notification_id1);
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
-            incognito_notification->type());
-  normal_notification = display_service_->GetNotification(notification_id2);
+            GetNotification(notification_id1)->type());
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
-            normal_notification->type());
+            GetNotification(notification_id2)->type());
 
   chrome::CloseWindow(incognito_browser());
 }
@@ -837,8 +1150,7 @@
 class MultiProfileDownloadNotificationTest
     : public DownloadNotificationTestBase {
  public:
-  MultiProfileDownloadNotificationTest() = default;
-  ~MultiProfileDownloadNotificationTest() override = default;
+  ~MultiProfileDownloadNotificationTest() override {}
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     DownloadNotificationTestBase::SetUpCommandLine(command_line);
@@ -885,12 +1197,6 @@
         chromeos::ProfileHelper::GetProfileByUserIdHashForTest(info.hash))
         ->SetAuthenticatedAccountInfo(info.gaia_id, info.email);
   }
-
-  std::unique_ptr<NotificationDisplayServiceTester> display_service1_;
-  std::unique_ptr<NotificationDisplayServiceTester> display_service2_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MultiProfileDownloadNotificationTest);
 };
 
 IN_PROC_BROWSER_TEST_F(MultiProfileDownloadNotificationTest,
@@ -910,14 +1216,10 @@
   Browser* browser2 = CreateBrowser(profile2);
   EXPECT_NE(browser1, browser2);
 
-  display_service1_ =
-      std::make_unique<NotificationDisplayServiceTester>(profile1);
-  display_service2_ =
-      std::make_unique<NotificationDisplayServiceTester>(profile2);
-
   // First user starts a download.
+  NotificationAddObserver download_start_notification_observer1;
   ui_test_utils::NavigateToURL(browser1, url);
-  WaitForDownloadNotificationForDisplayService(display_service1_.get());
+  download_start_notification_observer1.Wait();
 
   // Confirms that the download is started.
   std::vector<content::DownloadItem*> downloads;
@@ -926,20 +1228,17 @@
   content::DownloadItem* download1 = downloads[0];
 
   // Confirms that a download notification is generated.
-  auto notifications1 = display_service1_->GetDisplayedNotificationsForType(
-      NotificationHandler::Type::DOWNLOAD);
-  ASSERT_EQ(1u, notifications1.size());
-  std::string notification_id_user1 = notifications1[0].id();
+  std::string notification_id_user1 =
+      download_start_notification_observer1.notification_id();
   EXPECT_FALSE(notification_id_user1.empty());
 
   // Second user starts a download.
+  NotificationAddObserver download_start_notification_observer2;
   ui_test_utils::NavigateToURL(browser2, url);
-  WaitForDownloadNotificationForDisplayService(display_service2_.get());
-  auto notifications2 = display_service2_->GetDisplayedNotificationsForType(
-      NotificationHandler::Type::DOWNLOAD);
-  ASSERT_EQ(1u, notifications2.size());
-  std::string notification_id_user2 = notifications2[0].id();
-  EXPECT_FALSE(notification_id_user2.empty());
+  download_start_notification_observer2.Wait();
+  std::string notification_id_user2_1 =
+      download_start_notification_observer2.notification_id();
+  EXPECT_FALSE(notification_id_user2_1.empty());
 
   // Confirms that the second user has only 1 download.
   downloads.clear();
@@ -947,11 +1246,12 @@
   ASSERT_EQ(1u, downloads.size());
 
   // Second user starts another download.
+  NotificationAddObserver download_start_notification_observer3;
   ui_test_utils::NavigateToURL(browser2, url);
-  WaitForDownloadNotificationForDisplayService(display_service2_.get());
-  notifications2 = display_service2_->GetDisplayedNotificationsForType(
-      NotificationHandler::Type::DOWNLOAD);
-  ASSERT_EQ(2u, notifications2.size());
+  download_start_notification_observer3.Wait();
+  std::string notification_id_user2_2 =
+      download_start_notification_observer3.notification_id();
+  EXPECT_FALSE(notification_id_user2_2.empty());
 
   // Confirms that the second user has 2 downloads.
   downloads.clear();
@@ -972,41 +1272,39 @@
   // Confirms the types of download notifications are correct.
   // Normal notification for user1.
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
-            display_service1_->GetNotification(notification_id_user1)->type());
-  EXPECT_EQ(
-      -1,
-      display_service1_->GetNotification(notification_id_user1)->progress());
-  // Normal notifications for user2.
-  notifications2 = display_service2_->GetDisplayedNotificationsForType(
-      NotificationHandler::Type::DOWNLOAD);
-  EXPECT_EQ(2u, notifications2.size());
-  for (const auto& notification : notifications2) {
-    EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS, notification.type());
-    EXPECT_EQ(-1, notification.progress());
-  }
+            GetNotification(notification_id_user1)->type());
+  EXPECT_EQ(-1, GetNotification(notification_id_user1)->progress());
+  // Normal notification for user2.
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
+            GetNotification(notification_id_user2_1)->type());
+  EXPECT_EQ(-1, GetNotification(notification_id_user2_1)->progress());
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_PROGRESS,
+            GetNotification(notification_id_user2_2)->type());
+  EXPECT_EQ(-1, GetNotification(notification_id_user2_2)->progress());
 
   // Requests to complete the downloads.
-  content::DownloadTestObserverTerminal download_terminal_observer(
-      GetDownloadManager(browser1), 1u /* wait_count */,
-      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
-  content::DownloadTestObserverTerminal download_terminal_observer2(
-      GetDownloadManager(browser2), 2u /* wait_count */,
-      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
+  NotificationUpdateObserver download_change_notification_observer;
   ui_test_utils::NavigateToURL(
-      browser1, GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
-  ui_test_utils::NavigateToURL(
-      browser2, GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
-  download_terminal_observer.WaitForFinished();
-  download_terminal_observer2.WaitForFinished();
+      browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
+
+  // Waits for the completion of downloads.
+  while (download1->GetState() != content::DownloadItem::COMPLETE ||
+         download2->GetState() != content::DownloadItem::COMPLETE ||
+         download3->GetState() != content::DownloadItem::COMPLETE) {
+    // Requests again, since sometimes the request may fail.
+    ui_test_utils::NavigateToURL(
+        browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
+    download_change_notification_observer.Wait();
+  }
 
   // Confirms the types of download notifications are correct.
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
-            display_service1_->GetNotification(notification_id_user1)->type());
-  notifications2 = display_service2_->GetDisplayedNotificationsForType(
-      NotificationHandler::Type::DOWNLOAD);
-  EXPECT_EQ(2u, notifications2.size());
-  for (const auto& notification : notifications2) {
-    EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
-              notification.type());
-  }
+            GetNotification(notification_id_user1)->type());
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
+            GetNotification(notification_id_user2_1)->type());
+  // Normal notifications for user2.
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
+            GetNotification(notification_id_user2_1)->type());
+  EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
+            GetNotification(notification_id_user2_2)->type());
 }
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
index d2a853e..30a98c0c 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
@@ -134,16 +134,23 @@
   }
 
   // Open an extension popup via the chrome.browserAction.openPopup API.
+  // If |will_reply| is true, then the listener is responsible for having a
+  // test message listener that replies to the extension. Otherwise, this
+  // method will create a listener and reply to the extension before returning
+  // to avoid leaking an API function while waiting for a reply.
   void OpenPopupViaAPI(bool will_reply) {
     // Setup the notification observer to wait for the popup to finish loading.
     content::WindowedNotificationObserver frame_observer(
         content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
         content::NotificationService::AllSources());
-    ExtensionTestMessageListener listener("ready", will_reply);
+    std::unique_ptr<ExtensionTestMessageListener> listener;
+    if (!will_reply)
+      listener = std::make_unique<ExtensionTestMessageListener>("ready", false);
     // Show first popup in first window and expect it to have loaded.
     ASSERT_TRUE(RunExtensionSubtest("browser_action/open_popup",
                                     "open_popup_succeeds.html")) << message_;
-    EXPECT_TRUE(listener.WaitUntilSatisfied());
+    if (listener)
+      EXPECT_TRUE(listener->WaitUntilSatisfied());
     frame_observer.Wait();
     EnsurePopupActive();
   }
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn
index 8f58165a..e0054252 100644
--- a/chrome/browser/media/router/BUILD.gn
+++ b/chrome/browser/media/router/BUILD.gn
@@ -64,6 +64,7 @@
       "discovery",
       "//extensions/browser",
       "//mojo/public/cpp/bindings",
+      "//ui/base:ui_features",
     ]
     sources += [
       "event_page_request_manager.cc",
diff --git a/chrome/browser/media/router/media_router_feature.cc b/chrome/browser/media/router/media_router_feature.cc
index 8688d38..6d543450 100644
--- a/chrome/browser/media/router/media_router_feature.cc
+++ b/chrome/browser/media/router/media_router_feature.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_context.h"
 #include "extensions/features/features.h"
+#include "ui/base/ui_features.h"
 
 #if defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/common/pref_names.h"
@@ -66,6 +67,16 @@
 bool CastLocalMediaEnabled() {
   return base::FeatureList::IsEnabled(kEnableCastLocalMedia);
 }
+
+// Returns true if the presentation receiver window for local media casting is
+// available on the current platform.
+bool PresentationReceiverWindowEnabled() {
+#if defined(OS_MACOSX) && !BUILDFLAG(MAC_VIEWS_BROWSER)
+  return false;
+#else
+  return true;
+#endif
+}
 #endif
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/media_router_feature.h b/chrome/browser/media/router/media_router_feature.h
index 45ac8a9..8f11622 100644
--- a/chrome/browser/media/router/media_router_feature.h
+++ b/chrome/browser/media/router/media_router_feature.h
@@ -31,6 +31,11 @@
 // Returns true if local media casting is enabled.
 bool CastLocalMediaEnabled();
 
+// Returns true if the presentation receiver window for local media casting is
+// available on the current platform.
+// TODO(crbug.com/802332): Remove this when mac_views_browser=1 by default.
+bool PresentationReceiverWindowEnabled();
+
 #endif
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
index 65ccec4..aa89c85 100644
--- a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
+++ b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
@@ -10,7 +10,7 @@
 #include <vector>
 
 #include "base/i18n/number_formatting.h"
-#include "build/build_config.h"
+#include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver.h"
 #include "chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -83,12 +83,14 @@
     : binding_(this, std::move(request)),
       media_router_(std::move(media_router)),
       profile_(profile) {
-  display::Screen::GetScreen()->AddObserver(this);
+  if (PresentationReceiverWindowEnabled())
+    display::Screen::GetScreen()->AddObserver(this);
   ReportSinkAvailability(GetSinks());
 }
 
 WiredDisplayMediaRouteProvider::~WiredDisplayMediaRouteProvider() {
-  display::Screen::GetScreen()->RemoveObserver(this);
+  if (PresentationReceiverWindowEnabled())
+    display::Screen::GetScreen()->RemoveObserver(this);
 }
 
 void WiredDisplayMediaRouteProvider::CreateRoute(
@@ -100,12 +102,6 @@
     base::TimeDelta timeout,
     bool incognito,
     CreateRouteCallback callback) {
-#if defined(OS_MACOSX)
-  // TODO(https://crbug.com/777654): Support presenting to macOS as well.
-  std::move(callback).Run(base::nullopt, std::string("Not implemented"),
-                          RouteRequestResult::UNKNOWN_ERROR);
-  return;
-#endif
   DCHECK(!base::ContainsKey(presentations_, presentation_id));
   base::Optional<Display> display = GetDisplayBySinkId(sink_id);
   if (!display) {
@@ -288,6 +284,8 @@
 }
 
 std::vector<Display> WiredDisplayMediaRouteProvider::GetAllDisplays() const {
+  if (!PresentationReceiverWindowEnabled())
+    return {};
   return display::Screen::GetScreen()->GetAllDisplays();
 }
 
diff --git a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider_unittest.cc b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider_unittest.cc
index da1f69b..08785d6 100644
--- a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider_unittest.cc
+++ b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider_unittest.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.h"
 
 #include "base/run_loop.h"
-#include "build/build_config.h"
 #include "chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver.h"
 #include "chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.h"
 #include "chrome/browser/media/router/test/mock_mojo_media_router.h"
@@ -278,8 +277,6 @@
   base::RunLoop().RunUntilIdle();
 }
 
-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
-// TODO(https://crbug.com/777654): Support presenting to macOS as well.
 TEST_F(WiredDisplayMediaRouteProviderTest, CreateAndTerminateRoute) {
   const std::string presentation_id = "presentationId";
   MockCallback callback;
@@ -337,6 +334,5 @@
                                        kPresentationSource, IsEmpty()));
   receiver_creator_.receiver()->RunTerminationCallback();
 }
-#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc b/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc
index 92240399..b0b52a4 100644
--- a/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc
+++ b/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc
@@ -6,11 +6,8 @@
 
 #include <utility>
 
-#include "build/build_config.h"
-
-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
+#include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/ui/media_router/presentation_receiver_window_controller.h"
-#endif
 
 namespace media_router {
 
@@ -28,19 +25,15 @@
     const gfx::Rect& bounds,
     base::OnceClosure termination_callback,
     base::RepeatingCallback<void(const std::string&)> title_change_callback) {
-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
   if (GetInstance()->create_receiver_for_testing_) {
     return GetInstance()->create_receiver_for_testing_.Run(
         profile, bounds, std::move(termination_callback),
         std::move(title_change_callback));
   }
+  CHECK(PresentationReceiverWindowEnabled());
   return PresentationReceiverWindowController::CreateFromOriginalProfile(
       profile, bounds, std::move(termination_callback),
       std::move(title_change_callback));
-#else
-  // TODO(https://crbug.com/777654): Support presenting to macOS as well.
-  return nullptr;
-#endif
 }
 
 // static
diff --git a/chrome/browser/net/load_timing_browsertest.cc b/chrome/browser/net/load_timing_browsertest.cc
index a892c8f..e98dedda 100644
--- a/chrome/browser/net/load_timing_browsertest.cc
+++ b/chrome/browser/net/load_timing_browsertest.cc
@@ -7,27 +7,24 @@
 
 #include "base/bind.h"
 #include "base/compiler_specific.h"
-#include "base/files/file_path.h"
 #include "base/location.h"
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/path_service.h"
 #include "base/single_thread_task_runner.h"
-#include "base/strings/stringprintf.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "chrome/browser/net/profile_network_context_service.h"
+#include "chrome/browser/net/profile_network_context_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/prefs/pref_service.h"
+#include "components/proxy_config/proxy_config_dictionary.h"
+#include "components/proxy_config/proxy_config_pref_names.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/browser_test_utils.h"
-#include "net/base/load_timing_info.h"
 #include "net/test/spawned_test_server/spawned_test_server.h"
-#include "net/url_request/url_request_file_job.h"
-#include "net/url_request/url_request_filter.h"
-#include "net/url_request/url_request_interceptor.h"
 #include "url/gurl.h"
 
 // This file tests that net::LoadTimingInfo is correctly hooked up to the
@@ -35,236 +32,20 @@
 // spread across multiple projects, so is somewhat arbitrarily put in
 // chrome/browser/net.
 
-using content::BrowserThread;
-
 namespace {
 
-const char kTestDomain[] = "test.com";
-const char kTestUrl[] = "http://test.com/";
-
-// Relative times need to be used because:
-// 1)  ExecuteScriptAndExtractInt does not support 64-bit integers.
-// 2)  Times for tests are set before the request has been started, but need to
-//     be set relative to the start time.
-//
-// Since some tests need to test negative time deltas (preconnected sockets)
-// and others need to test NULL times (events that don't apply), this class has
-// to be able to handle all cases:  positive deltas, negative deltas, no
-// delta, and null times.
-class RelativeTime {
- public:
-  // Constructor for null RelativeTimes.
-  RelativeTime() : is_null_(true) {
-  }
-
-  // Constructor for non-null RelativeTimes.
-  explicit RelativeTime(int delta_ms)
-      : is_null_(false),
-        delta_(base::TimeDelta::FromMilliseconds(delta_ms)) {
-  }
-
-  // Given a base time, returns the TimeTicks |this| identifies.
-  base::TimeTicks ToTimeTicks(base::TimeTicks base_time) const {
-    if (is_null_)
-      return base::TimeTicks();
-    return base_time + delta_;
-  }
-
-  bool is_null() const { return is_null_; }
-
-  base::TimeDelta GetDelta() const {
-    // This allows tests to compare times that shouldn't be null without
-    // explicitly null-testing them all first.
-    EXPECT_FALSE(is_null_);
-    return delta_;
-  }
-
- private:
-  bool is_null_;
-
-  // Must be 0 when |is_null| is true.
-  base::TimeDelta delta_;
-
-  // This class is copyable and assignable.
-};
-
-// Structure used for both setting the LoadTimingInfo used by mock requests
-// and for times retrieved from the renderer process.
-//
-// Times used for mock requests are all expressed as TimeDeltas relative to
-// when the Job starts.  Null RelativeTimes correspond to null TimeTicks().
-//
-// Times read from the renderer are expressed relative to fetchStart (Which is
-// not the same as request_start).  Null RelativeTimes correspond to times that
-// either cannot be retrieved (proxy times, send end) or times that are 0 (SSL
-// time when no new SSL connection was established).
+// Structure used for retrieved from the renderer process.
+// These are milliseconds after fetch start, or -1 if not
+// present
 struct TimingDeltas {
-  RelativeTime proxy_resolve_start;
-  RelativeTime proxy_resolve_end;
-  RelativeTime dns_start;
-  RelativeTime dns_end;
-  RelativeTime connect_start;
-  RelativeTime ssl_start;
-  RelativeTime connect_end;
-  RelativeTime send_start;
-  RelativeTime send_end;
-
-  // Must be non-negative and greater than all other times.  May only be null if
-  // all other times are as well.
-  RelativeTime receive_headers_end;
-};
-
-// Mock UrlRequestJob that returns the contents of a specified file and
-// provides the specified load timing information when queried.
-class MockUrlRequestJobWithTiming : public net::URLRequestFileJob {
- public:
-  MockUrlRequestJobWithTiming(net::URLRequest* request,
-                              net::NetworkDelegate* network_delegate,
-                              const base::FilePath& path,
-                              const TimingDeltas& load_timing_deltas)
-      : net::URLRequestFileJob(
-            request,
-            network_delegate,
-            path,
-            base::CreateTaskRunnerWithTraits(
-                {base::MayBlock(), base::TaskPriority::BACKGROUND,
-                 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
-        load_timing_deltas_(load_timing_deltas),
-        weak_factory_(this) {}
-
-  // net::URLRequestFileJob implementation:
-  void Start() override {
-    base::TimeDelta time_to_wait;
-    start_time_ = base::TimeTicks::Now();
-    if (!load_timing_deltas_.receive_headers_end.is_null()) {
-      // Need to delay starting until the largest of the times has elapsed.
-      // Wait a little longer than necessary, to be on the safe side.
-      time_to_wait = load_timing_deltas_.receive_headers_end.GetDelta() +
-                         base::TimeDelta::FromMilliseconds(100);
-    }
-
-    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE,
-        base::BindOnce(&MockUrlRequestJobWithTiming::DelayedStart,
-                       weak_factory_.GetWeakPtr()),
-        time_to_wait);
-  }
-
-  void GetLoadTimingInfo(net::LoadTimingInfo* load_timing_info) const override {
-    // Make sure enough time has elapsed since start was called.  If this
-    // fails, the test fixture itself is flaky.
-    if (!load_timing_deltas_.receive_headers_end.is_null()) {
-      EXPECT_LE(
-          start_time_ + load_timing_deltas_.receive_headers_end.GetDelta(),
-          base::TimeTicks::Now());
-    }
-
-    // If there are no connect times, but there is a receive headers end time,
-    // then assume the socket is reused.  This shouldn't affect the load timing
-    // information the test checks, just done for completeness.
-    load_timing_info->socket_reused = false;
-    if (load_timing_deltas_.connect_start.is_null() &&
-        !load_timing_deltas_.receive_headers_end.is_null()) {
-      load_timing_info->socket_reused = true;
-    }
-
-    load_timing_info->proxy_resolve_start =
-        load_timing_deltas_.proxy_resolve_start.ToTimeTicks(start_time_);
-    load_timing_info->proxy_resolve_end =
-        load_timing_deltas_.proxy_resolve_end.ToTimeTicks(start_time_);
-
-    load_timing_info->connect_timing.dns_start =
-        load_timing_deltas_.dns_start.ToTimeTicks(start_time_);
-    load_timing_info->connect_timing.dns_end =
-        load_timing_deltas_.dns_end.ToTimeTicks(start_time_);
-    load_timing_info->connect_timing.connect_start =
-        load_timing_deltas_.connect_start.ToTimeTicks(start_time_);
-    load_timing_info->connect_timing.ssl_start =
-        load_timing_deltas_.ssl_start.ToTimeTicks(start_time_);
-    load_timing_info->connect_timing.connect_end =
-        load_timing_deltas_.connect_end.ToTimeTicks(start_time_);
-
-    // If there's an SSL start time, use connect end as the SSL end time.
-    // The NavigationTiming API does not have a corresponding field, and there's
-    // no need to test the case when the values are both non-NULL and different.
-    if (!load_timing_deltas_.ssl_start.is_null()) {
-      load_timing_info->connect_timing.ssl_end =
-          load_timing_info->connect_timing.connect_end;
-    }
-
-    load_timing_info->send_start =
-        load_timing_deltas_.send_start.ToTimeTicks(start_time_);
-    load_timing_info->send_end =
-        load_timing_deltas_.send_end.ToTimeTicks(start_time_);
-    load_timing_info->receive_headers_end =
-        load_timing_deltas_.receive_headers_end.ToTimeTicks(start_time_);
-  }
-
- private:
-  // Parent class is reference counted, so need to have a private destructor.
-  ~MockUrlRequestJobWithTiming() override {}
-
-  void DelayedStart() {
-    net::URLRequestFileJob::Start();
-  }
-
-  // Load times to use, relative to |start_time_|.
-  const TimingDeltas load_timing_deltas_;
-  base::TimeTicks start_time_;
-
-  base::WeakPtrFactory<MockUrlRequestJobWithTiming> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockUrlRequestJobWithTiming);
-};
-
-// AURLRequestInterceptor that returns mock URLRequestJobs that return the
-// specified file with the given timings.  Constructed on the UI thread, but
-// after that, lives and is destroyed on the IO thread.
-class TestInterceptor : public net::URLRequestInterceptor {
- public:
-  TestInterceptor(const base::FilePath& path,
-                  const TimingDeltas& load_timing_deltas)
-      : path_(path), load_timing_deltas_(load_timing_deltas) {
-    EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  }
-
-  ~TestInterceptor() override {
-    EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
-  }
-
-  // Registers |this| with the URLRequestFilter, which takes ownership of it.
-  void Register() {
-    EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
-    net::URLRequestFilter::GetInstance()->AddHostnameInterceptor(
-        "http", kTestDomain, std::unique_ptr<net::URLRequestInterceptor>(this));
-  }
-
-  // Unregisters |this| with the URLRequestFilter, which should then delete
-  // |this|.
-  void Unregister() {
-    EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
-    net::URLRequestFilter::GetInstance()->RemoveHostnameHandler(
-        "http", kTestDomain);
-  }
-
-  // net::URLRequestJobFactory::ProtocolHandler implementation:
-  net::URLRequestJob* MaybeInterceptRequest(
-      net::URLRequest* request,
-      net::NetworkDelegate* network_delegate) const override {
-    EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
-    return new MockUrlRequestJobWithTiming(request, network_delegate, path_,
-                                           load_timing_deltas_);
-  }
-
- private:
-  // Path of the file to use as the response body.
-  const base::FilePath path_;
-
-  // Load times for each request to use, relative to when the Job starts.
-  const TimingDeltas load_timing_deltas_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestInterceptor);
+  int dns_start;
+  int dns_end;
+  int connect_start;
+  int ssl_start;
+  int connect_end;
+  int send_start;
+  // Must be non-negative and greater than all other times.
+  int receive_headers_end;
 };
 
 class LoadTimingBrowserTest : public InProcessBrowserTest {
@@ -274,47 +55,11 @@
 
   ~LoadTimingBrowserTest() override {}
 
-  // Navigates to |url| and writes the resulting navigation timings to
-  // |navigation_deltas|.
-  void RunTestWithUrl(const GURL& url, TimingDeltas* navigation_deltas) {
-    ui_test_utils::NavigateToURL(browser(), url);
-    GetResultDeltas(navigation_deltas);
-  }
-
-  // Navigates to a url that returns the timings indicated by
-  // |load_timing_deltas| and writes the resulting navigation timings to
-  // |navigation_deltas|.  Uses a generic test page.
-  void RunTest(const TimingDeltas& load_timing_deltas,
-               TimingDeltas* navigation_deltas) {
-    // None of the tests care about the contents of the test page.  Just do
-    // this here because PathService has thread restrictions on some platforms.
-    base::FilePath path;
-    PathService::Get(chrome::DIR_TEST_DATA, &path);
-    path = path.AppendASCII("title1.html");
-
-    // Create and register request interceptor.
-    TestInterceptor* test_interceptor =
-        new TestInterceptor(path, load_timing_deltas);
-    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                            base::BindOnce(&TestInterceptor::Register,
-                                           base::Unretained(test_interceptor)));
-
-    // Navigate to the page.
-    RunTestWithUrl(GURL(kTestUrl), navigation_deltas);
-
-    // Once navigation is complete, unregister the protocol handler.
-    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                            base::BindOnce(&TestInterceptor::Unregister,
-                                           base::Unretained(test_interceptor)));
-  }
-
- private:
   // Reads applicable times from performance.timing and writes them to
   // |navigation_deltas|.  Proxy times and send end cannot be read from the
   // Navigation Timing API, so those are all left as null.
   void GetResultDeltas(TimingDeltas* navigation_deltas) {
     *navigation_deltas = TimingDeltas();
-
     navigation_deltas->dns_start = GetResultDelta("domainLookupStart");
     navigation_deltas->dns_end = GetResultDelta("domainLookupEnd");
     navigation_deltas->connect_start = GetResultDelta("connectStart");
@@ -332,24 +77,24 @@
                     &ssl_start_zero));
     if (!ssl_start_zero)
       navigation_deltas->ssl_start = GetResultDelta("secureConnectionStart");
+    else
+      navigation_deltas->ssl_start = -1;
 
     // Simple sanity checks.  Make sure times that correspond to LoadTimingInfo
     // occur between fetchStart and loadEventEnd.  Relationships between
     // intervening times are handled by the test bodies.
-
-    RelativeTime fetch_start = GetResultDelta("fetchStart");
+    int fetch_start = GetResultDelta("fetchStart");
     // While the input dns_start is sometimes null, when read from the
     // NavigationTiming API, it's always non-null.
-    EXPECT_LE(fetch_start.GetDelta(), navigation_deltas->dns_start.GetDelta());
+    EXPECT_LE(fetch_start, navigation_deltas->dns_start);
 
-    RelativeTime load_event_end = GetResultDelta("loadEventEnd");
-    EXPECT_LE(navigation_deltas->receive_headers_end.GetDelta(),
-              load_event_end.GetDelta());
+    int load_event_end = GetResultDelta("loadEventEnd");
+    EXPECT_LE(navigation_deltas->receive_headers_end, load_event_end);
   }
 
   // Returns the time between performance.timing.fetchStart and the time with
   // the specified name.  This time must be non-negative.
-  RelativeTime GetResultDelta(const std::string& name) {
+  int GetResultDelta(const std::string& name) {
     int time_ms = 0;
     std::string command(base::StringPrintf(
         "window.domAutomationController.send("
@@ -359,242 +104,92 @@
                     browser()->tab_strip_model()->GetActiveWebContents(),
                     command.c_str(),
                     &time_ms));
-
     // Basic sanity check.
     EXPECT_GE(time_ms, 0);
-
-    return RelativeTime(time_ms);
+    return time_ms;
   }
 };
 
-// Test case when no times are given, except the request start times.  This
-// happens with FTP, cached responses, responses handled by something other than
-// the network stack, RedirectJobs, HSTs, etc.
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, NoTimes) {
-  TimingDeltas load_timing_deltas;
-  TimingDeltas navigation_deltas;
-  RunTest(load_timing_deltas, &navigation_deltas);
-
-  // When there are no times, all read times should be the same as fetchStart,
-  // except SSL start, which should be 0.
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.dns_start.GetDelta());
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.dns_end.GetDelta());
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.connect_start.GetDelta());
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.connect_end.GetDelta());
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.send_start.GetDelta());
-  EXPECT_EQ(base::TimeDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-
-  EXPECT_TRUE(navigation_deltas.ssl_start.is_null());
-}
-
-// Standard case - new socket, no PAC, no preconnect, no SSL.
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, Basic) {
-  TimingDeltas load_timing_deltas;
-  load_timing_deltas.dns_start = RelativeTime(0);
-  load_timing_deltas.dns_end = RelativeTime(100);
-  load_timing_deltas.connect_start = RelativeTime(200);
-  load_timing_deltas.connect_end = RelativeTime(300);
-  load_timing_deltas.send_start = RelativeTime(400);
-  load_timing_deltas.send_end = RelativeTime(500);
-  load_timing_deltas.receive_headers_end = RelativeTime(600);
-
-  TimingDeltas navigation_deltas;
-  RunTest(load_timing_deltas, &navigation_deltas);
-
-  // Due to potential roundoff issues, never check exact differences.
-  EXPECT_LT(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.dns_end.GetDelta());
-  EXPECT_LT(navigation_deltas.dns_end.GetDelta(),
-            navigation_deltas.connect_start.GetDelta());
-  EXPECT_LT(navigation_deltas.connect_start.GetDelta(),
-            navigation_deltas.connect_end.GetDelta());
-  EXPECT_LT(navigation_deltas.connect_end.GetDelta(),
-            navigation_deltas.send_start.GetDelta());
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-
-  EXPECT_TRUE(navigation_deltas.ssl_start.is_null());
-}
-
-// Basic SSL case.
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, Ssl) {
-  TimingDeltas load_timing_deltas;
-  load_timing_deltas.dns_start = RelativeTime(0);
-  load_timing_deltas.dns_end = RelativeTime(100);
-  load_timing_deltas.connect_start = RelativeTime(200);
-  load_timing_deltas.ssl_start = RelativeTime(300);
-  load_timing_deltas.connect_end = RelativeTime(400);
-  load_timing_deltas.send_start = RelativeTime(500);
-  load_timing_deltas.send_end = RelativeTime(600);
-  load_timing_deltas.receive_headers_end = RelativeTime(700);
-
-  TimingDeltas navigation_deltas;
-  RunTest(load_timing_deltas, &navigation_deltas);
-
-  // Due to potential roundoff issues, never check exact differences.
-  EXPECT_LT(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.dns_end.GetDelta());
-  EXPECT_LT(navigation_deltas.dns_end.GetDelta(),
-            navigation_deltas.connect_start.GetDelta());
-  EXPECT_LT(navigation_deltas.connect_start.GetDelta(),
-            navigation_deltas.ssl_start.GetDelta());
-  EXPECT_LT(navigation_deltas.ssl_start.GetDelta(),
-            navigation_deltas.connect_end.GetDelta());
-  EXPECT_LT(navigation_deltas.connect_end.GetDelta(),
-            navigation_deltas.send_start.GetDelta());
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-}
-
-// All times are the same.
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, EverythingAtOnce) {
-  TimingDeltas load_timing_deltas;
-  load_timing_deltas.dns_start = RelativeTime(100);
-  load_timing_deltas.dns_end = RelativeTime(100);
-  load_timing_deltas.connect_start = RelativeTime(100);
-  load_timing_deltas.ssl_start = RelativeTime(100);
-  load_timing_deltas.connect_end = RelativeTime(100);
-  load_timing_deltas.send_start = RelativeTime(100);
-  load_timing_deltas.send_end = RelativeTime(100);
-  load_timing_deltas.receive_headers_end = RelativeTime(100);
-
-  TimingDeltas navigation_deltas;
-  RunTest(load_timing_deltas, &navigation_deltas);
-
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.dns_end.GetDelta());
-  EXPECT_EQ(navigation_deltas.dns_end.GetDelta(),
-            navigation_deltas.connect_start.GetDelta());
-  EXPECT_EQ(navigation_deltas.connect_start.GetDelta(),
-            navigation_deltas.ssl_start.GetDelta());
-  EXPECT_EQ(navigation_deltas.ssl_start.GetDelta(),
-            navigation_deltas.connect_end.GetDelta());
-  EXPECT_EQ(navigation_deltas.connect_end.GetDelta(),
-            navigation_deltas.send_start.GetDelta());
-  EXPECT_EQ(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-}
-
-// Reuse case.
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, ReuseSocket) {
-  TimingDeltas load_timing_deltas;
-  load_timing_deltas.send_start = RelativeTime(0);
-  load_timing_deltas.send_end = RelativeTime(100);
-  load_timing_deltas.receive_headers_end = RelativeTime(200);
-
-  TimingDeltas navigation_deltas;
-  RunTest(load_timing_deltas, &navigation_deltas);
-
-  // Connect times should all be the same as fetchStart.
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.dns_start.GetDelta());
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.dns_end.GetDelta());
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.connect_start.GetDelta());
-  EXPECT_EQ(base::TimeDelta(), navigation_deltas.connect_end.GetDelta());
-
-  // Connect end may be less than send start, since connect end defaults to
-  // fetchStart, which is often less than request_start.
-  EXPECT_LE(navigation_deltas.connect_end.GetDelta(),
-            navigation_deltas.send_start.GetDelta());
-
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-
-  EXPECT_TRUE(navigation_deltas.ssl_start.is_null());
-}
-
-// Preconnect case.  Connect times are all before the request was started.
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, Preconnect) {
-  TimingDeltas load_timing_deltas;
-  load_timing_deltas.dns_start = RelativeTime(-1000300);
-  load_timing_deltas.dns_end = RelativeTime(-1000200);
-  load_timing_deltas.connect_start = RelativeTime(-1000100);
-  load_timing_deltas.connect_end = RelativeTime(-1000000);
-  load_timing_deltas.send_start = RelativeTime(0);
-  load_timing_deltas.send_end = RelativeTime(100);
-  load_timing_deltas.receive_headers_end = RelativeTime(200);
-
-  TimingDeltas navigation_deltas;
-  RunTest(load_timing_deltas, &navigation_deltas);
-
-  // Connect times should all be the same as request_start.
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.dns_end.GetDelta());
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.connect_start.GetDelta());
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.connect_end.GetDelta());
-
-  EXPECT_LE(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.send_start.GetDelta());
-
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-
-  EXPECT_TRUE(navigation_deltas.ssl_start.is_null());
-}
-
-// Preconnect case with a proxy.  Connect times are all before the proxy lookup
-// finished (Or at the same time).
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, PreconnectProxySsl) {
-  TimingDeltas load_timing_deltas;
-  load_timing_deltas.proxy_resolve_start = RelativeTime(0);
-  load_timing_deltas.proxy_resolve_end = RelativeTime(100);
-  load_timing_deltas.dns_start = RelativeTime(-3000000);
-  load_timing_deltas.dns_end = RelativeTime(-2000000);
-  load_timing_deltas.connect_start = RelativeTime(-1000000);
-  load_timing_deltas.ssl_start = RelativeTime(0);
-  load_timing_deltas.connect_end = RelativeTime(100);
-  load_timing_deltas.send_start = RelativeTime(100);
-  load_timing_deltas.send_end = RelativeTime(200);
-  load_timing_deltas.receive_headers_end = RelativeTime(300);
-
-  TimingDeltas navigation_deltas;
-  RunTest(load_timing_deltas, &navigation_deltas);
-
-  // Connect times should all be the same as proxy_end, which is also the
-  // same as send_start.
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.dns_end.GetDelta());
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.connect_start.GetDelta());
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.ssl_start.GetDelta());
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.connect_end.GetDelta());
-  EXPECT_EQ(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.send_start.GetDelta());
-
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
-}
-
-// Integration test with a real network response.
-IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, Integration) {
+IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, HTTP) {
   ASSERT_TRUE(spawned_test_server()->Start());
+  GURL url = spawned_test_server()->GetURL("chunked?waitBeforeHeaders=100");
+  ui_test_utils::NavigateToURL(browser(), url);
+
   TimingDeltas navigation_deltas;
-  RunTestWithUrl(spawned_test_server()->GetURL("chunked?waitBeforeHeaders=100"),
-                 &navigation_deltas);
+  GetResultDeltas(&navigation_deltas);
 
-  // Due to potential roundoff issues, never check exact differences.
-  EXPECT_LE(navigation_deltas.dns_start.GetDelta(),
-            navigation_deltas.dns_end.GetDelta());
-  EXPECT_LE(navigation_deltas.dns_end.GetDelta(),
-            navigation_deltas.connect_start.GetDelta());
-  EXPECT_LE(navigation_deltas.connect_start.GetDelta(),
-            navigation_deltas.connect_end.GetDelta());
-  EXPECT_LE(navigation_deltas.connect_end.GetDelta(),
-            navigation_deltas.send_start.GetDelta());
-  // The only times that are guaranteed to be distinct are send_start and
-  // received_headers_end.
-  EXPECT_LT(navigation_deltas.send_start.GetDelta(),
-            navigation_deltas.receive_headers_end.GetDelta());
+  EXPECT_LE(navigation_deltas.dns_start, navigation_deltas.dns_end);
+  EXPECT_LE(navigation_deltas.dns_end, navigation_deltas.connect_start);
+  EXPECT_LE(navigation_deltas.connect_start, navigation_deltas.connect_end);
+  EXPECT_LE(navigation_deltas.connect_end, navigation_deltas.send_start);
+  EXPECT_LT(navigation_deltas.send_start,
+            navigation_deltas.receive_headers_end);
 
-  EXPECT_TRUE(navigation_deltas.ssl_start.is_null());
+  EXPECT_EQ(navigation_deltas.ssl_start, -1);
+}
+
+IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, HTTPS) {
+  net::SpawnedTestServer https_server(net::SpawnedTestServer::TYPE_HTTPS,
+                                      net::BaseTestServer::SSLOptions(),
+                                      base::FilePath());
+  ASSERT_TRUE(https_server.Start());
+  GURL url = https_server.GetURL("chunked?waitBeforeHeaders=100");
+  ui_test_utils::NavigateToURL(browser(), url);
+
+  TimingDeltas navigation_deltas;
+  GetResultDeltas(&navigation_deltas);
+
+  EXPECT_LE(navigation_deltas.dns_start, navigation_deltas.dns_end);
+  EXPECT_LE(navigation_deltas.dns_end, navigation_deltas.connect_start);
+  EXPECT_LE(navigation_deltas.connect_start, navigation_deltas.ssl_start);
+  EXPECT_LE(navigation_deltas.ssl_start, navigation_deltas.connect_end);
+  EXPECT_LE(navigation_deltas.connect_end, navigation_deltas.send_start);
+  EXPECT_LT(navigation_deltas.send_start,
+            navigation_deltas.receive_headers_end);
+}
+
+IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, Proxy) {
+  ASSERT_TRUE(spawned_test_server()->Start());
+
+  browser()->profile()->GetPrefs()->Set(
+      proxy_config::prefs::kProxy,
+      *ProxyConfigDictionary::CreateFixedServers(
+          spawned_test_server()->host_port_pair().ToString(), std::string()));
+  ProfileNetworkContextServiceFactory::GetForContext(browser()->profile())
+      ->FlushProxyConfigMonitorForTesting();
+
+  GURL url = spawned_test_server()->GetURL("chunked?waitBeforeHeaders=100");
+  ui_test_utils::NavigateToURL(browser(), url);
+
+  TimingDeltas navigation_deltas;
+  GetResultDeltas(&navigation_deltas);
+
+  EXPECT_LE(navigation_deltas.dns_start, navigation_deltas.dns_end);
+  EXPECT_LE(navigation_deltas.dns_end, navigation_deltas.connect_start);
+  EXPECT_LE(navigation_deltas.connect_start, navigation_deltas.connect_end);
+  EXPECT_LE(navigation_deltas.connect_end, navigation_deltas.send_start);
+  EXPECT_LT(navigation_deltas.send_start,
+            navigation_deltas.receive_headers_end);
+
+  EXPECT_EQ(navigation_deltas.ssl_start, -1);
+}
+
+IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, FTP) {
+  net::SpawnedTestServer ftp_server(net::SpawnedTestServer::TYPE_FTP,
+                                    base::FilePath());
+  ASSERT_TRUE(ftp_server.Start());
+  GURL url = ftp_server.GetURL("/");
+  ui_test_utils::NavigateToURL(browser(), url);
+
+  TimingDeltas navigation_deltas;
+  GetResultDeltas(&navigation_deltas);
+
+  EXPECT_EQ(navigation_deltas.dns_start, 0);
+  EXPECT_EQ(navigation_deltas.dns_end, 0);
+  EXPECT_EQ(navigation_deltas.connect_start, 0);
+  EXPECT_EQ(navigation_deltas.connect_end, 0);
+  EXPECT_EQ(navigation_deltas.receive_headers_end, 0);
+  EXPECT_EQ(navigation_deltas.ssl_start, -1);
 }
 
 }  // namespace
diff --git a/chrome/browser/password_manager/OWNERS b/chrome/browser/password_manager/OWNERS
index 3b4080532..d54a53a 100644
--- a/chrome/browser/password_manager/OWNERS
+++ b/chrome/browser/password_manager/OWNERS
@@ -1,8 +1,5 @@
 dvadym@chromium.org
-engedy@chromium.org
 kolos@chromium.org
-melandory@chromium.org
-mkwst@chromium.org
 vabr@chromium.org
 vasilii@chromium.org
 
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index 03a02ce..8ef430e2 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -2955,16 +2955,8 @@
                       "mypassword");
 }
 
-// Flaky on Linux ASAN: http://crbug.com/803155
-#if defined(OS_LINUX) && defined(ADDRESS_SANITIZER)
-#define MAYBE_InternalsPage_Renderer DISABLED_InternalsPage_Renderer
-#else
-#define MAYBE_InternalsPage_Renderer InternalsPage_Renderer
-#endif
-
 // Check that the internals page contains logs from the renderer.
-IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase,
-                       MAYBE_InternalsPage_Renderer) {
+IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, InternalsPage_Renderer) {
   // Open the internals page.
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), GURL("chrome://password-manager-internals"),
diff --git a/chrome/browser/policy/policy_prefs_browsertest.cc b/chrome/browser/policy/policy_prefs_browsertest.cc
index 1d2584e5..14c8927e 100644
--- a/chrome/browser/policy/policy_prefs_browsertest.cc
+++ b/chrome/browser/policy/policy_prefs_browsertest.cc
@@ -457,8 +457,7 @@
 
 // Verifies that policies make their corresponding preferences become managed,
 // and that the user can't override that setting.
-// Failed on all platforms. See crbug.com/803755.
-IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, DISABLED_PolicyToPrefsMapping) {
+IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, PolicyToPrefsMapping) {
   Schema chrome_schema = Schema::Wrap(GetChromeSchemaData());
   ASSERT_TRUE(chrome_schema.valid());
   PrefService* local_state = g_browser_process->local_state();
diff --git a/chrome/browser/profiling_host/profiling_process_host.cc b/chrome/browser/profiling_host/profiling_process_host.cc
index 288bc93..3b2fdb4 100644
--- a/chrome/browser/profiling_host/profiling_process_host.cc
+++ b/chrome/browser/profiling_host/profiling_process_host.cc
@@ -103,6 +103,7 @@
 const base::Feature kOOPHeapProfilingFeature{"OOPHeapProfiling",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 const char kOOPHeapProfilingFeatureMode[] = "mode";
+const char kOOPHeapProfilingFeatureStackMode[] = "stack-mode";
 
 bool ProfilingProcessHost::has_started_ = false;
 
@@ -420,16 +421,22 @@
 // static
 profiling::mojom::StackMode ProfilingProcessHost::GetStackModeForStartup() {
   const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
+  std::string stack_mode;
+
+  // Respect the commandline switch above the field trial.
   if (cmdline->HasSwitch(switches::kMemlogStackMode)) {
-    std::string stack_mode =
-        cmdline->GetSwitchValueASCII(switches::kMemlogStackMode);
-    if (stack_mode == switches::kMemlogStackModeNative)
-      return profiling::mojom::StackMode::NATIVE;
-    if (stack_mode == switches::kMemlogStackModePseudo)
-      return profiling::mojom::StackMode::PSEUDO;
-    if (stack_mode == switches::kMemlogStackModeMixed)
-      return profiling::mojom::StackMode::MIXED;
+    stack_mode = cmdline->GetSwitchValueASCII(switches::kMemlogStackMode);
+  } else {
+    stack_mode = base::GetFieldTrialParamValueByFeature(
+        kOOPHeapProfilingFeature, kOOPHeapProfilingFeatureStackMode);
   }
+
+  if (stack_mode == switches::kMemlogStackModeNative)
+    return profiling::mojom::StackMode::NATIVE;
+  if (stack_mode == switches::kMemlogStackModePseudo)
+    return profiling::mojom::StackMode::PSEUDO;
+  if (stack_mode == switches::kMemlogStackModeMixed)
+    return profiling::mojom::StackMode::MIXED;
   return profiling::mojom::StackMode::NATIVE;
 }
 
diff --git a/chrome/browser/resources/settings/internet_page/internet_config.html b/chrome/browser/resources/settings/internet_page/internet_config.html
index c909581b..22a7b87 100644
--- a/chrome/browser/resources/settings/internet_page/internet_config.html
+++ b/chrome/browser/resources/settings/internet_page/internet_config.html
@@ -34,11 +34,18 @@
         <paper-button class="cancel-button" on-tap="onCancelTap_">
           $i18n{cancel}
         </paper-button>
-        <paper-button class="action-button" on-tap="onSaveOrConnectTap_"
-            disabled="[[!getSaveOrConnectEnabled_(
-                guid, networkProperties_, enableSave_, enableConnect_)]]">
-          [[getSaveOrConnectLabel_(guid, networkProperties_)]]
-        </paper-button>
+        <template is="dom-if" if="[[isConfigured_(networkProperties_, guid)]]">
+          <paper-button class="action-button" on-tap="onSaveOrConnectTap_"
+              disabled="[[!enableSave_]]">
+            $i18n{save}
+          </paper-button>
+        </template>
+        <template is="dom-if" if="[[!isConfigured_(networkProperties_, guid)]]">
+          <paper-button class="action-button" on-tap="onSaveOrConnectTap_"
+              disabled="[[!enableConnect_]]">
+            $i18n{networkButtonConnect}
+          </paper-button>
+        </template>
       </div>
 
     </dialog>
diff --git a/chrome/browser/resources/settings/internet_page/internet_config.js b/chrome/browser/resources/settings/internet_page/internet_config.js
index 9d879cf5..b77d6808 100644
--- a/chrome/browser/resources/settings/internet_page/internet_config.js
+++ b/chrome/browser/resources/settings/internet_page/internet_config.js
@@ -114,22 +114,6 @@
     return !!this.guid && !!source && source != CrOnc.Source.NONE;
   },
 
-  /**
-   * @return {string}
-   * @private
-   */
-  getSaveOrConnectLabel_: function() {
-    return this.i18n(this.isConfigured_() ? 'save' : 'networkButtonConnect');
-  },
-
-  /**
-   * @return {boolean}
-   * @private
-   */
-  getSaveOrConnectEnabled_: function() {
-    return this.isConfigured_() ? this.enableSave_ : this.enableConnect_;
-  },
-
   /** @private */
   onCancelTap_: function() {
     this.close();
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc
index 7329019..fe74ea3 100644
--- a/chrome/browser/signin/signin_ui_util.cc
+++ b/chrome/browser/signin/signin_ui_util.cc
@@ -4,11 +4,14 @@
 
 #include "chrome/browser/signin/signin_ui_util.h"
 
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/account_tracker_service_factory.h"
+#include "chrome/browser/signin/gaia_cookie_manager_service_factory.h"
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
 #include "chrome/browser/signin/signin_error_controller_factory.h"
 #include "chrome/browser/signin/signin_global_error.h"
 #include "chrome/browser/signin/signin_global_error_factory.h"
@@ -20,7 +23,9 @@
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/core/browser/account_tracker_service.h"
+#include "components/signin/core/browser/gaia_cookie_manager_service.h"
 #include "components/signin/core/browser/profile_management_switches.h"
+#include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_manager.h"
 #include "components/user_manager/user_manager.h"
 #include "ui/gfx/font_list.h"
@@ -76,4 +81,36 @@
   return email;
 }
 
+// TODO(tangltom): Add a unit test for this function.
+std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile) {
+  // Fetch account ids for accounts that have a token.
+  ProfileOAuth2TokenService* token_service =
+      ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
+  std::vector<std::string> account_ids = token_service->GetAccounts();
+  // Fetch accounts in the Gaia cookies.
+  GaiaCookieManagerService* cookie_manager_service =
+      GaiaCookieManagerServiceFactory::GetForProfile(profile);
+  std::vector<gaia::ListedAccount> cookie_accounts;
+  bool gaia_accounts_stale = !cookie_manager_service->ListAccounts(
+      &cookie_accounts, nullptr, "ProfileChooserView");
+  UMA_HISTOGRAM_BOOLEAN("Profile.DiceUI.GaiaAccountsStale",
+                        gaia_accounts_stale);
+  // Fetch account information for each id and make sure that the first account
+  // in the list matches the first account in the Gaia cookies (if available).
+  AccountTrackerService* account_tracker_service =
+      AccountTrackerServiceFactory::GetForProfile(profile);
+  std::string gaia_default_account_id =
+      cookie_accounts.empty() ? "" : cookie_accounts[0].id;
+  std::vector<AccountInfo> accounts;
+  for (const std::string& account_id : account_ids) {
+    AccountInfo account_info =
+        account_tracker_service->GetAccountInfo(account_id);
+    if (account_id == gaia_default_account_id)
+      accounts.insert(accounts.begin(), account_info);
+    else
+      accounts.push_back(account_info);
+  }
+  return accounts;
+}
+
 }  // namespace signin_ui_util
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h
index 04fcc77..d0ceb21 100644
--- a/chrome/browser/signin/signin_ui_util.h
+++ b/chrome/browser/signin/signin_ui_util.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/strings/string16.h"
+#include "components/signin/core/browser/account_info.h"
 
 class Profile;
 class SigninManagerBase;
@@ -36,6 +37,10 @@
 // be an email address.
 std::string GetDisplayEmail(Profile* profile, const std::string& account_id);
 
+// Returns the list of all accounts that have a token. The default account in
+// the Gaia cookies will be the first account in the list.
+std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile);
+
 }  // namespace signin_ui_util
 
 #endif  // CHROME_BROWSER_SIGNIN_SIGNIN_UI_UTIL_H_
diff --git a/chrome/browser/supervised_user/child_accounts/child_account_service.cc b/chrome/browser/supervised_user/child_accounts/child_account_service.cc
index 1ff0961..308fd93 100644
--- a/chrome/browser/supervised_user/child_accounts/child_account_service.cc
+++ b/chrome/browser/supervised_user/child_accounts/child_account_service.cc
@@ -150,8 +150,8 @@
                                           kGaiaCookieManagerSource)) {
     return AuthState::PENDING;
   }
-  return accounts.empty() ? AuthState::NOT_AUTHENTICATED
-                          : AuthState::AUTHENTICATED;
+  return (accounts.empty() || !accounts[0].valid) ? AuthState::NOT_AUTHENTICATED
+                                                  : AuthState::AUTHENTICATED;
 }
 
 std::unique_ptr<base::CallbackList<void()>::Subscription>
diff --git a/chrome/browser/supervised_user/child_accounts/child_account_service_unittest.cc b/chrome/browser/supervised_user/child_accounts/child_account_service_unittest.cc
new file mode 100644
index 0000000..c045ba35
--- /dev/null
+++ b/chrome/browser/supervised_user/child_accounts/child_account_service_unittest.cc
@@ -0,0 +1,99 @@
+// Copyright 2018 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/supervised_user/child_accounts/child_account_service.h"
+
+#include "chrome/browser/signin/chrome_signin_client_factory.h"
+#include "chrome/browser/signin/fake_gaia_cookie_manager_service_builder.h"
+#include "chrome/browser/signin/gaia_cookie_manager_service_factory.h"
+#include "chrome/browser/supervised_user/child_accounts/child_account_service_factory.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/signin/core/browser/fake_gaia_cookie_manager_service.h"
+#include "components/signin/core/browser/test_signin_client.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_utils.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+std::unique_ptr<KeyedService> BuildTestSigninClient(
+    content::BrowserContext* context) {
+  Profile* profile = Profile::FromBrowserContext(context);
+  return std::make_unique<TestSigninClient>(profile->GetPrefs());
+}
+
+class ChildAccountServiceTest : public ::testing::Test {
+ public:
+  ChildAccountServiceTest() : fake_url_fetcher_factory_(nullptr) {}
+
+  void SetUp() override {
+    ChromeSigninClientFactory::GetInstance()->SetTestingFactory(
+        &profile_, &BuildTestSigninClient);
+    GaiaCookieManagerServiceFactory::GetInstance()->SetTestingFactory(
+        &profile_, &BuildFakeGaiaCookieManagerService);
+    gaia_cookie_manager_service_ = static_cast<FakeGaiaCookieManagerService*>(
+        GaiaCookieManagerServiceFactory::GetForProfile(&profile_));
+    gaia_cookie_manager_service_->Init(&fake_url_fetcher_factory_);
+  }
+
+ protected:
+  content::TestBrowserThreadBundle thread_bundle_;
+  TestingProfile profile_;
+  net::FakeURLFetcherFactory fake_url_fetcher_factory_;
+  FakeGaiaCookieManagerService* gaia_cookie_manager_service_ = nullptr;
+};
+
+TEST_F(ChildAccountServiceTest, GetGoogleAuthState) {
+  gaia_cookie_manager_service_->SetListAccountsResponseNoAccounts();
+
+  ChildAccountService* child_account_service =
+      ChildAccountServiceFactory::GetForProfile(&profile_);
+
+  // Initial state should be PENDING.
+  EXPECT_EQ(ChildAccountService::AuthState::PENDING,
+            child_account_service->GetGoogleAuthState());
+
+  // Wait until the response to the ListAccount request triggered by the call
+  // above comes back.
+  content::RunAllTasksUntilIdle();
+
+  EXPECT_EQ(ChildAccountService::AuthState::NOT_AUTHENTICATED,
+            child_account_service->GetGoogleAuthState());
+
+  // A valid, signed-in account means authenticated.
+  gaia_cookie_manager_service_->SetListAccountsResponseOneAccountWithParams(
+      "me@example.com", "abcdef",
+      /* is_email_valid = */ true,
+      /* is_signed_out = */ false,
+      /* verified = */ true);
+  gaia_cookie_manager_service_->TriggerListAccounts("ChildAccountServiceTest");
+  content::RunAllTasksUntilIdle();
+  EXPECT_EQ(ChildAccountService::AuthState::AUTHENTICATED,
+            child_account_service->GetGoogleAuthState());
+
+  // An invalid (but signed-in) account means not authenticated.
+  gaia_cookie_manager_service_->SetListAccountsResponseOneAccountWithParams(
+      "me@example.com", "abcdef",
+      /* is_email_valid = */ false,
+      /* is_signed_out = */ false,
+      /* verified = */ true);
+  gaia_cookie_manager_service_->TriggerListAccounts("ChildAccountServiceTest");
+  content::RunAllTasksUntilIdle();
+  EXPECT_EQ(ChildAccountService::AuthState::NOT_AUTHENTICATED,
+            child_account_service->GetGoogleAuthState());
+
+  // A valid but not signed-in account means not authenticated.
+  gaia_cookie_manager_service_->SetListAccountsResponseOneAccountWithParams(
+      "me@example.com", "abcdef",
+      /* is_email_valid = */ true,
+      /* is_signed_out = */ true,
+      /* verified = */ true);
+  gaia_cookie_manager_service_->TriggerListAccounts("ChildAccountServiceTest");
+  content::RunAllTasksUntilIdle();
+  EXPECT_EQ(ChildAccountService::AuthState::NOT_AUTHENTICATED,
+            child_account_service->GetGoogleAuthState());
+}
+
+}  // namespace
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index f8cdf4f..458fcea 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -805,6 +805,7 @@
       "media_router/presentation_receiver_window_controller.cc",
       "media_router/presentation_receiver_window_controller.h",
       "media_router/presentation_receiver_window_delegate.h",
+      "media_router/presentation_receiver_window_factory_mac.cc",
       "native_window_tracker.h",
       "omnibox/alternate_nav_infobar_delegate.cc",
       "omnibox/alternate_nav_infobar_delegate.h",
@@ -2923,6 +2924,15 @@
       deps += [ "//ui/views/mus" ]
     }
 
+    if (enable_dice_support) {
+      sources += [
+        "views/sync/dice_bubble_sync_promo_view.cc",
+        "views/sync/dice_bubble_sync_promo_view.h",
+        "views/sync/dice_signin_button.cc",
+        "views/sync/dice_signin_button.h",
+      ]
+    }
+
     if (!is_mac || mac_views_browser) {
       sources += [
         "javascript_dialogs/javascript_dialog.cc",
@@ -3152,6 +3162,13 @@
         "views/webshare/webshare_target_picker_view.h",
       ]
 
+      if (is_mac) {
+        # This Mac-specific file is being removed in this case because it's only
+        # needed when Views isn't used on Mac.
+        sources -=
+            [ "media_router/presentation_receiver_window_factory_mac.cc" ]
+      }
+
       if (!is_chromeos) {
         sources += [
           "views/frame/opaque_browser_frame_view.cc",
diff --git a/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc b/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc
index 3f8e2c5..b5e12b6 100644
--- a/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc
+++ b/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.h"
 
+#include "build/buildflag.h"
+#include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/browser/signin/signin_promo.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -11,6 +13,13 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "components/signin/core/browser/signin_features.h"
+#include "components/signin/core/browser/signin_manager.h"
+
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+#include "chrome/browser/signin/account_consistency_mode_manager.h"
+#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#endif
 
 BookmarkBubbleSignInDelegate::BookmarkBubbleSignInDelegate(Browser* browser)
     : browser_(browser),
@@ -22,12 +31,35 @@
   BrowserList::RemoveObserver(this);
 }
 
-void BookmarkBubbleSignInDelegate::OnSignInLinkClicked() {
+void BookmarkBubbleSignInDelegate::ShowBrowserSignin() {
   EnsureBrowser();
   chrome::ShowBrowserSignin(
       browser_, signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE);
 }
 
+void BookmarkBubbleSignInDelegate::EnableSync(const AccountInfo& account) {
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+  DCHECK(AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_));
+
+  if (SigninManagerFactory::GetForProfile(profile_)->IsAuthenticated())
+    return;
+
+  EnsureBrowser();
+  // DiceTurnSyncOnHelper is suicidal (it will delete itself once it finishes
+  // enabling sync).
+  new DiceTurnSyncOnHelper(
+      profile_, browser_,
+      signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE,
+      signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, account.account_id,
+      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+
+// TODO(msarda): Close the bookmarks bubble once the enable sync flow has
+// started.
+#else
+  NOTREACHED();
+#endif
+}
+
 void BookmarkBubbleSignInDelegate::OnBrowserRemoved(Browser* browser) {
   if (browser == browser_)
     browser_ = NULL;
diff --git a/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.h b/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.h
index 2271c48..fafbf6c 100644
--- a/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.h
+++ b/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.h
@@ -24,7 +24,8 @@
   ~BookmarkBubbleSignInDelegate() override;
 
   // BubbleSyncPromoDelegate:
-  void OnSignInLinkClicked() override;
+  void ShowBrowserSignin() override;
+  void EnableSync(const AccountInfo& account) override;
 
   // BrowserListObserver:
   void OnBrowserRemoved(Browser* browser) override;
diff --git a/chrome/browser/ui/media_router/presentation_receiver_window_factory_mac.cc b/chrome/browser/ui/media_router/presentation_receiver_window_factory_mac.cc
new file mode 100644
index 0000000..773012f
--- /dev/null
+++ b/chrome/browser/ui/media_router/presentation_receiver_window_factory_mac.cc
@@ -0,0 +1,15 @@
+// Copyright 2018 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/ui/media_router/presentation_receiver_window.h"
+
+#include "base/logging.h"
+
+// static
+PresentationReceiverWindow* PresentationReceiverWindow::Create(
+    PresentationReceiverWindowDelegate* delegate,
+    const gfx::Rect& bounds) {
+  NOTREACHED();
+  return nullptr;
+}
diff --git a/chrome/browser/ui/sync/bubble_sync_promo_delegate.h b/chrome/browser/ui/sync/bubble_sync_promo_delegate.h
index 0bc1c21..a62f415a 100644
--- a/chrome/browser/ui/sync/bubble_sync_promo_delegate.h
+++ b/chrome/browser/ui/sync/bubble_sync_promo_delegate.h
@@ -5,10 +5,17 @@
 #ifndef CHROME_BROWSER_UI_SYNC_BUBBLE_SYNC_PROMO_DELEGATE_H_
 #define CHROME_BROWSER_UI_SYNC_BUBBLE_SYNC_PROMO_DELEGATE_H_
 
+#include "components/signin/core/browser/account_info.h"
+
 class BubbleSyncPromoDelegate {
  public:
   virtual ~BubbleSyncPromoDelegate() {}
-  virtual void OnSignInLinkClicked() = 0;
+
+  // Shows the chrome sign-in page.
+  virtual void ShowBrowserSignin() = 0;
+
+  // Enables sync for |account|.
+  virtual void EnableSync(const AccountInfo& account) = 0;
 };
 
 #endif  // CHROME_BROWSER_UI_SYNC_BUBBLE_SYNC_PROMO_DELEGATE_H_
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_sign_in_delegate_browsertest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_sign_in_delegate_browsertest.cc
index 3179cca..4aee1c3 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_sign_in_delegate_browsertest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_sign_in_delegate_browsertest.cc
@@ -59,7 +59,7 @@
 void BookmarkBubbleSignInDelegateTest::SignInBrowser(Browser* browser) {
   std::unique_ptr<BubbleSyncPromoDelegate> delegate;
   delegate.reset(new BookmarkBubbleSignInDelegate(browser));
-  delegate->OnSignInLinkClicked();
+  delegate->ShowBrowserSignin();
 }
 
 IN_PROC_BROWSER_TEST_F(BookmarkBubbleSignInDelegateTest, OnSignInLinkClicked) {
@@ -161,7 +161,7 @@
   browser()->tab_strip_model()->CloseAllTabs();
   content::RunAllPendingInMessageLoop();
 
-  delegate->OnSignInLinkClicked();
+  delegate->ShowBrowserSignin();
 
   int tab_count = extra_browser->tab_strip_model()->count();
 #if !defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
index 80f102f..e9e56a0 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -7,6 +7,8 @@
 #include "base/metrics/user_metrics.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
+#include "build/buildflag.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
@@ -21,6 +23,8 @@
 #include "chrome/grit/generated_resources.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
+#include "components/signin/core/browser/profile_management_switches.h"
+#include "components/signin/core/browser/signin_features.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -37,6 +41,11 @@
 #include "chrome/browser/ui/views/desktop_ios_promotion/desktop_ios_promotion_footnote_view.h"
 #endif
 
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+#include "chrome/browser/signin/account_consistency_mode_manager.h"
+#include "chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h"
+#endif
+
 using base::UserMetricsAction;
 using bookmarks::BookmarkModel;
 using bookmarks::BookmarkNode;
@@ -193,9 +202,21 @@
 
   base::RecordAction(UserMetricsAction("Signin_Impression_FromBookmarkBubble"));
 
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+  if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_)) {
+    footnote_view_ = new DiceBubbleSyncPromoView(
+        profile_, delegate_.get(), IDS_BOOKMARK_DICE_PROMO_SIGNIN_MESSAGE,
+        IDS_BOOKMARK_DICE_PROMO_SYNC_MESSAGE);
+  } else {
+    footnote_view_ =
+        new BubbleSyncPromoView(delegate_.get(), IDS_BOOKMARK_SYNC_PROMO_LINK,
+                                IDS_BOOKMARK_SYNC_PROMO_MESSAGE);
+  }
+#else
   footnote_view_ =
       new BubbleSyncPromoView(delegate_.get(), IDS_BOOKMARK_SYNC_PROMO_LINK,
                               IDS_BOOKMARK_SYNC_PROMO_MESSAGE);
+#endif
   return footnote_view_;
 }
 
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
index 61a1b3a..ffdcf552 100644
--- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -28,6 +28,7 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/bubble/bubble_controller.h"
+#include "components/signin/core/browser/account_info.h"
 #include "extensions/common/extension.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_features.h"
@@ -137,7 +138,8 @@
   void Init() override;
 
   // BubbleSyncPromoDelegate:
-  void OnSignInLinkClicked() override;
+  void ShowBrowserSignin() override;
+  void EnableSync(const AccountInfo& account_info) override;
 
   // views::LinkListener:
   void LinkClicked(views::Link* source, int event_flags) override;
@@ -282,13 +284,18 @@
   }
 }
 
-void ExtensionInstalledBubbleView::OnSignInLinkClicked() {
+void ExtensionInstalledBubbleView::ShowBrowserSignin() {
   chrome::ShowBrowserSignin(
       browser(),
       signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE);
   CloseBubble(BUBBLE_CLOSE_NAVIGATED);
 }
 
+void ExtensionInstalledBubbleView::EnableSync(const AccountInfo& account) {
+  NOTREACHED() << "Extension installl bubble does not display the DICE "
+               << "personalized sign-in promo asking the user to enable sync.";
+}
+
 void ExtensionInstalledBubbleView::LinkClicked(views::Link* source,
                                                int event_flags) {
   DCHECK_EQ(manage_shortcut_, source);
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
index b295a550a..67a0c5e 100644
--- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
@@ -185,41 +185,6 @@
                             : BadgedProfilePhoto::BADGE_TYPE_SUPERVISOR;
 }
 
-// Returns the list of all accounts that have a token. The default account in
-// the Gaia cookies will be the first account in the list.
-// TODO(tangltom): Move this code to chrome/browser/ui/signin and add a unit
-// test.
-std::vector<AccountInfo> GetAccountsForProfile(Profile* profile) {
-  // Fetch account ids for accounts that have a token.
-  ProfileOAuth2TokenService* token_service =
-      ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
-  std::vector<std::string> account_ids = token_service->GetAccounts();
-  // Fetch accounts in the Gaia cookies.
-  GaiaCookieManagerService* cookie_manager_service =
-      GaiaCookieManagerServiceFactory::GetForProfile(profile);
-  std::vector<gaia::ListedAccount> cookie_accounts;
-  bool gaia_accounts_stale = !cookie_manager_service->ListAccounts(
-      &cookie_accounts, nullptr, "ProfileChooserView");
-  UMA_HISTOGRAM_BOOLEAN("Profile.DiceUI.GaiaAccountsStale",
-                        gaia_accounts_stale);
-  // Fetch account information for each id and make sure that the first account
-  // in the list matches the first account in the Gaia cookies (if available).
-  AccountTrackerService* account_tracker_service =
-      AccountTrackerServiceFactory::GetForProfile(profile);
-  std::string gaia_default_account_id =
-      cookie_accounts.empty() ? "" : cookie_accounts[0].id;
-  std::vector<AccountInfo> accounts;
-  for (const std::string& account_id : account_ids) {
-    AccountInfo account_info =
-        account_tracker_service->GetAccountInfo(account_id);
-    if (account_id == gaia_default_account_id)
-      accounts.insert(accounts.begin(), account_info);
-    else
-      accounts.push_back(account_info);
-  }
-  return accounts;
-}
-
 }  // namespace
 
 // A title card with one back button left aligned and one label center aligned.
@@ -1039,7 +1004,7 @@
 views::View* ProfileChooserView::CreateDiceSigninView() {
   // Fetch signed in GAIA web accounts.
   std::vector<AccountInfo> accounts =
-      GetAccountsForProfile(browser_->profile());
+      signin_ui_util::GetAccountsForDicePromos(browser_->profile());
 
   // Create a view that holds an illustration and a promo, which includes a
   // button. The illustration should slightly overlap with the promo at the
diff --git a/chrome/browser/ui/views/sync/bubble_sync_promo_view.cc b/chrome/browser/ui/views/sync/bubble_sync_promo_view.cc
index bcaeffa..ce7973d 100644
--- a/chrome/browser/ui/views/sync/bubble_sync_promo_view.cc
+++ b/chrome/browser/ui/views/sync/bubble_sync_promo_view.cc
@@ -47,5 +47,5 @@
 void BubbleSyncPromoView::StyledLabelLinkClicked(views::StyledLabel* label,
                                                  const gfx::Range& range,
                                                  int event_flags) {
-  delegate_->OnSignInLinkClicked();
+  delegate_->ShowBrowserSignin();
 }
diff --git a/chrome/browser/ui/views/sync/bubble_sync_promo_view_unittest.cc b/chrome/browser/ui/views/sync/bubble_sync_promo_view_unittest.cc
index 4379b815..ea2ec3f 100644
--- a/chrome/browser/ui/views/sync/bubble_sync_promo_view_unittest.cc
+++ b/chrome/browser/ui/views/sync/bubble_sync_promo_view_unittest.cc
@@ -21,14 +21,15 @@
 class BubbleSyncPromoViewTest : public views::ViewsTestBase,
                                 public BubbleSyncPromoDelegate {
  public:
-  BubbleSyncPromoViewTest() : sign_in_clicked_count_(0) {}
+  BubbleSyncPromoViewTest() {}
 
  protected:
   // BubbleSyncPromoDelegate:
-  void OnSignInLinkClicked() override { ++sign_in_clicked_count_; }
+  void ShowBrowserSignin() override { ++show_browser_signin_count_; }
+  void EnableSync(const AccountInfo& account_info) override { NOTREACHED(); }
 
   // Number of times that OnSignInLinkClicked has been called.
-  int sign_in_clicked_count_;
+  int show_browser_signin_count_ = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BubbleSyncPromoViewTest);
@@ -44,5 +45,5 @@
   views::StyledLabelListener* listener = sync_promo.get();
   listener->StyledLabelLinkClicked(&styled_label, gfx::Range(), ui::EF_NONE);
 
-  EXPECT_EQ(1, sign_in_clicked_count_);
+  EXPECT_EQ(1, show_browser_signin_count_);
 }
diff --git a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc
new file mode 100644
index 0000000..3335f0d
--- /dev/null
+++ b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc
@@ -0,0 +1,75 @@
+// Copyright 2018 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/ui/views/sync/dice_bubble_sync_promo_view.h"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/logging.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/signin/account_consistency_mode_manager.h"
+#include "chrome/browser/signin/signin_ui_util.h"
+#include "chrome/browser/ui/views/harmony/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/sync/dice_signin_button.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+
+DiceBubbleSyncPromoView::DiceBubbleSyncPromoView(
+    Profile* profile,
+    BubbleSyncPromoDelegate* delegate,
+    int no_accounts_title_resource_id,
+    int accounts_title_resource_id)
+    : views::View(), delegate_(delegate) {
+  DCHECK(AccountConsistencyModeManager::IsDiceEnabledForProfile(profile));
+
+  std::vector<AccountInfo> accounts =
+      signin_ui_util::GetAccountsForDicePromos(profile);
+  int title_resource_id = accounts.empty() ? no_accounts_title_resource_id
+                                           : accounts_title_resource_id;
+
+  std::unique_ptr<views::BoxLayout> layout = std::make_unique<views::BoxLayout>(
+      views::BoxLayout::kVertical, gfx::Insets(),
+      ChromeLayoutProvider::Get()->GetDistanceMetric(
+          views::DISTANCE_RELATED_CONTROL_VERTICAL));
+  SetLayoutManager(std::move(layout));
+
+  base::string16 title_text = l10n_util::GetStringUTF16(title_resource_id);
+  views::Label* title = new views::Label(title_text);
+  title->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
+  title->SetMultiLine(true);
+  AddChildView(title);
+
+  signin_button_ = accounts.empty() ? new DiceSigninButton(this)
+                                    : new DiceSigninButton(accounts[0], this);
+  AddChildView(signin_button_);
+}
+
+DiceBubbleSyncPromoView::~DiceBubbleSyncPromoView() = default;
+
+void DiceBubbleSyncPromoView::ButtonPressed(views::Button* sender,
+                                            const ui::Event& event) {
+  if (sender == signin_button_) {
+    DVLOG(1) << "Sign In button pressed";
+    if (signin_button_->account())
+      delegate_->EnableSync(signin_button_->account().value());
+    else
+      delegate_->ShowBrowserSignin();
+    return;
+  }
+
+  if (sender == signin_button_->drop_down_arrow()) {
+    DVLOG(1) << "Drop down arrow pressed";
+    // TODO(msarda): Show the other accounts menu.
+    return;
+  }
+
+  NOTREACHED();
+}
+
+const char* DiceBubbleSyncPromoView::GetClassName() const {
+  return "DiceBubbleSyncPromoView";
+}
diff --git a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h
new file mode 100644
index 0000000..7077f4b
--- /dev/null
+++ b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h
@@ -0,0 +1,52 @@
+// Copyright 2018 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_UI_VIEWS_SYNC_DICE_BUBBLE_SYNC_PROMO_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_SYNC_DICE_BUBBLE_SYNC_PROMO_VIEW_H_
+
+#include "base/macros.h"
+#include "chrome/browser/ui/sync/bubble_sync_promo_delegate.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/view.h"
+
+class Profile;
+class DiceSigninButton;
+
+// A personalized sync promo used when Desktop Identity Consistency is enabled.
+// Its display a message informing the user the benefits of enabling sync and
+// a button that allows the user to enable sync.
+// The button has 2 different displays:
+// * If Chrome has no accounts, then the promo button is a MD button allowing
+//   the user to sign in to Chrome.
+// * If Chrome has at least one account, then the promo button is personalized
+//   with the user full name and avatar icon and allows the user to enable sync.
+class DiceBubbleSyncPromoView : public views::View,
+                                public views::ButtonListener {
+ public:
+  // Creates a personalized sync promo view.
+  // |delegate| is not owned by DiceBubbleSyncPromoView.
+  // The promo title message is set to |no_accounts_title_resource_id| when
+  // Chrome has no accounts.
+  // The promo title message is set to |accounts_title_resource_id| when Chrome
+  // has at least one account.
+  DiceBubbleSyncPromoView(Profile* profile,
+                          BubbleSyncPromoDelegate* delegate,
+                          int no_accounts_title_resource_id,
+                          int accounts_title_resource_id);
+  ~DiceBubbleSyncPromoView() override;
+
+  // views::ButtonListener:
+  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
+
+ private:
+  // views::View:
+  const char* GetClassName() const override;
+
+  // Delegate, to handle clicks on the sign-in buttons.
+  BubbleSyncPromoDelegate* delegate_;
+  DiceSigninButton* signin_button_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(DiceBubbleSyncPromoView);
+};
+#endif  // CHROME_BROWSER_UI_VIEWS_SYNC_DICE_BUBBLE_SYNC_PROMO_VIEW_H_
diff --git a/chrome/browser/ui/views/sync/dice_signin_button.cc b/chrome/browser/ui/views/sync/dice_signin_button.cc
new file mode 100644
index 0000000..b6da1df
--- /dev/null
+++ b/chrome/browser/ui/views/sync/dice_signin_button.cc
@@ -0,0 +1,159 @@
+// Copyright 2018 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/ui/views/sync/dice_signin_button.h"
+
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/profiles/profile_avatar_icon_util.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/vector_icons/vector_icons.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/background.h"
+#include "ui/views/border.h"
+
+namespace {
+
+// Drop down arrow sizes.
+constexpr int kDropDownArrowIconSize = 15;
+constexpr int kDropDownArrowButtonWidth = 50;
+
+// Divider sizes
+constexpr int kDividerHorizontalPadding = 4;
+constexpr int kDividerWidth = 1;
+constexpr int kDividerVerticalPadding = 10;
+
+int GetDividerAndArrowReservedWidth() {
+  return 2 * kDividerHorizontalPadding + kDividerWidth +
+         kDropDownArrowButtonWidth;
+}
+
+}  // namespace
+
+DiceSigninButton::DiceSigninButton(views::ButtonListener* button_listener)
+    : views::MdTextButton(button_listener, views::style::CONTEXT_BUTTON),
+      account_(base::nullopt) {
+  // Regular MD text button when there is not account.
+  SetText(l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON));
+  SetFocusForPlatform();
+  SetProminent(true);
+  SetHorizontalAlignment(gfx::ALIGN_CENTER);
+}
+
+DiceSigninButton::DiceSigninButton(const AccountInfo& account,
+                                   views::ButtonListener* button_listener)
+    : views::MdTextButton(button_listener, views::style::CONTEXT_BUTTON),
+      account_(account) {
+  // First create the child views.
+  subtitle_ = new views::Label(base::ASCIIToUTF16(account_->email));
+  subtitle_->SetAutoColorReadabilityEnabled(false);
+  subtitle_->SetEnabledColor(SK_ColorWHITE);
+  subtitle_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  AddChildView(subtitle_);
+
+  divider_ = new views::View();
+  divider_->SetBackground(views::CreateSolidBackground(SK_ColorWHITE));
+  AddChildView(divider_);
+
+  arrow_ = new views::ImageButton(button_listener);
+  arrow_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
+                            views::ImageButton ::ALIGN_MIDDLE);
+  arrow_->SetInkDropMode(views::InkDropHostView::InkDropMode::ON);
+  arrow_->set_has_ink_drop_action_on_click(true);
+  arrow_->SetFocusForPlatform();
+  arrow_->SetFocusPainter(nullptr);
+  arrow_->SetImage(
+      views::Button::STATE_NORMAL,
+      gfx::CreateVectorIcon(kSigninButtonDropDownArrowIcon,
+                            kDropDownArrowIconSize, SK_ColorWHITE));
+  AddChildView(arrow_);
+
+  // Set the title text for main Sign-in button.
+  base::string16 button_title =
+      account_->full_name.empty()
+          ? l10n_util::GetStringUTF16(
+                IDS_PROFILES_DICE_SIGNIN_FIRST_ACCOUNT_BUTTON_NO_NAME)
+          : l10n_util::GetStringFUTF16(
+                IDS_PROFILES_DICE_SIGNIN_FIRST_ACCOUNT_BUTTON,
+                base::UTF8ToUTF16(account_->full_name));
+  SetText(button_title);
+  SetFocusForPlatform();
+  SetProminent(true);
+  SetHorizontalAlignment(gfx::ALIGN_LEFT);
+
+  // Set the image
+  gfx::Image account_icon =
+      ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+          profiles::GetPlaceholderAvatarIconResourceID());
+  gfx::Image profile_photo_circular = profiles::GetSizedAvatarIcon(
+      account_icon, true, 40, 40, profiles::SHAPE_CIRCLE);
+  SetImage(views::Button::STATE_NORMAL, *profile_photo_circular.ToImageSkia());
+}
+
+DiceSigninButton::~DiceSigninButton() = default;
+
+gfx::Rect DiceSigninButton::GetChildAreaBounds() {
+  gfx::Rect child_area = MdTextButton::GetChildAreaBounds();
+  if (!account_)
+    return child_area;
+
+  // Make room on the right for the divider and the drop-down arrow.
+  child_area.set_width(child_area.width() - GetDividerAndArrowReservedWidth());
+  return child_area;
+}
+
+int DiceSigninButton::GetHeightForWidth(int width) const {
+  if (!account_)
+    return MdTextButton::GetHeightForWidth(width);
+
+  // Title and subtitle are labels with a single line. So their preferred
+  // height is not affected by |width|.
+  int height_without_subtitle = MdTextButton::GetHeightForWidth(width);
+  int title_subtitle_height = label()->GetHeightForWidth(width) +
+                              subtitle_->GetHeightForWidth(width) +
+                              GetInsets().height();
+  return std::max(height_without_subtitle, title_subtitle_height);
+}
+
+gfx::Size DiceSigninButton::CalculatePreferredSize() const {
+  NOTREACHED() << "DiceSigninButton is only used in bubbles that place "
+                  " child views using |GetHeightForWidth|. This method is "
+                  " intentionally not implemented to avoid confusion about "
+                  " the way this button is being layed out.";
+  return MdTextButton::CalculatePreferredSize();
+}
+
+void DiceSigninButton::Layout() {
+  views::MdTextButton::Layout();
+  if (!account_)
+    return;
+
+  // By default, |title| takes the entire height of the button. Shink |title|
+  // to make space for |subtitle_|.
+  views::Label* title = label();
+  gfx::Size initial_title_size = title->size();
+  int total_height = initial_title_size.height();
+  int title_x = title->bounds().x();
+  int title_width = initial_title_size.width();
+  int title_height = title->GetHeightForWidth(title_width);
+  int subtitle_width = GetChildAreaBounds().width() - title_x;
+  int subtitle_height = subtitle_->GetHeightForWidth(subtitle_width);
+  int title_y =
+      std::max(0, (total_height - title_height - subtitle_height) / 2);
+  title->SetBounds(title_x, title_y, title_width, title_height);
+  subtitle_->SetBounds(title_x, title->bounds().bottom(), subtitle_width,
+                       subtitle_height);
+
+  // Lay the divider and the arrow on the right.
+  gfx::Rect bounds = GetLocalBounds();
+  int divider_x = bounds.width() - GetDividerAndArrowReservedWidth() +
+                  kDividerHorizontalPadding;
+  divider_->SetBounds(divider_x, kDividerVerticalPadding, kDividerWidth,
+                      bounds.height() - 2 * kDividerVerticalPadding);
+  arrow_->SetBounds(divider_x + kDividerWidth + kDividerHorizontalPadding, 0,
+                    kDropDownArrowButtonWidth, bounds.height());
+}
diff --git a/chrome/browser/ui/views/sync/dice_signin_button.h b/chrome/browser/ui/views/sync/dice_signin_button.h
new file mode 100644
index 0000000..ddb7e46
--- /dev/null
+++ b/chrome/browser/ui/views/sync/dice_signin_button.h
@@ -0,0 +1,52 @@
+// Copyright 2018 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_UI_VIEWS_SYNC_DICE_SIGNIN_BUTTON_H_
+#define CHROME_BROWSER_UI_VIEWS_SYNC_DICE_SIGNIN_BUTTON_H_
+
+#include "base/macros.h"
+#include "base/optional.h"
+#include "components/signin/core/browser/account_info.h"
+#include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/button/md_text_button.h"
+#include "ui/views/controls/label.h"
+
+// Sign-in button used for Desktop Identity Consistency that presents the
+// account information (avatar image and email) and allows the user to
+// sign in to Chrome or to enable sync.
+//
+// The button also presents on the right hand side a drown-down arrow button
+// that the user can interact with.
+class DiceSigninButton : public views::MdTextButton {
+ public:
+  // Create a non-personalized sign-in button.
+  // |button_listener| is called evey time the user interacts with this button.
+  explicit DiceSigninButton(views::ButtonListener* button_listener);
+
+  // Creates a sign-in button personalized with the data from |account|.
+  // |button_listener| will be called for events originating from |this| or from
+  // |drop_down_arrow|.
+  DiceSigninButton(const AccountInfo& account_info,
+                   views::ButtonListener* button_listener);
+  ~DiceSigninButton() override;
+
+  const views::Button* drop_down_arrow() const { return arrow_; }
+  const base::Optional<AccountInfo> account() const { return account_; }
+
+  // views::MdTextButton:
+  gfx::Rect GetChildAreaBounds() override;
+  gfx::Size CalculatePreferredSize() const override;
+  int GetHeightForWidth(int w) const override;
+  void Layout() override;
+
+ private:
+  const base::Optional<AccountInfo> account_;
+  views::Label* subtitle_ = nullptr;
+  views::View* divider_ = nullptr;
+  views::ImageButton* arrow_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(DiceSigninButton);
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_SYNC_DICE_SIGNIN_BUTTON_H_
diff --git a/chrome/browser/ui/webui/OWNERS b/chrome/browser/ui/webui/OWNERS
index 4dbbf3f..211ccfc8 100644
--- a/chrome/browser/ui/webui/OWNERS
+++ b/chrome/browser/ui/webui/OWNERS
@@ -10,6 +10,8 @@
 
 per-file md_history_ui*=calamity@chromium.org
 
+per-file memory_internals_ui*=erikchen@chromium.org
+
 per-file net_export_ui.*=file://net/OWNERS
 
 per-file ntp_tiles_internals_ui.*=file://components/ntp_tiles/OWNERS
diff --git a/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc b/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
index 085857acd..b52f1ba7 100644
--- a/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
@@ -17,12 +17,14 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
 
 namespace chromeos {
 
 namespace {
 
+// Dialog height for configured networks that only require a passphrase.
+constexpr int kDialogHeightPasswordOnly = 320;
+
 void AddInternetStrings(content::WebUIDataSource* html_source) {
   // Add default strings first.
   chromeos::network_element::AddLocalizedStrings(html_source);
@@ -72,6 +74,18 @@
 
 InternetConfigDialog::~InternetConfigDialog() {}
 
+void InternetConfigDialog::GetDialogSize(gfx::Size* size) const {
+  const NetworkState* network =
+      network_id_.empty() ? nullptr
+                          : NetworkHandler::Get()
+                                ->network_state_handler()
+                                ->GetNetworkStateFromGuid(network_id_);
+  int height = network && network->SecurityRequiresPassphraseOnly()
+                   ? kDialogHeightPasswordOnly
+                   : InternetConfigDialog::kDialogHeight;
+  size->SetSize(InternetConfigDialog::kDialogWidth, height);
+}
+
 std::string InternetConfigDialog::GetDialogArgs() const {
   base::DictionaryValue args;
   args.SetKey("type", base::Value(network_type_));
diff --git a/chrome/browser/ui/webui/chromeos/internet_config_dialog.h b/chrome/browser/ui/webui/chromeos/internet_config_dialog.h
index 4a912381..8c3d0b8 100644
--- a/chrome/browser/ui/webui/chromeos/internet_config_dialog.h
+++ b/chrome/browser/ui/webui/chromeos/internet_config_dialog.h
@@ -29,6 +29,7 @@
   ~InternetConfigDialog() override;
 
   // ui::WebDialogDelegate
+  void GetDialogSize(gfx::Size* size) const override;
   std::string GetDialogArgs() const override;
 
  private:
diff --git a/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.cc
index 6e1171a..684dfbfe 100644
--- a/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.cc
@@ -8,6 +8,7 @@
 
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/login/screens/core_oobe_view.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/login/auth/authpolicy_login_helper.h"
@@ -77,9 +78,7 @@
 }
 
 void ActiveDirectoryPasswordChangeScreenHandler::ShowScreen(
-    const std::string& username,
-    SigninScreenHandlerDelegate* delegate) {
-  delegate_ = delegate;
+    const std::string& username) {
   base::DictionaryValue data;
   data.SetString(kUsernameKey, username);
   ShowScreenWithData(OobeScreen::SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE,
@@ -105,16 +104,16 @@
              !account_info.account_id().empty());
       const AccountId account_id = user_manager::known_user::GetAccountId(
           username, account_info.account_id(), AccountType::ACTIVE_DIRECTORY);
-      DCHECK(delegate_);
-      delegate_->SetDisplayAndGivenName(account_info.display_name(),
-                                        account_info.given_name());
+      DCHECK(LoginDisplayHost::default_host());
+      LoginDisplayHost::default_host()->SetDisplayAndGivenName(
+          account_info.display_name(), account_info.given_name());
       UserContext user_context(account_id);
       user_context.SetKey(key);
       user_context.SetAuthFlow(UserContext::AUTH_FLOW_ACTIVE_DIRECTORY);
       user_context.SetIsUsingOAuth(false);
       user_context.SetUserType(
           user_manager::UserType::USER_TYPE_ACTIVE_DIRECTORY);
-      delegate_->CompleteLogin(user_context);
+      LoginDisplayHost::default_host()->CompleteLogin(user_context);
       break;
     }
     case authpolicy::ERROR_BAD_PASSWORD:
@@ -132,7 +131,7 @@
       break;
     default:
       NOTREACHED() << "Unhandled error: " << error;
-      ShowScreen(username, delegate_);
+      ShowScreen(username);
       core_oobe_view_->ShowSignInError(
           0, l10n_util::GetStringUTF8(IDS_AD_AUTH_UNKNOWN_ERROR), std::string(),
           HelpAppLauncher::HELP_CANT_ACCESS_ACCOUNT);
diff --git a/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h
index 83b651b8..e53f21e 100644
--- a/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h
@@ -19,7 +19,6 @@
 
 class CoreOobeView;
 class Key;
-class SigninScreenHandlerDelegate;
 
 // A class that handles WebUI hooks in Active Directory password change  screen.
 class ActiveDirectoryPasswordChangeScreenHandler : public BaseScreenHandler {
@@ -42,10 +41,8 @@
                       const std::string& new_password);
   void HandleCancel();
 
-  // Shows the password change screen for |username|. Uses |delegate| to
-  // compelete authentication process.
-  void ShowScreen(const std::string& username,
-                  SigninScreenHandlerDelegate* delegate);
+  // Shows the password change screen for |username|.
+  void ShowScreen(const std::string& username);
 
  private:
   // Shows the screen with the error message corresponding to |error|.
@@ -63,9 +60,6 @@
   // password on the Active Directory server.
   std::unique_ptr<AuthPolicyLoginHelper> authpolicy_login_helper_;
 
-  // Non-owned. Used to complete authentication process.
-  SigninScreenHandlerDelegate* delegate_ = nullptr;
-
   // Non-owned. Used to display signin error.
   CoreOobeView* core_oobe_view_ = nullptr;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index e5e0153..d03ae5f 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/chromeos/login/lock_screen_utils.h"
 #include "chrome/browser/chromeos/login/screens/network_error.h"
 #include "chrome/browser/chromeos/login/signin_partition_manager.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
 #include "chrome/browser/chromeos/net/network_portal_detector_impl.h"
@@ -553,8 +554,9 @@
 }
 
 void GaiaScreenHandler::HandleIdentifierEntered(const std::string& user_email) {
-  if (!Delegate()->IsUserWhitelisted(user_manager::known_user::GetAccountId(
-          user_email, std::string() /* id */, AccountType::UNKNOWN)))
+  if (!LoginDisplayHost::default_host()->IsUserWhitelisted(
+          user_manager::known_user::GetAccountId(
+              user_email, std::string() /* id */, AccountType::UNKNOWN)))
     ShowWhitelistCheckFailedError();
 }
 
@@ -629,21 +631,20 @@
              !account_info.account_id().empty());
       const AccountId account_id(GetAccountId(
           username, account_info.account_id(), AccountType::ACTIVE_DIRECTORY));
-      Delegate()->SetDisplayAndGivenName(account_info.display_name(),
-                                         account_info.given_name());
+      LoginDisplayHost::default_host()->SetDisplayAndGivenName(
+          account_info.display_name(), account_info.given_name());
       UserContext user_context(account_id);
       user_context.SetKey(key);
       user_context.SetAuthFlow(UserContext::AUTH_FLOW_ACTIVE_DIRECTORY);
       user_context.SetIsUsingOAuth(false);
       user_context.SetUserType(
           user_manager::UserType::USER_TYPE_ACTIVE_DIRECTORY);
-      Delegate()->CompleteLogin(user_context);
+      LoginDisplayHost::default_host()->CompleteLogin(user_context);
       break;
     }
     case authpolicy::ERROR_PASSWORD_EXPIRED:
       DCHECK(active_directory_password_change_screen_handler_);
-      active_directory_password_change_screen_handler_->ShowScreen(username,
-                                                                   Delegate());
+      active_directory_password_change_screen_handler_->ShowScreen(username);
       break;
     case authpolicy::ERROR_PARSE_UPN_FAILED:
     case authpolicy::ERROR_BAD_USER_NAME:
@@ -667,7 +668,7 @@
 void GaiaScreenHandler::HandleCompleteAdAuthentication(
     const std::string& username,
     const std::string& password) {
-  Delegate()->SetDisplayEmail(username);
+  LoginDisplayHost::default_host()->SetDisplayEmail(username);
   set_populated_email(username);
   DCHECK(authpolicy_login_helper_);
   authpolicy_login_helper_->AuthenticateUser(
@@ -688,13 +689,10 @@
     const std::string& auth_code,
     bool using_saml,
     const std::string& gaps_cookie) {
-  if (!Delegate())
-    return;
-
   DCHECK(!email.empty());
   DCHECK(!gaia_id.empty());
   const std::string sanitized_email = gaia::SanitizeEmail(email);
-  Delegate()->SetDisplayEmail(sanitized_email);
+  LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
 
   UserContext user_context(GetAccountId(email, gaia_id, AccountType::GOOGLE));
   user_context.SetKey(Key(password));
@@ -703,7 +701,7 @@
                                ? UserContext::AUTH_FLOW_GAIA_WITH_SAML
                                : UserContext::AUTH_FLOW_GAIA_WITHOUT_SAML);
   user_context.SetGAPSCookie(gaps_cookie);
-  Delegate()->CompleteLogin(user_context);
+  LoginDisplayHost::default_host()->CompleteLogin(user_context);
 }
 
 void GaiaScreenHandler::HandleCompleteLogin(const std::string& gaia_id,
@@ -748,31 +746,28 @@
 
   if (test_expects_complete_login_)
     SubmitLoginFormForTest();
-  if (Delegate())
-    Delegate()->OnGaiaScreenReady();
+
+  LoginDisplayHost::default_host()->OnGaiaScreenReady();
 }
 
 void GaiaScreenHandler::DoCompleteLogin(const std::string& gaia_id,
                                         const std::string& typed_email,
                                         const std::string& password,
                                         bool using_saml) {
-  if (!Delegate())
-    return;
-
   if (using_saml && !using_saml_api_)
     RecordSAMLScrapingVerificationResultInHistogram(true);
 
   DCHECK(!typed_email.empty());
   DCHECK(!gaia_id.empty());
   const std::string sanitized_email = gaia::SanitizeEmail(typed_email);
-  Delegate()->SetDisplayEmail(sanitized_email);
+  LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
   UserContext user_context(
       GetAccountId(typed_email, gaia_id, AccountType::GOOGLE));
   user_context.SetKey(Key(password));
   user_context.SetAuthFlow(using_saml
                                ? UserContext::AUTH_FLOW_GAIA_WITH_SAML
                                : UserContext::AUTH_FLOW_GAIA_WITHOUT_SAML);
-  Delegate()->CompleteLogin(user_context);
+  LoginDisplayHost::default_host()->CompleteLogin(user_context);
 
   if (test_expects_complete_login_) {
     VLOG(2) << "Complete test login for " << typed_email
@@ -886,10 +881,8 @@
 }
 
 void GaiaScreenHandler::ShowGaiaScreenIfReady() {
-  if (!dns_cleared_ ||
-      !cookies_cleared_ ||
-      !show_when_dns_and_cookies_cleared_ ||
-      !Delegate()) {
+  if (!dns_cleared_ || !cookies_cleared_ ||
+      !show_when_dns_and_cookies_cleared_) {
     return;
   }
 
@@ -903,10 +896,11 @@
 
   // Note that LoadAuthExtension clears |populated_email_|.
   if (populated_email_.empty()) {
-    Delegate()->LoadSigninWallpaper();
+    LoginDisplayHost::default_host()->LoadSigninWallpaper();
   } else {
-    Delegate()->LoadWallpaper(user_manager::known_user::GetAccountId(
-        populated_email_, std::string() /* id */, AccountType::UNKNOWN));
+    LoginDisplayHost::default_host()->LoadWallpaper(
+        user_manager::known_user::GetAccountId(
+            populated_email_, std::string() /* id */, AccountType::UNKNOWN));
   }
 
   input_method::InputMethodManager* imm =
@@ -1027,10 +1021,6 @@
     signin_screen_handler_->UpdateState(reason);
 }
 
-SigninScreenHandlerDelegate* GaiaScreenHandler::Delegate() {
-  return signin_screen_handler_->delegate_;
-}
-
 bool GaiaScreenHandler::IsRestrictiveProxy() const {
   return !disable_restrictive_proxy_check_for_test_ &&
          !IsOnline(captive_portal_status_);
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
index 749c2de03..808afdd 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -29,7 +29,6 @@
 class ActiveDirectoryPasswordChangeScreenHandler;
 class Key;
 class SigninScreenHandler;
-class SigninScreenHandlerDelegate;
 
 // A class that handles WebUI hooks in Gaia screen.
 class GaiaScreenHandler : public BaseScreenHandler,
@@ -194,8 +193,6 @@
   // Are we on a restrictive proxy?
   bool IsRestrictiveProxy() const;
 
-  SigninScreenHandlerDelegate* Delegate();
-
   // Returns temporary unused device Id.
   std::string GetTemporaryDeviceId();
 
diff --git a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
index 8cd3308..3cfd3d75 100644
--- a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
@@ -6,13 +6,16 @@
 
 #include "chrome/browser/chromeos/login/ui/login_display_webui.h"
 #include "chrome/browser/chromeos/options/network_config_view.h"
+#include "chrome/browser/ui/webui/chromeos/internet_config_dialog.h"
 #include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
 #include "chrome/browser/ui/webui/chromeos/login/network_dropdown.h"
 #include "chrome/grit/generated_resources.h"
+#include "chromeos/chromeos_switches.h"
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/network/network_type_pattern.h"
 #include "components/login/localized_values_builder.h"
+#include "components/onc/onc_constants.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
 namespace {
@@ -89,7 +92,12 @@
     handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(), true,
                                   network_handler::ErrorCallback());
   }
-  NetworkConfigView::ShowForType(shill::kTypeWifi);
+  if (chromeos::switches::IsNetworkSettingsConfigEnabled()) {
+    chromeos::InternetConfigDialog::ShowDialogForNetworkType(
+        ::onc::network_type::kWiFi);
+  } else {
+    NetworkConfigView::ShowForType(shill::kTypeWifi);
+  }
 }
 
 void NetworkDropdownHandler::HandleShowNetworkDetails(
diff --git a/chrome/browser/ui/webui/memory_internals_ui.cc b/chrome/browser/ui/webui/memory_internals_ui.cc
index ebf83424..425f41bc 100644
--- a/chrome/browser/ui/webui/memory_internals_ui.cc
+++ b/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -61,11 +61,6 @@
     case ProfilingProcessHost::Mode::kGpu:
       return std::string("Memory logging is enabled for just the gpu process.");
 
-    case ProfilingProcessHost::Mode::kManual:
-      return std::string(
-          "Memory logging must be manually enabled for each process via "
-          "chrome://memory-internals.");
-
     case ProfilingProcessHost::Mode::kMinimal:
       return std::string(
           "Memory logging is enabled for the browser and GPU processes.");
@@ -76,14 +71,11 @@
           "processes. This UI is disabled.");
 
     case ProfilingProcessHost::Mode::kNone:
+    case ProfilingProcessHost::Mode::kManual:
     default:
-      return base::StringPrintf(
-          "Memory logging is not enabled. Start with --%s=%s"
-          " to log all processes, or --%s=%s to log only the browser and GPU "
-          "processes. "
-          "Other options available in chrome://flags",
-          switches::kMemlog, switches::kMemlogModeAll, switches::kMemlog,
-          switches::kMemlogModeMinimal);
+      return std::string(
+          "Memory logging must be manually enabled for each process via "
+          "chrome://memory-internals.");
   }
 #elif defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
   return "Memory logging is not available in this build because a memory "
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn
index b3e3d513..95b8c47 100644
--- a/chrome/browser/vr/BUILD.gn
+++ b/chrome/browser/vr/BUILD.gn
@@ -137,6 +137,7 @@
     "model/camera_model.h",
     "model/color_scheme.cc",
     "model/color_scheme.h",
+    "model/controller_model.cc",
     "model/controller_model.h",
     "model/modal_prompt_type.cc",
     "model/modal_prompt_type.h",
diff --git a/chrome/browser/vr/elements/text.cc b/chrome/browser/vr/elements/text.cc
index 4db39e12..3c1cd1d 100644
--- a/chrome/browser/vr/elements/text.cc
+++ b/chrome/browser/vr/elements/text.cc
@@ -19,6 +19,7 @@
 
 constexpr float kCursorWidthRatio = 0.07f;
 constexpr int kTextPixelPerDmm = 1100;
+constexpr float kTextShadowScaleFactor = 1000.0f;
 
 int DmmToPixel(float dmm) {
   return static_cast<int>(dmm * kTextPixelPerDmm);
@@ -119,6 +120,10 @@
     SetAndDirty(&cursor_position_, position);
   }
 
+  void SetShadowsEnabled(bool enabled) {
+    SetAndDirty(&shadows_enabled_, enabled);
+  }
+
   void SetTextWidth(float width) { SetAndDirty(&text_width_, width); }
 
   gfx::SizeF GetDrawnSize() const override { return size_; }
@@ -155,6 +160,7 @@
   bool cursor_enabled_ = false;
   int cursor_position_ = 0;
   gfx::Rect cursor_bounds_;
+  bool shadows_enabled_ = false;
   std::vector<std::unique_ptr<gfx::RenderText>> lines_;
 
   DISALLOW_COPY_AND_ASSIGN(TextTexture);
@@ -215,6 +221,10 @@
       bounds.height() * scale * kCursorWidthRatio, bounds.height() * scale);
 }
 
+void Text::SetShadowsEnabled(bool enabled) {
+  texture_->SetShadowsEnabled(enabled);
+}
+
 void Text::OnSetSize(const gfx::SizeF& size) {
   if (IsFixedWidthLayout(text_layout_mode_))
     texture_->SetTextWidth(size.width());
@@ -263,6 +273,8 @@
                                      : kWrappingBehaviorNoWrap;
   parameters.cursor_enabled = cursor_enabled_;
   parameters.cursor_position = cursor_position_;
+  parameters.shadows_enabled = shadows_enabled_;
+  parameters.shadow_size = kTextShadowScaleFactor * font_height_dmms_;
 
   lines_ =
       // TODO(vollick): if this subsumes all text, then we should probably move
diff --git a/chrome/browser/vr/elements/text.h b/chrome/browser/vr/elements/text.h
index a67c9e6..2a929688 100644
--- a/chrome/browser/vr/elements/text.h
+++ b/chrome/browser/vr/elements/text.h
@@ -100,6 +100,9 @@
   // texture size, relative to the upper-left corner of the element.
   gfx::RectF GetCursorBounds() const;
 
+  // This causes the text to become uniformly shadowed.
+  void SetShadowsEnabled(bool enabled);
+
   void OnSetSize(const gfx::SizeF& size) override;
   void UpdateElementSize() override;
 
diff --git a/chrome/browser/vr/elements/ui_element.cc b/chrome/browser/vr/elements/ui_element.cc
index 8369d854..93d259a 100644
--- a/chrome/browser/vr/elements/ui_element.cc
+++ b/chrome/browser/vr/elements/ui_element.cc
@@ -552,8 +552,7 @@
 
 gfx::PointF UiElement::GetUnitRectangleCoordinates(
     const gfx::Point3F& world_point) const {
-  // TODO(acondor): Simplify the math in this function.
-  gfx::Point3F origin(0, 0, 0);
+  gfx::Point3F origin;
   gfx::Vector3dF x_axis(1, 0, 0);
   gfx::Vector3dF y_axis(0, 1, 0);
   world_space_transform_.TransformPoint(&origin);
diff --git a/chrome/browser/vr/elements/ui_element_name.cc b/chrome/browser/vr/elements/ui_element_name.cc
index 93ae181..b2fad274 100644
--- a/chrome/browser/vr/elements/ui_element_name.cc
+++ b/chrome/browser/vr/elements/ui_element_name.cc
@@ -116,6 +116,8 @@
     "kSpeechRecognitionListeningGrowingCircle",
     "kSpeechRecognitionListeningCloseButton",
     "kDownloadedSnackbar",
+    "kControllerTrackpadLabel",
+    "kControllerExitButtonLabel",
 };
 
 static_assert(
diff --git a/chrome/browser/vr/elements/ui_element_name.h b/chrome/browser/vr/elements/ui_element_name.h
index 0549f88..9857f5d 100644
--- a/chrome/browser/vr/elements/ui_element_name.h
+++ b/chrome/browser/vr/elements/ui_element_name.h
@@ -115,6 +115,8 @@
   kSpeechRecognitionListeningGrowingCircle,
   kSpeechRecognitionListeningCloseButton,
   kDownloadedSnackbar,
+  kControllerTrackpadLabel,
+  kControllerExitButtonLabel,
 
   // This must be last.
   kNumUiElementNames,
diff --git a/chrome/browser/vr/elements/ui_texture.cc b/chrome/browser/vr/elements/ui_texture.cc
index 711bfec..f3182db97 100644
--- a/chrome/browser/vr/elements/ui_texture.cc
+++ b/chrome/browser/vr/elements/ui_texture.cc
@@ -19,6 +19,7 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/font_list.h"
 #include "ui/gfx/render_text.h"
+#include "ui/gfx/shadow_value.h"
 #include "ui/gfx/text_elider.h"
 #include "ui/gl/gl_bindings.h"
 
@@ -26,7 +27,7 @@
 
 namespace {
 
-static constexpr char kDefaultFontFamily[] = "sans-serif";
+constexpr char kDefaultFontFamily[] = "sans-serif";
 
 static bool force_font_fallback_failure_for_testing_ = false;
 
@@ -102,7 +103,9 @@
     int line_height = 0;
     for (size_t i = 0; i < strings.size(); i++) {
       std::unique_ptr<gfx::RenderText> render_text = CreateConfiguredRenderText(
-          strings[i], font_list, parameters.color, parameters.text_alignment);
+          strings[i], font_list, parameters.color, parameters.text_alignment,
+          parameters.shadows_enabled, parameters.shadow_color,
+          parameters.shadow_size);
 
       if (i == 0) {
         // Measure line and center text vertically.
@@ -126,7 +129,9 @@
 
   } else {
     std::unique_ptr<gfx::RenderText> render_text = CreateConfiguredRenderText(
-        text, font_list, parameters.color, parameters.text_alignment);
+        text, font_list, parameters.color, parameters.text_alignment,
+        parameters.shadows_enabled, parameters.shadow_color,
+        parameters.shadow_size);
     if (bounds->width() != 0 && !parameters.cursor_enabled)
       render_text->SetElideBehavior(gfx::TRUNCATE);
     if (parameters.cursor_enabled) {
@@ -158,11 +163,18 @@
     const base::string16& text,
     const gfx::FontList& font_list,
     SkColor color,
-    UiTexture::TextAlignment text_alignment) {
+    UiTexture::TextAlignment text_alignment,
+    bool shadows_enabled,
+    SkColor shadow_color,
+    float shadow_size) {
   std::unique_ptr<gfx::RenderText> render_text(CreateRenderText());
   render_text->SetText(text);
   render_text->SetFontList(font_list);
   render_text->SetColor(color);
+  if (shadows_enabled) {
+    render_text->set_shadows(
+        {gfx::ShadowValue({0, 0}, shadow_size, shadow_color)});
+  }
 
   switch (text_alignment) {
     case UiTexture::kTextAlignmentNone:
diff --git a/chrome/browser/vr/elements/ui_texture.h b/chrome/browser/vr/elements/ui_texture.h
index 86eeb197..cfc31bd 100644
--- a/chrome/browser/vr/elements/ui_texture.h
+++ b/chrome/browser/vr/elements/ui_texture.h
@@ -85,6 +85,9 @@
     WrappingBehavior wrapping_behavior = kWrappingBehaviorNoWrap;
     bool cursor_enabled = false;
     int cursor_position = 0;
+    bool shadows_enabled = false;
+    SkColor shadow_color = SK_ColorBLACK;
+    float shadow_size = 10.0f;
   };
 
  protected:
@@ -125,7 +128,10 @@
       const base::string16& text,
       const gfx::FontList& font_list,
       SkColor color,
-      TextAlignment text_alignment);
+      TextAlignment text_alignment,
+      bool shadows_enabled,
+      SkColor shadow_color,
+      float shadow_size);
 
   static bool IsRTL();
   static void SetForceFontFallbackFailureForTesting(bool force);
diff --git a/chrome/browser/vr/model/color_scheme.cc b/chrome/browser/vr/model/color_scheme.cc
index e000d7ae..b560c583 100644
--- a/chrome/browser/vr/model/color_scheme.cc
+++ b/chrome/browser/vr/model/color_scheme.cc
@@ -140,6 +140,8 @@
   normal_scheme.snackbar_button_colors.background_hover = 0xDD2D2D2D;
   normal_scheme.snackbar_button_colors.background_down = 0xDD2D2D2D;
 
+  normal_scheme.controller_label_callout = SK_ColorWHITE;
+
   normal_scheme.normal_factor = 1.0f;
   normal_scheme.incognito_factor = 0.0f;
   normal_scheme.fullscreen_factor = 0.0f;
diff --git a/chrome/browser/vr/model/color_scheme.h b/chrome/browser/vr/model/color_scheme.h
index ab18df31..4a7f2b67 100644
--- a/chrome/browser/vr/model/color_scheme.h
+++ b/chrome/browser/vr/model/color_scheme.h
@@ -118,6 +118,8 @@
   SkColor snackbar_foreground;
   ButtonColors snackbar_button_colors;
 
+  SkColor controller_label_callout;
+
   // These are used for blending between colors that are available only in
   // shaders. They are, as you might expect, one for a given mode, but zero
   // otherwise.
diff --git a/chrome/browser/vr/model/controller_model.cc b/chrome/browser/vr/model/controller_model.cc
new file mode 100644
index 0000000..818d925
--- /dev/null
+++ b/chrome/browser/vr/model/controller_model.cc
@@ -0,0 +1,25 @@
+// Copyright 2018 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/vr/model/controller_model.h"
+
+namespace vr {
+
+ControllerModel::ControllerModel() = default;
+
+ControllerModel::ControllerModel(const ControllerModel& other)
+    : transform(other.transform),
+      laser_direction(other.laser_direction),
+      laser_origin(other.laser_origin),
+      touchpad_button_state(other.touchpad_button_state),
+      app_button_state(other.app_button_state),
+      home_button_state(other.home_button_state),
+      opacity(other.opacity),
+      quiescent(other.quiescent),
+      resting_in_viewport(other.resting_in_viewport),
+      handedness(other.handedness) {}
+
+ControllerModel::~ControllerModel() = default;
+
+}  // namespace vr
diff --git a/chrome/browser/vr/model/controller_model.h b/chrome/browser/vr/model/controller_model.h
index 9e6a4f8..6b1e54f 100644
--- a/chrome/browser/vr/model/controller_model.h
+++ b/chrome/browser/vr/model/controller_model.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_VR_MODEL_CONTROLLER_MODEL_H_
 #define CHROME_BROWSER_VR_MODEL_CONTROLLER_MODEL_H_
 
+#include "chrome/browser/vr/platform_controller.h"
 #include "chrome/browser/vr/ui_input_manager.h"
 #include "ui/gfx/geometry/point3_f.h"
 #include "ui/gfx/transform.h"
@@ -16,6 +17,10 @@
 // UiInputManager (for generating gestures), and by the UI for rendering the
 // controller.
 struct ControllerModel {
+  ControllerModel();
+  ControllerModel(const ControllerModel& other);
+  ~ControllerModel();
+
   gfx::Transform transform;
   gfx::Vector3dF laser_direction;
   gfx::Point3F laser_origin;
@@ -24,6 +29,8 @@
   UiInputManager::ButtonState home_button_state = UiInputManager::UP;
   float opacity = 1.0f;
   bool quiescent = false;
+  bool resting_in_viewport = false;
+  PlatformController::Handedness handedness = PlatformController::kRightHanded;
 };
 
 }  // namespace vr
diff --git a/chrome/browser/vr/platform_controller.h b/chrome/browser/vr/platform_controller.h
index fe0718e3..83b15ec8 100644
--- a/chrome/browser/vr/platform_controller.h
+++ b/chrome/browser/vr/platform_controller.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_VR_PLATFORM_CONTROLLER_H_
 #define CHROME_BROWSER_VR_PLATFORM_CONTROLLER_H_
 
+#include "base/time/time.h"
+
 namespace vr {
 
 // This class is not platform-specific.  It will be backed by platform-specific
@@ -29,12 +31,18 @@
     kSwipeDirectionDown,
   };
 
+  enum Handedness {
+    kRightHanded,
+    kLeftHanded,
+  };
+
   virtual ~PlatformController() {}
 
   virtual bool IsButtonDown(ButtonType type) const = 0;
   virtual base::TimeTicks GetLastOrientationTimestamp() const = 0;
   virtual base::TimeTicks GetLastTouchTimestamp() const = 0;
   virtual base::TimeTicks GetLastButtonTimestamp() const = 0;
+  virtual Handedness GetHandedness() const = 0;
 };
 
 }  // namespace vr
diff --git a/chrome/browser/vr/test/ui_pixel_test.cc b/chrome/browser/vr/test/ui_pixel_test.cc
index 1dd3c20..8aeebb7 100644
--- a/chrome/browser/vr/test/ui_pixel_test.cc
+++ b/chrome/browser/vr/test/ui_pixel_test.cc
@@ -92,7 +92,7 @@
   ReticleModel reticle_model;
   EXPECT_TRUE(
       ui_->scene()->OnBeginFrame(base::TimeTicks(), render_info.head_pose));
-  ui_->input_manager()->HandleInput(MsToTicks(1), controller_model,
+  ui_->input_manager()->HandleInput(MsToTicks(1), render_info, controller_model,
                                     &reticle_model, &gesture_list);
   ui_->OnControllerUpdated(controller_model, reticle_model);
   ui_->ui_renderer()->Draw(render_info);
diff --git a/chrome/browser/vr/testapp/vr_test_context.cc b/chrome/browser/vr/testapp/vr_test_context.cc
index 25a94ba..2fbc2d0 100644
--- a/chrome/browser/vr/testapp/vr_test_context.cc
+++ b/chrome/browser/vr/testapp/vr_test_context.cc
@@ -55,7 +55,7 @@
 constexpr float kViewScaleAdjustmentFactor = 0.2f;
 constexpr float kPageLoadTimeMilliseconds = 500;
 
-constexpr gfx::Point3F kLaserOrigin = {0.5f, -0.5f, 0.f};
+constexpr gfx::Point3F kDefaultLaserOrigin = {0.5f, -0.5f, 0.f};
 constexpr gfx::Vector3dF kLaserLocalOffset = {0.f, -0.0075f, -0.05f};
 constexpr float kControllerScaleFactor = 1.5f;
 
@@ -123,15 +123,9 @@
 void VrTestContext::DrawFrame() {
   base::TimeTicks current_time = base::TimeTicks::Now();
 
-  RenderInfo render_info;
-  render_info.head_pose = head_pose_;
-  render_info.surface_texture_size = window_size_;
-  render_info.left_eye_model.viewport = gfx::Rect(window_size_);
-  render_info.left_eye_model.view_matrix = head_pose_;
-  render_info.left_eye_model.proj_matrix = ProjectionMatrix();
-  render_info.left_eye_model.view_proj_matrix = ViewProjectionMatrix();
+  RenderInfo render_info = GetRenderInfo();
 
-  UpdateController();
+  UpdateController(render_info);
 
   // Update the render position of all UI elements (including desktop).
   ui_->scene()->OnBeginFrame(current_time, head_pose_);
@@ -168,6 +162,11 @@
         fullscreen_ = !fullscreen_;
         ui_->SetFullscreen(fullscreen_);
         break;
+      case ui::DomCode::US_H:
+        handedness_ = handedness_ == PlatformController::kRightHanded
+                          ? PlatformController::kLeftHanded
+                          : PlatformController::kRightHanded;
+        break;
       case ui::DomCode::US_I:
         incognito_ = !incognito_;
         ui_->SetIncognito(incognito_);
@@ -270,10 +269,10 @@
   head_pose_.RotateAboutYAxis(-head_angle_y_degrees_);
 
   last_mouse_point_ = gfx::Point(mouse_event->x(), mouse_event->y());
-  last_controller_model_ = UpdateController();
+  last_controller_model_ = UpdateController(GetRenderInfo());
 }
 
-ControllerModel VrTestContext::UpdateController() {
+ControllerModel VrTestContext::UpdateController(const RenderInfo& render_info) {
   // We could map mouse position to controller position, and skip this logic,
   // but it will make targeting elements with a mouse feel strange and not
   // mouse-like. Instead, we make the reticle track the mouse position linearly
@@ -308,8 +307,10 @@
   CHECK(controller_model.laser_direction.GetNormalized(
       &controller_model.laser_direction));
 
-  controller_model.transform.Translate3d(kLaserOrigin.x(), kLaserOrigin.y(),
-                                         kLaserOrigin.z());
+  gfx::Point3F laser_origin = LaserOrigin();
+
+  controller_model.transform.Translate3d(laser_origin.x(), laser_origin.y(),
+                                         laser_origin.z());
   controller_model.transform.Scale3d(
       kControllerScaleFactor, kControllerScaleFactor, kControllerScaleFactor);
   RotateToward(controller_model.laser_direction, &controller_model.transform);
@@ -317,23 +318,25 @@
   // Hit testing is done in terms of this synthesized controller model.
   GestureList gesture_list;
   ReticleModel reticle_model;
-  ui_->input_manager()->HandleInput(base::TimeTicks::Now(), controller_model,
-                                    &reticle_model, &gesture_list);
+  ui_->input_manager()->HandleInput(base::TimeTicks::Now(), render_info,
+                                    controller_model, &reticle_model,
+                                    &gesture_list);
 
   // Now that we have accurate hit information, we use this to construct a
   // controller model for display.
-  controller_model.laser_direction = reticle_model.target_point - kLaserOrigin;
+  controller_model.laser_direction = reticle_model.target_point - laser_origin;
 
   controller_model.transform.MakeIdentity();
-  controller_model.transform.Translate3d(kLaserOrigin.x(), kLaserOrigin.y(),
-                                         kLaserOrigin.z());
+  controller_model.transform.Translate3d(laser_origin.x(), laser_origin.y(),
+                                         laser_origin.z());
   controller_model.transform.Scale3d(
       kControllerScaleFactor, kControllerScaleFactor, kControllerScaleFactor);
   RotateToward(controller_model.laser_direction, &controller_model.transform);
 
   gfx::Vector3dF local_offset = kLaserLocalOffset;
   controller_model.transform.TransformVector(&local_offset);
-  controller_model.laser_origin = kLaserOrigin + local_offset;
+  controller_model.laser_origin = laser_origin + local_offset;
+  controller_model.handedness = handedness_;
 
   ui_->OnControllerUpdated(controller_model, reticle_model);
 
@@ -575,4 +578,24 @@
 #endif  // defined(GOOGLE_CHROME_BUILD)
 }
 
+RenderInfo VrTestContext::GetRenderInfo() const {
+  RenderInfo render_info;
+  render_info.head_pose = head_pose_;
+  render_info.surface_texture_size = window_size_;
+  render_info.left_eye_model.viewport = gfx::Rect(window_size_);
+  render_info.left_eye_model.view_matrix = head_pose_;
+  render_info.left_eye_model.proj_matrix = ProjectionMatrix();
+  render_info.left_eye_model.view_proj_matrix = ViewProjectionMatrix();
+  render_info.right_eye_model = render_info.left_eye_model;
+  return render_info;
+}
+
+gfx::Point3F VrTestContext::LaserOrigin() const {
+  gfx::Point3F origin = kDefaultLaserOrigin;
+  if (handedness_ == PlatformController::kLeftHanded) {
+    origin.set_x(-origin.x());
+  }
+  return origin;
+}
+
 }  // namespace vr
diff --git a/chrome/browser/vr/testapp/vr_test_context.h b/chrome/browser/vr/testapp/vr_test_context.h
index f162d28..14a58f88 100644
--- a/chrome/browser/vr/testapp/vr_test_context.h
+++ b/chrome/browser/vr/testapp/vr_test_context.h
@@ -13,6 +13,7 @@
 #include "chrome/browser/vr/content_input_delegate.h"
 #include "chrome/browser/vr/model/controller_model.h"
 #include "chrome/browser/vr/ui_browser_interface.h"
+#include "chrome/browser/vr/ui_renderer.h"
 #include "ui/gfx/transform.h"
 
 namespace ui {
@@ -64,9 +65,11 @@
   void CycleWebVrModes();
   void ToggleSplashScreen();
   void CycleOrigin();
+  RenderInfo GetRenderInfo() const;
   gfx::Transform ProjectionMatrix() const;
   gfx::Transform ViewProjectionMatrix() const;
-  ControllerModel UpdateController();
+  ControllerModel UpdateController(const RenderInfo& render_info);
+  gfx::Point3F LaserOrigin() const;
 
   std::unique_ptr<Ui> ui_;
   gfx::Size window_size_;
@@ -95,6 +98,8 @@
   std::unique_ptr<TextInputDelegate> text_input_delegate_;
   std::unique_ptr<TestKeyboardDelegate> keyboard_delegate_;
 
+  PlatformController::Handedness handedness_ = PlatformController::kRightHanded;
+
   DISALLOW_COPY_AND_ASSIGN(VrTestContext);
 };
 
diff --git a/chrome/browser/vr/ui.cc b/chrome/browser/vr/ui.cc
index 026f2d420..70efb8cc 100644
--- a/chrome/browser/vr/ui.cc
+++ b/chrome/browser/vr/ui.cc
@@ -273,6 +273,8 @@
   model_->controller = controller_model;
   model_->reticle = reticle_model;
   model_->controller.quiescent = input_manager_->controller_quiescent();
+  model_->controller.resting_in_viewport =
+      input_manager_->controller_resting_in_viewport();
 }
 
 void Ui::OnProjMatrixChanged(const gfx::Transform& proj_matrix) {
diff --git a/chrome/browser/vr/ui_input_manager.cc b/chrome/browser/vr/ui_input_manager.cc
index ccdcba25..d305909 100644
--- a/chrome/browser/vr/ui_input_manager.cc
+++ b/chrome/browser/vr/ui_input_manager.cc
@@ -22,13 +22,25 @@
 
 namespace {
 
-static constexpr gfx::PointF kInvalidTargetPoint =
+constexpr gfx::PointF kInvalidTargetPoint =
     gfx::PointF(std::numeric_limits<float>::max(),
                 std::numeric_limits<float>::max());
-static constexpr gfx::Point3F kOrigin = {0.0f, 0.0f, 0.0f};
 
-static constexpr float kControllerQuiescenceAngularThresholdDegrees = 3.5f;
-static constexpr float kControllerQuiescenceTemporalThresholdSeconds = 1.2f;
+constexpr float kControllerQuiescenceAngularThresholdDegrees = 3.5f;
+constexpr float kControllerQuiescenceTemporalThresholdSeconds = 1.2f;
+constexpr float kControllerFocusThresholdSeconds = 1.0f;
+
+bool IsCentroidInViewport(const gfx::Transform& view_proj_matrix,
+                          const gfx::Transform& world_matrix) {
+  if (world_matrix.IsIdentity()) {
+    // Uninitialized matrices are considered out of the viewport.
+    return false;
+  }
+  gfx::Transform m = view_proj_matrix * world_matrix;
+  gfx::Point3F o;
+  m.TransformPoint(&o);
+  return o.x() > -1.0f && o.x() < 1.0f && o.y() > -1.0f && o.y() < 1.0f;
+}
 
 bool IsScrollEvent(const GestureList& list) {
   if (list.empty()) {
@@ -84,10 +96,12 @@
 UiInputManager::~UiInputManager() {}
 
 void UiInputManager::HandleInput(base::TimeTicks current_time,
+                                 const RenderInfo& render_info,
                                  const ControllerModel& controller_model,
                                  ReticleModel* reticle_model,
                                  GestureList* gesture_list) {
   UpdateQuiescenceState(current_time, controller_model);
+  UpdateControllerFocusState(current_time, render_info, controller_model);
   reticle_model->target_element_id = 0;
   reticle_model->target_local_point = kInvalidTargetPoint;
   GetVisualTargetElement(controller_model, reticle_model);
@@ -114,7 +128,6 @@
     auto* captured = scene_->GetUiElementById(input_capture_element_id_);
     if (captured) {
       HitTestRequest request;
-      request.ray_origin = kOrigin;
       request.ray_target = reticle_model->target_point;
       request.max_distance_to_plane = 2 * scene_->background_distance();
       HitTestResult result;
@@ -361,10 +374,11 @@
   // more intuitive. For testing, however, we occasionally hit test along the
   // laser precisely since this geometric accuracy is important and we are not
   // dealing with a physical controller.
-  gfx::Point3F ray_origin =
-      hit_test_strategy_ == HitTestStrategy::PROJECT_TO_WORLD_ORIGIN
-          ? kOrigin
-          : controller_model.laser_origin;
+  gfx::Point3F ray_origin;
+  if (hit_test_strategy_ == HitTestStrategy::PROJECT_TO_LASER_ORIGIN_FOR_TEST) {
+    ray_origin = controller_model.laser_origin;
+  }
+
   float distance_limit = (reticle_model->target_point - ray_origin).Length();
 
   HitTestRequest request;
@@ -404,6 +418,24 @@
   }
 }
 
+void UiInputManager::UpdateControllerFocusState(
+    base::TimeTicks current_time,
+    const RenderInfo& render_info,
+    const ControllerModel& controller_model) {
+  if (!IsCentroidInViewport(render_info.left_eye_model.view_proj_matrix,
+                            controller_model.transform) &&
+      !IsCentroidInViewport(render_info.right_eye_model.view_proj_matrix,
+                            controller_model.transform)) {
+    last_controller_outside_viewport_time_ = current_time;
+    controller_resting_in_viewport_ = false;
+    return;
+  }
+
+  controller_resting_in_viewport_ =
+      (current_time - last_controller_outside_viewport_time_).InSecondsF() >
+      kControllerFocusThresholdSeconds;
+}
+
 void UiInputManager::UnfocusFocusedElement() {
   if (!focused_element_id_)
     return;
diff --git a/chrome/browser/vr/ui_input_manager.h b/chrome/browser/vr/ui_input_manager.h
index 5ccbfa3b..685d9a2 100644
--- a/chrome/browser/vr/ui_input_manager.h
+++ b/chrome/browser/vr/ui_input_manager.h
@@ -23,6 +23,7 @@
 class UiScene;
 class UiElement;
 struct ControllerModel;
+struct RenderInfo;
 struct ReticleModel;
 struct TextInputInfo;
 
@@ -50,6 +51,7 @@
   ~UiInputManager();
   // TODO(tiborg): Use generic gesture type instead of blink::WebGestureEvent.
   void HandleInput(base::TimeTicks current_time,
+                   const RenderInfo& render_info,
                    const ControllerModel& controller_model,
                    ReticleModel* reticle_model,
                    GestureList* gesture_list);
@@ -62,6 +64,9 @@
   void OnKeyboardHidden();
 
   bool controller_quiescent() const { return controller_quiescent_; }
+  bool controller_resting_in_viewport() const {
+    return controller_resting_in_viewport_;
+  }
 
   void set_hit_test_strategy(HitTestStrategy strategy) {
     hit_test_strategy_ = strategy;
@@ -89,6 +94,9 @@
                               ReticleModel* reticle_model) const;
   void UpdateQuiescenceState(base::TimeTicks current_time,
                              const ControllerModel& controller_model);
+  void UpdateControllerFocusState(base::TimeTicks current_time,
+                                  const RenderInfo& render_info,
+                                  const ControllerModel& controller_model);
 
   void UnfocusFocusedElement();
 
@@ -110,6 +118,9 @@
   base::TimeTicks last_significant_controller_update_time_;
   gfx::Transform last_significant_controller_transform_;
   bool controller_quiescent_ = false;
+
+  base::TimeTicks last_controller_outside_viewport_time_;
+  bool controller_resting_in_viewport_ = false;
 };
 
 }  // namespace vr
diff --git a/chrome/browser/vr/ui_input_manager_unittest.cc b/chrome/browser/vr/ui_input_manager_unittest.cc
index 8809cae..5029782 100644
--- a/chrome/browser/vr/ui_input_manager_unittest.cc
+++ b/chrome/browser/vr/ui_input_manager_unittest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/vr/test/constants.h"
 #include "chrome/browser/vr/test/mock_content_input_delegate.h"
 #include "chrome/browser/vr/test/ui_test.h"
+#include "chrome/browser/vr/ui_renderer.h"
 #include "chrome/browser/vr/ui_scene.h"
 #include "chrome/browser/vr/ui_scene_constants.h"
 #include "chrome/browser/vr/ui_scene_creator.h"
@@ -31,9 +32,13 @@
 
 namespace vr {
 
+namespace {
+
 constexpr UiInputManager::ButtonState kUp = UiInputManager::ButtonState::UP;
 constexpr UiInputManager::ButtonState kDown = UiInputManager::ButtonState::DOWN;
 
+constexpr gfx::Size kWindowSize = {1280, 720};
+
 class MockRect : public Rect {
  public:
   MockRect() = default;
@@ -101,10 +106,11 @@
   void HandleInput(const gfx::Point3F& laser_origin,
                    const gfx::Vector3dF& laser_direction,
                    UiInputManager::ButtonState button_state) {
+    RenderInfo render_info;
     controller_model_.laser_direction = laser_direction;
     controller_model_.laser_origin = laser_origin;
     controller_model_.touchpad_button_state = button_state;
-    input_manager_->HandleInput(MsToTicks(1), controller_model_,
+    input_manager_->HandleInput(MsToTicks(1), render_info, controller_model_,
                                 &reticle_model_, &gesture_list_);
   }
 
@@ -126,6 +132,26 @@
   }
 
  protected:
+  RenderInfo CreateRenderInfo() {
+    RenderInfo render_info;
+    gfx::Transform projection_matrix(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0,
+                                     -1, 0.5);
+    projection_matrix.Scale(
+        1.0f, static_cast<float>(kWindowSize.width()) / kWindowSize.height());
+
+    render_info.head_pose = head_pose_;
+    render_info.surface_texture_size = kWindowSize;
+    render_info.left_eye_model.viewport = gfx::Rect(kWindowSize);
+    render_info.left_eye_model.view_matrix = head_pose_;
+    render_info.left_eye_model.proj_matrix = projection_matrix;
+    render_info.left_eye_model.view_proj_matrix =
+        projection_matrix * head_pose_;
+    render_info.right_eye_model = render_info.left_eye_model;
+
+    return render_info;
+  }
+
+  gfx::Transform head_pose_;
   UiInputManager* input_manager_;
 };
 
@@ -218,13 +244,13 @@
   ReticleModel reticle_model;
   GestureList gesture_list;
 
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
   EXPECT_EQ(0, reticle_model.target_element_id);
 
   controller_model.laser_direction = kForwardVector;
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
   EXPECT_EQ(p_element->id(), reticle_model.target_element_id);
   EXPECT_NEAR(-1.0, reticle_model.target_point.z(), kEpsilon);
 }
@@ -346,8 +372,7 @@
   scene_->AddUiElement(kRoot, std::move(element));
   scene_->OnBeginFrame(base::TimeTicks(), kStartHeadPose);
 
-  gfx::Point3F center;
-  p_element->world_space_transform().TransformPoint(&center);
+  gfx::Point3F center = p_element->GetCenter();
   gfx::Point3F laser_origin(0.5, -0.5, 0.0);
 
   HandleInput(laser_origin, center - laser_origin, kDown);
@@ -375,8 +400,7 @@
   // parameters to HandleInput.
   UiElement* content_quad =
       scene_->GetUiElementByName(UiElementName::kContentQuad);
-  gfx::Point3F content_quad_center;
-  content_quad->world_space_transform().TransformPoint(&content_quad_center);
+  gfx::Point3F content_quad_center = content_quad->GetCenter();
   gfx::Point3F origin;
 
   ControllerModel controller_model;
@@ -385,8 +409,8 @@
   controller_model.touchpad_button_state = UiInputManager::ButtonState::DOWN;
   ReticleModel reticle_model;
   GestureList gesture_list;
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
 
   // We should have hit the content quad if our math was correct.
   ASSERT_NE(0, reticle_model.target_element_id);
@@ -397,8 +421,8 @@
   // set the expected number of calls to zero.
   EXPECT_CALL(*content_input_delegate_, OnContentMove(testing::_)).Times(0);
 
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
 }
 
 TEST_F(UiInputManagerContentTest, ExitPromptHitTesting) {
@@ -407,8 +431,7 @@
 
   UiElement* exit_prompt =
       scene_->GetUiElementByName(UiElementName::kExitPrompt);
-  gfx::Point3F exit_prompt_center;
-  exit_prompt->world_space_transform().TransformPoint(&exit_prompt_center);
+  gfx::Point3F exit_prompt_center = exit_prompt->GetCenter();
   gfx::Point3F origin;
 
   ControllerModel controller_model;
@@ -417,8 +440,8 @@
   controller_model.touchpad_button_state = UiInputManager::ButtonState::DOWN;
   ReticleModel reticle_model;
   GestureList gesture_list;
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
 
   // We should have hit the exit prompt if our math was correct.
   ASSERT_NE(0, reticle_model.target_element_id);
@@ -431,8 +454,7 @@
   EXPECT_TRUE(RunFor(MsToDelta(500)));
 
   UiElement* url_bar = scene_->GetUiElementByName(UiElementName::kUrlBar);
-  gfx::Point3F url_bar_center;
-  url_bar->world_space_transform().TransformPoint(&url_bar_center);
+  gfx::Point3F url_bar_center = url_bar->GetCenter();
   gfx::Point3F origin;
 
   ControllerModel controller_model;
@@ -441,8 +463,8 @@
   controller_model.touchpad_button_state = UiInputManager::ButtonState::DOWN;
   ReticleModel reticle_model;
   GestureList gesture_list;
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
 
   // Even if the reticle is over the URL bar, the backplane should be in front
   // and should be hit.
@@ -457,8 +479,7 @@
   // parameters to HandleInput.
   UiElement* content_quad =
       scene_->GetUiElementByName(UiElementName::kContentQuad);
-  gfx::Point3F content_quad_center;
-  content_quad->world_space_transform().TransformPoint(&content_quad_center);
+  gfx::Point3F content_quad_center = content_quad->GetCenter();
   gfx::Point3F origin;
 
   ControllerModel controller_model;
@@ -467,8 +488,8 @@
   controller_model.touchpad_button_state = UiInputManager::ButtonState::DOWN;
   ReticleModel reticle_model;
   GestureList gesture_list;
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
 
   // We should have hit the content quad if our math was correct.
   ASSERT_NE(0, reticle_model.target_element_id);
@@ -478,8 +499,8 @@
   content_quad->SetTranslate(0, 0, -1.0);
   OnBeginFrame();
 
-  input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
-                              &gesture_list);
+  input_manager_->HandleInput(MsToTicks(1), RenderInfo(), controller_model,
+                              &reticle_model, &gesture_list);
 
   // We should have hit the content quad even though, geometrically, it stacks
   // behind the backplane.
@@ -487,4 +508,50 @@
   EXPECT_EQ(content_quad->id(), reticle_model.target_element_id);
 }
 
+TEST_F(UiInputManagerContentTest, ControllerRestingInViewport) {
+  gfx::Point3F controller_center(0.5f, 0.5f, 0.f);
+
+  head_pose_ = gfx::Transform(
+      gfx::Quaternion(kForwardVector, controller_center - kOrigin));
+
+  ControllerModel controller_model;
+  controller_model.laser_direction = kForwardVector;
+  controller_model.transform.Translate3d(
+      controller_center.x(), controller_center.y(), controller_center.z());
+  controller_model.laser_origin = controller_center;
+  ReticleModel reticle_model;
+  GestureList gesture_list;
+  RenderInfo render_info = CreateRenderInfo();
+
+  // The controller is initially not in the viewport.
+  EXPECT_FALSE(input_manager_->controller_resting_in_viewport());
+
+  input_manager_->HandleInput(MsToTicks(1), render_info, controller_model,
+                              &reticle_model, &gesture_list);
+  ui_->OnControllerUpdated(controller_model, reticle_model);
+  scene_->OnBeginFrame(base::TimeTicks(), head_pose_);
+
+  // Although we are currently looking at the controller, it is not focused yet.
+  // It must remain in the viewport for the requisite amount of time.
+  EXPECT_FALSE(input_manager_->controller_resting_in_viewport());
+
+  input_manager_->HandleInput(MsToTicks(50000), render_info, controller_model,
+                              &reticle_model, &gesture_list);
+  ui_->OnControllerUpdated(controller_model, reticle_model);
+  scene_->OnBeginFrame(base::TimeTicks(), head_pose_);
+
+  // Since the controller has been in the viewport for a long time (50s), it
+  // must report that it is focused.
+  EXPECT_TRUE(input_manager_->controller_resting_in_viewport());
+
+  ui_->OnControllerUpdated(controller_model, reticle_model);
+  scene_->OnBeginFrame(base::TimeTicks(), head_pose_);
+
+  EXPECT_TRUE(model_->controller.resting_in_viewport);
+
+  EXPECT_TRUE(IsVisible(kControllerTrackpadLabel));
+}
+
+}  // namespace
+
 }  // namespace vr
diff --git a/chrome/browser/vr/ui_scene_constants.h b/chrome/browser/vr/ui_scene_constants.h
index c9200a8c..5a64662 100644
--- a/chrome/browser/vr/ui_scene_constants.h
+++ b/chrome/browser/vr/ui_scene_constants.h
@@ -260,6 +260,19 @@
 static constexpr float kSnackbarMoveInAngle = -base::kPiFloat / 10;
 static constexpr int kSnackbarTransitionDurationMs = 300;
 
+static constexpr float kControllerLabelSpacerSize = 0.003f;
+static constexpr float kControllerLabelLayoutMargin = 0.005f;
+static constexpr float kControllerLabelCalloutWidth = 0.025f;
+static constexpr float kControllerLabelCalloutHeight = 0.001f;
+static constexpr float kControllerLabelFontHeight = 0.05f;
+static constexpr float kControllerLabelScale = 0.2f;
+
+// TODO(vollick): these should be encoded in the controller mesh.
+static constexpr float kControllerTrackpadOffset = -0.035f;
+static constexpr float kControllerExitButtonOffset = -0.008f;
+
+static constexpr int kControllerLabelTransitionDurationMs = 700;
+
 static constexpr float kSkyDistance = 1000.0f;
 static constexpr float kGridOpacity = 0.5f;
 
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc
index 50426ec..4ae0a3c 100644
--- a/chrome/browser/vr/ui_scene_creator.cc
+++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -10,6 +10,7 @@
 #include "base/callback.h"
 #include "base/i18n/case_conversion.h"
 #include "base/numerics/math_constants.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/vr/databinding/binding.h"
 #include "chrome/browser/vr/databinding/vector_binding.h"
 #include "chrome/browser/vr/elements/audio_permission_prompt.h"
@@ -415,6 +416,59 @@
   return snackbar_root;
 }
 
+std::unique_ptr<UiElement> CreateControllerLabel(UiElementName name,
+                                                 float z_offset,
+                                                 const base::string16& text,
+                                                 Model* model) {
+  auto layout = Create<LinearLayout>(name, kPhaseNone, LinearLayout::kLeft);
+  layout->set_hit_testable(false);
+  layout->set_margin(kControllerLabelLayoutMargin);
+  layout->SetTranslate(0, 0, z_offset);
+  layout->AddBinding(VR_BIND_FUNC(
+      LayoutAlignment, Model, model,
+      model->controller.handedness == PlatformController::kRightHanded ? LEFT
+                                                                       : RIGHT,
+      LinearLayout, layout.get(), set_x_centering));
+  layout->AddBinding(VR_BIND_FUNC(
+      LinearLayout::Direction, Model, model,
+      model->controller.handedness == PlatformController::kRightHanded
+          ? LinearLayout::kRight
+          : LinearLayout::kLeft,
+      LinearLayout, layout.get(), set_direction));
+
+  auto spacer = std::make_unique<UiElement>();
+  spacer->SetVisible(true);
+  spacer->set_hit_testable(false);
+  spacer->set_requires_layout(true);
+  spacer->SetSize(kControllerLabelSpacerSize, kControllerLabelSpacerSize);
+
+  auto callout = Create<Rect>(kNone, kPhaseForeground);
+  callout->SetVisible(true);
+  callout->set_hit_testable(false);
+  callout->SetColor(SK_ColorWHITE);
+  callout->SetSize(kControllerLabelCalloutWidth, kControllerLabelCalloutHeight);
+  callout->SetRotate(1, 0, 0, -base::kPiFloat / 2);
+
+  auto label =
+      Create<Text>(kNone, kPhaseForeground, kControllerLabelFontHeight);
+  label->SetText(text);
+  label->SetColor(model->color_scheme().controller_label_callout);
+  label->SetVisible(true);
+  label->set_hit_testable(false);
+  label->SetAlignment(UiTexture::kTextAlignmentRight);
+  label->SetLayoutMode(kSingleLineFixedHeight);
+  label->SetRotate(1, 0, 0, -base::kPiFloat / 2);
+  label->SetShadowsEnabled(true);
+  label->SetScale(kControllerLabelScale, kControllerLabelScale,
+                  kControllerLabelScale);
+
+  layout->AddChild(std::move(spacer));
+  layout->AddChild(std::move(callout));
+  layout->AddChild(std::move(label));
+
+  return layout;
+}
+
 }  // namespace
 
 UiSceneCreator::UiSceneCreator(UiBrowserInterface* browser,
@@ -1238,6 +1292,28 @@
   controller->AddBinding(VR_BIND_FUNC(float, Model, model_,
                                       model->controller.opacity, Controller,
                                       controller.get(), SetOpacity));
+
+  auto callout_group = Create<UiElement>(kNone, kPhaseNone);
+  callout_group->SetVisible(false);
+  callout_group->set_hit_testable(false);
+  callout_group->SetTransitionedProperties({OPACITY});
+  callout_group->SetTransitionDuration(
+      base::TimeDelta::FromMilliseconds(kControllerLabelTransitionDurationMs));
+  VR_BIND_VISIBILITY(callout_group, model->controller.resting_in_viewport);
+
+  callout_group->AddChild(CreateControllerLabel(
+      kControllerTrackpadLabel, kControllerTrackpadOffset,
+      l10n_util::GetStringUTF16(IDS_VR_BUTTON_TRACKPAD), model_));
+
+  auto exit_button_label = CreateControllerLabel(
+      kControllerExitButtonLabel, kControllerExitButtonOffset,
+      l10n_util::GetStringUTF16(IDS_VR_BUTTON_EXIT), model_);
+
+  VR_BIND_VISIBILITY(exit_button_label, model->fullscreen_enabled());
+  callout_group->AddChild(std::move(exit_button_label));
+
+  controller->AddChild(std::move(callout_group));
+
   scene_->AddUiElement(kControllerGroup, std::move(controller));
 
   auto laser = std::make_unique<Laser>(model_);
diff --git a/chrome/browser/vr/ui_unittest.cc b/chrome/browser/vr/ui_unittest.cc
index 4aaeca4..5f11028 100644
--- a/chrome/browser/vr/ui_unittest.cc
+++ b/chrome/browser/vr/ui_unittest.cc
@@ -1065,4 +1065,23 @@
   EXPECT_FALSE(IsVisible(k2dBrowsingDefaultBackground));
 }
 
+TEST_F(UiTest, ControllerLabels) {
+  CreateScene(kNotInCct, kNotInWebVr);
+
+  EXPECT_FALSE(IsVisible(kControllerTrackpadLabel));
+  EXPECT_FALSE(IsVisible(kControllerExitButtonLabel));
+
+  model_->controller.resting_in_viewport = true;
+  EXPECT_TRUE(IsVisible(kControllerTrackpadLabel));
+  EXPECT_FALSE(IsVisible(kControllerExitButtonLabel));
+
+  ui_->SetFullscreen(true);
+  EXPECT_TRUE(IsVisible(kControllerTrackpadLabel));
+  EXPECT_TRUE(IsVisible(kControllerExitButtonLabel));
+
+  model_->controller.resting_in_viewport = false;
+  EXPECT_FALSE(IsVisible(kControllerTrackpadLabel));
+  EXPECT_FALSE(IsVisible(kControllerExitButtonLabel));
+}
+
 }  // namespace vr
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 84f478e..0223d3f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4177,6 +4177,7 @@
   if (enable_supervised_users) {
     sources += [
       "../browser/content_settings/content_settings_supervised_provider_unittest.cc",
+      "../browser/supervised_user/child_accounts/child_account_service_unittest.cc",
       "../browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc",
       "../browser/supervised_user/child_accounts/permission_request_creator_apiary_unittest.cc",
       "../browser/supervised_user/experimental/safe_search_url_reporter_unittest.cc",
diff --git a/chrome/test/data/webui/cr_components/network_config_test.js b/chrome/test/data/webui/cr_components/network_config_test.js
index 277710e..977e9d1 100644
--- a/chrome/test/data/webui/cr_components/network_config_test.js
+++ b/chrome/test/data/webui/cr_components/network_config_test.js
@@ -31,14 +31,14 @@
     document.body.appendChild(networkConfig);
     networkConfig.init();
     Polymer.dom.flush();
-  };
+  }
 
   function flushAsync() {
     Polymer.dom.flush();
     return new Promise(resolve => {
       networkConfig.async(resolve);
     });
-  };
+  }
 
   suite('New WiFi Config', function() {
     setup(function() {
@@ -79,7 +79,7 @@
       return flushAsync().then(() => {
         assertEquals('someguid', networkConfig.networkProperties.GUID);
         assertEquals('somename', networkConfig.networkProperties.Name);
-        assertTrue(!!networkConfig.$$('#share'));
+        assertFalse(!!networkConfig.$$('#share'));
         assertTrue(!!networkConfig.$$('#ssid'));
         assertTrue(!!networkConfig.$$('#security'));
         assertTrue(networkConfig.$$('#security').disabled);
@@ -100,20 +100,20 @@
       // Networks must be shared.
       networkConfig.shareAllowEnable = false;
       networkConfig.shareDefault = true;
-    };
+    }
 
     function setKiosk() {
       // New networks can not be shared.
       networkConfig.shareAllowEnable = false;
       networkConfig.shareDefault = false;
-    };
+    }
 
     function setAuthenticated() {
       // Logged in users can share new networks.
       networkConfig.shareAllowEnable = true;
       // Authenticated networks default to not shared.
       networkConfig.shareDefault = false;
-    };
+    }
 
     test('New Config: Login or guest', function() {
       setNetworkConfig({GUID: '', Name: '', Type: 'WiFi'});
@@ -164,28 +164,8 @@
       });
     });
 
-    // Existing networks can not change their shared state.
-
-    test('Existing Shared', function() {
-      var network = {
-        GUID: 'someguid',
-        Name: 'somename',
-        Source: 'Device',
-        Type: 'WiFi',
-        WiFi: {SSID: 'somessid', Security: 'None'}
-      };
-      api_.addNetworksForTest([network]);
-      setNetworkConfig({GUID: 'someguid', Name: '', Type: 'WiFi'});
-      setAuthenticated();
-      return flushAsync().then(() => {
-        let share = networkConfig.$$('#share');
-        assertTrue(!!share);
-        assertTrue(share.disabled);
-        assertTrue(share.checked);
-      });
-    });
-
-    test('Existing Not Shared', function() {
+    // Existing networks hide the shared control in the config UI.
+    test('Existing Hides Shared', function() {
       var network = {
         GUID: 'someguid',
         Name: 'somename',
@@ -197,10 +177,7 @@
       setNetworkConfig({GUID: 'someguid', Name: '', Type: 'WiFi'});
       setAuthenticated();
       return flushAsync().then(() => {
-        let share = networkConfig.$$('#share');
-        assertTrue(!!share);
-        assertTrue(share.disabled);
-        assertFalse(share.checked);
+        assertFalse(!!networkConfig.$$('#share'));
       });
     });
 
diff --git a/chromecast/graphics/BUILD.gn b/chromecast/graphics/BUILD.gn
index 4e6eeb84..c79b5638 100644
--- a/chromecast/graphics/BUILD.gn
+++ b/chromecast/graphics/BUILD.gn
@@ -20,6 +20,9 @@
     sources += [
       "cast_focus_client_aura.cc",
       "cast_focus_client_aura.h",
+      "cast_side_swipe_gesture_handler.h",
+      "cast_system_gesture_event_handler.cc",
+      "cast_system_gesture_event_handler.h",
       "cast_window_manager_aura.cc",
       "cast_window_manager_aura.h",
     ]
diff --git a/chromecast/graphics/DEPS b/chromecast/graphics/DEPS
index 11f2ce64..e88b8a0e 100644
--- a/chromecast/graphics/DEPS
+++ b/chromecast/graphics/DEPS
@@ -3,6 +3,7 @@
   "+ui/base",
   "+ui/base/ime",
   "+ui/display",
+  "+ui/events",
   "+ui/events/test",
   "+ui/gfx",
   "+ui/gl/test",
diff --git a/chromecast/graphics/cast_side_swipe_gesture_handler.h b/chromecast/graphics/cast_side_swipe_gesture_handler.h
new file mode 100644
index 0000000..3ae0f464
--- /dev/null
+++ b/chromecast/graphics/cast_side_swipe_gesture_handler.h
@@ -0,0 +1,39 @@
+// Copyright 2018 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 CHROMECAST_GRAPHICS_CAST_SIDE_SWIPE_GESTURE_HANDLER_H_
+#define CHROMECAST_GRAPHICS_CAST_SIDE_SWIPE_GESTURE_HANDLER_H_
+
+#include "base/macros.h"
+
+namespace ui {
+class GestureEvent;
+}  // namespace ui
+
+namespace chromecast {
+
+enum class CastSideSwipeOrigin { TOP, BOTTOM, LEFT, RIGHT, NONE };
+
+// Interface for handlers triggered on reception of side-swipe gestures on the
+// root window.
+class CastSideSwipeGestureHandlerInterface {
+ public:
+  CastSideSwipeGestureHandlerInterface() = default;
+  virtual ~CastSideSwipeGestureHandlerInterface() = default;
+
+  // Triggered on the beginning of a swipe.
+  virtual void OnSideSwipeBegin(CastSideSwipeOrigin swipe_origin,
+                                ui::GestureEvent* gesture_event) = 0;
+
+  // Triggered on the completion (finger up) of a swipe.
+  virtual void OnSideSwipeEnd(CastSideSwipeOrigin swipe_origin,
+                              ui::GestureEvent* gesture_event) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CastSideSwipeGestureHandlerInterface);
+};
+
+}  // namespace chromecast
+
+#endif  //  CHROMECAST_GRAPHICS_CAST_SIDE_SWIPE_GESTURE_HANDLER_H_
diff --git a/chromecast/graphics/cast_system_gesture_event_handler.cc b/chromecast/graphics/cast_system_gesture_event_handler.cc
new file mode 100644
index 0000000..c292499
--- /dev/null
+++ b/chromecast/graphics/cast_system_gesture_event_handler.cc
@@ -0,0 +1,111 @@
+// Copyright 2018 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 "chromecast/graphics/cast_system_gesture_event_handler.h"
+
+#include "ui/aura/window.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
+#include "ui/events/event.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/wm/core/coordinate_conversion.h"
+
+namespace chromecast {
+
+namespace {
+
+// The number of pixels from the very left or right of the screen to consider as
+// a valid origin for the left or right swipe gesture.
+constexpr int kSideGestureStartWidth = 10;
+
+// The number of pixels from the very top or bottom of the screen to consider as
+// a valid origin for the top or bottom swipe gesture.
+constexpr int kSideGestureStartHeight = 10;
+
+}  // namespace
+
+CastSystemGestureEventHandler::CastSystemGestureEventHandler(
+    aura::Window* root_window)
+    : EventHandler(),
+      root_window_(root_window),
+      current_swipe_(CastSideSwipeOrigin::NONE) {
+  DCHECK(root_window);
+  root_window->AddPreTargetHandler(this);
+}
+
+CastSystemGestureEventHandler::~CastSystemGestureEventHandler() {
+  DCHECK(swipe_gesture_handlers_.empty());
+  root_window_->RemovePreTargetHandler(this);
+}
+
+CastSideSwipeOrigin CastSystemGestureEventHandler::GetDragPosition(
+    const gfx::Point& point,
+    const gfx::Rect& screen_bounds) const {
+  if (point.y() < (screen_bounds.y() + kSideGestureStartHeight)) {
+    return CastSideSwipeOrigin::TOP;
+  }
+  if (point.x() < (screen_bounds.x() + kSideGestureStartWidth)) {
+    return CastSideSwipeOrigin::LEFT;
+  }
+  if (point.x() >
+      (screen_bounds.x() + screen_bounds.width() - kSideGestureStartWidth)) {
+    return CastSideSwipeOrigin::RIGHT;
+  }
+  if (point.y() >
+      (screen_bounds.y() + screen_bounds.height() - kSideGestureStartHeight)) {
+    return CastSideSwipeOrigin::BOTTOM;
+  }
+  return CastSideSwipeOrigin::NONE;
+}
+
+void CastSystemGestureEventHandler::OnGestureEvent(ui::GestureEvent* event) {
+  gfx::Point gesture_location(event->location());
+  aura::Window* target = static_cast<aura::Window*>(event->target());
+
+  // Convert the event's point to the point on the physical screen.
+  // For cast on root window this is likely going to be identical, but put it
+  // through the ScreenPositionClient just to be sure.
+  ::wm::ConvertPointToScreen(target, &gesture_location);
+  gfx::Rect screen_bounds = display::Screen::GetScreen()
+                                ->GetDisplayNearestPoint(gesture_location)
+                                .bounds();
+  CastSideSwipeOrigin side_swipe_origin =
+      GetDragPosition(gesture_location, screen_bounds);
+  if (side_swipe_origin != CastSideSwipeOrigin::NONE ||
+      current_swipe_ != CastSideSwipeOrigin::NONE) {
+    switch (event->type()) {
+      case ui::ET_GESTURE_SCROLL_BEGIN:
+        current_swipe_ = side_swipe_origin;
+        for (auto* side_swipe_handler : swipe_gesture_handlers_) {
+          side_swipe_handler->OnSideSwipeBegin(side_swipe_origin, event);
+        }
+        break;
+      case ui::ET_GESTURE_SCROLL_END:
+      case ui::ET_SCROLL_FLING_START:
+        for (auto* side_swipe_handler : swipe_gesture_handlers_) {
+          side_swipe_handler->OnSideSwipeEnd(current_swipe_, event);
+        }
+        current_swipe_ = CastSideSwipeOrigin::NONE;
+        break;
+      default:
+        break;
+    }
+  }
+}
+
+void CastSystemGestureEventHandler::AddSideSwipeGestureHandler(
+    CastSideSwipeGestureHandlerInterface* handler) {
+  swipe_gesture_handlers_.push_back(handler);
+}
+
+void CastSystemGestureEventHandler::RemoveSideSwipeGestureHandler(
+    CastSideSwipeGestureHandlerInterface* handler) {
+  auto find = std::find(swipe_gesture_handlers_.begin(),
+                        swipe_gesture_handlers_.end(), handler);
+  if (find != swipe_gesture_handlers_.end())
+    swipe_gesture_handlers_.erase(find);
+}
+
+}  // namespace chromecast
diff --git a/chromecast/graphics/cast_system_gesture_event_handler.h b/chromecast/graphics/cast_system_gesture_event_handler.h
new file mode 100644
index 0000000..07746e541
--- /dev/null
+++ b/chromecast/graphics/cast_system_gesture_event_handler.h
@@ -0,0 +1,58 @@
+// Copyright 2018 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 CHROMECAST_GRAPHICS_CAST_SYSTEM_GESTURE_EVENT_HANDLER_H_
+#define CHROMECAST_GRAPHICS_CAST_SYSTEM_GESTURE_EVENT_HANDLER_H_
+
+#include "base/macros.h"
+#include "chromecast/graphics/cast_side_swipe_gesture_handler.h"
+#include "ui/events/event_handler.h"
+
+namespace aura {
+class Window;
+}  // namespace aura
+
+namespace gfx {
+class Point;
+class Rect;
+}  // namespace gfx
+
+namespace chromecast {
+
+// An event handler for detecting system-wide gestures performed on the screen.
+// Recognizes swipe gestures that originate from the top, left, bottom, and
+// right of the root window.
+class CastSystemGestureEventHandler : public ui::EventHandler {
+ public:
+  explicit CastSystemGestureEventHandler(aura::Window* root_window);
+
+  ~CastSystemGestureEventHandler() override;
+
+  // Register a new handler for a side swipe event.
+  void AddSideSwipeGestureHandler(
+      CastSideSwipeGestureHandlerInterface* handler);
+
+  // Remove the registration of a side swipe event handler.
+  void RemoveSideSwipeGestureHandler(
+      CastSideSwipeGestureHandlerInterface* handler);
+
+  CastSideSwipeOrigin GetDragPosition(const gfx::Point& point,
+                                      const gfx::Rect& screen_bounds) const;
+
+  void OnGestureEvent(ui::GestureEvent* event) override;
+
+ private:
+  aura::Window* root_window_;
+  CastSideSwipeOrigin current_swipe_;
+
+  using SwipeGestureHandlersList =
+      std::vector<CastSideSwipeGestureHandlerInterface*>;
+  SwipeGestureHandlersList swipe_gesture_handlers_;
+
+  DISALLOW_COPY_AND_ASSIGN(CastSystemGestureEventHandler);
+};
+
+}  // namespace chromecast
+
+#endif  // CHROMECAST_GRAPHICS_CAST_SYSTEM_GESTURE_EVENT_HANDLER_H_
diff --git a/chromecast/graphics/cast_window_manager_aura.cc b/chromecast/graphics/cast_window_manager_aura.cc
index 30385d7f5..409fee669 100644
--- a/chromecast/graphics/cast_window_manager_aura.cc
+++ b/chromecast/graphics/cast_window_manager_aura.cc
@@ -6,6 +6,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "chromecast/graphics/cast_focus_client_aura.h"
+#include "chromecast/graphics/cast_system_gesture_event_handler.h"
 #include "ui/aura/client/default_capture_client.h"
 #include "ui/aura/client/focus_change_observer.h"
 #include "ui/aura/client/screen_position_client.h"
@@ -251,6 +252,9 @@
       screen_position_client_.get());
 
   window_tree_host_->Show();
+  system_gesture_event_handler_ =
+      std::make_unique<CastSystemGestureEventHandler>(
+          window_tree_host_->window()->GetRootWindow());
 }
 
 void CastWindowManagerAura::TearDown() {
@@ -263,6 +267,7 @@
   aura::client::SetFocusClient(window_tree_host_->window(), nullptr);
   focus_client_.reset();
   window_tree_host_.reset();
+  system_gesture_event_handler_.reset();
 }
 
 void CastWindowManagerAura::SetWindowId(gfx::NativeView window,
@@ -299,4 +304,20 @@
   }
 }
 
+void CastWindowManagerAura::AddSideSwipeGestureHandler(
+    CastSideSwipeGestureHandlerInterface* handler) {
+  if (system_gesture_event_handler_) {
+    system_gesture_event_handler_->AddSideSwipeGestureHandler(handler);
+  }
+}
+
+// Remove the registration of a system side swipe event handler.
+void CastWindowManagerAura::CastWindowManagerAura::
+    RemoveSideSwipeGestureHandler(
+        CastSideSwipeGestureHandlerInterface* handler) {
+  if (system_gesture_event_handler_) {
+    system_gesture_event_handler_->RemoveSideSwipeGestureHandler(handler);
+  }
+}
+
 }  // namespace chromecast
diff --git a/chromecast/graphics/cast_window_manager_aura.h b/chromecast/graphics/cast_window_manager_aura.h
index 4cbeab61..ca0e93f 100644
--- a/chromecast/graphics/cast_window_manager_aura.h
+++ b/chromecast/graphics/cast_window_manager_aura.h
@@ -21,6 +21,8 @@
 namespace chromecast {
 
 class CastFocusClientAura;
+class CastSideSwipeGestureHandlerInterface;
+class CastSystemGestureEventHandler;
 class CastWindowTreeHost;
 
 class CastWindowManagerAura : public CastWindowManager,
@@ -39,6 +41,14 @@
   aura::Window* GetDefaultParent(aura::Window* window,
                                  const gfx::Rect& bounds) override;
 
+  // Register a new handler for a system side swipe event.
+  void AddSideSwipeGestureHandler(
+      CastSideSwipeGestureHandlerInterface* handler);
+
+  // Remove the registration of a system side swipe event handler.
+  void RemoveSideSwipeGestureHandler(
+      CastSideSwipeGestureHandlerInterface* handler);
+
  private:
   friend class CastWindowManager;
 
@@ -52,6 +62,7 @@
   std::unique_ptr<aura::client::DefaultCaptureClient> capture_client_;
   std::unique_ptr<CastFocusClientAura> focus_client_;
   std::unique_ptr<aura::client::ScreenPositionClient> screen_position_client_;
+  std::unique_ptr<CastSystemGestureEventHandler> system_gesture_event_handler_;
 
   DISALLOW_COPY_AND_ASSIGN(CastWindowManagerAura);
 };
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index b3f9517..0f0f677d 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-10320.0.0
\ No newline at end of file
+10322.0.0
\ No newline at end of file
diff --git a/chromeos/dbus/fake_shill_manager_client.cc b/chromeos/dbus/fake_shill_manager_client.cc
index 5a13385..9a9caf2f 100644
--- a/chromeos/dbus/fake_shill_manager_client.cc
+++ b/chromeos/dbus/fake_shill_manager_client.cc
@@ -730,6 +730,10 @@
       services->SetServiceProperty(kWifi2Path, shill::kSecurityClassProperty,
                                    base::Value(shill::kSecurityPsk));
     }
+    services->SetServiceProperty(kWifi2Path, shill::kConnectableProperty,
+                                 base::Value(false));
+    services->SetServiceProperty(kWifi2Path, shill::kPassphraseRequiredProperty,
+                                 base::Value(true));
     services->SetServiceProperty(kWifi2Path, shill::kSignalStrengthProperty,
                                  base::Value(80));
     profiles->AddService(shared_profile, kWifi2Path);
diff --git a/chromeos/dbus/fake_smb_provider_client.cc b/chromeos/dbus/fake_smb_provider_client.cc
index c59a2f6..0e068b3 100644
--- a/chromeos/dbus/fake_smb_provider_client.cc
+++ b/chromeos/dbus/fake_smb_provider_client.cc
@@ -73,4 +73,12 @@
                                 std::move(fd)));
 }
 
+void FakeSmbProviderClient::DeleteEntry(int32_t mount_id,
+                                        const base::FilePath& entry_path,
+                                        bool recursive,
+                                        StatusCallback callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), smbprovider::ERROR_OK));
+}
+
 }  // namespace chromeos
diff --git a/chromeos/dbus/fake_smb_provider_client.h b/chromeos/dbus/fake_smb_provider_client.h
index 6d64a1fa4..b88b63bd 100644
--- a/chromeos/dbus/fake_smb_provider_client.h
+++ b/chromeos/dbus/fake_smb_provider_client.h
@@ -40,6 +40,11 @@
                 int32_t length,
                 ReadFileCallback callback) override;
 
+  void DeleteEntry(int32_t mount_id,
+                   const base::FilePath& entry_path,
+                   bool recursive,
+                   StatusCallback callback) override;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(FakeSmbProviderClient);
 };
diff --git a/chromeos/dbus/smb_provider_client.cc b/chromeos/dbus/smb_provider_client.cc
index 21f4839..8564be5 100644
--- a/chromeos/dbus/smb_provider_client.cc
+++ b/chromeos/dbus/smb_provider_client.cc
@@ -126,6 +126,18 @@
                &SmbProviderClientImpl::HandleReadFileCallback, &callback);
   }
 
+  void DeleteEntry(int32_t mount_id,
+                   const base::FilePath& entry_path,
+                   bool recursive,
+                   StatusCallback callback) override {
+    smbprovider::DeleteEntryOptions options;
+    options.set_mount_id(mount_id);
+    options.set_entry_path(entry_path.value());
+    options.set_recursive(recursive);
+    CallMethod(smbprovider::kDeleteEntryMethod, options,
+               &SmbProviderClientImpl::HandleDeleteEntryCallback, &callback);
+  }
+
  protected:
   // DBusClient override.
   void Init(dbus::Bus* bus) override {
@@ -243,6 +255,17 @@
     std::move(callback).Run(smbprovider::ERROR_OK, fd);
   }
 
+  // Handles D-Bus callback for DeleteEntry.
+  void HandleDeleteEntryCallback(StatusCallback callback,
+                                 dbus::Response* response) {
+    if (!response) {
+      DLOG(ERROR) << "DeleteEntry: failed to call smbprovider";
+      std::move(callback).Run(smbprovider::ERROR_DBUS_PARSE_FAILED);
+    }
+    dbus::MessageReader reader(response);
+    std::move(callback).Run(GetErrorFromReader(&reader));
+  }
+
   // Handles D-Bus responses for methods that return an error and a protobuf
   // object.
   template <class T>
diff --git a/chromeos/dbus/smb_provider_client.h b/chromeos/dbus/smb_provider_client.h
index aa0c1c8..6178388 100644
--- a/chromeos/dbus/smb_provider_client.h
+++ b/chromeos/dbus/smb_provider_client.h
@@ -89,6 +89,13 @@
                         int32_t length,
                         ReadFileCallback callback) = 0;
 
+  // Calls DeleteEntry. This deletes the file or directory at |entry_path|.
+  // Subsequent operations on the entry at this path will fail.
+  virtual void DeleteEntry(int32_t mount_id,
+                           const base::FilePath& entry_path,
+                           bool recursive,
+                           StatusCallback callback) = 0;
+
  protected:
   // Create() should be used instead.
   SmbProviderClient();
diff --git a/chromeos/network/network_connection_handler_impl.cc b/chromeos/network/network_connection_handler_impl.cc
index 4107064c..080078c 100644
--- a/chromeos/network/network_connection_handler_impl.cc
+++ b/chromeos/network/network_connection_handler_impl.cc
@@ -348,7 +348,8 @@
     bool check_error_state,
     const std::string& service_path,
     const base::DictionaryValue& service_properties) {
-  NET_LOG_EVENT("VerifyConfiguredAndConnect", service_path);
+  NET_LOG(EVENT) << "VerifyConfiguredAndConnect: " << service_path
+                 << " check_error_state: " << check_error_state;
 
   // If 'passphrase_required' is still true, then the 'Passphrase' property
   // has not been set to a minimum length value.
diff --git a/chromeos/network/network_state.cc b/chromeos/network/network_state.cc
index d71daf0b..ea00e84 100644
--- a/chromeos/network/network_state.cc
+++ b/chromeos/network/network_state.cc
@@ -337,9 +337,15 @@
 }
 
 bool NetworkState::RequiresActivation() const {
-  return (type() == shill::kTypeCellular &&
-          activation_state() != shill::kActivationStateActivated &&
-          activation_state() != shill::kActivationStateUnknown);
+  return type() == shill::kTypeCellular &&
+         activation_state() != shill::kActivationStateActivated &&
+         activation_state() != shill::kActivationStateUnknown;
+}
+
+bool NetworkState::SecurityRequiresPassphraseOnly() const {
+  return type() == shill::kTypeWifi &&
+         (security_class() == shill::kSecurityPsk ||
+          security_class() == shill::kSecurityWep);
 }
 
 std::string NetworkState::connection_state() const {
diff --git a/chromeos/network/network_state.h b/chromeos/network/network_state.h
index 6651c713..4aedc83 100644
--- a/chromeos/network/network_state.h
+++ b/chromeos/network/network_state.h
@@ -49,9 +49,12 @@
 
   void IPConfigPropertiesChanged(const base::DictionaryValue& properties);
 
-  // Returns true, if the network requires a service activation.
+  // Returns true if the network requires a service activation.
   bool RequiresActivation() const;
 
+  // Returns true if the network security type requires a passphrase only.
+  bool SecurityRequiresPassphraseOnly() const;
+
   // Accessors
   bool visible() const { return visible_; }
   void set_visible(bool visible) { visible_ = visible; }
diff --git a/components/assist_ranker/base_predictor_unittest.cc b/components/assist_ranker/base_predictor_unittest.cc
index 263f27c..3ec770e 100644
--- a/components/assist_ranker/base_predictor_unittest.cc
+++ b/components/assist_ranker/base_predictor_unittest.cc
@@ -8,7 +8,6 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
-#include "base/memory/ptr_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "components/assist_ranker/fake_ranker_model_loader.h"
@@ -83,8 +82,8 @@
 std::unique_ptr<FakePredictor> FakePredictor::Create() {
   std::unique_ptr<FakePredictor> predictor(
       new FakePredictor(kTestPredictorConfig));
-  auto ranker_model = base::MakeUnique<RankerModel>();
-  auto fake_model_loader = base::MakeUnique<FakeRankerModelLoader>(
+  auto ranker_model = std::make_unique<RankerModel>();
+  auto fake_model_loader = std::make_unique<FakeRankerModelLoader>(
       base::BindRepeating(&FakePredictor::ValidateModel),
       base::BindRepeating(&FakePredictor::OnModelAvailable,
                           base::Unretained(predictor.get())),
diff --git a/components/assist_ranker/binary_classifier_predictor.cc b/components/assist_ranker/binary_classifier_predictor.cc
index cc595bf0..4061c4ad 100644
--- a/components/assist_ranker/binary_classifier_predictor.cc
+++ b/components/assist_ranker/binary_classifier_predictor.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/files/file_path.h"
-#include "base/memory/ptr_util.h"
 #include "components/assist_ranker/generic_logistic_regression_inference.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 #include "components/assist_ranker/ranker_model.h"
@@ -37,7 +36,7 @@
   const GURL& model_url = predictor->GetModelUrl();
   DVLOG(1) << "Creating predictor instance for " << predictor->GetModelName();
   DVLOG(1) << "Model URL: " << model_url;
-  auto model_loader = base::MakeUnique<RankerModelLoaderImpl>(
+  auto model_loader = std::make_unique<RankerModelLoaderImpl>(
       base::BindRepeating(&BinaryClassifierPredictor::ValidateModel),
       base::BindRepeating(&BinaryClassifierPredictor::OnModelAvailable,
                           base::Unretained(predictor.get())),
diff --git a/components/assist_ranker/binary_classifier_predictor_unittest.cc b/components/assist_ranker/binary_classifier_predictor_unittest.cc
index 9249301..ec9429f 100644
--- a/components/assist_ranker/binary_classifier_predictor_unittest.cc
+++ b/components/assist_ranker/binary_classifier_predictor_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/feature_list.h"
-#include "base/memory/ptr_util.h"
 #include "components/assist_ranker/fake_ranker_model_loader.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 #include "components/assist_ranker/ranker_model.h"
@@ -76,7 +75,7 @@
 // TODO(hamelphi): Test BinaryClassifierPredictor::Create.
 
 TEST_F(BinaryClassifierPredictorTest, EmptyRankerModel) {
-  auto ranker_model = base::MakeUnique<RankerModel>();
+  auto ranker_model = std::make_unique<RankerModel>();
   auto predictor = InitPredictor(std::move(ranker_model), GetConfig());
   EXPECT_FALSE(predictor->IsReady());
 
@@ -90,7 +89,7 @@
 }
 
 TEST_F(BinaryClassifierPredictorTest, NoInferenceModuleForModel) {
-  auto ranker_model = base::MakeUnique<RankerModel>();
+  auto ranker_model = std::make_unique<RankerModel>();
   // TranslateRankerModel does not have an inference module. Validation will
   // fail.
   ranker_model->mutable_proto()
@@ -110,7 +109,7 @@
 }
 
 TEST_F(BinaryClassifierPredictorTest, GenericLogisticRegressionModel) {
-  auto ranker_model = base::MakeUnique<RankerModel>();
+  auto ranker_model = std::make_unique<RankerModel>();
   *ranker_model->mutable_proto()->mutable_logistic_regression() =
       GetSimpleLogisticRegressionModel();
   auto predictor = InitPredictor(std::move(ranker_model), GetConfig());
diff --git a/components/assist_ranker/ranker_model.cc b/components/assist_ranker/ranker_model.cc
index 8278a0c2..0495bcc 100644
--- a/components/assist_ranker/ranker_model.cc
+++ b/components/assist_ranker/ranker_model.cc
@@ -4,19 +4,20 @@
 
 #include "components/assist_ranker/ranker_model.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "base/time/time.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 
 namespace assist_ranker {
 
-RankerModel::RankerModel() : proto_(base::MakeUnique<RankerModelProto>()) {}
+RankerModel::RankerModel() : proto_(std::make_unique<RankerModelProto>()) {}
 
 RankerModel::~RankerModel() {}
 
 // static
 std::unique_ptr<RankerModel> RankerModel::FromString(const std::string& data) {
-  auto model = base::MakeUnique<RankerModel>();
+  auto model = std::make_unique<RankerModel>();
   if (!model->mutable_proto()->ParseFromString(data))
     return nullptr;
   return model;
diff --git a/components/assist_ranker/ranker_model_loader_impl.cc b/components/assist_ranker/ranker_model_loader_impl.cc
index c241564..b45cb45 100644
--- a/components/assist_ranker/ranker_model_loader_impl.cc
+++ b/components/assist_ranker/ranker_model_loader_impl.cc
@@ -6,13 +6,14 @@
 
 #include <utility>
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/files/important_file_writer.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
@@ -102,7 +103,7 @@
       model_path_(std::move(model_path)),
       model_url_(std::move(model_url)),
       uma_prefix_(std::move(uma_prefix)),
-      url_fetcher_(base::MakeUnique<RankerURLFetcher>()),
+      url_fetcher_(std::make_unique<RankerURLFetcher>()),
       weak_ptr_factory_(this) {}
 
 RankerModelLoaderImpl::~RankerModelLoaderImpl() {
diff --git a/components/assist_ranker/ranker_model_loader_impl_unittest.cc b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
index 097e15c..9799c9c 100644
--- a/components/assist_ranker/ranker_model_loader_impl_unittest.cc
+++ b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/containers/circular_deque.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/stringprintf.h"
 #include "base/task_scheduler/post_task.h"
@@ -143,7 +142,7 @@
 // static
 std::unique_ptr<RankerModel> RankerModelLoaderImplTest::Clone(
     const RankerModel& model) {
-  auto copy = base::MakeUnique<RankerModel>();
+  auto copy = std::make_unique<RankerModel>();
   *copy->mutable_proto() = model.proto();
   return copy;
 }
@@ -168,7 +167,7 @@
 
 bool RankerModelLoaderImplTest::DoLoaderTest(const base::FilePath& model_path,
                                              const GURL& model_url) {
-  auto loader = base::MakeUnique<RankerModelLoaderImpl>(
+  auto loader = std::make_unique<RankerModelLoaderImpl>(
       base::Bind(&RankerModelLoaderImplTest::ValidateModel,
                  base::Unretained(this)),
       base::Bind(&RankerModelLoaderImplTest::OnModelAvailable,
diff --git a/components/assist_ranker/ranker_model_unittest.cc b/components/assist_ranker/ranker_model_unittest.cc
index cd53970..3ac195f 100644
--- a/components/assist_ranker/ranker_model_unittest.cc
+++ b/components/assist_ranker/ranker_model_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -24,7 +23,7 @@
 std::unique_ptr<RankerModel> NewModel(const std::string& model_url,
                                       base::Time last_modified,
                                       base::TimeDelta cache_duration) {
-  std::unique_ptr<RankerModel> model = base::MakeUnique<RankerModel>();
+  std::unique_ptr<RankerModel> model = std::make_unique<RankerModel>();
   auto* metadata = model->mutable_proto()->mutable_metadata();
   if (!model_url.empty())
     metadata->set_source(model_url);
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index ba6d04d0..7499473 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -1149,7 +1149,7 @@
     FormData* form,
     FormFieldData* field) {
   form->origin = GetCanonicalOriginForDocument(document);
-  if (document.GetFrame()) {
+  if (document.GetFrame() && document.GetFrame()->Top()) {
     form->main_frame_origin = document.GetFrame()->Top()->GetSecurityOrigin();
   } else {
     form->main_frame_origin = url::Origin();
diff --git a/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc b/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc
index 961cb49..e40984e4 100644
--- a/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc
+++ b/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc
@@ -2030,7 +2030,7 @@
   WebInputElement* input_element = ToWebInputElement(&control_elements[3]);
   const base::string16 element_value = input_element->Value().Utf16();
   user_input[control_elements[3]] =
-      std::make_pair(base::MakeUnique<base::string16>(element_value),
+      std::make_pair(std::make_unique<base::string16>(element_value),
                      FieldPropertiesFlags::USER_TYPED);
 
   std::unique_ptr<PasswordForm> password_form = CreatePasswordFormFromWebForm(
diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmarks/browser/bookmark_codec.cc
index 37d68f4..04adafb 100644
--- a/components/bookmarks/browser/bookmark_codec.cc
+++ b/components/bookmarks/browser/bookmark_codec.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include <algorithm>
+#include <memory>
 #include <utility>
 
 #include "base/json/json_string_value_serializer.h"
diff --git a/components/bookmarks/browser/bookmark_index_unittest.cc b/components/bookmarks/browser/bookmark_index_unittest.cc
index c4eef10cc..2d03597 100644
--- a/components/bookmarks/browser/bookmark_index_unittest.cc
+++ b/components/bookmarks/browser/bookmark_index_unittest.cc
@@ -4,6 +4,7 @@
 
 #include <stddef.h>
 
+#include <memory>
 #include <string>
 #include <vector>
 
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc
index c4b76b9..9f15abf 100644
--- a/components/bookmarks/browser/bookmark_model.cc
+++ b/components/bookmarks/browser/bookmark_model.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 #include <functional>
+#include <memory>
 #include <string>
 #include <utility>
 
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc
index 4fe226c1..5225375 100644
--- a/components/bookmarks/browser/bookmark_model_unittest.cc
+++ b/components/bookmarks/browser/bookmark_model_unittest.cc
@@ -10,6 +10,8 @@
 #include <string>
 #include <utility>
 
+#include <memory>
+
 #include "base/base_paths.h"
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
diff --git a/components/bookmarks/managed/managed_bookmark_service.cc b/components/bookmarks/managed/managed_bookmark_service.cc
index d50ca6a..4fd1978 100644
--- a/components/bookmarks/managed/managed_bookmark_service.cc
+++ b/components/bookmarks/managed/managed_bookmark_service.cc
@@ -7,6 +7,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 
+#include <memory>
 #include <utility>
 #include <vector>
 
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker.cc b/components/bookmarks/managed/managed_bookmarks_tracker.cc
index 12e59f8f..3a5ae17 100644
--- a/components/bookmarks/managed/managed_bookmarks_tracker.cc
+++ b/components/bookmarks/managed/managed_bookmarks_tracker.cc
@@ -4,6 +4,7 @@
 
 #include "components/bookmarks/managed/managed_bookmarks_tracker.h"
 
+#include <memory>
 #include <string>
 
 #include "base/bind.h"
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
index c5aa3cb..857306e 100644
--- a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
+++ b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
@@ -9,7 +9,6 @@
 
 #include "base/bind.h"
 #include "base/files/file_path.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/components/browsing_data/core/counters/autofill_counter.cc b/components/browsing_data/core/counters/autofill_counter.cc
index 8e62d7c..065c7ae 100644
--- a/components/browsing_data/core/counters/autofill_counter.cc
+++ b/components/browsing_data/core/counters/autofill_counter.cc
@@ -5,10 +5,10 @@
 #include "components/browsing_data/core/counters/autofill_counter.h"
 
 #include <algorithm>
+#include <memory>
 #include <utility>
 #include <vector>
 
-#include "base/memory/ptr_util.h"
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
@@ -179,7 +179,7 @@
   if (suggestions_query_ || credit_cards_query_ || addresses_query_)
     return;
 
-  auto reported_result = base::MakeUnique<AutofillResult>(
+  auto reported_result = std::make_unique<AutofillResult>(
       this, num_suggestions_, num_credit_cards_, num_addresses_,
       sync_tracker_.IsSyncActive());
   ReportResult(std::move(reported_result));
diff --git a/components/browsing_data/core/counters/browsing_data_counter.cc b/components/browsing_data/core/counters/browsing_data_counter.cc
index 7e4edb3..41626d630 100644
--- a/components/browsing_data/core/counters/browsing_data_counter.cc
+++ b/components/browsing_data/core/counters/browsing_data_counter.cc
@@ -4,9 +4,9 @@
 
 #include "components/browsing_data/core/counters/browsing_data_counter.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "components/browsing_data/core/browsing_data_utils.h"
 #include "components/browsing_data/core/pref_names.h"
 #include "components/prefs/pref_service.h"
@@ -89,7 +89,7 @@
 }
 
 void BrowsingDataCounter::ReportResult(ResultInt value) {
-  ReportResult(base::MakeUnique<FinishedResult>(this, value));
+  ReportResult(std::make_unique<FinishedResult>(this, value));
 }
 
 void BrowsingDataCounter::ReportResult(std::unique_ptr<Result> result) {
@@ -138,7 +138,7 @@
   state_ = State::SHOW_CALCULATING;
   state_transitions_.push_back(state_);
 
-  callback_.Run(base::MakeUnique<Result>(this));
+  callback_.Run(std::make_unique<Result>(this));
   timer_.Start(
       FROM_HERE,
       base::TimeDelta::FromMilliseconds(kDelayUntilReadyToShowResultMs),
diff --git a/components/browsing_data/core/counters/history_counter.cc b/components/browsing_data/core/counters/history_counter.cc
index cf1f746..93d8e0e3 100644
--- a/components/browsing_data/core/counters/history_counter.cc
+++ b/components/browsing_data/core/counters/history_counter.cc
@@ -6,8 +6,8 @@
 
 #include <limits.h>
 #include <stdint.h>
+#include <memory>
 
-#include "base/memory/ptr_util.h"
 #include "base/timer/timer.h"
 #include "components/browsing_data/core/pref_names.h"
 
@@ -176,7 +176,7 @@
   if (!local_counting_finished_ || !web_counting_finished_)
     return;
 
-  ReportResult(base::MakeUnique<HistoryResult>(
+  ReportResult(std::make_unique<HistoryResult>(
       this, local_result_, sync_tracker_.IsSyncActive(), has_synced_visits_));
 }
 
diff --git a/components/browsing_data/core/counters/passwords_counter.cc b/components/browsing_data/core/counters/passwords_counter.cc
index e606a670..717d54d 100644
--- a/components/browsing_data/core/counters/passwords_counter.cc
+++ b/components/browsing_data/core/counters/passwords_counter.cc
@@ -4,6 +4,8 @@
 
 #include "components/browsing_data/core/counters/passwords_counter.h"
 
+#include <memory>
+
 #include "components/browsing_data/core/pref_names.h"
 #include "components/password_manager/core/browser/password_manager_util.h"
 #include "components/password_manager/core/browser/password_store.h"
@@ -55,12 +57,13 @@
 void PasswordsCounter::OnGetPasswordStoreResults(
     std::vector<std::unique_ptr<autofill::PasswordForm>> results) {
   base::Time start = GetPeriodStart();
+  base::Time end = GetPeriodEnd();
   int num_passwords = std::count_if(
       results.begin(), results.end(),
-      [start](const std::unique_ptr<autofill::PasswordForm>& form) {
-        return form->date_created >= start;
+      [start, end](const std::unique_ptr<autofill::PasswordForm>& form) {
+        return (form->date_created >= start && form->date_created < end);
       });
-  ReportResult(base::MakeUnique<SyncResult>(this, num_passwords,
+  ReportResult(std::make_unique<SyncResult>(this, num_passwords,
                                             sync_tracker_.IsSyncActive()));
 }
 
diff --git a/components/cast_certificate/cast_cert_validator.cc b/components/cast_certificate/cast_cert_validator.cc
index 8557634..f70455e 100644
--- a/components/cast_certificate/cast_cert_validator.cc
+++ b/components/cast_certificate/cast_cert_validator.cc
@@ -11,7 +11,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/memory/singleton.h"
 #include "base/stl_util.h"
 #include "components/cast_certificate/cast_crl.h"
@@ -332,7 +331,7 @@
     const base::StringPiece& spki) {
   // Use a bogus CommonName, since this is just exposed for testing signature
   // verification by unittests.
-  return base::MakeUnique<CertVerificationContextImpl>(net::der::Input(spki),
+  return std::make_unique<CertVerificationContextImpl>(net::der::Input(spki),
                                                        "CommonName");
 }
 
diff --git a/components/cast_certificate/cast_crl.cc b/components/cast_certificate/cast_crl.cc
index 93d8af6..67f7ccb 100644
--- a/components/cast_certificate/cast_crl.cc
+++ b/components/cast_certificate/cast_crl.cc
@@ -7,6 +7,8 @@
 #include <unordered_map>
 #include <unordered_set>
 
+#include <memory>
+
 #include "base/base64.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/singleton.h"
@@ -337,7 +339,7 @@
       LOG(ERROR) << "CRL - Verification failed.";
       return nullptr;
     }
-    return base::MakeUnique<CastCRLImpl>(tbs_crl, overall_not_after);
+    return std::make_unique<CastCRLImpl>(tbs_crl, overall_not_after);
   }
   LOG(ERROR) << "No supported version of revocation data.";
   return nullptr;
diff --git a/components/cast_channel/cast_socket.cc b/components/cast_channel/cast_socket.cc
index eacc596..d07d822 100644
--- a/components/cast_channel/cast_socket.cc
+++ b/components/cast_channel/cast_socket.cc
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
@@ -252,7 +253,7 @@
   DCHECK_EQ(ReadyState::NONE, ready_state_);
   DCHECK_EQ(ConnectionState::START_CONNECT, connect_state_);
 
-  delegate_ = base::MakeUnique<CastSocketMessageDelegate>(this);
+  delegate_ = std::make_unique<CastSocketMessageDelegate>(this);
 
   SetReadyState(ReadyState::CONNECTING);
   SetConnectState(ConnectionState::TCP_CONNECT);
diff --git a/components/cast_channel/cast_socket_service_unittest.cc b/components/cast_channel/cast_socket_service_unittest.cc
index d0a519b..3aafc5e 100644
--- a/components/cast_channel/cast_socket_service_unittest.cc
+++ b/components/cast_channel/cast_socket_service_unittest.cc
@@ -41,18 +41,18 @@
 };
 
 TEST_F(CastSocketServiceTest, TestAddSocket) {
-  auto socket1 = base::MakeUnique<MockCastSocket>();
+  auto socket1 = std::make_unique<MockCastSocket>();
   auto* socket_ptr1 = AddSocket(std::move(socket1));
   EXPECT_NE(0, socket_ptr1->id());
 
-  auto socket2 = base::MakeUnique<MockCastSocket>();
+  auto socket2 = std::make_unique<MockCastSocket>();
   auto* socket_ptr2 = AddSocket(std::move(socket2));
   EXPECT_NE(socket_ptr1->id(), socket_ptr2->id());
 
   auto removed_socket = cast_socket_service_->RemoveSocket(socket_ptr2->id());
   EXPECT_EQ(socket_ptr2, removed_socket.get());
 
-  auto socket3 = base::MakeUnique<MockCastSocket>();
+  auto socket3 = std::make_unique<MockCastSocket>();
   auto* socket_ptr3 = AddSocket(std::move(socket3));
   EXPECT_NE(socket_ptr1->id(), socket_ptr3->id());
   EXPECT_NE(socket_ptr2->id(), socket_ptr3->id());
@@ -65,7 +65,7 @@
   auto socket = cast_socket_service_->RemoveSocket(channel_id);
   EXPECT_FALSE(socket);
 
-  auto mock_socket = base::MakeUnique<MockCastSocket>();
+  auto mock_socket = std::make_unique<MockCastSocket>();
 
   auto* mock_socket_ptr = AddSocket(std::move(mock_socket));
   channel_id = mock_socket_ptr->id();
diff --git a/components/cast_channel/keep_alive_delegate_unittest.cc b/components/cast_channel/keep_alive_delegate_unittest.cc
index 2845606..feb23dd 100644
--- a/components/cast_channel/keep_alive_delegate_unittest.cc
+++ b/components/cast_channel/keep_alive_delegate_unittest.cc
@@ -236,9 +236,9 @@
       mock_time_task_runner->GetMockTickClock();
 
   std::unique_ptr<base::Timer> liveness_timer =
-      base::MakeUnique<base::Timer>(true, false, tick_clock.get());
+      std::make_unique<base::Timer>(true, false, tick_clock.get());
   std::unique_ptr<base::Timer> ping_timer =
-      base::MakeUnique<base::Timer>(true, false, tick_clock.get());
+      std::make_unique<base::Timer>(true, false, tick_clock.get());
   ping_timer->SetTaskRunner(mock_time_task_runner);
   liveness_timer->SetTaskRunner(mock_time_task_runner);
   keep_alive_->SetTimersForTest(std::move(ping_timer),
diff --git a/components/cdm/browser/media_drm_storage_impl.cc b/components/cdm/browser/media_drm_storage_impl.cc
index 8e78bbe..0360962c 100644
--- a/components/cdm/browser/media_drm_storage_impl.cc
+++ b/components/cdm/browser/media_drm_storage_impl.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/value_conversions.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -75,7 +74,7 @@
   base::Time provision_time() const { return provision_time_; }
 
   std::unique_ptr<base::DictionaryValue> ToDictValue() const {
-    auto dict = base::MakeUnique<base::DictionaryValue>();
+    auto dict = std::make_unique<base::DictionaryValue>();
 
     dict->Set(kOriginId, base::CreateUnguessableTokenValue(origin_id_));
     dict->SetDouble(kCreationTime, provision_time_.ToDoubleT());
@@ -121,7 +120,7 @@
   base::Time creation_time() const { return creation_time_; }
 
   std::unique_ptr<base::DictionaryValue> ToDictValue() const {
-    auto dict = base::MakeUnique<base::DictionaryValue>();
+    auto dict = std::make_unique<base::DictionaryValue>();
 
     dict->SetString(
         kKeySetId,
diff --git a/components/cdm/browser/media_drm_storage_impl_unittest.cc b/components/cdm/browser/media_drm_storage_impl_unittest.cc
index 30e93d5..786d4e3 100644
--- a/components/cdm/browser/media_drm_storage_impl_unittest.cc
+++ b/components/cdm/browser/media_drm_storage_impl_unittest.cc
@@ -64,7 +64,7 @@
     media::mojom::MediaDrmStoragePtr media_drm_storage_ptr;
     auto request = mojo::MakeRequest(&media_drm_storage_ptr);
 
-    auto media_drm_storage = base::MakeUnique<media::MojoMediaDrmStorage>(
+    auto media_drm_storage = std::make_unique<media::MojoMediaDrmStorage>(
         std::move(media_drm_storage_ptr));
 
     content::RenderFrameHost* rfh = web_contents()->GetMainFrame();
@@ -104,7 +104,7 @@
                              const std::vector<uint8_t>& expected_key_set_id,
                              const std::string& expected_mime_type) {
     media_drm_storage_->LoadPersistentSession(
-        session_id, ExpectResult(base::MakeUnique<SessionData>(
+        session_id, ExpectResult(std::make_unique<SessionData>(
                         expected_key_set_id, expected_mime_type)));
   }
 
diff --git a/components/certificate_reporting/error_report_unittest.cc b/components/certificate_reporting/error_report_unittest.cc
index ab51025..8ebe489 100644
--- a/components/certificate_reporting/error_report_unittest.cc
+++ b/components/certificate_reporting/error_report_unittest.cc
@@ -7,9 +7,10 @@
 #include <set>
 #include <string>
 
+#include <memory>
+
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/path_service.h"
 #include "base/threading/thread.h"
@@ -221,8 +222,8 @@
   TestingPrefServiceSimple pref_service;
   network_time::NetworkTimeTracker::RegisterPrefs(pref_service.registry());
   network_time::NetworkTimeTracker network_time_tracker(
-      base::MakeUnique<base::DefaultClock>(),
-      base::MakeUnique<base::DefaultTickClock>(), &pref_service,
+      std::make_unique<base::DefaultClock>(),
+      std::make_unique<base::DefaultTickClock>(), &pref_service,
       new net::TestURLRequestContextGetter(io_thread.task_runner()));
 
   // Serialize a report containing information about the network time querying
diff --git a/components/certificate_reporting/error_reporter.cc b/components/certificate_reporting/error_reporter.cc
index 599fc53..e8cc59c 100644
--- a/components/certificate_reporting/error_reporter.cc
+++ b/components/certificate_reporting/error_reporter.cc
@@ -9,8 +9,9 @@
 #include <set>
 #include <utility>
 
+#include <memory>
+
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_piece.h"
 #include "components/encrypted_messages/encrypted_message.pb.h"
 #include "components/encrypted_messages/message_encrypter.h"
@@ -76,7 +77,7 @@
     : ErrorReporter(upload_url,
                     kServerPublicKey,
                     kServerPublicKeyVersion,
-                    base::MakeUnique<net::ReportSender>(request_context,
+                    std::make_unique<net::ReportSender>(request_context,
                                                         kTrafficAnnotation)) {}
 
 ErrorReporter::ErrorReporter(
diff --git a/components/certificate_transparency/log_dns_client_unittest.cc b/components/certificate_transparency/log_dns_client_unittest.cc
index 51397c6c..d9715601 100644
--- a/components/certificate_transparency/log_dns_client_unittest.cc
+++ b/components/certificate_transparency/log_dns_client_unittest.cc
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "base/format_macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
@@ -102,7 +101,7 @@
 
   std::unique_ptr<LogDnsClient> CreateLogDnsClient(
       size_t max_concurrent_queries) {
-    return base::MakeUnique<LogDnsClient>(mock_dns_.CreateDnsClient(),
+    return std::make_unique<LogDnsClient>(mock_dns_.CreateDnsClient(),
                                           net::NetLogWithSource(),
                                           max_concurrent_queries);
   }
diff --git a/components/certificate_transparency/single_tree_tracker_unittest.cc b/components/certificate_transparency/single_tree_tracker_unittest.cc
index 59ba2af..d1fb0b12 100644
--- a/components/certificate_transparency/single_tree_tracker_unittest.cc
+++ b/components/certificate_transparency/single_tree_tracker_unittest.cc
@@ -7,6 +7,8 @@
 #include <string>
 #include <utility>
 
+#include <memory>
+
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
@@ -204,10 +206,10 @@
 
  protected:
   void CreateTreeTracker() {
-    log_dns_client_ = base::MakeUnique<LogDnsClient>(
+    log_dns_client_ = std::make_unique<LogDnsClient>(
         mock_dns_.CreateDnsClient(), net_log_with_source_, 1);
 
-    tree_tracker_ = base::MakeUnique<SingleTreeTracker>(
+    tree_tracker_ = std::make_unique<SingleTreeTracker>(
         log_, log_dns_client_.get(), &host_resolver_, &net_log_);
   }
 
diff --git a/components/certificate_transparency/tree_state_tracker.cc b/components/certificate_transparency/tree_state_tracker.cc
index 2bffdf3..958769c 100644
--- a/components/certificate_transparency/tree_state_tracker.cc
+++ b/components/certificate_transparency/tree_state_tracker.cc
@@ -4,8 +4,9 @@
 
 #include "components/certificate_transparency/tree_state_tracker.h"
 
+#include <memory>
+
 #include "base/feature_list.h"
-#include "base/memory/ptr_util.h"
 #include "components/certificate_transparency/log_dns_client.h"
 #include "components/certificate_transparency/single_tree_tracker.h"
 #include "net/base/network_change_notifier.h"
@@ -41,7 +42,7 @@
 
   std::unique_ptr<net::DnsClient> dns_client =
       net::DnsClient::CreateClient(net_log);
-  dns_client_ = base::MakeUnique<LogDnsClient>(
+  dns_client_ = std::make_unique<LogDnsClient>(
       std::move(dns_client),
       net::NetLogWithSource::Make(net_log,
                                   net::NetLogSourceType::CT_TREE_STATE_TRACKER),
diff --git a/components/certificate_transparency/tree_state_tracker_unittest.cc b/components/certificate_transparency/tree_state_tracker_unittest.cc
index c4d2c57..c8f61ce1 100644
--- a/components/certificate_transparency/tree_state_tracker_unittest.cc
+++ b/components/certificate_transparency/tree_state_tracker_unittest.cc
@@ -7,8 +7,9 @@
 #include <string>
 #include <utility>
 
+#include <memory>
+
 #include "base/feature_list.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
@@ -81,7 +82,7 @@
   feature_list.InitAndEnableFeature(kCTLogAuditing);
 
   tree_tracker_ =
-      base::MakeUnique<TreeStateTracker>(verifiers, &host_resolver_, &net_log_);
+      std::make_unique<TreeStateTracker>(verifiers, &host_resolver_, &net_log_);
 
   // Add a cache entry for kHostname that indicates it was looked up over DNS.
   // SingleTreeTracker requires this before it will request an inclusion proof,
diff --git a/components/cloud_devices/common/description_items_inl.h b/components/cloud_devices/common/description_items_inl.h
index 02fc023..ad82045 100644
--- a/components/cloud_devices/common/description_items_inl.h
+++ b/components/cloud_devices/common/description_items_inl.h
@@ -11,7 +11,6 @@
 #include <utility>
 #include <vector>
 
-#include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/values.h"
 #include "components/cloud_devices/common/description_items.h"
@@ -128,9 +127,9 @@
 void SelectionCapability<Option, Traits>::SaveTo(
     CloudDeviceDescription* description) const {
   DCHECK(IsValid());
-  auto options_list = base::MakeUnique<base::ListValue>();
+  auto options_list = std::make_unique<base::ListValue>();
   for (size_t i = 0; i < options_.size(); ++i) {
-    auto option_value = base::MakeUnique<base::DictionaryValue>();
+    auto option_value = std::make_unique<base::DictionaryValue>();
     if (base::checked_cast<int>(i) == default_idx_)
       option_value->SetBoolean(json::kKeyIsDefault, true);
     Traits::Save(options_[i], option_value.get());
diff --git a/components/cloud_devices/common/printer_description.cc b/components/cloud_devices/common/printer_description.cc
index 7f3ae78..878b398f 100644
--- a/components/cloud_devices/common/printer_description.cc
+++ b/components/cloud_devices/common/printer_description.cc
@@ -13,7 +13,6 @@
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "components/cloud_devices/common/cloud_device_description_consts.h"
@@ -775,9 +774,9 @@
 
   static void Save(const PageRange& option, base::DictionaryValue* dict) {
     if (!option.empty()) {
-      auto list = base::MakeUnique<base::ListValue>();
+      auto list = std::make_unique<base::ListValue>();
       for (size_t i = 0; i < option.size(); ++i) {
-        auto interval = base::MakeUnique<base::DictionaryValue>();
+        auto interval = std::make_unique<base::DictionaryValue>();
         interval->SetInteger(kPageRangeStart, option[i].start);
         if (option[i].end < kMaxPageNumber)
           interval->SetInteger(kPageRangeEnd, option[i].end);
diff --git a/components/component_updater/component_installer_unittest.cc b/components/component_updater/component_installer_unittest.cc
index c558149..476ed96a 100644
--- a/components/component_updater/component_installer_unittest.cc
+++ b/components/component_updater/component_installer_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include <iterator>
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
@@ -12,7 +13,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
@@ -204,7 +204,7 @@
 ComponentInstallerTest::ComponentInstallerTest() {
   EXPECT_CALL(update_client(), AddObserver(_)).Times(1);
   component_updater_ =
-      base::MakeUnique<CrxUpdateService>(config_, update_client_);
+      std::make_unique<CrxUpdateService>(config_, update_client_);
 }
 
 ComponentInstallerTest::~ComponentInstallerTest() {
@@ -272,7 +272,7 @@
   EXPECT_CALL(update_client(), Stop()).Times(1);
 
   auto installer = base::MakeRefCounted<ComponentInstaller>(
-      base::MakeUnique<FakeInstallerPolicy>());
+      std::make_unique<FakeInstallerPolicy>());
   installer->Register(component_updater(), base::OnceClosure());
 
   RunThreads();
@@ -299,7 +299,7 @@
 // Tests that the unpack path is removed when the install succeeded.
 TEST_F(ComponentInstallerTest, UnpackPathInstallSuccess) {
   auto installer = base::MakeRefCounted<ComponentInstaller>(
-      base::MakeUnique<FakeInstallerPolicy>());
+      std::make_unique<FakeInstallerPolicy>());
 
   Unpack(test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
 
@@ -327,7 +327,7 @@
 // Tests that the unpack path is removed when the install failed.
 TEST_F(ComponentInstallerTest, UnpackPathInstallError) {
   auto installer = base::MakeRefCounted<ComponentInstaller>(
-      base::MakeUnique<FakeInstallerPolicy>());
+      std::make_unique<FakeInstallerPolicy>());
 
   Unpack(test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
 
diff --git a/components/component_updater/component_updater_service.cc b/components/component_updater/component_updater_service.cc
index cd03f5c..54d0161 100644
--- a/components/component_updater/component_updater_service.cc
+++ b/components/component_updater/component_updater_service.cc
@@ -17,7 +17,6 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_checker.h"
@@ -202,7 +201,7 @@
   auto* const component = GetComponent(it->second);
   if (!component)
     return nullptr;
-  return base::MakeUnique<ComponentInfo>(
+  return std::make_unique<ComponentInfo>(
       GetCrxComponentID(*component), component->fingerprint,
       base::UTF8ToUTF16(component->name), component->version);
 }
@@ -437,7 +436,7 @@
     const scoped_refptr<Configurator>& config) {
   DCHECK(config);
   auto update_client = update_client::UpdateClientFactory(config);
-  return base::MakeUnique<CrxUpdateService>(config, std::move(update_client));
+  return std::make_unique<CrxUpdateService>(config, std::move(update_client));
 }
 
 }  // namespace component_updater
diff --git a/components/component_updater/component_updater_service_unittest.cc b/components/component_updater/component_updater_service_unittest.cc
index 4dfbc93..bbec058 100644
--- a/components/component_updater/component_updater_service_unittest.cc
+++ b/components/component_updater/component_updater_service_unittest.cc
@@ -15,7 +15,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/task_scheduler/post_task.h"
@@ -203,14 +202,14 @@
 std::unique_ptr<ComponentUpdateService> TestComponentUpdateServiceFactory(
     const scoped_refptr<Configurator>& config) {
   DCHECK(config);
-  return base::MakeUnique<CrxUpdateService>(
+  return std::make_unique<CrxUpdateService>(
       config, base::MakeRefCounted<MockUpdateClient>());
 }
 
 ComponentUpdaterTest::ComponentUpdaterTest() {
   EXPECT_CALL(update_client(), AddObserver(_)).Times(1);
   component_updater_ =
-      base::MakeUnique<CrxUpdateService>(config_, update_client_);
+      std::make_unique<CrxUpdateService>(config_, update_client_);
 }
 
 ComponentUpdaterTest::~ComponentUpdaterTest() {
diff --git a/components/consent_auditor/consent_auditor.cc b/components/consent_auditor/consent_auditor.cc
index d86c85f..b4a0875 100644
--- a/components/consent_auditor/consent_auditor.cc
+++ b/components/consent_auditor/consent_auditor.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "components/consent_auditor/pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -91,7 +90,7 @@
     const std::vector<int>& consent_grd_ids,
     const std::vector<std::string>& placeholder_replacements,
     ConsentStatus status) {
-  auto specifics = base::MakeUnique<sync_pb::UserEventSpecifics>();
+  auto specifics = std::make_unique<sync_pb::UserEventSpecifics>();
   specifics->set_event_time_usec(
       base::Time::Now().since_origin().InMicroseconds());
   auto* consent = specifics->mutable_user_consent();
diff --git a/components/consent_auditor/consent_auditor_unittest.cc b/components/consent_auditor/consent_auditor_unittest.cc
index c3cd309..30486b5 100644
--- a/components/consent_auditor/consent_auditor_unittest.cc
+++ b/components/consent_auditor/consent_auditor_unittest.cc
@@ -67,10 +67,10 @@
 class ConsentAuditorTest : public testing::Test {
  public:
   void SetUp() override {
-    pref_service_ = base::MakeUnique<TestingPrefServiceSimple>();
-    user_event_service_ = base::MakeUnique<syncer::FakeUserEventService>();
+    pref_service_ = std::make_unique<TestingPrefServiceSimple>();
+    user_event_service_ = std::make_unique<syncer::FakeUserEventService>();
     ConsentAuditor::RegisterProfilePrefs(pref_service_->registry());
-    consent_auditor_ = base::MakeUnique<ConsentAuditor>(
+    consent_auditor_ = std::make_unique<ConsentAuditor>(
         pref_service_.get(), user_event_service_.get(), kCurrentAppVersion,
         kCurrentAppLocale);
   }
@@ -80,7 +80,7 @@
     // We'll have to recreate |consent_auditor| in order to update the version
     // and locale. This is not a problem, as in reality we'd have to restart
     // Chrome to update both, let alone just recreate this class.
-    consent_auditor_ = base::MakeUnique<ConsentAuditor>(
+    consent_auditor_ = std::make_unique<ConsentAuditor>(
         pref_service_.get(), user_event_service_.get(), new_product_version,
         new_app_locale);
   }
diff --git a/components/constrained_window/constrained_window_views_unittest.cc b/components/constrained_window/constrained_window_views_unittest.cc
index cf90bc8..21ea2eb 100644
--- a/components/constrained_window/constrained_window_views_unittest.cc
+++ b/components/constrained_window/constrained_window_views_unittest.cc
@@ -8,7 +8,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "components/constrained_window/constrained_window_views_client.h"
 #include "components/web_modal/test_web_contents_modal_dialog_host.h"
 #include "ui/display/display.h"
@@ -217,7 +216,7 @@
   test_views_delegate()->set_use_desktop_native_widgets(true);
 
   SetConstrainedWindowViewsClient(
-      base::MakeUnique<TestConstrainedWindowViewsClient>());
+      std::make_unique<TestConstrainedWindowViewsClient>());
   DialogContents* contents = new DialogContents;
   contents->set_modal_type(ui::MODAL_TYPE_WINDOW);
   views::Widget* widget = CreateBrowserModalDialogViews(contents, nullptr);
diff --git a/components/content_settings/core/browser/content_settings_default_provider.cc b/components/content_settings/core/browser/content_settings_default_provider.cc
index 85516b97..eb3d42e 100644
--- a/components/content_settings/core/browser/content_settings_default_provider.cc
+++ b/components/content_settings/core/browser/content_settings_default_provider.cc
@@ -4,12 +4,12 @@
 
 #include "components/content_settings/core/browser/content_settings_default_provider.h"
 
+#include <memory>
 #include <string>
 #include <vector>
 
 #include "base/auto_reset.h"
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "components/content_settings/core/browser/content_settings_info.h"
 #include "components/content_settings/core/browser/content_settings_registry.h"
@@ -272,7 +272,7 @@
     NOTREACHED();
     return nullptr;
   }
-  return base::MakeUnique<DefaultRuleIterator>(it->second.get());
+  return std::make_unique<DefaultRuleIterator>(it->second.get());
 }
 
 void DefaultProvider::ClearAllContentSettingsRules(
diff --git a/components/content_settings/core/browser/content_settings_global_value_map.cc b/components/content_settings/core/browser/content_settings_global_value_map.cc
index 85644a3..bbf50c9 100644
--- a/components/content_settings/core/browser/content_settings_global_value_map.cc
+++ b/components/content_settings/core/browser/content_settings_global_value_map.cc
@@ -4,9 +4,9 @@
 
 #include "components/content_settings/core/browser/content_settings_global_value_map.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/synchronization/lock.h"
 #include "components/content_settings/core/browser/content_settings_rule.h"
 #include "components/content_settings/core/common/content_settings.h"
@@ -51,7 +51,7 @@
   if (it == settings_.end())
     return nullptr;
 
-  return base::MakeUnique<RuleIteratorSimple>(it->second);
+  return std::make_unique<RuleIteratorSimple>(it->second);
 }
 
 void GlobalValueMap::SetContentSetting(ContentSettingsType content_type,
diff --git a/components/content_settings/core/browser/content_settings_pref.cc b/components/content_settings/core/browser/content_settings_pref.cc
index e791367..7f91a3c 100644
--- a/components/content_settings/core/browser/content_settings_pref.cc
+++ b/components/content_settings/core/browser/content_settings_pref.cc
@@ -8,7 +8,6 @@
 
 #include "base/auto_reset.h"
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -371,7 +370,7 @@
     if (!found && value) {
       settings_dictionary =
           pattern_pairs_settings->SetDictionaryWithoutPathExpansion(
-              pattern_str, base::MakeUnique<base::DictionaryValue>());
+              pattern_str, std::make_unique<base::DictionaryValue>());
     }
 
     if (settings_dictionary) {
@@ -386,7 +385,7 @@
           resource_dictionary =
               settings_dictionary->SetDictionaryWithoutPathExpansion(
                   kPerResourceIdentifierPrefName,
-                  base::MakeUnique<base::DictionaryValue>());
+                  std::make_unique<base::DictionaryValue>());
         }
         // Update resource dictionary.
         if (value == nullptr) {
diff --git a/components/content_settings/core/browser/content_settings_pref_provider.cc b/components/content_settings/core/browser/content_settings_pref_provider.cc
index 62834c2..5e4ed35 100644
--- a/components/content_settings/core/browser/content_settings_pref_provider.cc
+++ b/components/content_settings/core/browser/content_settings_pref_provider.cc
@@ -13,7 +13,6 @@
 
 #include "base/auto_reset.h"
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/default_clock.h"
 #include "components/content_settings/core/browser/content_settings_pref.h"
@@ -113,7 +112,7 @@
   for (const WebsiteSettingsInfo* info : *website_settings) {
     content_settings_prefs_.insert(std::make_pair(
         info->type(),
-        base::MakeUnique<ContentSettingsPref>(
+        std::make_unique<ContentSettingsPref>(
             info->type(), prefs_, &pref_change_registrar_, info->pref_name(),
             is_incognito_,
             base::Bind(&PrefProvider::Notify, base::Unretained(this)))));
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
index 1f564bc..1344770 100644
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/values.h"
 #include "build/build_config.h"
@@ -373,7 +372,7 @@
     return;
 
   DCHECK(!base::ContainsKey(content_settings_info_, type));
-  content_settings_info_[type] = base::MakeUnique<ContentSettingsInfo>(
+  content_settings_info_[type] = std::make_unique<ContentSettingsInfo>(
       website_settings_info, whitelisted_schemes, valid_settings,
       incognito_behavior);
 }
diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc
index 78e80b3..ab44dae 100644
--- a/components/content_settings/core/browser/host_content_settings_map.cc
+++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -7,11 +7,11 @@
 #include <stddef.h>
 
 #include <algorithm>
+#include <memory>
 #include <utility>
 
 #include "base/command_line.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -218,7 +218,7 @@
   if (is_guest_profile)
     pref_provider_->ClearPrefs();
 
-  auto default_provider = base::MakeUnique<content_settings::DefaultProvider>(
+  auto default_provider = std::make_unique<content_settings::DefaultProvider>(
       prefs_, is_incognito_);
   default_provider->AddObserver(this);
   content_settings_providers_[DEFAULT_PROVIDER] = std::move(default_provider);
@@ -689,7 +689,7 @@
     const content_settings::Rule& rule = rule_iterator->Next();
     settings->push_back(ContentSettingPatternSource(
         rule.primary_pattern, rule.secondary_pattern,
-        base::MakeUnique<base::Value>(rule.value->Clone()),
+        std::make_unique<base::Value>(rule.value->Clone()),
         kProviderNamesSourceMap[provider_type].provider_name, incognito));
   }
 }
diff --git a/components/content_settings/core/browser/website_settings_registry_unittest.cc b/components/content_settings/core/browser/website_settings_registry_unittest.cc
index d1a9b87..0f0f3c9 100644
--- a/components/content_settings/core/browser/website_settings_registry_unittest.cc
+++ b/components/content_settings/core/browser/website_settings_registry_unittest.cc
@@ -4,8 +4,9 @@
 
 #include "components/content_settings/core/browser/website_settings_registry.h"
 
+#include <memory>
+
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "components/content_settings/core/browser/website_settings_info.h"
 #include "components/content_settings/core/common/content_settings.h"
@@ -88,7 +89,7 @@
 
   // Register a new setting.
   registry()->Register(static_cast<ContentSettingsType>(10), "test",
-                       base::MakeUnique<base::Value>(999),
+                       std::make_unique<base::Value>(999),
                        WebsiteSettingsInfo::SYNCABLE,
                        WebsiteSettingsInfo::LOSSY,
                        WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE,
@@ -117,7 +118,7 @@
 
 TEST_F(WebsiteSettingsRegistryTest, Iteration) {
   registry()->Register(static_cast<ContentSettingsType>(10), "test",
-                       base::MakeUnique<base::Value>(999),
+                       std::make_unique<base::Value>(999),
                        WebsiteSettingsInfo::SYNCABLE,
                        WebsiteSettingsInfo::LOSSY,
                        WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE,
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc
index 513fd40..2d116fc1 100644
--- a/components/content_settings/core/common/content_settings.cc
+++ b/components/content_settings/core/common/content_settings.cc
@@ -5,6 +5,7 @@
 #include "components/content_settings/core/common/content_settings.h"
 
 #include <algorithm>
+#include <memory>
 
 #include "base/logging.h"
 #include "base/macros.h"
@@ -124,7 +125,7 @@
   primary_pattern = other.primary_pattern;
   secondary_pattern = other.secondary_pattern;
   if (other.setting_value)
-    setting_value = base::MakeUnique<base::Value>(other.setting_value->Clone());
+    setting_value = std::make_unique<base::Value>(other.setting_value->Clone());
   source = other.source;
   incognito = other.incognito;
   return *this;
diff --git a/components/content_settings/core/common/content_settings_pattern.cc b/components/content_settings/core/common/content_settings_pattern.cc
index a7f5e80..6c84bfb 100644
--- a/components/content_settings/core/common/content_settings_pattern.cc
+++ b/components/content_settings/core/common/content_settings_pattern.cc
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "components/content_settings/core/common/content_settings_pattern_parser.h"
@@ -322,7 +321,7 @@
 
 // static
 std::unique_ptr<BuilderInterface> ContentSettingsPattern::CreateBuilder() {
-  return base::MakeUnique<Builder>();
+  return std::make_unique<Builder>();
 }
 
 // static
diff --git a/components/content_settings/core/common/content_settings_utils.cc b/components/content_settings/core/common/content_settings_utils.cc
index 3f86905..415d739 100644
--- a/components/content_settings/core/common/content_settings_utils.cc
+++ b/components/content_settings/core/common/content_settings_utils.cc
@@ -4,7 +4,8 @@
 
 #include "components/content_settings/core/common/content_settings_utils.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "base/values.h"
 
 namespace content_settings {
@@ -41,7 +42,7 @@
       setting >= CONTENT_SETTING_NUM_SETTINGS) {
     return nullptr;
   }
-  return base::MakeUnique<base::Value>(setting);
+  return std::make_unique<base::Value>(setting);
 }
 
 }  // namespace content_settings
diff --git a/components/contextual_search/browser/contextual_search_js_api_service_impl.cc b/components/contextual_search/browser/contextual_search_js_api_service_impl.cc
index db92f87..9dc6a06 100644
--- a/components/contextual_search/browser/contextual_search_js_api_service_impl.cc
+++ b/components/contextual_search/browser/contextual_search_js_api_service_impl.cc
@@ -4,9 +4,9 @@
 
 #include "components/contextual_search/browser/contextual_search_js_api_service_impl.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "components/contextual_search/browser/contextual_search_js_api_handler.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
@@ -36,7 +36,7 @@
 void CreateContextualSearchJsApiService(
     ContextualSearchJsApiHandler* contextual_search_js_api_handler,
     mojom::ContextualSearchJsApiServiceRequest request) {
-  mojo::MakeStrongBinding(base::MakeUnique<ContextualSearchJsApiServiceImpl>(
+  mojo::MakeStrongBinding(std::make_unique<ContextualSearchJsApiServiceImpl>(
                               contextual_search_js_api_handler),
                           std::move(request));
 }
diff --git a/components/crash/content/app/run_as_crashpad_handler_win.cc b/components/crash/content/app/run_as_crashpad_handler_win.cc
index 9e5b05b..c3b7fd9c 100644
--- a/components/crash/content/app/run_as_crashpad_handler_win.cc
+++ b/components/crash/content/app/run_as_crashpad_handler_win.cc
@@ -11,7 +11,6 @@
 
 #include "base/command_line.h"
 #include "base/files/file_path.h"
-#include "base/memory/ptr_util.h"
 #include "base/process/memory.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -82,7 +81,7 @@
     // will be invoked for any registered process' crashes, but information only
     // exists for instrumented browser processes.
     user_stream_data_sources.push_back(
-        base::MakeUnique<browser_watcher::StabilityReportUserStreamDataSource>(
+        std::make_unique<browser_watcher::StabilityReportUserStreamDataSource>(
             user_data_dir));
   }
 
diff --git a/components/crash/content/browser/crash_handler_host_linux.cc b/components/crash/content/browser/crash_handler_host_linux.cc
index 706bf5c..3480236 100644
--- a/components/crash/content/browser/crash_handler_host_linux.cc
+++ b/components/crash/content/browser/crash_handler_host_linux.cc
@@ -12,6 +12,7 @@
 #include <sys/syscall.h>
 #include <unistd.h>
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
@@ -23,7 +24,6 @@
 #include "base/linux_util.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/rand_util.h"
@@ -135,7 +135,7 @@
 
 void CrashHandlerHostLinux::StartUploaderThread() {
   uploader_thread_ =
-      base::MakeUnique<base::Thread>(process_type_ + "_crash_uploader");
+      std::make_unique<base::Thread>(process_type_ + "_crash_uploader");
   uploader_thread_->Start();
 }
 
@@ -165,13 +165,13 @@
   struct msghdr msg = {nullptr};
   struct iovec iov[kCrashIovSize];
 
-  auto crash_context = base::MakeUnique<char[]>(kCrashContextSize);
+  auto crash_context = std::make_unique<char[]>(kCrashContextSize);
 #if defined(ADDRESS_SANITIZER)
-  auto asan_report = base::MakeUnique<char[]>(kMaxAsanReportSize + 1);
+  auto asan_report = std::make_unique<char[]>(kMaxAsanReportSize + 1);
 #endif
 
   auto crash_keys =
-      base::MakeUnique<crash_reporter::internal::TransitionalCrashKeyStorage>();
+      std::make_unique<crash_reporter::internal::TransitionalCrashKeyStorage>();
   google_breakpad::SerializedNonAllocatingMap* serialized_crash_keys;
   size_t crash_keys_size = crash_keys->Serialize(
       const_cast<const google_breakpad::SerializedNonAllocatingMap**>(
@@ -365,7 +365,7 @@
       reinterpret_cast<ExceptionHandler::CrashContext*>(crash_context.get());
   bad_context->tid = crashing_tid;
 
-  auto info = base::MakeUnique<BreakpadInfo>();
+  auto info = std::make_unique<BreakpadInfo>();
   info->fd = -1;
   info->process_type_length = process_type_.length();
   // Freed in CrashDumpTask().
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index 8f87838..20f938c 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "components/cronet/url_request_context_config.h"
 
+#include <memory>
+
 #include "base/test/scoped_task_environment.h"
 #include "base/values.h"
 #include "net/cert/cert_verifier.h"
@@ -366,7 +368,7 @@
   config.ConfigureURLRequestContextBuilder(&builder, &net_log);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
-      base::MakeUnique<net::ProxyConfigServiceFixed>(
+      std::make_unique<net::ProxyConfigServiceFixed>(
           net::ProxyConfig::CreateDirect()));
   std::unique_ptr<net::URLRequestContext> context(builder.Build());
   const net::HttpNetworkSession::Params* params =
diff --git a/components/crx_file/crx_verifier.cc b/components/crx_file/crx_verifier.cc
index 77fde4e0..36c1c91f 100644
--- a/components/crx_file/crx_verifier.cc
+++ b/components/crx_file/crx_verifier.cc
@@ -15,7 +15,6 @@
 #include "base/callback.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/crx_file/crx3.pb.h"
 #include "components/crx_file/crx_file.h"
@@ -161,7 +160,7 @@
       std::vector<uint8_t> key_hash(crypto::kSHA256Length);
       crypto::SHA256HashString(key, key_hash.data(), key_hash.size());
       required_key_set.erase(key_hash);
-      auto v = base::MakeUnique<crypto::SignatureVerifier>();
+      auto v = std::make_unique<crypto::SignatureVerifier>();
       static_assert(sizeof(unsigned char) == sizeof(uint8_t),
                     "Unsupported char size.");
       if (!v->VerifyInit(
@@ -221,7 +220,7 @@
       static_cast<int>(sig_size))
     return VerifierResult::ERROR_HEADER_INVALID;
   std::vector<std::unique_ptr<crypto::SignatureVerifier>> verifiers;
-  verifiers.push_back(base::MakeUnique<crypto::SignatureVerifier>());
+  verifiers.push_back(std::make_unique<crypto::SignatureVerifier>());
   if (!verifiers[0]->VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
                                 sig.data(), sig.size(), key.data(),
                                 key.size())) {
diff --git a/components/cryptauth/background_eid_generator.cc b/components/cryptauth/background_eid_generator.cc
index 1666c34..d7f8e03 100644
--- a/components/cryptauth/background_eid_generator.cc
+++ b/components/cryptauth/background_eid_generator.cc
@@ -5,8 +5,8 @@
 #include "components/cryptauth/background_eid_generator.h"
 
 #include <cstring>
+#include <memory>
 
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
@@ -43,7 +43,7 @@
 }  // namespace
 
 BackgroundEidGenerator::BackgroundEidGenerator()
-    : BackgroundEidGenerator(base::MakeUnique<RawEidGeneratorImpl>(),
+    : BackgroundEidGenerator(std::make_unique<RawEidGeneratorImpl>(),
                              base::DefaultClock::GetInstance()) {}
 
 BackgroundEidGenerator::~BackgroundEidGenerator() {}
@@ -88,7 +88,7 @@
   std::string eid = raw_eid_generator_->GenerateEid(
       beacon_seed->data(), start_of_period_ms, nullptr);
 
-  return base::MakeUnique<DataWithTimestamp>(eid, start_of_period_ms,
+  return std::make_unique<DataWithTimestamp>(eid, start_of_period_ms,
                                              start_of_period_ms + kEidPeriodMs);
 }
 
diff --git a/components/cryptauth/background_eid_generator_unittest.cc b/components/cryptauth/background_eid_generator_unittest.cc
index be9c24c..dbbae6b 100644
--- a/components/cryptauth/background_eid_generator_unittest.cc
+++ b/components/cryptauth/background_eid_generator_unittest.cc
@@ -8,7 +8,6 @@
 #include <string>
 
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/time.h"
@@ -94,7 +93,7 @@
     SetTestTime(kCurrentTimeMs);
 
     eid_generator_.reset(new BackgroundEidGenerator(
-        base::MakeUnique<TestRawEidGenerator>(), &test_clock_));
+        std::make_unique<TestRawEidGenerator>(), &test_clock_));
   }
 
   void SetTestTime(int64_t timestamp_ms) {
diff --git a/components/cryptauth/ble/ble_advertisement_generator.cc b/components/cryptauth/ble/ble_advertisement_generator.cc
index da4f92b..066827be 100644
--- a/components/cryptauth/ble/ble_advertisement_generator.cc
+++ b/components/cryptauth/ble/ble_advertisement_generator.cc
@@ -4,9 +4,9 @@
 
 #include "components/cryptauth/ble/ble_advertisement_generator.h"
 
+#include <memory>
 #include <vector>
 
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/local_device_data_provider.h"
 #include "components/cryptauth/remote_beacon_seed_fetcher.h"
 #include "components/cryptauth/remote_device.h"
@@ -37,7 +37,7 @@
 }
 
 BleAdvertisementGenerator::BleAdvertisementGenerator()
-    : eid_generator_(base::MakeUnique<cryptauth::ForegroundEidGenerator>()) {}
+    : eid_generator_(std::make_unique<cryptauth::ForegroundEidGenerator>()) {}
 
 BleAdvertisementGenerator::~BleAdvertisementGenerator() {}
 
diff --git a/components/cryptauth/ble/ble_advertisement_generator_unittest.cc b/components/cryptauth/ble/ble_advertisement_generator_unittest.cc
index 33bd0d7e..5cd1369 100644
--- a/components/cryptauth/ble/ble_advertisement_generator_unittest.cc
+++ b/components/cryptauth/ble/ble_advertisement_generator_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "components/cryptauth/ble/ble_advertisement_generator.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/callback_forward.h"
 #include "base/stl_util.h"
@@ -48,15 +50,15 @@
         fake_advertisement_("advertisement1", 1000L, 2000L) {}
 
   void SetUp() override {
-    mock_seed_fetcher_ = base::MakeUnique<MockRemoteBeaconSeedFetcher>();
+    mock_seed_fetcher_ = std::make_unique<MockRemoteBeaconSeedFetcher>();
     std::vector<BeaconSeed> device_0_beacon_seeds =
         CreateFakeBeaconSeedsForDevice(fake_device_);
     mock_seed_fetcher_->SetSeedsForDeviceId(fake_device_.GetDeviceId(),
                                             &device_0_beacon_seeds);
 
-    mock_local_data_provider_ = base::MakeUnique<MockLocalDeviceDataProvider>();
+    mock_local_data_provider_ = std::make_unique<MockLocalDeviceDataProvider>();
     mock_local_data_provider_->SetPublicKey(
-        base::MakeUnique<std::string>(kFakePublicKey));
+        std::make_unique<std::string>(kFakePublicKey));
 
     generator_ = base::WrapUnique(new BleAdvertisementGenerator());
 
@@ -93,7 +95,7 @@
 }
 
 TEST_F(CryptAuthBleAdvertisementGeneratorTest, EmptyPublicKey) {
-  mock_local_data_provider_->SetPublicKey(base::MakeUnique<std::string>(""));
+  mock_local_data_provider_->SetPublicKey(std::make_unique<std::string>(""));
   EXPECT_EQ(nullptr, GenerateBleAdvertisement());
 }
 
@@ -116,7 +118,7 @@
 
 TEST_F(CryptAuthBleAdvertisementGeneratorTest, AdvertisementGenerated) {
   mock_eid_generator_->set_advertisement(
-      base::MakeUnique<DataWithTimestamp>(fake_advertisement_));
+      std::make_unique<DataWithTimestamp>(fake_advertisement_));
   EXPECT_EQ(fake_advertisement_, *GenerateBleAdvertisement());
 }
 
diff --git a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc
index 58c41891..a552b05 100644
--- a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc
+++ b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc
@@ -4,12 +4,12 @@
 
 #include "components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.h"
 
+#include <memory>
 #include <sstream>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "base/task_runner.h"
@@ -81,7 +81,7 @@
     const device::BluetoothUUID remote_service_uuid,
     device::BluetoothDevice* bluetooth_device,
     bool should_set_low_connection_latency) {
-  return base::MakeUnique<BluetoothLowEnergyWeaveClientConnection>(
+  return std::make_unique<BluetoothLowEnergyWeaveClientConnection>(
       remote_device, adapter, remote_service_uuid, bluetooth_device,
       should_set_low_connection_latency);
 }
@@ -146,15 +146,15 @@
       adapter_(adapter),
       remote_service_({remote_service_uuid, std::string()}),
       packet_generator_(
-          base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>()),
-      packet_receiver_(base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+          std::make_unique<BluetoothLowEnergyWeavePacketGenerator>()),
+      packet_receiver_(std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           BluetoothLowEnergyWeavePacketReceiver::ReceiverType::CLIENT)),
       tx_characteristic_(
           {device::BluetoothUUID(kTXCharacteristicUUID), std::string()}),
       rx_characteristic_(
           {device::BluetoothUUID(kRXCharacteristicUUID), std::string()}),
       task_runner_(base::ThreadTaskRunnerHandle::Get()),
-      timer_(base::MakeUnique<base::OneShotTimer>()),
+      timer_(std::make_unique<base::OneShotTimer>()),
       sub_status_(SubStatus::DISCONNECTED),
       weak_ptr_factory_(this) {
   adapter_->AddObserver(this);
@@ -362,7 +362,7 @@
     WriteRequestType request_type = (i != weave_packets.size() - 1)
                                         ? WriteRequestType::REGULAR
                                         : WriteRequestType::MESSAGE_COMPLETE;
-    queued_write_requests_.emplace(base::MakeUnique<WriteRequest>(
+    queued_write_requests_.emplace(std::make_unique<WriteRequest>(
         weave_packets[i], request_type, message.get()));
   }
 
@@ -629,7 +629,7 @@
   PA_LOG(INFO) << "Sending \"connection request\" uWeave packet to "
                << GetDeviceInfoLogString();
 
-  queued_write_requests_.emplace(base::MakeUnique<WriteRequest>(
+  queued_write_requests_.emplace(std::make_unique<WriteRequest>(
       packet_generator_->CreateConnectionRequest(),
       WriteRequestType::CONNECTION_REQUEST));
   ProcessNextWriteRequest();
@@ -805,7 +805,7 @@
   // write, we must wait for it to complete before the "connection close" can
   // be sent.
   queued_write_requests_.emplace(
-      base::MakeUnique<WriteRequest>(packet_generator_->CreateConnectionClose(
+      std::make_unique<WriteRequest>(packet_generator_->CreateConnectionClose(
                                          packet_receiver_->GetReasonToClose()),
                                      WriteRequestType::CONNECTION_CLOSE));
 
diff --git a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
index 3ae4ade..75a46dc 100644
--- a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
+++ b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
@@ -352,18 +352,18 @@
     task_runner_ = base::MakeRefCounted<base::TestSimpleTaskRunner>();
 
     mock_bluetooth_device_ =
-        base::MakeUnique<NiceMock<device::MockBluetoothDevice>>(
+        std::make_unique<NiceMock<device::MockBluetoothDevice>>(
             adapter_.get(), 0, kTestRemoteDeviceName,
             kTestRemoteDeviceBluetoothAddress, false, false);
-    service_ = base::MakeUnique<NiceMock<device::MockBluetoothGattService>>(
+    service_ = std::make_unique<NiceMock<device::MockBluetoothGattService>>(
         mock_bluetooth_device_.get(), kServiceID, service_uuid_, true, false);
     tx_characteristic_ =
-        base::MakeUnique<NiceMock<device::MockBluetoothGattCharacteristic>>(
+        std::make_unique<NiceMock<device::MockBluetoothGattCharacteristic>>(
             service_.get(), kTXCharacteristicID, tx_characteristic_uuid_, false,
             kCharacteristicProperties,
             device::BluetoothRemoteGattCharacteristic::PERMISSION_NONE);
     rx_characteristic_ =
-        base::MakeUnique<NiceMock<device::MockBluetoothGattCharacteristic>>(
+        std::make_unique<NiceMock<device::MockBluetoothGattCharacteristic>>(
             service_.get(), kRXCharacteristicID, rx_characteristic_uuid_, false,
             kCharacteristicProperties,
             device::BluetoothRemoteGattCharacteristic::PERMISSION_NONE);
@@ -464,7 +464,7 @@
             Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>)));
 
     create_gatt_connection_success_callback_.Run(
-        base::MakeUnique<NiceMock<device::MockBluetoothGattConnection>>(
+        std::make_unique<NiceMock<device::MockBluetoothGattConnection>>(
             adapter_, kTestRemoteDeviceBluetoothAddress));
 
     EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CHARACTERISTICS);
@@ -691,7 +691,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeaveClientConnectionTest,
        CreateAndDestroyWithoutConnectCallDoesntCrash) {
   std::unique_ptr<BluetoothLowEnergyWeaveClientConnection> connection =
-      base::MakeUnique<BluetoothLowEnergyWeaveClientConnection>(
+      std::make_unique<BluetoothLowEnergyWeaveClientConnection>(
           remote_device_, adapter_, service_uuid_, mock_bluetooth_device_.get(),
           true /* should_set_low_connection_latency */);
 
@@ -968,7 +968,7 @@
                 SaveArg<2>(&write_remote_characteristic_error_callback_)));
 
   connection->SendMessage(
-      base::MakeUnique<FakeWireMessage>(kSmallMessage, kTestFeature));
+      std::make_unique<FakeWireMessage>(kSmallMessage, kTestFeature));
 
   EXPECT_EQ(last_value_written_on_tx_characteristic_, kSmallPackets0);
 
@@ -1001,7 +1001,7 @@
                 SaveArg<2>(&write_remote_characteristic_error_callback_)));
 
   connection->SendMessage(
-      base::MakeUnique<FakeWireMessage>(kLargeMessage, kTestFeature));
+      std::make_unique<FakeWireMessage>(kLargeMessage, kTestFeature));
 
   EXPECT_EQ(last_value_written_on_tx_characteristic_, kLargePackets0);
   std::vector<uint8_t> bytes_received(
@@ -1050,7 +1050,7 @@
                 SaveArg<2>(&write_remote_characteristic_error_callback_)));
 
   connection->SendMessage(
-      base::MakeUnique<FakeWireMessage>(kSmallMessage, kTestFeature));
+      std::make_unique<FakeWireMessage>(kSmallMessage, kTestFeature));
 
   for (int i = 0; i < kMaxNumberOfTries; i++) {
     EXPECT_EQ(last_value_written_on_tx_characteristic_, kSmallPackets0);
@@ -1141,7 +1141,7 @@
                 SaveArg<2>(&write_remote_characteristic_error_callback_)));
 
   connection->SendMessage(
-      base::MakeUnique<FakeWireMessage>(kLargeMessage, kTestFeature));
+      std::make_unique<FakeWireMessage>(kLargeMessage, kTestFeature));
 
   connection->GattCharacteristicValueChanged(
       adapter_.get(), rx_characteristic_.get(), kErroneousPacket);
@@ -1220,7 +1220,7 @@
                 SaveArg<2>(&write_remote_characteristic_error_callback_)));
 
   connection->SendMessage(
-      base::MakeUnique<FakeWireMessage>(kSmallMessage, kTestFeature));
+      std::make_unique<FakeWireMessage>(kSmallMessage, kTestFeature));
   EXPECT_EQ(last_value_written_on_tx_characteristic_, kSmallPackets0);
 
   RunWriteCharacteristicSuccessCallback();
@@ -1321,7 +1321,7 @@
           Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>)));
 
   create_gatt_connection_success_callback_.Run(
-      base::MakeUnique<NiceMock<device::MockBluetoothGattConnection>>(
+      std::make_unique<NiceMock<device::MockBluetoothGattConnection>>(
           adapter_, kTestRemoteDeviceBluetoothAddress));
 
   CharacteristicsFound(connection.get());
@@ -1366,7 +1366,7 @@
           Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>)));
 
   create_gatt_connection_success_callback_.Run(
-      base::MakeUnique<NiceMock<device::MockBluetoothGattConnection>>(
+      std::make_unique<NiceMock<device::MockBluetoothGattConnection>>(
           adapter_, kTestRemoteDeviceBluetoothAddress));
 
   CharacteristicsFound(connection.get());
diff --git a/components/cryptauth/ble/bluetooth_low_energy_weave_packet_generator_unittest.cc b/components/cryptauth/ble/bluetooth_low_energy_weave_packet_generator_unittest.cc
index f9bf225..0dbe5b8 100644
--- a/components/cryptauth/ble/bluetooth_low_energy_weave_packet_generator_unittest.cc
+++ b/components/cryptauth/ble/bluetooth_low_energy_weave_packet_generator_unittest.cc
@@ -5,11 +5,11 @@
 #include "components/cryptauth/ble/bluetooth_low_energy_weave_packet_generator.h"
 
 #include <algorithm>
+#include <memory>
 #include <string>
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -24,7 +24,7 @@
   void TestConnectionCloseWithReason(ReasonForClose reason_for_close,
                                      uint8_t expected_reason_for_close) {
     std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-        base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+        std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
     Packet packet = generator->CreateConnectionClose(reason_for_close);
 
@@ -52,7 +52,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketGeneratorTest,
        CreateConnectionRequestTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+      std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
   Packet packet = generator->CreateConnectionRequest();
 
@@ -77,7 +77,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketGeneratorTest,
        CreateConnectionResponseWithDefaultPacketSizeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+      std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
   Packet packet = generator->CreateConnectionResponse();
 
@@ -97,7 +97,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketGeneratorTest,
        CreateConnectionResponseWithSelectedPacketSizeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+      std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
   const uint8_t kSelectedPacketSize = 30;
   const uint16_t kResponseSize = 5;
@@ -138,7 +138,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketGeneratorTest,
        EncodeDataMessageWithDefaultPacketSizeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+      std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
   std::string data = "abcdefghijklmnopqrstuvwxyz";
 
@@ -171,7 +171,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketGeneratorTest,
        EncodeDataMessageWithSelectedPacketSizeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+      std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
   const uint32_t packet_size = 30;
   const uint32_t residual_packet_size = 2;
@@ -223,7 +223,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketGeneratorTest,
        PacketCounterForMixedPacketTypesTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+      std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
   Packet packet = generator->CreateConnectionRequest();
 
@@ -242,7 +242,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketGeneratorTest,
        PacketCounterWrappedAroundTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> generator =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketGenerator>();
+      std::make_unique<BluetoothLowEnergyWeavePacketGenerator>();
 
   const uint8_t kNumPackets = 100;
   std::string data(kNumPackets * kByteDefaultMaxPacketSize, 'a');
diff --git a/components/cryptauth/ble/bluetooth_low_energy_weave_packet_receiver_unittest.cc b/components/cryptauth/ble/bluetooth_low_energy_weave_packet_receiver_unittest.cc
index a76d19b..db5e612f 100644
--- a/components/cryptauth/ble/bluetooth_low_energy_weave_packet_receiver_unittest.cc
+++ b/components/cryptauth/ble/bluetooth_low_energy_weave_packet_receiver_unittest.cc
@@ -5,10 +5,10 @@
 #include "components/cryptauth/ble/bluetooth_low_energy_weave_packet_receiver.h"
 
 #include <algorithm>
+#include <memory>
 #include <string>
 
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -50,7 +50,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        WellBehavingServerPacketsNoControlDataTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -111,7 +111,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        WellBehavingServerPacketsWithFullControlDataTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,
@@ -177,7 +177,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        WellBehavingServerPacketsWithSomeControlDataTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,    kEmptyUpperByte,
@@ -227,7 +227,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        WellBehavingClientPacketsNoControlDataTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   const uint8_t kSelectedPacketSize = 30;
@@ -266,7 +266,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        WellBehavingClientPacketsWithFullControlDataTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader,
@@ -319,7 +319,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        WellBehavingClientPacketsWithSomeControlDataTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader,
@@ -360,7 +360,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        LegacyCloseWithoutReasonTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -384,7 +384,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        OneBytePacketTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader, kEmptyUpperByte,
@@ -409,7 +409,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        EmptyPacketTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0;
@@ -422,7 +422,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ServerReceivingConnectionResponseTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
   std::vector<uint8_t> p0{kControlResponseHeader, kEmptyUpperByte,
                           kByteWeaveVersion, kEmptyUpperByte,
@@ -437,7 +437,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ClientReceivingConnectionRequestTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
                           kByteWeaveVersion,       kEmptyUpperByte,
@@ -453,7 +453,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ReceiveConnectionCloseInConnecting) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   // uWeave Header:
@@ -472,7 +472,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ReceiveDataInConnecting) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   // uWeave Header:
@@ -493,7 +493,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ConnectionRequestTooSmallTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
   std::vector<uint8_t> p0{kControlRequestHeader, kEmptyUpperByte,
                           kByteWeaveVersion,     kEmptyUpperByte,
@@ -508,7 +508,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ConnectionRequestTooLargeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0(kByteDefaultMaxPacketSize + 1, 0);
@@ -525,7 +525,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ConnectionResponseTooSmallTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader, kEmptyUpperByte,
@@ -540,7 +540,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ConnectionResponseTooLargeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0(kByteDefaultMaxPacketSize + 1, 0);
@@ -557,7 +557,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ConnectionCloseTooLargeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -582,7 +582,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        DataPacketTooLargeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -611,7 +611,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        FirstPacketNoFirstNorLastBitTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -640,7 +640,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        FirstPacketNoFirstYesLastBitTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -669,7 +669,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        NonFirstPacketYesFirstBitTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -709,7 +709,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        OutOfOrderPacketTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -738,7 +738,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        InvalidVersionInConnectionRequestTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   const uint8_t kWrongVersion = 2;
@@ -759,7 +759,7 @@
   const uint8_t kSmallMaxPacketSize = 19;
 
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader, kEmptyUpperByte,
@@ -776,7 +776,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        InvalidSelectedVersionInConnectionResponseTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader, kByteWeaveVersion,
@@ -793,7 +793,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        InvalidSelectedMaxPacketSizeInConnectionResponseTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   const uint8_t kSmallMaxPacketSize = 19;
@@ -810,7 +810,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        UnrecognizedReasonForCloseInConnectionCloseTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader, kEmptyUpperByte,
@@ -836,7 +836,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        UnrecognizedControlCommandBitTwoTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   // uWeave Header:
@@ -861,7 +861,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        InvalidControlCommandBitThreeTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   // uWeave Header:
@@ -881,7 +881,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        InvalidBitOneInDataPacketHeaderTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader, kEmptyUpperByte,
@@ -908,7 +908,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        InvalidBitZeroInDataPacketHeaderTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0{kControlResponseHeader, kEmptyUpperByte,
@@ -935,7 +935,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ReceivedPacketInErrorState) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::CLIENT);
 
   std::vector<uint8_t> p0;
@@ -955,7 +955,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        ReceivedPacketInConnectionClosedStateTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
@@ -993,7 +993,7 @@
 TEST_F(CryptAuthBluetoothLowEnergyWeavePacketReceiverTest,
        MultipleControlPacketTest) {
   std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
-      base::MakeUnique<BluetoothLowEnergyWeavePacketReceiver>(
+      std::make_unique<BluetoothLowEnergyWeavePacketReceiver>(
           ReceiverType::SERVER);
 
   std::vector<uint8_t> p0{kControlRequestHeader,   kEmptyUpperByte,
diff --git a/components/cryptauth/cryptauth_client_impl.cc b/components/cryptauth/cryptauth_client_impl.cc
index 8fbe82e0..f16b4a2 100644
--- a/components/cryptauth/cryptauth_client_impl.cc
+++ b/components/cryptauth/cryptauth_client_impl.cc
@@ -4,6 +4,7 @@
 
 #include "components/cryptauth/cryptauth_client_impl.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
@@ -333,7 +334,7 @@
 }
 
 std::unique_ptr<CryptAuthClient> CryptAuthClientFactoryImpl::CreateInstance() {
-  return base::MakeUnique<CryptAuthClientImpl>(
+  return std::make_unique<CryptAuthClientImpl>(
       base::WrapUnique(new CryptAuthApiCallFlow()),
       base::WrapUnique(
           new CryptAuthAccessTokenFetcherImpl(token_service_, account_id_)),
diff --git a/components/cryptauth/cryptauth_device_manager.cc b/components/cryptauth/cryptauth_device_manager.cc
index c32e6f3..6f658940 100644
--- a/components/cryptauth/cryptauth_device_manager.cc
+++ b/components/cryptauth/cryptauth_device_manager.cc
@@ -8,8 +8,9 @@
 #include <stdexcept>
 #include <utility>
 
+#include <memory>
+
 #include "base/base64url.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/cryptauth/cryptauth_client.h"
 #include "components/cryptauth/pref_names.h"
@@ -316,7 +317,7 @@
 
 std::unique_ptr<SyncSchedulerImpl> CreateSyncScheduler(
     SyncScheduler::Delegate* delegate) {
-  return base::MakeUnique<SyncSchedulerImpl>(
+  return std::make_unique<SyncSchedulerImpl>(
       delegate, base::TimeDelta::FromHours(kRefreshPeriodHours),
       base::TimeDelta::FromMinutes(kDeviceSyncBaseRecoveryPeriodMinutes),
       kDeviceSyncMaxJitterRatio, "CryptAuth DeviceSync");
diff --git a/components/cryptauth/cryptauth_device_manager_unittest.cc b/components/cryptauth/cryptauth_device_manager_unittest.cc
index 4422799..9fbe6fe 100644
--- a/components/cryptauth/cryptauth_device_manager_unittest.cc
+++ b/components/cryptauth/cryptauth_device_manager_unittest.cc
@@ -6,11 +6,11 @@
 
 #include <stddef.h>
 
+#include <memory>
 #include <utility>
 
 #include "base/base64url.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -388,13 +388,13 @@
     CryptAuthDeviceManager::RegisterPrefs(pref_service_.registry());
     pref_service_.SetUserPref(
         prefs::kCryptAuthDeviceSyncIsRecoveringFromFailure,
-        base::MakeUnique<base::Value>(false));
+        std::make_unique<base::Value>(false));
     pref_service_.SetUserPref(
         prefs::kCryptAuthDeviceSyncLastSyncTimeSeconds,
-        base::MakeUnique<base::Value>(kLastSyncTimeSeconds));
+        std::make_unique<base::Value>(kLastSyncTimeSeconds));
     pref_service_.SetUserPref(
         prefs::kCryptAuthDeviceSyncReason,
-        base::MakeUnique<base::Value>(INVOCATION_REASON_UNKNOWN));
+        std::make_unique<base::Value>(INVOCATION_REASON_UNKNOWN));
 
     std::unique_ptr<base::DictionaryValue> device_dictionary(
         new base::DictionaryValue());
@@ -416,7 +416,7 @@
                                      bluetooth_address_b64);
     device_dictionary->SetBoolean("unlock_key", kStoredUnlockKey);
     device_dictionary->SetBoolean("unlockable", kStoredUnlockable);
-    device_dictionary->Set("beacon_seeds", base::MakeUnique<base::ListValue>());
+    device_dictionary->Set("beacon_seeds", std::make_unique<base::ListValue>());
     device_dictionary->SetBoolean("mobile_hotspot_supported",
                                   kStoredMobileHotspotSupported);
     {
@@ -460,7 +460,7 @@
         static_cast<SyncScheduler::Delegate*>(device_manager_.get());
 
     std::unique_ptr<SyncScheduler::SyncRequest> sync_request =
-        base::MakeUnique<SyncScheduler::SyncRequest>(
+        std::make_unique<SyncScheduler::SyncRequest>(
             device_manager_->GetSyncScheduler());
     EXPECT_CALL(*this, OnSyncStartedProxy());
     delegate->OnSyncRequested(std::move(sync_request));
@@ -557,9 +557,8 @@
   CryptAuthDeviceManager::RegisterPrefs(pref_service.registry());
 
   TestCryptAuthDeviceManager device_manager(
-      &clock,
-      base::MakeUnique<MockCryptAuthClientFactory>(
-          MockCryptAuthClientFactory::MockType::MAKE_STRICT_MOCKS),
+      &clock, std::make_unique<MockCryptAuthClientFactory>(
+                  MockCryptAuthClientFactory::MockType::MAKE_STRICT_MOCKS),
       &gcm_manager_, &pref_service);
 
   EXPECT_CALL(
diff --git a/components/cryptauth/cryptauth_enrollment_manager.cc b/components/cryptauth/cryptauth_enrollment_manager.cc
index 3645a34b..500719c 100644
--- a/components/cryptauth/cryptauth_enrollment_manager.cc
+++ b/components/cryptauth/cryptauth_enrollment_manager.cc
@@ -4,10 +4,10 @@
 
 #include "components/cryptauth/cryptauth_enrollment_manager.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/base64url.h"
-#include "base/memory/ptr_util.h"
 #include "base/time/clock.h"
 #include "base/time/time.h"
 #include "components/cryptauth/cryptauth_enroller.h"
@@ -44,7 +44,7 @@
 
 std::unique_ptr<SyncScheduler> CreateSyncScheduler(
     SyncScheduler::Delegate* delegate) {
-  return base::MakeUnique<SyncSchedulerImpl>(
+  return std::make_unique<SyncSchedulerImpl>(
       delegate, base::TimeDelta::FromDays(kEnrollmentRefreshPeriodDays),
       base::TimeDelta::FromMinutes(kEnrollmentBaseRecoveryPeriodMinutes),
       kEnrollmentMaxJitterRatio, "CryptAuth Enrollment");
diff --git a/components/cryptauth/cryptauth_enrollment_manager_unittest.cc b/components/cryptauth/cryptauth_enrollment_manager_unittest.cc
index 910e928..730b683 100644
--- a/components/cryptauth/cryptauth_enrollment_manager_unittest.cc
+++ b/components/cryptauth/cryptauth_enrollment_manager_unittest.cc
@@ -4,11 +4,11 @@
 
 #include "components/cryptauth/cryptauth_enrollment_manager.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/base64url.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/clock.h"
@@ -166,13 +166,13 @@
     CryptAuthEnrollmentManager::RegisterPrefs(pref_service_.registry());
     pref_service_.SetUserPref(
         prefs::kCryptAuthEnrollmentIsRecoveringFromFailure,
-        base::MakeUnique<base::Value>(false));
+        std::make_unique<base::Value>(false));
     pref_service_.SetUserPref(
         prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds,
-        base::MakeUnique<base::Value>(kLastEnrollmentTimeSeconds));
+        std::make_unique<base::Value>(kLastEnrollmentTimeSeconds));
     pref_service_.SetUserPref(
         prefs::kCryptAuthEnrollmentReason,
-        base::MakeUnique<base::Value>(INVOCATION_REASON_UNKNOWN));
+        std::make_unique<base::Value>(INVOCATION_REASON_UNKNOWN));
 
     std::string public_key_b64, private_key_b64;
     base::Base64UrlEncode(public_key_,
@@ -217,7 +217,7 @@
         Enroll(public_key_, private_key_, _, expected_invocation_reason, _))
         .WillOnce(SaveArg<4>(&completion_callback));
 
-    auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>(
+    auto sync_request = std::make_unique<SyncScheduler::SyncRequest>(
         enrollment_manager_.GetSyncScheduler());
     EXPECT_CALL(*this, OnEnrollmentStartedProxy());
 
@@ -303,8 +303,8 @@
   CryptAuthEnrollmentManager::RegisterPrefs(pref_service.registry());
 
   TestCryptAuthEnrollmentManager enrollment_manager(
-      &clock, base::MakeUnique<MockCryptAuthEnrollerFactory>(),
-      base::MakeUnique<FakeSecureMessageDelegate>(), device_info_,
+      &clock, std::make_unique<MockCryptAuthEnrollerFactory>(),
+      std::make_unique<FakeSecureMessageDelegate>(), device_info_,
       &gcm_manager_, &pref_service);
 
   EXPECT_CALL(
@@ -331,7 +331,7 @@
 TEST_F(CryptAuthEnrollmentManagerTest, InitWithExpiredEnrollment) {
   pref_service_.SetUserPref(
       prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds,
-      base::MakeUnique<base::Value>(kLastExpiredEnrollmentTimeSeconds));
+      std::make_unique<base::Value>(kLastExpiredEnrollmentTimeSeconds));
 
   EXPECT_CALL(*sync_scheduler(),
               Start(clock_.Now() - base::Time::FromDoubleT(
@@ -404,7 +404,7 @@
 
   // Trigger a sync request.
   EXPECT_CALL(*this, OnEnrollmentStartedProxy());
-  auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>(
+  auto sync_request = std::make_unique<SyncScheduler::SyncRequest>(
       enrollment_manager_.GetSyncScheduler());
   static_cast<SyncScheduler::Delegate*>(&enrollment_manager_)
       ->OnSyncRequested(std::move(sync_request));
@@ -440,7 +440,7 @@
 
   // Trigger a sync request.
   EXPECT_CALL(*this, OnEnrollmentStartedProxy());
-  auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>(
+  auto sync_request = std::make_unique<SyncScheduler::SyncRequest>(
       enrollment_manager_.GetSyncScheduler());
   static_cast<SyncScheduler::Delegate*>(&enrollment_manager_)
       ->OnSyncRequested(std::move(sync_request));
diff --git a/components/cryptauth/device_capability_manager_impl.cc b/components/cryptauth/device_capability_manager_impl.cc
index e49121a..59b677370 100644
--- a/components/cryptauth/device_capability_manager_impl.cc
+++ b/components/cryptauth/device_capability_manager_impl.cc
@@ -4,6 +4,8 @@
 
 #include "components/cryptauth/device_capability_manager_impl.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "components/cryptauth/proto/cryptauth_api.pb.h"
 
@@ -48,7 +50,7 @@
     bool enabled,
     const base::Closure& success_callback,
     const base::Callback<void(const std::string&)>& error_callback) {
-  pending_requests_.emplace(base::MakeUnique<Request>(
+  pending_requests_.emplace(std::make_unique<Request>(
       RequestType::SET_CAPABILITY_ENABLED, Capability::CAPABILITY_UNLOCK_KEY,
       public_key, enabled, success_callback, error_callback));
   ProcessRequestQueue();
@@ -60,7 +62,7 @@
                               const std::vector<IneligibleDevice>&)>&
         success_callback,
     const base::Callback<void(const std::string&)>& error_callback) {
-  pending_requests_.emplace(base::MakeUnique<Request>(
+  pending_requests_.emplace(std::make_unique<Request>(
       RequestType::FIND_ELIGIBLE_DEVICES_FOR_CAPABILITY,
       Capability::CAPABILITY_UNLOCK_KEY, success_callback, error_callback));
   ProcessRequestQueue();
@@ -71,7 +73,7 @@
     Capability capability,
     const base::Callback<void(bool)>& success_callback,
     const base::Callback<void(const std::string&)>& error_callback) {
-  pending_requests_.emplace(base::MakeUnique<Request>(
+  pending_requests_.emplace(std::make_unique<Request>(
       RequestType::IS_CAPABILITY_PROMOTABLE, capability, public_key,
       success_callback, error_callback));
   ProcessRequestQueue();
@@ -239,4 +241,4 @@
   }
 }
 
-}  // namespace cryptauth
\ No newline at end of file
+}  // namespace cryptauth
diff --git a/components/cryptauth/device_capability_manager_impl_unittest.cc b/components/cryptauth/device_capability_manager_impl_unittest.cc
index f080bf9..5868c6d 100644
--- a/components/cryptauth/device_capability_manager_impl_unittest.cc
+++ b/components/cryptauth/device_capability_manager_impl_unittest.cc
@@ -15,7 +15,6 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/mock_cryptauth_client.h"
 #include "components/cryptauth/remote_device.h"
 #include "components/cryptauth/remote_device_test_util.h"
@@ -69,10 +68,10 @@
 
   void SetUp() override {
     mock_cryptauth_client_factory_ =
-        base::MakeUnique<MockCryptAuthClientFactory>(
+        std::make_unique<MockCryptAuthClientFactory>(
             MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS);
     mock_cryptauth_client_factory_->AddObserver(this);
-    device_capability_manager_ = base::MakeUnique<DeviceCapabilityManagerImpl>(
+    device_capability_manager_ = std::make_unique<DeviceCapabilityManagerImpl>(
         mock_cryptauth_client_factory_.get());
   }
 
@@ -422,4 +421,4 @@
   EXPECT_EQ(kErrorFindEligibleForPromotion, GetResultAndReset());
 }
 
-}  // namespace cryptauth
\ No newline at end of file
+}  // namespace cryptauth
diff --git a/components/cryptauth/device_to_device_authenticator.cc b/components/cryptauth/device_to_device_authenticator.cc
index a8a648b..5adab3ee 100644
--- a/components/cryptauth/device_to_device_authenticator.cc
+++ b/components/cryptauth/device_to_device_authenticator.cc
@@ -4,6 +4,7 @@
 
 #include "components/cryptauth/device_to_device_authenticator.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/memory/ptr_util.h"
@@ -68,7 +69,7 @@
     : connection_(connection),
       account_id_(account_id),
       secure_message_delegate_(std::move(secure_message_delegate)),
-      helper_(base::MakeUnique<DeviceToDeviceInitiatorHelper>()),
+      helper_(std::make_unique<DeviceToDeviceInitiatorHelper>()),
       state_(State::NOT_STARTED),
       weak_ptr_factory_(this) {
   DCHECK(connection_);
@@ -122,7 +123,7 @@
 }
 
 std::unique_ptr<base::Timer> DeviceToDeviceAuthenticator::CreateTimer() {
-  return base::MakeUnique<base::OneShotTimer>();
+  return std::make_unique<base::OneShotTimer>();
 }
 
 void DeviceToDeviceAuthenticator::OnHelloMessageCreated(
@@ -145,7 +146,7 @@
   // Send the [Initiator Hello] message to the remote device.
   state_ = State::SENT_HELLO;
   hello_message_ = message;
-  connection_->SendMessage(base::MakeUnique<WireMessage>(
+  connection_->SendMessage(std::make_unique<WireMessage>(
       hello_message_, std::string(Authenticator::kAuthenticationFeature)));
 }
 
@@ -184,7 +185,7 @@
   }
 
   state_ = State::SENT_INITIATOR_AUTH;
-  connection_->SendMessage(base::MakeUnique<WireMessage>(
+  connection_->SendMessage(std::make_unique<WireMessage>(
       message, std::string(Authenticator::kAuthenticationFeature)));
 }
 
@@ -213,7 +214,7 @@
   connection_->RemoveObserver(this);
   callback_.Run(
       Result::SUCCESS,
-      base::MakeUnique<DeviceToDeviceSecureContext>(
+      std::make_unique<DeviceToDeviceSecureContext>(
           std::move(secure_message_delegate_), session_keys_,
           responder_auth_message_, SecureContext::PROTOCOL_VERSION_THREE_ONE));
 }
diff --git a/components/cryptauth/device_to_device_authenticator_unittest.cc b/components/cryptauth/device_to_device_authenticator_unittest.cc
index 851df649..eecec3a 100644
--- a/components/cryptauth/device_to_device_authenticator_unittest.cc
+++ b/components/cryptauth/device_to_device_authenticator_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/cryptauth/device_to_device_authenticator.h"
 
+#include <memory>
 #include <utility>
 #include <vector>
 
@@ -350,10 +351,10 @@
   // completes.
   WireMessage wire_message(base::RandBytesAsString(300u),
                            Authenticator::kAuthenticationFeature);
-  connection_.SendMessage(base::MakeUnique<WireMessage>(
+  connection_.SendMessage(std::make_unique<WireMessage>(
       base::RandBytesAsString(300u), Authenticator::kAuthenticationFeature));
   connection_.OnBytesReceived(wire_message.Serialize());
-  connection_.SendMessage(base::MakeUnique<WireMessage>(
+  connection_.SendMessage(std::make_unique<WireMessage>(
       base::RandBytesAsString(300u), Authenticator::kAuthenticationFeature));
   connection_.OnBytesReceived(wire_message.Serialize());
 }
diff --git a/components/cryptauth/device_to_device_operations_unittest.cc b/components/cryptauth/device_to_device_operations_unittest.cc
index 31bba05..bc96d5e 100644
--- a/components/cryptauth/device_to_device_operations_unittest.cc
+++ b/components/cryptauth/device_to_device_operations_unittest.cc
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <memory>
+
 #include "base/base64url.h"
 #include "base/bind.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/device_to_device_initiator_helper.h"
 #include "components/cryptauth/device_to_device_responder_operations.h"
 #include "components/cryptauth/fake_secure_message_delegate.h"
@@ -94,7 +95,7 @@
 
     persistent_symmetric_key_ = "persistent symmetric key";
 
-    helper_ = base::MakeUnique<DeviceToDeviceInitiatorHelper>();
+    helper_ = std::make_unique<DeviceToDeviceInitiatorHelper>();
   }
 
   // Creates the initator's [Hello] message.
diff --git a/components/cryptauth/device_to_device_secure_context_unittest.cc b/components/cryptauth/device_to_device_secure_context_unittest.cc
index f2674926..889e6dc 100644
--- a/components/cryptauth/device_to_device_secure_context_unittest.cc
+++ b/components/cryptauth/device_to_device_secure_context_unittest.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/fake_secure_message_delegate.h"
 #include "components/cryptauth/proto/cryptauth_api.pb.h"
 #include "components/cryptauth/proto/securemessage.pb.h"
@@ -52,7 +51,7 @@
 class ProximityAuthDeviceToDeviceSecureContextTest : public testing::Test {
  protected:
   ProximityAuthDeviceToDeviceSecureContextTest()
-      : secure_context_(base::MakeUnique<FakeSecureMessageDelegate>(),
+      : secure_context_(std::make_unique<FakeSecureMessageDelegate>(),
                         SessionKeys(kSymmetricKey),
                         kResponderAuthMessage,
                         kProtocolVersion) {}
@@ -95,7 +94,7 @@
   // Initialize second secure channel with the same parameters as the first.
   InvertedSessionKeys inverted_session_keys(kSymmetricKey);
   DeviceToDeviceSecureContext secure_context2(
-      base::MakeUnique<FakeSecureMessageDelegate>(), inverted_session_keys,
+      std::make_unique<FakeSecureMessageDelegate>(), inverted_session_keys,
       kResponderAuthMessage, kProtocolVersion);
   std::string message = "encrypt this message";
 
@@ -122,7 +121,7 @@
        DecodeInvalidSequenceNumber) {
   // Initialize second secure channel with the same parameters as the first.
   DeviceToDeviceSecureContext secure_context2(
-      base::MakeUnique<FakeSecureMessageDelegate>(),
+      std::make_unique<FakeSecureMessageDelegate>(),
       InvertedSessionKeys(kSymmetricKey), kResponderAuthMessage,
       kProtocolVersion);
 
diff --git a/components/cryptauth/fake_connection.cc b/components/cryptauth/fake_connection.cc
index 76f5718..e126787 100644
--- a/components/cryptauth/fake_connection.cc
+++ b/components/cryptauth/fake_connection.cc
@@ -4,9 +4,9 @@
 
 #include "components/cryptauth/fake_connection.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/wire_message.h"
 
 namespace cryptauth {
@@ -90,7 +90,7 @@
 std::unique_ptr<WireMessage> FakeConnection::DeserializeWireMessage(
     bool* is_incomplete_message) {
   *is_incomplete_message = false;
-  return base::MakeUnique<WireMessage>(pending_payload_, pending_feature_);
+  return std::make_unique<WireMessage>(pending_payload_, pending_feature_);
 }
 
 }  // namespace cryptauth
diff --git a/components/cryptauth/fake_cryptauth_service.cc b/components/cryptauth/fake_cryptauth_service.cc
index 93b9113c..4fa3e34 100644
--- a/components/cryptauth/fake_cryptauth_service.cc
+++ b/components/cryptauth/fake_cryptauth_service.cc
@@ -4,8 +4,9 @@
 
 #include "components/cryptauth/fake_cryptauth_service.h"
 
+#include <memory>
+
 #include "base/callback.h"
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/fake_secure_message_delegate.h"
 #include "components/cryptauth/mock_cryptauth_client.h"
 
@@ -34,12 +35,12 @@
 
 std::unique_ptr<SecureMessageDelegate>
 FakeCryptAuthService::CreateSecureMessageDelegate() {
-  return base::MakeUnique<FakeSecureMessageDelegate>();
+  return std::make_unique<FakeSecureMessageDelegate>();
 }
 
 std::unique_ptr<CryptAuthClientFactory>
 FakeCryptAuthService::CreateCryptAuthClientFactory() {
-  return base::MakeUnique<MockCryptAuthClientFactory>(
+  return std::make_unique<MockCryptAuthClientFactory>(
       MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS);
 }
 
diff --git a/components/cryptauth/foreground_eid_generator.cc b/components/cryptauth/foreground_eid_generator.cc
index d50464c..5f866128 100644
--- a/components/cryptauth/foreground_eid_generator.cc
+++ b/components/cryptauth/foreground_eid_generator.cc
@@ -5,6 +5,7 @@
 #include "components/cryptauth/foreground_eid_generator.h"
 
 #include <cstring>
+#include <memory>
 
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
@@ -58,7 +59,7 @@
 }
 
 ForegroundEidGenerator::ForegroundEidGenerator()
-    : ForegroundEidGenerator(base::MakeUnique<RawEidGeneratorImpl>(),
+    : ForegroundEidGenerator(std::make_unique<RawEidGeneratorImpl>(),
                              base::DefaultClock::GetInstance()) {}
 
 ForegroundEidGenerator::ForegroundEidGenerator(
diff --git a/components/cryptauth/foreground_eid_generator_unittest.cc b/components/cryptauth/foreground_eid_generator_unittest.cc
index 814cc4c7..37f460e 100644
--- a/components/cryptauth/foreground_eid_generator_unittest.cc
+++ b/components/cryptauth/foreground_eid_generator_unittest.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/time.h"
@@ -133,7 +132,7 @@
     SetTestTime(kDefaultCurrentTime);
 
     eid_generator_.reset(new ForegroundEidGenerator(
-        base::MakeUnique<TestRawEidGenerator>(), &test_clock_));
+        std::make_unique<TestRawEidGenerator>(), &test_clock_));
   }
 
   // TODO(khorimoto): Is there an easier way to do this?
@@ -335,7 +334,7 @@
 
   // Use real RawEidGenerator implementation instead of test version.
   eid_generator_.reset(new ForegroundEidGenerator(
-      base::MakeUnique<RawEidGeneratorImpl>(), &test_clock_));
+      std::make_unique<RawEidGeneratorImpl>(), &test_clock_));
 
   std::unique_ptr<ForegroundEidGenerator::EidData> data =
       eid_generator_->GenerateBackgroundScanFilter(
diff --git a/components/cryptauth/local_device_data_provider_unittest.cc b/components/cryptauth/local_device_data_provider_unittest.cc
index 9259c5d0..8307ce72 100644
--- a/components/cryptauth/local_device_data_provider_unittest.cc
+++ b/components/cryptauth/local_device_data_provider_unittest.cc
@@ -4,11 +4,11 @@
 
 #include "components/cryptauth/local_device_data_provider.h"
 
+#include <memory>
 #include <string>
 #include <vector>
 
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/cryptauth_device_manager.h"
 #include "components/cryptauth/cryptauth_enroller.h"
 #include "components/cryptauth/cryptauth_enrollment_manager.h"
@@ -124,12 +124,12 @@
     mock_device_manager_ =
         base::WrapUnique(new NiceMock<MockCryptAuthDeviceManager>());
     fake_cryptauth_gcm_manager_ =
-        base::MakeUnique<FakeCryptAuthGCMManager>("registrationId");
+        std::make_unique<FakeCryptAuthGCMManager>("registrationId");
     mock_enrollment_manager_ =
         base::WrapUnique(new NiceMock<MockCryptAuthEnrollmentManager>(
             fake_cryptauth_gcm_manager_.get()));
 
-    fake_cryptauth_service_ = base::MakeUnique<FakeCryptAuthService>();
+    fake_cryptauth_service_ = std::make_unique<FakeCryptAuthService>();
     fake_cryptauth_service_->set_cryptauth_device_manager(
         mock_device_manager_.get());
     fake_cryptauth_service_->set_cryptauth_enrollment_manager(
diff --git a/components/cryptauth/mock_foreground_eid_generator.cc b/components/cryptauth/mock_foreground_eid_generator.cc
index 7964b4e0..51d21ab6 100644
--- a/components/cryptauth/mock_foreground_eid_generator.cc
+++ b/components/cryptauth/mock_foreground_eid_generator.cc
@@ -4,7 +4,7 @@
 
 #include "components/cryptauth/mock_foreground_eid_generator.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
 
 namespace cryptauth {
 
@@ -22,13 +22,13 @@
 
   std::unique_ptr<DataWithTimestamp> adjacent_data;
   if (background_scan_filter_->adjacent_data) {
-    adjacent_data = base::MakeUnique<DataWithTimestamp>(
+    adjacent_data = std::make_unique<DataWithTimestamp>(
         background_scan_filter_->adjacent_data->data,
         background_scan_filter_->adjacent_data->start_timestamp_ms,
         background_scan_filter_->adjacent_data->end_timestamp_ms);
   }
 
-  return base::MakeUnique<EidData>(background_scan_filter_->current_data,
+  return std::make_unique<EidData>(background_scan_filter_->current_data,
                                    std::move(adjacent_data));
 }
 
@@ -40,7 +40,7 @@
     return nullptr;
   }
 
-  return base::MakeUnique<DataWithTimestamp>(advertisement_->data,
+  return std::make_unique<DataWithTimestamp>(advertisement_->data,
                                              advertisement_->start_timestamp_ms,
                                              advertisement_->end_timestamp_ms);
 }
diff --git a/components/cryptauth/remote_beacon_seed_fetcher_unittest.cc b/components/cryptauth/remote_beacon_seed_fetcher_unittest.cc
index 31fcaeeee..a06ea64 100644
--- a/components/cryptauth/remote_beacon_seed_fetcher_unittest.cc
+++ b/components/cryptauth/remote_beacon_seed_fetcher_unittest.cc
@@ -4,8 +4,9 @@
 
 #include "components/cryptauth/remote_beacon_seed_fetcher.h"
 
+#include <memory>
+
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/cryptauth_client.h"
 #include "components/cryptauth/cryptauth_device_manager.h"
 #include "components/cryptauth/remote_device.h"
@@ -90,8 +91,8 @@
       : fake_info1_(CreateFakeInfo1()), fake_info2_(CreateFakeInfo2()) {}
 
   void SetUp() override {
-    mock_device_manager_ = base::MakeUnique<MockDeviceManager>();
-    fetcher_ = base::MakeUnique<StrictMock<RemoteBeaconSeedFetcher>>(
+    mock_device_manager_ = std::make_unique<MockDeviceManager>();
+    fetcher_ = std::make_unique<StrictMock<RemoteBeaconSeedFetcher>>(
         mock_device_manager_.get());
   }
 
diff --git a/components/cryptauth/remote_device_loader_unittest.cc b/components/cryptauth/remote_device_loader_unittest.cc
index 3aa71fb..03599cd 100644
--- a/components/cryptauth/remote_device_loader_unittest.cc
+++ b/components/cryptauth/remote_device_loader_unittest.cc
@@ -11,7 +11,6 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "components/cryptauth/fake_secure_message_delegate.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -129,7 +128,7 @@
       1, CreateDeviceInfo("0"));
 
   RemoteDeviceLoader loader1(device_infos, user_private_key_, kUserId,
-                             base::MakeUnique<FakeSecureMessageDelegate>());
+                             std::make_unique<FakeSecureMessageDelegate>());
   EXPECT_CALL(*this, LoadCompleted());
   loader1.Load(
       false /* should_load_beacon_seeds */,
@@ -138,7 +137,7 @@
   RemoteDevice remote_device_without_beacon_seed = remote_devices_[0];
 
   RemoteDeviceLoader loader2(device_infos, user_private_key_, kUserId,
-                             base::MakeUnique<FakeSecureMessageDelegate>());
+                             std::make_unique<FakeSecureMessageDelegate>());
   EXPECT_CALL(*this, LoadCompleted());
   loader2.Load(
       true /* should_load_beacon_seeds */,
diff --git a/components/cryptauth/remote_device_provider_impl_unittest.cc b/components/cryptauth/remote_device_provider_impl_unittest.cc
index 15479ab..3298323b 100644
--- a/components/cryptauth/remote_device_provider_impl_unittest.cc
+++ b/components/cryptauth/remote_device_provider_impl_unittest.cc
@@ -111,7 +111,7 @@
       EXPECT_EQ(std::string(kTestUserId), user_id);
       EXPECT_EQ(std::string(kTestUserPrivateKey), user_private_key);
       std::unique_ptr<FakeDeviceLoader> device_loader =
-          base::MakeUnique<FakeDeviceLoader>();
+          std::make_unique<FakeDeviceLoader>();
       device_loader->remote_device_loader_factory_ = this;
       return std::move(device_loader);
     }
@@ -175,16 +175,16 @@
             this,
             &RemoteDeviceProviderImplTest::mock_device_manager_sync_devices));
     fake_secure_message_delegate_factory_ =
-        base::MakeUnique<FakeSecureMessageDelegateFactory>();
+        std::make_unique<FakeSecureMessageDelegateFactory>();
     test_device_loader_factory_ =
-        base::MakeUnique<FakeDeviceLoader::TestRemoteDeviceLoaderFactory>();
+        std::make_unique<FakeDeviceLoader::TestRemoteDeviceLoaderFactory>();
     cryptauth::RemoteDeviceLoader::Factory::SetInstanceForTesting(
         test_device_loader_factory_.get());
-    test_observer_ = base::MakeUnique<TestObserver>();
+    test_observer_ = std::make_unique<TestObserver>();
   }
 
   void CreateRemoteDeviceProvider() {
-    remote_device_provider_ = base::MakeUnique<RemoteDeviceProviderImpl>(
+    remote_device_provider_ = std::make_unique<RemoteDeviceProviderImpl>(
         mock_device_manager_.get(), kTestUserId, kTestUserPrivateKey,
         fake_secure_message_delegate_factory_.get());
     remote_device_provider_->AddObserver(test_observer_.get());
diff --git a/components/cryptauth/secure_channel.cc b/components/cryptauth/secure_channel.cc
index 8ba55e4..2639bdf6 100644
--- a/components/cryptauth/secure_channel.cc
+++ b/components/cryptauth/secure_channel.cc
@@ -4,6 +4,8 @@
 
 #include "components/cryptauth/secure_channel.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "components/cryptauth/cryptauth_service.h"
@@ -90,7 +92,7 @@
   next_sequence_number_++;
 
   queued_messages_.emplace(
-      base::MakeUnique<PendingMessage>(feature, payload, sequence_number));
+      std::make_unique<PendingMessage>(feature, payload, sequence_number));
   ProcessMessageQueue();
 
   return sequence_number;
@@ -274,7 +276,7 @@
 void SecureChannel::OnMessageEncoded(const std::string& feature,
                                      int sequence_number,
                                      const std::string& encoded_message) {
-  connection_->SendMessage(base::MakeUnique<cryptauth::WireMessage>(
+  connection_->SendMessage(std::make_unique<cryptauth::WireMessage>(
       encoded_message, feature, sequence_number));
 }
 
diff --git a/components/cryptauth/secure_channel_unittest.cc b/components/cryptauth/secure_channel_unittest.cc
index aceab54..34a190c 100644
--- a/components/cryptauth/secure_channel_unittest.cc
+++ b/components/cryptauth/secure_channel_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/cryptauth/secure_channel.h"
 
+#include <memory>
 #include <string>
 
 #include "base/bind.h"
@@ -165,13 +166,13 @@
   void SetUp() override {
     has_verified_gatt_services_event_ = false;
 
-    test_authenticator_factory_ = base::MakeUnique<TestAuthenticatorFactory>();
+    test_authenticator_factory_ = std::make_unique<TestAuthenticatorFactory>();
     DeviceToDeviceAuthenticator::Factory::SetInstanceForTesting(
         test_authenticator_factory_.get());
 
     fake_secure_context_ = nullptr;
 
-    fake_cryptauth_service_ = base::MakeUnique<FakeCryptAuthService>();
+    fake_cryptauth_service_ = std::make_unique<FakeCryptAuthService>();
 
     fake_connection_ =
         new FakeConnection(test_device_, /* should_auto_connect */ false);
@@ -182,7 +183,7 @@
     EXPECT_EQ(static_cast<size_t>(1), fake_connection_->observers().size());
     EXPECT_EQ(secure_channel_.get(), fake_connection_->observers()[0]);
 
-    test_observer_ = base::MakeUnique<TestObserver>(secure_channel_.get());
+    test_observer_ = std::make_unique<TestObserver>(secure_channel_.get());
     secure_channel_->AddObserver(test_observer_.get());
   }
 
diff --git a/components/cryptauth/sync_scheduler_impl.cc b/components/cryptauth/sync_scheduler_impl.cc
index 9bde910..b8200c06 100644
--- a/components/cryptauth/sync_scheduler_impl.cc
+++ b/components/cryptauth/sync_scheduler_impl.cc
@@ -7,9 +7,9 @@
 #include <algorithm>
 #include <cmath>
 #include <limits>
+#include <memory>
 
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/rand_util.h"
 #include "base/strings/stringprintf.h"
@@ -113,13 +113,13 @@
   }
 
   delegate_->OnSyncRequested(
-      base::MakeUnique<SyncRequest>(weak_ptr_factory_.GetWeakPtr()));
+      std::make_unique<SyncRequest>(weak_ptr_factory_.GetWeakPtr()));
 }
 
 std::unique_ptr<base::Timer> SyncSchedulerImpl::CreateTimer() {
   bool retain_user_task = false;
   bool is_repeating = false;
-  return base::MakeUnique<base::Timer>(retain_user_task, is_repeating);
+  return std::make_unique<base::Timer>(retain_user_task, is_repeating);
 }
 
 void SyncSchedulerImpl::ScheduleNextSync(const base::TimeDelta& sync_delta) {
diff --git a/components/data_reduction_proxy/core/browser/warmup_url_fetcher_unittest.cc b/components/data_reduction_proxy/core/browser/warmup_url_fetcher_unittest.cc
index b29aa18..817ec07 100644
--- a/components/data_reduction_proxy/core/browser/warmup_url_fetcher_unittest.cc
+++ b/components/data_reduction_proxy/core/browser/warmup_url_fetcher_unittest.cc
@@ -369,7 +369,7 @@
   success_reads[2] = net::MockRead(net::SYNCHRONOUS, net::OK);
 
   socket_data_providers.push_back(
-      (base::MakeUnique<net::StaticSocketDataProvider>(
+      (std::make_unique<net::StaticSocketDataProvider>(
           success_reads, arraysize(success_reads), nullptr, 0)));
   mock_socket_factory.AddSocketDataProvider(socket_data_providers.back().get());
 
diff --git a/components/data_use_measurement/core/data_use_ascriber.cc b/components/data_use_measurement/core/data_use_ascriber.cc
index f508dd86..2f1b664 100644
--- a/components/data_use_measurement/core/data_use_ascriber.cc
+++ b/components/data_use_measurement/core/data_use_ascriber.cc
@@ -4,9 +4,9 @@
 
 #include "components/data_use_measurement/core/data_use_ascriber.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "components/data_use_measurement/core/data_use_network_delegate.h"
 #include "components/data_use_measurement/core/data_use_recorder.h"
 #include "components/data_use_measurement/core/url_request_classifier.h"
@@ -20,7 +20,7 @@
 std::unique_ptr<net::NetworkDelegate> DataUseAscriber::CreateNetworkDelegate(
     std::unique_ptr<net::NetworkDelegate> wrapped_network_delegate,
     const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder) {
-  return base::MakeUnique<data_use_measurement::DataUseNetworkDelegate>(
+  return std::make_unique<data_use_measurement::DataUseNetworkDelegate>(
       std::move(wrapped_network_delegate), this, CreateURLRequestClassifier(),
       metrics_data_use_forwarder);
 }
diff --git a/components/data_use_measurement/core/data_use_measurement_unittest.cc b/components/data_use_measurement/core/data_use_measurement_unittest.cc
index c2aed26..ab298314 100644
--- a/components/data_use_measurement/core/data_use_measurement_unittest.cc
+++ b/components/data_use_measurement/core/data_use_measurement_unittest.cc
@@ -8,7 +8,6 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/test/histogram_tester.h"
@@ -44,7 +43,7 @@
 
   static void MarkAsUserRequest(net::URLRequest* request) {
     request->SetUserData(kUserDataKey,
-                         base::MakeUnique<TestURLRequestClassifier>());
+                         std::make_unique<TestURLRequestClassifier>());
   }
 
   DataUseUserData::DataUseContentType GetContentType(
@@ -143,7 +142,7 @@
     } else {
       request->SetUserData(
           data_use_measurement::DataUseUserData::kUserDataKey,
-          base::MakeUnique<data_use_measurement::DataUseUserData>(
+          std::make_unique<data_use_measurement::DataUseUserData>(
               data_use_measurement::DataUseUserData::SUGGESTIONS,
               data_use_measurement_.CurrentAppState()));
     }
diff --git a/components/data_use_measurement/core/data_use_network_delegate_unittest.cc b/components/data_use_measurement/core/data_use_network_delegate_unittest.cc
index fda5be0..14a8823 100644
--- a/components/data_use_measurement/core/data_use_network_delegate_unittest.cc
+++ b/components/data_use_measurement/core/data_use_network_delegate_unittest.cc
@@ -4,7 +4,8 @@
 
 #include "components/data_use_measurement/core/data_use_network_delegate.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/test/histogram_tester.h"
@@ -33,7 +34,7 @@
 
   static void MarkAsUserRequest(net::URLRequest* request) {
     request->SetUserData(kUserDataKey,
-                         base::MakeUnique<TestURLRequestClassifier>());
+                         std::make_unique<TestURLRequestClassifier>());
   }
 
   DataUseUserData::DataUseContentType GetContentType(
@@ -112,7 +113,7 @@
   } else {
     request->SetUserData(
         data_use_measurement::DataUseUserData::kUserDataKey,
-        base::MakeUnique<data_use_measurement::DataUseUserData>(
+        std::make_unique<data_use_measurement::DataUseUserData>(
             data_use_measurement::DataUseUserData::SUGGESTIONS,
             data_use_measurement::DataUseUserData::FOREGROUND));
   }
@@ -125,9 +126,9 @@
  public:
   DataUseNetworkDelegateTest()
       : context_(true),
-        data_use_network_delegate_(base::MakeUnique<net::TestNetworkDelegate>(),
+        data_use_network_delegate_(std::make_unique<net::TestNetworkDelegate>(),
                                    &test_data_use_ascriber_,
-                                   base::MakeUnique<TestURLRequestClassifier>(),
+                                   std::make_unique<TestURLRequestClassifier>(),
                                    metrics::UpdateUsagePrefCallbackType()) {
     context_.set_client_socket_factory(&mock_socket_factory_);
     context_.set_network_delegate(&data_use_network_delegate_);
diff --git a/components/data_use_measurement/core/data_use_user_data.cc b/components/data_use_measurement/core/data_use_user_data.cc
index d164110..ca3bb4f 100644
--- a/components/data_use_measurement/core/data_use_user_data.cc
+++ b/components/data_use_measurement/core/data_use_user_data.cc
@@ -4,11 +4,12 @@
 
 #include "components/data_use_measurement/core/data_use_user_data.h"
 
+#include <memory>
+
 #if defined(OS_ANDROID)
 #include "base/android/application_status_listener.h"
 #endif
 
-#include "base/memory/ptr_util.h"
 #include "net/url_request/url_fetcher.h"
 
 namespace data_use_measurement {
@@ -43,7 +44,7 @@
 // static
 std::unique_ptr<base::SupportsUserData::Data> DataUseUserData::Create(
     ServiceName service_name) {
-  return base::MakeUnique<DataUseUserData>(service_name, GetCurrentAppState());
+  return std::make_unique<DataUseUserData>(service_name, GetCurrentAppState());
 }
 
 // static
diff --git a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
index e97180e..73b8ec7e 100644
--- a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
+++ b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
@@ -7,6 +7,7 @@
 #include <inttypes.h>
 
 #include <algorithm>
+#include <memory>
 #include <utility>
 
 #include "base/atomic_sequence_num.h"
@@ -14,7 +15,6 @@
 #include "base/macros.h"
 #include "base/memory/discardable_memory.h"
 #include "base/memory/discardable_shared_memory.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/process/memory.h"
 #include "base/process/process_metrics.h"
@@ -191,7 +191,7 @@
     // at least one span from the free lists.
     MemoryUsageChanged(heap_->GetSize(), heap_->GetSizeOfFreeLists());
 
-    return base::MakeUnique<DiscardableMemoryImpl>(this, std::move(free_span));
+    return std::make_unique<DiscardableMemoryImpl>(this, std::move(free_span));
   }
 
   // Release purged memory to free up the address space before we attempt to
@@ -237,7 +237,7 @@
 
   MemoryUsageChanged(heap_->GetSize(), heap_->GetSizeOfFreeLists());
 
-  return base::MakeUnique<DiscardableMemoryImpl>(this, std::move(new_span));
+  return std::make_unique<DiscardableMemoryImpl>(this, std::move(new_span));
 }
 
 bool ClientDiscardableSharedMemoryManager::OnMemoryDump(
@@ -368,7 +368,7 @@
                             base::Passed(&event_signal_runner)));
   // Waiting until IPC has finished on the IO thread.
   event.Wait();
-  auto memory = base::MakeUnique<base::DiscardableSharedMemory>(handle);
+  auto memory = std::make_unique<base::DiscardableSharedMemory>(handle);
   if (!memory->Map(size))
     base::TerminateBecauseOutOfMemory(size);
   return memory;
diff --git a/components/discardable_memory/common/discardable_shared_memory_heap.cc b/components/discardable_memory/common/discardable_shared_memory_heap.cc
index b8f2b0d..b650e58 100644
--- a/components/discardable_memory/common/discardable_shared_memory_heap.cc
+++ b/components/discardable_memory/common/discardable_shared_memory_heap.cc
@@ -5,6 +5,7 @@
 #include "components/discardable_memory/common/discardable_shared_memory_heap.h"
 
 #include <algorithm>
+#include <memory>
 #include <utility>
 
 #include "base/format_macros.h"
@@ -131,7 +132,7 @@
   num_blocks_ += span->length_;
 
   // Start tracking if segment is resident by adding it to |memory_segments_|.
-  memory_segments_.push_back(base::MakeUnique<ScopedMemorySegment>(
+  memory_segments_.push_back(std::make_unique<ScopedMemorySegment>(
       this, std::move(shared_memory), size, id, deleted_callback));
 
   return span;
diff --git a/components/discardable_memory/common/discardable_shared_memory_heap_perftest.cc b/components/discardable_memory/common/discardable_shared_memory_heap_perftest.cc
index 4306a3a5..acbf1f45 100644
--- a/components/discardable_memory/common/discardable_shared_memory_heap_perftest.cc
+++ b/components/discardable_memory/common/discardable_shared_memory_heap_perftest.cc
@@ -8,12 +8,12 @@
 #include <algorithm>
 #include <cmath>
 #include <cstdlib>
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/memory/discardable_shared_memory.h"
-#include "base/memory/ptr_util.h"
 #include "base/process/process_metrics.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_test.h"
@@ -73,7 +73,7 @@
       std::unique_ptr<DiscardableSharedMemoryHeap::Span> span =
           heap.SearchFreeLists(random_blocks[i], slack);
       if (span) {
-        spans.push_back(base::MakeUnique<base::ScopedClosureRunner>(
+        spans.push_back(std::make_unique<base::ScopedClosureRunner>(
             base::Bind(&DiscardableSharedMemoryHeap::MergeIntoFreeLists,
                        base::Unretained(&heap), base::Passed(&span))));
       } else if (!spans.empty()) {
diff --git a/components/dom_distiller/content/browser/distillability_driver.cc b/components/dom_distiller/content/browser/distillability_driver.cc
index 0ec73fb..37f9d5c 100644
--- a/components/dom_distiller/content/browser/distillability_driver.cc
+++ b/components/dom_distiller/content/browser/distillability_driver.cc
@@ -4,7 +4,8 @@
 
 #include "components/dom_distiller/content/browser/distillability_driver.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
@@ -57,7 +58,7 @@
 void DistillabilityDriver::CreateDistillabilityService(
     mojom::DistillabilityServiceRequest request) {
   mojo::MakeStrongBinding(
-      base::MakeUnique<DistillabilityServiceImpl>(weak_factory_.GetWeakPtr()),
+      std::make_unique<DistillabilityServiceImpl>(weak_factory_.GetWeakPtr()),
       std::move(request));
 }
 
diff --git a/components/dom_distiller/content/browser/distiller_javascript_service_impl.cc b/components/dom_distiller/content/browser/distiller_javascript_service_impl.cc
index 847a63b..304bf71 100644
--- a/components/dom_distiller/content/browser/distiller_javascript_service_impl.cc
+++ b/components/dom_distiller/content/browser/distiller_javascript_service_impl.cc
@@ -4,9 +4,9 @@
 
 #include "components/dom_distiller/content/browser/distiller_javascript_service_impl.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/metrics/user_metrics.h"
 #include "components/dom_distiller/content/browser/distiller_ui_handle.h"
 #include "components/dom_distiller/core/feedback_reporter.h"
@@ -35,7 +35,7 @@
     DistillerUIHandle* distiller_ui_handle,
     mojom::DistillerJavaScriptServiceRequest request,
     content::RenderFrameHost* render_frame_host) {
-  mojo::MakeStrongBinding(base::MakeUnique<DistillerJavaScriptServiceImpl>(
+  mojo::MakeStrongBinding(std::make_unique<DistillerJavaScriptServiceImpl>(
                               render_frame_host, distiller_ui_handle),
                           std::move(request));
 }
diff --git a/components/dom_distiller/content/browser/distiller_page_web_contents.cc b/components/dom_distiller/content/browser/distiller_page_web_contents.cc
index 3c92a8c6..9c821be 100644
--- a/components/dom_distiller/content/browser/distiller_page_web_contents.cc
+++ b/components/dom_distiller/content/browser/distiller_page_web_contents.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/callback.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/dom_distiller/content/browser/distiller_javascript_utils.h"
@@ -168,7 +167,7 @@
     content::WebContentsObserver::Observe(nullptr);
     DCHECK(state_ == LOADING_PAGE || state_ == EXECUTING_JAVASCRIPT);
     state_ = PAGELOAD_FAILED;
-    auto empty = base::MakeUnique<base::Value>();
+    auto empty = std::make_unique<base::Value>();
     OnWebContentsDistillationDone(GURL(), base::TimeTicks(), empty.get());
   }
 }
diff --git a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc
index 1e42153..a855560d 100644
--- a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc
+++ b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc
@@ -4,10 +4,10 @@
 
 #include "components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "components/dom_distiller/content/common/distiller_page_notifier_service.mojom.h"
 #include "components/dom_distiller/content/renderer/distiller_page_notifier_service_impl.h"
 #include "content/public/renderer/render_frame.h"
@@ -61,7 +61,7 @@
   if (!load_active_)
     return;
   mojo::MakeStrongBinding(
-      base::MakeUnique<DistillerPageNotifierServiceImpl>(this),
+      std::make_unique<DistillerPageNotifierServiceImpl>(this),
       std::move(request));
 }
 
diff --git a/components/dom_distiller/core/distillable_page_detector_unittest.cc b/components/dom_distiller/core/distillable_page_detector_unittest.cc
index d56be15..b5afbd19 100644
--- a/components/dom_distiller/core/distillable_page_detector_unittest.cc
+++ b/components/dom_distiller/core/distillable_page_detector_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "components/dom_distiller/core/distillable_page_detector.h"
 
+#include <memory>
+
 #include "base/memory/ptr_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -30,7 +32,7 @@
     }
     proto_.set_num_features(num_features);
     proto_.set_num_stumps(proto_.stump_size());
-    return base::MakeUnique<DistillablePageDetector>(
+    return std::make_unique<DistillablePageDetector>(
         base::WrapUnique(new AdaBoostProto(proto_)));
   }
 
diff --git a/components/dom_distiller/core/distiller.cc b/components/dom_distiller/core/distiller.cc
index 71407532..f3ebbd8f6 100644
--- a/components/dom_distiller/core/distiller.cc
+++ b/components/dom_distiller/core/distiller.cc
@@ -5,6 +5,7 @@
 #include "components/dom_distiller/core/distiller.h"
 
 #include <map>
+#include <memory>
 #include <utility>
 #include <vector>
 
@@ -125,7 +126,7 @@
     DCHECK(started_pages_index_.find(page_num) == started_pages_index_.end());
     DCHECK(finished_pages_index_.find(page_num) == finished_pages_index_.end());
     seen_urls_.insert(url.spec());
-    pages_.push_back(base::MakeUnique<DistilledPageData>());
+    pages_.push_back(std::make_unique<DistilledPageData>());
     started_pages_index_[page_num] = pages_.size() - 1;
     distiller_page_->DistillPage(
         url,
diff --git a/components/dom_distiller/core/distiller_unittest.cc b/components/dom_distiller/core/distiller_unittest.cc
index 83fc326..d64a8623 100644
--- a/components/dom_distiller/core/distiller_unittest.cc
+++ b/components/dom_distiller/core/distiller_unittest.cc
@@ -17,7 +17,6 @@
 #include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
@@ -535,7 +534,7 @@
 TEST_F(DistillerTest, SinglePageDistillationFailure) {
   base::MessageLoopForUI loop;
   // To simulate failure return a null value.
-  auto null_value = base::MakeUnique<base::Value>();
+  auto null_value = std::make_unique<base::Value>();
   distiller_.reset(
       new DistillerImpl(url_fetcher_factory_, DomDistillerOptions()));
   DistillPage(kURL, CreateMockDistillerPage(null_value.get(), GURL(kURL)));
@@ -557,7 +556,7 @@
       distiller_data->distilled_values.begin() + failed_page_num);
   distiller_data->distilled_values.insert(
       distiller_data->distilled_values.begin() + failed_page_num,
-      base::MakeUnique<base::Value>());
+      std::make_unique<base::Value>());
   // Expect only calls till the failed page number.
   distiller_.reset(
       new DistillerImpl(url_fetcher_factory_, DomDistillerOptions()));
diff --git a/components/dom_distiller/core/dom_distiller_service.cc b/components/dom_distiller/core/dom_distiller_service.cc
index 6684f57d..06443b5 100644
--- a/components/dom_distiller/core/dom_distiller_service.cc
+++ b/components/dom_distiller/core/dom_distiller_service.cc
@@ -4,11 +4,11 @@
 
 #include "components/dom_distiller/core/dom_distiller_service.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/guid.h"
 #include "base/location.h"
-#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/dom_distiller/core/distilled_content_store.h"
@@ -249,7 +249,7 @@
 TaskTracker* DomDistillerService::CreateTaskTracker(const ArticleEntry& entry) {
   TaskTracker::CancelCallback cancel_callback =
       base::Bind(&DomDistillerService::CancelTask, base::Unretained(this));
-  tasks_.push_back(base::MakeUnique<TaskTracker>(entry, cancel_callback,
+  tasks_.push_back(std::make_unique<TaskTracker>(entry, cancel_callback,
                                                  content_store_.get()));
   return tasks_.back().get();
 }
diff --git a/components/dom_distiller/core/dom_distiller_store_unittest.cc b/components/dom_distiller/core/dom_distiller_store_unittest.cc
index 7940f6e..4c6be77 100644
--- a/components/dom_distiller/core/dom_distiller_store_unittest.cc
+++ b/components/dom_distiller/core/dom_distiller_store_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <stdint.h>
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
@@ -352,7 +353,7 @@
   article_proto.set_title("A title");
   attachments.set_distilled_article(article_proto);
   store_->UpdateAttachments(
-      entry.entry_id(), base::MakeUnique<ArticleAttachmentsData>(attachments),
+      entry.entry_id(), std::make_unique<ArticleAttachmentsData>(attachments),
       callbacks.UpdateCallback());
   EXPECT_CALL(callbacks, Update(true));
   base::RunLoop().RunUntilIdle();
diff --git a/components/dom_distiller/ios/distiller_page_factory_ios.mm b/components/dom_distiller/ios/distiller_page_factory_ios.mm
index 65fb78f..9dafaa8 100644
--- a/components/dom_distiller/ios/distiller_page_factory_ios.mm
+++ b/components/dom_distiller/ios/distiller_page_factory_ios.mm
@@ -4,7 +4,8 @@
 
 #include "components/dom_distiller/ios/distiller_page_factory_ios.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "components/dom_distiller/ios/distiller_page_ios.h"
 #include "ios/web/public/browser_state.h"
 
@@ -22,13 +23,13 @@
 
 std::unique_ptr<DistillerPage> DistillerPageFactoryIOS::CreateDistillerPage(
     const gfx::Size& view_size) const {
-  return base::MakeUnique<DistillerPageIOS>(browser_state_);
+  return std::make_unique<DistillerPageIOS>(browser_state_);
 }
 
 std::unique_ptr<DistillerPage>
 DistillerPageFactoryIOS::CreateDistillerPageWithHandle(
     std::unique_ptr<SourcePageHandle> handle) const {
-  return base::MakeUnique<DistillerPageIOS>(browser_state_);
+  return std::make_unique<DistillerPageIOS>(browser_state_);
 }
 
 }  // namespace dom_distiller
diff --git a/components/dom_distiller/webui/dom_distiller_ui.cc b/components/dom_distiller/webui/dom_distiller_ui.cc
index 36b1523..09701535 100644
--- a/components/dom_distiller/webui/dom_distiller_ui.cc
+++ b/components/dom_distiller/webui/dom_distiller_ui.cc
@@ -4,7 +4,8 @@
 
 #include "components/dom_distiller/webui/dom_distiller_ui.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "components/dom_distiller/core/dom_distiller_constants.h"
 #include "components/dom_distiller/core/dom_distiller_service.h"
 #include "components/dom_distiller/webui/dom_distiller_handler.h"
@@ -53,7 +54,7 @@
 
   // Add message handler.
   web_ui->AddMessageHandler(
-      base::MakeUnique<DomDistillerHandler>(service, scheme));
+      std::make_unique<DomDistillerHandler>(service, scheme));
 }
 
 DomDistillerUi::~DomDistillerUi() {}
diff --git a/components/domain_reliability/beacon.cc b/components/domain_reliability/beacon.cc
index 590a666..bcee5499 100644
--- a/components/domain_reliability/beacon.cc
+++ b/components/domain_reliability/beacon.cc
@@ -4,9 +4,9 @@
 
 #include "components/domain_reliability/beacon.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "components/domain_reliability/util.h"
 #include "net/base/net_errors.h"
@@ -26,7 +26,7 @@
     base::TimeTicks last_network_change_time,
     const GURL& collector_url,
     const std::vector<std::unique_ptr<std::string>>& path_prefixes) const {
-  auto beacon_value = base::MakeUnique<DictionaryValue>();
+  auto beacon_value = std::make_unique<DictionaryValue>();
   DCHECK(url.is_valid());
   GURL sanitized_url = SanitizeURLForReport(url, collector_url, path_prefixes);
   beacon_value->SetString("url", sanitized_url.spec());
@@ -34,7 +34,7 @@
   if (!quic_error.empty())
     beacon_value->SetString("quic_error", quic_error);
   if (chrome_error != net::OK) {
-    auto failure_value = base::MakeUnique<DictionaryValue>();
+    auto failure_value = std::make_unique<DictionaryValue>();
     failure_value->SetString("custom_error",
                              net::ErrorToString(chrome_error));
     beacon_value->Set("failure_data", std::move(failure_value));
diff --git a/components/domain_reliability/config_unittest.cc b/components/domain_reliability/config_unittest.cc
index be701b0..f434bb9 100644
--- a/components/domain_reliability/config_unittest.cc
+++ b/components/domain_reliability/config_unittest.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <string>
 
-#include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -19,7 +18,7 @@
   config->origin = GURL("https://example/");
   config->include_subdomains = false;
   config->collectors.push_back(
-      base::MakeUnique<GURL>("https://example/upload"));
+      std::make_unique<GURL>("https://example/upload"));
   config->failure_sample_rate = 1.0;
   config->success_sample_rate = 0.0;
   EXPECT_TRUE(config->IsValid());
@@ -28,8 +27,8 @@
 
 std::unique_ptr<DomainReliabilityConfig> MakeSampleConfig() {
   std::unique_ptr<DomainReliabilityConfig> config(MakeBaseConfig());
-  config->path_prefixes.push_back(base::MakeUnique<std::string>("/css/"));
-  config->path_prefixes.push_back(base::MakeUnique<std::string>("/js/"));
+  config->path_prefixes.push_back(std::make_unique<std::string>("/css/"));
+  config->path_prefixes.push_back(std::make_unique<std::string>("/js/"));
   EXPECT_TRUE(config->IsValid());
   return config;
 }
@@ -51,7 +50,7 @@
   EXPECT_FALSE(config->IsValid());
 
   config = MakeSampleConfig();
-  config->collectors[0] = base::MakeUnique<GURL>();
+  config->collectors[0] = std::make_unique<GURL>();
   EXPECT_FALSE(config->IsValid());
 
   config = MakeSampleConfig();
diff --git a/components/domain_reliability/dispatcher.cc b/components/domain_reliability/dispatcher.cc
index c4efdd0..00166e62 100644
--- a/components/domain_reliability/dispatcher.cc
+++ b/components/domain_reliability/dispatcher.cc
@@ -5,11 +5,11 @@
 #include "components/domain_reliability/dispatcher.h"
 
 #include <algorithm>
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/timer/timer.h"
 #include "components/domain_reliability/util.h"
@@ -56,7 +56,7 @@
   // Would be DCHECK_LE, but you can't << a TimeDelta.
   DCHECK(min_delay <= max_delay);
 
-  std::unique_ptr<Task> owned_task = base::MakeUnique<Task>(
+  std::unique_ptr<Task> owned_task = std::make_unique<Task>(
       closure, time_->CreateTimer(), min_delay, max_delay);
   Task* task = owned_task.get();
   tasks_.insert(std::move(owned_task));
diff --git a/components/domain_reliability/google_configs.cc b/components/domain_reliability/google_configs.cc
index ec0335a..b7bea47b 100644
--- a/components/domain_reliability/google_configs.cc
+++ b/components/domain_reliability/google_configs.cc
@@ -590,11 +590,11 @@
     GURL::Replacements replacements;
     replacements.SetPathStr(kGoogleOriginSpecificCollectorPathString);
     config->collectors.push_back(
-        base::MakeUnique<GURL>(config->origin.ReplaceComponents(replacements)));
+        std::make_unique<GURL>(config->origin.ReplaceComponents(replacements)));
   }
   for (size_t i = 0; i < arraysize(kGoogleStandardCollectors); i++)
     config->collectors.push_back(
-        base::MakeUnique<GURL>(kGoogleStandardCollectors[i]));
+        std::make_unique<GURL>(kGoogleStandardCollectors[i]));
   config->success_sample_rate = 0.05;
   config->failure_sample_rate = 1.00;
   config->path_prefixes.clear();
diff --git a/components/domain_reliability/header.cc b/components/domain_reliability/header.cc
index 05a6379..0d2136d 100644
--- a/components/domain_reliability/header.cc
+++ b/components/domain_reliability/header.cc
@@ -6,7 +6,9 @@
 
 #include <stdint.h>
 
+#include <memory>
 #include <string>
+
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_tokenizer.h"
@@ -169,7 +171,7 @@
     GURL url(unquoted);
     if (!url.is_valid() || !content::IsOriginSecure(url))
       return false;
-    out->push_back(base::MakeUnique<GURL>(url));
+    out->push_back(std::make_unique<GURL>(url));
   }
 
   return true;
diff --git a/components/domain_reliability/monitor.cc b/components/domain_reliability/monitor.cc
index 87c969d..a5cf89e8 100644
--- a/components/domain_reliability/monitor.cc
+++ b/components/domain_reliability/monitor.cc
@@ -4,12 +4,12 @@
 
 #include "components/domain_reliability/monitor.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task_runner.h"
 #include "components/domain_reliability/baked_in_configs.h"
@@ -273,7 +273,7 @@
   DCHECK(config);
   DCHECK(config->IsValid());
 
-  return base::MakeUnique<DomainReliabilityContext>(
+  return std::make_unique<DomainReliabilityContext>(
       time_.get(), scheduler_params_, upload_reporter_string_,
       &last_network_change_time_, upload_allowed_callback_, &dispatcher_,
       uploader_.get(), std::move(config));
diff --git a/components/domain_reliability/scheduler.cc b/components/domain_reliability/scheduler.cc
index 5f431e4..22945f99 100644
--- a/components/domain_reliability/scheduler.cc
+++ b/components/domain_reliability/scheduler.cc
@@ -6,9 +6,9 @@
 
 #include <stdint.h>
 #include <algorithm>
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
@@ -96,7 +96,7 @@
 
   for (size_t i = 0; i < num_collectors; ++i) {
     collectors_.push_back(
-        base::MakeUnique<net::BackoffEntry>(&backoff_policy_, time_));
+        std::make_unique<net::BackoffEntry>(&backoff_policy_, time_));
   }
 }
 
diff --git a/components/domain_reliability/test_util.cc b/components/domain_reliability/test_util.cc
index a121c5c..7793784 100644
--- a/components/domain_reliability/test_util.cc
+++ b/components/domain_reliability/test_util.cc
@@ -4,9 +4,10 @@
 
 #include "components/domain_reliability/test_util.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/memory/ptr_util.h"
 #include "components/domain_reliability/scheduler.h"
 #include "net/url_request/url_request_status.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -175,7 +176,7 @@
   DomainReliabilityConfig* config = new DomainReliabilityConfig();
   config->origin = origin;
   config->collectors.push_back(
-      base::MakeUnique<GURL>("https://exampleuploader/upload"));
+      std::make_unique<GURL>("https://exampleuploader/upload"));
   config->failure_sample_rate = 1.0;
   config->success_sample_rate = 0.0;
 
diff --git a/components/error_page/common/localized_error.cc b/components/error_page/common/localized_error.cc
index ddf472a..aff41dbc 100644
--- a/components/error_page/common/localized_error.cc
+++ b/components/error_page/common/localized_error.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include <memory>
 #include <utility>
 
 #include "base/command_line.h"
@@ -535,7 +536,7 @@
                                     const char* path,
                                     int message_id,
                                     bool insert_as_first_item) {
-  auto suggestion_list_item = base::MakeUnique<base::DictionaryValue>();
+  auto suggestion_list_item = std::make_unique<base::DictionaryValue>();
   suggestion_list_item->SetString(path, l10n_util::GetStringUTF16(message_id));
 
   if (insert_as_first_item) {
@@ -657,7 +658,7 @@
     if (failed_origin.unique())
       return;
 
-    auto suggestion = base::MakeUnique<base::DictionaryValue>();
+    auto suggestion = std::make_unique<base::DictionaryValue>();
     suggestion->SetString("summary",
                           l10n_util::GetStringUTF16(
                               IDS_ERRORPAGES_SUGGESTION_NAVIGATE_TO_ORIGIN));
@@ -911,13 +912,13 @@
   std::string icon_class = GetIconClassForError(error_domain, error_code);
   error_strings->SetString("iconClass", icon_class);
 
-  auto heading = base::MakeUnique<base::DictionaryValue>();
+  auto heading = std::make_unique<base::DictionaryValue>();
   heading->SetString("msg",
                      l10n_util::GetStringUTF16(options.heading_resource_id));
   heading->SetString("hostName", host_name);
   error_strings->Set("heading", std::move(heading));
 
-  auto summary = base::MakeUnique<base::DictionaryValue>();
+  auto summary = std::make_unique<base::DictionaryValue>();
 
   // Set summary message under the heading.
   summary->SetString(
@@ -970,9 +971,9 @@
   if (!params->override_suggestions) {
     // Detailed suggestion information.
     suggestions_details = error_strings->SetList(
-        "suggestionsDetails", base::MakeUnique<base::ListValue>());
+        "suggestionsDetails", std::make_unique<base::ListValue>());
     suggestions_summary_list = error_strings->SetList(
-        "suggestionsSummaryList", base::MakeUnique<base::ListValue>());
+        "suggestionsSummaryList", std::make_unique<base::ListValue>());
   } else {
     suggestions_summary_list = error_strings->SetList(
         "suggestionsSummaryList", std::move(params->override_suggestions));
@@ -1002,7 +1003,7 @@
 #if defined(OS_ANDROID)
     reload_visible = true;
 #endif  // defined(OS_ANDROID)
-    auto reload_button = base::MakeUnique<base::DictionaryValue>();
+    auto reload_button = std::make_unique<base::DictionaryValue>();
     reload_button->SetString(
         "msg", l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_RELOAD));
     reload_button->SetString("reloadUrl", failed_url.spec());
@@ -1041,7 +1042,7 @@
       (show_saved_copy_primary || show_saved_copy_secondary));
 
   if (show_saved_copy_visible) {
-    auto show_saved_copy_button = base::MakeUnique<base::DictionaryValue>();
+    auto show_saved_copy_button = std::make_unique<base::DictionaryValue>();
     show_saved_copy_button->SetString(
         "msg", l10n_util::GetStringUTF16(
             IDS_ERRORPAGES_BUTTON_SHOW_SAVED_COPY));
@@ -1060,7 +1061,7 @@
       failed_url.SchemeIsHTTPOrHTTPS() &&
       IsSuggested(options.suggestions, SUGGEST_OFFLINE_CHECKS)) {
     std::unique_ptr<base::DictionaryValue> download_button =
-        base::MakeUnique<base::DictionaryValue>();
+        std::make_unique<base::DictionaryValue>();
     download_button->SetString(
         "msg",
         l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_DOWNLOAD));
diff --git a/components/exo/wayland/clients/test/wayland_client_test.cc b/components/exo/wayland/clients/test/wayland_client_test.cc
index cc8f53ed..0dbeee4 100644
--- a/components/exo/wayland/clients/test/wayland_client_test.cc
+++ b/components/exo/wayland/clients/test/wayland_client_test.cc
@@ -6,6 +6,8 @@
 
 #include <stdlib.h>
 
+#include <memory>
+
 #include "ash/public/cpp/config.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
@@ -34,7 +36,7 @@
 
   // Overriden from ash::AshTestEnvironment:
   std::unique_ptr<ash::AshTestViewsDelegate> CreateViewsDelegate() override {
-    return base::MakeUnique<ash::AshTestViewsDelegate>();
+    return std::make_unique<ash::AshTestViewsDelegate>();
   }
 
  private:
@@ -141,12 +143,12 @@
   gesture_config->set_long_press_time_in_ms(1000);
   gesture_config->set_max_touch_move_in_pixels_for_click(5);
 
-  wm_helper_ = base::MakeUnique<WMHelper>();
+  wm_helper_ = std::make_unique<WMHelper>();
   WMHelper::SetInstance(wm_helper_.get());
-  display_ = base::MakeUnique<Display>(nullptr, nullptr);
+  display_ = std::make_unique<Display>(nullptr, nullptr);
   wayland_server_ = exo::wayland::Server::Create(display_.get());
   DCHECK(wayland_server_);
-  wayland_watcher_ = base::MakeUnique<WaylandWatcher>(wayland_server_.get());
+  wayland_watcher_ = std::make_unique<WaylandWatcher>(wayland_server_.get());
   event->Signal();
 }
 
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index c60295e..ce9643b 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -30,6 +30,7 @@
 #include <cstdlib>
 #include <iterator>
 #include <map>
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
@@ -4350,7 +4351,7 @@
       client, &zwp_pointer_gesture_pinch_v1_interface, 1, id);
   SetImplementation(pointer_gesture_pinch_resource,
                     &pointer_gesture_pinch_implementation,
-                    base::MakeUnique<WaylandPointerGesturePinchDelegate>(
+                    std::make_unique<WaylandPointerGesturePinchDelegate>(
                         pointer_gesture_pinch_resource, pointer));
 }
 
diff --git a/components/favicon/core/favicon_driver_impl.cc b/components/favicon/core/favicon_driver_impl.cc
index e4f0588..74ba6c7e0 100644
--- a/components/favicon/core/favicon_driver_impl.cc
+++ b/components/favicon/core/favicon_driver_impl.cc
@@ -4,8 +4,9 @@
 
 #include "components/favicon/core/favicon_driver_impl.h"
 
+#include <memory>
+
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
@@ -33,12 +34,12 @@
     return;
 
   if (kEnableTouchIcon) {
-    handlers_.push_back(base::MakeUnique<FaviconHandler>(
+    handlers_.push_back(std::make_unique<FaviconHandler>(
         favicon_service_, this, FaviconDriverObserver::NON_TOUCH_LARGEST));
-    handlers_.push_back(base::MakeUnique<FaviconHandler>(
+    handlers_.push_back(std::make_unique<FaviconHandler>(
         favicon_service_, this, FaviconDriverObserver::TOUCH_LARGEST));
   } else {
-    handlers_.push_back(base::MakeUnique<FaviconHandler>(
+    handlers_.push_back(std::make_unique<FaviconHandler>(
         favicon_service_, this, FaviconDriverObserver::NON_TOUCH_16_DIP));
   }
 }
diff --git a/components/favicon/core/favicon_handler_unittest.cc b/components/favicon/core/favicon_handler_unittest.cc
index a1c2306..51a6797c 100644
--- a/components/favicon/core/favicon_handler_unittest.cc
+++ b/components/favicon/core/favicon_handler_unittest.cc
@@ -12,7 +12,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/histogram_tester.h"
@@ -515,7 +514,7 @@
       FaviconDriverObserver::NotificationIconType handler_type,
       const std::vector<FaviconURL>& candidates,
       const GURL& manifest_url = GURL()) {
-    auto handler = base::MakeUnique<FaviconHandler>(&favicon_service_,
+    auto handler = std::make_unique<FaviconHandler>(&favicon_service_,
                                                     &delegate_, handler_type);
     handler->FetchFavicon(kPageURL, /*is_same_document=*/false);
     // The first RunUntilIdle() causes the FaviconService lookups be faster than
@@ -737,7 +736,7 @@
                   base::flat_set<GURL>{kPageURL, kDifferentPageURL},
                   kIconURL16x16, _, _, _, _));
 
-  std::unique_ptr<FaviconHandler> handler = base::MakeUnique<FaviconHandler>(
+  std::unique_ptr<FaviconHandler> handler = std::make_unique<FaviconHandler>(
       &favicon_service_, &delegate_, FaviconDriverObserver::NON_TOUCH_16_DIP);
   handler->FetchFavicon(kPageURL, /*is_same_document=*/false);
   base::RunLoop().RunUntilIdle();
@@ -765,7 +764,7 @@
                   kPageURL, favicon_base::IconTypeSet({kFavicon}),
                   base::flat_set<GURL>({kPageURL})));
 
-  std::unique_ptr<FaviconHandler> handler = base::MakeUnique<FaviconHandler>(
+  std::unique_ptr<FaviconHandler> handler = std::make_unique<FaviconHandler>(
       &favicon_service_, &delegate_, FaviconDriverObserver::NON_TOUCH_16_DIP);
   handler->FetchFavicon(kPageURL, /*is_same_document=*/false);
   base::RunLoop().RunUntilIdle();
@@ -782,7 +781,7 @@
   favicon_service_.fake()->Store(kPageURLInHistory, kIconURL16x16,
                                  CreateRawBitmapResult(kIconURL16x16));
 
-  std::unique_ptr<FaviconHandler> handler = base::MakeUnique<FaviconHandler>(
+  std::unique_ptr<FaviconHandler> handler = std::make_unique<FaviconHandler>(
       &favicon_service_, &delegate_, FaviconDriverObserver::NON_TOUCH_16_DIP);
   handler->FetchFavicon(kPageURL, /*is_same_document=*/false);
   base::RunLoop().RunUntilIdle();
@@ -805,7 +804,7 @@
 
   EXPECT_CALL(favicon_service_, CloneFaviconMappingsForPages(_, _, _)).Times(0);
 
-  std::unique_ptr<FaviconHandler> handler = base::MakeUnique<FaviconHandler>(
+  std::unique_ptr<FaviconHandler> handler = std::make_unique<FaviconHandler>(
       &favicon_service_, &delegate_, FaviconDriverObserver::NON_TOUCH_16_DIP);
   handler->FetchFavicon(kPageURL, /*is_same_document=*/false);
   base::RunLoop().RunUntilIdle();
@@ -1655,7 +1654,7 @@
                                FaviconDriverObserver::NON_TOUCH_16_DIP,
                                kIconURL12x12, _, _));
 
-  std::unique_ptr<FaviconHandler> handler = base::MakeUnique<FaviconHandler>(
+  std::unique_ptr<FaviconHandler> handler = std::make_unique<FaviconHandler>(
       &favicon_service_, &delegate_, FaviconDriverObserver::NON_TOUCH_16_DIP);
   handler->FetchFavicon(kPageURL, /*is_same_document=*/false);
   base::RunLoop().RunUntilIdle();
@@ -1683,7 +1682,7 @@
                                FaviconDriverObserver::NON_TOUCH_16_DIP,
                                kIconURL12x12, _, _));
 
-  std::unique_ptr<FaviconHandler> handler = base::MakeUnique<FaviconHandler>(
+  std::unique_ptr<FaviconHandler> handler = std::make_unique<FaviconHandler>(
       &favicon_service_, &delegate_, FaviconDriverObserver::NON_TOUCH_16_DIP);
   handler->FetchFavicon(kPageURL, /*is_same_document=*/false);
   base::RunLoop().RunUntilIdle();
diff --git a/components/favicon/core/large_icon_service.cc b/components/favicon/core/large_icon_service.cc
index 8d8c73a..22e4a74 100644
--- a/components/favicon/core/large_icon_service.cc
+++ b/components/favicon/core/large_icon_service.cc
@@ -14,7 +14,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/singleton.h"
 #include "base/metrics/field_trial_params.h"
@@ -334,7 +333,7 @@
            base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
       tracker_(tracker),
       fallback_icon_style_(
-          base::MakeUnique<favicon_base::FallbackIconStyle>()) {}
+          std::make_unique<favicon_base::FallbackIconStyle>()) {}
 
 LargeIconWorker::~LargeIconWorker() {
 }
diff --git a/components/favicon/core/large_icon_service_unittest.cc b/components/favicon/core/large_icon_service_unittest.cc
index ced6caa..7b68670 100644
--- a/components/favicon/core/large_icon_service_unittest.cc
+++ b/components/favicon/core/large_icon_service_unittest.cc
@@ -429,7 +429,7 @@
   void RawBitmapResultCallback(const favicon_base::LargeIconResult& result) {
     if (result.bitmap.is_valid()) {
       returned_bitmap_size_ =
-          base::MakeUnique<gfx::Size>(result.bitmap.pixel_size);
+          std::make_unique<gfx::Size>(result.bitmap.pixel_size);
     }
     StoreFallbackStyle(result.fallback_icon_style.get());
   }
@@ -437,7 +437,7 @@
   void ImageResultCallback(const favicon_base::LargeIconImageResult& result) {
     if (!result.image.IsEmpty()) {
       returned_bitmap_size_ =
-          base::MakeUnique<gfx::Size>(result.image.ToImageSkia()->size());
+          std::make_unique<gfx::Size>(result.image.ToImageSkia()->size());
       ASSERT_TRUE(result.icon_url.is_valid());
     }
     StoreFallbackStyle(result.fallback_icon_style.get());
@@ -447,7 +447,7 @@
       const favicon_base::FallbackIconStyle* fallback_style) {
     if (fallback_style) {
       returned_fallback_style_ =
-          base::MakeUnique<favicon_base::FallbackIconStyle>(*fallback_style);
+          std::make_unique<favicon_base::FallbackIconStyle>(*fallback_style);
     }
   }
 
diff --git a/components/favicon_base/select_favicon_frames.cc b/components/favicon_base/select_favicon_frames.cc
index a182311..7317ab0 100644
--- a/components/favicon_base/select_favicon_frames.cc
+++ b/components/favicon_base/select_favicon_frames.cc
@@ -8,11 +8,11 @@
 #include <cmath>
 #include <limits>
 #include <map>
+#include <memory>
 #include <set>
 #include <utility>
 
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "components/favicon_base/favicon_util.h"
 #include "skia/ext/image_operations.h"
 #include "third_party/skia/include/core/SkCanvas.h"
@@ -245,7 +245,7 @@
     return gfx::ImageSkia(gfx::ImageSkiaRep(bitmaps[index], 1.0f));
   }
 
-  auto image_source = base::MakeUnique<FaviconImageSource>();
+  auto image_source = std::make_unique<FaviconImageSource>();
 
   for (size_t i = 0; i < results.size(); ++i) {
     size_t index = results[i].index;
diff --git a/components/feedback/anonymizer_tool.cc b/components/feedback/anonymizer_tool.cc
index f132d348..73f2f97 100644
--- a/components/feedback/anonymizer_tool.cc
+++ b/components/feedback/anonymizer_tool.cc
@@ -4,9 +4,9 @@
 
 #include "components/feedback/anonymizer_tool.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -260,7 +260,7 @@
     RE2::Options options;
     // set_multiline of pcre is not supported by RE2, yet.
     options.set_dot_nl(true);  // Dot matches a new line.
-    std::unique_ptr<RE2> re = base::MakeUnique<RE2>(pattern, options);
+    std::unique_ptr<RE2> re = std::make_unique<RE2>(pattern, options);
     DCHECK_EQ(re2::RE2::NoError, re->error_code())
         << "Failed to parse:\n" << pattern << "\n" << re->error();
     regexp_cache_[pattern] = std::move(re);
diff --git a/components/feedback/feedback_data_unittest.cc b/components/feedback/feedback_data_unittest.cc
index 6b15c186..06fb1ff 100644
--- a/components/feedback/feedback_data_unittest.cc
+++ b/components/feedback/feedback_data_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "components/feedback/feedback_report.h"
@@ -44,7 +43,7 @@
 };
 
 std::unique_ptr<std::string> MakeScoped(const char* str) {
-  return base::MakeUnique<std::string>(str);
+  return std::make_unique<std::string>(str);
 }
 
 }  // namespace
diff --git a/components/feedback/feedback_uploader_unittest.cc b/components/feedback/feedback_uploader_unittest.cc
index 90c6a0a..7abe3ae 100644
--- a/components/feedback/feedback_uploader_unittest.cc
+++ b/components/feedback/feedback_uploader_unittest.cc
@@ -8,7 +8,6 @@
 #include <set>
 
 #include "base/bind.h"
-#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
@@ -43,7 +42,7 @@
   void RunMessageLoop() {
     if (ProcessingComplete())
       return;
-    run_loop_ = base::MakeUnique<base::RunLoop>();
+    run_loop_ = std::make_unique<base::RunLoop>();
     run_loop_->Run();
   }
 
@@ -94,7 +93,7 @@
  public:
   FeedbackUploaderTest() {
     FeedbackUploader::SetMinimumRetryDelayForTesting(kRetryDelayForTest);
-    uploader_ = base::MakeUnique<MockFeedbackUploader>(&context_);
+    uploader_ = std::make_unique<MockFeedbackUploader>(&context_);
   }
 
   ~FeedbackUploaderTest() override = default;
diff --git a/components/feedback/system_logs/system_logs_fetcher.cc b/components/feedback/system_logs/system_logs_fetcher.cc
index 936ba195..dbeb475 100644
--- a/components/feedback/system_logs/system_logs_fetcher.cc
+++ b/components/feedback/system_logs/system_logs_fetcher.cc
@@ -4,11 +4,11 @@
 
 #include "components/feedback/system_logs/system_logs_fetcher.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
-#include "base/memory/ptr_util.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/task_scheduler/task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -48,7 +48,7 @@
 }  // namespace
 
 SystemLogsFetcher::SystemLogsFetcher(bool scrub_data)
-    : response_(base::MakeUnique<SystemLogsResponse>()),
+    : response_(std::make_unique<SystemLogsResponse>()),
       num_pending_requests_(0),
       task_runner_for_anonymizer_(base::CreateSequencedTaskRunnerWithTraits(
           {// User visible because this is called when the user is looking at
@@ -57,7 +57,7 @@
            base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})),
       weak_ptr_factory_(this) {
   if (scrub_data)
-    anonymizer_ = base::MakeUnique<feedback::AnonymizerTool>();
+    anonymizer_ = std::make_unique<feedback::AnonymizerTool>();
 }
 
 SystemLogsFetcher::~SystemLogsFetcher() {
diff --git a/components/feedback/system_logs/system_logs_fetcher.h b/components/feedback/system_logs/system_logs_fetcher.h
index d8103b6..0d821a5 100644
--- a/components/feedback/system_logs/system_logs_fetcher.h
+++ b/components/feedback/system_logs/system_logs_fetcher.h
@@ -36,8 +36,8 @@
 //   }
 //   void GetLogs() {
 //     SystemLogsFetcher* fetcher = new SystemLogsFetcher(/*scrub_data=*/ true);
-//     fetcher->AddSource(base::MakeUnique<LogSourceOne>());
-//     fetcher->AddSource(base::MakeUnique<LogSourceTwo>());
+//     fetcher->AddSource(std::make_unique<LogSourceOne>());
+//     fetcher->AddSource(std::make_unique<LogSourceTwo>());
 //     fetcher->Fetch(base::Bind(&Example::ProcessLogs, this));
 //   }
 // };
diff --git a/components/filesystem/directory_impl.cc b/components/filesystem/directory_impl.cc
index 1209f6ec..0e28903 100644
--- a/components/filesystem/directory_impl.cc
+++ b/components/filesystem/directory_impl.cc
@@ -4,6 +4,7 @@
 
 #include "components/filesystem/directory_impl.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/files/file.h"
@@ -11,7 +12,6 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "components/filesystem/file_impl.h"
 #include "components/filesystem/lock_table.h"
@@ -82,7 +82,7 @@
 
   if (file.is_pending()) {
     mojo::MakeStrongBinding(
-        base::MakeUnique<FileImpl>(path, std::move(base_file), temp_dir_,
+        std::make_unique<FileImpl>(path, std::move(base_file), temp_dir_,
                                    lock_table_),
         std::move(file));
   }
@@ -146,7 +146,7 @@
 
   if (directory.is_pending()) {
     mojo::MakeStrongBinding(
-        base::MakeUnique<DirectoryImpl>(path, temp_dir_, lock_table_),
+        std::make_unique<DirectoryImpl>(path, temp_dir_, lock_table_),
         std::move(directory));
   }
 
@@ -295,7 +295,7 @@
 
 void DirectoryImpl::Clone(mojom::DirectoryRequest directory) {
   if (directory.is_pending()) {
-    mojo::MakeStrongBinding(base::MakeUnique<DirectoryImpl>(
+    mojo::MakeStrongBinding(std::make_unique<DirectoryImpl>(
                                 directory_path_, temp_dir_, lock_table_),
                             std::move(directory));
   }
diff --git a/components/filesystem/file_impl.cc b/components/filesystem/file_impl.cc
index e853a91..3fff0f3a 100644
--- a/components/filesystem/file_impl.cc
+++ b/components/filesystem/file_impl.cc
@@ -7,12 +7,12 @@
 #include <stddef.h>
 #include <stdint.h>
 #include <limits>
+#include <memory>
 #include <utility>
 
 #include "base/files/file_path.h"
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "components/filesystem/lock_table.h"
 #include "components/filesystem/shared_temp_dir.h"
@@ -299,7 +299,7 @@
 
   if (file.is_pending()) {
     mojo::MakeStrongBinding(
-        base::MakeUnique<FileImpl>(path_, std::move(new_file), temp_dir_,
+        std::make_unique<FileImpl>(path_, std::move(new_file), temp_dir_,
                                    lock_table_),
         std::move(file));
   }
diff --git a/components/filesystem/file_system_app.cc b/components/filesystem/file_system_app.cc
index b4ab6fe3..69965c4 100644
--- a/components/filesystem/file_system_app.cc
+++ b/components/filesystem/file_system_app.cc
@@ -9,7 +9,6 @@
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/service_context.h"
@@ -57,7 +56,7 @@
 void FileSystemApp::Create(mojom::FileSystemRequest request,
                            const service_manager::BindSourceInfo& source_info) {
   mojo::MakeStrongBinding(
-      base::MakeUnique<FileSystemImpl>(source_info.identity, GetUserDataDir(),
+      std::make_unique<FileSystemImpl>(source_info.identity, GetUserDataDir(),
                                        lock_table_),
       std::move(request));
 }
diff --git a/components/filesystem/file_system_impl.cc b/components/filesystem/file_system_impl.cc
index 59e84de2..508b4bc 100644
--- a/components/filesystem/file_system_impl.cc
+++ b/components/filesystem/file_system_impl.cc
@@ -43,7 +43,7 @@
   base::FilePath path = temp_dir->GetPath();
   scoped_refptr<SharedTempDir> shared_temp_dir =
       new SharedTempDir(std::move(temp_dir));
-  mojo::MakeStrongBinding(base::MakeUnique<DirectoryImpl>(
+  mojo::MakeStrongBinding(std::make_unique<DirectoryImpl>(
                               path, std::move(shared_temp_dir), lock_table_),
                           std::move(directory));
   std::move(callback).Run(mojom::FileError::OK);
@@ -60,7 +60,7 @@
   scoped_refptr<SharedTempDir> shared_temp_dir =
       new SharedTempDir(std::move(temp_dir));
 
-  mojo::MakeStrongBinding(base::MakeUnique<DirectoryImpl>(
+  mojo::MakeStrongBinding(std::make_unique<DirectoryImpl>(
                               path, std::move(shared_temp_dir), lock_table_),
                           std::move(directory));
   std::move(callback).Run(mojom::FileError::OK);
diff --git a/components/flags_ui/flags_state.cc b/components/flags_ui/flags_state.cc
index fba9512d..b28bd45 100644
--- a/components/flags_ui/flags_state.cc
+++ b/components/flags_ui/flags_state.cc
@@ -13,7 +13,6 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial.h"
 #include "base/stl_util.h"
 #include "base/strings/string_piece.h"
@@ -198,9 +197,9 @@
          entry.type == FeatureEntry::ENABLE_DISABLE_VALUE ||
          entry.type == FeatureEntry::FEATURE_VALUE ||
          entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE);
-  auto result = base::MakeUnique<base::ListValue>();
+  auto result = std::make_unique<base::ListValue>();
   for (int i = 0; i < entry.num_options; ++i) {
-    auto value = base::MakeUnique<base::DictionaryValue>();
+    auto value = std::make_unique<base::DictionaryValue>();
     const std::string name = entry.NameForOption(i);
     value->SetString("internal_name", name);
     value->SetString("description", entry.DescriptionForOption(i));
@@ -532,7 +531,7 @@
     data->SetString("description",
                     base::StringPiece(entry.visible_description));
 
-    auto supported_platforms = base::MakeUnique<base::ListValue>();
+    auto supported_platforms = std::make_unique<base::ListValue>();
     AddOsStrings(entry.supported_platforms, supported_platforms.get());
     data->Set("supported_platforms", std::move(supported_platforms));
     // True if the switch is not currently passed.
diff --git a/components/grpc_support/bidirectional_stream_c.cc b/components/grpc_support/bidirectional_stream_c.cc
index 05b9aa4..67fc9c59 100644
--- a/components/grpc_support/bidirectional_stream_c.cc
+++ b/components/grpc_support/bidirectional_stream_c.cc
@@ -14,7 +14,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -118,7 +117,7 @@
     bidirectional_stream_callback* callback)
     : request_context_getter_(
           reinterpret_cast<net::URLRequestContextGetter*>(engine->obj)),
-      c_stream_(base::MakeUnique<bidirectional_stream>()),
+      c_stream_(std::make_unique<bidirectional_stream>()),
       c_callback_(callback) {
   DCHECK(request_context_getter_);
   bidirectional_stream_ =
diff --git a/components/grpc_support/bidirectional_stream_unittest.cc b/components/grpc_support/bidirectional_stream_unittest.cc
index 1abaad5..f2e4d9e 100644
--- a/components/grpc_support/bidirectional_stream_unittest.cc
+++ b/components/grpc_support/bidirectional_stream_unittest.cc
@@ -7,9 +7,10 @@
 #include <map>
 #include <string>
 
+#include <memory>
+
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/strcat.h"
 #include "base/synchronization/waitable_event.h"
 #include "components/grpc_support/include/bidirectional_stream_c.h"
@@ -141,7 +142,7 @@
 
   void AddWriteData(const std::string& data) { AddWriteData(data, true); }
   void AddWriteData(const std::string& data, bool flush) {
-    write_data.push_back(base::MakeUnique<WriteData>(data, flush));
+    write_data.push_back(std::make_unique<WriteData>(data, flush));
   }
 
   virtual void MaybeWriteNextData(bidirectional_stream* stream) {
diff --git a/components/grpc_support/test/get_stream_engine.cc b/components/grpc_support/test/get_stream_engine.cc
index d26022d8..02c4d1e7 100644
--- a/components/grpc_support/test/get_stream_engine.cc
+++ b/components/grpc_support/test/get_stream_engine.cc
@@ -2,9 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <memory>
+
 #include "base/lazy_instance.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
@@ -39,7 +40,7 @@
     if (!request_context_.get()) {
       request_context_.reset(
           new net::TestURLRequestContext(true /* delay_initialization */));
-      auto mock_host_resolver = base::MakeUnique<net::MockHostResolver>();
+      auto mock_host_resolver = std::make_unique<net::MockHostResolver>();
       host_resolver_.reset(
           new net::MappedHostResolver(std::move(mock_host_resolver)));
       UpdateHostResolverRules();
@@ -48,7 +49,7 @@
       server_properties_.reset(new net::HttpServerPropertiesImpl());
 
       // Need to enable QUIC for the test server.
-      auto params = base::MakeUnique<net::HttpNetworkSession::Params>();
+      auto params = std::make_unique<net::HttpNetworkSession::Params>();
       params->enable_quic = true;
       params->enable_http2 = true;
       net::AlternativeService alternative_service(net::kProtoQUIC, "", 443);
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc
index 9a4a561..9de066d 100644
--- a/components/guest_view/browser/guest_view_base.cc
+++ b/components/guest_view/browser/guest_view_base.cc
@@ -4,11 +4,11 @@
 
 #include "components/guest_view/browser/guest_view_base.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/lazy_instance.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/guest_view/browser/guest_view_event.h"
 #include "components/guest_view/browser/guest_view_manager.h"
@@ -228,7 +228,7 @@
   // an observer to the owner WebContents. This observer will be responsible
   // for destroying the guest WebContents if the owner goes away.
   owner_contents_observer_ =
-      base::MakeUnique<OwnerContentsObserver>(this, owner_web_contents_);
+      std::make_unique<OwnerContentsObserver>(this, owner_web_contents_);
 
   WebContentsObserver::Observe(guest_web_contents);
   guest_web_contents->SetDelegate(this);
@@ -263,13 +263,13 @@
     return;
 
   // Dispatch the onResize event.
-  auto args = base::MakeUnique<base::DictionaryValue>();
+  auto args = std::make_unique<base::DictionaryValue>();
   args->SetInteger(kOldWidth, old_size.width());
   args->SetInteger(kOldHeight, old_size.height());
   args->SetInteger(kNewWidth, new_size.width());
   args->SetInteger(kNewHeight, new_size.height());
   DispatchEventToGuestProxy(
-      base::MakeUnique<GuestViewEvent>(kEventResize, std::move(args)));
+      std::make_unique<GuestViewEvent>(kEventResize, std::move(args)));
 }
 
 gfx::Size GuestViewBase::GetDefaultSize() const {
@@ -501,7 +501,7 @@
     opener_ = guest->weak_ptr_factory_.GetWeakPtr();
     if (!attached()) {
       opener_lifetime_observer_ =
-          base::MakeUnique<OpenerLifetimeObserver>(this);
+          std::make_unique<OpenerLifetimeObserver>(this);
     }
     return;
   }
@@ -534,7 +534,7 @@
     DCHECK_EQ(owner_contents_observer_->web_contents(), owner_web_contents_);
     owner_web_contents_ = embedder_web_contents;
     owner_contents_observer_ =
-        base::MakeUnique<OwnerContentsObserver>(this, embedder_web_contents);
+        std::make_unique<OwnerContentsObserver>(this, embedder_web_contents);
     SetOwnerHost();
   }
 
diff --git a/components/guest_view/browser/guest_view_message_filter.cc b/components/guest_view/browser/guest_view_message_filter.cc
index 3479d60..ba43359 100644
--- a/components/guest_view/browser/guest_view_message_filter.cc
+++ b/components/guest_view/browser/guest_view_message_filter.cc
@@ -4,7 +4,8 @@
 
 #include "components/guest_view/browser/guest_view_message_filter.h"
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "components/guest_view/browser/bad_message.h"
 #include "components/guest_view/browser/guest_view_base.h"
 #include "components/guest_view/browser/guest_view_manager.h"
@@ -53,7 +54,7 @@
   auto* manager = GuestViewManager::FromBrowserContext(browser_context_);
   if (!manager) {
     manager = GuestViewManager::CreateWithDelegate(
-        browser_context_, base::MakeUnique<GuestViewManagerDelegate>());
+        browser_context_, std::make_unique<GuestViewManagerDelegate>());
   }
   return manager;
 }
diff --git a/components/guest_view/browser/test_guest_view_manager.cc b/components/guest_view/browser/test_guest_view_manager.cc
index 84ca6d8..8dfc283 100644
--- a/components/guest_view/browser/test_guest_view_manager.cc
+++ b/components/guest_view/browser/test_guest_view_manager.cc
@@ -4,9 +4,9 @@
 
 #include "components/guest_view/browser/test_guest_view_manager.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "components/guest_view/browser/guest_view_base.h"
 #include "components/guest_view/browser/guest_view_manager_delegate.h"
 
@@ -112,7 +112,7 @@
   GuestViewManager::AddGuest(guest_instance_id, guest_web_contents);
 
   guest_web_contents_watchers_.push_back(
-      base::MakeUnique<content::WebContentsDestroyedWatcher>(
+      std::make_unique<content::WebContentsDestroyedWatcher>(
           guest_web_contents));
 
   if (created_message_loop_runner_.get())
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
index 79cdaab..438d29e 100644
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -18,7 +18,6 @@
 #include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/files/file_enumerator.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/sequenced_task_runner.h"
@@ -196,14 +195,13 @@
     InitImpl(history_database_params);
   delegate_->DBLoaded();
   if (base::FeatureList::IsEnabled(switches::kSyncUSSTypedURL)) {
-    typed_url_sync_bridge_ = base::MakeUnique<TypedURLSyncBridge>(
-        this, db_.get(),
-        base::BindRepeating(&ModelTypeChangeProcessor::Create,
-                            base::RepeatingClosure()));
+    typed_url_sync_bridge_ = std::make_unique<TypedURLSyncBridge>(
+        this, db_.get(), base::BindRepeating(&ModelTypeChangeProcessor::Create,
+                                             base::RepeatingClosure()));
     typed_url_sync_bridge_->Init();
   } else {
     typed_url_syncable_service_ =
-        base::MakeUnique<TypedUrlSyncableService>(this);
+        std::make_unique<TypedUrlSyncableService>(this);
   }
 
   memory_pressure_listener_.reset(new base::MemoryPressureListener(
@@ -2574,7 +2572,7 @@
     scoped_refptr<base::SingleThreadTaskRunner> origin_loop,
     const base::CancelableTaskTracker::IsCanceledCallback& is_canceled) {
   bool scheduled = !queued_history_db_tasks_.empty();
-  queued_history_db_tasks_.push_back(base::MakeUnique<QueuedHistoryDBTask>(
+  queued_history_db_tasks_.push_back(std::make_unique<QueuedHistoryDBTask>(
       std::move(task), origin_loop, is_canceled));
   if (!scheduled)
     ProcessDBTaskImpl();
diff --git a/components/history/core/browser/history_model_worker.cc b/components/history/core/browser/history_model_worker.cc
index 7ae6d603..c37db15 100644
--- a/components/history/core/browser/history_model_worker.cc
+++ b/components/history/core/browser/history_model_worker.cc
@@ -4,9 +4,9 @@
 
 #include "components/history/core/browser/history_model_worker.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "components/history/core/browser/history_db_task.h"
 #include "components/history/core/browser/history_service.h"
 
@@ -44,7 +44,7 @@
     base::CancelableTaskTracker* cancelable_tracker) {
   if (history_service.get()) {
     history_service->ScheduleDBTask(
-        base::MakeUnique<WorkerTask>(std::move(work)), cancelable_tracker);
+        std::make_unique<WorkerTask>(std::move(work)), cancelable_tracker);
   }
 }
 
diff --git a/components/history/core/browser/top_sites_impl.cc b/components/history/core/browser/top_sites_impl.cc
index 908fc228..0ed5797f 100644
--- a/components/history/core/browser/top_sites_impl.cc
+++ b/components/history/core/browser/top_sites_impl.cc
@@ -6,6 +6,7 @@
 
 #include <stdint.h>
 #include <algorithm>
+#include <memory>
 #include <set>
 #include <utility>
 
@@ -14,7 +15,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/md5.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
@@ -118,8 +118,8 @@
                            const PrepopulatedPageList& prepopulated_pages,
                            const CanAddURLToHistoryFn& can_add_url_to_history)
     : backend_(nullptr),
-      cache_(base::MakeUnique<TopSitesCache>()),
-      thread_safe_cache_(base::MakeUnique<TopSitesCache>()),
+      cache_(std::make_unique<TopSitesCache>()),
+      thread_safe_cache_(std::make_unique<TopSitesCache>()),
       prepopulated_pages_(prepopulated_pages),
       pref_service_(pref_service),
       history_service_(history_service),
@@ -281,7 +281,7 @@
 void TopSitesImpl::AddBlacklistedURL(const GURL& url) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  auto dummy = base::MakeUnique<base::Value>();
+  auto dummy = std::make_unique<base::Value>();
   {
     DictionaryPrefUpdate update(pref_service_, kMostVisitedURLsBlacklist);
     base::DictionaryValue* blacklist = update.Get();
diff --git a/components/history/core/browser/typed_url_sync_bridge.cc b/components/history/core/browser/typed_url_sync_bridge.cc
index 701aaa2..f1c4f45 100644
--- a/components/history/core/browser/typed_url_sync_bridge.cc
+++ b/components/history/core/browser/typed_url_sync_bridge.cc
@@ -4,9 +4,10 @@
 
 #include "components/history/core/browser/typed_url_sync_bridge.h"
 
+#include <memory>
+
 #include "base/auto_reset.h"
 #include "base/big_endian.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/history/core/browser/history_backend.h"
@@ -98,7 +99,7 @@
 std::unique_ptr<MetadataChangeList>
 TypedURLSyncBridge::CreateMetadataChangeList() {
   DCHECK(sequence_checker_.CalledOnValidSequence());
-  return base::MakeUnique<syncer::SyncMetadataStoreChangeList>(
+  return std::make_unique<syncer::SyncMetadataStoreChangeList>(
       sync_metadata_database_, syncer::TYPED_URLS);
 }
 
@@ -262,7 +263,7 @@
                                  DataCallback callback) {
   DCHECK(sequence_checker_.CalledOnValidSequence());
 
-  auto batch = base::MakeUnique<MutableDataBatch>();
+  auto batch = std::make_unique<MutableDataBatch>();
   for (const std::string& key : storage_keys) {
     URLRow url_row;
     URLID url_id = TypedURLSyncMetadataDatabase::StorageKeyToURLID(key);
@@ -302,7 +303,7 @@
     return;
   }
 
-  auto batch = base::MakeUnique<MutableDataBatch>();
+  auto batch = std::make_unique<MutableDataBatch>();
   for (URLRow& url : typed_urls) {
     VisitVector visits_vector;
     if (!FixupURLAndGetVisits(&url, &visits_vector))
@@ -415,7 +416,7 @@
       CreateMetadataChangeList();
 
   if (all_history) {
-    auto batch = base::MakeUnique<syncer::MetadataBatch>();
+    auto batch = std::make_unique<syncer::MetadataBatch>();
     if (!sync_metadata_database_->GetAllSyncMetadata(batch.get())) {
       change_processor()->ReportError(FROM_HERE,
                                       "Failed reading typed url metadata from "
@@ -731,7 +732,7 @@
     return;
   }
 
-  auto batch = base::MakeUnique<syncer::MetadataBatch>();
+  auto batch = std::make_unique<syncer::MetadataBatch>();
   if (!sync_metadata_database_->GetAllSyncMetadata(batch.get())) {
     change_processor()->ReportError(
         FROM_HERE,
@@ -1136,7 +1137,7 @@
 std::unique_ptr<EntityData> TypedURLSyncBridge::CreateEntityData(
     const URLRow& row,
     const VisitVector& visits) {
-  auto entity_data = base::MakeUnique<EntityData>();
+  auto entity_data = std::make_unique<EntityData>();
   TypedUrlSpecifics* specifics = entity_data->specifics.mutable_typed_url();
 
   if (!WriteToTypedUrlSpecifics(row, visits, specifics)) {
diff --git a/components/history/core/browser/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/typed_url_sync_bridge_unittest.cc
index 2b61ceba2..f1a6c91 100644
--- a/components/history/core/browser/typed_url_sync_bridge_unittest.cc
+++ b/components/history/core/browser/typed_url_sync_bridge_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "components/history/core/browser/typed_url_sync_bridge.h"
 
+#include <memory>
+
 #include "base/big_endian.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/message_loop/message_loop.h"
@@ -237,7 +239,7 @@
     fake_history_backend_->Init(
         false, TestHistoryDatabaseParamsForPath(test_dir_.GetPath()));
     std::unique_ptr<TypedURLSyncBridge> bridge =
-        base::MakeUnique<TypedURLSyncBridge>(
+        std::make_unique<TypedURLSyncBridge>(
             fake_history_backend_.get(), fake_history_backend_->db(),
             RecordingModelTypeChangeProcessor::FactoryForBridgeTest(&processor_,
                                                                     false));
diff --git a/components/history/core/browser/visitsegment_database.cc b/components/history/core/browser/visitsegment_database.cc
index b088f29..ea5eb04 100644
--- a/components/history/core/browser/visitsegment_database.cc
+++ b/components/history/core/browser/visitsegment_database.cc
@@ -9,13 +9,13 @@
 #include <stdint.h>
 
 #include <algorithm>
+#include <memory>
 #include <string>
 #include <vector>
 
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "components/history/core/browser/page_usage_data.h"
@@ -153,16 +153,6 @@
   return statement.Run();
 }
 
-URLID VisitSegmentDatabase::GetSegmentRepresentationURL(SegmentID segment_id) {
-  sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
-      "SELECT url_id FROM segments WHERE id = ?"));
-  statement.BindInt64(0, segment_id);
-
-  if (statement.Step())
-    return statement.ColumnInt64(0);
-  return 0;
-}
-
 SegmentID VisitSegmentDatabase::CreateSegment(URLID url_id,
                                               const std::string& segment_name) {
   sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
@@ -235,7 +225,7 @@
   while (statement.Step()) {
     SegmentID segment_id = statement.ColumnInt64(0);
     if (segment_id != previous_segment_id) {
-      segments.push_back(base::MakeUnique<PageUsageData>(segment_id));
+      segments.push_back(std::make_unique<PageUsageData>(segment_id));
       previous_segment_id = segment_id;
     }
 
@@ -292,14 +282,6 @@
   return results;
 }
 
-bool VisitSegmentDatabase::DeleteSegmentData(base::Time older_than) {
-  sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
-      "DELETE FROM segment_usage WHERE time_slot < ?"));
-  statement.BindInt64(0, older_than.LocalMidnight().ToInternalValue());
-
-  return statement.Run();
-}
-
 bool VisitSegmentDatabase::DeleteSegmentForURL(URLID url_id) {
   sql::Statement delete_usage(GetDB().GetCachedStatement(SQL_FROM_HERE,
       "DELETE FROM segment_usage WHERE segment_id IN "
diff --git a/components/history/core/browser/visitsegment_database.h b/components/history/core/browser/visitsegment_database.h
index e50685a..795c35b 100644
--- a/components/history/core/browser/visitsegment_database.h
+++ b/components/history/core/browser/visitsegment_database.h
@@ -41,10 +41,6 @@
   bool UpdateSegmentRepresentationURL(SegmentID segment_id,
                                       URLID url_id);
 
-  // Return the ID of the URL currently used to represent this segment or 0 if
-  // an error occured.
-  URLID GetSegmentRepresentationURL(SegmentID segment_id);
-
   // Create a segment for the provided URL ID with the given name. Returns the
   // ID of the newly created segment, or 0 on failure.
   SegmentID CreateSegment(URLID url_id, const std::string& segment_name);
@@ -62,13 +58,6 @@
       int max_result_count,
       const base::Callback<bool(const GURL&)>& url_filter);
 
-  // Delete all the segment usage data which is older than the provided time
-  // stamp.
-  bool DeleteSegmentData(base::Time older_than);
-
-  // Change the presentation id for the segment identified by |segment_id|
-  bool SetSegmentPresentationIndex(SegmentID segment_id, int index);
-
   // Delete the segment currently using the provided url for representation.
   // This will also delete any associated segment usage data.
   bool DeleteSegmentForURL(URLID url_id);
diff --git a/components/history/core/test/history_client_fake_bookmarks.cc b/components/history/core/test/history_client_fake_bookmarks.cc
index e54087c..9c6e2539 100644
--- a/components/history/core/test/history_client_fake_bookmarks.cc
+++ b/components/history/core/test/history_client_fake_bookmarks.cc
@@ -5,9 +5,9 @@
 #include "components/history/core/test/history_client_fake_bookmarks.h"
 
 #include <map>
+#include <memory>
 
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/synchronization/lock.h"
 #include "build/build_config.h"
 #include "components/history/core/browser/history_backend_client.h"
@@ -185,7 +185,7 @@
 
 std::unique_ptr<HistoryBackendClient>
 HistoryClientFakeBookmarks::CreateBackendClient() {
-  return base::MakeUnique<HistoryBackendClientFakeBookmarks>(bookmarks_);
+  return std::make_unique<HistoryBackendClientFakeBookmarks>(bookmarks_);
 }
 
 }  // namespace history
diff --git a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm
index 6cedad9..b327976 100644
--- a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm
+++ b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm
@@ -6,10 +6,11 @@
 
 #import <UIKit/UIKit.h>
 
+#include <memory>
+
 #include "base/ios/ios_util.h"
 #include "base/mac/scoped_block.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
@@ -111,7 +112,7 @@
           result_ = [UIImage imageWithData:data];
           called_ = true;
         } copy]) {
-    image_fetcher_ = base::MakeUnique<IOSImageDataFetcherWrapper>(
+    image_fetcher_ = std::make_unique<IOSImageDataFetcherWrapper>(
         new net::TestURLRequestContextGetter(
             base::ThreadTaskRunnerHandle::Get()));
   }
diff --git a/components/image_fetcher/ios/ios_image_decoder_impl.mm b/components/image_fetcher/ios/ios_image_decoder_impl.mm
index 2e7ca0e..ee900df7 100644
--- a/components/image_fetcher/ios/ios_image_decoder_impl.mm
+++ b/components/image_fetcher/ios/ios_image_decoder_impl.mm
@@ -6,10 +6,11 @@
 
 #import <UIKit/UIKit.h>
 
+#include <memory>
+
 #include "base/callback.h"
 #import "base/mac/bind_objc_block.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task_scheduler/post_task.h"
 #import "components/image_fetcher/ios/webp_decoder.h"
@@ -103,7 +104,7 @@
 }
 
 std::unique_ptr<ImageDecoder> CreateIOSImageDecoder() {
-  return base::MakeUnique<IOSImageDecoderImpl>();
+  return std::make_unique<IOSImageDecoderImpl>();
 }
 
 }  // namespace image_fetcher
diff --git a/components/invalidation/impl/gcm_invalidation_bridge.cc b/components/invalidation/impl/gcm_invalidation_bridge.cc
index ac2004d..7da4e86 100644
--- a/components/invalidation/impl/gcm_invalidation_bridge.cc
+++ b/components/invalidation/impl/gcm_invalidation_bridge.cc
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/gcm_driver/gcm_driver.h"
@@ -190,7 +191,7 @@
 std::unique_ptr<syncer::GCMNetworkChannelDelegate>
 GCMInvalidationBridge::CreateDelegate() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return base::MakeUnique<Core>(weak_factory_.GetWeakPtr(),
+  return std::make_unique<Core>(weak_factory_.GetWeakPtr(),
                                 base::ThreadTaskRunnerHandle::Get());
 }
 
diff --git a/components/invalidation/impl/registration_manager.cc b/components/invalidation/impl/registration_manager.cc
index a379d926..8dc2fff 100644
--- a/components/invalidation/impl/registration_manager.cc
+++ b/components/invalidation/impl/registration_manager.cc
@@ -9,10 +9,10 @@
 #include <algorithm>
 #include <cstddef>
 #include <iterator>
+#include <memory>
 #include <string>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/rand_util.h"
 #include "base/stl_util.h"
 #include "components/invalidation/public/invalidation_util.h"
@@ -88,7 +88,7 @@
        it != to_register.end(); ++it) {
     if (!base::ContainsKey(registration_statuses_, *it)) {
       registration_statuses_[*it] =
-          base::MakeUnique<RegistrationStatus>(*it, this);
+          std::make_unique<RegistrationStatus>(*it, this);
     }
     if (!IsIdRegistered(*it)) {
       TryRegisterId(*it, false /* is-retry */);
diff --git a/components/invalidation/impl/sync_system_resources.cc b/components/invalidation/impl/sync_system_resources.cc
index d672764..a68575b 100644
--- a/components/invalidation/impl/sync_system_resources.cc
+++ b/components/invalidation/impl/sync_system_resources.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <cstdlib>
 #include <cstring>
+#include <memory>
 #include <string>
 #include <utility>
 
@@ -174,13 +175,13 @@
     const notifier::NotifierOptions& notifier_options) {
   std::unique_ptr<notifier::PushClient> push_client(
       notifier::PushClient::CreateDefaultOnIOThread(notifier_options));
-  return base::MakeUnique<PushClientChannel>(std::move(push_client));
+  return std::make_unique<PushClientChannel>(std::move(push_client));
 }
 
 std::unique_ptr<SyncNetworkChannel> SyncNetworkChannel::CreateGCMNetworkChannel(
     scoped_refptr<net::URLRequestContextGetter> request_context_getter,
     std::unique_ptr<GCMNetworkChannelDelegate> delegate) {
-  return base::MakeUnique<GCMNetworkChannel>(request_context_getter,
+  return std::make_unique<GCMNetworkChannel>(request_context_getter,
                                              std::move(delegate));
 }
 
diff --git a/components/invalidation/impl/ticl_invalidation_service_unittest.cc b/components/invalidation/impl/ticl_invalidation_service_unittest.cc
index d5d357b..fc4fb8e7 100644
--- a/components/invalidation/impl/ticl_invalidation_service_unittest.cc
+++ b/components/invalidation/impl/ticl_invalidation_service_unittest.cc
@@ -68,7 +68,7 @@
     gcm_driver_.reset(new gcm::FakeGCMDriver());
     invalidation_service_.reset(new TiclInvalidationService(
         "TestUserAgent",
-        base::MakeUnique<FakeIdentityProvider>(&token_service_),
+        std::make_unique<FakeIdentityProvider>(&token_service_),
         std::unique_ptr<TiclSettingsProvider>(new FakeTiclSettingsProvider),
         gcm_driver_.get(), nullptr));
   }
diff --git a/components/json_schema/json_schema_validator.cc b/components/json_schema/json_schema_validator.cc
index e494bac1..8806e90 100644
--- a/components/json_schema/json_schema_validator.cc
+++ b/components/json_schema/json_schema_validator.cc
@@ -9,6 +9,7 @@
 #include <algorithm>
 #include <cfloat>
 #include <cmath>
+#include <memory>
 #include <vector>
 
 #include "base/json/json_reader.h"
@@ -612,7 +613,7 @@
   if (schema->GetDictionary(schema::kPatternProperties, &pattern_properties)) {
     for (base::DictionaryValue::Iterator it(*pattern_properties); !it.IsAtEnd();
          it.Advance()) {
-      auto prop_pattern = base::MakeUnique<re2::RE2>(it.key());
+      auto prop_pattern = std::make_unique<re2::RE2>(it.key());
       if (!prop_pattern->ok()) {
         LOG(WARNING) << "Regular expression /" << it.key()
                      << "/ is invalid: " << prop_pattern->error() << ".";
diff --git a/components/json_schema/json_schema_validator_unittest_base.cc b/components/json_schema/json_schema_validator_unittest_base.cc
index a4097bf..2a19e710 100644
--- a/components/json_schema/json_schema_validator_unittest_base.cc
+++ b/components/json_schema/json_schema_validator_unittest_base.cc
@@ -13,7 +13,6 @@
 #include "base/files/file_util.h"
 #include "base/json/json_file_value_serializer.h"
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
@@ -99,7 +98,7 @@
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
   instance->Remove(instance->GetSize() - 1, nullptr);
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
-  instance->Append(base::MakeUnique<base::DictionaryValue>());
+  instance->Append(std::make_unique<base::DictionaryValue>());
   ExpectNotValid(
       TEST_SOURCE, instance.get(), schema.get(), nullptr, "1",
       JSONSchemaValidator::FormatErrorMessage(
@@ -150,7 +149,7 @@
   ExpectNotValid(
       TEST_SOURCE, std::unique_ptr<base::Value>(new base::Value("42")).get(),
       schema.get(), nullptr, std::string(), JSONSchemaValidator::kInvalidEnum);
-  ExpectNotValid(TEST_SOURCE, base::MakeUnique<base::Value>().get(),
+  ExpectNotValid(TEST_SOURCE, std::make_unique<base::Value>().get(),
                  schema.get(), nullptr, std::string(),
                  JSONSchemaValidator::kInvalidEnum);
 }
@@ -159,7 +158,7 @@
   std::unique_ptr<base::DictionaryValue> schema(
       LoadDictionary("choices_schema.json"));
 
-  ExpectValid(TEST_SOURCE, base::MakeUnique<base::Value>().get(), schema.get(),
+  ExpectValid(TEST_SOURCE, std::make_unique<base::Value>().get(), schema.get(),
               nullptr);
   ExpectValid(TEST_SOURCE,
               std::unique_ptr<base::Value>(new base::Value(42)).get(),
@@ -249,7 +248,7 @@
 
   // Test additional properties.
   base::DictionaryValue* additional_properties = schema->SetDictionary(
-      schema::kAdditionalProperties, base::MakeUnique<base::DictionaryValue>());
+      schema::kAdditionalProperties, std::make_unique<base::DictionaryValue>());
   additional_properties->SetString(schema::kType, schema::kAny);
 
   instance->SetBoolean("extra", true);
@@ -278,7 +277,7 @@
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
   instance->Remove("bar", nullptr);
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
-  instance->Set("bar", base::MakeUnique<base::Value>());
+  instance->Set("bar", std::make_unique<base::Value>());
   ExpectNotValid(
       TEST_SOURCE, instance.get(), schema.get(), nullptr, "bar",
       JSONSchemaValidator::FormatErrorMessage(JSONSchemaValidator::kInvalidType,
@@ -386,7 +385,7 @@
   ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), nullptr, "1",
                  JSONSchemaValidator::kArrayItemRequired);
 
-  instance->Set(0, base::MakeUnique<base::Value>(42));
+  instance->Set(0, std::make_unique<base::Value>(42));
   instance->AppendInteger(42);
   ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), nullptr, "0",
                  JSONSchemaValidator::FormatErrorMessage(
@@ -394,12 +393,12 @@
                      schema::kInteger));
 
   base::DictionaryValue* additional_properties = schema->SetDictionary(
-      schema::kAdditionalProperties, base::MakeUnique<base::DictionaryValue>());
+      schema::kAdditionalProperties, std::make_unique<base::DictionaryValue>());
   additional_properties->SetString(schema::kType, schema::kAny);
-  instance->Set(0, base::MakeUnique<base::Value>("42"));
+  instance->Set(0, std::make_unique<base::Value>("42"));
   instance->AppendString("anything");
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
-  instance->Set(2, base::MakeUnique<base::ListValue>());
+  instance->Set(2, std::make_unique<base::ListValue>());
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
 
   additional_properties->SetString(schema::kType, schema::kBoolean);
@@ -407,7 +406,7 @@
       TEST_SOURCE, instance.get(), schema.get(), nullptr, "2",
       JSONSchemaValidator::FormatErrorMessage(
           JSONSchemaValidator::kInvalidType, schema::kBoolean, schema::kArray));
-  instance->Set(2, base::MakeUnique<base::Value>(false));
+  instance->Set(2, std::make_unique<base::Value>(false));
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
 
   base::ListValue* items_schema = nullptr;
@@ -419,9 +418,9 @@
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
   // TODO(aa): I think this is inconsistent with the handling of NULL+optional
   // for objects.
-  instance->Set(0, base::MakeUnique<base::Value>());
+  instance->Set(0, std::make_unique<base::Value>());
   ExpectValid(TEST_SOURCE, instance.get(), schema.get(), nullptr);
-  instance->Set(0, base::MakeUnique<base::Value>(42));
+  instance->Set(0, std::make_unique<base::Value>(42));
   ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), nullptr, "0",
                  JSONSchemaValidator::FormatErrorMessage(
                      JSONSchemaValidator::kInvalidType, schema::kString,
@@ -582,7 +581,7 @@
           std::unique_ptr<base::Value>(new base::DictionaryValue()).get()));
   EXPECT_EQ(std::string(schema::kNull),
             JSONSchemaValidator::GetJSONSchemaType(
-                base::MakeUnique<base::Value>().get()));
+                std::make_unique<base::Value>().get()));
 }
 
 void JSONSchemaValidatorTestBase::TestTypes() {
@@ -648,7 +647,7 @@
               schema.get(), nullptr);
 
   schema->SetString(schema::kType, schema::kNull);
-  ExpectValid(TEST_SOURCE, base::MakeUnique<base::Value>().get(), schema.get(),
+  ExpectValid(TEST_SOURCE, std::make_unique<base::Value>().get(), schema.get(),
               nullptr);
 
   // not valid
@@ -661,7 +660,7 @@
 
   schema->SetString(schema::kType, schema::kObject);
   ExpectNotValid(
-      TEST_SOURCE, base::MakeUnique<base::Value>().get(), schema.get(), nullptr,
+      TEST_SOURCE, std::make_unique<base::Value>().get(), schema.get(), nullptr,
       std::string(),
       JSONSchemaValidator::FormatErrorMessage(JSONSchemaValidator::kInvalidType,
                                               schema::kObject, schema::kNull));
diff --git a/components/leveldb/leveldb_service_impl.cc b/components/leveldb/leveldb_service_impl.cc
index 3210565..639c38f9 100644
--- a/components/leveldb/leveldb_service_impl.cc
+++ b/components/leveldb/leveldb_service_impl.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "components/leveldb/env_mojo.h"
 #include "components/leveldb/leveldb_database_impl.h"
 #include "components/leveldb/public/cpp/util.h"
@@ -64,7 +63,7 @@
 
   if (s.ok()) {
     mojo::MakeStrongAssociatedBinding(
-        base::MakeUnique<LevelDBDatabaseImpl>(
+        std::make_unique<LevelDBDatabaseImpl>(
             std::move(env_mojo), std::move(db), nullptr, memory_dump_id),
         std::move(database));
   }
@@ -90,7 +89,7 @@
 
   if (s.ok()) {
     mojo::MakeStrongAssociatedBinding(
-        base::MakeUnique<LevelDBDatabaseImpl>(std::move(env), std::move(db),
+        std::make_unique<LevelDBDatabaseImpl>(std::move(env), std::move(db),
                                               nullptr, memory_dump_id),
         std::move(database));
   }
diff --git a/components/leveldb_proto/proto_database_impl.h b/components/leveldb_proto/proto_database_impl.h
index 85f4dfe..252eadd 100644
--- a/components/leveldb_proto/proto_database_impl.h
+++ b/components/leveldb_proto/proto_database_impl.h
@@ -308,8 +308,8 @@
 void ProtoDatabaseImpl<T>::LoadKeys(
     typename ProtoDatabase<T>::LoadKeysCallback callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  auto success = base::MakeUnique<bool>(false);
-  auto keys = base::MakeUnique<std::vector<std::string>>();
+  auto success = std::make_unique<bool>(false);
+  auto keys = std::make_unique<std::vector<std::string>>();
   auto load_task =
       base::Bind(LoadKeysFromTaskRunner, base::Unretained(db_.get()),
                  keys.get(), success.get());
diff --git a/components/leveldb_proto/proto_database_impl_unittest.cc b/components/leveldb_proto/proto_database_impl_unittest.cc
index 656e67c..0c5a8beb 100644
--- a/components/leveldb_proto/proto_database_impl_unittest.cc
+++ b/components/leveldb_proto/proto_database_impl_unittest.cc
@@ -372,8 +372,8 @@
   ProtoDatabase<TestProto>::KeyEntryVector data_set(
           {{"0", test_proto}, {"1", test_proto}, {"2", test_proto}});
   db->UpdateEntries(
-      base::MakeUnique<ProtoDatabase<TestProto>::KeyEntryVector>(data_set),
-      base::MakeUnique<std::vector<std::string>>(), expect_update_success);
+      std::make_unique<ProtoDatabase<TestProto>::KeyEntryVector>(data_set),
+      std::make_unique<std::vector<std::string>>(), expect_update_success);
   run_update_entries.Run();
 
   base::RunLoop run_load_keys;
diff --git a/components/login/screens/screen_context.cc b/components/login/screens/screen_context.cc
index f1ebd76..f90bbe18 100644
--- a/components/login/screens/screen_context.cc
+++ b/components/login/screens/screen_context.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 
 namespace login {
 
@@ -179,7 +178,7 @@
   if (in_storage && new_value->Equals(current_value))
     return false;
 
-  changes_.Set(key, base::MakeUnique<base::Value>(new_value->Clone()));
+  changes_.Set(key, std::make_unique<base::Value>(new_value->Clone()));
   storage_.Set(key, std::move(new_value));
   return true;
 }
diff --git a/components/metrics/call_stack_profile_collector.cc b/components/metrics/call_stack_profile_collector.cc
index 3d35abf54..3dfb1de 100644
--- a/components/metrics/call_stack_profile_collector.cc
+++ b/components/metrics/call_stack_profile_collector.cc
@@ -7,7 +7,8 @@
 #include <utility>
 #include <vector>
 
-#include "base/memory/ptr_util.h"
+#include <memory>
+
 #include "components/metrics/call_stack_profile_metrics_provider.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -25,7 +26,7 @@
     CallStackProfileParams::Process expected_process,
     mojom::CallStackProfileCollectorRequest request) {
   mojo::MakeStrongBinding(
-      base::MakeUnique<CallStackProfileCollector>(expected_process),
+      std::make_unique<CallStackProfileCollector>(expected_process),
       std::move(request));
 }
 
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc
index 03f86f7..fb048cc 100644
--- a/components/metrics/file_metrics_provider.cc
+++ b/components/metrics/file_metrics_provider.cc
@@ -4,6 +4,8 @@
 
 #include "components/metrics/file_metrics_provider.h"
 
+#include <memory>
+
 #include "base/command_line.h"
 #include "base/containers/flat_map.h"
 #include "base/files/file.h"
@@ -11,7 +13,6 @@
 #include "base/files/file_util.h"
 #include "base/files/memory_mapped_file.h"
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/persistent_histogram_allocator.h"
@@ -299,7 +300,7 @@
 
   base::Time now_time = base::Time::Now();
   if (!source->found_files) {
-    source->found_files = base::MakeUnique<SourceInfo::FoundFiles>();
+    source->found_files = std::make_unique<SourceInfo::FoundFiles>();
     base::FileEnumerator file_iter(source->directory, /*recursive=*/false,
                                    base::FileEnumerator::FILES);
     SourceInfo::FoundFile found_file;
@@ -537,7 +538,7 @@
 
   // Map the file and validate it.
   std::unique_ptr<base::PersistentMemoryAllocator> memory_allocator =
-      base::MakeUnique<base::FilePersistentMemoryAllocator>(
+      std::make_unique<base::FilePersistentMemoryAllocator>(
           std::move(mapped), 0, 0, base::StringPiece(), read_only);
   if (memory_allocator->GetMemoryState() ==
       base::PersistentMemoryAllocator::MEMORY_DELETED) {
@@ -545,7 +546,7 @@
   }
 
   // Create an allocator for the mapped file. Ownership passes to the allocator.
-  source->allocator = base::MakeUnique<base::PersistentHistogramAllocator>(
+  source->allocator = std::make_unique<base::PersistentHistogramAllocator>(
       std::move(memory_allocator));
 
   // Check that an "independent" file has the necessary information present.
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc
index 4a26e60..b1ef8386 100644
--- a/components/metrics/metrics_service.cc
+++ b/components/metrics/metrics_service.cc
@@ -227,11 +227,11 @@
   DCHECK(local_state_);
 
   RegisterMetricsProvider(
-      base::MakeUnique<StabilityMetricsProvider>(local_state_));
+      std::make_unique<StabilityMetricsProvider>(local_state_));
 
   RegisterMetricsProvider(state_manager_->GetProvider());
 
-  RegisterMetricsProvider(base::MakeUnique<variations::FieldTrialsProvider>(
+  RegisterMetricsProvider(std::make_unique<variations::FieldTrialsProvider>(
       &synthetic_trial_registry_, base::StringPiece()));
 }
 
@@ -811,7 +811,7 @@
 
 std::unique_ptr<MetricsLog> MetricsService::CreateLog(
     MetricsLog::LogType log_type) {
-  return base::MakeUnique<MetricsLog>(state_manager_->client_id(), session_id_,
+  return std::make_unique<MetricsLog>(state_manager_->client_id(), session_id_,
                                       log_type, client_);
 }
 
diff --git a/components/metrics/metrics_state_manager.cc b/components/metrics/metrics_state_manager.cc
index ef15b0b..023636b 100644
--- a/components/metrics/metrics_state_manager.cc
+++ b/components/metrics/metrics_state_manager.cc
@@ -7,9 +7,10 @@
 #include <stddef.h>
 #include <utility>
 
+#include <memory>
+
 #include "base/command_line.h"
 #include "base/guid.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
@@ -162,7 +163,7 @@
 }
 
 std::unique_ptr<MetricsProvider> MetricsStateManager::GetProvider() {
-  return base::MakeUnique<MetricsStateMetricsProvider>(
+  return std::make_unique<MetricsStateMetricsProvider>(
       local_state_, metrics_ids_were_reset_, previous_client_id_);
 }
 
@@ -238,7 +239,7 @@
   if (!MachineIdProvider::HasId())
     return;
 
-  cloned_install_detector_ = base::MakeUnique<ClonedInstallDetector>();
+  cloned_install_detector_ = std::make_unique<ClonedInstallDetector>();
   cloned_install_detector_->CheckForClonedInstall(local_state_);
 }
 
diff --git a/components/metrics/net/network_metrics_provider_unittest.cc b/components/metrics/net/network_metrics_provider_unittest.cc
index a15a368..3731bce 100644
--- a/components/metrics/net/network_metrics_provider_unittest.cc
+++ b/components/metrics/net/network_metrics_provider_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "components/metrics/net/network_metrics_provider.h"
 
+#include <memory>
+
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
@@ -195,7 +197,7 @@
        {net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
         net::EFFECTIVE_CONNECTION_TYPE_OFFLINE}) {
     std::unique_ptr<net::NetworkQualityEstimatorParams> params =
-        base::MakeUnique<net::NetworkQualityEstimatorParams>(
+        std::make_unique<net::NetworkQualityEstimatorParams>(
             std::map<std::string, std::string>());
     net::NetworkQualityEstimatorParams* params_ptr = params.get();
     net::TestNetworkQualityEstimator estimator(std::move(params));
@@ -284,4 +286,4 @@
             system_profile.network().connection_type());
 }
 
-}  // namespace metrics
\ No newline at end of file
+}  // namespace metrics
diff --git a/components/metrics/persistent_system_profile_unittest.cc b/components/metrics/persistent_system_profile_unittest.cc
index 4adaed3..209db88 100644
--- a/components/metrics/persistent_system_profile_unittest.cc
+++ b/components/metrics/persistent_system_profile_unittest.cc
@@ -4,8 +4,9 @@
 
 #include "components/metrics/persistent_system_profile.h"
 
+#include <memory>
+
 #include "base/logging.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/persistent_memory_allocator.h"
 #include "base/rand_util.h"
 #include "components/variations/metrics_util.h"
@@ -21,9 +22,9 @@
   ~PersistentSystemProfileTest() override {}
 
   void SetUp() override {
-    memory_allocator_ = base::MakeUnique<base::LocalPersistentMemoryAllocator>(
+    memory_allocator_ = std::make_unique<base::LocalPersistentMemoryAllocator>(
         kAllocatorMemorySize, 0, "");
-    records_ = base::MakeUnique<PersistentSystemProfile::RecordAllocator>(
+    records_ = std::make_unique<PersistentSystemProfile::RecordAllocator>(
         memory_allocator_.get());
     persistent_profile_.RegisterPersistentAllocator(memory_allocator_.get());
   }
diff --git a/components/metrics/single_sample_metrics.cc b/components/metrics/single_sample_metrics.cc
index 0f16c49..201ef730 100644
--- a/components/metrics/single_sample_metrics.cc
+++ b/components/metrics/single_sample_metrics.cc
@@ -4,9 +4,9 @@
 
 #include "components/metrics/single_sample_metrics.h"
 
+#include <memory>
 #include <utility>
 
-#include "base/memory/ptr_util.h"
 #include "base/metrics/single_sample_metrics.h"
 #include "base/threading/thread_checker.h"
 #include "components/metrics/single_sample_metrics_factory_impl.h"
@@ -55,7 +55,7 @@
       int32_t flags,
       mojom::SingleSampleMetricRequest request) override {
     DCHECK(thread_checker_.CalledOnValidThread());
-    mojo::MakeStrongBinding(base::MakeUnique<MojoSingleSampleMetric>(
+    mojo::MakeStrongBinding(std::make_unique<MojoSingleSampleMetric>(
                                 histogram_name, min, max, bucket_count, flags),
                             std::move(request));
   }
@@ -71,14 +71,14 @@
 // static
 void InitializeSingleSampleMetricsFactory(CreateProviderCB create_provider_cb) {
   base::SingleSampleMetricsFactory::SetFactory(
-      base::MakeUnique<SingleSampleMetricsFactoryImpl>(
+      std::make_unique<SingleSampleMetricsFactoryImpl>(
           std::move(create_provider_cb)));
 }
 
 // static
 void CreateSingleSampleMetricsProvider(
     mojom::SingleSampleMetricsProviderRequest request) {
-  mojo::MakeStrongBinding(base::MakeUnique<MojoSingleSampleMetricsProvider>(),
+  mojo::MakeStrongBinding(std::make_unique<MojoSingleSampleMetricsProvider>(),
                           std::move(request));
 }
 
diff --git a/components/metrics/single_sample_metrics_factory_impl.cc b/components/metrics/single_sample_metrics_factory_impl.cc
index 677fa8b..4ab48f8a 100644
--- a/components/metrics/single_sample_metrics_factory_impl.cc
+++ b/components/metrics/single_sample_metrics_factory_impl.cc
@@ -4,6 +4,8 @@
 
 #include "components/metrics/single_sample_metrics_factory_impl.h"
 
+#include <memory>
+
 #include "base/threading/thread_checker.h"
 
 namespace metrics {
@@ -65,7 +67,7 @@
   GetProvider()->AcquireSingleSampleMetric(histogram_name, min, max,
                                            bucket_count, flags,
                                            mojo::MakeRequest(&metric));
-  return base::MakeUnique<SingleSampleMetricImpl>(std::move(metric));
+  return std::make_unique<SingleSampleMetricImpl>(std::move(metric));
 }
 
 mojom::SingleSampleMetricsProvider*
diff --git a/components/ntp_snippets/breaking_news/subscription_manager_impl.cc b/components/ntp_snippets/breaking_news/subscription_manager_impl.cc
index 49a84fa..10404fa 100644
--- a/components/ntp_snippets/breaking_news/subscription_manager_impl.cc
+++ b/components/ntp_snippets/breaking_news/subscription_manager_impl.cc
@@ -30,34 +30,6 @@
 
 }  // namespace
 
-class SubscriptionManagerImpl::SigninObserver
-    : public SigninManagerBase::Observer {
- public:
-  SigninObserver(SigninManagerBase* signin_manager,
-                 const base::Closure& signin_status_changed_callback)
-      : signin_manager_(signin_manager),
-        signin_status_changed_callback_(signin_status_changed_callback) {
-    signin_manager_->AddObserver(this);
-  }
-
-  ~SigninObserver() override { signin_manager_->RemoveObserver(this); }
-
- private:
-  // SigninManagerBase::Observer implementation.
-  void GoogleSigninSucceeded(const std::string& account_id,
-                             const std::string& username) override {
-    signin_status_changed_callback_.Run();
-  }
-
-  void GoogleSignedOut(const std::string& account_id,
-                       const std::string& username) override {
-    signin_status_changed_callback_.Run();
-  }
-
-  SigninManagerBase* const signin_manager_;
-  base::Closure signin_status_changed_callback_;
-};
-
 SubscriptionManagerImpl::SubscriptionManagerImpl(
     scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
     PrefService* pref_service,
@@ -72,17 +44,17 @@
       pref_service_(pref_service),
       variations_service_(variations_service),
       signin_manager_(signin_manager),
-      signin_observer_(std::make_unique<SigninObserver>(
-          signin_manager,
-          base::Bind(&SubscriptionManagerImpl::SigninStatusChanged,
-                     base::Unretained(this)))),
       access_token_service_(access_token_service),
       locale_(locale),
       api_key_(api_key),
       subscribe_url_(subscribe_url),
-      unsubscribe_url_(unsubscribe_url) {}
+      unsubscribe_url_(unsubscribe_url) {
+  signin_manager_->AddObserver(this);
+}
 
-SubscriptionManagerImpl::~SubscriptionManagerImpl() = default;
+SubscriptionManagerImpl::~SubscriptionManagerImpl() {
+  signin_manager_->RemoveObserver(this);
+}
 
 void SubscriptionManagerImpl::Subscribe(const std::string& subscription_token) {
   // If there is a request in flight, cancel it.
@@ -263,6 +235,17 @@
   }
 }
 
+void SubscriptionManagerImpl::GoogleSigninSucceeded(
+    const std::string& account_id,
+    const std::string& username) {
+  SigninStatusChanged();
+}
+
+void SubscriptionManagerImpl::GoogleSignedOut(const std::string& account_id,
+                                              const std::string& username) {
+  SigninStatusChanged();
+}
+
 void SubscriptionManagerImpl::SigninStatusChanged() {
   // If subscribed already, resubscribe.
   if (IsSubscribed()) {
diff --git a/components/ntp_snippets/breaking_news/subscription_manager_impl.h b/components/ntp_snippets/breaking_news/subscription_manager_impl.h
index fbaf160..28788c74 100644
--- a/components/ntp_snippets/breaking_news/subscription_manager_impl.h
+++ b/components/ntp_snippets/breaking_news/subscription_manager_impl.h
@@ -34,7 +34,8 @@
 // to the content suggestions server and does the bookkeeping for the data used
 // for subscription. Bookkeeping is required to detect any change (e.g. the
 // token render invalid), and resubscribe accordingly.
-class SubscriptionManagerImpl : public SubscriptionManager {
+class SubscriptionManagerImpl : public SubscriptionManager,
+                                public SigninManagerBase::Observer {
  public:
   SubscriptionManagerImpl(
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
@@ -64,7 +65,11 @@
   static void ClearProfilePrefs(PrefService* pref_service);
 
  private:
-  class SigninObserver;
+  // SigninManagerBase::Observer implementation.
+  void GoogleSigninSucceeded(const std::string& account_id,
+                             const std::string& username) override;
+  void GoogleSignedOut(const std::string& account_id,
+                       const std::string& username) override;
 
   void SigninStatusChanged();
 
@@ -100,7 +105,6 @@
 
   // Authentication for signed-in users.
   SigninManagerBase* signin_manager_;
-  std::unique_ptr<SigninObserver> signin_observer_;
   OAuth2TokenService* access_token_service_;
 
   const std::string locale_;
diff --git a/components/ntp_snippets/breaking_news/subscription_manager_impl_unittest.cc b/components/ntp_snippets/breaking_news/subscription_manager_impl_unittest.cc
index 7c39b7d..7d240da 100644
--- a/components/ntp_snippets/breaking_news/subscription_manager_impl_unittest.cc
+++ b/components/ntp_snippets/breaking_news/subscription_manager_impl_unittest.cc
@@ -72,6 +72,15 @@
 
   SigninManagerBase* GetSigninManager() { return utils_.fake_signin_manager(); }
 
+  std::unique_ptr<SubscriptionManagerImpl> BuildSubscriptionManager() {
+    return std::make_unique<SubscriptionManagerImpl>(
+        GetRequestContext(), GetPrefService(),
+        /*variations_service=*/nullptr, GetSigninManager(),
+        GetOAuth2TokenService(),
+        /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl),
+        GURL(kUnsubscriptionUrl));
+  }
+
   net::TestURLFetcher* GetRunningFetcher() {
     // All created TestURLFetchers have ID 0 by default.
     net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0);
@@ -180,15 +189,10 @@
 
 TEST_F(SubscriptionManagerImplTest, SubscribeSuccessfully) {
   std::string subscription_token = "1234567890";
-  // TODO(vitaliii): Add a helper to build the manager.
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(),
-      GetOAuth2TokenService(),
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/false);
-  ASSERT_TRUE(manager.IsSubscribed());
+  ASSERT_TRUE(manager->IsSubscribed());
   EXPECT_EQ(subscription_token, GetPrefService()->GetString(
                                     prefs::kBreakingNewsSubscriptionDataToken));
   EXPECT_FALSE(GetPrefService()->GetBoolean(
@@ -210,23 +214,20 @@
 
   // Create manager and subscribe.
   std::string subscription_token = "1234567890";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(), auth_token_service,
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
 
   run_loop.Run();
 
   // Make sure that subscription is pending an access token.
-  ASSERT_FALSE(manager.IsSubscribed());
+  ASSERT_FALSE(manager->IsSubscribed());
   ASSERT_EQ(1u, auth_token_service->GetPendingRequests().size());
 
   // Issue the access token and respond to the subscription request.
   IssueAccessToken(auth_token_service);
-  ASSERT_FALSE(manager.IsSubscribed());
+  ASSERT_FALSE(manager->IsSubscribed());
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/true);
-  ASSERT_TRUE(manager.IsSubscribed());
+  ASSERT_TRUE(manager->IsSubscribed());
 
   // Check that we are now subscribed correctly with authentication.
   EXPECT_EQ(subscription_token, GetPrefService()->GetString(
@@ -238,30 +239,22 @@
 
 TEST_F(SubscriptionManagerImplTest, ShouldNotSubscribeIfError) {
   std::string subscription_token = "1234567890";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(),
-      GetOAuth2TokenService(),
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
 
-  manager.Subscribe(subscription_token);
+  manager->Subscribe(subscription_token);
   RespondToSubscriptionWithError(/*is_signed_in=*/false, net::ERR_TIMED_OUT);
-  EXPECT_FALSE(manager.IsSubscribed());
+  EXPECT_FALSE(manager->IsSubscribed());
 }
 
 TEST_F(SubscriptionManagerImplTest, UnsubscribeSuccessfully) {
   std::string subscription_token = "1234567890";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(),
-      GetOAuth2TokenService(),
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/false);
-  ASSERT_TRUE(manager.IsSubscribed());
-  manager.Unsubscribe();
+  ASSERT_TRUE(manager->IsSubscribed());
+  manager->Unsubscribe();
   RespondToUnsubscriptionRequestSuccessfully(/*is_signed_in=*/false);
-  EXPECT_FALSE(manager.IsSubscribed());
+  EXPECT_FALSE(manager->IsSubscribed());
   EXPECT_FALSE(
       GetPrefService()->HasPrefPath(prefs::kBreakingNewsSubscriptionDataToken));
 }
@@ -269,17 +262,13 @@
 TEST_F(SubscriptionManagerImplTest,
        ShouldRemainSubscribedIfErrorDuringUnsubscribe) {
   std::string subscription_token = "1234567890";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(),
-      GetOAuth2TokenService(),
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/false);
-  ASSERT_TRUE(manager.IsSubscribed());
-  manager.Unsubscribe();
+  ASSERT_TRUE(manager->IsSubscribed());
+  manager->Unsubscribe();
   RespondToUnsubscriptionWithError(/*is_signed_in=*/false, net::ERR_TIMED_OUT);
-  ASSERT_TRUE(manager.IsSubscribed());
+  ASSERT_TRUE(manager->IsSubscribed());
   EXPECT_EQ(subscription_token, GetPrefService()->GetString(
                                     prefs::kBreakingNewsSubscriptionDataToken));
 }
@@ -292,13 +281,10 @@
   // Create manager and subscribe.
   FakeProfileOAuth2TokenService* auth_token_service = GetOAuth2TokenService();
   std::string subscription_token = "1234567890";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(), auth_token_service,
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/false);
-  ASSERT_FALSE(manager.NeedsToResubscribe());
+  ASSERT_FALSE(manager->NeedsToResubscribe());
 
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
@@ -306,7 +292,7 @@
   // Sign in. This should trigger a resubscribe.
   SignIn();
   IssueRefreshToken(auth_token_service);
-  ASSERT_TRUE(manager.NeedsToResubscribe());
+  ASSERT_TRUE(manager->NeedsToResubscribe());
 
   run_loop.Run();
   ASSERT_EQ(1u, auth_token_service->GetPendingRequests().size());
@@ -332,11 +318,8 @@
   SignIn();
   IssueRefreshToken(auth_token_service);
   std::string subscription_token = "1234567890";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(), auth_token_service,
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
   run_loop.Run();
   ASSERT_EQ(1u, auth_token_service->GetPendingRequests().size());
   IssueAccessToken(auth_token_service);
@@ -344,7 +327,7 @@
 
   // Signout, this should trigger a resubscribe.
   SignOut();
-  EXPECT_TRUE(manager.NeedsToResubscribe());
+  EXPECT_TRUE(manager->NeedsToResubscribe());
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/false);
 
   // Check that we are now subscribed without authentication.
@@ -357,12 +340,8 @@
        ShouldUpdateTokenInPrefWhenResubscribeWithChangeInToken) {
   // Create manager and subscribe.
   std::string old_subscription_token = "1234567890";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(),
-      GetOAuth2TokenService(),
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(old_subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(old_subscription_token);
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/false);
   EXPECT_EQ(
       old_subscription_token,
@@ -370,7 +349,7 @@
 
   // Resubscribe with a new token.
   std::string new_subscription_token = "0987654321";
-  manager.Resubscribe(new_subscription_token);
+  manager->Resubscribe(new_subscription_token);
   // Resubscribe with a new token should issue an unsubscribe request before
   // subscribing.
   RespondToUnsubscriptionRequestSuccessfully(/*is_signed_in=*/false);
@@ -386,12 +365,8 @@
   base::HistogramTester histogram_tester;
   // Create manager and subscribe.
   const std::string subscription_token = "token";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(),
-      GetOAuth2TokenService(),
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
   // TODO(vitaliii): Mock subscription request to avoid this low level errors.
   RespondToSubscriptionWithError(/*is_signed_in=*/false,
                                  /*error_code=*/net::ERR_INVALID_RESPONSE);
@@ -408,14 +383,10 @@
   base::HistogramTester histogram_tester;
   // Create manager and subscribe.
   const std::string subscription_token = "token";
-  SubscriptionManagerImpl manager(
-      GetRequestContext(), GetPrefService(),
-      /*variations_service=*/nullptr, GetSigninManager(),
-      GetOAuth2TokenService(),
-      /*locale=*/"", kAPIKey, GURL(kSubscriptionUrl), GURL(kUnsubscriptionUrl));
-  manager.Subscribe(subscription_token);
+  std::unique_ptr<SubscriptionManagerImpl> manager = BuildSubscriptionManager();
+  manager->Subscribe(subscription_token);
   RespondToSubscriptionRequestSuccessfully(/*is_signed_in=*/false);
-  manager.Unsubscribe();
+  manager->Unsubscribe();
 
   RespondToUnsubscriptionWithError(/*is_signed_in=*/false,
                                    /*error_code=*/net::ERR_INVALID_RESPONSE);
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
index e0c75e7..9831b6c 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
@@ -15,12 +15,9 @@
 #include "components/ntp_snippets/category.h"
 #include "components/ntp_snippets/remote/test_utils.h"
 #include "components/prefs/testing_pref_service.h"
-#include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
-#include "components/signin/core/browser/fake_signin_manager.h"
-#include "google_apis/gaia/fake_oauth2_token_service_delegate.h"
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_request_test_util.h"
-#include "services/identity/public/cpp/identity_manager.h"
+#include "services/identity/public/cpp/identity_test_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -105,9 +102,7 @@
 
 }  // namespace
 
-class ContextualSuggestionsFetcherTest
-    : public testing::Test,
-      public OAuth2TokenService::DiagnosticsObserver {
+class ContextualSuggestionsFetcherTest : public testing::Test {
  public:
   ContextualSuggestionsFetcherTest()
       : fake_url_fetcher_factory_(new net::FakeURLFetcherFactory(nullptr)),
@@ -115,20 +110,13 @@
             base::TestMockTimeTaskRunner::Type::kBoundToThread)) {
     scoped_refptr<net::TestURLRequestContextGetter> request_context_getter =
         new net::TestURLRequestContextGetter(mock_task_runner_.get());
-    fake_token_service_ = std::make_unique<FakeProfileOAuth2TokenService>(
-        std::make_unique<FakeOAuth2TokenServiceDelegate>(
-            request_context_getter.get()));
-    identity_manager_ = std::make_unique<identity::IdentityManager>(
-        test_utils_.fake_signin_manager(), fake_token_service_.get());
     fetcher_ = std::make_unique<ContextualSuggestionsFetcherImpl>(
-        identity_manager_.get(), std::move(request_context_getter),
-        test_utils_.pref_service(), base::BindRepeating(&ParseJson));
-    fake_token_service_->AddDiagnosticsObserver(this);
+        identity_test_env_.identity_manager(),
+        std::move(request_context_getter), test_utils_.pref_service(),
+        base::BindRepeating(&ParseJson));
   }
 
   ~ContextualSuggestionsFetcherTest() override {
-    identity_manager_.reset();
-    fake_token_service_->RemoveDiagnosticsObserver(this);
   }
 
   void FastForwardUntilNoTasksRemain() {
@@ -136,13 +124,8 @@
   }
 
   void InitializeFakeCredentials() {
-    identity_manager_->SetPrimaryAccountSynchronouslyForTests(
-        kTestEmail, kTestEmail, "token");
-  }
-
-  void IssueOAuth2Token() {
-    fake_token_service_->IssueAllTokensForAccount(kTestEmail, "access_token",
-                                                  base::Time::Max());
+    identity_test_env()->MakePrimaryAccountAvailable(kTestEmail, kTestEmail,
+                                                     "token");
   }
 
   void SetFakeResponse(const std::string& response_data,
@@ -164,30 +147,17 @@
     return mock_suggestions_available_callback_;
   }
 
-  void set_on_access_token_request_callback(base::OnceClosure callback) {
-    on_access_token_request_callback_ = std::move(callback);
+  identity::IdentityTestEnvironment* identity_test_env() {
+    return &identity_test_env_;
   }
 
  private:
-  // OAuth2TokenService::DiagnosticsObserver:
-  void OnAccessTokenRequested(
-      const std::string& account_id,
-      const std::string& consumer_id,
-      const OAuth2TokenService::ScopeSet& scopes) override {
-    if (on_access_token_request_callback_)
-      std::move(on_access_token_request_callback_).Run();
-  }
-
-  std::unique_ptr<FakeProfileOAuth2TokenService> fake_token_service_;
-
-  // TODO(blundell): Convert this test to use IdentityTestEnvironment.
-  std::unique_ptr<identity::IdentityManager> identity_manager_;
+  identity::IdentityTestEnvironment identity_test_env_;
   std::unique_ptr<net::FakeURLFetcherFactory> fake_url_fetcher_factory_;
   std::unique_ptr<ContextualSuggestionsFetcherImpl> fetcher_;
   MockSuggestionsAvailableCallback mock_suggestions_available_callback_;
   scoped_refptr<base::TestMockTimeTaskRunner> mock_task_runner_;
   test::RemoteSuggestionsTestUtils test_utils_;
-  base::OnceClosure on_access_token_request_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(ContextualSuggestionsFetcherTest);
 };
@@ -198,9 +168,6 @@
 }
 
 TEST_F(ContextualSuggestionsFetcherTest, ShouldFetchSuggestion) {
-  base::RunLoop run_loop;
-  set_on_access_token_request_callback(run_loop.QuitClosure());
-
   InitializeFakeCredentials();
   const std::string kValidResponseData =
       "{\"categories\" : [{"
@@ -222,18 +189,15 @@
       GURL(kValidURL),
       ToSuggestionsAvailableCallback(&mock_suggestions_available_callback()));
 
-  run_loop.Run();
+  identity_test_env()->WaitForAccessTokenRequestAndRespondWithToken(
+      "access_token", base::Time::Max());
 
-  IssueOAuth2Token();
   FastForwardUntilNoTasksRemain();
   EXPECT_THAT(fetcher().GetLastStatusForTesting(), Eq("OK"));
   EXPECT_THAT(fetcher().GetLastJsonForTesting(), Eq(kValidResponseData));
 }
 
 TEST_F(ContextualSuggestionsFetcherTest, ShouldFetchEmptySuggestionsList) {
-  base::RunLoop run_loop;
-  set_on_access_token_request_callback(run_loop.QuitClosure());
-
   InitializeFakeCredentials();
   const std::string kValidEmptyCategoryResponseData =
       "{\"categories\" : [{"
@@ -250,9 +214,9 @@
       GURL(kValidURL),
       ToSuggestionsAvailableCallback(&mock_suggestions_available_callback()));
 
-  run_loop.Run();
+  identity_test_env()->WaitForAccessTokenRequestAndRespondWithToken(
+      "access_token", base::Time::Max());
 
-  IssueOAuth2Token();
   FastForwardUntilNoTasksRemain();
   EXPECT_THAT(fetcher().GetLastStatusForTesting(), Eq("OK"));
   EXPECT_THAT(fetcher().GetLastJsonForTesting(),
@@ -261,9 +225,6 @@
 
 TEST_F(ContextualSuggestionsFetcherTest,
        ShouldReportErrorForEmptyResponseData) {
-  base::RunLoop run_loop;
-  set_on_access_token_request_callback(run_loop.QuitClosure());
-
   InitializeFakeCredentials();
   SetFakeResponse(/*response_data=*/std::string(), net::HTTP_NOT_FOUND,
                   net::URLRequestStatus::SUCCESS);
@@ -274,17 +235,14 @@
       GURL(kValidURL),
       ToSuggestionsAvailableCallback(&mock_suggestions_available_callback()));
 
-  run_loop.Run();
+  identity_test_env()->WaitForAccessTokenRequestAndRespondWithToken(
+      "access_token", base::Time::Max());
 
-  IssueOAuth2Token();
   FastForwardUntilNoTasksRemain();
 }
 
 TEST_F(ContextualSuggestionsFetcherTest,
        ShouldReportErrorForInvalidResponseData) {
-  base::RunLoop run_loop;
-  set_on_access_token_request_callback(run_loop.QuitClosure());
-
   InitializeFakeCredentials();
   const std::string kInvalidResponseData = "{ \"recos\": []";
   SetFakeResponse(/*response_data=*/kInvalidResponseData, net::HTTP_OK,
@@ -300,9 +258,9 @@
       GURL(kValidURL),
       ToSuggestionsAvailableCallback(&mock_suggestions_available_callback()));
 
-  run_loop.Run();
+  identity_test_env()->WaitForAccessTokenRequestAndRespondWithToken(
+      "access_token", base::Time::Max());
 
-  IssueOAuth2Token();
   FastForwardUntilNoTasksRemain();
   EXPECT_THAT(fetcher().GetLastStatusForTesting(),
               StartsWith("Received invalid JSON (error "));
diff --git a/components/os_crypt/os_crypt_linux.cc b/components/os_crypt/os_crypt_linux.cc
index b39bb091..6510c68 100644
--- a/components/os_crypt/os_crypt_linux.cc
+++ b/components/os_crypt/os_crypt_linux.cc
@@ -209,8 +209,10 @@
 
   std::unique_ptr<crypto::SymmetricKey> encryption_key(
       GetEncryptionKey(version));
-  if (!encryption_key)
+  if (!encryption_key) {
+    VLOG(1) << "Decryption failed: could not get the key";
     return false;
+  }
 
   std::string iv(kIVBlockSizeAES128, ' ');
   crypto::Encryptor encryptor;
@@ -221,8 +223,10 @@
   std::string raw_ciphertext =
       ciphertext.substr(strlen(kObfuscationPrefix[version]));
 
-  if (!encryptor.Decrypt(raw_ciphertext, plaintext))
+  if (!encryptor.Decrypt(raw_ciphertext, plaintext)) {
+    VLOG(1) << "Decryption failed";
     return false;
+  }
 
   return true;
 }
diff --git a/components/os_crypt/os_crypt_mac.mm b/components/os_crypt/os_crypt_mac.mm
index f999d25..592d1b0 100644
--- a/components/os_crypt/os_crypt_mac.mm
+++ b/components/os_crypt/os_crypt_mac.mm
@@ -152,16 +152,20 @@
       ciphertext.substr(strlen(kEncryptionVersionPrefix));
 
   crypto::SymmetricKey* encryption_key = GetEncryptionKey();
-  if (!encryption_key)
+  if (!encryption_key) {
+    VLOG(1) << "Decryption failed: could not get the key";
     return false;
+  }
 
   std::string iv(kCCBlockSizeAES128, ' ');
   crypto::Encryptor encryptor;
   if (!encryptor.Init(encryption_key, crypto::Encryptor::CBC, iv))
     return false;
 
-  if (!encryptor.Decrypt(raw_ciphertext, plaintext))
+  if (!encryptor.Decrypt(raw_ciphertext, plaintext)) {
+    VLOG(1) << "Decryption failed";
     return false;
+  }
 
   return true;
 }
diff --git a/components/password_manager/OWNERS b/components/password_manager/OWNERS
index fe38e2ac..b43b8ca 100644
--- a/components/password_manager/OWNERS
+++ b/components/password_manager/OWNERS
@@ -1,8 +1,5 @@
 dvadym@chromium.org
-engedy@chromium.org
 kolos@chromium.org
-melandory@chromium.org
-mkwst@chromium.org
 vabr@chromium.org
 vasilii@chromium.org
 
diff --git a/components/password_manager/core/browser/android_affiliation/OWNERS b/components/password_manager/core/browser/android_affiliation/OWNERS
new file mode 100644
index 0000000..992fe26
--- /dev/null
+++ b/components/password_manager/core/browser/android_affiliation/OWNERS
@@ -0,0 +1,3 @@
+engedy@chromium.org
+
+# COMPONENT: UI>Browser>Passwords
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc
index 1e40614..93d08fe 100644
--- a/components/password_manager/core/browser/login_database_unittest.cc
+++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -975,6 +975,8 @@
 
   base::Time now = base::Time::Now();
   base::TimeDelta one_day = base::TimeDelta::FromDays(1);
+  base::Time back_30_days = now - base::TimeDelta::FromDays(30);
+  base::Time back_31_days = now - base::TimeDelta::FromDays(31);
 
   // Create one with a 0 time.
   EXPECT_TRUE(
@@ -985,10 +987,13 @@
   EXPECT_TRUE(AddTimestampedLogin(&db(), "http://3.com", "foo3", now, true));
   EXPECT_TRUE(
       AddTimestampedLogin(&db(), "http://4.com", "foo4", now + one_day, true));
+  // Create one with 31 days old.
+  EXPECT_TRUE(
+      AddTimestampedLogin(&db(), "http://5.com", "foo5", back_31_days, true));
 
   // Verify inserts worked.
   EXPECT_TRUE(db().GetAutofillableLogins(&result));
-  EXPECT_EQ(4U, result.size());
+  EXPECT_EQ(5U, result.size());
   result.clear();
 
   // Get everything from today's date and on.
@@ -996,12 +1001,26 @@
   EXPECT_EQ(2U, result.size());
   result.clear();
 
+  // Get all logins created more than 30 days back.
+  EXPECT_TRUE(
+      db().GetLoginsCreatedBetween(base::Time(), back_30_days, &result));
+  EXPECT_EQ(2U, result.size());
+  result.clear();
+
   // Delete everything from today's date and on.
   db().RemoveLoginsCreatedBetween(now, base::Time());
 
-  // Should have deleted half of what we inserted.
+  // Should have deleted two logins.
   EXPECT_TRUE(db().GetAutofillableLogins(&result));
-  EXPECT_EQ(2U, result.size());
+  EXPECT_EQ(3U, result.size());
+  result.clear();
+
+  // Delete all logins created more than 30 days back.
+  db().RemoveLoginsCreatedBetween(base::Time(), back_30_days);
+
+  // Should have deleted two logins.
+  EXPECT_TRUE(db().GetAutofillableLogins(&result));
+  EXPECT_EQ(1U, result.size());
   result.clear();
 
   // Delete with 0 date (should delete all).
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc
index 8770c7a9a..2166d73 100644
--- a/components/password_manager/core/browser/test_password_store.cc
+++ b/components/password_manager/core/browser/test_password_store.cc
@@ -13,6 +13,7 @@
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/psl_matching_helper.h"
 #include "components/password_manager/core/browser/statistics_table.h"
+#include "url/gurl.h"
 
 namespace password_manager {
 
@@ -140,8 +141,16 @@
 std::vector<std::unique_ptr<autofill::PasswordForm>>
 TestPasswordStore::FillLoginsForSameOrganizationName(
     const std::string& signon_realm) {
-  NOTIMPLEMENTED();
-  return {};
+  // Note: To keep TestPasswordStore simple, and because no tests currently
+  // require anything more complex, this is a simplistic implementation which
+  // assumes that that the signon_realm is a serialised URL.
+  return FillMatchingLogins(FormDigest(autofill::PasswordForm::SCHEME_HTML,
+                                       signon_realm, GURL(signon_realm)));
+}
+
+std::vector<InteractionsStats> TestPasswordStore::GetSiteStatsImpl(
+    const GURL& origin_domain) {
+  return std::vector<InteractionsStats>();
 }
 
 void TestPasswordStore::ReportMetricsImpl(const std::string& sync_username,
@@ -198,10 +207,4 @@
   return std::vector<InteractionsStats>();
 }
 
-std::vector<InteractionsStats> TestPasswordStore::GetSiteStatsImpl(
-    const GURL& origin_domain) {
-  NOTIMPLEMENTED();
-  return std::vector<InteractionsStats>();
-}
-
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h
index db4838b..1c89ade 100644
--- a/components/password_manager/core/browser/test_password_store.h
+++ b/components/password_manager/core/browser/test_password_store.h
@@ -53,10 +53,12 @@
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
   bool FillBlacklistLogins(
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
-
-  // Unused portions of PasswordStore interface
   std::vector<std::unique_ptr<autofill::PasswordForm>>
   FillLoginsForSameOrganizationName(const std::string& signon_realm) override;
+  std::vector<InteractionsStats> GetSiteStatsImpl(
+      const GURL& origin_domain) override;
+
+  // Unused portions of PasswordStore interface
   void ReportMetricsImpl(const std::string& sync_username,
                          bool custom_passphrase_sync_enabled) override;
   PasswordStoreChangeList RemoveLoginsByURLAndTimeImpl(
@@ -78,8 +80,6 @@
   void AddSiteStatsImpl(const InteractionsStats& stats) override;
   void RemoveSiteStatsImpl(const GURL& origin_domain) override;
   std::vector<InteractionsStats> GetAllSiteStatsImpl() override;
-  std::vector<InteractionsStats> GetSiteStatsImpl(
-      const GURL& origin_domain) override;
 
  private:
   PasswordMap stored_passwords_;
diff --git a/components/sync_sessions/sessions_sync_manager.cc b/components/sync_sessions/sessions_sync_manager.cc
index 9972d472..3ce28eb 100644
--- a/components/sync_sessions/sessions_sync_manager.cc
+++ b/components/sync_sessions/sessions_sync_manager.cc
@@ -145,6 +145,11 @@
   return SyncedSession::TYPE_OTHER;
 }
 
+bool IsWindowSyncable(const SyncedWindowDelegate& window_delegate) {
+  return window_delegate.ShouldSync() && window_delegate.GetTabCount() &&
+         window_delegate.HasWindow();
+}
+
 }  // namespace
 
 // |local_device| is owned by ProfileSyncService, its lifetime exceeds
@@ -320,8 +325,41 @@
     }
   }
 
-  // TODO(skym): Scan for duplicate sync ids and remove,
-  // https://crbug.com/639009.
+  // Each sync id should only ever be used once. Previously there existed a race
+  // condition which could cause them to be duplicated, see
+  // https://crbug.com/639009 for more information. This counts the number of
+  // times each id is used so that the second window/tab loop can act on every
+  // tab using duplicate ids. Lastly, it is important to note that this
+  // duplication scan is only checking the in-memory tab state. On Android, if
+  // we have no tabbed window, we may also have sync data with conflicting sync
+  // ids, but to keep this logic simple and less error prone, we do not attempt
+  // to do anything clever.
+  std::map<int, size_t> sync_id_count;
+  int duplicate_count = 0;
+  for (auto& window_iter_pair : windows) {
+    const SyncedWindowDelegate* window_delegate = window_iter_pair.second;
+    if (IsWindowSyncable(*window_delegate)) {
+      for (int j = 0; j < window_delegate->GetTabCount(); ++j) {
+        SyncedTabDelegate* synced_tab = window_delegate->GetTabAt(j);
+        if (synced_tab &&
+            synced_tab->GetSyncId() != TabNodePool::kInvalidTabNodeID) {
+          auto iter = sync_id_count.find(synced_tab->GetSyncId());
+          if (iter == sync_id_count.end()) {
+            sync_id_count.insert(iter,
+                                 std::make_pair(synced_tab->GetSyncId(), 1));
+          } else {
+            // If an id is used more than twice, this count will be a bit odd,
+            // but for our purposes, it will be sufficient.
+            duplicate_count++;
+            iter->second++;
+          }
+        }
+      }
+    }
+  }
+  if (duplicate_count > 0) {
+    UMA_HISTOGRAM_COUNTS_100("Sync.SesssionsDuplicateSyncId", duplicate_count);
+  }
 
   for (auto& window_iter_pair : windows) {
     const SyncedWindowDelegate* window_delegate = window_iter_pair.second;
@@ -335,8 +373,7 @@
     // its possible for us to get a handle to a browser that is about to be
     // removed. If the tab count is 0 or the window is null, the browser is
     // about to be deleted, so we ignore it.
-    if (window_delegate->ShouldSync() && window_delegate->GetTabCount() &&
-        window_delegate->HasWindow()) {
+    if (IsWindowSyncable(*window_delegate)) {
       SessionID::id_type window_id = window_delegate->GetSessionId();
       DVLOG(1) << "Associating window " << window_id << " with "
                << window_delegate->GetTabCount() << " tabs.";
@@ -351,6 +388,20 @@
         if (!synced_tab || !ShouldSyncTabId(tab_id))
           continue;
 
+        if (synced_tab->GetSyncId() != TabNodePool::kInvalidTabNodeID) {
+          auto duplicate_iter = sync_id_count.find(synced_tab->GetSyncId());
+          DCHECK(duplicate_iter != sync_id_count.end());
+          if (duplicate_iter->second > 1) {
+            // Strip the id before processing it. This is going to mean it'll be
+            // treated the same as a new tab. If it's also a placeholder, we'll
+            // have no data about it, sync it cannot be synced until it is
+            // loaded. It is too difficult to try to guess which of the multiple
+            // tabs using the same id actually corresponds to the existing sync
+            // data.
+            synced_tab->SetSyncId(TabNodePool::kInvalidTabNodeID);
+          }
+        }
+
         // Placeholder tabs are those without WebContents, either because they
         // were never loaded into memory or they were evicted from memory
         // (typically only on Android devices). They only have a tab id,
@@ -1412,8 +1463,7 @@
        synced_window_delegates_getter()->GetSyncedWindowDelegates()) {
     if (window_iter_pair.second->IsTypeTabbed()) {
       const SyncedWindowDelegate* window_delegate = window_iter_pair.second;
-      if (window_delegate->ShouldSync() && window_delegate->GetTabCount() &&
-          window_delegate->HasWindow()) {
+      if (IsWindowSyncable(*window_delegate)) {
         // When only custom tab windows are open, often we'll have a seemingly
         // okay type tabbed window, but GetTabAt will return null for each
         // index. This case is exactly what this method needs to protect
diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc
index c47117a..ad466db 100644
--- a/components/sync_sessions/sessions_sync_manager_unittest.cc
+++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
@@ -1098,6 +1098,87 @@
   VerifyLocalHeaderChange(out[1], 2, 2);
 }
 
+// Create a placeholder and a non-placeholder that have the same sync ids. Only
+// the non-placeholder should survive. This state should be impossible for up
+// to date clients to enter.
+TEST_F(SessionsSyncManagerTest, ConflictingSyncIdsWithPlaceholder) {
+  syncer::SyncDataList in;
+  syncer::SyncChangeList out;
+
+  // First sync with one tab and one window.
+  TestSyncedWindowDelegate* window = AddWindow();
+  AddTab(window->GetSessionId(), kFoo1);
+  InitWithSyncDataTakeOutput(in, &out);
+
+  in = GetDataFromChanges(out);
+  int conflicting_sync_id =
+      out[1].sync_data().GetSpecifics().session().tab_node_id();
+  out.clear();
+  // There should be two entities, a header and a tab.
+  ASSERT_EQ(2U, in.size());
+
+  manager()->StopSyncing(syncer::SESSIONS);
+
+  // The main window's tab is now a placeholder, and we have a conflicting id
+  // for the custom tab. They should both have their tab ids reset, but the
+  // placeholder cannot be fixed, and will be dropped. Only the custom tab will
+  // show up now.
+  PlaceholderTabDelegate tab2(SessionID().id(), conflicting_sync_id);
+  window->OverrideTabAt(0, &tab2);
+
+  TestSyncedWindowDelegate* window2 = AddWindow();
+  SessionID new_window_id;
+  window2->OverrideWindowId(new_window_id.id());
+  window2->OverrideWindowTypeToCustomTab();
+  TestSyncedTabDelegate* tab3 = AddTab(window2->GetSessionId(), kBar1);
+  tab3->SetSyncId(conflicting_sync_id);
+  window2->OverrideTabAt(0, tab3);
+
+  InitWithSyncDataTakeOutput(ConvertToRemote(in), &out);
+
+  ASSERT_TRUE(ChangeTypeMatches(
+      out, {SyncChange::ACTION_ADD, SyncChange::ACTION_UPDATE}));
+  VerifyLocalTabChange(out[0], 1, kBar1);
+  VerifyLocalHeaderChange(out[1], 1, 1);
+}
+
+// Create two tabs with the same sync id, which is an invalid state. The manager
+// should strip both of the sync ids, and then new ones should be generated.
+// This state should be impossible for up to date clients to enter.
+TEST_F(SessionsSyncManagerTest, ConflictingSyncIdsBothReal) {
+  syncer::SyncDataList in;
+  syncer::SyncChangeList out;
+
+  TestSyncedWindowDelegate* window = AddWindow();
+  TestSyncedTabDelegate* tab1 = AddTab(window->GetSessionId(), kFoo1);
+  TestSyncedTabDelegate* tab2 = AddTab(window->GetSessionId(), kBar1);
+
+  // The pool wants to start vending numbers 0, 1, 2, ... etc. So we're
+  // guaranteed that when the manager clears the sync ids, it will be replaced
+  // with smaller values.
+  int dupe_sync_id = 13;
+  tab1->SetSyncId(dupe_sync_id);
+  tab2->SetSyncId(dupe_sync_id);
+
+  InitWithSyncDataTakeOutput(in, &out);
+  // Header creation, two tab creations, and header update.
+  ASSERT_TRUE(ChangeTypeMatches(
+      out, {SyncChange::ACTION_ADD, SyncChange::ACTION_ADD,
+            SyncChange::ACTION_ADD, SyncChange::ACTION_UPDATE}));
+  VerifyLocalHeaderChange(out[0], 0, 0);
+  VerifyLocalTabChange(out[1], 1, kFoo1);
+  VerifyLocalTabChange(out[2], 1, kBar1);
+  VerifyLocalHeaderChange(out[3], 1, 2);
+
+  // The sync ids should have been fixed.
+  EXPECT_NE(dupe_sync_id,
+            out[1].sync_data().GetSpecifics().session().tab_node_id());
+  EXPECT_NE(dupe_sync_id,
+            out[2].sync_data().GetSpecifics().session().tab_node_id());
+  EXPECT_NE(out[1].sync_data().GetSpecifics().session().tab_node_id(),
+            out[2].sync_data().GetSpecifics().session().tab_node_id());
+}
+
 // Tests MergeDataAndStartSyncing with sync data but no local data.
 TEST_F(SessionsSyncManagerTest, MergeWithInitialForeignSession) {
   std::vector<SessionID::id_type> tab_list1(std::begin(kTabIds1),
@@ -2532,9 +2613,10 @@
 }
 
 // Check the behavior for a placeholder tab in one window being mapped to the
-// same sync entity as a tab in another window. If the placeholder is associated
-// last, the original tab should be unmapped from the first window, and reused
-// by the placeholder in the new window..
+// same sync entity as a tab in another window. The order should not matter.
+// Instead, they both should have their sync data discarded, sync ids reset, and
+// then re-created where possible (not possible for the placeholder). Assuming a
+// well behaved client, this should never happen.
 TEST_F(SessionsSyncManagerTest, PlaceholderConflictAcrossWindows) {
   syncer::SyncDataList in;
   syncer::SyncChangeList out;
@@ -2559,25 +2641,18 @@
   out.clear();
   InitWithSyncDataTakeOutput(in, &out);
 
-  // The tab entity will be overwritten twice. Once with the information for
-  // tab 1 and then again with the information for tab 2. This will be followed
-  // by a header change reflecting only the final tab.
-  ASSERT_TRUE(
-      ChangeTypeMatches(out,
-                        {SyncChange::ACTION_UPDATE, SyncChange::ACTION_UPDATE,
-                         SyncChange::ACTION_UPDATE}));
-  VerifyLocalHeaderChange(out[2], 2, 1);
+  // The two tabs have the same sync id, which is not allowed. They will have
+  // their ids stripped and re-generated. But the placeholder cannot survive
+  // this and will not show up in results. Because we have potentially new sync
+  // ids, the essentially re-created tab will be an ADD.
+  ASSERT_TRUE(ChangeTypeMatches(
+      out, {SyncChange::ACTION_ADD, SyncChange::ACTION_UPDATE}));
+  VerifyLocalHeaderChange(out[1], 1, 1);
   VerifyLocalTabChange(out[0], 1, kFoo1);
-  EXPECT_EQ(sync_id, out[0].sync_data().GetSpecifics().session().tab_node_id());
   EXPECT_EQ(tab1->GetSessionId(),
             out[0].sync_data().GetSpecifics().session().tab().tab_id());
-  // Because tab 2 is a placeholder, tab 1's URL will be preserved.
-  VerifyLocalTabChange(out[1], 1, kFoo1);
-  EXPECT_EQ(sync_id, out[1].sync_data().GetSpecifics().session().tab_node_id());
-  EXPECT_EQ(tab2.GetSessionId(),
-            out[1].sync_data().GetSpecifics().session().tab().tab_id());
-  EXPECT_EQ(window2->GetSessionId(),
-            out[1].sync_data().GetSpecifics().session().tab().window_id());
+  EXPECT_EQ(tab1->GetSyncId(),
+            out[0].sync_data().GetSpecifics().session().tab_node_id());
 }
 
 // Tests that task ids are generated for navigations on local tabs.
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc
index 2a6960c..18ec32ed 100644
--- a/components/sync_sessions/synced_session_tracker.cc
+++ b/components/sync_sessions/synced_session_tracker.cc
@@ -140,8 +140,7 @@
   if (synced_session_map_.find(session_tag) != synced_session_map_.end())
     return synced_session_map_[session_tag].get();
 
-  std::unique_ptr<SyncedSession> synced_session =
-      std::make_unique<SyncedSession>();
+  auto synced_session = std::make_unique<SyncedSession>();
   DVLOG(1) << "Creating new session with tag " << session_tag << " at "
            << synced_session.get();
   synced_session->session_tag = session_tag;
@@ -335,8 +334,7 @@
                << "'s seen tab " << tab_id << " at " << tab_ptr << " " << title;
     }
   } else {
-    std::unique_ptr<sessions::SessionTab> tab =
-        std::make_unique<sessions::SessionTab>();
+    auto tab = std::make_unique<sessions::SessionTab>();
     tab_ptr = tab.get();
     tab->tab_id.set_id(tab_id);
     synced_tab_map_[session_tag][tab_id] = tab_ptr;
diff --git a/components/ui_devtools/views/dom_agent.cc b/components/ui_devtools/views/dom_agent.cc
index 39fe80d..3b353a5 100644
--- a/components/ui_devtools/views/dom_agent.cc
+++ b/components/ui_devtools/views/dom_agent.cc
@@ -87,7 +87,7 @@
   return attributes;
 }
 
-views::Widget* GetWidgetFromWindow(aura::Window* window) {
+views::Widget* GetWidgetFromWindow(gfx::NativeWindow window) {
   return views::Widget::GetWidgetForNativeView(window);
 }
 
@@ -540,10 +540,10 @@
     layer_for_highlighting_->set_delegate(this);
     layer_for_highlighting_->SetFillsBoundsOpaquely(false);
   }
-  std::pair<aura::Window*, gfx::Rect> window_and_bounds =
+  std::pair<gfx::NativeWindow, gfx::Rect> window_and_bounds =
       node_id_to_ui_element_.count(node_id)
           ? node_id_to_ui_element_[node_id]->GetNodeWindowAndBounds()
-          : std::make_pair<aura::Window*, gfx::Rect>(nullptr, gfx::Rect());
+          : std::make_pair<gfx::NativeWindow, gfx::Rect>(nullptr, gfx::Rect());
 
   if (!window_and_bounds.first)
     return Response::Error("No node found with that id");
@@ -558,25 +558,32 @@
   return Response::OK();
 }
 
-int DOMAgent::FindElementIdTargetedByPoint(const gfx::Point& p,
-                                           aura::Window* root_window) const {
-  aura::Window* targeted_window = root_window->GetEventHandlerForPoint(p);
+int DOMAgent::FindElementIdTargetedByPoint(
+    const gfx::Point& p,
+    gfx::NativeWindow root_window) const {
+  gfx::NativeWindow targeted_window = root_window->GetEventHandlerForPoint(p);
   if (!targeted_window)
     return 0;
 
   views::Widget* targeted_widget =
       views::Widget::GetWidgetForNativeWindow(targeted_window);
   if (!targeted_widget) {
+#if defined(USE_AURA)
     return window_element_root_->FindUIElementIdForBackendElement<aura::Window>(
         targeted_window);
+#else
+    return 0;
+#endif  // defined(USE_AURA)
   }
 
   views::View* root_view = targeted_widget->GetRootView();
   DCHECK(root_view);
 
   gfx::Point point_in_targeted_window(p);
+#if defined(USE_AURA)
   aura::Window::ConvertPointToTarget(root_window, targeted_window,
                                      &point_in_targeted_window);
+#endif  // defined(USE_AURA)
   views::View* targeted_view =
       root_view->GetEventHandlerForPoint(point_in_targeted_window);
   DCHECK(targeted_view);
@@ -585,9 +592,9 @@
 }
 
 void DOMAgent::ShowDistancesInHighlightOverlay(int pinned_id, int element_id) {
-  const std::pair<aura::Window*, gfx::Rect> pair_r2(
+  const std::pair<gfx::NativeWindow, gfx::Rect> pair_r2(
       node_id_to_ui_element_[element_id]->GetNodeWindowAndBounds());
-  const std::pair<aura::Window*, gfx::Rect> pair_r1(
+  const std::pair<gfx::NativeWindow, gfx::Rect> pair_r1(
       node_id_to_ui_element_[pinned_id]->GetNodeWindowAndBounds());
   gfx::Rect r2(pair_r2.second);
   gfx::Rect r1(pair_r1.second);
@@ -901,11 +908,11 @@
 }
 
 void DOMAgent::UpdateHighlight(
-    const std::pair<aura::Window*, gfx::Rect>& window_and_bounds) {
+    const std::pair<gfx::NativeWindow, gfx::Rect>& window_and_bounds) {
   display::Display display =
       display::Screen::GetScreen()->GetDisplayNearestWindow(
           window_and_bounds.first);
-  aura::Window* root = window_and_bounds.first->GetRootWindow();
+  gfx::NativeWindow root = window_and_bounds.first->GetRootWindow();
   layer_for_highlighting_->SetBounds(root->bounds());
   layer_for_highlighting_->SchedulePaint(root->bounds());
 
diff --git a/components/ui_devtools/views/dom_agent.h b/components/ui_devtools/views/dom_agent.h
index 440f7b9d..c6d54ea 100644
--- a/components/ui_devtools/views/dom_agent.h
+++ b/components/ui_devtools/views/dom_agent.h
@@ -10,6 +10,7 @@
 #include "components/ui_devtools/views/ui_element_delegate.h"
 #include "ui/aura/env_observer.h"
 #include "ui/compositor/layer_delegate.h"
+#include "ui/gfx/native_widget_types.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 
@@ -70,7 +71,7 @@
   void RemoveObserver(DOMAgentObserver* observer);
   UIElement* GetElementFromNodeId(int node_id);
   UIElement* window_element_root() const { return window_element_root_.get(); };
-  const std::vector<aura::Window*>& root_windows() const {
+  const std::vector<gfx::NativeWindow>& root_windows() const {
     return root_windows_;
   };
   HighlightRectsConfiguration highlight_rect_config() const {
@@ -84,7 +85,7 @@
   // exists), then the targeted view (if one exists). Return 0 if no valid
   // target is found.
   int FindElementIdTargetedByPoint(const gfx::Point& p,
-                                   aura::Window* root_window) const;
+                                   gfx::NativeWindow root_window) const;
 
   // Shows the distances between the nodes identified by |pinned_id| and
   // |element_id| in the highlight overlay.
@@ -119,7 +120,7 @@
   void RemoveDomNode(UIElement* ui_element);
   void Reset();
   void UpdateHighlight(
-      const std::pair<aura::Window*, gfx::Rect>& window_and_bounds);
+      const std::pair<gfx::NativeWindow, gfx::Rect>& window_and_bounds);
 
   std::unique_ptr<gfx::RenderText> render_text_;
   bool is_building_tree_;
diff --git a/components/ui_devtools/views/ui_element.h b/components/ui_devtools/views/ui_element.h
index 1df6182..9c70f32 100644
--- a/components/ui_devtools/views/ui_element.h
+++ b/components/ui_devtools/views/ui_element.h
@@ -8,8 +8,8 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "ui/aura/window.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/native_widget_types.h"
 #include "ui/views/view.h"
 
 namespace ui_devtools {
@@ -53,7 +53,7 @@
 
   // If element exists, return its associated native window and its bounds.
   // Otherwise, return null and empty bounds.
-  virtual std::pair<aura::Window*, gfx::Rect> GetNodeWindowAndBounds()
+  virtual std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndBounds()
       const = 0;
 
   template <typename BackingT, typename T>
diff --git a/components/ui_devtools/views/view_element.cc b/components/ui_devtools/views/view_element.cc
index 3c7e50c..e8778d4 100644
--- a/components/ui_devtools/views/view_element.cc
+++ b/components/ui_devtools/views/view_element.cc
@@ -83,7 +83,7 @@
   view_->SetVisible(visible);
 }
 
-std::pair<aura::Window*, gfx::Rect> ViewElement::GetNodeWindowAndBounds()
+std::pair<gfx::NativeWindow, gfx::Rect> ViewElement::GetNodeWindowAndBounds()
     const {
   return std::make_pair(view_->GetWidget()->GetNativeWindow(),
                         view_->GetBoundsInScreen());
diff --git a/components/ui_devtools/views/view_element.h b/components/ui_devtools/views/view_element.h
index 6576069d..4b0dccb 100644
--- a/components/ui_devtools/views/view_element.h
+++ b/components/ui_devtools/views/view_element.h
@@ -7,8 +7,8 @@
 
 #include "base/macros.h"
 #include "components/ui_devtools/views/ui_element.h"
-#include "ui/aura/window.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/native_widget_types.h"
 #include "ui/views/view.h"
 #include "ui/views/view_observer.h"
 
@@ -37,7 +37,8 @@
   void SetBounds(const gfx::Rect& bounds) override;
   void GetVisible(bool* visible) const override;
   void SetVisible(bool visible) override;
-  std::pair<aura::Window*, gfx::Rect> GetNodeWindowAndBounds() const override;
+  std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndBounds()
+      const override;
   static views::View* From(const UIElement* element);
 
  private:
diff --git a/components/ui_devtools/views/widget_element.cc b/components/ui_devtools/views/widget_element.cc
index fd5fa7ef..9b5792ce 100644
--- a/components/ui_devtools/views/widget_element.cc
+++ b/components/ui_devtools/views/widget_element.cc
@@ -61,7 +61,7 @@
     widget_->Hide();
 }
 
-std::pair<aura::Window*, gfx::Rect> WidgetElement::GetNodeWindowAndBounds()
+std::pair<gfx::NativeWindow, gfx::Rect> WidgetElement::GetNodeWindowAndBounds()
     const {
   return std::make_pair(widget_->GetNativeWindow(),
                         widget_->GetWindowBoundsInScreen());
diff --git a/components/ui_devtools/views/widget_element.h b/components/ui_devtools/views/widget_element.h
index 56aa0cf4..12ab4267 100644
--- a/components/ui_devtools/views/widget_element.h
+++ b/components/ui_devtools/views/widget_element.h
@@ -7,8 +7,8 @@
 
 #include "base/macros.h"
 #include "components/ui_devtools/views/ui_element.h"
-#include "ui/aura/window.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/native_widget_types.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 #include "ui/views/widget/widget_removals_observer.h"
@@ -41,7 +41,8 @@
   void SetBounds(const gfx::Rect& bounds) override;
   void GetVisible(bool* visible) const override;
   void SetVisible(bool visible) override;
-  std::pair<aura::Window*, gfx::Rect> GetNodeWindowAndBounds() const override;
+  std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndBounds()
+      const override;
 
   static views::Widget* From(const UIElement* element);
 
diff --git a/components/ui_devtools/views/window_element.cc b/components/ui_devtools/views/window_element.cc
index 2213ffb..5fd16ed 100644
--- a/components/ui_devtools/views/window_element.cc
+++ b/components/ui_devtools/views/window_element.cc
@@ -88,9 +88,10 @@
     window_->Hide();
 }
 
-std::pair<aura::Window*, gfx::Rect> WindowElement::GetNodeWindowAndBounds()
+std::pair<gfx::NativeWindow, gfx::Rect> WindowElement::GetNodeWindowAndBounds()
     const {
-  return std::make_pair(window_, window_->GetBoundsInScreen());
+  return std::make_pair(static_cast<aura::Window*>(window_),
+                        window_->GetBoundsInScreen());
 }
 
 // static
diff --git a/components/ui_devtools/views/window_element.h b/components/ui_devtools/views/window_element.h
index 06130ed..9463a80 100644
--- a/components/ui_devtools/views/window_element.h
+++ b/components/ui_devtools/views/window_element.h
@@ -10,6 +10,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/native_widget_types.h"
 
 namespace ui_devtools {
 
@@ -39,7 +40,8 @@
   void SetBounds(const gfx::Rect& bounds) override;
   void GetVisible(bool* visible) const override;
   void SetVisible(bool visible) override;
-  std::pair<aura::Window*, gfx::Rect> GetNodeWindowAndBounds() const override;
+  std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndBounds()
+      const override;
 
   static aura::Window* From(const UIElement* element);
 
diff --git a/content/app/BUILD.gn b/content/app/BUILD.gn
index d77f1ad..04d6d3a 100644
--- a/content/app/BUILD.gn
+++ b/content/app/BUILD.gn
@@ -16,6 +16,7 @@
   extra_configs = [
     "//build/config/compiler:wexit_time_destructors",
     "//content:content_implementation",
+    "//tools/v8_context_snapshot:use_v8_context_snapshot",
     "//v8:external_startup_data",
   ]
 
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc
index 61d3802..a36be8d5 100644
--- a/content/app/content_main_runner.cc
+++ b/content/app/content_main_runner.cc
@@ -169,39 +169,35 @@
 }
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
-void LoadV8ContextSnapshotFile() {
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
-  base::FileDescriptorStore& file_descriptor_store =
-      base::FileDescriptorStore::GetInstance();
-  base::MemoryMappedFile::Region region;
-  base::ScopedFD fd = file_descriptor_store.MaybeTakeFD(
-      kV8ContextSnapshotDataDescriptor, &region);
-  if (fd.is_valid()) {
-    gin::V8Initializer::LoadV8ContextSnapshotFromFD(fd.get(), region.offset,
-                                                    region.size);
-    return;
-  }
-#endif  // OS_POSIX && !OS_MACOSX
-#if !defined(CHROME_MULTIPLE_DLL_BROWSER)
-  gin::V8Initializer::LoadV8ContextSnapshot();
-#endif  // !CHROME_MULTIPLE_DLL_BROWSER
-}
 
 void LoadV8SnapshotFile() {
+#if defined(USE_V8_CONTEXT_SNAPSHOT)
+  static constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+      gin::V8Initializer::V8SnapshotFileType::kWithAdditionalContext;
+  static const char* snapshot_data_descriptor =
+      kV8ContextSnapshotDataDescriptor;
+#else
+  static constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+      gin::V8Initializer::V8SnapshotFileType::kDefault;
+  static const char* snapshot_data_descriptor = kV8SnapshotDataDescriptor;
+#endif  // USE_V8_CONTEXT_SNAPSHOT
+  ALLOW_UNUSED_LOCAL(kSnapshotType);
+  ALLOW_UNUSED_LOCAL(snapshot_data_descriptor);
+
 #if defined(OS_POSIX) && !defined(OS_MACOSX)
   base::FileDescriptorStore& file_descriptor_store =
       base::FileDescriptorStore::GetInstance();
   base::MemoryMappedFile::Region region;
   base::ScopedFD fd =
-      file_descriptor_store.MaybeTakeFD(kV8SnapshotDataDescriptor, &region);
+      file_descriptor_store.MaybeTakeFD(snapshot_data_descriptor, &region);
   if (fd.is_valid()) {
     gin::V8Initializer::LoadV8SnapshotFromFD(fd.get(), region.offset,
-                                             region.size);
+                                             region.size, kSnapshotType);
     return;
   }
 #endif  // OS_POSIX && !OS_MACOSX
 #if !defined(CHROME_MULTIPLE_DLL_BROWSER)
-  gin::V8Initializer::LoadV8Snapshot();
+  gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
 #endif  // !CHROME_MULTIPLE_DLL_BROWSER
 }
 
@@ -232,7 +228,6 @@
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
   LoadV8SnapshotFile();
   LoadV8NativesFile();
-  LoadV8ContextSnapshotFile();
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 }
 
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index afd9dc77..9b1fbc4d 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -632,7 +632,7 @@
   if (GetContentClient()->browser()->ShouldCreateTaskScheduler()) {
     // Use an empty string as TaskScheduler name to match the suffix of browser
     // process TaskScheduler histograms.
-    base::TaskScheduler::Create("");
+    base::TaskScheduler::Create("Browser");
   }
 }
 
diff --git a/content/browser/device_sensors/device_sensor_browsertest.cc b/content/browser/device_sensors/device_sensor_browsertest.cc
index bb4b9cc..9e1a2bc 100644
--- a/content/browser/device_sensors/device_sensor_browsertest.cc
+++ b/content/browser/device_sensors/device_sensor_browsertest.cc
@@ -48,6 +48,15 @@
     shared_buffer_handle_ = mojo::SharedBufferHandle::Create(
         sizeof(device::SensorReadingSharedBuffer) *
         static_cast<uint64_t>(device::mojom::SensorType::LAST));
+
+    if (!shared_buffer_handle_.is_valid())
+      return;
+
+    // Create read/write mapping now, to ensure it is kept writable
+    // after the region is sealed read-only on Android.
+    shared_buffer_mapping_ = shared_buffer_handle_->MapAtOffset(
+        device::mojom::SensorInitParams::kReadBufferSizeForTests,
+        GetBufferOffset());
   }
 
   ~FakeSensor() override = default;
@@ -104,16 +113,13 @@
   void set_reading(device::SensorReading reading) { reading_ = reading; }
 
   void SensorReadingChanged() {
-    if (!shared_buffer_handle_.is_valid())
+    if (!shared_buffer_mapping_.get())
       return;
 
-    mojo::ScopedSharedBufferMapping shared_buffer =
-        shared_buffer_handle_->MapAtOffset(
-            device::mojom::SensorInitParams::kReadBufferSizeForTests,
-            GetBufferOffset());
-
     device::SensorReadingSharedBuffer* buffer =
-        static_cast<device::SensorReadingSharedBuffer*>(shared_buffer.get());
+        static_cast<device::SensorReadingSharedBuffer*>(
+            shared_buffer_mapping_.get());
+
     auto& seqlock = buffer->seqlock.value();
     seqlock.WriteBegin();
     buffer->reading = reading_;
@@ -127,6 +133,7 @@
   device::mojom::SensorType sensor_type_;
   bool reading_notification_enabled_ = true;
   mojo::ScopedSharedBufferHandle shared_buffer_handle_;
+  mojo::ScopedSharedBufferMapping shared_buffer_mapping_;
   device::mojom::SensorClientPtr client_;
   device::SensorReading reading_;
 
diff --git a/content/browser/generic_sensor_browsertest.cc b/content/browser/generic_sensor_browsertest.cc
index 06a08be..b7f06a4 100644
--- a/content/browser/generic_sensor_browsertest.cc
+++ b/content/browser/generic_sensor_browsertest.cc
@@ -43,6 +43,15 @@
     shared_buffer_handle_ = mojo::SharedBufferHandle::Create(
         sizeof(device::SensorReadingSharedBuffer) *
         static_cast<uint64_t>(device::mojom::SensorType::LAST));
+
+    if (!shared_buffer_handle_.is_valid())
+      return;
+
+    // Create read/write mapping now, to ensure it is kept writable
+    // after the region is sealed read-only on Android.
+    shared_buffer_mapping_ = shared_buffer_handle_->MapAtOffset(
+        device::mojom::SensorInitParams::kReadBufferSizeForTests,
+        GetBufferOffset());
   }
 
   ~FakeAmbientLightSensor() override = default;
@@ -98,21 +107,17 @@
   }
 
   void SensorReadingChanged() {
-    if (!shared_buffer_handle_.is_valid())
+    if (!shared_buffer_mapping_.get())
       return;
 
-    mojo::ScopedSharedBufferMapping shared_buffer =
-        shared_buffer_handle_->MapAtOffset(
-            device::mojom::SensorInitParams::kReadBufferSizeForTests,
-            GetBufferOffset());
-
     device::SensorReading reading;
     reading.als.timestamp =
         (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
     reading.als.value = 50;
 
     device::SensorReadingSharedBuffer* buffer =
-        static_cast<device::SensorReadingSharedBuffer*>(shared_buffer.get());
+        static_cast<device::SensorReadingSharedBuffer*>(
+            shared_buffer_mapping_.get());
     auto& seqlock = buffer->seqlock.value();
     seqlock.WriteBegin();
     buffer->reading = reading;
@@ -124,6 +129,7 @@
 
  private:
   mojo::ScopedSharedBufferHandle shared_buffer_handle_;
+  mojo::ScopedSharedBufferMapping shared_buffer_mapping_;
   device::mojom::SensorClientPtr client_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeAmbientLightSensor);
diff --git a/content/browser/loader/url_loader_factory_impl.h b/content/browser/loader/url_loader_factory_impl.h
index cf63a76..1acb44b 100644
--- a/content/browser/loader/url_loader_factory_impl.h
+++ b/content/browser/loader/url_loader_factory_impl.h
@@ -37,8 +37,6 @@
   void Clone(network::mojom::URLLoaderFactoryRequest request) override;
 
  private:
-  void OnConnectionError();
-
   mojo::BindingSet<network::mojom::URLLoaderFactory> bindings_;
 
   scoped_refptr<ResourceRequesterInfo> requester_info_;
diff --git a/content/browser/media/media_devices_util.cc b/content/browser/media/media_devices_util.cc
index 0bcc543..9440bc7 100644
--- a/content/browser/media/media_devices_util.cc
+++ b/content/browser/media/media_devices_util.cc
@@ -15,6 +15,7 @@
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/media_device_id.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/common/media_stream_request.h"
 #include "media/base/media_switches.h"
@@ -126,4 +127,34 @@
       frame_host ? frame_host->GetLastCommittedOrigin() : url::Origin());
 }
 
+MediaDeviceInfo TranslateMediaDeviceInfo(bool has_permission,
+                                         const std::string& device_id_salt,
+                                         const std::string& group_id_salt,
+                                         const url::Origin& security_origin,
+                                         const MediaDeviceInfo& device_info) {
+  return MediaDeviceInfo(
+      GetHMACForMediaDeviceID(device_id_salt, security_origin,
+                              device_info.device_id),
+      has_permission ? device_info.label : std::string(),
+      device_info.group_id.empty()
+          ? std::string()
+          : GetHMACForMediaDeviceID(group_id_salt, security_origin,
+                                    device_info.group_id));
+}
+
+MediaDeviceInfoArray TranslateMediaDeviceInfoArray(
+    bool has_permission,
+    const std::string& device_id_salt,
+    const std::string& group_id_salt,
+    const url::Origin& security_origin,
+    const MediaDeviceInfoArray& device_infos) {
+  MediaDeviceInfoArray result;
+  for (const auto& device_info : device_infos) {
+    result.push_back(TranslateMediaDeviceInfo(has_permission, device_id_salt,
+                                              group_id_salt, security_origin,
+                                              device_info));
+  }
+  return result;
+}
+
 }  // namespace content
diff --git a/content/browser/media/media_devices_util.h b/content/browser/media/media_devices_util.h
index d41caec..c43e690 100644
--- a/content/browser/media/media_devices_util.h
+++ b/content/browser/media/media_devices_util.h
@@ -32,6 +32,26 @@
     int render_process_id,
     int render_frame_id);
 
+// Returns a translated version of |device_info| suitable for use in a renderer
+// process.
+// The |device_id| field is hashed using |device_id_salt| and |security_origin|.
+// The |group_id| field is hashed using |group_id_salt| and |security_origin|.
+// The |label| field is removed if |has_permission| is false.
+MediaDeviceInfo TranslateMediaDeviceInfo(bool has_permission,
+                                         const std::string& device_id_salt,
+                                         const std::string& group_id_salt,
+                                         const url::Origin& security_origin,
+                                         const MediaDeviceInfo& device_info);
+
+// Returns a translated version of |device_infos|, with each element translated
+// using TranslateMediaDeviceInfo().
+MediaDeviceInfoArray TranslateMediaDeviceInfoArray(
+    bool has_permission,
+    const std::string& device_id_salt,
+    const std::string& group_id_salt,
+    const url::Origin& security_origin,
+    const MediaDeviceInfoArray& device_infos);
+
 // Type definition to make it easier to use mock alternatives to
 // GetMediaDeviceSaltAndOrigin.
 using MediaDeviceSaltAndOriginCallback =
diff --git a/content/browser/renderer_host/media/media_devices_dispatcher_host.cc b/content/browser/renderer_host/media/media_devices_dispatcher_host.cc
index 3442238..9fb51430 100644
--- a/content/browser/renderer_host/media/media_devices_dispatcher_host.cc
+++ b/content/browser/renderer_host/media/media_devices_dispatcher_host.cc
@@ -44,36 +44,6 @@
 // Frame rates for sources with no support for capability enumeration.
 const int kFallbackVideoFrameRates[] = {30, 60};
 
-MediaDeviceInfo TranslateDeviceInfo(bool has_permission,
-                                    const std::string& device_id_salt,
-                                    const std::string& group_id_salt,
-                                    const url::Origin& security_origin,
-                                    const MediaDeviceInfo& device_info) {
-  return MediaDeviceInfo(
-      GetHMACForMediaDeviceID(device_id_salt, security_origin,
-                              device_info.device_id),
-      has_permission ? device_info.label : std::string(),
-      device_info.group_id.empty()
-          ? std::string()
-          : GetHMACForMediaDeviceID(group_id_salt, security_origin,
-                                    device_info.group_id));
-}
-
-MediaDeviceInfoArray TranslateMediaDeviceInfoArray(
-    bool has_permission,
-    const std::string& device_id_salt,
-    const std::string& group_id_salt,
-    const url::Origin& security_origin,
-    const MediaDeviceInfoArray& input) {
-  MediaDeviceInfoArray result;
-  for (const auto& device_info : input) {
-    result.push_back(TranslateDeviceInfo(has_permission, device_id_salt,
-                                         group_id_salt, security_origin,
-                                         device_info));
-  }
-  return result;
-}
-
 blink::mojom::FacingMode ToFacingMode(media::VideoFacingMode facing_mode) {
   switch (facing_mode) {
     case media::MEDIA_VIDEO_FACING_NONE:
@@ -131,8 +101,6 @@
       group_id_salt_base_(BrowserContext::CreateRandomMediaDeviceIDSalt()),
       media_stream_manager_(media_stream_manager),
       num_pending_audio_input_parameters_(0),
-      salt_and_origin_callback_(
-          base::BindRepeating(&GetMediaDeviceSaltAndOrigin)),
       weak_factory_(this) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 }
@@ -171,14 +139,9 @@
   devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = request_video_input;
   devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = request_audio_output;
 
-  base::PostTaskAndReplyWithResult(
-      BrowserThread::GetTaskRunnerForThread(BrowserThread::UI).get(), FROM_HERE,
-      base::BindOnce(salt_and_origin_callback_, render_process_id_,
-                     render_frame_id_),
-      base::BindOnce(
-          &MediaDevicesDispatcherHost::CheckPermissionsForEnumerateDevices,
-          weak_factory_.GetWeakPtr(), devices_to_enumerate,
-          base::Passed(&client_callback)));
+  media_stream_manager_->media_devices_manager()->EnumerateDevices(
+      render_process_id_, render_frame_id_, group_id_salt_base_,
+      devices_to_enumerate, std::move(client_callback));
 }
 
 void MediaDevicesDispatcherHost::GetVideoInputCapabilities(
@@ -186,8 +149,9 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   base::PostTaskAndReplyWithResult(
       BrowserThread::GetTaskRunnerForThread(BrowserThread::UI).get(), FROM_HERE,
-      base::BindOnce(salt_and_origin_callback_, render_process_id_,
-                     render_frame_id_),
+      base::BindOnce(media_stream_manager_->media_devices_manager()
+                         ->salt_and_origin_callback(),
+                     render_process_id_, render_frame_id_),
       base::BindOnce(&MediaDevicesDispatcherHost::GetDefaultVideoInputDeviceID,
                      weak_factory_.GetWeakPtr(),
                      base::Passed(&client_callback)));
@@ -213,8 +177,9 @@
     GetAudioInputCapabilitiesCallback client_callback) {
   base::PostTaskAndReplyWithResult(
       BrowserThread::GetTaskRunnerForThread(BrowserThread::UI).get(), FROM_HERE,
-      base::BindOnce(salt_and_origin_callback_, render_process_id_,
-                     render_frame_id_),
+      base::BindOnce(media_stream_manager_->media_devices_manager()
+                         ->salt_and_origin_callback(),
+                     render_process_id_, render_frame_id_),
       base::BindOnce(&MediaDevicesDispatcherHost::GetDefaultAudioInputDeviceID,
                      weak_factory_.GetWeakPtr(),
                      base::Passed(&client_callback)));
@@ -296,9 +261,10 @@
       return;
   }
 
-  const auto& salt_and_origin =
-      salt_and_origin_callback_.Run(render_process_id_, render_frame_id_);
-  std::string group_id_salt = ComputeGroupIDSalt(salt_and_origin.first);
+  const auto& salt_and_origin = media_stream_manager_->media_devices_manager()
+                                    ->salt_and_origin_callback()
+                                    .Run(render_process_id_, render_frame_id_);
+  std::string group_id_salt = group_id_salt_base_ + salt_and_origin.first;
   for (uint32_t subscription_id : subscriptions) {
     bool has_permission = media_stream_manager_->media_devices_manager()
                               ->media_devices_permission_checker()
@@ -318,59 +284,6 @@
   device_change_listener_ = std::move(listener);
 }
 
-void MediaDevicesDispatcherHost::CheckPermissionsForEnumerateDevices(
-    const MediaDevicesManager::BoolDeviceTypes& requested_types,
-    EnumerateDevicesCallback client_callback,
-    const std::pair<std::string, url::Origin>& salt_and_origin) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  media_stream_manager_->media_devices_manager()
-      ->media_devices_permission_checker()
-      ->CheckPermissions(
-          requested_types, render_process_id_, render_frame_id_,
-          base::BindOnce(&MediaDevicesDispatcherHost::DoEnumerateDevices,
-                         weak_factory_.GetWeakPtr(), requested_types,
-                         base::Passed(&client_callback), salt_and_origin.first,
-                         salt_and_origin.second));
-}
-
-void MediaDevicesDispatcherHost::DoEnumerateDevices(
-    const MediaDevicesManager::BoolDeviceTypes& requested_types,
-    EnumerateDevicesCallback client_callback,
-    std::string device_id_salt,
-    const url::Origin& security_origin,
-    const MediaDevicesManager::BoolDeviceTypes& has_permissions) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  media_stream_manager_->media_devices_manager()->EnumerateDevices(
-      requested_types,
-      base::Bind(&MediaDevicesDispatcherHost::DevicesEnumerated,
-                 weak_factory_.GetWeakPtr(), requested_types,
-                 base::Passed(&client_callback), std::move(device_id_salt),
-                 security_origin, has_permissions));
-}
-
-void MediaDevicesDispatcherHost::DevicesEnumerated(
-    const MediaDevicesManager::BoolDeviceTypes& requested_types,
-    EnumerateDevicesCallback client_callback,
-    const std::string& device_id_salt,
-    const url::Origin& security_origin,
-    const MediaDevicesManager::BoolDeviceTypes& has_permissions,
-    const MediaDeviceEnumeration& enumeration) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  std::string group_id_salt = ComputeGroupIDSalt(device_id_salt);
-  std::vector<std::vector<MediaDeviceInfo>> result(NUM_MEDIA_DEVICE_TYPES);
-  for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) {
-    if (!requested_types[i])
-      continue;
-
-    for (const auto& device_info : enumeration[i]) {
-      result[i].push_back(TranslateDeviceInfo(has_permissions[i],
-                                              device_id_salt, group_id_salt,
-                                              security_origin, device_info));
-    }
-  }
-  std::move(client_callback).Run(result);
-}
-
 void MediaDevicesDispatcherHost::GetDefaultVideoInputDeviceID(
     GetVideoInputCapabilitiesCallback client_callback,
     const std::pair<std::string, url::Origin>& salt_and_origin) {
@@ -441,8 +354,9 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   base::PostTaskAndReplyWithResult(
       BrowserThread::GetTaskRunnerForThread(BrowserThread::UI).get(), FROM_HERE,
-      base::BindOnce(salt_and_origin_callback_, render_process_id_,
-                     render_frame_id_),
+      base::BindOnce(media_stream_manager_->media_devices_manager()
+                         ->salt_and_origin_callback(),
+                     render_process_id_, render_frame_id_),
       base::BindOnce(
           &MediaDevicesDispatcherHost::EnumerateVideoDevicesForFormats,
           weak_factory_.GetWeakPtr(), base::Passed(&client_callback), device_id,
@@ -623,9 +537,4 @@
   pending_audio_input_capabilities_requests_.clear();
 }
 
-std::string MediaDevicesDispatcherHost::ComputeGroupIDSalt(
-    const std::string& device_id_salt) {
-  return group_id_salt_base_ + device_id_salt;
-}
-
 }  // namespace content
diff --git a/content/browser/renderer_host/media/media_devices_dispatcher_host.h b/content/browser/renderer_host/media/media_devices_dispatcher_host.h
index 75da3473..6db42f5 100644
--- a/content/browser/renderer_host/media/media_devices_dispatcher_host.h
+++ b/content/browser/renderer_host/media/media_devices_dispatcher_host.h
@@ -65,35 +65,10 @@
   void SetDeviceChangeListenerForTesting(
       blink::mojom::MediaDevicesListenerPtr listener);
 
-  void set_salt_and_origin_callback_for_testing(
-      MediaDeviceSaltAndOriginCallback callback) {
-    salt_and_origin_callback_ = std::move(callback);
-  }
-
  private:
   using GetVideoInputDeviceFormatsCallback =
       GetAllVideoInputDeviceFormatsCallback;
 
-  void CheckPermissionsForEnumerateDevices(
-      const MediaDevicesManager::BoolDeviceTypes& requested_types,
-      EnumerateDevicesCallback client_callback,
-      const std::pair<std::string, url::Origin>& salt_and_origin);
-
-  void DoEnumerateDevices(
-      const MediaDevicesManager::BoolDeviceTypes& requested_types,
-      EnumerateDevicesCallback client_callback,
-      std::string device_id_salt,
-      const url::Origin& security_origin,
-      const MediaDevicesManager::BoolDeviceTypes& has_permissions);
-
-  void DevicesEnumerated(
-      const MediaDevicesManager::BoolDeviceTypes& requested_types,
-      EnumerateDevicesCallback client_callback,
-      const std::string& device_id_salt,
-      const url::Origin& security_origin,
-      const MediaDevicesManager::BoolDeviceTypes& has_permissions,
-      const MediaDeviceEnumeration& enumeration);
-
   void GetDefaultVideoInputDeviceID(
       GetVideoInputCapabilitiesCallback client_callback,
       const std::pair<std::string, url::Origin>& salt_and_origin);
@@ -154,8 +129,6 @@
                                     MediaDeviceType type,
                                     const MediaDeviceInfoArray& device_infos);
 
-  std::string ComputeGroupIDSalt(const std::string& device_id_salt);
-
   // The following const fields can be accessed on any thread.
   const int render_process_id_;
   const int render_frame_id_;
@@ -180,9 +153,6 @@
   std::vector<blink::mojom::AudioInputDeviceCapabilities>
       current_audio_input_capabilities_;
 
-  // Callback used to obtain the current device ID salt and security origin.
-  MediaDeviceSaltAndOriginCallback salt_and_origin_callback_;
-
   base::WeakPtrFactory<MediaDevicesDispatcherHost> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(MediaDevicesDispatcherHost);
diff --git a/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc
index 8c7f036..0d46aec 100644
--- a/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc
+++ b/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc
@@ -114,9 +114,10 @@
         std::move(video_capture_provider));
     host_ = std::make_unique<MediaDevicesDispatcherHost>(
         kProcessId, kRenderId, media_stream_manager_.get());
-    host_->set_salt_and_origin_callback_for_testing(
-        base::Bind(&MediaDevicesDispatcherHostTest::GetSaltAndOrigin,
-                   base::Unretained(this)));
+    media_stream_manager_->media_devices_manager()
+        ->set_salt_and_origin_callback_for_testing(base::BindRepeating(
+            &MediaDevicesDispatcherHostTest::GetSaltAndOrigin,
+            base::Unretained(this)));
   }
   ~MediaDevicesDispatcherHostTest() override { audio_manager_->Shutdown(); }
 
diff --git a/content/browser/renderer_host/media/media_devices_manager.cc b/content/browser/renderer_host/media/media_devices_manager.cc
index 5282728..38c697d 100644
--- a/content/browser/renderer_host/media/media_devices_manager.cc
+++ b/content/browser/renderer_host/media/media_devices_manager.cc
@@ -158,6 +158,8 @@
       permission_checker_(std::make_unique<MediaDevicesPermissionChecker>()),
       cache_infos_(NUM_MEDIA_DEVICE_TYPES),
       monitoring_started_(false),
+      salt_and_origin_callback_(
+          base::BindRepeating(&GetMediaDeviceSaltAndOrigin)),
       weak_factory_(this) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(audio_system_);
@@ -189,6 +191,24 @@
     ProcessRequests();
 }
 
+void MediaDevicesManager::EnumerateDevices(
+    int render_process_id,
+    int render_frame_id,
+    const std::string& group_id_salt_base,
+    const BoolDeviceTypes& requested_types,
+    EnumerateDevicesCallback callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  base::PostTaskAndReplyWithResult(
+      BrowserThread::GetTaskRunnerForThread(BrowserThread::UI).get(), FROM_HERE,
+      base::BindOnce(salt_and_origin_callback_, render_process_id,
+                     render_frame_id),
+      base::BindOnce(&MediaDevicesManager::CheckPermissionsForEnumerateDevices,
+                     weak_factory_.GetWeakPtr(), render_process_id,
+                     render_frame_id, group_id_salt_base, requested_types,
+                     base::Passed(&callback)));
+}
+
 void MediaDevicesManager::SubscribeDeviceChangeNotifications(
     MediaDeviceType type,
     MediaDeviceChangeSubscriber* subscriber) {
@@ -318,6 +338,62 @@
   permission_checker_ = std::move(permission_checker);
 }
 
+void MediaDevicesManager::CheckPermissionsForEnumerateDevices(
+    int render_process_id,
+    int render_frame_id,
+    const std::string& group_id_salt_base,
+    const BoolDeviceTypes& requested_types,
+    EnumerateDevicesCallback callback,
+    const std::pair<std::string, url::Origin>& salt_and_origin) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  permission_checker_->CheckPermissions(
+      requested_types, render_process_id, render_frame_id,
+      base::BindOnce(&MediaDevicesManager::OnPermissionsCheckDone,
+                     weak_factory_.GetWeakPtr(), group_id_salt_base,
+                     requested_types, base::Passed(&callback),
+                     salt_and_origin.first, salt_and_origin.second));
+}
+
+void MediaDevicesManager::OnPermissionsCheckDone(
+    const std::string& group_id_salt_base,
+    const MediaDevicesManager::BoolDeviceTypes& requested_types,
+    EnumerateDevicesCallback callback,
+    const std::string& device_id_salt,
+    const url::Origin& security_origin,
+    const MediaDevicesManager::BoolDeviceTypes& has_permissions) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  EnumerateDevices(
+      requested_types,
+      base::BindRepeating(&MediaDevicesManager::OnDevicesEnumerated,
+                          weak_factory_.GetWeakPtr(), group_id_salt_base,
+                          requested_types, base::Passed(&callback),
+                          device_id_salt, security_origin, has_permissions));
+}
+
+void MediaDevicesManager::OnDevicesEnumerated(
+    const std::string& group_id_salt_base,
+    const MediaDevicesManager::BoolDeviceTypes& requested_types,
+    EnumerateDevicesCallback callback,
+    const std::string& device_id_salt,
+    const url::Origin& security_origin,
+    const MediaDevicesManager::BoolDeviceTypes& has_permissions,
+    const MediaDeviceEnumeration& enumeration) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  std::string group_id_salt = group_id_salt_base + device_id_salt;
+  std::vector<MediaDeviceInfoArray> result(NUM_MEDIA_DEVICE_TYPES);
+  for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) {
+    if (!requested_types[i])
+      continue;
+
+    for (const auto& device_info : enumeration[i]) {
+      result[i].push_back(TranslateMediaDeviceInfo(
+          has_permissions[i], device_id_salt, group_id_salt, security_origin,
+          device_info));
+    }
+  }
+  std::move(callback).Run(result);
+}
+
 void MediaDevicesManager::DoEnumerateDevices(MediaDeviceType type) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(IsValidMediaDeviceType(type));
diff --git a/content/browser/renderer_host/media/media_devices_manager.h b/content/browser/renderer_host/media/media_devices_manager.h
index 4afa813..1e74a41 100644
--- a/content/browser/renderer_host/media/media_devices_manager.h
+++ b/content/browser/renderer_host/media/media_devices_manager.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/system_monitor/system_monitor.h"
+#include "content/browser/media/media_devices_util.h"
 #include "content/common/content_export.h"
 #include "content/common/media/media_devices.h"
 #include "media/audio/audio_device_description.h"
@@ -60,6 +61,8 @@
 
   using EnumerationCallback =
       base::Callback<void(const MediaDeviceEnumeration&)>;
+  using EnumerateDevicesCallback =
+      base::OnceCallback<void(const std::vector<MediaDeviceInfoArray>&)>;
 
   MediaDevicesManager(
       media::AudioSystem* audio_system,
@@ -77,6 +80,18 @@
   void EnumerateDevices(const BoolDeviceTypes& requested_types,
                         const EnumerationCallback& callback);
 
+  // Performs a possibly cached device enumeration for the requested device
+  // types and reports the results to |callback|. The enumeration results are
+  // translated for use by the renderer process and frame identified with
+  // |render_process_id| and |render_frame_id|, based on the frame origin's
+  // permissions, an internal media-device salt, and the given
+  // |group_id_salt_base|.
+  void EnumerateDevices(int render_process_id,
+                        int render_frame_id,
+                        const std::string& group_id_salt_base,
+                        const BoolDeviceTypes& requested_types,
+                        EnumerateDevicesCallback callback);
+
   // Subscribes |subscriber| to receive device-change notifications for devices
   // of type |type|. If |subscriber| is already subscribed, this function has
   // no side effects. MediaDevicesManager does not own |subscriber|. It is the
@@ -115,9 +130,17 @@
 
   MediaDevicesPermissionChecker* media_devices_permission_checker();
 
+  const MediaDeviceSaltAndOriginCallback& salt_and_origin_callback() const {
+    return salt_and_origin_callback_;
+  }
+
   // Used for testing only.
   void SetPermissionChecker(
       std::unique_ptr<MediaDevicesPermissionChecker> permission_checker);
+  void set_salt_and_origin_callback_for_testing(
+      MediaDeviceSaltAndOriginCallback callback) {
+    salt_and_origin_callback_ = std::move(callback);
+  }
 
  private:
   friend class MediaDevicesManagerTest;
@@ -137,6 +160,30 @@
   // Manually sets a caching policy for a given device type.
   void SetCachePolicy(MediaDeviceType type, CachePolicy policy);
 
+  // Helpers to handle enumeration results for a renderer process.
+  void CheckPermissionsForEnumerateDevices(
+      int render_process_id,
+      int render_frame_id,
+      const std::string& group_id_salt_base,
+      const BoolDeviceTypes& requested_types,
+      EnumerateDevicesCallback callback,
+      const std::pair<std::string, url::Origin>& salt_and_origin);
+  void OnPermissionsCheckDone(
+      const std::string& group_id_salt_base,
+      const MediaDevicesManager::BoolDeviceTypes& requested_types,
+      EnumerateDevicesCallback callback,
+      const std::string& device_id_salt,
+      const url::Origin& security_origin,
+      const MediaDevicesManager::BoolDeviceTypes& has_permissions);
+  void OnDevicesEnumerated(
+      const std::string& group_id_salt_base,
+      const MediaDevicesManager::BoolDeviceTypes& requested_types,
+      EnumerateDevicesCallback callback,
+      const std::string& device_id_salt,
+      const url::Origin& security_origin,
+      const MediaDevicesManager::BoolDeviceTypes& has_permissions,
+      const MediaDeviceEnumeration& enumeration);
+
   // Helpers to issue low-level device enumerations.
   void DoEnumerateDevices(MediaDeviceType type);
   void EnumerateAudioDevices(bool is_input);
@@ -191,6 +238,9 @@
   std::vector<MediaDeviceChangeSubscriber*>
       device_change_subscribers_[NUM_MEDIA_DEVICE_TYPES];
 
+  // Callback used to obtain the current device ID salt and security origin.
+  MediaDeviceSaltAndOriginCallback salt_and_origin_callback_;
+
   base::WeakPtrFactory<MediaDevicesManager> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(MediaDevicesManager);
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index de4514b..1339af7f 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -63,14 +63,12 @@
     0xB8, 0x8C, 0x25, 0xDB, 0x9E, 0x60, 0x26, 0x45, 0xF1, 0x41};
 
 constexpr char kTestRegisterClientDataJsonString[] =
-    R"({"challenge":"aHE0loIi7BcgLkJQX47SsWriLxa7BbiMJdueYCZF8UE",)"
-    R"("hashAlgorithm":"SHA-256","origin":"google.com","tokenBinding":)"
-    R"("unused","type":"webauthn.create"})";
+    R"({"challenge":"aHE0loIi7BcgLkJQX47SsWriLxa7BbiMJdueYCZF8UE","origin":)"
+    R"("google.com","tokenBinding":"unused","type":"webauthn.create"})";
 
 constexpr char kTestSignClientDataJsonString[] =
-    R"({"challenge":"aHE0loIi7BcgLkJQX47SsWriLxa7BbiMJdueYCZF8UE",)"
-    R"("hashAlgorithm":"SHA-256","origin":"google.com","tokenBinding":)"
-    R"("unused","type":"webauthn.get"})";
+    R"({"challenge":"aHE0loIi7BcgLkJQX47SsWriLxa7BbiMJdueYCZF8UE","origin":)"
+    R"("google.com","tokenBinding":"unused","type":"webauthn.get"})";
 
 constexpr OriginRelyingPartyIdPair kValidRelyingPartyTestCases[] = {
     {"http://localhost", "localhost"},
diff --git a/content/browser/webauth/collected_client_data.cc b/content/browser/webauth/collected_client_data.cc
index 472e45a..418d2e6 100644
--- a/content/browser/webauth/collected_client_data.cc
+++ b/content/browser/webauth/collected_client_data.cc
@@ -22,7 +22,6 @@
 constexpr char kTypeKey[] = "type";
 constexpr char kChallengeKey[] = "challenge";
 constexpr char kOriginKey[] = "origin";
-constexpr char kHashAlgorithm[] = "hashAlgorithm";
 constexpr char kTokenBindingKey[] = "tokenBinding";
 }  // namespace
 
@@ -43,7 +42,7 @@
   // TODO(kpaulhamus): Fetch and add the Token Binding ID public key used to
   // communicate with the origin.
   return CollectedClientData(std::move(type), std::move(encoded_challenge),
-                             std::move(relying_party_id), "SHA-256", "unused");
+                             std::move(relying_party_id), "unused");
 }
 
 CollectedClientData::CollectedClientData() = default;
@@ -51,12 +50,10 @@
 CollectedClientData::CollectedClientData(std::string type,
                                          std::string base64_encoded_challenge,
                                          std::string origin,
-                                         std::string hash_algorithm,
                                          std::string token_binding_id)
     : type_(std::move(type)),
       base64_encoded_challenge_(std::move(base64_encoded_challenge)),
       origin_(std::move(origin)),
-      hash_algorithm_(std::move(hash_algorithm)),
       token_binding_id_(std::move(token_binding_id)) {}
 
 CollectedClientData::CollectedClientData(CollectedClientData&& other) = default;
@@ -73,10 +70,6 @@
   // The serialization of callerOrigin.
   client_data.SetKey(kOriginKey, base::Value(origin_));
 
-  // The recognized algorithm name of the hash algorithm selected by the client
-  // for generating the hash of the serialized client data.
-  client_data.SetKey(kHashAlgorithm, base::Value(hash_algorithm_));
-
   client_data.SetKey(kTokenBindingKey, base::Value(token_binding_id_));
 
   std::string json;
diff --git a/content/browser/webauth/collected_client_data.h b/content/browser/webauth/collected_client_data.h
index 0ae7b14..7c1a199 100644
--- a/content/browser/webauth/collected_client_data.h
+++ b/content/browser/webauth/collected_client_data.h
@@ -33,7 +33,6 @@
   CollectedClientData(std::string type_,
                       std::string base64_encoded_challenge_,
                       std::string origin,
-                      std::string hash_algorithm,
                       std::string token_binding_id);
 
   // Moveable.
@@ -50,7 +49,6 @@
   std::string type_;
   std::string base64_encoded_challenge_;
   std::string origin_;
-  std::string hash_algorithm_;
   std::string token_binding_id_;
   // TODO(kpaulhamus): Add extensions support. https://crbug/757502.
 
diff --git a/content/browser/webrtc/webrtc_image_capture_browsertest.cc b/content/browser/webrtc/webrtc_image_capture_browsertest.cc
index 1ca3828..cee0d5f 100644
--- a/content/browser/webrtc/webrtc_image_capture_browsertest.cc
+++ b/content/browser/webrtc/webrtc_image_capture_browsertest.cc
@@ -56,15 +56,7 @@
 
 static const char kImageCaptureHtmlFile[] = "/media/image_capture_test.html";
 
-// TODO(mcasas): enable real-camera tests by disabling the Fake Device for
-// platforms where the ImageCaptureCode is landed, https://crbug.com/656810
-static struct TargetCamera {
-  bool use_fake;
-} const kTargetCameras[] = {{true},
-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_ANDROID)
-                            {false}
-#endif
-};
+enum class TargetCamera { REAL_WEBCAM, FAKE_DEVICE };
 
 static struct TargetVideoCaptureStack {
   bool use_video_capture_service;
@@ -82,13 +74,14 @@
 // This class is the content_browsertests for Image Capture API, which allows
 // for capturing still images out of a MediaStreamTrack. Is a
 // WebRtcWebcamBrowserTest to be able to use a physical camera.
-class WebRtcImageCaptureBrowserTestBase : public WebRtcWebcamBrowserTest {
+class WebRtcImageCaptureBrowserTestBase
+    : public UsingRealWebcam_WebRtcWebcamBrowserTest {
  public:
   WebRtcImageCaptureBrowserTestBase() = default;
   ~WebRtcImageCaptureBrowserTestBase() override = default;
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    WebRtcWebcamBrowserTest::SetUpCommandLine(command_line);
+    UsingRealWebcam_WebRtcWebcamBrowserTest::SetUpCommandLine(command_line);
 
     ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch(
         switches::kUseFakeDeviceForMediaStream));
@@ -101,7 +94,7 @@
 
   void SetUp() override {
     ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
-    WebRtcWebcamBrowserTest::SetUp();
+    UsingRealWebcam_WebRtcWebcamBrowserTest::SetUp();
   }
 
   // Tries to run a |command| JS test, returning true if the test can be safely
@@ -155,7 +148,7 @@
   void SetUpCommandLine(base::CommandLine* command_line) override {
     WebRtcImageCaptureBrowserTestBase::SetUpCommandLine(command_line);
 
-    if (std::get<0>(GetParam()).use_fake) {
+    if (std::get<0>(GetParam()) == TargetCamera::FAKE_DEVICE) {
       base::CommandLine::ForCurrentProcess()->AppendSwitch(
           switches::kUseFakeDeviceForMediaStream);
       ASSERT_TRUE(base::CommandLine::ForCurrentProcess()->HasSwitch(
@@ -167,7 +160,7 @@
     // TODO(chfremer): Enable test cases using the video capture service with
     // real cameras as soon as root cause for https://crbug.com/733582 is
     // understood and resolved.
-    if ((!std::get<0>(GetParam()).use_fake) &&
+    if ((std::get<0>(GetParam()) == TargetCamera::REAL_WEBCAM) &&
         (std::get<1>(GetParam()).use_video_capture_service)) {
       LOG(INFO) << "Skipping this test case";
       return true;
@@ -224,11 +217,26 @@
 }
 
 INSTANTIATE_TEST_CASE_P(
-    ,
+    ,  // Use no prefix, so that these get picked up when using
+       // --gtest_filter=WebRtc*
     WebRtcImageCaptureSucceedsBrowserTest,
-    testing::Combine(testing::ValuesIn(kTargetCameras),
+    testing::Combine(testing::Values(TargetCamera::FAKE_DEVICE),
                      testing::ValuesIn(kTargetVideoCaptureStacks)));
 
+// Tests on real webcam can only run on platforms for which the image capture
+// API has already been implemented.
+// Note, these tests must be run sequentially, since multiple parallel test runs
+// competing for a single physical webcam typically causes failures.
+#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_ANDROID)
+INSTANTIATE_TEST_CASE_P(
+    UsingRealWebcam,  // This prefix can be used with --gtest_filter to
+                      // distinguish the tests using a real camera from the ones
+                      // that don't.
+    WebRtcImageCaptureSucceedsBrowserTest,
+    testing::Combine(testing::Values(TargetCamera::REAL_WEBCAM),
+                     testing::ValuesIn(kTargetVideoCaptureStacks)));
+#endif
+
 // Test fixture template for setting up a fake device with a custom
 // configuration. We are going to use this to set up fake devices that respond
 // to invocation of various ImageCapture API calls with a failure response.
diff --git a/content/browser/webrtc/webrtc_webcam_browsertest.cc b/content/browser/webrtc/webrtc_webcam_browsertest.cc
index 6e46e856..867d6dd3 100644
--- a/content/browser/webrtc/webrtc_webcam_browsertest.cc
+++ b/content/browser/webrtc/webrtc_webcam_browsertest.cc
@@ -42,33 +42,34 @@
 
 namespace content {
 
-void WebRtcWebcamBrowserTest::SetUpCommandLine(
+// The prefix "UsingRealWebcam" is used to indicate that this test must not
+// be run in parallel with other tests using a real webcam.
+void UsingRealWebcam_WebRtcWebcamBrowserTest::SetUpCommandLine(
     base::CommandLine* command_line) {
   // Allows for accessing capture devices without prompting for permission.
   command_line->AppendSwitch(switches::kUseFakeUIForMediaStream);
 
-  // The content_browsertests run with this flag by default, and this test is
-  // the only current exception to that rule, so just remove the flag
-  // --use-fake-device-for-media-stream here. We could also have all tests
-  // involving media streams add this flag explicitly, but it will be really
-  // unintuitive for developers to write tests involving media stream and have
-  // them fail on what looks like random bots, so running with fake devices
-  // is really a reasonable default.
+  // The content_browsertests run with this flag by default, so remove the flag
+  // --use-fake-device-for-media-stream here.
+  // TODO(chfremer): A better solution would be to promote
+  // |kUseFakeDeviceForMediaStream| from a switch to a base::Feature and then
+  // use ScopedFeatureList::InitAndEnableFeature() in the base class and
+  // ScopedFeatureList::InitAndDisableFeature() here and wherever else we want
+  // to use a real webcam.
   RemoveFakeDeviceFromCommandLine(command_line);
 }
 
-void WebRtcWebcamBrowserTest::SetUp() {
+void UsingRealWebcam_WebRtcWebcamBrowserTest::SetUp() {
   EnablePixelOutput();
   ContentBrowserTest::SetUp();
 }
 
-// The test is tagged as MANUAL since the webcam is a system-level resource; we
-// only want it to run on bots where we can ensure sequential execution. The
-// Android bots will run the test since they ignore MANUAL, but that's what we
-// want here since the bot runs tests sequentially on the device.
 // Tests that GetUserMedia acquires VGA by default.
-IN_PROC_BROWSER_TEST_F(WebRtcWebcamBrowserTest,
-                       MANUAL_CanAcquireVgaOnRealWebcam) {
+// The MANUAL prefix is used to only run this tests on certain bots for which
+// we can guarantee that tests are executed sequentially. TODO(chfremer): Is
+// this still needed or is the prefix "UsingRealWebcam" sufficient?
+IN_PROC_BROWSER_TEST_F(UsingRealWebcam_WebRtcWebcamBrowserTest,
+                       MANUAL_CanAcquireVga) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(
       "/media/getusermedia-real-webcam.html"));
diff --git a/content/browser/webrtc/webrtc_webcam_browsertest.h b/content/browser/webrtc/webrtc_webcam_browsertest.h
index 6ee6dd2..82139dc 100644
--- a/content/browser/webrtc/webrtc_webcam_browsertest.h
+++ b/content/browser/webrtc/webrtc_webcam_browsertest.h
@@ -17,17 +17,17 @@
 // since we want it to actually acquire the real webcam on the system (if there
 // is one). For that, it removes the |kUseFakeDeviceForMediaStream| flag from
 // the command line in SetUpCommandLine().
-class WebRtcWebcamBrowserTest : public ContentBrowserTest {
+class UsingRealWebcam_WebRtcWebcamBrowserTest : public ContentBrowserTest {
  public:
-  WebRtcWebcamBrowserTest() = default;
-  ~WebRtcWebcamBrowserTest() override = default;
+  UsingRealWebcam_WebRtcWebcamBrowserTest() = default;
+  ~UsingRealWebcam_WebRtcWebcamBrowserTest() override = default;
 
   // ContentBrowserTest implementation.
   void SetUpCommandLine(base::CommandLine* command_line) override;
   void SetUp() override;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(WebRtcWebcamBrowserTest);
+  DISALLOW_COPY_AND_ASSIGN(UsingRealWebcam_WebRtcWebcamBrowserTest);
 };
 
 }  // namespace content
diff --git a/content/browser/webui/web_ui_data_source_impl.cc b/content/browser/webui/web_ui_data_source_impl.cc
index 3800726..33b118e 100644
--- a/content/browser/webui/web_ui_data_source_impl.cc
+++ b/content/browser/webui/web_ui_data_source_impl.cc
@@ -115,22 +115,21 @@
 void WebUIDataSourceImpl::AddString(const std::string& name,
                                     const base::string16& value) {
   // TODO(dschuyler): Share only one copy of these strings.
-  localized_strings_.SetString(name, value);
+  localized_strings_.SetKey(name, base::Value(value));
   replacements_[name] = base::UTF16ToUTF8(value);
 }
 
 void WebUIDataSourceImpl::AddString(const std::string& name,
                                     const std::string& value) {
-  localized_strings_.SetString(name, value);
+  localized_strings_.SetKey(name, base::Value(value));
   replacements_[name] = value;
 }
 
-void WebUIDataSourceImpl::AddLocalizedString(const std::string& name,
-                                             int ids) {
-  localized_strings_.SetString(
-      name, GetContentClient()->GetLocalizedString(ids));
-  replacements_[name] =
+void WebUIDataSourceImpl::AddLocalizedString(const std::string& name, int ids) {
+  std::string utf8_str =
       base::UTF16ToUTF8(GetContentClient()->GetLocalizedString(ids));
+  localized_strings_.SetKey(name, base::Value(utf8_str));
+  replacements_[name] = utf8_str;
 }
 
 void WebUIDataSourceImpl::AddLocalizedStrings(
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc
index 25e1b0e..8dfdad7 100644
--- a/content/child/child_thread_impl.cc
+++ b/content/child/child_thread_impl.cc
@@ -79,10 +79,6 @@
 #include "base/allocator/allocator_interception_mac.h"
 #endif
 
-#if defined(OS_WIN)
-#include "content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.h"
-#endif
-
 namespace content {
 namespace {
 
@@ -586,13 +582,6 @@
     field_trial_syncer_->InitFieldTrialObserving(
         *base::CommandLine::ForCurrentProcess());
   }
-
-#if defined(OS_WIN)
-  mojom::DWriteFontProxyPtrInfo dwrite_font_proxy;
-  ChildThread::Get()->GetConnector()->BindInterface(
-      mojom::kBrowserServiceName, mojo::MakeRequest(&dwrite_font_proxy));
-  UpdateDWriteFontProxySender(std::move(dwrite_font_proxy));
-#endif
 }
 
 void ChildThreadImpl::InitTracing() {
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.cc
index da14147..7ea43bb9 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.cc
@@ -14,6 +14,7 @@
 #include "content/child/dwrite_font_proxy/dwrite_font_proxy_win.h"
 #include "content/child/dwrite_font_proxy/font_fallback_win.h"
 #include "content/child/font_warmup_win.h"
+#include "content/public/common/service_names.mojom.h"
 #include "skia/ext/fontmgr_default_win.h"
 #include "third_party/WebKit/public/web/win/WebFontRendering.h"
 #include "third_party/skia/include/ports/SkFontMgr.h"
@@ -44,12 +45,7 @@
 
 }  // namespace
 
-void UpdateDWriteFontProxySender(mojom::DWriteFontProxyPtrInfo proxy) {
-  if (g_font_collection)
-    g_font_collection->SetProxy(std::move(proxy));
-}
-
-void InitializeDWriteFontProxy() {
+void InitializeDWriteFontProxy(service_manager::Connector* connector) {
   mswr::ComPtr<IDWriteFactory> factory;
 
   CreateDirectWriteFactory(&factory);
@@ -58,7 +54,12 @@
     mojom::DWriteFontProxyPtrInfo dwrite_font_proxy;
     if (g_connection_callback_override) {
       dwrite_font_proxy = g_connection_callback_override->Run();
+    } else if (connector) {
+      connector->BindInterface(mojom::kBrowserServiceName,
+                               mojo::MakeRequest(&dwrite_font_proxy));
     }
+    // If |connector| is not provided, the connection to the browser will be
+    // created on demand.
     DWriteFontCollectionProxy::Create(&g_font_collection, factory.Get(),
                                       std::move(dwrite_font_proxy));
   }
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.h b/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.h
index 550821e..b2d4c1bc 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.h
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_init_impl_win.h
@@ -21,10 +21,6 @@
 // Cleans up the fake dwrite font proxy connection factory.
 CONTENT_EXPORT void ClearDWriteFontProxySenderForTesting();
 
-// Allows ChildThreadImpl to register a thread safe sender to DWriteFontProxy
-// so we don't depend on being on the main thread to use DWriteFontProxy.
-CONTENT_EXPORT void UpdateDWriteFontProxySender(mojom::DWriteFontProxyPtrInfo);
-
 }  // namespace content
 
 #endif  // CONTENT_CHILD_DWRITE_FONT_PROXY_DWRITE_FONT_PROXY_INIT_IMPL_WIN_H_
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
index 999c250f..39951d3 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -266,6 +266,8 @@
   factory_ = factory;
   if (proxy)
     SetProxy(std::move(proxy));
+  else
+    main_task_runner_ = base::ThreadTaskRunnerHandle::Get();
 
   HRESULT hr = factory->RegisterFontCollectionLoader(this);
   DCHECK(SUCCEEDED(hr));
@@ -361,8 +363,18 @@
 mojom::DWriteFontProxy& DWriteFontCollectionProxy::GetFontProxy() {
   if (!font_proxy_) {
     mojom::DWriteFontProxyPtrInfo dwrite_font_proxy;
-    ChildThread::Get()->GetConnector()->BindInterface(
-        mojom::kBrowserServiceName, mojo::MakeRequest(&dwrite_font_proxy));
+    if (main_task_runner_->RunsTasksInCurrentSequence()) {
+      ChildThread::Get()->GetConnector()->BindInterface(
+          mojom::kBrowserServiceName, mojo::MakeRequest(&dwrite_font_proxy));
+    } else {
+      main_task_runner_->PostTask(
+          FROM_HERE, base::BindOnce(
+                         [](mojom::DWriteFontProxyRequest request) {
+                           ChildThread::Get()->GetConnector()->BindInterface(
+                               mojom::kBrowserServiceName, std::move(request));
+                         },
+                         mojo::MakeRequest(&dwrite_font_proxy)));
+    }
     SetProxy(std::move(dwrite_font_proxy));
   }
   return **font_proxy_;
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h
index 0b065c65..0943acd7 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h
@@ -87,15 +87,16 @@
 
   bool CreateFamily(UINT32 family_index);
 
-  void SetProxy(mojom::DWriteFontProxyPtrInfo);
-
   mojom::DWriteFontProxy& GetFontProxy();
 
  private:
+  void SetProxy(mojom::DWriteFontProxyPtrInfo);
+
   Microsoft::WRL::ComPtr<IDWriteFactory> factory_;
   std::vector<Microsoft::WRL::ComPtr<DWriteFontFamilyProxy>> families_;
   std::map<base::string16, UINT32> family_names_;
   UINT32 family_count_ = UINT_MAX;
+  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
   scoped_refptr<mojom::ThreadSafeDWriteFontProxyPtr> font_proxy_;
 
   DISALLOW_ASSIGN(DWriteFontCollectionProxy);
diff --git a/content/ppapi_plugin/ppapi_plugin_main.cc b/content/ppapi_plugin/ppapi_plugin_main.cc
index 2037cbf..7224ebe 100644
--- a/content/ppapi_plugin/ppapi_plugin_main.cc
+++ b/content/ppapi_plugin/ppapi_plugin_main.cc
@@ -24,6 +24,7 @@
 #include "ipc/ipc_sender.h"
 #include "ppapi/proxy/plugin_globals.h"
 #include "ppapi/proxy/proxy_module.h"
+#include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/ui_base_switches.h"
 
 #if defined(OS_WIN)
@@ -134,7 +135,7 @@
 #if defined(OS_WIN)
   if (!base::win::IsUser32AndGdi32Available())
     gfx::win::MaybeInitializeDirectWrite();
-  InitializeDWriteFontProxy();
+  InitializeDWriteFontProxy(ChildThread::Get()->GetConnector());
 
   double device_scale_factor = 1.0;
   base::StringToDouble(
diff --git a/content/public/child/dwrite_font_proxy_init_win.h b/content/public/child/dwrite_font_proxy_init_win.h
index 7983f61..a94e481 100644
--- a/content/public/child/dwrite_font_proxy_init_win.h
+++ b/content/public/child/dwrite_font_proxy_init_win.h
@@ -6,11 +6,16 @@
 #define CONTENT_PUBLIC_CHILD_DWRITE_FONT_PROXY_INIT_WIN_H_
 
 #include "content/common/content_export.h"
+#include "services/service_manager/public/cpp/connector.h"
 
 namespace content {
 
-// Initializes the dwrite font proxy.
-CONTENT_EXPORT void InitializeDWriteFontProxy();
+// Initializes the dwrite font proxy. If |connector| is non-null, it will be
+// used to create the underlying mojo connection to the browser during
+// initialization. Otherwise, the connection will be created on demand using a
+// connector obtained from the current ChildThread.
+CONTENT_EXPORT void InitializeDWriteFontProxy(
+    service_manager::Connector* connector = nullptr);
 
 // Uninitialize the dwrite font proxy. This is safe to call even if the proxy
 // has not been initialized. After this, calls to load fonts may fail.
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 0762a43..8199a9188bf 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -635,8 +635,9 @@
 #if defined(USE_AURA)
 bool IsResizeComplete(aura::test::WindowEventDispatcherTestApi* dispatcher_test,
                       RenderWidgetHostImpl* widget_host) {
-  return !dispatcher_test->HoldingPointerMoves() &&
-      !widget_host->resize_ack_pending_for_testing();
+  dispatcher_test->WaitUntilPointerMovesDispatched();
+  widget_host->WasResized();
+  return !widget_host->resize_ack_pending_for_testing();
 }
 
 void WaitForResizeComplete(WebContents* web_contents) {
diff --git a/content/public/test/content_test_suite_base.cc b/content/public/test/content_test_suite_base.cc
index a1f0f0a..77668ccc 100644
--- a/content/public/test/content_test_suite_base.cc
+++ b/content/public/test/content_test_suite_base.cc
@@ -32,6 +32,18 @@
 
 namespace content {
 
+namespace {
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+#if defined(USE_V8_CONTEXT_SNAPSHOT)
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kWithAdditionalContext;
+#else
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kDefault;
+#endif
+#endif
+}
+
 ContentTestSuiteBase::ContentTestSuiteBase(int argc, char** argv)
     : base::TestSuite(argc, argv) {
 }
@@ -40,14 +52,10 @@
   base::TestSuite::Initialize();
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
-  gin::V8Initializer::LoadV8Snapshot();
+  gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
   gin::V8Initializer::LoadV8Natives();
 #endif
 
-#if defined(USE_V8_CONTEXT_SNAPSHOT)
-  gin::V8Initializer::LoadV8ContextSnapshot();
-#endif
-
 #if defined(OS_ANDROID) && !defined(USE_AURA)
   content::Compositor::Initialize();
 #endif
diff --git a/content/renderer/accessibility/blink_ax_enum_conversion.cc b/content/renderer/accessibility/blink_ax_enum_conversion.cc
index d1aea8e..72bd68d 100644
--- a/content/renderer/accessibility/blink_ax_enum_conversion.cc
+++ b/content/renderer/accessibility/blink_ax_enum_conversion.cc
@@ -46,13 +46,13 @@
   if (o.IsRequired())
     state |= (1 << ui::AX_STATE_REQUIRED);
 
-  if (o.CanSetSelectedAttribute())
+  if (o.IsSelected() != blink::kWebAXSelectedStateUndefined)
     state |= (1 << ui::AX_STATE_SELECTABLE);
 
   if (o.IsEditable())
     state |= (1 << ui::AX_STATE_EDITABLE);
 
-  if (o.IsSelected())
+  if (o.IsSelected() == blink::kWebAXSelectedStateTrue)
     state |= (1 << ui::AX_STATE_SELECTED);
 
   if (o.IsRichlyEditable())
diff --git a/content/renderer/device_sensors/device_motion_event_pump.cc b/content/renderer/device_sensors/device_motion_event_pump.cc
index 90b694b..d41ff5c 100644
--- a/content/renderer/device_sensors/device_motion_event_pump.cc
+++ b/content/renderer/device_sensors/device_motion_event_pump.cc
@@ -13,6 +13,7 @@
 #include "device/sensors/public/cpp/motion_data.h"
 #include "services/device/public/interfaces/sensor.mojom.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
+#include "ui/gfx/geometry/angle_conversions.h"
 
 namespace content {
 
@@ -84,8 +85,8 @@
     render_frame->GetRemoteInterfaces()->GetInterface(
         mojo::MakeRequest(&sensor_provider_));
     sensor_provider_.set_connection_error_handler(
-        base::Bind(&DeviceSensorEventPump::HandleSensorProviderError,
-                   base::Unretained(this)));
+        base::BindOnce(&DeviceSensorEventPump::HandleSensorProviderError,
+                       base::Unretained(this)));
   }
 
   accelerometer_.Start(sensor_provider_.get());
@@ -135,9 +136,9 @@
 
   if (gyroscope_.SensorReadingCouldBeRead() &&
       (gyroscope_active = gyroscope_.reading.timestamp() != 0.0)) {
-    data->rotation_rate_alpha = gyroscope_.reading.gyro.x;
-    data->rotation_rate_beta = gyroscope_.reading.gyro.y;
-    data->rotation_rate_gamma = gyroscope_.reading.gyro.z;
+    data->rotation_rate_alpha = gfx::RadToDeg(gyroscope_.reading.gyro.x);
+    data->rotation_rate_beta = gfx::RadToDeg(gyroscope_.reading.gyro.y);
+    data->rotation_rate_gamma = gfx::RadToDeg(gyroscope_.reading.gyro.z);
     data->has_rotation_rate_alpha =
         !std::isnan(gyroscope_.reading.gyro.x.value());
     data->has_rotation_rate_beta =
diff --git a/content/renderer/device_sensors/device_motion_event_pump_unittest.cc b/content/renderer/device_sensors/device_motion_event_pump_unittest.cc
index 9238688..2687ed7 100644
--- a/content/renderer/device_sensors/device_motion_event_pump_unittest.cc
+++ b/content/renderer/device_sensors/device_motion_event_pump_unittest.cc
@@ -23,6 +23,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/modules/device_orientation/WebDeviceMotionListener.h"
 #include "third_party/WebKit/public/platform/scheduler/test/renderer_scheduler_test_support.h"
+#include "ui/gfx/geometry/angle_conversions.h"
 
 namespace content {
 
@@ -239,11 +240,11 @@
   EXPECT_EQ(6, received_data.acceleration_z);
 
   EXPECT_TRUE(received_data.has_rotation_rate_alpha);
-  EXPECT_EQ(7, received_data.rotation_rate_alpha);
+  EXPECT_EQ(gfx::RadToDeg(7.0), received_data.rotation_rate_alpha);
   EXPECT_TRUE(received_data.has_rotation_rate_beta);
-  EXPECT_EQ(8, received_data.rotation_rate_beta);
+  EXPECT_EQ(gfx::RadToDeg(8.0), received_data.rotation_rate_beta);
   EXPECT_TRUE(received_data.has_rotation_rate_gamma);
-  EXPECT_EQ(9, received_data.rotation_rate_gamma);
+  EXPECT_EQ(gfx::RadToDeg(9.0), received_data.rotation_rate_gamma);
 
   motion_pump()->Stop();
 
@@ -281,11 +282,11 @@
   EXPECT_FALSE(received_data.has_acceleration_z);
 
   EXPECT_TRUE(received_data.has_rotation_rate_alpha);
-  EXPECT_EQ(7, received_data.rotation_rate_alpha);
+  EXPECT_EQ(gfx::RadToDeg(7.0), received_data.rotation_rate_alpha);
   EXPECT_TRUE(received_data.has_rotation_rate_beta);
-  EXPECT_EQ(8, received_data.rotation_rate_beta);
+  EXPECT_EQ(gfx::RadToDeg(8.0), received_data.rotation_rate_beta);
   EXPECT_TRUE(received_data.has_rotation_rate_gamma);
-  EXPECT_EQ(9, received_data.rotation_rate_gamma);
+  EXPECT_EQ(gfx::RadToDeg(9.0), received_data.rotation_rate_gamma);
 
   motion_pump()->Stop();
 
@@ -323,9 +324,9 @@
   EXPECT_EQ(6, received_data.acceleration_z);
 
   EXPECT_TRUE(received_data.has_rotation_rate_alpha);
-  EXPECT_EQ(7, received_data.rotation_rate_alpha);
+  EXPECT_EQ(gfx::RadToDeg(7.0), received_data.rotation_rate_alpha);
   EXPECT_TRUE(received_data.has_rotation_rate_beta);
-  EXPECT_EQ(8, received_data.rotation_rate_beta);
+  EXPECT_EQ(gfx::RadToDeg(8.0), received_data.rotation_rate_beta);
   EXPECT_FALSE(received_data.has_rotation_rate_gamma);
 
   motion_pump()->Stop();
diff --git a/content/renderer/device_sensors/device_orientation_event_pump.cc b/content/renderer/device_sensors/device_orientation_event_pump.cc
index d29e6628..a5d8371c 100644
--- a/content/renderer/device_sensors/device_orientation_event_pump.cc
+++ b/content/renderer/device_sensors/device_orientation_event_pump.cc
@@ -146,8 +146,8 @@
     render_frame->GetRemoteInterfaces()->GetInterface(
         mojo::MakeRequest(&sensor_provider_));
     sensor_provider_.set_connection_error_handler(
-        base::Bind(&DeviceSensorEventPump::HandleSensorProviderError,
-                   base::Unretained(this)));
+        base::BindOnce(&DeviceSensorEventPump::HandleSensorProviderError,
+                       base::Unretained(this)));
   }
 
   if (absolute_) {
diff --git a/content/renderer/device_sensors/device_sensor_event_pump.h b/content/renderer/device_sensors/device_sensor_event_pump.h
index ac5b487..e588a039 100644
--- a/content/renderer/device_sensors/device_sensor_event_pump.h
+++ b/content/renderer/device_sensors/device_sensor_event_pump.h
@@ -178,12 +178,12 @@
 
       default_config.set_frequency(kDefaultPumpFrequencyHz);
 
-      sensor.set_connection_error_handler(
-          base::Bind(&SensorEntry::HandleSensorError, base::Unretained(this)));
+      sensor.set_connection_error_handler(base::BindOnce(
+          &SensorEntry::HandleSensorError, base::Unretained(this)));
       sensor->ConfigureReadingChangeNotifications(false /* disabled */);
       sensor->AddConfiguration(
-          default_config, base::Bind(&SensorEntry::OnSensorAddConfiguration,
-                                     base::Unretained(this)));
+          default_config, base::BindOnce(&SensorEntry::OnSensorAddConfiguration,
+                                         base::Unretained(this)));
     }
 
     // Mojo callback for Sensor::AddConfiguration().
@@ -233,9 +233,9 @@
     void Start(device::mojom::SensorProvider* sensor_provider) {
       if (sensor_state == SensorState::NOT_INITIALIZED) {
         sensor_state = SensorState::INITIALIZING;
-        sensor_provider->GetSensor(
-            type,
-            base::Bind(&SensorEntry::OnSensorCreated, base::Unretained(this)));
+        sensor_provider->GetSensor(type,
+                                   base::BindOnce(&SensorEntry::OnSensorCreated,
+                                                  base::Unretained(this)));
       } else if (sensor_state == SensorState::SUSPENDED) {
         sensor->Resume();
         sensor_state = SensorState::ACTIVE;
diff --git a/content/renderer/device_sensors/fake_sensor_and_provider.cc b/content/renderer/device_sensors/fake_sensor_and_provider.cc
index 8fee527..8f47509 100644
--- a/content/renderer/device_sensors/fake_sensor_and_provider.cc
+++ b/content/renderer/device_sensors/fake_sensor_and_provider.cc
@@ -20,6 +20,15 @@
   shared_buffer_handle_ = mojo::SharedBufferHandle::Create(
       sizeof(device::SensorReadingSharedBuffer) *
       static_cast<uint64_t>(device::mojom::SensorType::LAST));
+
+  if (!shared_buffer_handle_.is_valid())
+    return;
+
+  // Create read/write mapping now, to ensure it is kept writable
+  // after the region is sealed read-only on Android.
+  shared_buffer_mapping_ = shared_buffer_handle_->MapAtOffset(
+      device::mojom::SensorInitParams::kReadBufferSizeForTests,
+      GetBufferOffset());
 }
 
 FakeSensor::~FakeSensor() = default;
@@ -81,16 +90,12 @@
 }
 
 void FakeSensor::SensorReadingChanged() {
-  if (!shared_buffer_handle_.is_valid())
+  if (!shared_buffer_mapping_.get())
     return;
 
-  mojo::ScopedSharedBufferMapping shared_buffer =
-      shared_buffer_handle_->MapAtOffset(
-          device::mojom::SensorInitParams::kReadBufferSizeForTests,
-          GetBufferOffset());
+  auto* buffer = static_cast<device::SensorReadingSharedBuffer*>(
+      shared_buffer_mapping_.get());
 
-  device::SensorReadingSharedBuffer* buffer =
-      static_cast<device::SensorReadingSharedBuffer*>(shared_buffer.get());
   auto& seqlock = buffer->seqlock.value();
   seqlock.WriteBegin();
   buffer->reading = reading_;
diff --git a/content/renderer/device_sensors/fake_sensor_and_provider.h b/content/renderer/device_sensors/fake_sensor_and_provider.h
index d9a6138..0fde38d 100644
--- a/content/renderer/device_sensors/fake_sensor_and_provider.h
+++ b/content/renderer/device_sensors/fake_sensor_and_provider.h
@@ -57,6 +57,7 @@
   device::mojom::SensorType sensor_type_;
   bool reading_notification_enabled_ = true;
   mojo::ScopedSharedBufferHandle shared_buffer_handle_;
+  mojo::ScopedSharedBufferMapping shared_buffer_mapping_;
   device::mojom::SensorClientPtr client_;
   device::SensorReading reading_;
 
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index feb7cda..79a568a 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -566,10 +566,6 @@
       "//tools/v8_context_snapshot:v8_context_snapshot",
     ]
 
-    data = [
-      "$root_out_dir/v8_context_snapshot.bin",
-    ]
-
     if (is_win) {
       deps += [ "//sandbox" ]
 
diff --git a/content/shell/test_runner/web_ax_object_proxy.cc b/content/shell/test_runner/web_ax_object_proxy.cc
index 7151763b..9781cec 100644
--- a/content/shell/test_runner/web_ax_object_proxy.cc
+++ b/content/shell/test_runner/web_ax_object_proxy.cc
@@ -1028,12 +1028,13 @@
 
 bool WebAXObjectProxy::IsSelected() {
   accessibility_object_.UpdateLayoutAndCheckValidity();
-  return accessibility_object_.IsSelected();
+  return accessibility_object_.IsSelected() == blink::kWebAXSelectedStateTrue;
 }
 
 bool WebAXObjectProxy::IsSelectable() {
   accessibility_object_.UpdateLayoutAndCheckValidity();
-  return accessibility_object_.CanSetSelectedAttribute();
+  return accessibility_object_.IsSelected() !=
+         blink::kWebAXSelectedStateUndefined;
 }
 
 bool WebAXObjectProxy::IsMultiLine() {
diff --git a/content/test/data/device_sensors/device_motion_only_some_sensors_are_available_test.html b/content/test/data/device_sensors/device_motion_only_some_sensors_are_available_test.html
index 0823ec9..dfc5d21 100644
--- a/content/test/data/device_sensors/device_motion_only_some_sensors_are_available_test.html
+++ b/content/test/data/device_sensors/device_motion_only_some_sensors_are_available_test.html
@@ -3,6 +3,7 @@
     <title>DeviceMotion only some sensors are available test</title>
     <script type="text/javascript">
       let expectedInterval = Math.floor(1000 / 60);
+      let kRadiansToDegrees = 180 / Math.PI;
       function checkMotionEvent(event) {
         return event.acceleration.x == 1 &&
                event.acceleration.y == 2 &&
@@ -10,9 +11,9 @@
                event.accelerationIncludingGravity.x == null &&
                event.accelerationIncludingGravity.y == null &&
                event.accelerationIncludingGravity.z == null &&
-               event.rotationRate.alpha == 7 &&
-               event.rotationRate.beta == 8 &&
-               event.rotationRate.gamma == 9 &&
+               event.rotationRate.alpha == 7 * kRadiansToDegrees &&
+               event.rotationRate.beta == 8 * kRadiansToDegrees &&
+               event.rotationRate.gamma == 9 * kRadiansToDegrees &&
                event.interval == expectedInterval;
       }
 
diff --git a/content/test/data/device_sensors/device_motion_test.html b/content/test/data/device_sensors/device_motion_test.html
index e98aa40..859ab1d 100644
--- a/content/test/data/device_sensors/device_motion_test.html
+++ b/content/test/data/device_sensors/device_motion_test.html
@@ -3,6 +3,7 @@
     <title>DeviceMotion test</title>
     <script type="text/javascript">
       let expectedInterval = Math.floor(1000 / 60);
+      let kRadiansToDegrees = 180 / Math.PI;
       function checkMotionEvent(event) {
         return event.acceleration.x == 1 &&
                event.acceleration.y == 2 &&
@@ -10,9 +11,9 @@
                event.accelerationIncludingGravity.x == 4 &&
                event.accelerationIncludingGravity.y == 5 &&
                event.accelerationIncludingGravity.z == 6 &&
-               event.rotationRate.alpha == 7 &&
-               event.rotationRate.beta == 8 &&
-               event.rotationRate.gamma == 9 &&
+               event.rotationRate.alpha == 7 * kRadiansToDegrees &&
+               event.rotationRate.beta == 8 * kRadiansToDegrees &&
+               event.rotationRate.gamma == 9 * kRadiansToDegrees &&
                event.interval == expectedInterval;
       }
 
diff --git a/content/test/test_blink_web_unit_test_support.cc b/content/test/test_blink_web_unit_test_support.cc
index ae5e694..6fabb72 100644
--- a/content/test/test_blink_web_unit_test_support.cc
+++ b/content/test/test_blink_web_unit_test_support.cc
@@ -117,6 +117,16 @@
   DISALLOW_COPY_AND_ASSIGN(WebURLLoaderFactoryWithMock);
 };
 
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+#if defined(USE_V8_CONTEXT_SNAPSHOT)
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kWithAdditionalContext;
+#else
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kDefault;
+#endif
+#endif
+
 }  // namespace
 
 namespace content {
@@ -131,13 +141,10 @@
   mock_clipboard_.reset(new MockWebClipboardImpl());
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
-  gin::V8Initializer::LoadV8Snapshot();
+  gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
   gin::V8Initializer::LoadV8Natives();
 #endif
 
-#if defined(USE_V8_CONTEXT_SNAPSHOT)
-  gin::V8Initializer::LoadV8ContextSnapshot();
-#endif
 
   scoped_refptr<base::SingleThreadTaskRunner> dummy_task_runner;
   std::unique_ptr<base::ThreadTaskRunnerHandle> dummy_task_runner_handle;
diff --git a/device/bluetooth/public/interfaces/test/fake_bluetooth.mojom b/device/bluetooth/public/interfaces/test/fake_bluetooth.mojom
index d15a7bf8..3a1486d0 100644
--- a/device/bluetooth/public/interfaces/test/fake_bluetooth.mojom
+++ b/device/bluetooth/public/interfaces/test/fake_bluetooth.mojom
@@ -163,6 +163,11 @@
   AddFakeService(string peripheral_address, UUID service_uuid)
       => (string? service_id);
 
+  // Removes a fake GATT Services with |service_id| from the fake peripheral
+  // with |peripheral_address|.
+  RemoveFakeService(string service_id, string peripheral_address)
+      => (bool success);
+
   // Adds a fake GATT Characteristic with |characteristic_uuid| and |properties|
   // to the fake service with |service_id| in |peripheral_address| peripheral.
   // The characteristic will be found when discovering the peripheral's GATT
diff --git a/device/bluetooth/test/fake_central.cc b/device/bluetooth/test/fake_central.cc
index 23a18c1..bbb8ca8 100644
--- a/device/bluetooth/test/fake_central.cc
+++ b/device/bluetooth/test/fake_central.cc
@@ -118,6 +118,17 @@
   std::move(callback).Run(fake_peripheral->AddFakeService(service_uuid));
 }
 
+void FakeCentral::RemoveFakeService(const std::string& identifier,
+                                    const std::string& peripheral_address,
+                                    RemoveFakeServiceCallback callback) {
+  FakePeripheral* fake_peripheral = GetFakePeripheral(peripheral_address);
+  if (!fake_peripheral) {
+    std::move(callback).Run(false);
+    return;
+  }
+  std::move(callback).Run(fake_peripheral->RemoveFakeService(identifier));
+}
+
 void FakeCentral::AddFakeCharacteristic(
     const device::BluetoothUUID& characteristic_uuid,
     mojom::CharacteristicPropertiesPtr properties,
diff --git a/device/bluetooth/test/fake_central.h b/device/bluetooth/test/fake_central.h
index 03b4af7..db15c1c 100644
--- a/device/bluetooth/test/fake_central.h
+++ b/device/bluetooth/test/fake_central.h
@@ -54,6 +54,9 @@
   void AddFakeService(const std::string& peripheral_address,
                       const device::BluetoothUUID& service_uuid,
                       AddFakeServiceCallback callback) override;
+  void RemoveFakeService(const std::string& identifier,
+                         const std::string& peripheral_address,
+                         RemoveFakeServiceCallback callback) override;
   void AddFakeCharacteristic(const device::BluetoothUUID& characteristic_uuid,
                              mojom::CharacteristicPropertiesPtr properties,
                              const std::string& service_id,
diff --git a/device/bluetooth/test/fake_peripheral.cc b/device/bluetooth/test/fake_peripheral.cc
index cb69012..47fd8b0 100644
--- a/device/bluetooth/test/fake_peripheral.cc
+++ b/device/bluetooth/test/fake_peripheral.cc
@@ -88,6 +88,16 @@
   return it->second->GetIdentifier();
 }
 
+bool FakePeripheral::RemoveFakeService(const std::string& identifier) {
+  auto it = gatt_services_.find(identifier);
+  if (it == gatt_services_.end()) {
+    return false;
+  }
+
+  gatt_services_.erase(it);
+  return true;
+}
+
 uint32_t FakePeripheral::GetBluetoothClass() const {
   NOTREACHED();
   return 0;
diff --git a/device/bluetooth/test/fake_peripheral.h b/device/bluetooth/test/fake_peripheral.h
index a98a616..e9879063 100644
--- a/device/bluetooth/test/fake_peripheral.h
+++ b/device/bluetooth/test/fake_peripheral.h
@@ -59,6 +59,9 @@
   // Returns the service's Id.
   std::string AddFakeService(const device::BluetoothUUID& service_uuid);
 
+  // Remove a fake service with |identifier| from this peripheral.
+  bool RemoveFakeService(const std::string& identifier);
+
   // BluetoothDevice overrides:
   uint32_t GetBluetoothClass() const override;
 #if defined(OS_CHROMEOS) || defined(OS_LINUX)
diff --git a/device/vr/orientation/orientation_device_unittest.cc b/device/vr/orientation/orientation_device_unittest.cc
index b9a23d4..de8cb90b 100644
--- a/device/vr/orientation/orientation_device_unittest.cc
+++ b/device/vr/orientation/orientation_device_unittest.cc
@@ -78,10 +78,14 @@
 
     fake_sensor_ = std::make_unique<FakeOrientationSensor>(
         mojo::MakeRequest(&sensor_ptr_));
+
     shared_buffer_handle_ = mojo::SharedBufferHandle::Create(
         sizeof(SensorReadingSharedBuffer) *
         static_cast<uint64_t>(mojom::SensorType::LAST));
 
+    shared_buffer_mapping_ = shared_buffer_handle_->MapAtOffset(
+        mojom::SensorInitParams::kReadBufferSizeForTests, GetBufferOffset());
+
     fake_screen_ = std::make_unique<FakeScreen>();
 
     display::Screen::SetScreenInstance(fake_screen_.get());
@@ -160,13 +164,11 @@
   }
 
   void WriteToBuffer(gfx::Quaternion q) {
-    mojo::ScopedSharedBufferMapping shared_buffer =
-        shared_buffer_handle_->MapAtOffset(
-            mojom::SensorInitParams::kReadBufferSizeForTests,
-            GetBufferOffset());
+    if (!shared_buffer_mapping_)
+      return;
 
     SensorReadingSharedBuffer* buffer =
-        static_cast<SensorReadingSharedBuffer*>(shared_buffer.get());
+        static_cast<SensorReadingSharedBuffer*>(shared_buffer_mapping_.get());
 
     auto& seqlock = buffer->seqlock.value();
     seqlock.WriteBegin();
@@ -192,6 +194,7 @@
   std::unique_ptr<FakeOrientationSensor> fake_sensor_;
   mojom::SensorPtrInfo sensor_ptr_;
   mojo::ScopedSharedBufferHandle shared_buffer_handle_;
+  mojo::ScopedSharedBufferMapping shared_buffer_mapping_;
   mojom::SensorClientPtr sensor_client_ptr_;
 
   std::unique_ptr<FakeScreen> fake_screen_;
diff --git a/docs/accessibility/chromevox_on_desktop_linux.md b/docs/accessibility/chromevox_on_desktop_linux.md
index a05074f..70c73c4 100644
--- a/docs/accessibility/chromevox_on_desktop_linux.md
+++ b/docs/accessibility/chromevox_on_desktop_linux.md
@@ -80,7 +80,7 @@
 
 ```
 PATTS_DIR=/usr/share/chromeos-assets/speech_synthesis/patts
-sudo unzip $PATTS_DIR/tts_service_x86-64.nexe.zip -d $PATTS_DIR 
+sudo unzip $PATTS_DIR/tts_service_x86_64.nexe.zip -d $PATTS_DIR
 ```
 
 You may need to update permissions for the unzipped files within within
diff --git a/docs/memory-infra/memory_benchmarks.md b/docs/memory-infra/memory_benchmarks.md
index 4dbc607..7153db4 100644
--- a/docs/memory-infra/memory_benchmarks.md
+++ b/docs/memory-infra/memory_benchmarks.md
@@ -118,7 +118,9 @@
 This will run the story with a default of 3 repetitions and produce a
 `results.html` file comparing results from this and any previous benchmark
 runs. In addition, you'll also get individual [trace files][memory-infra]
-for each story run by the benchmark.
+for each story run by the benchmark. **Note:** by default only high level
+metrics are shown, you may need to tick the "Show all" check box in order to
+view some of the lower level memory metrics.
 
 ![Example results.html file](https://storage.googleapis.com/chromium-docs.appspot.com/ea60207d9bb4809178fe75923d6d1a2b241170ef.png)
 
diff --git a/extensions/browser/user_script_loader.cc b/extensions/browser/user_script_loader.cc
index 1b9d9fe..72ad100 100644
--- a/extensions/browser/user_script_loader.cc
+++ b/extensions/browser/user_script_loader.cc
@@ -12,6 +12,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/version.h"
+#include "build/build_config.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
@@ -336,6 +337,11 @@
   if (!readonly_handle.IsValid())
     return std::unique_ptr<base::SharedMemory>();
 
+#if defined(OS_ANDROID)
+  // Seal the region read-only now. http://crbug.com/789959
+  readonly_handle.SetRegionReadOnly();
+#endif
+
   return std::make_unique<base::SharedMemory>(readonly_handle,
                                               /*read_only=*/true);
 }
diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc
index c0aae855..56402d47 100644
--- a/gin/isolate_holder.cc
+++ b/gin/isolate_holder.cc
@@ -41,56 +41,55 @@
     : IsolateHolder(std::move(task_runner),
                     access_mode,
                     kAllowAtomicsWait,
-                    nullptr) {}
+                    IsolateCreationMode::kNormal) {}
 
 IsolateHolder::IsolateHolder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     AccessMode access_mode,
     AllowAtomicsWaitMode atomics_wait_mode,
-    v8::StartupData* startup_data)
+    IsolateCreationMode isolate_creation_mode)
     : access_mode_(access_mode) {
+  DCHECK(task_runner);
+  DCHECK(task_runner->BelongsToCurrentThread());
+
   v8::ArrayBuffer::Allocator* allocator = g_array_buffer_allocator;
   CHECK(allocator) << "You need to invoke gin::IsolateHolder::Initialize first";
 
-  v8::Isolate::CreateParams params;
-  params.entry_hook = DebugImpl::GetFunctionEntryHook();
-  params.code_event_handler = DebugImpl::GetJitCodeEventHandler();
-  params.constraints.ConfigureDefaults(base::SysInfo::AmountOfPhysicalMemory(),
-                                       base::SysInfo::AmountOfVirtualMemory());
-  params.array_buffer_allocator = allocator;
-  params.allow_atomics_wait = atomics_wait_mode == kAllowAtomicsWait;
-  params.external_references = g_reference_table;
+  if (isolate_creation_mode == IsolateCreationMode::kCreateSnapshot) {
+    // This branch is called when creating a V8 snapshot for Blink.
+    // Note SnapshotCreator calls isolate->Enter() in its construction.
+    snapshot_creator_.reset(new v8::SnapshotCreator(g_reference_table));
+    isolate_ = snapshot_creator_->GetIsolate();
+  } else {
+    v8::Isolate::CreateParams params;
+    params.entry_hook = DebugImpl::GetFunctionEntryHook();
+    params.code_event_handler = DebugImpl::GetJitCodeEventHandler();
+    params.constraints.ConfigureDefaults(
+        base::SysInfo::AmountOfPhysicalMemory(),
+        base::SysInfo::AmountOfVirtualMemory());
+    params.array_buffer_allocator = allocator;
+    params.allow_atomics_wait =
+        atomics_wait_mode == AllowAtomicsWaitMode::kAllowAtomicsWait;
+    params.external_references = g_reference_table;
 
-  if (startup_data) {
-    CHECK(g_reference_table);
-    V8Initializer::GetV8ContextSnapshotData(startup_data);
-    if (startup_data->data) {
-      params.snapshot_blob = startup_data;
-    }
-  }
-  isolate_ = v8::Isolate::New(params);
-
-  SetUp(task_runner);
-}
-
-IsolateHolder::IsolateHolder(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    v8::StartupData* existing_blob)
-    : access_mode_(AccessMode::kSingleThread) {
-  CHECK(existing_blob);
-
-  v8::StartupData unused_natives;
-  V8Initializer::GetV8ExternalSnapshotData(&unused_natives, existing_blob);
-  if (!existing_blob->data) {
-    existing_blob = nullptr;
+    isolate_ = v8::Isolate::New(params);
   }
 
-  snapshot_creator_.reset(
-      new v8::SnapshotCreator(g_reference_table, existing_blob));
-  isolate_ = snapshot_creator_->GetIsolate();
-
-  DCHECK(task_runner->BelongsToCurrentThread());
-  SetUp(task_runner);
+  isolate_data_.reset(
+      new PerIsolateData(isolate_, allocator, access_mode_, task_runner));
+  isolate_memory_dump_provider_.reset(
+      new V8IsolateMemoryDumpProvider(this, task_runner));
+#if defined(OS_WIN)
+  {
+    void* code_range;
+    size_t size;
+    isolate_->GetCodeRange(&code_range, &size);
+    Debug::CodeRangeCreatedCallback callback =
+        DebugImpl::GetCodeRangeCreatedCallback();
+    if (code_range && size && callback)
+      callback(code_range, size);
+  }
+#endif
 }
 
 IsolateHolder::~IsolateHolder() {
@@ -142,26 +141,4 @@
   isolate_data_->EnableIdleTasks(std::move(idle_task_runner));
 }
 
-void IsolateHolder::SetUp(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  DCHECK(task_runner);
-  v8::ArrayBuffer::Allocator* allocator = g_array_buffer_allocator;
-  CHECK(allocator) << "You need to invoke gin::IsolateHolder::Initialize first";
-  isolate_data_.reset(
-      new PerIsolateData(isolate_, allocator, access_mode_, task_runner));
-  isolate_memory_dump_provider_.reset(
-      new V8IsolateMemoryDumpProvider(this, task_runner));
-#if defined(OS_WIN)
-  {
-    void* code_range;
-    size_t size;
-    isolate_->GetCodeRange(&code_range, &size);
-    Debug::CodeRangeCreatedCallback callback =
-        DebugImpl::GetCodeRangeCreatedCallback();
-    if (code_range && size && callback)
-      callback(code_range, size);
-  }
-#endif
-}
-
 }  // namespace gin
diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h
index 8ce49ff6..2509aca6 100644
--- a/gin/public/isolate_holder.h
+++ b/gin/public/isolate_holder.h
@@ -53,20 +53,21 @@
     kStableAndExperimentalV8Extras,
   };
 
+  // Indicates how the Isolate instance will be created.
+  enum class IsolateCreationMode {
+    kNormal,
+    kCreateSnapshot,
+  };
+
   explicit IsolateHolder(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
   IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
                 AccessMode access_mode);
-  IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-                AccessMode access_mode,
-                AllowAtomicsWaitMode atomics_wait_mode,
-                v8::StartupData* startup_data);
-
-  // This constructor is to create V8 snapshot for Blink.
-  // Note this constructor calls isolate->Enter() internally.
-  IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-                v8::StartupData* existing_blob);
-
+  IsolateHolder(
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+      AccessMode access_mode,
+      AllowAtomicsWaitMode atomics_wait_mode,
+      IsolateCreationMode isolate_creation_mode = IsolateCreationMode::kNormal);
   ~IsolateHolder();
 
   // Should be invoked once before creating IsolateHolder instances to
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc
index 03353be..a2c2814 100644
--- a/gin/v8_initializer.cc
+++ b/gin/v8_initializer.cc
@@ -41,7 +41,6 @@
 // None of these globals are ever freed nor closed.
 base::MemoryMappedFile* g_mapped_natives = nullptr;
 base::MemoryMappedFile* g_mapped_snapshot = nullptr;
-base::MemoryMappedFile* g_mapped_v8_context_snapshot = nullptr;
 
 bool GenerateEntropy(unsigned char* buffer, size_t amount) {
   base::RandBytes(buffer, amount);
@@ -87,6 +86,18 @@
 const char kSnapshotFileName[] = "snapshot_blob.bin";
 #endif  // defined(OS_ANDROID)
 
+const char* GetSnapshotFileName(
+    const V8Initializer::V8SnapshotFileType file_type) {
+  switch (file_type) {
+    case V8Initializer::V8SnapshotFileType::kDefault:
+      return kSnapshotFileName;
+    case V8Initializer::V8SnapshotFileType::kWithAdditionalContext:
+      return kV8ContextSnapshotFileName;
+  }
+  NOTREACHED();
+  return nullptr;
+}
+
 void GetV8FilePath(const char* file_name, base::FilePath* path_out) {
 #if !defined(OS_MACOSX)
   base::FilePath data_path;
@@ -242,14 +253,12 @@
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
   v8::StartupData natives;
-  natives.data = reinterpret_cast<const char*>(g_mapped_natives->data());
-  natives.raw_size = static_cast<int>(g_mapped_natives->length());
+  GetMappedFileData(g_mapped_natives, &natives);
   v8::V8::SetNativesDataBlob(&natives);
 
   if (g_mapped_snapshot) {
     v8::StartupData snapshot;
-    snapshot.data = reinterpret_cast<const char*>(g_mapped_snapshot->data());
-    snapshot.raw_size = static_cast<int>(g_mapped_snapshot->length());
+    GetMappedFileData(g_mapped_snapshot, &snapshot);
     v8::V8::SetSnapshotDataBlob(&snapshot);
   }
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
@@ -281,26 +290,26 @@
   *snapshot_size_out = snapshot.raw_size;
 }
 
-// static
-void V8Initializer::GetV8ContextSnapshotData(v8::StartupData* snapshot) {
-  GetMappedFileData(g_mapped_v8_context_snapshot, snapshot);
-}
-
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
 
 // static
-void V8Initializer::LoadV8Snapshot() {
-  if (g_mapped_snapshot)
+void V8Initializer::LoadV8Snapshot(V8SnapshotFileType snapshot_file_type) {
+  if (g_mapped_snapshot) {
+    // TODO(crbug.com/802962): Confirm not loading different type of snapshot
+    // files in a process.
     return;
+  }
 
-  LoadV8FileResult result = MapOpenedFile(GetOpenedFile(kSnapshotFileName),
-                                          &g_mapped_snapshot);
+  LoadV8FileResult result =
+      MapOpenedFile(GetOpenedFile(GetSnapshotFileName(snapshot_file_type)),
+                    &g_mapped_snapshot);
   // V8 can't start up without the source of the natives, but it can
   // start up (slower) without the snapshot.
   UMA_HISTOGRAM_ENUMERATION("V8.Initializer.LoadV8Snapshot.Result", result,
                             V8_LOAD_MAX_VALUE);
 }
 
+// static
 void V8Initializer::LoadV8Natives() {
   if (g_mapped_natives)
     return;
@@ -314,20 +323,11 @@
 }
 
 // static
-void V8Initializer::LoadV8ContextSnapshot() {
-  if (g_mapped_v8_context_snapshot)
-    return;
-
-  MapOpenedFile(GetOpenedFile(kV8ContextSnapshotFileName),
-                &g_mapped_v8_context_snapshot);
-
-  // TODO(peria): Check if the snapshot file is loaded successfully.
-}
-
-// static
-void V8Initializer::LoadV8SnapshotFromFD(base::PlatformFile snapshot_pf,
-                                         int64_t snapshot_offset,
-                                         int64_t snapshot_size) {
+void V8Initializer::LoadV8SnapshotFromFD(
+    base::PlatformFile snapshot_pf,
+    int64_t snapshot_offset,
+    int64_t snapshot_size,
+    V8SnapshotFileType snapshot_file_type) {
   if (g_mapped_snapshot)
     return;
 
@@ -345,7 +345,7 @@
   if (!MapV8File(snapshot_pf, snapshot_region, &g_mapped_snapshot))
     result = V8_LOAD_FAILED_MAP;
   if (result == V8_LOAD_SUCCESS) {
-    g_opened_files.Get()[kSnapshotFileName] =
+    g_opened_files.Get()[GetSnapshotFileName(snapshot_file_type)] =
         std::make_pair(snapshot_pf, snapshot_region);
   }
   UMA_HISTOGRAM_ENUMERATION("V8.Initializer.LoadV8Snapshot.Result", result,
@@ -375,27 +375,6 @@
       std::make_pair(natives_pf, natives_region);
 }
 
-// static
-void V8Initializer::LoadV8ContextSnapshotFromFD(base::PlatformFile snapshot_pf,
-                                                int64_t snapshot_offset,
-                                                int64_t snapshot_size) {
-  if (g_mapped_v8_context_snapshot)
-    return;
-  CHECK_NE(base::kInvalidPlatformFile, snapshot_pf);
-
-  base::MemoryMappedFile::Region snapshot_region =
-      base::MemoryMappedFile::Region::kWholeFile;
-  if (snapshot_size != 0 || snapshot_offset != 0) {
-    snapshot_region.offset = snapshot_offset;
-    snapshot_region.size = snapshot_size;
-  }
-
-  if (MapV8File(snapshot_pf, snapshot_region, &g_mapped_v8_context_snapshot)) {
-    g_opened_files.Get()[kV8ContextSnapshotFileName] =
-        std::make_pair(snapshot_pf, snapshot_region);
-  }
-}
-
 #if defined(OS_ANDROID)
 // static
 base::FilePath V8Initializer::GetNativesFilePath() {
diff --git a/gin/v8_initializer.h b/gin/v8_initializer.h
index 0c0da3c7..e427c21 100644
--- a/gin/v8_initializer.h
+++ b/gin/v8_initializer.h
@@ -33,19 +33,22 @@
                                         const char** snapshot_data_out,
                                         int* snapshot_size_out);
 
-  // Get address and size information for currently loaded V8 context snapshot.
-  // If no snapshot is loaded, the return values are nullptr and 0.
-  static void GetV8ContextSnapshotData(v8::StartupData* snapshot);
-
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+  // Indicates which file to load as a snapshot blob image.
+  enum class V8SnapshotFileType {
+    kDefault,
+
+    // Snapshot augmented with customized contexts, which can be deserialized
+    // using v8::Context::FromSnapshot.
+    kWithAdditionalContext,
+  };
 
   // Load V8 snapshot from default resources, if they are available.
-  static void LoadV8Snapshot();
+  static void LoadV8Snapshot(
+      V8SnapshotFileType snapshot_file_type = V8SnapshotFileType::kDefault);
   // Load V8 natives source from default resources. Contains asserts
   // so that it will not return if natives cannot be loaded.
   static void LoadV8Natives();
-  // Load V8 context snapshot from default resources, if they are available.
-  static void LoadV8ContextSnapshot();
 
   // Load V8 snapshot from user provided platform file descriptors.
   // The offset and size arguments, if non-zero, specify the portions
@@ -53,18 +56,14 @@
   // the snapshot, this function does not return a status.
   static void LoadV8SnapshotFromFD(base::PlatformFile snapshot_fd,
                                    int64_t snapshot_offset,
-                                   int64_t snapshot_size);
+                                   int64_t snapshot_size,
+                                   V8SnapshotFileType snapshot_file_type);
   // Similar to LoadV8SnapshotFromFD, but for the source of the natives.
   // Without the natives we cannot continue, so this function contains
   // release mode asserts and won't return if it fails.
   static void LoadV8NativesFromFD(base::PlatformFile natives_fd,
                                   int64_t natives_offset,
                                   int64_t natives_size);
-  // Load V8 context snapshot from user provided platform file descriptors.
-  // Other details are same with LoadV8SnapshotFromFD.
-  static void LoadV8ContextSnapshotFromFD(base::PlatformFile snapshot_fd,
-                                          int64_t snapshot_offset,
-                                          int64_t snapshot_size);
 
 #if defined(OS_ANDROID)
   static base::FilePath GetNativesFilePath();
diff --git a/gpu/command_buffer/tests/gl_apply_screen_space_antialiasing_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_apply_screen_space_antialiasing_CHROMIUM_unittest.cc
index 9ffb790e..6c5f24e2 100644
--- a/gpu/command_buffer/tests/gl_apply_screen_space_antialiasing_CHROMIUM_unittest.cc
+++ b/gpu/command_buffer/tests/gl_apply_screen_space_antialiasing_CHROMIUM_unittest.cc
@@ -104,6 +104,15 @@
     gl_.Initialize(options);
     CheckStatus();
   }
+  void CheckStatus() {
+    // Not applicable for devices not supporting OpenGLES3.
+    if (!gl_.IsInitialized()) {
+      LOG(INFO) << "CONTEXT_TYPE_OPENGLES3 not supported. "
+                   "Skipping test...";
+      return;
+    }
+    GLApplyScreenSpaceAntialiasingCHROMIUMTest::CheckStatus();
+  }
 };
 
 // TODO(dongseong.hwang): This test fails on the Nexus 9 GPU fyi bot.
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index a6a630a8..eb559bc 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -300,6 +300,9 @@
       gles2::PassthroughCommandDecoderSupported();
 
   init_successful_ = true;
+#if defined(USE_OZONE)
+  ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
+#endif
   return true;
 }
 
@@ -313,6 +316,7 @@
   ui::OzonePlatform::InitParams params;
   params.single_process = true;
   ui::OzonePlatform::InitializeForGPU(params);
+  ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
 #endif
 
   if (gpu_info && gpu_feature_info) {
diff --git a/ios/chrome/browser/download/BUILD.gn b/ios/chrome/browser/download/BUILD.gn
index 3892907..8bf6ece 100644
--- a/ios/chrome/browser/download/BUILD.gn
+++ b/ios/chrome/browser/download/BUILD.gn
@@ -25,6 +25,7 @@
     "//components/keyed_service/core",
     "//components/keyed_service/ios",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/ui:network_activity_indicator_manager",
     "//ios/web/public",
     "//ios/web/public/download",
   ]
@@ -49,6 +50,7 @@
     "//base/test:test_support",
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/download",
+    "//ios/chrome/browser/ui:network_activity_indicator_manager",
     "//ios/chrome/test/fakes",
     "//ios/testing:ios_test_support",
     "//ios/web/public",
diff --git a/ios/chrome/browser/download/download_manager_tab_helper.h b/ios/chrome/browser/download/download_manager_tab_helper.h
index a313539..303da08 100644
--- a/ios/chrome/browser/download/download_manager_tab_helper.h
+++ b/ios/chrome/browser/download/download_manager_tab_helper.h
@@ -7,6 +7,8 @@
 
 #include <memory>
 
+#import <Foundation/Foundation.h>
+
 #include "base/macros.h"
 #include "ios/web/public/download/download_task_observer.h"
 #import "ios/web/public/web_state/web_state_observer.h"
@@ -48,6 +50,9 @@
   // web::DownloadTaskObserver overrides:
   void OnDownloadUpdated(web::DownloadTask* task) override;
 
+  // Returns key for using with NetworkActivityIndicatorManager.
+  NSString* GetNetworkActivityKey() const;
+
   web::WebState* web_state_ = nullptr;
   __weak id<DownloadManagerTabHelperDelegate> delegate_ = nil;
   std::unique_ptr<web::DownloadTask> task_;
diff --git a/ios/chrome/browser/download/download_manager_tab_helper.mm b/ios/chrome/browser/download/download_manager_tab_helper.mm
index f2583aa5..cc7e60e 100644
--- a/ios/chrome/browser/download/download_manager_tab_helper.mm
+++ b/ios/chrome/browser/download/download_manager_tab_helper.mm
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #import "ios/chrome/browser/download/download_manager_tab_helper_delegate.h"
+#import "ios/chrome/browser/ui/network_activity_indicator_manager.h"
 #import "ios/web/public/download/download_task.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -60,6 +61,8 @@
 void DownloadManagerTabHelper::WebStateDestroyed(web::WebState* web_state) {
   web_state->RemoveObserver(this);
   if (task_) {
+    [[NetworkActivityIndicatorManager sharedInstance]
+        clearNetworkTasksForGroup:GetNetworkActivityKey()];
     task_->RemoveObserver(this);
     task_ = nullptr;
   }
@@ -69,11 +72,19 @@
   DCHECK_EQ(task, task_.get());
   switch (task->GetState()) {
     case web::DownloadTask::State::kCancelled:
+      [[NetworkActivityIndicatorManager sharedInstance]
+          clearNetworkTasksForGroup:GetNetworkActivityKey()];
       task_->RemoveObserver(this);
       task_ = nullptr;
       break;
     case web::DownloadTask::State::kInProgress:
+      [[NetworkActivityIndicatorManager sharedInstance]
+          startNetworkTaskForGroup:GetNetworkActivityKey()];
+      [delegate_ downloadManagerTabHelper:this didUpdateDownload:task_.get()];
+      break;
     case web::DownloadTask::State::kComplete:
+      [[NetworkActivityIndicatorManager sharedInstance]
+          clearNetworkTasksForGroup:GetNetworkActivityKey()];
       [delegate_ downloadManagerTabHelper:this didUpdateDownload:task_.get()];
       break;
     case web::DownloadTask::State::kNotStarted:
@@ -81,3 +92,8 @@
       NOTREACHED();
   }
 }
+
+NSString* DownloadManagerTabHelper::GetNetworkActivityKey() const {
+  return [@"DownloadManagerTabHelper."
+      stringByAppendingString:task_->GetIndentifier()];
+}
diff --git a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
index 2b85ccb4..e2b2e99 100644
--- a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
+++ b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
@@ -4,9 +4,13 @@
 
 #import "ios/chrome/browser/download/download_manager_tab_helper.h"
 
+#include <memory>
+
+#import "ios/chrome/browser/ui/network_activity_indicator_manager.h"
 #import "ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h"
 #import "ios/web/public/test/fakes/fake_download_task.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
+#include "net/url_request/url_fetcher_response_writer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 
@@ -23,15 +27,16 @@
 class DownloadManagerTabHelperTest : public PlatformTest {
  protected:
   DownloadManagerTabHelperTest()
-      : delegate_([[FakeDownloadManagerTabHelperDelegate alloc] init]) {
-    DownloadManagerTabHelper::CreateForWebState(&web_state_, delegate_);
+      : web_state_(std::make_unique<web::TestWebState>()),
+        delegate_([[FakeDownloadManagerTabHelperDelegate alloc] init]) {
+    DownloadManagerTabHelper::CreateForWebState(web_state_.get(), delegate_);
   }
 
   DownloadManagerTabHelper* tab_helper() {
-    return DownloadManagerTabHelper::FromWebState(&web_state_);
+    return DownloadManagerTabHelper::FromWebState(web_state_.get());
   }
 
-  web::TestWebState web_state_;
+  std::unique_ptr<web::TestWebState> web_state_;
   FakeDownloadManagerTabHelperDelegate* delegate_;
 };
 
@@ -67,10 +72,67 @@
   ASSERT_TRUE(delegate_.state);
   EXPECT_EQ(web::DownloadTask::State::kNotStarted, *delegate_.state);
 
-  web_state_.WasHidden();
+  web_state_->WasHidden();
   EXPECT_FALSE(delegate_.state);
 
-  web_state_.WasShown();
+  web_state_->WasShown();
   ASSERT_TRUE(delegate_.state);
   EXPECT_EQ(web::DownloadTask::State::kNotStarted, *delegate_.state);
 }
+
+// Tests showing network activity indicator when download is started and hiding
+// when download is cancelled.
+TEST_F(DownloadManagerTabHelperTest, NetworkActivityIndicatorOnCancel) {
+  ASSERT_FALSE(delegate_.state);
+  auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
+
+  web::FakeDownloadTask* task_ptr = task.get();
+  tab_helper()->Download(std::move(task));
+  ASSERT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+  task_ptr->Start(std::make_unique<net::URLFetcherStringWriter>());
+  EXPECT_EQ(1U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+
+  task_ptr->Cancel();
+  EXPECT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+}
+
+// Tests showing network activity indicator when download is started and hiding
+// when download is complete.
+TEST_F(DownloadManagerTabHelperTest, NetworkActivityIndicatorOnDone) {
+  ASSERT_FALSE(delegate_.state);
+  auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
+
+  web::FakeDownloadTask* task_ptr = task.get();
+  tab_helper()->Download(std::move(task));
+  ASSERT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+  task_ptr->Start(std::make_unique<net::URLFetcherStringWriter>());
+  EXPECT_EQ(1U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+
+  task_ptr->SetDone(true);
+  EXPECT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+}
+
+// Tests showing network activity indicator when download is started and hiding
+// when tab helper is destroyed.
+TEST_F(DownloadManagerTabHelperTest, NetworkActivityIndicatorOnDestruction) {
+  ASSERT_FALSE(delegate_.state);
+  auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
+
+  web::FakeDownloadTask* task_ptr = task.get();
+  tab_helper()->Download(std::move(task));
+  ASSERT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+  task_ptr->Start(std::make_unique<net::URLFetcherStringWriter>());
+  EXPECT_EQ(1U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+
+  web_state_ = nullptr;
+  EXPECT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
+                    numTotalNetworkTasks]);
+}
diff --git a/ios/chrome/browser/passwords/OWNERS b/ios/chrome/browser/passwords/OWNERS
index 3e2b5db..6576ef6 100644
--- a/ios/chrome/browser/passwords/OWNERS
+++ b/ios/chrome/browser/passwords/OWNERS
@@ -1,5 +1,4 @@
 dvadym@chromium.org
-melandory@chromium.org
 vabr@chromium.org
 vasilii@chromium.org
 
diff --git a/ios/chrome/browser/ui/BUILD.gn b/ios/chrome/browser/ui/BUILD.gn
index bd62258..98e985a 100644
--- a/ios/chrome/browser/ui/BUILD.gn
+++ b/ios/chrome/browser/ui/BUILD.gn
@@ -16,8 +16,6 @@
     "file_locations.mm",
     "native_content_controller.h",
     "native_content_controller.mm",
-    "network_activity_indicator_manager.h",
-    "network_activity_indicator_manager.mm",
     "orientation_limiting_navigation_controller.h",
     "orientation_limiting_navigation_controller.mm",
     "prerender_final_status.h",
@@ -28,6 +26,7 @@
     "url_loader.h",
   ]
   public_deps = [
+    ":network_activity_indicator_manager",
     ":ui_util",
     "//ios/chrome/browser/ui/util:constraints_ui",
   ]
@@ -44,6 +43,17 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("network_activity_indicator_manager") {
+  sources = [
+    "network_activity_indicator_manager.h",
+    "network_activity_indicator_manager.mm",
+  ]
+  deps = [
+    "//base",
+  ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
+
 source_set("ui_util") {
   sources = [
     "rtl_geometry.h",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
index 526a8ab..384801a0 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -297,12 +297,6 @@
   [self.NTPMediator dismissModals];
 }
 
-- (void)dismissKeyboard {
-}
-
-- (void)setScrollsToTop:(BOOL)enable {
-}
-
 - (CGPoint)scrollOffset {
   CGPoint collectionOffset =
       self.suggestionsViewController.collectionView.contentOffset;
@@ -311,4 +305,8 @@
   return collectionOffset;
 }
 
+- (void)willUpdateSnapshot {
+  [self.suggestionsViewController clearOverscroll];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h
index 37bde63..37a6d3f 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h
@@ -70,6 +70,8 @@
 - (NSInteger)numberOfSectionsAbove:(NSInteger)section;
 // Updates the constraints of the collection.
 - (void)updateConstraints;
+// Clear the overscroll actions.
+- (void)clearOverscroll;
 
 // Returns the accessibility identifier of the collection.
 + (NSString*)collectionAccessibilityIdentifier;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
index f461176..84f9cb1 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -203,6 +203,10 @@
   }
 }
 
+- (void)clearOverscroll {
+  [self.overscrollActionsController clear];
+}
+
 + (NSString*)collectionAccessibilityIdentifier {
   return @"ContentSuggestionsCollectionIdentifier";
 }
diff --git a/ios/chrome/browser/ui/ntp/incognito_view_controller.mm b/ios/chrome/browser/ui/ntp/incognito_view_controller.mm
index 41f54694..73fd3dc 100644
--- a/ios/chrome/browser/ui/ntp/incognito_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/incognito_view_controller.mm
@@ -90,16 +90,17 @@
 - (void)dismissModals {
 }
 
-- (void)dismissKeyboard {
-}
-
-- (void)setScrollsToTop:(BOOL)enable {
-}
-
 - (CGFloat)alphaForBottomShadow {
   return 0;
 }
 
+- (CGPoint)scrollOffset {
+  return CGPointZero;
+}
+
+- (void)willUpdateSnapshot {
+}
+
 #pragma mark - UIScrollViewDelegate methods
 
 - (void)scrollViewDidScroll:(UIScrollView*)scrollView {
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
index adedd74..040b735 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
@@ -259,26 +259,16 @@
   return NO;
 }
 
-- (void)dismissKeyboard {
-  [_currentController dismissKeyboard];
-}
-
 - (void)dismissModals {
   [_currentController dismissModals];
 }
 
 - (void)willUpdateSnapshot {
-  if ([_currentController respondsToSelector:@selector(willUpdateSnapshot)]) {
-    [_currentController willUpdateSnapshot];
-  }
+  [_currentController willUpdateSnapshot];
 }
 
 - (CGPoint)scrollOffset {
-  if (_currentController == self.homePanel &&
-      [self.homePanel respondsToSelector:@selector(scrollOffset)]) {
-    return [self.homePanel scrollOffset];
-  }
-  return CGPointZero;
+  return [_currentController scrollOffset];
 }
 
 #pragma mark -
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_panel_protocol.h b/ios/chrome/browser/ui/ntp/new_tab_page_panel_protocol.h
index 0838f340..f89f8e6e5 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_panel_protocol.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_panel_protocol.h
@@ -20,19 +20,9 @@
 
 @end
 
-// TODO(jbbegue): rename, extract and upstream so that CRWNativeContent can
-// implement it ( https://crbug.com/492156 ).
-@protocol NewTabPagePanelControllerSnapshotting<NSObject>
-
-@optional
-// Called when a snapshot of the content will be taken.
-- (void)willUpdateSnapshot;
-
-@end
-
 // Base class of a controller for the panels in the New Tab Page. This should
 // not be instantiated, but instead one of its sub-classes.
-@protocol NewTabPagePanelProtocol<NewTabPagePanelControllerSnapshotting>
+@protocol NewTabPagePanelProtocol
 
 // NewTabPagePanelController delegate, may be nil.
 @property(nonatomic, assign) id<NewTabPagePanelControllerDelegate> delegate;
@@ -52,17 +42,12 @@
 // Dismisses any modal interaction elements.
 - (void)dismissModals;
 
-// Dismisses on-screen keyboard if necessary.
-- (void)dismissKeyboard;
-
-// Disable and enable scrollToTop
-- (void)setScrollsToTop:(BOOL)enable;
-
-@optional
-
 // Returns the scroll offset associated with this panel.
 - (CGPoint)scrollOffset;
 
+// Called when a snapshot of the content will be taken.
+- (void)willUpdateSnapshot;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_PANEL_PROTOCOL_H_
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_coordinator.mm b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_coordinator.mm
index 79327ab1..ca6c46b 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_coordinator.mm
@@ -59,8 +59,6 @@
   [self.recentTabsViewController dismissViewControllerAnimated:YES
                                                     completion:self.completion];
   self.completion = nil;
-  [self.tableCoordinator dismissKeyboard];
-  [self.tableCoordinator dismissModals];
   [self.tableCoordinator stop];
   self.tableCoordinator = nil;
   self.recentTabsViewController = nil;
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.h b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.h
index 5360cbc..926239c 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.h
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.h
@@ -19,15 +19,13 @@
 @class RecentTabsTableViewController;
 @protocol UrlLoader;
 
-// This is the controller for the Recent Tabs panel on the New Tab Page.
 // RecentTabsTableCoordinator controls the RecentTabTableViewDataSource, based
 // on the user's signed-in and chrome-sync states.
 //
 // RecentTabsTableCoordinator listens for notifications about Chrome Sync
 // and ChromeToDevice and changes/updates the view accordingly.
 //
-@interface RecentTabsTableCoordinator
-    : ChromeCoordinator<NewTabPagePanelProtocol>
+@interface RecentTabsTableCoordinator : ChromeCoordinator
 
 // Command handler for the command sent when the device is a handset. Nil
 // otherwise.
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.mm b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.mm
index 2cf15fe..ac0375f 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.mm
@@ -56,8 +56,6 @@
 @implementation RecentTabsTableCoordinator
 
 @synthesize handsetCommandHandler = _handsetCommandHandler;
-// Property declared in NewTabPagePanelProtocol.
-@synthesize delegate = _delegate;
 
 - (instancetype)initWithLoader:(id<UrlLoader>)loader
                   browserState:(ios::ChromeBrowserState*)browserState
@@ -89,10 +87,15 @@
 }
 
 - (void)stop {
+  [_tableViewController dismissModals];
   [_tableViewController setDelegate:nil];
   [self deallocObservers];
 }
 
+- (UIViewController*)viewController {
+  return _tableViewController;
+}
+
 #pragma mark - Exposed to the SyncedSessionsObserver
 
 - (void)reloadSessions {
@@ -117,52 +120,6 @@
   [_tableViewController setTabRestoreService:nullptr];
 }
 
-#pragma mark - NewTabPagePanelProtocol
-
-- (void)dismissModals {
-  [_tableViewController dismissModals];
-}
-
-- (void)dismissKeyboard {
-}
-
-- (void)reload {
-  [self reloadSessions];
-}
-
-- (void)wasShown {
-  [[_tableViewController tableView] reloadData];
-  [self initObservers];
-}
-
-- (void)wasHidden {
-  [self deallocObservers];
-}
-
-- (void)setScrollsToTop:(BOOL)enabled {
-  [_tableViewController setScrollsToTop:enabled];
-}
-
-- (CGFloat)alphaForBottomShadow {
-  UITableView* tableView = [_tableViewController tableView];
-  CGFloat contentHeight = tableView.contentSize.height;
-  CGFloat scrollViewHeight = tableView.frame.size.height;
-  CGFloat offsetY = tableView.contentOffset.y;
-
-  CGFloat pixelsBelowFrame = contentHeight - offsetY - scrollViewHeight;
-  CGFloat alpha = pixelsBelowFrame / kNewTabPageDistanceToFadeShadow;
-  alpha = MIN(MAX(alpha, 0), 1);
-  return alpha;
-}
-
-- (UIView*)view {
-  return [_tableViewController view];
-}
-
-- (UIViewController*)viewController {
-  return _tableViewController;
-}
-
 #pragma mark - Private
 
 - (void)initObservers {
@@ -247,10 +204,6 @@
 
 #pragma mark - RecentTabsTableViewControllerDelegate
 
-- (void)recentTabsTableViewContentMoved:(UITableView*)tableView {
-  [self.delegate updateNtpBarShadowForPanelController:self];
-}
-
 - (void)refreshSessionsViewRecentTabsTableViewController:
     (RecentTabsTableViewController*)controller {
   [self refreshSessionsView];
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h
index dbdae87..a2f295c 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h
@@ -27,9 +27,6 @@
 extern NSString* const kRecentTabsTableViewControllerAccessibilityIdentifier;
 
 @protocol RecentTabsTableViewControllerDelegate<NSObject>
-// Tells the delegate when the table view content scrolled or changed size.
-- (void)recentTabsTableViewContentMoved:(UITableView*)tableView;
-
 // Tells the delegate to refresh the session view.
 - (void)refreshSessionsViewRecentTabsTableViewController:
     (RecentTabsTableViewController*)controller;
@@ -76,9 +73,6 @@
 // the service in case it is not available anymore.
 - (void)setTabRestoreService:(sessions::TabRestoreService*)tabRestoreService;
 
-// Sets whether scroll to top is enabled.
-- (void)setScrollsToTop:(BOOL)enabled;
-
 // Dismisses any outstanding modal user interface elements.
 - (void)dismissModals;
 
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.mm
index 0bcb1586..87d5c0cb 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.mm
@@ -194,7 +194,6 @@
 
 - (void)dealloc {
   [_signinPromoViewMediator signinPromoViewRemoved];
-  [self.tableView removeObserver:self forKeyPath:@"contentSize"];
 }
 
 - (void)viewDidLoad {
@@ -213,19 +212,6 @@
                   action:@selector(handleLongPress:)];
   longPress.delegate = self;
   [self.tableView addGestureRecognizer:longPress];
-
-  [self.tableView addObserver:self
-                   forKeyPath:@"contentSize"
-                      options:0
-                      context:NULL];
-}
-
-- (void)observeValueForKeyPath:(NSString*)keyPath
-                      ofObject:(id)object
-                        change:(NSDictionary*)change
-                       context:(void*)context {
-  if ([keyPath isEqualToString:@"contentSize"])
-    [delegate_ recentTabsTableViewContentMoved:self.tableView];
 }
 
 - (SectionType)sectionType:(NSInteger)section {
@@ -308,10 +294,6 @@
   return 2;
 }
 
-- (void)setScrollsToTop:(BOOL)enabled {
-  [self.tableView setScrollsToTop:enabled];
-}
-
 - (void)dismissModals {
   [_contextMenuCoordinator stop];
 }
@@ -415,12 +397,8 @@
   ProceduralBlock openHistory = ^{
     [weakSelf.dispatcher showHistory];
   };
-  // Dismiss modal, if shown, and open history.
-  if (self.handsetCommandHandler) {
-    [self.handsetCommandHandler dismissRecentTabsWithCompletion:openHistory];
-  } else {
-    openHistory();
-  }
+  DCHECK(self.handsetCommandHandler);
+  [self.handsetCommandHandler dismissRecentTabsWithCompletion:openHistory];
 }
 
 #pragma mark - Handling of the collapsed sections.
@@ -998,12 +976,6 @@
   return 0;
 }
 
-#pragma mark - UIScrollViewDelegate
-
-- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
-  [delegate_ recentTabsTableViewContentMoved:self.tableView];
-}
-
 #pragma mark - SigninPromoViewConsumer
 
 - (void)configureSigninPromoWithConfigurator:
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn b/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
index e35de9b..202f2d3 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
@@ -59,6 +59,7 @@
     "//ios/chrome/browser/ui/toolbar/clean:toolbar_components_ui",
     "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
     "//ios/chrome/browser/ui/toolbar/public",
+    "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/util:constraints_ui",
     "//ios/third_party/material_components_ios",
   ]
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
index b534c5f..faf5817 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
@@ -61,11 +61,12 @@
 #pragma mark - ToolbarCoordinating
 
 - (void)updateToolbarState {
-  // TODO(crbug.com/801082): Implement that.
+  // TODO(crbug.com/803386): This call is needed for interstitials. Check if it
+  // is possible to remove it.
 }
 
 - (void)setToolbarBackgroundAlpha:(CGFloat)alpha {
-  // TODO(crbug.com/801082): Implement that.
+  // TODO(crbug.com/803379): Implement that.
 }
 
 #pragma mark - ToolbarCommands
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
index 4659804..0e92376 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
@@ -64,27 +64,27 @@
 #pragma mark - PrimaryToolbarCoordinator
 
 - (id<VoiceSearchControllerDelegate>)voiceSearchDelegate {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/799446): This code should be moved to the location bar.
   return nil;
 }
 
 - (id<QRScannerResultLoading>)QRScannerResultLoader {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/799446): This code should be moved to the location bar.
   return nil;
 }
 
 - (id<TabHistoryUIUpdater>)tabHistoryUIUpdater {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/803373): Implement that.
   return nil;
 }
 
 - (id<ActivityServicePositioner>)activityServicePositioner {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/803376): Implement that.
   return nil;
 }
 
 - (void)showPrerenderingAnimation {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/803377): Implement that.
 }
 
 - (BOOL)isOmniboxFirstResponder {
@@ -101,19 +101,9 @@
 #pragma mark - ToolbarCoordinating
 
 - (void)updateToolbarState {
-}
-
-- (void)setToolbarBackgroundAlpha:(CGFloat)alpha {
-}
-
-#pragma mark - ToolbarCommands
-
-- (void)contractToolbar {
-  // TODO(crbug.com/801082): Implement that.
-}
-
-- (void)triggerToolsMenuButtonAnimation {
-  // TODO(crbug.com/801083): Implement that.
+  // TODO(crbug.com/803383): This should be done inside the location bar.
+  [self.locationBarCoordinator updateOmniboxState];
+  [super updateToolbarState];
 }
 
 #pragma mark - OmniboxFocuser
@@ -130,15 +120,15 @@
 }
 
 - (void)focusFakebox {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/803372): Implement that.
 }
 
 - (void)onFakeboxBlur {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/803372): Implement that.
 }
 
 - (void)onFakeboxAnimationComplete {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/803372): Implement that.
 }
 
 #pragma mark - LocationBarDelegate
@@ -214,7 +204,7 @@
 }
 
 - (UIImage*)toolbarSideSwipeSnapshotForTab:(Tab*)tab {
-  // TODO(crbug.com/799438): Implement that.
+  // TODO(crbug.com/803371): Implement that.
   return nil;
 }
 
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
index d9a9b3d0..d30bcf9a 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
@@ -6,6 +6,9 @@
 
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/clean/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/clean/toolbar_tools_menu_button.h"
+#import "ios/chrome/browser/ui/util/named_guide.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -33,6 +36,12 @@
   }
 }
 
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.view.toolsMenuButton.guideName = kTabSwitcherGuide;
+  self.view.toolsMenuButton.constraintPriority = kPrimaryToolbarButtonPriority;
+}
+
 #pragma mark - Property accessors
 
 - (void)setLocationBarView:(UIView*)locationBarView {
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.mm
index f3c220f0..83b4478a 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.mm
@@ -5,6 +5,9 @@
 #import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.h"
 
 #import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/clean/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/clean/toolbar_tools_menu_button.h"
+#import "ios/chrome/browser/ui/util/named_guide.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -25,4 +28,11 @@
   self.view.buttonFactory = self.buttonFactory;
 }
 
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.view.toolsMenuButton.guideName = kTabSwitcherGuide;
+  self.view.toolsMenuButton.constraintPriority =
+      kSecondaryToolbarButtonPriority;
+}
+
 @end
diff --git a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn b/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
index 0adfcc1..e695ebc9 100644
--- a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
@@ -120,6 +120,7 @@
     "//ios/chrome/browser/ui/toolbar:resource_macros",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/toolbar/public:toolbar_base_feature",
+    "//ios/chrome/browser/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/images",
     "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_button.h b/ios/chrome/browser/ui/toolbar/clean/toolbar_button.h
index a6767fba..0160fdf 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_button.h
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_button.h
@@ -8,6 +8,7 @@
 #import <UIKit/UIKit.h>
 
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_component_options.h"
+#import "ios/chrome/browser/ui/util/named_guide.h"
 
 // UIButton subclass used as a Toolbar component.
 @interface ToolbarButton : UIButton
@@ -19,6 +20,12 @@
 // Returns true if the ToolbarButton should be hidden due to a current UI state
 // or WebState.
 @property(nonatomic, assign) BOOL hiddenInCurrentState;
+// Named of the layout guide this button should be constrained to, if not nil.
+@property(nonatomic, strong) GuideName* guideName;
+// Priority of the constraints between the layout guide and the button, when
+// activated. Use different priorities to avoid having conflicting constraints
+// when moving the layout guide from one button to another.
+@property(nonatomic, assign) UILayoutPriority constraintPriority;
 // Returns a ToolbarButton using the three images parameters for their
 // respective state.
 + (instancetype)toolbarButtonWithImageForNormalState:(UIImage*)normalImage
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_button.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_button.mm
index 000767a..df8bee8 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_button.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_button.mm
@@ -10,10 +10,19 @@
 #error "This file requires ARC support."
 #endif
 
+@interface ToolbarButton ()
+// Constraints for the named layout guide.
+@property(nonatomic, strong)
+    NSArray<NSLayoutConstraint*>* namedGuideConstraints;
+@end
+
 @implementation ToolbarButton
 @synthesize visibilityMask = _visibilityMask;
+@synthesize guideName = _guideName;
+@synthesize constraintPriority = _constraintPriority;
 @synthesize hiddenInCurrentSizeClass = _hiddenInCurrentSizeClass;
 @synthesize hiddenInCurrentState = _hiddenInCurrentState;
+@synthesize namedGuideConstraints = _namedGuideConstraints;
 
 + (instancetype)toolbarButtonWithImageForNormalState:(UIImage*)normalImage
                             imageForHighlightedState:(UIImage*)highlightedImage
@@ -25,6 +34,7 @@
   [button setImage:highlightedImage forState:UIControlStateSelected];
   button.titleLabel.textAlignment = NSTextAlignmentCenter;
   button.translatesAutoresizingMaskIntoConstraints = NO;
+  button.constraintPriority = UILayoutPriorityRequired;
   return button;
 }
 
@@ -42,6 +52,31 @@
   }
 }
 
+#pragma mark - Property accessors
+
+- (void)setGuideName:(GuideName*)guideName {
+  _guideName = guideName;
+  [NSLayoutConstraint deactivateConstraints:self.namedGuideConstraints];
+  self.namedGuideConstraints = nil;
+
+  if (!_guideName)
+    return;
+
+  UILayoutGuide* guide = FindNamedGuide(_guideName, self);
+  if (!guide)
+    return;
+
+  self.namedGuideConstraints = @[
+    [guide.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],
+    [guide.trailingAnchor constraintEqualToAnchor:self.trailingAnchor],
+    [guide.topAnchor constraintEqualToAnchor:self.topAnchor],
+    [guide.bottomAnchor constraintEqualToAnchor:self.bottomAnchor]
+  ];
+  for (NSLayoutConstraint* constraint in self.namedGuideConstraints) {
+    constraint.priority = self.constraintPriority;
+  }
+}
+
 #pragma mark - Public Methods
 
 - (void)updateHiddenInCurrentSizeClass {
@@ -97,6 +132,11 @@
 // and hiddenInCurrentState properties, then updates its visibility accordingly.
 - (void)setHiddenForCurrentStateAndSizeClass {
   self.hidden = self.hiddenInCurrentState || self.hiddenInCurrentSizeClass;
+  if (self.hidden) {
+    [NSLayoutConstraint deactivateConstraints:self.namedGuideConstraints];
+  } else {
+    [NSLayoutConstraint activateConstraints:self.namedGuideConstraints];
+  }
 }
 
 @end
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.h b/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.h
index e92359d..a72fe64be 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.h
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.h
@@ -50,6 +50,14 @@
 extern const CGFloat kForwardButtonImageInset;
 extern const CGFloat kLeadingLocationBarButtonImageInset;
 
+// Priorities for the constraints between the buttons and their layout guide.
+// The constraint priorities for the different toolbars' buttons are not the
+// same to prevent conflicting constraints when a layout guide is changing the
+// button to which it is constrained (there might be a short time during which
+// it is constrained to both buttons).
+extern const UILayoutPriority kPrimaryToolbarButtonPriority;
+extern const UILayoutPriority kSecondaryToolbarButtonPriority;
+
 // Maximum number of tabs displayed by the button containing the tab count.
 extern const NSInteger kShowTabStripButtonMaxTabCount;
 
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.mm
index 7a37185..25fc5f9c 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_constants.mm
@@ -39,6 +39,14 @@
 const CGFloat kForwardButtonImageInset = -7;
 const CGFloat kLeadingLocationBarButtonImageInset = 15;
 
+// The priority is not UILayoutPriorityHigh as it should be
+// UILayoutPriorityRequired aside from the very small time interval during
+// which they are conflicting. Also, it allows to have potentially more
+// priorities.
+const UILayoutPriority kPrimaryToolbarButtonPriority = UILayoutPriorityRequired;
+const UILayoutPriority kSecondaryToolbarButtonPriority =
+    kPrimaryToolbarButtonPriority - 1;
+
 const NSInteger kShowTabStripButtonMaxTabCount = 99;
 
 const LayoutOffset kToolbarButtonAnimationOffset = -10.0;
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
index a3d0f2f..2ea62cc 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
@@ -215,9 +215,12 @@
 }
 
 - (void)updateToolbarState {
+  // TODO(crbug.com/803383): This should be done inside the location bar.
   // Updates the omnibox.
   [self.locationBarCoordinator updateOmniboxState];
   // Updates the toolbar buttons.
+  // TODO(crbug.com/803386): This call is needed for interstitials. Check if it
+  // is possible to remove it.
   if ([self getWebState])
     [self.mediator updateConsumerForWebState:[self getWebState]];
 }
diff --git a/ios/web/public/global_state/ios_global_state.mm b/ios/web/public/global_state/ios_global_state.mm
index 41b35e8d1..488f86c 100644
--- a/ios/web/public/global_state/ios_global_state.mm
+++ b/ios/web/public/global_state/ios_global_state.mm
@@ -48,9 +48,7 @@
       g_exit_manager = new base::AtExitManager();
     }
 
-    // Use an empty string as TaskScheduler name to match the suffix of browser
-    // process TaskScheduler histograms.
-    base::TaskScheduler::Create("");
+    base::TaskScheduler::Create("Browser");
 
     base::CommandLine::Init(create_params.argc, create_params.argv);
   });
diff --git a/ios/web/public/test/fakes/fake_download_task.mm b/ios/web/public/test/fakes/fake_download_task.mm
index 1536043..2132f33b 100644
--- a/ios/web/public/test/fakes/fake_download_task.mm
+++ b/ios/web/public/test/fakes/fake_download_task.mm
@@ -15,7 +15,7 @@
 
 FakeDownloadTask::FakeDownloadTask(const GURL& original_url,
                                    const std::string& mime_type)
-    : original_url_(original_url), mime_type_(mime_type) {}
+    : original_url_(original_url), mime_type_(mime_type), identifier_(@"") {}
 
 FakeDownloadTask::~FakeDownloadTask() = default;
 
@@ -26,6 +26,7 @@
 void FakeDownloadTask::Start(
     std::unique_ptr<net::URLFetcherResponseWriter> writer) {
   writer_ = std::move(writer);
+  state_ = State::kInProgress;
   OnDownloadUpdated();
 }
 
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 6da4349..464cadb 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -4225,17 +4225,14 @@
                              responseURL, contentDisposition, contentLength,
                              base::SysNSStringToUTF8(MIMEType),
                              context->GetPageTransition());
-    BOOL downloadItem =
-        (base::FeatureList::IsEnabled(web::features::kNewPassKitDownload) ||
-         base::FeatureList::IsEnabled(web::features::kNewFileDownload));
-
+    BOOL isPassKit = [MIMEType isEqualToString:@"application/vnd.apple.pkpass"];
     if (!base::FeatureList::IsEnabled(web::features::kNewPassKitDownload) &&
-        [self.passKitDownloader isMIMETypePassKitType:MIMEType]) {
+        isPassKit) {
       [self.passKitDownloader downloadPassKitFileWithURL:responseURL];
-      downloadItem = YES;
     }
 
-    if (downloadItem) {
+    if (isPassKit ||
+        base::FeatureList::IsEnabled(web::features::kNewFileDownload)) {
       // Discard the pending item to ensure that the current URL is not
       // different from what is displayed on the view. If there is no previous
       // committed URL, which can happen when a link is opened in a new tab via
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
index a18b60d..ebadd93 100644
--- a/ipc/ipc_message_utils.cc
+++ b/ipc/ipc_message_utils.cc
@@ -618,6 +618,15 @@
   // subtypes, both are transferred via file descriptor but need to be handled
   // differently by the receiver. Write the type to distinguish.
   WriteParam(m, p.GetType());
+  WriteParam(m, p.IsReadOnly());
+
+  // Ensure the region is read-only before sending it through IPC.
+  if (p.IsReadOnly()) {
+    if (!p.IsRegionReadOnly()) {
+      LOG(ERROR) << "Sending unsealed read-only region through IPC";
+      p.SetRegionReadOnly();
+    }
+  }
 #endif
   if (p.OwnershipPassesToIPC()) {
     if (!m->WriteAttachment(new internal::PlatformFileAttachment(
@@ -670,8 +679,11 @@
   // Android uses both ashmen and AHardwareBuffer subtypes, get the actual type
   // for use as a constructor argument alongside the file descriptor.
   base::SharedMemoryHandle::Type android_subtype;
-  if (!ReadParam(m, iter, &android_subtype))
+  bool is_read_only = false;
+  if (!ReadParam(m, iter, &android_subtype) ||
+      !ReadParam(m, iter, &is_read_only)) {
     return false;
+  }
 #endif
   scoped_refptr<base::Pickle::Attachment> attachment;
   if (!m->ReadAttachment(iter, &attachment))
@@ -706,6 +718,8 @@
               ->TakePlatformFile(),
           true),
       static_cast<size_t>(size), guid);
+  if (is_read_only)
+    r->SetReadOnly();
 #else
   *r = base::SharedMemoryHandle(
       base::FileDescriptor(
@@ -735,6 +749,10 @@
   LogParam(p.GetGUID(), l);
   l->append("size: ");
   LogParam(static_cast<uint64_t>(p.GetSize()), l);
+#if defined(OS_ANDROID)
+  l->append("read-only: ");
+  LogParam(p.IsReadOnly(), l);
+#endif
 }
 
 #if defined(OS_WIN)
diff --git a/media/blink/run_all_unittests.cc b/media/blink/run_all_unittests.cc
index c634206..f6d51a3 100644
--- a/media/blink/run_all_unittests.cc
+++ b/media/blink/run_all_unittests.cc
@@ -29,6 +29,18 @@
 #include "gin/v8_initializer.h"
 #endif
 
+namespace {
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+#if defined(USE_V8_CONTEXT_SNAPSHOT)
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kWithAdditionalContext;
+#else
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kDefault;
+#endif
+#endif
+}
+
 class TestBlinkPlatformSupport : public blink::Platform {
  public:
   TestBlinkPlatformSupport()
@@ -84,12 +96,9 @@
   media::InitializeMediaLibrary();
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
-  gin::V8Initializer::LoadV8Snapshot();
+  gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
   gin::V8Initializer::LoadV8Natives();
 #endif
-#ifdef USE_V8_CONTEXT_SNAPSHOT
-  gin::V8Initializer::LoadV8ContextSnapshot();
-#endif
 
 // Initialize mojo firstly to enable Blink initialization to use it.
 #if !defined(OS_IOS)
diff --git a/mojo/edk/embedder/platform_shared_buffer.cc b/mojo/edk/embedder/platform_shared_buffer.cc
index 6b44540..c2a6b1d 100644
--- a/mojo/edk/embedder/platform_shared_buffer.cc
+++ b/mojo/edk/embedder/platform_shared_buffer.cc
@@ -180,6 +180,34 @@
   return SharedMemoryToPlatformHandle(handle);
 }
 
+ScopedPlatformHandle PlatformSharedBuffer::DuplicatePlatformHandleForIPC() {
+  DCHECK(shared_memory_);
+  base::SharedMemoryHandle handle;
+  {
+    base::AutoLock locker(lock_);
+    handle = base::SharedMemory::DuplicateHandle(shared_memory_->handle());
+  }
+  if (!handle.IsValid())
+    return ScopedPlatformHandle();
+
+#if defined(OS_ANDROID)
+  if (handle.IsReadOnly()) {
+    // Trying to send a descriptor with the |read_only| property set
+    // while the region has not been sealed read-only yet is a programmer
+    // error. However, fixing all uses cases would require refactoring
+    // too much code for now. TODO(digit): See http://crbug.com/795291
+    //
+    // So just print an error. In the future, change this to DCHECK() to
+    // catch bad use cases, and refactor the appropriate code.
+    if (!handle.IsRegionReadOnly()) {
+      DLOG(ERROR) << "Forcing region read-only before Mojo serialization";
+      handle.SetRegionReadOnly();
+    }
+  }
+#endif
+  return SharedMemoryToPlatformHandle(handle);
+}
+
 ScopedPlatformHandle PlatformSharedBuffer::PassPlatformHandle() {
   DCHECK(HasOneRef());
 
diff --git a/mojo/edk/embedder/platform_shared_buffer.h b/mojo/edk/embedder/platform_shared_buffer.h
index 637fce24..871c831 100644
--- a/mojo/edk/embedder/platform_shared_buffer.h
+++ b/mojo/edk/embedder/platform_shared_buffer.h
@@ -91,6 +91,12 @@
   // Duplicates the underlying platform handle and passes it to the caller.
   ScopedPlatformHandle DuplicatePlatformHandle();
 
+  // Duplicate the underlying platform handle and passes it to the caller,
+  // for the purpose of serialization / IPC. The difference with
+  // DuplicatePlatformHandle() is that this also seals read-only regions
+  // on Android to ensure the receiver cannot map them writable.
+  ScopedPlatformHandle DuplicatePlatformHandleForIPC();
+
   // Duplicates the underlying shared memory handle and passes it to the caller.
   base::SharedMemoryHandle DuplicateSharedMemoryHandle();
 
diff --git a/mojo/edk/system/shared_buffer_dispatcher.cc b/mojo/edk/system/shared_buffer_dispatcher.cc
index 222cbab3..f65fd88 100644
--- a/mojo/edk/system/shared_buffer_dispatcher.cc
+++ b/mojo/edk/system/shared_buffer_dispatcher.cc
@@ -263,7 +263,7 @@
   serialized_state->guid_low = guid.GetLowForSerialization();
   serialized_state->padding = 0;
 
-  handles[0] = shared_buffer_->DuplicatePlatformHandle();
+  handles[0] = shared_buffer_->DuplicatePlatformHandleForIPC();
   if (!handles[0].is_valid()) {
     shared_buffer_ = nullptr;
     return false;
diff --git a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
index c95bdc3..5348c5f 100644
--- a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
+++ b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
@@ -217,12 +217,15 @@
                                 SharedBufferDispatcher::kDefaultCreateOptions,
                                 nullptr, 100, &dispatcher1));
 
+  // NOTE: On Android, once a region has been mapped read-only, it cannot
+  //       be mapped writable anymore, so ensure that the READ_ONLY case
+  //       appears last in the options[] table below.
   MojoDuplicateBufferHandleOptions options[] = {
+      {sizeof(MojoDuplicateBufferHandleOptionsFlags), ~0u},
       {sizeof(MojoDuplicateBufferHandleOptions),
        MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE},
       {sizeof(MojoDuplicateBufferHandleOptions),
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY},
-      {sizeof(MojoDuplicateBufferHandleOptionsFlags), ~0u}};
+       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY}};
   for (size_t i = 0; i < arraysize(options); i++) {
     scoped_refptr<Dispatcher> dispatcher2;
     EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
diff --git a/remoting/base/breakpad_win.cc b/remoting/base/breakpad_win.cc
index bc11449..c52d39d3 100644
--- a/remoting/base/breakpad_win.cc
+++ b/remoting/base/breakpad_win.cc
@@ -9,6 +9,7 @@
 
 #include "remoting/base/breakpad.h"
 
+#include <crtdbg.h>
 #include <windows.h>
 
 #include <memory>
diff --git a/services/data_decoder/image_decoder_impl_unittest.cc b/services/data_decoder/image_decoder_impl_unittest.cc
index 3a59c88f..8650a8bf 100644
--- a/services/data_decoder/image_decoder_impl_unittest.cc
+++ b/services/data_decoder/image_decoder_impl_unittest.cc
@@ -28,6 +28,16 @@
 
 const int64_t kTestMaxImageSize = 128 * 1024;
 
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+#if defined(USE_V8_CONTEXT_SNAPSHOT)
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kWithAdditionalContext;
+#else
+constexpr gin::V8Initializer::V8SnapshotFileType kSnapshotType =
+    gin::V8Initializer::V8SnapshotFileType::kDefault;
+#endif
+#endif
+
 bool CreateJPEGImage(int width,
                      int height,
                      SkColor color,
@@ -72,11 +82,8 @@
       : main_thread_(
             blink::scheduler::WebThreadBase::InitializeUtilityThread()) {
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
-    gin::V8Initializer::LoadV8Snapshot();
+    gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
     gin::V8Initializer::LoadV8Natives();
-#if defined(USE_V8_CONTEXT_SNAPSHOT)
-    gin::V8Initializer::LoadV8ContextSnapshot();
-#endif  // USE_V8_CONTEXT_SNAPSHOT
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
     service_manager::BinderRegistry empty_registry;
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc
index ac40516..b2c5a80e 100644
--- a/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc
+++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc
@@ -65,9 +65,8 @@
       base::Bind([](scoped_refptr<PlatformSensor> s) { NOTREACHED(); }));
 }
 
-// This test verifies that when sensor is stopped, shared buffer contents are
-// filled with default values.
-TEST_F(PlatformSensorProviderTest, SharedBufferCleared) {
+// This test verifies that the shared buffer's default values are 0.
+TEST_F(PlatformSensorProviderTest, SharedBufferDefaultValue) {
   mojo::ScopedSharedBufferHandle handle = provider_->CloneSharedBufferHandle();
   mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset(
       sizeof(SensorReadingSharedBuffer),
@@ -76,7 +75,11 @@
   SensorReadingSharedBuffer* buffer =
       static_cast<SensorReadingSharedBuffer*>(mapping.get());
   EXPECT_THAT(buffer->reading.als.value, 0);
+}
 
+// This test verifies that when sensor is stopped, shared buffer contents are
+// filled with default values.
+TEST_F(PlatformSensorProviderTest, SharedBufferCleared) {
   provider_->CreateSensor(
       mojom::SensorType::AMBIENT_LIGHT,
       base::Bind([](scoped_refptr<PlatformSensor> sensor) {
diff --git a/services/test/run_all_service_tests.cc b/services/test/run_all_service_tests.cc
index deb9fc3..d9bfbce 100644
--- a/services/test/run_all_service_tests.cc
+++ b/services/test/run_all_service_tests.cc
@@ -36,6 +36,7 @@
     ui::OzonePlatform::InitParams params;
     params.single_process = true;
     ui::OzonePlatform::InitializeForGPU(params);
+    ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
 #endif
 
     // base::TestSuite and ViewsInit both try to load icu. That's ok for tests.
diff --git a/services/ui/ws/test_utils.h b/services/ui/ws/test_utils.h
index 3f3806f..7f3707d 100644
--- a/services/ui/ws/test_utils.h
+++ b/services/ui/ws/test_utils.h
@@ -158,6 +158,8 @@
   bool ProcessSwapDisplayRoots(int64_t display_id1, int64_t display_id2) {
     return tree_->ProcessSwapDisplayRoots(display_id1, display_id2);
   }
+  size_t event_queue_size() const { return tree_->event_queue_.size(); }
+  bool HasEventInFlight() const { return tree_->event_ack_id_ != 0u; }
 
  private:
   WindowTree* tree_;
diff --git a/services/ui/ws/window_tree.cc b/services/ui/ws/window_tree.cc
index 99ff136..06e0845 100644
--- a/services/ui/ws/window_tree.cc
+++ b/services/ui/ws/window_tree.cc
@@ -1942,6 +1942,14 @@
     if (GetDisplay(target)) {
       DispatchInputEventImpl(target, *event, event_location,
                              std::move(callback));
+    } else {
+      // If the window is no longer valid (or not in a display), then there is
+      // no point in dispatching to the client, but we need to run the callback
+      // so that WindowManagerState isn't still waiting for an ack. We only
+      // need run the last callback as they should all target the same
+      // WindowManagerState and WindowManagerState is at most waiting on one
+      // ack.
+      std::move(callback).Run(mojom::EventResult::UNHANDLED);
     }
   }
 }
diff --git a/services/ui/ws/window_tree_unittest.cc b/services/ui/ws/window_tree_unittest.cc
index a677af9..ad29b1d 100644
--- a/services/ui/ws/window_tree_unittest.cc
+++ b/services/ui/ws/window_tree_unittest.cc
@@ -685,6 +685,53 @@
             ChangesToDescription1(*wm_client()->tracker()->changes())[0]);
 }
 
+TEST_F(WindowTreeTest, RemoveWindowFromParentWithQueuedEvent) {
+  TestWindowTreeClient* embed_client = nullptr;
+  WindowTree* tree = nullptr;
+  ServerWindow* window = nullptr;
+  EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_client, &tree, &window));
+
+  window->SetBounds(gfx::Rect(0, 0, 100, 100));
+  window->set_is_activation_parent(true);
+  ClientWindowId w1_id;
+  ServerWindow* w1 =
+      NewWindowInTreeWithParent(tree, window, &w1_id, gfx::Rect(0, 0, 20, 20));
+  ASSERT_TRUE(w1);
+  ClientWindowId w2_id;
+  ServerWindow* w2 =
+      NewWindowInTreeWithParent(tree, window, &w2_id, gfx::Rect(25, 0, 20, 20));
+  ASSERT_TRUE(w2);
+
+  DispatchEventAndAckImmediately(CreateMouseMoveEvent(5, 5));
+
+  // This moves between |w1| and |w2|, which results in two events (move and
+  // enter).
+  DispatchEventWithoutAck(CreateMouseMoveEvent(27, 5));
+
+  // There should be an event in flight for the move.
+  EXPECT_TRUE(WindowTreeTestApi(tree).HasEventInFlight());
+
+  // Simulate the client taking too long.
+  WindowManagerStateTestApi wm_state_test_api(
+      wm_tree()->window_manager_state());
+  wm_state_test_api.OnEventAckTimeout(tree->id());
+
+  // There should be an event queued (for the enter).
+  EXPECT_EQ(1u, WindowTreeTestApi(tree).event_queue_size());
+
+  // Remove the window from the hierarchy, which should make it so the client
+  // doesn't get the queued event.
+  w2->parent()->Remove(w2);
+
+  // Ack the in flight event, which should trigger processing the queued event.
+  // Because |w2| was removed, the event should not be dispatched to the client
+  // and WindowManagerState should no longer be waiting (because there are no
+  // inflight events).
+  WindowTreeTestApi(tree).AckOldestEvent();
+  EXPECT_FALSE(WindowTreeTestApi(tree).HasEventInFlight());
+  EXPECT_EQ(nullptr, wm_state_test_api.tree_awaiting_input_ack());
+}
+
 // Establish client, call Embed() in WM, make sure to get FrameSinkId.
 TEST_F(WindowTreeTest, Embed) {
   const ClientWindowId embed_window_id =
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index a7b93a9..59d0911 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -94,16 +94,6 @@
 #define SK_SUPPORT_UNITTEST
 #endif
 
-/* If cross process SkPictureImageFilters are not explicitly enabled then
-   they are always disabled.
- */
-#ifndef SK_ALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS
-    #ifndef SK_DISALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS
-        #define SK_DISALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS
-    #endif
-#endif
-
-
 /* If your system embeds skia and has complex event logging, define this
    symbol to name a file that maps the following macros to your system's
    equivalents:
diff --git a/skia/public/interfaces/skbitmap_for_blink.typemap b/skia/public/interfaces/skbitmap_for_blink.typemap
new file mode 100644
index 0000000..5ae2366
--- /dev/null
+++ b/skia/public/interfaces/skbitmap_for_blink.typemap
@@ -0,0 +1,15 @@
+# Copyright 2018 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.
+
+mojom = "//skia/public/interfaces/bitmap.mojom"
+public_headers = [ "//third_party/skia/include/core/SkBitmap.h" ]
+traits_headers = [ "//skia/public/interfaces/bitmap_skbitmap_struct_traits.h" ]
+deps = [
+  "//mojo/public/cpp/bindings",
+]
+public_deps = [
+  "//skia",
+  "//skia/public/interfaces",
+]
+type_mappings = [ "skia.mojom.Bitmap=SkBitmap[nullable_is_same_type]" ]
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index ef81e818..467a45a 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -101,6 +101,60 @@
           "ignore_task_failure": false,
           "io_timeout": 360
         }
+      },
+      {
+        "args": [
+          "smoothness.oop_rasterization.top_25_smooth",
+          "-v",
+          "--upload-results",
+          "--output-format=chartjson",
+          "--browser=android-chromium"
+        ],
+        "isolate_name": "telemetry_perf_tests",
+        "name": "smoothness.oop_rasterization.top_25_smooth",
+        "override_compile_targets": [
+          "telemetry_perf_tests"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "id": "build46-b1--device2",
+              "pool": "Chrome-perf-fyi"
+            }
+          ],
+          "expiration": 3600,
+          "hard_timeout": 1080,
+          "ignore_task_failure": false,
+          "io_timeout": 360
+        }
+      },
+      {
+        "args": [
+          "thread_times.oop_rasterization.key_mobile",
+          "-v",
+          "--upload-results",
+          "--output-format=chartjson",
+          "--browser=android-chromium"
+        ],
+        "isolate_name": "telemetry_perf_tests",
+        "name": "thread_times.oop_rasterization.key_mobile",
+        "override_compile_targets": [
+          "telemetry_perf_tests"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "id": "build46-b1--device2",
+              "pool": "Chrome-perf-fyi"
+            }
+          ],
+          "expiration": 3600,
+          "hard_timeout": 1080,
+          "ignore_task_failure": false,
+          "io_timeout": 360
+        }
       }
     ]
   },
@@ -406,64 +460,6 @@
       }
     ]
   },
-  "OOP Raster Perf": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "smoothness.oop_rasterization.top_25_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.oop_rasterization.top_25_smooth",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "id": "build46-b1--device2",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 3600,
-          "hard_timeout": 1080,
-          "ignore_task_failure": false,
-          "io_timeout": 360
-        }
-      },
-      {
-        "args": [
-          "thread_times.oop_rasterization.key_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.oop_rasterization.key_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "id": "build46-b1--device2",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 3600,
-          "hard_timeout": 1080,
-          "ignore_task_failure": false,
-          "io_timeout": 360
-        }
-      }
-    ]
-  },
   "One Buildbot Step Test Builder": {
     "isolated_scripts": [
       {
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
index c1bfe883..9489a2b3 100644
--- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -480,15 +480,6 @@
 -ErrorPageSniffTest.SniffSmallHttpErrorResponseAsDownload
 -DNSErrorPageTest.StaleCacheStatus
 
-# Switch test from using a net::URLRequestFileJob that adds load timing to
-# to using a test URLLoaderFactory via SetNetworkFactoryForTesting.
--LoadTimingBrowserTest.Basic
--LoadTimingBrowserTest.EverythingAtOnce
--LoadTimingBrowserTest.Preconnect
--LoadTimingBrowserTest.PreconnectProxySsl
--LoadTimingBrowserTest.ReuseSocket
--LoadTimingBrowserTest.Ssl
-
 # Switch test from using a net::URLRequestInterceptor to using a test
 # URLLoaderFactory via SetNetworkFactoryForTesting.
 -PredictorBrowserTest.CrossSiteNoReferrerNoPredictionAfterOneNavigation
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index e8961a3..282e3db 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -87,7 +87,7 @@
 crbug.com/591099 accessibility/css-generated-content.html [ Failure ]
 crbug.com/591099 accessibility/css-styles.html [ Failure ]
 crbug.com/591099 accessibility/description-calc-summary.html [ Crash ]
-crbug.com/714962 accessibility/dimensions-include-descendants.html [ Failure ]
+crbug.com/714962 accessibility/dimensions-include-descendants.html [ Failure Pass ]
 crbug.com/591099 accessibility/disabled-controls-not-focusable.html [ Crash ]
 crbug.com/591099 accessibility/disabled-controls.html [ Crash ]
 crbug.com/714962 accessibility/div-within-anchors-causes-crash.html [ Failure ]
@@ -140,7 +140,7 @@
 crbug.com/591099 animations/animation-ready-reject-script-forbidden.html [ Timeout ]
 crbug.com/591099 animations/cross-fade-list-style-image.html [ Failure ]
 crbug.com/591099 animations/interpolation/backdrop-filter-interpolation.html [ Timeout ]
-crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Timeout ]
+crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Pass Timeout ]
 crbug.com/591099 animations/interpolation/svg-stroke-dasharray-interpolation.html [ Timeout ]
 crbug.com/591099 animations/interpolation/webkit-clip-path-interpolation.html [ Pass Timeout ]
 crbug.com/591099 animations/interpolation/webkit-column-width-interpolation.html [ Pass ]
@@ -204,17 +204,17 @@
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-2-overflow-div-scrolled-inner.html [ Failure ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-2-overflow-div-scrolled-outer.html [ Failure ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-2-overflow-div.html [ Failure ]
-crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ]
+crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure Pass ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-img-and-text.html [ Failure ]
-crbug.com/714962 compositing/gestures/gesture-tapHighlight-img.html [ Failure ]
-crbug.com/714962 compositing/gestures/gesture-tapHighlight-invisible-inline-squashing.html [ Failure ]
-crbug.com/714962 compositing/gestures/gesture-tapHighlight-invisible-inline.html [ Failure ]
+crbug.com/714962 compositing/gestures/gesture-tapHighlight-img.html [ Failure Pass ]
+crbug.com/714962 compositing/gestures/gesture-tapHighlight-invisible-inline-squashing.html [ Failure Pass ]
+crbug.com/714962 compositing/gestures/gesture-tapHighlight-invisible-inline.html [ Failure Pass ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html [ Crash Failure ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-pixel-rotated-link.html [ Failure ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-pixel-transparent.html [ Failure ]
-crbug.com/714962 compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure ]
+crbug.com/714962 compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure Pass ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-simple-multi-line.html [ Pass ]
-crbug.com/714962 compositing/gestures/gesture-tapHighlight-simple-scaled-document.html [ Failure ]
+crbug.com/714962 compositing/gestures/gesture-tapHighlight-simple-scaled-document.html [ Failure Pass ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-simple-scaledX.html [ Failure ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-simple-scaledY.html [ Failure ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-simple-window-scroll.html [ Failure ]
@@ -252,7 +252,6 @@
 crbug.com/591099 compositing/overflow/get-transform-from-non-box-container.html [ Failure ]
 crbug.com/591099 compositing/overflow/grandchild-composited-with-border-radius-ancestor.html [ Failure ]
 crbug.com/591099 compositing/overflow/grandchild-with-border-radius-ancestor.html [ Failure ]
-crbug.com/714962 compositing/overflow/image-load-overflow-scrollbars.html [ Crash Pass ]
 crbug.com/591099 compositing/overflow/mask-with-filter.html [ Failure ]
 crbug.com/591099 compositing/overflow/mask-with-small-content-rect.html [ Failure ]
 crbug.com/591099 compositing/overflow/nested-border-radius-clipping.html [ Failure ]
@@ -260,7 +259,6 @@
 crbug.com/591099 compositing/overflow/overflow-scroll-with-local-image-background.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-scroll.html [ Failure ]
 crbug.com/591099 compositing/overflow/parent-overflow.html [ Failure ]
-crbug.com/591099 compositing/overflow/remove-overflow-crash2.html [ Failure Pass ]
 crbug.com/714962 compositing/overflow/rtl-overflow.html [ Failure ]
 crbug.com/591099 compositing/overflow/scaled-mask.html [ Failure ]
 crbug.com/591099 compositing/overflow/scroll-ancestor-update.html [ Failure ]
@@ -386,8 +384,6 @@
 crbug.com/591099 css1/units/percentage_units.html [ Failure ]
 crbug.com/591099 css1/units/urls.html [ Failure ]
 crbug.com/591099 css2.1/20110323/border-collapse-offset-002.htm [ Failure ]
-crbug.com/714962 css2.1/20110323/border-conflict-element-001d.htm [ Failure Pass ]
-crbug.com/714962 css2.1/20110323/border-conflict-element-021a.htm [ Failure Pass ]
 crbug.com/591099 css2.1/20110323/border-conflict-style-079.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/border-conflict-style-088.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/c543-txt-decor-000.html [ Failure ]
@@ -408,9 +404,6 @@
 crbug.com/591099 css2.1/20110323/outline-color-applies-to-008.htm [ Failure ]
 crbug.com/714962 css2.1/20110323/outline-color-applies-to-010.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/outline-color-applies-to-014.htm [ Failure ]
-crbug.com/714962 css2.1/20110323/overflow-applies-to-007.htm [ Failure Pass ]
-crbug.com/714962 css2.1/20110323/overflow-applies-to-009.htm [ Failure Pass ]
-crbug.com/714962 css2.1/20110323/overflow-applies-to-010.htm [ Failure Pass ]
 crbug.com/714962 css2.1/20110323/overflow-applies-to-012.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/table-caption-002.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/table-caption-margins-001.htm [ Failure ]
@@ -477,7 +470,6 @@
 crbug.com/591099 css2.1/t0805-c5522-brdr-01-b-g.html [ Failure ]
 crbug.com/591099 css2.1/t0805-c5522-brdr-02-e.html [ Failure ]
 crbug.com/591099 css2.1/t0805-c5522-ibrdr-00-a.html [ Failure ]
-crbug.com/591099 css2.1/t090204-display-change-01-b-ao.html [ Failure Pass ]
 crbug.com/591099 css2.1/t090402-c42-ibx-pad-00-d-ag.html [ Failure ]
 crbug.com/591099 css2.1/t0905-c414-flt-02-c.html [ Failure ]
 crbug.com/591099 css2.1/t0905-c414-flt-03-c.html [ Failure ]
@@ -861,8 +853,6 @@
 crbug.com/591099 css3/selectors3/xhtml/css3-modsel-1.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xhtml/css3-modsel-120.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xhtml/css3-modsel-13.xml [ Failure ]
-crbug.com/591099 css3/selectors3/xhtml/css3-modsel-147a.xml [ Failure Pass ]
-crbug.com/591099 css3/selectors3/xhtml/css3-modsel-147b.xml [ Failure Pass ]
 crbug.com/591099 css3/selectors3/xhtml/css3-modsel-15.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xhtml/css3-modsel-161.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xhtml/css3-modsel-167.xml [ Failure ]
@@ -931,8 +921,6 @@
 crbug.com/591099 css3/selectors3/xml/css3-modsel-1.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xml/css3-modsel-120.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xml/css3-modsel-13.xml [ Failure ]
-crbug.com/591099 css3/selectors3/xml/css3-modsel-147a.xml [ Failure Pass ]
-crbug.com/591099 css3/selectors3/xml/css3-modsel-147b.xml [ Failure Pass ]
 crbug.com/591099 css3/selectors3/xml/css3-modsel-15.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xml/css3-modsel-161.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xml/css3-modsel-167.xml [ Failure ]
@@ -998,8 +986,8 @@
 crbug.com/591099 css3/selectors3/xml/css3-modsel-80.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xml/css3-modsel-9.xml [ Failure ]
 crbug.com/591099 css3/selectors3/xml/css3-modsel-95.xml [ Failure ]
-crbug.com/714962 css3/tab-size-complex-path.html [ Failure ]
-crbug.com/714962 css3/tab-size.html [ Failure ]
+crbug.com/714962 css3/tab-size-complex-path.html [ Failure Pass ]
+crbug.com/714962 css3/tab-size.html [ Failure Pass ]
 crbug.com/591099 editing/assert_selection.html [ Failure ]
 crbug.com/591099 editing/caret/caret-color-003.html [ Failure ]
 crbug.com/591099 editing/caret/caret-color-004.html [ Failure ]
@@ -1209,7 +1197,7 @@
 crbug.com/591099 editing/selection/extend-selection-character.html [ Timeout ]
 crbug.com/591099 editing/selection/extend-selection-home-end.html [ Timeout ]
 crbug.com/591099 editing/selection/extend-selection-word.html [ Pass Timeout ]
-crbug.com/714962 editing/selection/extend-to-line-boundary.html [ Failure ]
+crbug.com/714962 editing/selection/extend-to-line-boundary.html [ Failure Pass ]
 crbug.com/714962 editing/selection/focus-and-display-none.html [ Failure ]
 crbug.com/591099 editing/selection/focus-body.html [ Failure ]
 crbug.com/591099 editing/selection/home-end.html [ Timeout ]
@@ -1354,49 +1342,33 @@
 crbug.com/591099 external/wpt/compat/webkit-text-fill-color-property-005.html [ Failure Pass ]
 crbug.com/591099 external/wpt/credential-management/federatedcredential-framed-get.sub.https.html [ Pass ]
 crbug.com/591099 external/wpt/credential-management/passwordcredential-framed-get.sub.https.html [ Pass ]
-crbug.com/714962 external/wpt/css/CSS2/floats/floats-wrap-bfc-003-left-overflow.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-003-left-table.xht [ Failure ]
-crbug.com/714962 external/wpt/css/CSS2/floats/floats-wrap-bfc-003-right-overflow.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-003-right-table.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/linebox/inline-box-002.xht [ Failure ]
-crbug.com/714962 external/wpt/css/CSS2/linebox/inline-formatting-context-015.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/linebox/vertical-align-117a.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/linebox/vertical-align-118a.xht [ Failure ]
 crbug.com/714962 external/wpt/css/CSS2/linebox/vertical-align-baseline-005a.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-percents-001.xht [ Failure ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/inline-block-zorder-001.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/inline-block-zorder-002.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/inline-table-zorder-001.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/inline-table-zorder-002.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/max-height-percentage-002.xht [ Failure ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/max-width-105.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/max-width-106.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/max-width-107.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/min-height-104.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/normal-flow/min-height-106.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/root-box-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/positioning/abspos-007.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/positioning/relpos-calcs-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/positioning/relpos-calcs-005.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/text/text-decoration-applies-to-015.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/text/text-indent-012.xht [ Failure ]
-crbug.com/714962 external/wpt/css/CSS2/text/text-indent-overflow-001.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/CSS2/text/text-indent-overflow-004.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/text/white-space-normal-004.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-color-5.html [ Failure ]
 crbug.com/714962 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-image-5.html [ Failure ]
 crbug.com/714962 external/wpt/css/css-backgrounds/background-image-003.html [ Failure ]
 crbug.com/714962 external/wpt/css/css-backgrounds/background-image-004.html [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-backgrounds/background-image-005.html [ Failure ]
-crbug.com/714962 external/wpt/css/css-backgrounds/background-image-006.html [ Failure ]
-crbug.com/714962 external/wpt/css/css-backgrounds/background-size/background-size-cover.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-backgrounds/background-image-006.html [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-backgrounds/css3-background-clip.html [ Failure ]
 crbug.com/714962 external/wpt/css/css-display/display-contents-dynamic-before-after-001.html [ Failure ]
 crbug.com/714962 external/wpt/css/css-display/display-contents-dynamic-before-after-first-letter-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-display/display-contents-dynamic-table-001-inline.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-display/display-contents-dynamic-table-002-none.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-display/display-contents-text-inherit-002.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-display/display-contents-text-inherit.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-flexbox/percentage-heights-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-flexbox/percentage-heights-003.html [ Pass ]
@@ -1678,12 +1650,11 @@
 crbug.com/591099 external/wpt/css/css-shapes/spec-examples/shape-outside-017.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes/spec-examples/shape-outside-018.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes/spec-examples/shape-outside-019.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-style-attr/style-attr-urls-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-style-attr/style-attr-urls-001.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-style-attr/style-attr-urls-002.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-tables/html5-table-formatting-fixed-layout-1.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-tables/table-model-fixup-2.html [ Failure ]
-crbug.com/714962 external/wpt/css/css-tables/visibility-collapse-colspan-003.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-tables/table-model-fixup-2.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-tables/visibility-collapse-rowcol-001.html [ Crash ]
 crbug.com/591099 external/wpt/css/css-tables/visibility-collapse-rowspan-crash.html [ Crash ]
 crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Failure ]
@@ -1731,16 +1702,11 @@
 crbug.com/714962 external/wpt/css/css-ui/outline-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-ui/outline-011.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-ui/outline-019.html [ Failure ]
-crbug.com/714962 external/wpt/css/css-ui/text-overflow-001.html [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-ui/text-overflow-003.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-006.html [ Pass ]
-crbug.com/714962 external/wpt/css/css-ui/text-overflow-008.html [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-ui/text-overflow-009.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-010.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-012.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-013.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-014.html [ Failure ]
-crbug.com/714962 external/wpt/css/css-ui/text-overflow-016.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-022.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011.xht [ Pass ]
@@ -1767,7 +1733,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-023.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-025.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-027.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-029.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-029.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-031.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-033.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-035.xht [ Failure ]
@@ -1789,11 +1755,11 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-067.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-069.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-071.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-073.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-073.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-075.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-077.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-079.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-081.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-081.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-083.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-085.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-087.xht [ Failure ]
@@ -1804,7 +1770,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-097.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-103.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-105.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-107.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-107.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-109.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-111.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-113.xht [ Failure Pass ]
@@ -1816,7 +1782,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-127.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-129.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-131.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-131.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-133.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-135.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-137.xht [ Failure ]
@@ -1828,11 +1794,11 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-149.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-151.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-153.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-155.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-155.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-159.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-161.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-163.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-163.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-165.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-167.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-169.xht [ Failure ]
@@ -1843,15 +1809,15 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-179.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-181.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-183.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-185.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-185.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-187.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-191.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-193.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-195.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-197.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-199.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-203.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-205.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-207.xht [ Failure ]
@@ -1861,7 +1827,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-215.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-217.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-219.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-223.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-225.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-227.xht [ Failure Pass ]
@@ -1894,10 +1860,10 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-052.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-054.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-056.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-058.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-058.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-060.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-062.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-064.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-064.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-066.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-068.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-070.xht [ Failure Pass ]
@@ -1933,7 +1899,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-134.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-136.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-138.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-142.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-144.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-146.xht [ Failure ]
@@ -1947,18 +1913,18 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-162.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-164.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-166.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-168.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-168.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-170.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-174.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-174.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-178.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-180.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-182.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-184.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-186.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-190.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-190.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-192.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-194.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-196.xht [ Failure Pass ]
@@ -2026,21 +1992,21 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-010.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001a.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001b.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001b.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001c.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001d.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001d.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001e.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001f.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001f.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001g.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001h.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001h.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001i.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001j.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001j.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001k.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001l.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001l.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001m.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001n.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001n.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001o.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001p.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001p.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001q.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001r.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001s.html [ Failure ]
@@ -2078,18 +2044,18 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/table-column-order-003.xht [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/table-column-order-004.xht [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/table-column-order-005.xht [ Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-003.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-003.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-005.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-007.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-009.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/text-align-vlr-011.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-013.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-013.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-015.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-017.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-019.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-002.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-004.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-006.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-006.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-008.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-010.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-012.xht [ Failure Pass ]
@@ -2156,10 +2122,6 @@
 crbug.com/714962 external/wpt/css/selectors/focus-within-008.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-vert-001b.html [ Failure ]
-crbug.com/714962 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-fieldset-horiz-001.xhtml [ Failure Pass ]
-crbug.com/714962 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-img-horiz-001.xhtml [ Failure Pass ]
-crbug.com/714962 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-textarea-horiz-001.xhtml [ Failure Pass ]
-crbug.com/714962 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-flow-002.html [ Failure Pass ]
 crbug.com/714962 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-items-as-stacking-contexts-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-003.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-004.html [ Failure ]
@@ -2339,13 +2301,11 @@
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/flow-content-0/dialog.html [ Crash ]
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/flow-content-0/div-align.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-fieldset-element-0/legend-block-formatting-context.html [ Failure ]
-crbug.com/714962 external/wpt/html/rendering/non-replaced-elements/the-fieldset-element-0/min-width-not-important.html [ Failure Pass ]
 crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-percentage.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-inline-sizing/svg-inline.html [ Timeout ]
 crbug.com/714962 external/wpt/html/rendering/the-css-user-agent-style-sheet-and-presentational-hints/body-bgcolor-attribute-change.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html [ Failure ]
-crbug.com/714962 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html [ Failure Pass ]
 crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-filter.html [ Crash ]
 crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-nameditem.html [ Crash ]
@@ -2483,7 +2443,7 @@
 crbug.com/591099 external/wpt/websockets/cookies/004.html?wss [ Pass ]
 crbug.com/591099 external/wpt/websockets/cookies/005.html [ Pass ]
 crbug.com/591099 external/wpt/websockets/cookies/005.html?wss [ Pass ]
-crbug.com/591099 external/wpt/websockets/cookies/007.html [ Failure ]
+crbug.com/591099 external/wpt/websockets/cookies/007.html [ Failure Pass ]
 crbug.com/591099 external/wpt/websockets/extended-payload-length.html?wss [ Pass ]
 crbug.com/591099 external/wpt/websockets/interfaces/CloseEvent/clean-close.html?wss [ Pass ]
 crbug.com/591099 external/wpt/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-arraybuffer.html?wss [ Pass ]
@@ -2532,9 +2492,6 @@
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html [ Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html [ Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html [ Failure ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-center.html [ Failure Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-left.html [ Failure Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-right.html [ Failure Pass ]
 crbug.com/591099 external/wpt/workers/Worker_terminate_event_queue.htm [ Timeout ]
 crbug.com/591099 external/wpt/xhr/send-authentication-prompt-2-manual.htm [ Failure ]
 crbug.com/591099 fast/animation/scroll-animations/scrolltimeline-currenttime.html [ Failure ]
@@ -2545,6 +2502,7 @@
 crbug.com/591099 fast/backgrounds/animated-gif-as-background.html [ Failure ]
 crbug.com/591099 fast/backgrounds/animated-svg-as-mask.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-clip-text-multiline.html [ Failure Pass ]
+crbug.com/591099 fast/backgrounds/background-clip-text-with-blend-mode.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-clip-text.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-inherit-color-bug.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-leakage-transforms.html [ Failure ]
@@ -2565,7 +2523,6 @@
 crbug.com/591099 fast/backgrounds/repeat/negative-offset-repeat-transformed.html [ Failure ]
 crbug.com/591099 fast/backgrounds/repeat/negative-offset-repeat.html [ Failure ]
 crbug.com/591099 fast/backgrounds/repeat/noRepeatCorrectClip.html [ Failure ]
-crbug.com/714962 fast/backgrounds/root-background-propagation3.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/selection-background-color-of-image-list-style.html [ Failure ]
 crbug.com/591099 fast/backgrounds/selection-background-color-of-list-style.html [ Failure ]
 crbug.com/591099 fast/backgrounds/size/backgroundSize01.html [ Failure ]
@@ -2606,8 +2563,6 @@
 crbug.com/591099 fast/block/float-avoids-padding-inline-ancestors.html [ Crash ]
 crbug.com/591099 fast/block/float/003.html [ Failure ]
 crbug.com/591099 fast/block/float/012.html [ Failure ]
-crbug.com/714962 fast/block/float/015.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/021.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/022.html [ Failure ]
 crbug.com/591099 fast/block/float/br-with-clear-2.html [ Failure ]
 crbug.com/591099 fast/block/float/element-clears-float-without-clearance.html [ Failure ]
@@ -2619,21 +2574,10 @@
 crbug.com/591099 fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks.html [ Failure ]
 crbug.com/591099 fast/block/float/floats-offset-image-strict-line-height.html [ Failure ]
 crbug.com/591099 fast/block/float/floats-offset-inline-block-strict-line-height.html [ Failure ]
-crbug.com/714962 fast/block/float/intruding-float-add-in-sibling-block-on-static-position.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/intruding-float-remove-from-sibling-block-on-absolute-position.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/intruding-float-remove-from-sibling-block-on-absolute-position2.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/intruding-float-remove-from-sibling-block-on-fixed-position.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/intruding-float-remove-from-sibling-block-on-fixed-position2.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/negative-margin-on-element-avoiding-floats-with-margin-on-parent.html [ Failure ]
 crbug.com/591099 fast/block/float/negative-margin-on-element-avoiding-floats.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction2.html [ Failure ]
-crbug.com/714962 fast/block/float/overhanging-after-height-decrease.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/overhanging-float-add-in-static-position-block.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/overhanging-float-add-in-static-position-block2.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/overhanging-float-remove-from-absolute-position-block.html [ Failure Pass ]
-crbug.com/714962 fast/block/float/overhanging-float-remove-from-absolute-position-block2.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Failure ]
 crbug.com/591099 fast/block/float/overhanging-float-remove-from-fixed-position-block2.html [ Failure ]
 crbug.com/591099 fast/block/float/overlapping-floats-paint-hittest-order-1.html [ Failure ]
@@ -2644,7 +2588,6 @@
 crbug.com/714962 fast/block/layer-not-removed-from-parent-crash.html [ Failure ]
 crbug.com/591099 fast/block/line-layout/floats-do-not-fit-on-line.html [ Failure ]
 crbug.com/591099 fast/block/line-layout/line-break-removal-near-textarea-crash.html [ Failure ]
-crbug.com/714962 fast/block/margin-collapse/044.html [ Failure Pass ]
 crbug.com/591099 fast/block/margin-collapse/clear-nested-float-more-than-one-previous-sibling-away.html [ Failure ]
 crbug.com/714962 fast/block/margin-collapse/line-beside-float-complex-margin-collapsing.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/webkit-margin-collapse-container.html [ Failure ]
@@ -2656,8 +2599,7 @@
 crbug.com/591099 fast/block/positioning/056.html [ Failure ]
 crbug.com/591099 fast/block/positioning/058.html [ Failure ]
 crbug.com/591099 fast/block/positioning/059.html [ Failure ]
-crbug.com/591099 fast/block/positioning/061.html [ Failure Pass ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure Pass ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-2.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-3.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr.html [ Failure ]
@@ -3067,7 +3009,6 @@
 crbug.com/714962 fast/css/getComputedStyle/getComputedStyle-zoom-and-background-size.html [ Failure ]
 crbug.com/591099 fast/css/getPropertyValue-column-rule.html [ Failure ]
 crbug.com/591099 fast/css/h1-in-section-elements.html [ Failure ]
-crbug.com/714962 fast/css/heightless-list-item.html [ Failure Pass ]
 crbug.com/591099 fast/css/hover-active-quirks.html [ Failure ]
 crbug.com/591099 fast/css/hover-affects-ancestor.html [ Failure ]
 crbug.com/714962 fast/css/hover-pseudo-element-quirks.html [ Failure ]
@@ -3082,7 +3023,6 @@
 crbug.com/591099 fast/css/image-set-value-not-removed-crash.html [ Failure ]
 crbug.com/591099 fast/css/import-rule-regression-11590.html [ Failure ]
 crbug.com/591099 fast/css/import_with_baseurl.html [ Failure ]
-crbug.com/714962 fast/css/inline-block-tricky-baselines.html [ Failure Pass ]
 crbug.com/591099 fast/css/inline-element-line-break.html [ Failure ]
 crbug.com/591099 fast/css/inline-properties-important.html [ Failure ]
 crbug.com/591099 fast/css/inline-table-empty-non-auto.html [ Failure ]
@@ -3189,7 +3129,6 @@
 crbug.com/591099 fast/css/text-overflow-ellipsis-bidi.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-block-with-border-and-padding.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-button.html [ Failure ]
-crbug.com/591099 fast/css/text-overflow-ellipsis-color.html [ Failure Pass ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-multiple-shadows.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-shadow-alpha.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-strict.html [ Failure ]
@@ -3305,7 +3244,7 @@
 crbug.com/714962 fast/dom/Range/getClientRects-character.html [ Failure ]
 crbug.com/591099 fast/dom/Range/getClientRects-leading-trailing-whitespaces.html [ Failure ]
 crbug.com/591099 fast/dom/Range/range-expand.html [ Failure ]
-crbug.com/714962 fast/dom/Range/range-spanning-elements-bounding-client-rect.html [ Failure ]
+crbug.com/714962 fast/dom/Range/range-spanning-elements-bounding-client-rect.html [ Failure Pass ]
 crbug.com/591099 fast/dom/Window/btoa-pnglet.html [ Failure ]
 crbug.com/591099 fast/dom/Window/open-existing-pop-up-blocking.html [ Failure ]
 crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html [ Timeout ]
@@ -3377,7 +3316,7 @@
 crbug.com/591099 fast/dom/shadow/event-path-for-user-agent-shadow-tree.html [ Crash ]
 crbug.com/591099 fast/dom/shadow/focus-navigation-with-distributed-nodes.html [ Crash ]
 crbug.com/591099 fast/dom/shadow/form-in-shadow.html [ Crash ]
-crbug.com/714962 fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure ]
+crbug.com/714962 fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure Pass ]
 crbug.com/714962 fast/dom/shadow/import-rule-in-shadow-tree-needs-document-style-recalc.html [ Failure ]
 crbug.com/714962 fast/dom/shadow/input-color-in-content.html [ Timeout ]
 crbug.com/591099 fast/dom/shadow/normalize-progress-element-crash.html [ Crash ]
@@ -3500,7 +3439,7 @@
 crbug.com/591099 fast/events/keydown-keypress-preventDefault.html [ Failure ]
 crbug.com/591099 fast/events/keypress-focus-change.html [ Failure ]
 crbug.com/591099 fast/events/media-element-focus-tab.html [ Failure ]
-crbug.com/714962 fast/events/middleClickAutoscroll-click-hyperlink.html [ Timeout ]
+crbug.com/714962 fast/events/middleClickAutoscroll-click-hyperlink.html [ Pass Timeout ]
 crbug.com/714962 fast/events/middleClickAutoscroll-latching.html [ Pass Timeout ]
 crbug.com/714962 fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ]
 crbug.com/591099 fast/events/mouse-drag-from-frame-to-other-frame.html [ Failure ]
@@ -3551,7 +3490,7 @@
 crbug.com/591099 fast/events/selectstart-by-single-click-with-shift.html [ Failure ]
 crbug.com/591099 fast/events/sequential-focus-navigation-starting-point.html [ Failure ]
 crbug.com/591099 fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ]
-crbug.com/714962 fast/events/simulated-click-coords.html [ Failure ]
+crbug.com/714962 fast/events/simulated-click-coords.html [ Failure Pass ]
 crbug.com/591099 fast/events/submit-reset-nested-bubble.html [ Failure ]
 crbug.com/591099 fast/events/tab-imagemap.html [ Failure ]
 crbug.com/591099 fast/events/tabindex-focus-blur-all.html [ Crash ]
@@ -3664,7 +3603,7 @@
 crbug.com/591099 fast/forms/encoding-test.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-crash.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-elements.html [ Crash ]
-crbug.com/591099 fast/forms/fieldset/fieldset-form-collection-radionode-list.html [ Crash ]
+crbug.com/591099 fast/forms/fieldset/fieldset-form-collection-radionode-list.html [ Crash Pass ]
 crbug.com/591099 fast/forms/fieldset/fieldset-with-float.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/float-before-fieldset.html [ Failure ]
 crbug.com/714962 fast/forms/file/file-cloneNode.html [ Timeout ]
@@ -4129,7 +4068,7 @@
 crbug.com/591099 fast/gradients/unprefixed-repeating-linear-gradient.html [ Failure ]
 crbug.com/591099 fast/gradients/unprefixed-repeating-radial-gradients.html [ Failure ]
 crbug.com/591099 fast/harness/hello_again.html [ Failure ]
-crbug.com/714962 fast/harness/legacy-results.html [ Failure ]
+crbug.com/714962 fast/harness/legacy-results.html [ Failure Pass ]
 crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Failure ]
 crbug.com/714962 fast/hidpi/clip-text-in-hidpi.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-set-list-style-image.html [ Failure ]
@@ -4691,13 +4630,10 @@
 crbug.com/591099 fast/multicol/vertical-rl/unsplittable-inline-block.html [ Failure ]
 crbug.com/591099 fast/multicol/widows-and-orphans.html [ Failure ]
 crbug.com/591099 fast/multicol/widows.html [ Failure ]
-crbug.com/714962 fast/overflow/001.html [ Failure Pass ]
-crbug.com/714962 fast/overflow/002.html [ Failure Pass ]
 crbug.com/714962 fast/overflow/005.html [ Failure ]
 crbug.com/714962 fast/overflow/006.html [ Failure ]
 crbug.com/591099 fast/overflow/007.html [ Failure ]
 crbug.com/714962 fast/overflow/childFocusRingClip.html [ Failure ]
-crbug.com/714962 fast/overflow/dynamic-hidden.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/height-during-simplified-layout.html [ Failure ]
 crbug.com/591099 fast/overflow/image-selection-highlight.html [ Failure ]
 crbug.com/591099 fast/overflow/infiniteRecursion.html [ Failure ]
@@ -4705,11 +4641,9 @@
 crbug.com/714962 fast/overflow/line-clamp-hides-trailing-anchor.html [ Failure ]
 crbug.com/591099 fast/overflow/line-clamp.html [ Failure ]
 crbug.com/591099 fast/overflow/onscroll-layer-self-destruct.html [ Timeout ]
-crbug.com/714962 fast/overflow/overflow-float-stacking.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/overflow-of-video-outline.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-rtl-vertical.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-rtl.html [ Failure ]
-crbug.com/714962 fast/overflow/overflow-stacking.html [ Failure Pass ]
 crbug.com/714962 fast/overflow/overflow-text-hit-testing.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-update-transform.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-with-local-background-attachment.html [ Failure ]
@@ -4969,6 +4903,7 @@
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-001.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-002.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-rounded-inset.html [ Failure ]
+crbug.com/591099 fast/spatial-navigation/snav-backtrack-out-of-non-navigable-iframe.html [ Crash ]
 crbug.com/591099 fast/spatial-navigation/snav-clipped-overflowed-content.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-container-white-space.html [ Failure ]
 crbug.com/714962 fast/spatial-navigation/snav-date.html [ Failure ]
@@ -4980,7 +4915,6 @@
 crbug.com/714962 fast/spatial-navigation/snav-iframe-no-scrollable-content.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-iframe-with-outside-focusable-element.html [ Failure ]
-crbug.com/714962 fast/spatial-navigation/snav-imagemap-overlapped-areas.html [ Failure Pass ]
 crbug.com/714962 fast/spatial-navigation/snav-input.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-multiple-select-focusring.html [ Failure ]
 crbug.com/714962 fast/spatial-navigation/snav-multiple-select.html [ Failure ]
@@ -5002,7 +4936,7 @@
 crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/table-cells-with-padding-do-not-wrap.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/table-rtl-padding.html [ Failure ]
-crbug.com/714962 fast/sub-pixel/width-of-inline-in-float.html [ Failure ]
+crbug.com/714962 fast/sub-pixel/width-of-inline-in-float.html [ Failure Pass ]
 crbug.com/591099 fast/table/018.html [ Failure ]
 crbug.com/591099 fast/table/032.html [ Failure ]
 crbug.com/714962 fast/table/035-vertical.html [ Failure ]
@@ -5100,8 +5034,6 @@
 crbug.com/591099 fast/table/percent-widths-stretch-vertical.html [ Failure ]
 crbug.com/591099 fast/table/recalc-section-first-body-crash-main.html [ Failure ]
 crbug.com/591099 fast/table/row-in-inline-block.html [ Failure ]
-crbug.com/714962 fast/table/rowspan-paint-order-vertical.html [ Failure Pass ]
-crbug.com/714962 fast/table/rowspan-paint-order.html [ Failure Pass ]
 crbug.com/714962 fast/table/rtl-cell-display-none-assert.html [ Failure ]
 crbug.com/714962 fast/table/rules-attr-dynchange1.html [ Failure ]
 crbug.com/714962 fast/table/rules-attr-dynchange2.html [ Failure ]
@@ -5233,14 +5165,14 @@
 crbug.com/591099 fast/text/emphasis-ellipsis-complextext.html [ Failure ]
 crbug.com/591099 fast/text/emphasis-overlap.html [ Failure ]
 crbug.com/591099 fast/text/find-kana.html [ Timeout ]
-crbug.com/714962 fast/text/font-fallback-synthetic-italics.html [ Failure ]
-crbug.com/714962 fast/text/font-ligature-letter-spacing.html [ Failure ]
-crbug.com/714962 fast/text/font-variant-width.html [ Failure ]
+crbug.com/714962 fast/text/font-fallback-synthetic-italics.html [ Failure Pass ]
+crbug.com/714962 fast/text/font-ligature-letter-spacing.html [ Failure Pass ]
+crbug.com/714962 fast/text/font-variant-width.html [ Failure Pass ]
 crbug.com/714962 fast/text/fractional-word-and-letter-spacing-with-kerning.html [ Failure ]
 crbug.com/714962 fast/text/get-client-rects-grapheme.html [ Failure ]
 crbug.com/714962 fast/text/glyph-reordering.html [ Failure ]
 crbug.com/591099 fast/text/hide-atomic-inlines-after-ellipsis.html [ Failure ]
-crbug.com/714962 fast/text/hyphen-min-preferred-width.html [ Failure ]
+crbug.com/714962 fast/text/hyphen-min-preferred-width.html [ Failure Pass ]
 crbug.com/591099 fast/text/international/bidi-L2-run-reordering.html [ Failure ]
 crbug.com/714962 fast/text/international/bidi-layout-across-linebreak.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-linebreak-002.html [ Failure ]
@@ -5250,7 +5182,7 @@
 crbug.com/591099 fast/text/international/combining-marks-position.html [ Failure ]
 crbug.com/714962 fast/text/international/hindi-whitespace.html [ Failure ]
 crbug.com/714962 fast/text/international/iso-8859-8.html [ Failure ]
-crbug.com/714962 fast/text/international/listbox-width-rtl.html [ Failure ]
+crbug.com/714962 fast/text/international/listbox-width-rtl.html [ Failure Pass ]
 crbug.com/714962 fast/text/international/rtl-selection-rect-with-fallback.html [ Failure ]
 crbug.com/796943 fast/text/international/shape-across-elements-simple.html [ Pass ]
 crbug.com/591099 fast/text/international/shape-across-elements.html [ Failure ]
@@ -5304,7 +5236,7 @@
 crbug.com/714962 fast/text/selection/thai-offsetForPosition-inside-character.html [ Failure ]
 crbug.com/714962 fast/text/stroking-decorations.html [ Failure ]
 crbug.com/591099 fast/text/sub-pixel/text-scaling-pixel.html [ Failure ]
-crbug.com/714962 fast/text/tab-min-size.html [ Failure ]
+crbug.com/714962 fast/text/tab-min-size.html [ Failure Pass ]
 crbug.com/714962 fast/text/text-range-bounds.html [ Failure ]
 crbug.com/591099 fast/text/textIteratorNilRenderer.html [ Failure Pass ]
 crbug.com/591099 fast/text/trailing-white-space-2.html [ Failure ]
@@ -5648,7 +5580,7 @@
 crbug.com/591099 http/tests/devtools/editor/text-editor-ctrl-d-2.js [ Timeout ]
 crbug.com/714962 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Timeout ]
 crbug.com/714962 http/tests/devtools/editor/text-editor-formatter.js [ Timeout ]
-crbug.com/714962 http/tests/devtools/editor/text-editor-indent-autodetection.js [ Timeout ]
+crbug.com/714962 http/tests/devtools/editor/text-editor-indent-autodetection.js [ Pass Timeout ]
 crbug.com/714962 http/tests/devtools/editor/text-editor-reveal-line.js [ Timeout ]
 crbug.com/714962 http/tests/devtools/elements/breadcrumb-updates.js [ Crash ]
 crbug.com/714962 http/tests/devtools/elements/css-rule-hover-highlights-selectors.js [ Crash ]
@@ -5704,7 +5636,7 @@
 crbug.com/591099 http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Crash ]
 crbug.com/591099 http/tests/devtools/elements/styles-1/edit-media-text.js [ Crash Pass ]
 crbug.com/591099 http/tests/devtools/elements/styles-1/edit-name-with-trimmed-value.js [ Crash ]
-crbug.com/591099 http/tests/devtools/elements/styles-1/edit-value-inside-property.js [ Crash ]
+crbug.com/591099 http/tests/devtools/elements/styles-1/edit-value-inside-property.js [ Crash Pass ]
 crbug.com/714962 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Crash ]
 crbug.com/714962 http/tests/devtools/elements/styles-2/force-pseudo-state.js [ Crash ]
 crbug.com/591099 http/tests/devtools/elements/styles-2/inject-stylesheet.js [ Crash Pass ]
@@ -5756,22 +5688,23 @@
 crbug.com/714962 http/tests/devtools/service-workers/service-workers-view.js [ Failure ]
 crbug.com/591099 http/tests/devtools/sources/debugger-async/async-await/async-pause-on-exception.js [ Crash ]
 crbug.com/591099 http/tests/devtools/sources/debugger-async/async-callstack-promises.js [ Crash Pass ]
+crbug.com/591099 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-restored-breakpoint.js [ Failure ]
 crbug.com/591099 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Crash ]
 crbug.com/591099 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Crash ]
 crbug.com/591099 http/tests/devtools/sources/debugger-frameworks/frameworks-jquery.js [ Crash Pass ]
-crbug.com/591099 http/tests/devtools/sources/debugger-frameworks/frameworks-steppings.js [ Crash Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.js [ Crash Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger-pause/debugger-eval-while-paused.js [ Crash Pass ]
-crbug.com/591099 http/tests/devtools/sources/debugger-pause/debugger-pause-in-internal.js [ Failure ]
+crbug.com/591099 http/tests/devtools/sources/debugger-pause/debugger-pause-in-internal.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger-pause/debugger-pause-on-promise-rejection.js [ Crash ]
 crbug.com/591099 http/tests/devtools/sources/debugger-step/debugger-step-into-custom-element-callbacks.js [ Crash Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger-step/debugger-step-out-custom-element-callbacks.js [ Crash Pass ]
+crbug.com/591099 http/tests/devtools/sources/debugger-step/debugger-step-out-event-listener.js [ Crash ]
 crbug.com/591099 http/tests/devtools/sources/debugger-ui/debugger-inline-values.js [ Crash ]
-crbug.com/591099 http/tests/devtools/sources/debugger-ui/function-generator-details.js [ Failure ]
+crbug.com/591099 http/tests/devtools/sources/debugger-ui/function-generator-details.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger-ui/watch-expressions-panel-switch.js [ Crash Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Crash Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger/live-edit-no-reveal.js [ Failure ]
-crbug.com/591099 http/tests/devtools/sources/debugger/properties-special.js [ Failure ]
+crbug.com/591099 http/tests/devtools/sources/debugger/properties-special.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/text-autosizing-override.js [ Failure ]
 crbug.com/714962 http/tests/devtools/tracing/scroll-invalidations.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/tracing/timeline-misc/timeline-bound-function.js [ Failure ]
@@ -6117,8 +6050,6 @@
 crbug.com/591099 media/controls/volumechange-muted-attribute.html [ Failure Pass ]
 crbug.com/714962 media/controls/volumechange-stopimmediatepropagation.html [ Failure Pass ]
 crbug.com/591099 media/media-document-audio-repaint.html [ Failure ]
-crbug.com/714962 media/track/track-cue-rendering-position-auto-rtl.html [ Failure Pass ]
-crbug.com/714962 media/track/track-cue-rendering-position-auto.html [ Failure Pass ]
 crbug.com/591099 media/video-aspect-ratio.html [ Failure ]
 crbug.com/591099 media/video-canvas-alpha.html [ Failure ]
 crbug.com/591099 media/video-colorspace-yuv420.html [ Failure ]
@@ -6196,7 +6127,6 @@
 crbug.com/591099 paint/invalidation/clip/intermediate-layout-position-clip.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/mask-clip-change-stacking-child.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/outline-clip-change.html [ Failure ]
-crbug.com/714962 paint/invalidation/clip/repaint-subsequence-on-ancestor-clip-change-complex.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/clip/repaint-tile-clipped.html [ Crash ]
 crbug.com/591099 paint/invalidation/clip/replaced-clipped-positioned-not-wrong-incremental-repainting.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/subtree-root-clip-2.html [ Failure ]
@@ -6312,7 +6242,6 @@
 crbug.com/591099 paint/invalidation/iframe-display-block-to-display-none.html [ Failure ]
 crbug.com/591099 paint/invalidation/iframe-display-none-to-display-block.html [ Failure ]
 crbug.com/714962 paint/invalidation/image/canvas-composite-repaint-by-all-imagesource.html [ Failure ]
-crbug.com/714962 paint/invalidation/image/percent-size-image-resize-container.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/inline-block-resize.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-color-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-reflow.html [ Failure ]
@@ -6396,9 +6325,7 @@
 crbug.com/591099 paint/invalidation/overflow/flexible-box-overflow.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/float-overflow-right.html [ Crash ]
 crbug.com/591099 paint/invalidation/overflow/float-overflow.html [ Crash ]
-crbug.com/714962 paint/invalidation/overflow/inline-block-overflow-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/overflow/inline-block-overflow.html [ Failure ]
-crbug.com/714962 paint/invalidation/overflow/inline-box-overflow-repaint.html [ Failure Pass ]
 crbug.com/714962 paint/invalidation/overflow/inline-overflow.html [ Failure ]
 crbug.com/714962 paint/invalidation/overflow/inline-vertical-lr-overflow.html [ Failure ]
 crbug.com/714962 paint/invalidation/overflow/inline-vertical-rl-overflow.html [ Failure ]
@@ -6896,13 +6823,10 @@
 crbug.com/591099 printing/thead-repeats-at-top-of-each-page.html [ Failure ]
 crbug.com/591099 printing/thead-under-multicol.html [ Failure ]
 crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ]
-crbug.com/714962 scrollbars/basic-scrollbar.html [ Failure Pass ]
 crbug.com/714962 scrollbars/border-box-rect-clips-scrollbars.html [ Failure ]
 crbug.com/591099 scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure ]
 crbug.com/591099 scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ]
 crbug.com/714962 scrollbars/custom-scrollbars-paint-outside-iframe.html [ Failure ]
-crbug.com/714962 scrollbars/disabled-scrollbar.html [ Failure Pass ]
-crbug.com/714962 scrollbars/scrollbar-buttons.html [ Failure Pass ]
 crbug.com/591099 scrollbars/scrollbar-click-does-not-blur-content.html [ Failure ]
 crbug.com/591099 scrollbars/scrollbar-large-overflow-rectangle.html [ Crash ]
 crbug.com/591099 scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ]
@@ -7276,7 +7200,6 @@
 crbug.com/591099 tables/mozilla/bugs/bug101674.html [ Failure ]
 crbug.com/714962 tables/mozilla/bugs/bug106158-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug106158-2.html [ Failure ]
-crbug.com/714962 tables/mozilla/bugs/bug106816.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug109043.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug110566.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug113235-1.html [ Failure ]
@@ -7399,7 +7322,6 @@
 crbug.com/714962 tables/mozilla/core/row_span.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/core/table_heights.html [ Failure ]
 crbug.com/714962 tables/mozilla/core/table_rules.html [ Failure ]
-crbug.com/714962 tables/mozilla/dom/insertCellsRebuild1.html [ Failure Pass ]
 crbug.com/714962 tables/mozilla/marvin/col_span.html [ Failure ]
 crbug.com/714962 tables/mozilla/marvin/colgroup_span.html [ Failure ]
 crbug.com/714962 tables/mozilla/marvin/colgroup_width_pct.html [ Failure ]
@@ -7480,8 +7402,8 @@
 crbug.com/714962 touchadjustment/context-menu-text-subtargets.html [ Failure ]
 crbug.com/714962 touchadjustment/context-menu.html [ Failure ]
 crbug.com/714962 touchadjustment/disabled-formelements.html [ Failure ]
-crbug.com/714962 touchadjustment/event-triggered-widgets.html [ Failure ]
-crbug.com/714962 touchadjustment/html-label.html [ Failure ]
+crbug.com/714962 touchadjustment/event-triggered-widgets.html [ Failure Pass ]
+crbug.com/714962 touchadjustment/html-label.html [ Failure Pass ]
 crbug.com/591099 touchadjustment/small-target-test.html [ Failure ]
 crbug.com/714962 touchadjustment/stylus-generated-gesture-tap.html [ Failure ]
 crbug.com/714962 touchadjustment/touch-inlines.html [ Failure ]
@@ -7644,7 +7566,7 @@
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/event-path-for-user-agent-shadow-tree.html [ Crash ]
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/focus-navigation-with-distributed-nodes.html [ Crash ]
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/form-in-shadow.html [ Crash ]
-crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure ]
+crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure Pass ]
 crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/import-rule-in-shadow-tree-needs-document-style-recalc.html [ Failure ]
 crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/input-color-in-content.html [ Timeout ]
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/make-marquee-bold-by-exec-command-crash.html [ Pass ]
@@ -7752,7 +7674,7 @@
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/keydown-keypress-preventDefault.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/keypress-focus-change.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/media-element-focus-tab.html [ Failure ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-click-hyperlink.html [ Timeout ]
+crbug.com/714962 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-click-hyperlink.html [ Pass Timeout ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-latching.html [ Pass Timeout ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouse-drag-from-frame-to-other-frame.html [ Failure ]
@@ -7802,7 +7724,7 @@
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/selectstart-by-single-click-with-shift.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/sequential-focus-navigation-starting-point.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Failure ]
+crbug.com/714962 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/submit-reset-nested-bubble.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/tab-imagemap.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/tabindex-focus-blur-all.html [ Crash ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 8e19b6c..2d77006 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -510,29 +510,15 @@
 crbug.com/714962 virtual/layout_ng/fast/inline/outline-continuations.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/inline/styledEmptyInlinesWithBRs.html [ Failure ]
 
-### virtual/layout_ng/external/wpt/css/CSS2/floats/
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-bfc-003-left-overflow.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-bfc-003-right-overflow.xht [ Failure ]
-
 ### virtual/layout_ng/external/wpt/css/CSS2/linebox/
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/linebox/inline-formatting-context-015.xht [ Failure ]
 crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-baseline-005a.xht [ Failure ]
 
 ### virtual/layout_ng/external/wpt/css/CSS2/normal-flow/
 crbug.com/714962 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-block-valign-001.xht [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-block-valign-002.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-block-zorder-001.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-block-zorder-002.xht [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-table-002a.xht [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-table-002b.xht [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-table-valign-001.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-table-zorder-001.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-table-zorder-002.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/max-width-105.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/max-width-106.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/max-width-107.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/min-height-104.xht [ Failure ]
-crbug.com/714962 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/min-height-106.xht [ Failure ]
 
 ### virtual/layout_ng/external/wpt/css/CSS2/positioning/
 crbug.com/714962 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/positioning/bottom-offset-001.xht [ Failure ]
@@ -3443,3 +3429,8 @@
 
 # This test is flaking on mac_chromium_rel_ng.
 crbug.com/800840 [ Mac ] virtual/wheelscrolllatching/fast/compositor-wheel-scroll-latching/touchpad-scroll-impl-to-main.html [ Pass Failure ]
+
+# Sheriff failures 2018-01-19
+# This test is failing regularly on Win 7 (dgb), WebKit Mac10.11 (dgb),
+# WebKit Linux Trusty (dbg).
+crbug.com/803449 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-restored-breakpoint.js [ Pass Failure ]
diff --git a/third_party/WebKit/LayoutTests/bluetooth/script-tests/service/service-is-removed.js b/third_party/WebKit/LayoutTests/bluetooth/script-tests/service/service-is-removed.js
index 20c7ab7..aaf0f14 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/script-tests/service/service-is-removed.js
+++ b/third_party/WebKit/LayoutTests/bluetooth/script-tests/service/service-is-removed.js
@@ -1,21 +1,20 @@
 'use strict';
-bluetooth_test(() => {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithTrustedClick({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['generic_access']}))
-    .then(device => device.gatt.connect())
-    .then(gatt => gatt.getPrimaryService('generic_access'))
-    .then(service => {
-      return setBluetoothFakeAdapter('MissingServiceHeartRateAdapter')
-        .then(() => assert_promise_rejects_with_message(
-          service.CALLS([
-            getCharacteristic('gap.device_name')|
-            getCharacteristics()|
-            getCharacteristics('gap.device_name')[UUID]
-          ]),
-          new DOMException('GATT Service no longer exists.',
-                           'InvalidStateError'),
-          'Service got removed.'));
-    });
-}, 'Service is removed before FUNCTION_NAME call. Reject with InvalidStateError.');
+const test_desc = 'Service is removed before FUNCTION_NAME call. ' +
+    'Reject with InvalidStateError.';
+const expected = new DOMException('GATT Service no longer exists.',
+    'InvalidStateError');
+let service, fake_service, fake_peripheral;
+
+bluetooth_test(() => getHealthThermometerService()
+    .then(_ => ({service, fake_service, fake_peripheral} = _))
+    .then(() => fake_service.remove())
+    .then(() => fake_peripheral.simulateGATTServicesChanged())
+    .then(() => assert_promise_rejects_with_message(
+        service.CALLS([
+          getCharacteristic('measurement_interval')|
+          getCharacteristics()|
+          getCharacteristics('measurement_interval')[UUID]
+        ]),
+        expected,
+        'Service got removed.')),
+    test_desc);
diff --git a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristic/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristic/gen-service-is-removed.html
index 6441614c7..4543774 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristic/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristic/gen-service-is-removed.html
@@ -7,21 +7,20 @@
 <script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
-bluetooth_test(() => {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithTrustedClick({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['generic_access']}))
-    .then(device => device.gatt.connect())
-    .then(gatt => gatt.getPrimaryService('generic_access'))
-    .then(service => {
-      return setBluetoothFakeAdapter('MissingServiceHeartRateAdapter')
-        .then(() => assert_promise_rejects_with_message(
-          service.getCharacteristic('gap.device_name'),
-          new DOMException('GATT Service no longer exists.',
-                           'InvalidStateError'),
-          'Service got removed.'));
-    });
-}, 'Service is removed before getCharacteristic call. Reject with InvalidStateError.');
+const test_desc = 'Service is removed before getCharacteristic call. ' +
+    'Reject with InvalidStateError.';
+const expected = new DOMException('GATT Service no longer exists.',
+    'InvalidStateError');
+let service, fake_service, fake_peripheral;
+
+bluetooth_test(() => getHealthThermometerService()
+    .then(_ => ({service, fake_service, fake_peripheral} = _))
+    .then(() => fake_service.remove())
+    .then(() => fake_peripheral.simulateGATTServicesChanged())
+    .then(() => assert_promise_rejects_with_message(
+        service.getCharacteristic('measurement_interval'),
+        expected,
+        'Service got removed.')),
+    test_desc);
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.html b/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.html
index 3e9970a0..39bd06a 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.html
+++ b/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.html
@@ -7,21 +7,20 @@
 <script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
-bluetooth_test(() => {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithTrustedClick({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['generic_access']}))
-    .then(device => device.gatt.connect())
-    .then(gatt => gatt.getPrimaryService('generic_access'))
-    .then(service => {
-      return setBluetoothFakeAdapter('MissingServiceHeartRateAdapter')
-        .then(() => assert_promise_rejects_with_message(
-          service.getCharacteristics('gap.device_name'),
-          new DOMException('GATT Service no longer exists.',
-                           'InvalidStateError'),
-          'Service got removed.'));
-    });
-}, 'Service is removed before getCharacteristics call. Reject with InvalidStateError.');
+const test_desc = 'Service is removed before getCharacteristics call. ' +
+    'Reject with InvalidStateError.';
+const expected = new DOMException('GATT Service no longer exists.',
+    'InvalidStateError');
+let service, fake_service, fake_peripheral;
+
+bluetooth_test(() => getHealthThermometerService()
+    .then(_ => ({service, fake_service, fake_peripheral} = _))
+    .then(() => fake_service.remove())
+    .then(() => fake_peripheral.simulateGATTServicesChanged())
+    .then(() => assert_promise_rejects_with_message(
+        service.getCharacteristics('measurement_interval'),
+        expected,
+        'Service got removed.')),
+    test_desc);
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed.html
index d15a1678..bb883772 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed.html
@@ -7,21 +7,20 @@
 <script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
-bluetooth_test(() => {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithTrustedClick({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['generic_access']}))
-    .then(device => device.gatt.connect())
-    .then(gatt => gatt.getPrimaryService('generic_access'))
-    .then(service => {
-      return setBluetoothFakeAdapter('MissingServiceHeartRateAdapter')
-        .then(() => assert_promise_rejects_with_message(
-          service.getCharacteristics(),
-          new DOMException('GATT Service no longer exists.',
-                           'InvalidStateError'),
-          'Service got removed.'));
-    });
-}, 'Service is removed before getCharacteristics call. Reject with InvalidStateError.');
+const test_desc = 'Service is removed before getCharacteristics call. ' +
+    'Reject with InvalidStateError.';
+const expected = new DOMException('GATT Service no longer exists.',
+    'InvalidStateError');
+let service, fake_service, fake_peripheral;
+
+bluetooth_test(() => getHealthThermometerService()
+    .then(_ => ({service, fake_service, fake_peripheral} = _))
+    .then(() => fake_service.remove())
+    .then(() => fake_peripheral.simulateGATTServicesChanged())
+    .then(() => assert_promise_rejects_with_message(
+        service.getCharacteristics(),
+        expected,
+        'Service got removed.')),
+    test_desc);
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index 1c7de3e..1ecfb30 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -2749,6 +2749,12 @@
      {}
     ]
    ],
+   "css/selectors/hover-002-manual.html": [
+    [
+     "/css/selectors/hover-002-manual.html",
+     {}
+    ]
+   ],
    "entries-api/errors-manual.html": [
     [
      "/entries-api/errors-manual.html",
@@ -85199,6 +85205,30 @@
      {}
     ]
    ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html": [
+    [
+     "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html",
+     [
+      [
+       "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-two-cue-layout-after-first-end.html": [
+    [
+     "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-two-cue-layout-after-first-end.html",
+     [
+      [
+       "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-two-cue-layout-after-first-end-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/the-audio-element/audio_001.htm": [
     [
      "/html/semantics/embedded-content/the-audio-element/audio_001.htm",
@@ -110294,11 +110324,6 @@
      {}
     ]
    ],
-   "css/css-grid/support/grid-alignment.css": [
-    [
-     {}
-    ]
-   ],
    "css/css-grid/support/grid.css": [
     [
      {}
@@ -123779,6 +123804,11 @@
      {}
     ]
    ],
+   "css/support/alignment.css": [
+    [
+     {}
+    ]
+   ],
    "css/support/b-green.css": [
     [
      {}
@@ -137499,6 +137529,16 @@
      {}
     ]
    ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-two-cue-layout-after-first-end-ref.html": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/resources/should-load.html": [
     [
      {}
@@ -138429,16 +138469,6 @@
      {}
     ]
    ],
-   "html/semantics/forms/the-input-element/checkbox-click-events-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "html/semantics/forms/the-input-element/checkbox-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "html/semantics/forms/the-input-element/contains.json": [
     [
      {}
@@ -140669,11 +140699,21 @@
      {}
     ]
    ],
+   "html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/syntax/parsing/html5lib_menuitem-element_run_type=write-expected.txt": [
     [
      {}
     ]
    ],
+   "html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/syntax/parsing/html5lib_template-expected.txt": [
     [
      {}
@@ -140709,6 +140749,11 @@
      {}
     ]
    ],
+   "html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/syntax/parsing/html5lib_tests19-expected.txt": [
     [
      {}
@@ -140739,6 +140784,11 @@
      {}
     ]
    ],
+   "html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/syntax/parsing/html5lib_webkit02_run_type=write-expected.txt": [
     [
      {}
@@ -151624,11 +151674,6 @@
      {}
     ]
    ],
-   "webauthn/createcredential-badargs-rp.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "webauthn/createcredential-passing.https-expected.txt": [
     [
      {}
@@ -167626,6 +167671,66 @@
      {}
     ]
    ],
+   "css/css-align/content-distribution/parse-align-content-001.html": [
+    [
+     "/css/css-align/content-distribution/parse-align-content-001.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-align-content-002.html": [
+    [
+     "/css/css-align/content-distribution/parse-align-content-002.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-align-content-003.html": [
+    [
+     "/css/css-align/content-distribution/parse-align-content-003.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-align-content-004.html": [
+    [
+     "/css/css-align/content-distribution/parse-align-content-004.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-align-content-005.html": [
+    [
+     "/css/css-align/content-distribution/parse-align-content-005.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-justify-content-001.html": [
+    [
+     "/css/css-align/content-distribution/parse-justify-content-001.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-justify-content-002.html": [
+    [
+     "/css/css-align/content-distribution/parse-justify-content-002.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-justify-content-003.html": [
+    [
+     "/css/css-align/content-distribution/parse-justify-content-003.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-justify-content-004.html": [
+    [
+     "/css/css-align/content-distribution/parse-justify-content-004.html",
+     {}
+    ]
+   ],
+   "css/css-align/content-distribution/parse-justify-content-005.html": [
+    [
+     "/css/css-align/content-distribution/parse-justify-content-005.html",
+     {}
+    ]
+   ],
    "css/css-align/content-distribution/place-content-shorthand-001.html": [
     [
      "/css/css-align/content-distribution/place-content-shorthand-001.html",
@@ -167668,6 +167773,72 @@
      {}
     ]
    ],
+   "css/css-align/default-alignment/parse-align-items-001.html": [
+    [
+     "/css/css-align/default-alignment/parse-align-items-001.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-align-items-002.html": [
+    [
+     "/css/css-align/default-alignment/parse-align-items-002.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-align-items-003.html": [
+    [
+     "/css/css-align/default-alignment/parse-align-items-003.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-align-items-004.html": [
+    [
+     "/css/css-align/default-alignment/parse-align-items-004.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-align-items-005.html": [
+    [
+     "/css/css-align/default-alignment/parse-align-items-005.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-justify-items-001.html": [
+    [
+     "/css/css-align/default-alignment/parse-justify-items-001.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-justify-items-002.html": [
+    [
+     "/css/css-align/default-alignment/parse-justify-items-002.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-justify-items-003.html": [
+    [
+     "/css/css-align/default-alignment/parse-justify-items-003.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-justify-items-004.html": [
+    [
+     "/css/css-align/default-alignment/parse-justify-items-004.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-justify-items-005.html": [
+    [
+     "/css/css-align/default-alignment/parse-justify-items-005.html",
+     {}
+    ]
+   ],
+   "css/css-align/default-alignment/parse-justify-items-006.html": [
+    [
+     "/css/css-align/default-alignment/parse-justify-items-006.html",
+     {}
+    ]
+   ],
    "css/css-align/default-alignment/place-items-shorthand-001.html": [
     [
      "/css/css-align/default-alignment/place-items-shorthand-001.html",
@@ -167704,6 +167875,66 @@
      {}
     ]
    ],
+   "css/css-align/self-alignment/parse-align-self-001.html": [
+    [
+     "/css/css-align/self-alignment/parse-align-self-001.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-align-self-002.html": [
+    [
+     "/css/css-align/self-alignment/parse-align-self-002.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-align-self-003.html": [
+    [
+     "/css/css-align/self-alignment/parse-align-self-003.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-align-self-004.html": [
+    [
+     "/css/css-align/self-alignment/parse-align-self-004.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-align-self-005.html": [
+    [
+     "/css/css-align/self-alignment/parse-align-self-005.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-justify-self-001.html": [
+    [
+     "/css/css-align/self-alignment/parse-justify-self-001.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-justify-self-002.html": [
+    [
+     "/css/css-align/self-alignment/parse-justify-self-002.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-justify-self-003.html": [
+    [
+     "/css/css-align/self-alignment/parse-justify-self-003.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-justify-self-004.html": [
+    [
+     "/css/css-align/self-alignment/parse-justify-self-004.html",
+     {}
+    ]
+   ],
+   "css/css-align/self-alignment/parse-justify-self-005.html": [
+    [
+     "/css/css-align/self-alignment/parse-justify-self-005.html",
+     {}
+    ]
+   ],
    "css/css-align/self-alignment/place-self-shorthand-001.html": [
     [
      "/css/css-align/self-alignment/place-self-shorthand-001.html",
@@ -169560,6 +169791,18 @@
      {}
     ]
    ],
+   "css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html": [
+    [
+     "/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html",
+     {}
+    ]
+   ],
+   "css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html": [
+    [
+     "/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html",
+     {}
+    ]
+   ],
    "css/css-logical/logicalprops-block-size-vlr.html": [
     [
      "/css/css-logical/logicalprops-block-size-vlr.html",
@@ -187678,6 +187921,12 @@
      {}
     ]
    ],
+   "html/semantics/rellist-feature-detection.html": [
+    [
+     "/html/semantics/rellist-feature-detection.html",
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/async_001.htm": [
     [
      "/html/semantics/scripting-1/the-script-element/async_001.htm",
@@ -189752,18 +190001,6 @@
      {}
     ]
    ],
-   "html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html": [
-    [
-     "/html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html",
-     {}
-    ]
-   ],
-   "html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html": [
-    [
-     "/html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html",
-     {}
-    ]
-   ],
    "html/semantics/text-level-semantics/the-data-element/data.value-001.html": [
     [
      "/html/semantics/text-level-semantics/the-data-element/data.value-001.html",
@@ -254009,6 +254246,46 @@
    "484c3544ed355f7236875107bbc7d3be3d78a1a4",
    "support"
   ],
+  "css/css-align/content-distribution/parse-align-content-001.html": [
+   "b05ebeb67d6bed46934615d8d4f106e38dccd090",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-align-content-002.html": [
+   "e4346623eb98505e10e638fba735648eb95a4a3b",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-align-content-003.html": [
+   "8e2435ac7e9a58618a803f9493699051db7e67d7",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-align-content-004.html": [
+   "25b97afad60913e08fcad5bef4217cad1d88ebfd",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-align-content-005.html": [
+   "9e324ebeacdc89d2257069b21fb017767513a27e",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-justify-content-001.html": [
+   "25b5da714c58f79b2a42b8ee8a435291e6be46c9",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-justify-content-002.html": [
+   "52ed60528d9672ce65f0cfa06969ca3a9b826c31",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-justify-content-003.html": [
+   "37ddda34449409c9565d19f05f6c0c81989412e0",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-justify-content-004.html": [
+   "602e5a7e15fedbd3f557e88905006ea92c56eded",
+   "testharness"
+  ],
+  "css/css-align/content-distribution/parse-justify-content-005.html": [
+   "349d5fbf2916bf93ad87c130afe04b7f2ad011e9",
+   "testharness"
+  ],
   "css/css-align/content-distribution/place-content-shorthand-001.html": [
    "c0d87c542bd637ff3ac5bd5c6dc33a4d5bef49ed",
    "testharness"
@@ -254037,6 +254314,50 @@
    "bcf17f709a9b87ef728262b658d1dfa65afc93bb",
    "testharness"
   ],
+  "css/css-align/default-alignment/parse-align-items-001.html": [
+   "7ec017c3a10cba23c3c319336d115ebd29dc0443",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-align-items-002.html": [
+   "2fc31763bfb3f524ce97f819132ff838152bddd7",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-align-items-003.html": [
+   "0c15039fbd3ebeecaca99c775fdb4592a304b0c7",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-align-items-004.html": [
+   "470d3ef1b1d4c6eeb4c2067d79f966c742ec3ca9",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-align-items-005.html": [
+   "98718dab73f6ee062968fd1671bb785fb8e8998f",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-justify-items-001.html": [
+   "a8b4aa683e015a1e06157c1fffb533c4ff28a0ea",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-justify-items-002.html": [
+   "c9686f7a9c05c601440cfeb7c6ee83a884d310c7",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-justify-items-003.html": [
+   "ca1db7d5575a9c5c5a1ccb14b38a250c515b1ab0",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-justify-items-004.html": [
+   "a654d1aa62c6f04df1fd3e9e81272600eb9c6752",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-justify-items-005.html": [
+   "2d7d4871ff887570ea0d6292d389080ac8bc9932",
+   "testharness"
+  ],
+  "css/css-align/default-alignment/parse-justify-items-006.html": [
+   "e37a66d4363c4df6c04eef3b6fbfe26208369cb1",
+   "testharness"
+  ],
   "css/css-align/default-alignment/place-items-shorthand-001.html": [
    "cc69bbbee852e6cd203d3f39dac2a1e05a428361",
    "testharness"
@@ -254070,9 +254391,49 @@
    "support"
   ],
   "css/css-align/resources/alignment-parsing-utils.js": [
-   "0340f801692801d985e8b75be0bb27b6ddff734f",
+   "ee99e164cf95fb2a39ef999c5700bf5750b49345",
    "support"
   ],
+  "css/css-align/self-alignment/parse-align-self-001.html": [
+   "4ddb0f79a968afeb24259e969456b887a94439f8",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-align-self-002.html": [
+   "1c5027f3f20691d6a73712d671ff824d618da69d",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-align-self-003.html": [
+   "2691089c5137327fc19f09d4b280f732758c99a0",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-align-self-004.html": [
+   "e0262f878d4f26e44894813033015daf9c4c7d9c",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-align-self-005.html": [
+   "22e055e8837ddf2e4de5e4fd9f3abce3168956e2",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-justify-self-001.html": [
+   "3cb9322f0d9fbd06c98ccf6f820a3bfbb677b103",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-justify-self-002.html": [
+   "6ea4d8b71197a19a0e0ab7be959802130194c2e7",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-justify-self-003.html": [
+   "30a034f5ddd539cef713d3ba5c5644b592b85e8d",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-justify-self-004.html": [
+   "9b4d1453941411fc09f676e00b0bd0e5a9ddf7e7",
+   "testharness"
+  ],
+  "css/css-align/self-alignment/parse-justify-self-005.html": [
+   "e40d7137c71d3d11a434a17861450d2380138a2e",
+   "testharness"
+  ],
   "css/css-align/self-alignment/place-self-shorthand-001.html": [
    "62d9c6a64f6f97ed2ecef74d885397c648de3c14",
    "testharness"
@@ -269102,11 +269463,11 @@
    "reftest"
   ],
   "css/css-grid/abspos/grid-positioned-items-content-alignment-001.html": [
-   "cb977a8f3e05d48e92ffecad0031834087a2ef97",
+   "d9f5abb41f8fb479c37f0d364b9cd73cb9008829",
    "testharness"
   ],
   "css/css-grid/abspos/grid-positioned-items-content-alignment-rtl-001.html": [
-   "6c8ff0ddb3895d6a13d8b1354dea5ef4324c9b03",
+   "81cd5622a02ae3bdccd609d6e409241b9ba92117",
    "testharness"
   ],
   "css/css-grid/abspos/grid-positioned-items-gaps-001.html": [
@@ -270893,6 +271254,14 @@
    "909c91b995daafc31a6fa9f6989dc78c892840e3",
    "reftest"
   ],
+  "css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html": [
+   "8f25b5a976f6f113a539fa22c8ab7f4d7cf3b2fd",
+   "testharness"
+  ],
+  "css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html": [
+   "d1cf60290fb927f91dc132fd801b92b84262e003",
+   "testharness"
+  ],
   "css/css-grid/layout-algorithm/grid-layout-free-space-unit.html": [
    "5873efcda9c17e48a8437a62bf6871cbf96bdc46",
    "reftest"
@@ -270993,10 +271362,6 @@
    "feb53485e24aeaf9a5f27be5e42cc4a6fc5b8df0",
    "support"
   ],
-  "css/css-grid/support/grid-alignment.css": [
-   "b45aee51245613ceddf8eda70d995a26027671bd",
-   "support"
-  ],
   "css/css-grid/support/grid.css": [
    "6bb300b8baebf700481ea162fb7b41913fcca29c",
    "support"
@@ -272578,11 +272943,11 @@
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-018-ref.html": [
-   "7dd468373f6efa2b5a3a8d16c91c0d4dec87c143",
+   "a831ef2690027b266f499d652b25ed8684e0fbaf",
    "support"
   ],
   "css/css-paint-api/parse-input-arguments-018.https.html": [
-   "b606bfff93300f114ea4efab85e489727e9821c7",
+   "2ae9cf7d13fa40e568d2324d060885a68ea3dbbd",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-019.https.html": [
@@ -297529,6 +297894,10 @@
    "ce45f6b6f483ae52c241acff168573a0907ca031",
    "manual"
   ],
+  "css/selectors/hover-002-manual.html": [
+   "589b8621fbe7e03d9254693eafd718cab6818bd6",
+   "manual"
+  ],
   "css/selectors/htaccess": [
    "23f218e48d8fabcfdb4d0fba13066d2fa737fb99",
    "support"
@@ -297921,6 +298290,10 @@
    "a9716c222274ba868bfd06c05e28cb7762d93245",
    "support"
   ],
+  "css/support/alignment.css": [
+   "0a5f57a816f56c3e16f992a4bbea8d50b3c6fad9",
+   "support"
+  ],
   "css/support/b-green.css": [
    "eb78a4d12f35b4249051826ea000c53d04df80b7",
    "support"
@@ -311550,7 +311923,7 @@
    "testharness"
   ],
   "html/dom/usvstring-reflection.html": [
-   "a48e32b268a8117ed803c8ede806a879e1556d76",
+   "33a8ab2735650368c7cdc38226cb84be2dbbee85",
    "testharness"
   ],
   "html/editing/.gitkeep": [
@@ -318693,6 +319066,14 @@
    "baa44683fe0d00e691f536309a7772347301d57a",
    "testharness"
   ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines-ref.html": [
+   "229912bc6439e9a83adb0793d2c7e97b67ef2e5f",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html": [
+   "f7befc87f84534b206e72ecca9c2f35c27833786",
+   "reftest"
+  ],
   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-positioning.html": [
    "852584f301e1ab52359e3344120149d65a35d5f7",
    "testharness"
@@ -318717,6 +319098,14 @@
    "c42b3e45318e167bf00edf77528d56e2d107d5e8",
    "testharness"
   ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-two-cue-layout-after-first-end-ref.html": [
+   "2c37fbbd1a8f2b28de5f10363565d122a6c36916",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-two-cue-layout-after-first-end.html": [
+   "099a220edda883f720e874c4b06714cdb70d34cd",
+   "reftest"
+  ],
   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-unsupported-markup.html": [
    "c43ab0c10e1de3af01f6137c044c73cfcbc6d339",
    "testharness"
@@ -320873,18 +321262,10 @@
    "b827cd11bb58fdffa11fb8d1fa9634ab41368602",
    "testharness"
   ],
-  "html/semantics/forms/the-input-element/checkbox-click-events-expected.txt": [
-   "bc3f310b0231687375fc87318cdc27ebcc8bf752",
-   "support"
-  ],
   "html/semantics/forms/the-input-element/checkbox-click-events.html": [
    "9e1d67b4488c9ba65f103ab6a6780ee91362b128",
    "testharness"
   ],
-  "html/semantics/forms/the-input-element/checkbox-expected.txt": [
-   "e954496918be58fe06e01cbb7fc3f36a3cc96c1f",
-   "support"
-  ],
   "html/semantics/forms/the-input-element/checkbox.html": [
    "9765d69386d9f25a9793b101f5173ccf29b5bdee",
    "testharness"
@@ -321853,6 +322234,10 @@
    "6426b10821b4af9a794c52940a08afd144ff1730",
    "support"
   ],
+  "html/semantics/rellist-feature-detection.html": [
+   "382371297d71a43de804453a6f40b9d63e08ee3f",
+   "testharness"
+  ],
   "html/semantics/scripting-1/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
@@ -324329,10 +324714,6 @@
    "d6cf92ac34d83cdd6357d516daeb87108933f8ed",
    "testharness"
   ],
-  "html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html": [
-   "aff1352988cb70e52cff99e1fde379a807dd6984",
-   "testharness"
-  ],
   "html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html": [
    "f703d9a7ce1e09e0c9ef9ea2bd2cd2b318613f6d",
    "support"
@@ -324345,10 +324726,6 @@
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
-  "html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html": [
-   "d51356778b9a9e87e79c33b64ea9cf31a091cb07",
-   "testharness"
-  ],
   "html/semantics/text-level-semantics/the-b-element/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
@@ -324945,10 +325322,18 @@
    "57cdb7dd7f3f7876b045661b8187beb14de67ea9",
    "testharness"
   ],
+  "html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt": [
+   "ff6613c2491929c73ba5e746519a19a683a5bb46",
+   "support"
+  ],
   "html/syntax/parsing/html5lib_menuitem-element_run_type=write-expected.txt": [
    "ff6613c2491929c73ba5e746519a19a683a5bb46",
    "support"
   ],
+  "html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt": [
+   "ff6613c2491929c73ba5e746519a19a683a5bb46",
+   "support"
+  ],
   "html/syntax/parsing/html5lib_namespace-sensitivity.html": [
    "527963e681efad54c64cddfceac31448079d1517",
    "testharness"
@@ -325033,6 +325418,10 @@
    "a595d947220e8089907f05b6ccbd4b3b6301ad92",
    "support"
   ],
+  "html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt": [
+   "a595d947220e8089907f05b6ccbd4b3b6301ad92",
+   "support"
+  ],
   "html/syntax/parsing/html5lib_tests12.html": [
    "50958869e795af40beba5d227705c9d3aba1e0b6",
    "testharness"
@@ -325153,6 +325542,10 @@
    "1373d5b587b45c8ec0a48bc16d46fec852c1c441",
    "testharness"
   ],
+  "html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt": [
+   "8c50ccfd9b8842e9d6fa33a15945cc5dad1fabc6",
+   "support"
+  ],
   "html/syntax/parsing/html5lib_webkit02_run_type=write-expected.txt": [
    "8c50ccfd9b8842e9d6fa33a15945cc5dad1fabc6",
    "support"
@@ -348262,7 +348655,7 @@
    "testharness"
   ],
   "shadow-dom/event-composed-path-with-related-target.html": [
-   "6a5cbb21645faf8f18ed4b14799a6d01b326f998",
+   "a4c58227f937a943b3845ed3f672419b62a8caad",
    "testharness"
   ],
   "shadow-dom/event-composed-path.html": [
@@ -352693,10 +353086,6 @@
    "832fb99e215923e9d102f48f2a0cd06ea11ff86b",
    "support"
   ],
-  "webauthn/createcredential-badargs-rp.https-expected.txt": [
-   "6b8193f882d66d96ace82fbd997eb624d90b19e7",
-   "support"
-  ],
   "webauthn/createcredential-badargs-rp.https.html": [
    "941a9bda02e22b7d54855e3a4714a49d8392fa9d",
    "testharness"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html
new file mode 100644
index 0000000..25d236ce
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid Track Sizing Algorithm Flexible Tracks and Gutters</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid/#gutters">
+<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-find-fr-size">
+<meta name="assert" content="This test checks that the size of flexible tracks is properly computed when you have gaps (with and without spanning items).">
+<style>
+.grid {
+  position: relative;
+  display: grid;
+  grid-gap: 10px 20px;
+  font: 10px/1 Ahem;
+  margin: 50px;
+}
+
+.fixedSize {
+  width: 200px;
+  height: 100px;
+}
+
+.contentBasedSize {
+  float: left;
+  height: auto;
+}
+
+.grid div:nth-child(1) { background: magenta; }
+.grid div:nth-child(2) { background: cyan; }
+.grid div:nth-child(3) { background: yellow; }
+.grid div:nth-child(4) { background: lime; }
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid fixedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50"></div>
+  <div data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40"></div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40"></div>
+</div>
+
+<div class="grid fixedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="50"></div>
+  <div data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40"></div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40"></div>
+</div>
+
+<div class="grid fixedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: 1; grid-row: 1;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div style="grid-column: 2; grid-row: 1;"
+    data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50"></div>
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="60" data-expected-width="200" data-expected-height="40"></div>
+</div>
+
+<div class="grid fixedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-row: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="100"></div>
+  <div data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50"></div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40"></div>
+</div>
+
+<div class="grid fixedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: 1; grid-row: 1;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div style="grid-column: 1; grid-row: 2;"
+    data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40"></div>
+  <div style="grid-row: span 2;"
+    data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="100"></div>
+</div>
+
+<div class="grid fixedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-row: span 2; grid-column: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50">XXXXXXXX</div>
+  <div data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40">X<br>X<br>X<br>X</div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40"></div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50"></div>
+  <div data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40"></div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40">XXXXXXXX<br>X<br>X<br>X</div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="50"></div>
+  <div data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40">X<br>X<br>X<br>X</div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40">XXXXXXXX</div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="50">XXXXXXXXXXXXXXXXXXXX</div>
+  <div data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40">X<br>X<br>X<br>X</div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40"></div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: 1; grid-row: 1;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div style="grid-column: 2; grid-row: 1;"
+    data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50">XXXXXXXX</div>
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="60" data-expected-width="200" data-expected-height="40">X<br>X<br>X<br>X</div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: 1; grid-row: 1;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div style="grid-column: 2; grid-row: 1;"
+    data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50"></div>
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="60" data-expected-width="200" data-expected-height="40">XXXXXXXXXXXXXXXXXXXX<br>X<br>X<br>X</div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-row: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="100"></div>
+  <div data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50">XXXXXXXX</div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40">X<br>X<br>X<br>X</div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-row: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="100">X<br>X<br>X<br>X<br>X<br>X<br>X<br>X<br>X<br>X</div>
+  <div data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="50">XXXXXXXX</div>
+  <div data-offset-x="120" data-offset-y="60" data-expected-width="80" data-expected-height="40"></div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: 1; grid-row: 1;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div style="grid-column: 1; grid-row: 2;"
+    data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40">X<br>X<br>X<br>X</div>
+  <div style="grid-row: span 2;"
+    data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="100">XXXXXXXX</div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: 1; grid-row: 1;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50"></div>
+  <div style="grid-column: 1; grid-row: 2;"
+    data-offset-x="0" data-offset-y="60" data-expected-width="100" data-expected-height="40"></div>
+  <div style="grid-row: span 2;"
+    data-offset-x="120" data-offset-y="0" data-expected-width="80" data-expected-height="100">XXXXXXXX<br>X<br>X<br>X<br>X<br>X<br>X<br>X<br>X<br>X</div>
+</div>
+
+<div class="grid contentBasedSize" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-row: span 2; grid-column: span 2;"
+       data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100">
+XXXXXXXXXXXXXXXXXXXX<br>X<br>X<br>X<br>X<br>X<br>X<br>X<br>X<br>X</div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html
new file mode 100644
index 0000000..340fe82c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid Track Sizing Algorithm Flexible Tracks and Gutters</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid/#gutters">
+<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-find-fr-size">
+<meta name="assert" content="This test checks that the size of flexible tracks is properly computed when the grid container is content based and you have items spanning flexbile tracks that are smaller than the gutter sizes.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-gap: 50px 100px;
+  font: 10px/1 Ahem;
+  margin: 50px;
+}
+
+.grid div:nth-child(1) { background: magenta; }
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="50">X</div>
+</div>
+
+<div class="grid" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-row: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="100">X</div>
+</div>
+
+<div class="grid" style="grid: 50px 1fr / 100px 1fr;">
+  <div style="grid-column: span 2; grid-row: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100">X</div>
+</div>
+
+<div class="grid" style="grid: 0px 1fr / 0px 1fr;">
+  <div style="grid-column: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="0">X</div>
+</div>
+
+<div class="grid" style="grid: 0px 1fr / 0px 1fr;">
+  <div style="grid-row: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="0" data-expected-height="50">X</div>
+</div>
+
+<div class="grid" style="grid: 0px 1fr / 0px 1fr;">
+  <div style="grid-column: span 2; grid-row: span 2;"
+    data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50">X</div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/mac/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/fake_bluetooth.mojom.js b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/fake_bluetooth.mojom.js
index 2751e14..dd2d653 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/fake_bluetooth.mojom.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/fake_bluetooth.mojom.js
@@ -11,9 +11,6 @@
     return;
   }
   mojo.internal.markMojomLoaded(mojomId);
-
-  // TODO(yzshen): Define these aliases to minimize the differences between the
-  // old/new modes. Remove them when the old mode goes away.
   var bindings = mojo;
   var associatedBindings = mojo;
   var codec = mojo.internal;
@@ -1252,6 +1249,137 @@
     encoder.writeUint32(0);
     encoder.encodeStruct(codec.NullableString, val.serviceId);
   };
+  function FakeCentral_RemoveFakeService_Params(values) {
+    this.initDefaults_();
+    this.initFields_(values);
+  }
+
+
+  FakeCentral_RemoveFakeService_Params.prototype.initDefaults_ = function() {
+    this.identifier = null;
+    this.peripheralAddress = null;
+  };
+  FakeCentral_RemoveFakeService_Params.prototype.initFields_ = function(fields) {
+    for(var field in fields) {
+        if (this.hasOwnProperty(field))
+          this[field] = fields[field];
+    }
+  };
+
+  FakeCentral_RemoveFakeService_Params.validate = function(messageValidator, offset) {
+    var err;
+    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    var kVersionSizes = [
+      {version: 0, numBytes: 24}
+    ];
+    err = messageValidator.validateStructVersion(offset, kVersionSizes);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+
+    // validate FakeCentral_RemoveFakeService_Params.identifier
+    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
+    if (err !== validator.validationError.NONE)
+        return err;
+
+
+    // validate FakeCentral_RemoveFakeService_Params.peripheralAddress
+    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    return validator.validationError.NONE;
+  };
+
+  FakeCentral_RemoveFakeService_Params.encodedSize = codec.kStructHeaderSize + 16;
+
+  FakeCentral_RemoveFakeService_Params.decode = function(decoder) {
+    var packed;
+    var val = new FakeCentral_RemoveFakeService_Params();
+    var numberOfBytes = decoder.readUint32();
+    var version = decoder.readUint32();
+    val.identifier = decoder.decodeStruct(codec.String);
+    val.peripheralAddress = decoder.decodeStruct(codec.String);
+    return val;
+  };
+
+  FakeCentral_RemoveFakeService_Params.encode = function(encoder, val) {
+    var packed;
+    encoder.writeUint32(FakeCentral_RemoveFakeService_Params.encodedSize);
+    encoder.writeUint32(0);
+    encoder.encodeStruct(codec.String, val.identifier);
+    encoder.encodeStruct(codec.String, val.peripheralAddress);
+  };
+  function FakeCentral_RemoveFakeService_ResponseParams(values) {
+    this.initDefaults_();
+    this.initFields_(values);
+  }
+
+
+  FakeCentral_RemoveFakeService_ResponseParams.prototype.initDefaults_ = function() {
+    this.success = false;
+  };
+  FakeCentral_RemoveFakeService_ResponseParams.prototype.initFields_ = function(fields) {
+    for(var field in fields) {
+        if (this.hasOwnProperty(field))
+          this[field] = fields[field];
+    }
+  };
+
+  FakeCentral_RemoveFakeService_ResponseParams.validate = function(messageValidator, offset) {
+    var err;
+    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    var kVersionSizes = [
+      {version: 0, numBytes: 16}
+    ];
+    err = messageValidator.validateStructVersion(offset, kVersionSizes);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+
+    return validator.validationError.NONE;
+  };
+
+  FakeCentral_RemoveFakeService_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+  FakeCentral_RemoveFakeService_ResponseParams.decode = function(decoder) {
+    var packed;
+    var val = new FakeCentral_RemoveFakeService_ResponseParams();
+    var numberOfBytes = decoder.readUint32();
+    var version = decoder.readUint32();
+    packed = decoder.readUint8();
+    val.success = (packed >> 0) & 1 ? true : false;
+    decoder.skip(1);
+    decoder.skip(1);
+    decoder.skip(1);
+    decoder.skip(1);
+    decoder.skip(1);
+    decoder.skip(1);
+    decoder.skip(1);
+    return val;
+  };
+
+  FakeCentral_RemoveFakeService_ResponseParams.encode = function(encoder, val) {
+    var packed;
+    encoder.writeUint32(FakeCentral_RemoveFakeService_ResponseParams.encodedSize);
+    encoder.writeUint32(0);
+    packed = 0;
+    packed |= (val.success & 1) << 0
+    encoder.writeUint8(packed);
+    encoder.skip(1);
+    encoder.skip(1);
+    encoder.skip(1);
+    encoder.skip(1);
+    encoder.skip(1);
+    encoder.skip(1);
+    encoder.skip(1);
+  };
   function FakeCentral_AddFakeCharacteristic_Params(values) {
     this.initDefaults_();
     this.initFields_(values);
@@ -2701,14 +2829,15 @@
   var kFakeCentral_SimulateGATTDisconnection_Name = 3;
   var kFakeCentral_SimulateGATTServicesChanged_Name = 4;
   var kFakeCentral_AddFakeService_Name = 5;
-  var kFakeCentral_AddFakeCharacteristic_Name = 6;
-  var kFakeCentral_RemoveFakeCharacteristic_Name = 7;
-  var kFakeCentral_AddFakeDescriptor_Name = 8;
-  var kFakeCentral_SetNextReadCharacteristicResponse_Name = 9;
-  var kFakeCentral_SetNextWriteCharacteristicResponse_Name = 10;
-  var kFakeCentral_SetNextSubscribeToNotificationsResponse_Name = 11;
-  var kFakeCentral_GetLastWrittenValue_Name = 12;
-  var kFakeCentral_SetNextReadDescriptorResponse_Name = 13;
+  var kFakeCentral_RemoveFakeService_Name = 6;
+  var kFakeCentral_AddFakeCharacteristic_Name = 7;
+  var kFakeCentral_RemoveFakeCharacteristic_Name = 8;
+  var kFakeCentral_AddFakeDescriptor_Name = 9;
+  var kFakeCentral_SetNextReadCharacteristicResponse_Name = 10;
+  var kFakeCentral_SetNextWriteCharacteristicResponse_Name = 11;
+  var kFakeCentral_SetNextSubscribeToNotificationsResponse_Name = 12;
+  var kFakeCentral_GetLastWrittenValue_Name = 13;
+  var kFakeCentral_SetNextReadDescriptorResponse_Name = 14;
 
   function FakeCentralPtr(handleOrPtrInfo) {
     this.ptr = new bindings.InterfacePtrController(FakeCentral,
@@ -2883,6 +3012,32 @@
       });
     }.bind(this));
   };
+  FakeCentralPtr.prototype.removeFakeService = function() {
+    return FakeCentralProxy.prototype.removeFakeService
+        .apply(this.ptr.getProxy(), arguments);
+  };
+
+  FakeCentralProxy.prototype.removeFakeService = function(identifier, peripheralAddress) {
+    var params = new FakeCentral_RemoveFakeService_Params();
+    params.identifier = identifier;
+    params.peripheralAddress = peripheralAddress;
+    return new Promise(function(resolve, reject) {
+      var builder = new codec.MessageV1Builder(
+          kFakeCentral_RemoveFakeService_Name,
+          codec.align(FakeCentral_RemoveFakeService_Params.encodedSize),
+          codec.kMessageExpectsResponse, 0);
+      builder.encodeStruct(FakeCentral_RemoveFakeService_Params, params);
+      var message = builder.finish();
+      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+        var reader = new codec.MessageReader(message);
+        var responseParams =
+            reader.decodeStruct(FakeCentral_RemoveFakeService_ResponseParams);
+        resolve(responseParams);
+      }).catch(function(result) {
+        reject(Error("Connection error: " + result));
+      });
+    }.bind(this));
+  };
   FakeCentralPtr.prototype.addFakeCharacteristic = function() {
     return FakeCentralProxy.prototype.addFakeCharacteristic
         .apply(this.ptr.getProxy(), arguments);
@@ -3130,6 +3285,9 @@
   FakeCentralStub.prototype.addFakeService = function(peripheralAddress, serviceUuid) {
     return this.delegate_ && this.delegate_.addFakeService && this.delegate_.addFakeService(peripheralAddress, serviceUuid);
   }
+  FakeCentralStub.prototype.removeFakeService = function(identifier, peripheralAddress) {
+    return this.delegate_ && this.delegate_.removeFakeService && this.delegate_.removeFakeService(identifier, peripheralAddress);
+  }
   FakeCentralStub.prototype.addFakeCharacteristic = function(characteristicUuid, properties, serviceId, peripheralAddress) {
     return this.delegate_ && this.delegate_.addFakeCharacteristic && this.delegate_.addFakeCharacteristic(characteristicUuid, properties, serviceId, peripheralAddress);
   }
@@ -3262,6 +3420,22 @@
         responder.accept(message);
       });
       return true;
+    case kFakeCentral_RemoveFakeService_Name:
+      var params = reader.decodeStruct(FakeCentral_RemoveFakeService_Params);
+      this.removeFakeService(params.identifier, params.peripheralAddress).then(function(response) {
+        var responseParams =
+            new FakeCentral_RemoveFakeService_ResponseParams();
+        responseParams.success = response.success;
+        var builder = new codec.MessageV1Builder(
+            kFakeCentral_RemoveFakeService_Name,
+            codec.align(FakeCentral_RemoveFakeService_ResponseParams.encodedSize),
+            codec.kMessageIsResponse, reader.requestID);
+        builder.encodeStruct(FakeCentral_RemoveFakeService_ResponseParams,
+                             responseParams);
+        var message = builder.finish();
+        responder.accept(message);
+      });
+      return true;
     case kFakeCentral_AddFakeCharacteristic_Name:
       var params = reader.decodeStruct(FakeCentral_AddFakeCharacteristic_Params);
       this.addFakeCharacteristic(params.characteristicUuid, params.properties, params.serviceId, params.peripheralAddress).then(function(response) {
@@ -3424,6 +3598,10 @@
         if (message.expectsResponse())
           paramsClass = FakeCentral_AddFakeService_Params;
       break;
+      case kFakeCentral_RemoveFakeService_Name:
+        if (message.expectsResponse())
+          paramsClass = FakeCentral_RemoveFakeService_Params;
+      break;
       case kFakeCentral_AddFakeCharacteristic_Name:
         if (message.expectsResponse())
           paramsClass = FakeCentral_AddFakeCharacteristic_Params;
@@ -3490,6 +3668,10 @@
         if (message.isResponse())
           paramsClass = FakeCentral_AddFakeService_ResponseParams;
         break;
+      case kFakeCentral_RemoveFakeService_Name:
+        if (message.isResponse())
+          paramsClass = FakeCentral_RemoveFakeService_ResponseParams;
+        break;
       case kFakeCentral_AddFakeCharacteristic_Name:
         if (message.isResponse())
           paramsClass = FakeCentral_AddFakeCharacteristic_ResponseParams;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web-bluetooth-test.js b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web-bluetooth-test.js
index 1658ff1..8ba0401 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web-bluetooth-test.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web-bluetooth-test.js
@@ -236,6 +236,16 @@
       characteristic_id, this.service_id_,
       this.peripheral_address_, this.fake_central_ptr_);
   }
+
+  // Removes the fake GATT service from its fake peripheral.
+  async remove() {
+    let {success} =
+        await this.fake_central_ptr_.removeFakeService(
+            this.service_id_,
+            this.peripheral_address_);
+
+    if (!success) throw 'remove failed';
+  }
 }
 
 class FakeRemoteGATTCharacteristic {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/xhr/xmlhttprequest-sync-default-feature-policy.sub.html b/third_party/WebKit/LayoutTests/external/wpt/xhr/xmlhttprequest-sync-default-feature-policy.sub.html
index 1866100b..5ad55577 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/xhr/xmlhttprequest-sync-default-feature-policy.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/xhr/xmlhttprequest-sync-default-feature-policy.sub.html
@@ -17,11 +17,15 @@
           try {
             var xhr = new XMLHttpRequest();
             xhr.open("GET", "data:,", false);
-            xhr.send();
-            resolve();
+            try {
+              xhr.send();
+            } catch(e) {
+              reject(e);
+            }
           } catch(e) {
-            reject(e);
+            reject({"name": "UnexpectedException:" + e.name});
           }
+          resolve();
        });
       });
   </script>
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-filter-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-filter-expected.png
index f20ff7d..b2718f1 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-filter-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-filter-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png
index 6a76870..b38d5c9 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v175/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/elements/accessibility/edit-aria-attributes-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/elements/accessibility/edit-aria-attributes-expected.txt
index 6a126ed..573a4721 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/elements/accessibility/edit-aria-attributes-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/elements/accessibility/edit-aria-attributes-expected.txt
@@ -5,5 +5,5 @@
 === After attribute modification ===
 checkbox "ARIA checkbox" invalid="false" checked="false"
 === After role modification ===
-radio "ARIA checkbox" invalid="false" checked="false" selected="false"
+radio "ARIA checkbox" invalid="false" checked="false"
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource-expected.txt
index 353fe01..9f0d8f2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource-expected.txt
@@ -5,6 +5,56 @@
 {
     data : {
         frame : <string>
+        priority : "VeryHigh"
+        requestId : <string>
+        requestMethod : "GET"
+        url : .../devtools/tracing/resources/hello.html
+    }
+    endTime : <number>
+    frameId : <string>
+    startTime : <number>
+    type : "ResourceSendRequest"
+}
+Text details for ResourceSendRequest: hello.html
+
+ResourceReceiveResponse Properties:
+{
+    data : {
+        encodedDataLength : <number>
+        frame : <string>
+        fromCache : false
+        fromServiceWorker : false
+        mimeType : "text/html"
+        requestId : <string>
+        statusCode : 200
+        timing : <object>
+    }
+    endTime : <number>
+    frameId : <string>
+    startTime : <number>
+    type : "ResourceReceiveResponse"
+}
+Text details for ResourceReceiveResponse: hello.html
+
+ResourceFinish Properties:
+{
+    data : {
+        decodedBodyLength : 20
+        didFail : false
+        encodedDataLength : <number>
+        finishTime : <number>
+        requestId : <string>
+    }
+    endTime : <number>
+    startTime : <number>
+    type : "ResourceFinish"
+}
+Text details for ResourceFinish: hello.html
+
+ResourceSendRequest Properties:
+{
+    data : {
+        frame : <string>
         priority : "Low"
         requestId : <string>
         requestMethod : "GET"
@@ -37,7 +87,6 @@
     type : "ResourceReceiveResponse"
 }
 Text details for ResourceReceiveResponse: timeline-network-resource.js
-Response received status: 200
 
 ResourceFinish Properties:
 {
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource.js b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource.js
index b0a80a3..cceae3cc 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/tracing/timeline-network/timeline-network-resource.js
@@ -6,8 +6,12 @@
   TestRunner.addResult(`Tests the Timeline API instrumentation of a network resource load\n`);
   await TestRunner.loadModule('performance_test_runner');
   await TestRunner.showPanel('timeline');
+  await TestRunner.NetworkAgent.setCacheDisabled(true);
+
+  await PerformanceTestRunner.startTimeline();
+  await TestRunner.navigatePromise('http://127.0.0.1:8000/devtools/tracing/resources/hello.html');
   await TestRunner.evaluateInPagePromise(`
-      var scriptUrl = "../resources/timeline-network-resource.js";
+      var scriptUrl = "timeline-network-resource.js";
 
       function performActions()
       {
@@ -19,55 +23,37 @@
       }
   `);
 
-  await TestRunner.NetworkAgent.setCacheDisabled(true);
   var requestId;
   var scriptUrl = 'timeline-network-resource.js';
 
-  await PerformanceTestRunner.invokeAsyncWithTimeline('performActions');
+  await TestRunner.callFunctionInPageAsync('performActions');
+  await PerformanceTestRunner.stopTimeline();
 
-  var model = PerformanceTestRunner.timelineModel();
-  model.mainThreadEvents().forEach(event => {
-    if (event.name === TimelineModel.TimelineModel.RecordType.ResourceSendRequest)
-      printSend(event);
-    else if (event.name === TimelineModel.TimelineModel.RecordType.ResourceReceiveResponse)
-      printReceive(event);
-    else if (event.name === TimelineModel.TimelineModel.RecordType.ResourceFinish)
-      printFinish(event);
-  });
+  const sendRequests = PerformanceTestRunner.timelineModel().mainThreadEvents().
+      filter(e => e.name === TimelineModel.TimelineModel.RecordType.ResourceSendRequest);
+  for (let event of sendRequests) {
+    printEvent(event);
+    printEventsWithId(event.args['data'].requestId);
+  }
   TestRunner.completeTest();
 
+  function printEventsWithId(id) {
+    var model = PerformanceTestRunner.timelineModel();
+    model.mainThreadEvents().forEach(event => {
+        if (event.name !== TimelineModel.TimelineModel.RecordType.ResourceReceiveResponse &&
+            event.name !== TimelineModel.TimelineModel.RecordType.ResourceFinish) {
+          return;
+        }
+        if (event.args['data'].requestId !== id)
+          return;
+        printEvent(event);
+    });
+  }
+
   function printEvent(event) {
     TestRunner.addResult('');
     PerformanceTestRunner.printTraceEventProperties(event);
     TestRunner.addResult(
         `Text details for ${event.name}: ` + Timeline.TimelineUIUtils.buildDetailsTextForTraceEvent(event));
   }
-
-  function printSend(event) {
-    printEvent(event);
-    var data = event.args['data'];
-    requestId = data.requestId;
-    if (data.url === undefined)
-      TestRunner.addResult('* No \'url\' property in record');
-    else if (data.url.indexOf(scriptUrl) === -1)
-      TestRunner.addResult('* Didn\'t find URL: ' + scriptUrl);
-  }
-
-  function printReceive(event) {
-    printEvent(event);
-    var data = event.args['data'];
-    if (requestId !== data.requestId)
-      TestRunner.addResult('Didn\'t find matching requestId: ' + requestId);
-    if (data.statusCode !== 0)
-      TestRunner.addResult('Response received status: ' + data.statusCode);
-  }
-
-  function printFinish(event) {
-    printEvent(event);
-    var data = event.args['data'];
-    if (requestId !== data.requestId)
-      TestRunner.addResult('Didn\'t find matching requestId: ' + requestId);
-    if (data.didFail)
-      TestRunner.addResult('Request failed.');
-  }
 })();
diff --git a/third_party/WebKit/LayoutTests/imagecapture/setOptions-reject.html b/third_party/WebKit/LayoutTests/imagecapture/setOptions-reject.html
index 7618488c1..28d8e34 100644
--- a/third_party/WebKit/LayoutTests/imagecapture/setOptions-reject.html
+++ b/third_party/WebKit/LayoutTests/imagecapture/setOptions-reject.html
@@ -14,7 +14,7 @@
 context.fillStyle = 'red';
 context.fillRect(0, 0, 10, 10);
 
-// This test verifies that ImageCapture.setOptions() rejects if any passed
+// This test verifies that ImageCapture.takePhoto() rejects if any passed
 // option is unsupported or outside its allowed range.
 function makePromiseTest(getOption) {
   promise_test(async function() {
@@ -26,8 +26,8 @@
     const options = getOption(mockImageCapture.state());
 
     try {
-      await capturer.setOptions(options);
-      assert_unreached('expected setOptions to reject');
+      await capturer.takePhoto(options);
+      assert_unreached('expected takePhoto to reject');
     } catch (error) {
       assert_equals(error.name, 'NotSupportedError');
     }
@@ -46,7 +46,7 @@
 for (key in optionsGenerators) {
   generate_tests(
       makePromiseTest,
-      [[ 'ImageCapture.setOptions(options) rejects with bad options, #' + key,
+      [[ 'ImageCapture.takePhoto(options) rejects with bad options, #' + key,
          optionsGenerators[key] ]]);
 }
 
diff --git a/third_party/WebKit/LayoutTests/imagecapture/setOptions.html b/third_party/WebKit/LayoutTests/imagecapture/setOptions.html
deleted file mode 100644
index b1e709d..0000000
--- a/third_party/WebKit/LayoutTests/imagecapture/setOptions.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="file:///gen/media/capture/mojo/image_capture.mojom.js"></script>
-<script src="resources/mock-imagecapture.js"></script>
-<body>
-<canvas id='canvas' width=10 height=10/>
-</body>
-<script>
-
-const fillLightModeNames = ['off', 'auto', 'flash'];
-
-// This test verifies that ImageCapture can call setOptions()s, with a mock Mojo
-// interface implementation.
-promise_test(async function() {
-  let canvas = document.getElementById('canvas');
-  let context = canvas.getContext('2d');
-  context.fillStyle = 'red';
-  context.fillRect(0, 0, 10, 10);
-  let stream = canvas.captureStream();
-
-  const optionsDict = { imageWidth : 1080,
-                        imageHeight : 100,
-                        redEyeReduction : true,
-                        fillLightMode : 'flash'
-                      };
-  let capturer = new ImageCapture(stream.getVideoTracks()[0]);
-  await capturer.setOptions(optionsDict);
-
-  assert_equals(true, mockImageCapture.options().hasWidth, 'has_width');
-  assert_equals(optionsDict.imageWidth, mockImageCapture.options().width,
-                'width');
-  assert_equals(true, mockImageCapture.options().hasHeight, 'has_height');
-  assert_equals(optionsDict.imageHeight, mockImageCapture.options().height,
-                'height');
-
-  // Depending on how mojo boolean packing in integers is arranged, this can
-  // be a number instead of a boolean, compare directly.
-  // TODO(mcasas): Revert to assert_equals() when yzshen@ has sorted it out.
-  assert_true(
-      optionsDict.redEyeReduction == mockImageCapture.options().redEyeReduction,
-      'redEyeReduction');
-
-  assert_equals(true, mockImageCapture.options().hasFillLightMode,
-                'hasFillLightMode');
-  assert_equals(optionsDict.fillLightMode,
-                fillLightModeNames[mockImageCapture.options().fillLightMode],
-                'fillLightMode');
-
-}, 'exercises ImageCapture.setOptions(options)');
-
-</script>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt
index 41bd81f..70960637 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt
@@ -429,7 +429,15 @@
       }
     ]
   },
-  "properties": [],
+  "properties": [
+    {
+      "name": "selected",
+      "value": {
+        "type": "booleanOrUndefined",
+        "value": true
+      }
+    }
+  ],
   "domNode": "option"
 }
 
diff --git a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt
deleted file mode 100644
index 7b7a96b..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS html5lib_menuitem-element.html e61b5db0435eb768ec21c1aa7355c649e7969c17
-PASS html5lib_menuitem-element.html 9c975c544402eed521499270b0e97cfa78f155b0
-PASS html5lib_menuitem-element.html d46fa11c0107d59c84778beae84f388f55bffc31
-FAIL html5lib_menuitem-element.html afcd3b1e3317ac609ddab924d836ba1e3873b80f assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menuitem>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menuitem>\n|         \"B\""
-FAIL html5lib_menuitem-element.html 95c0c6923fe609297c1592f2cb82bb9f2d0f5aed assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menu>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menu>\n|         \"B\""
-FAIL html5lib_menuitem-element.html e2772fe779cbcefb4458f169a0cd495cf7115845 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <hr>\n|     \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <hr>\n|       \"B\""
-PASS html5lib_menuitem-element.html 7a9fa28f6207f045ebb0aa49938debd0c1e7123e
-PASS html5lib_menuitem-element.html 798bb352d9f256153340661e1277e44674f1026d
-PASS html5lib_menuitem-element.html f2b5a63d94f108207a7a998216222dc24bea4850
-PASS html5lib_menuitem-element.html 778c027d06495eb361dd83baa561feb3a21ec3ea
-PASS html5lib_menuitem-element.html e4670bee2ce790e82c26a33319b7fe082fbbdaea
-PASS html5lib_menuitem-element.html 79307be24287ca5d0533dfa81b91dd826f5f5e0e
-PASS html5lib_menuitem-element.html 9b995cb730b12529e8e755e4a0b0a2e73d1dfcfa
-PASS html5lib_menuitem-element.html d4586cd7706bbb3a5b127c52c1f2861d1a3fb781
-PASS html5lib_menuitem-element.html e2adbd7bf4c7480343cfb8f69289c824be613853
-PASS html5lib_menuitem-element.html b56d35c73f38f04ad6fdf51aa88f4b70a93ddc48
-PASS html5lib_menuitem-element.html 0f95585196dae2b1b5164e8c27897699c464c35f
-PASS html5lib_menuitem-element.html 03664aa93a55daceccc26d99c0aef841d8862af5
-PASS html5lib_menuitem-element.html 6d596b9e342db2306365fbdfb7615377c5b26347
-PASS html5lib_menuitem-element.html 4b712b488be9ee047c139c1b0cd955bae990b8e5
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt
deleted file mode 100644
index 7b7a96b..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS html5lib_menuitem-element.html e61b5db0435eb768ec21c1aa7355c649e7969c17
-PASS html5lib_menuitem-element.html 9c975c544402eed521499270b0e97cfa78f155b0
-PASS html5lib_menuitem-element.html d46fa11c0107d59c84778beae84f388f55bffc31
-FAIL html5lib_menuitem-element.html afcd3b1e3317ac609ddab924d836ba1e3873b80f assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menuitem>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menuitem>\n|         \"B\""
-FAIL html5lib_menuitem-element.html 95c0c6923fe609297c1592f2cb82bb9f2d0f5aed assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menu>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menu>\n|         \"B\""
-FAIL html5lib_menuitem-element.html e2772fe779cbcefb4458f169a0cd495cf7115845 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <hr>\n|     \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <hr>\n|       \"B\""
-PASS html5lib_menuitem-element.html 7a9fa28f6207f045ebb0aa49938debd0c1e7123e
-PASS html5lib_menuitem-element.html 798bb352d9f256153340661e1277e44674f1026d
-PASS html5lib_menuitem-element.html f2b5a63d94f108207a7a998216222dc24bea4850
-PASS html5lib_menuitem-element.html 778c027d06495eb361dd83baa561feb3a21ec3ea
-PASS html5lib_menuitem-element.html e4670bee2ce790e82c26a33319b7fe082fbbdaea
-PASS html5lib_menuitem-element.html 79307be24287ca5d0533dfa81b91dd826f5f5e0e
-PASS html5lib_menuitem-element.html 9b995cb730b12529e8e755e4a0b0a2e73d1dfcfa
-PASS html5lib_menuitem-element.html d4586cd7706bbb3a5b127c52c1f2861d1a3fb781
-PASS html5lib_menuitem-element.html e2adbd7bf4c7480343cfb8f69289c824be613853
-PASS html5lib_menuitem-element.html b56d35c73f38f04ad6fdf51aa88f4b70a93ddc48
-PASS html5lib_menuitem-element.html 0f95585196dae2b1b5164e8c27897699c464c35f
-PASS html5lib_menuitem-element.html 03664aa93a55daceccc26d99c0aef841d8862af5
-PASS html5lib_menuitem-element.html 6d596b9e342db2306365fbdfb7615377c5b26347
-PASS html5lib_menuitem-element.html 4b712b488be9ee047c139c1b0cd955bae990b8e5
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt
deleted file mode 100644
index 447004f..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-This is a testharness.js-based test.
-FAIL html5lib_tests11.html ba7a66dfcf59885c08e8638d15b01df3878531e7 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewTarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewtarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\""
-FAIL html5lib_tests11.html e69c7c08a54ca868ab33b2825d998fa6c3cac90e assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewTarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewtarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\""
-FAIL html5lib_tests11.html 0e5897aafe87e460f84576c2d1d983504d12a7db assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       filterres=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewTarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       filterres=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewtarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\""
-PASS html5lib_tests11.html f71dd198831309fc9ccd66ef91cde63fda9b9bda
-PASS html5lib_tests11.html a8f7a23601363454b4a13f66aed99ec9708ae87b
-PASS html5lib_tests11.html f8f7f6c576acc9eb874acb0dce6988f0f7b6fc5f
-PASS html5lib_tests11.html fb4dc9f70129a8a045fca3a1e3acee052d0990b3
-PASS html5lib_tests11.html 8f77b846acce75edf1988ea655c79f1de4321de9
-FAIL html5lib_tests11.html 39c50f080b2b9ae9e7a1070679ab97d7b814f9ec assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altGlyph>\n|       <svg altGlyphDef>\n|       <svg altGlyphItem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphRef>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altglyph>\n|       <svg altglyphdef>\n|       <svg altglyphitem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphref>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>"
-FAIL html5lib_tests11.html 6d1fa1599f75625fe4d019abb04a064cf6ed39e8 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altGlyph>\n|       <svg altGlyphDef>\n|       <svg altGlyphItem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphRef>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altglyph>\n|       <svg altglyphdef>\n|       <svg altglyphitem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphref>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>"
-FAIL html5lib_tests11.html 791437ece7ba684e00162d1dd79dfe540e3621a7 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altGlyph>\n|       <svg altGlyphDef>\n|       <svg altGlyphItem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphRef>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altglyph>\n|       <svg altglyphdef>\n|       <svg altglyphitem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphref>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>"
-PASS html5lib_tests11.html af40d26164229c29b9be77ed6dd7dda780cba55c
-PASS html5lib_tests11.html 16e68d18f8f0fb81013fe77a30b7d396c5081e5e
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt
deleted file mode 100644
index 90886a9..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-This is a testharness.js-based test.
-PASS html5lib_webkit02.html f50b8c15847159a6d2c6ecc2bd1e4a944ba5aae6
-PASS html5lib_webkit02.html 326328ea805a2ebdde707e08567713f88a4cf8ab
-PASS html5lib_webkit02.html 05138397908cfdad69a3bfe5da5a06098320b504
-PASS html5lib_webkit02.html 2aaa2ac0d7cec6144633d8f82f3bcaafa7498cd9
-PASS html5lib_webkit02.html 4a256d7ef602c7c917c758e15981b9710f9b4130
-PASS html5lib_webkit02.html 98cea04429ddbe4ffaaa0b91fe77b8c0b1f7c1f4
-PASS html5lib_webkit02.html 209ad7d6f6c9c53cb856c7d78b2bc4a7f38abd5f
-PASS html5lib_webkit02.html cb9a86fbac96b08a6e708a2dbcd9f78539dfe9c6
-PASS html5lib_webkit02.html c46a4badc6b1ebc524e6f90ea56183310e93ab25
-PASS html5lib_webkit02.html 464eeaecc49646ff810cadad537880c9b473a262
-PASS html5lib_webkit02.html 7b4eb6981451ede406f2f4112e83a8584e7adbf5
-PASS html5lib_webkit02.html 73aed96d7cd3116e4a3e701104616c07d1ec5e0c
-PASS html5lib_webkit02.html 139a546c72bfcedf638d031f33da43f24995f688
-FAIL html5lib_webkit02.html 6e33515b4dc011dd390d433a6358bf68b786b1fd assert_equals: expected "#document\n| <html>\n|   <head>\n|   <body>\n|     <b>\n|       <em>\n|         <foo>\n|           <foo>\n|             <foo>\n|     <aside>\n|       <b>" but got "#document\n| <html>\n|   <head>\n|   <body>\n|     <b>\n|       <em>\n|         <foo>\n|           <foo>\n|             <foo>\n|     <aside>\n|       <em>\n|         <b>"
-PASS html5lib_webkit02.html b6d2377b0dd710ca812c97b2b65cb5d2e93b0e5b
-PASS html5lib_webkit02.html 21a5b2b413c4db8ed588334b9a50dea9872bbcfa
-PASS html5lib_webkit02.html 90d3f6f2dff994f63293ca46f7cd50a75cde96a6
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
similarity index 100%
copy from third_party/WebKit/LayoutTests/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
copy to third_party/WebKit/LayoutTests/platform/linux/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
rename to third_party/WebKit/LayoutTests/platform/mac/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt
deleted file mode 100644
index 7b7a96b..0000000
--- a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=uri-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS html5lib_menuitem-element.html e61b5db0435eb768ec21c1aa7355c649e7969c17
-PASS html5lib_menuitem-element.html 9c975c544402eed521499270b0e97cfa78f155b0
-PASS html5lib_menuitem-element.html d46fa11c0107d59c84778beae84f388f55bffc31
-FAIL html5lib_menuitem-element.html afcd3b1e3317ac609ddab924d836ba1e3873b80f assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menuitem>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menuitem>\n|         \"B\""
-FAIL html5lib_menuitem-element.html 95c0c6923fe609297c1592f2cb82bb9f2d0f5aed assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menu>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menu>\n|         \"B\""
-FAIL html5lib_menuitem-element.html e2772fe779cbcefb4458f169a0cd495cf7115845 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <hr>\n|     \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <hr>\n|       \"B\""
-PASS html5lib_menuitem-element.html 7a9fa28f6207f045ebb0aa49938debd0c1e7123e
-PASS html5lib_menuitem-element.html 798bb352d9f256153340661e1277e44674f1026d
-PASS html5lib_menuitem-element.html f2b5a63d94f108207a7a998216222dc24bea4850
-PASS html5lib_menuitem-element.html 778c027d06495eb361dd83baa561feb3a21ec3ea
-PASS html5lib_menuitem-element.html e4670bee2ce790e82c26a33319b7fe082fbbdaea
-PASS html5lib_menuitem-element.html 79307be24287ca5d0533dfa81b91dd826f5f5e0e
-PASS html5lib_menuitem-element.html 9b995cb730b12529e8e755e4a0b0a2e73d1dfcfa
-PASS html5lib_menuitem-element.html d4586cd7706bbb3a5b127c52c1f2861d1a3fb781
-PASS html5lib_menuitem-element.html e2adbd7bf4c7480343cfb8f69289c824be613853
-PASS html5lib_menuitem-element.html b56d35c73f38f04ad6fdf51aa88f4b70a93ddc48
-PASS html5lib_menuitem-element.html 0f95585196dae2b1b5164e8c27897699c464c35f
-PASS html5lib_menuitem-element.html 03664aa93a55daceccc26d99c0aef841d8862af5
-PASS html5lib_menuitem-element.html 6d596b9e342db2306365fbdfb7615377c5b26347
-PASS html5lib_menuitem-element.html 4b712b488be9ee047c139c1b0cd955bae990b8e5
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt
deleted file mode 100644
index 7b7a96b..0000000
--- a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_menuitem-element_run_type=write_single-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS html5lib_menuitem-element.html e61b5db0435eb768ec21c1aa7355c649e7969c17
-PASS html5lib_menuitem-element.html 9c975c544402eed521499270b0e97cfa78f155b0
-PASS html5lib_menuitem-element.html d46fa11c0107d59c84778beae84f388f55bffc31
-FAIL html5lib_menuitem-element.html afcd3b1e3317ac609ddab924d836ba1e3873b80f assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menuitem>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menuitem>\n|         \"B\""
-FAIL html5lib_menuitem-element.html 95c0c6923fe609297c1592f2cb82bb9f2d0f5aed assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <menu>\n|       \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <menu>\n|         \"B\""
-FAIL html5lib_menuitem-element.html e2772fe779cbcefb4458f169a0cd495cf7115845 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|     <hr>\n|     \"B\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <menuitem>\n|       \"A\"\n|       <hr>\n|       \"B\""
-PASS html5lib_menuitem-element.html 7a9fa28f6207f045ebb0aa49938debd0c1e7123e
-PASS html5lib_menuitem-element.html 798bb352d9f256153340661e1277e44674f1026d
-PASS html5lib_menuitem-element.html f2b5a63d94f108207a7a998216222dc24bea4850
-PASS html5lib_menuitem-element.html 778c027d06495eb361dd83baa561feb3a21ec3ea
-PASS html5lib_menuitem-element.html e4670bee2ce790e82c26a33319b7fe082fbbdaea
-PASS html5lib_menuitem-element.html 79307be24287ca5d0533dfa81b91dd826f5f5e0e
-PASS html5lib_menuitem-element.html 9b995cb730b12529e8e755e4a0b0a2e73d1dfcfa
-PASS html5lib_menuitem-element.html d4586cd7706bbb3a5b127c52c1f2861d1a3fb781
-PASS html5lib_menuitem-element.html e2adbd7bf4c7480343cfb8f69289c824be613853
-PASS html5lib_menuitem-element.html b56d35c73f38f04ad6fdf51aa88f4b70a93ddc48
-PASS html5lib_menuitem-element.html 0f95585196dae2b1b5164e8c27897699c464c35f
-PASS html5lib_menuitem-element.html 03664aa93a55daceccc26d99c0aef841d8862af5
-PASS html5lib_menuitem-element.html 6d596b9e342db2306365fbdfb7615377c5b26347
-PASS html5lib_menuitem-element.html 4b712b488be9ee047c139c1b0cd955bae990b8e5
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt
deleted file mode 100644
index 447004f..0000000
--- a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_tests11_run_type=write_single-expected.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-This is a testharness.js-based test.
-FAIL html5lib_tests11.html ba7a66dfcf59885c08e8638d15b01df3878531e7 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewTarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewtarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\""
-FAIL html5lib_tests11.html e69c7c08a54ca868ab33b2825d998fa6c3cac90e assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewTarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewtarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\""
-FAIL html5lib_tests11.html 0e5897aafe87e460f84576c2d1d983504d12a7db assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       filterres=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewTarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       attributeName=\"\"\n|       attributeType=\"\"\n|       baseFrequency=\"\"\n|       baseProfile=\"\"\n|       calcMode=\"\"\n|       clipPathUnits=\"\"\n|       diffuseConstant=\"\"\n|       edgeMode=\"\"\n|       filterUnits=\"\"\n|       filterres=\"\"\n|       glyphRef=\"\"\n|       gradientTransform=\"\"\n|       gradientUnits=\"\"\n|       kernelMatrix=\"\"\n|       kernelUnitLength=\"\"\n|       keyPoints=\"\"\n|       keySplines=\"\"\n|       keyTimes=\"\"\n|       lengthAdjust=\"\"\n|       limitingConeAngle=\"\"\n|       markerHeight=\"\"\n|       markerUnits=\"\"\n|       markerWidth=\"\"\n|       maskContentUnits=\"\"\n|       maskUnits=\"\"\n|       numOctaves=\"\"\n|       pathLength=\"\"\n|       patternContentUnits=\"\"\n|       patternTransform=\"\"\n|       patternUnits=\"\"\n|       pointsAtX=\"\"\n|       pointsAtY=\"\"\n|       pointsAtZ=\"\"\n|       preserveAlpha=\"\"\n|       preserveAspectRatio=\"\"\n|       primitiveUnits=\"\"\n|       refX=\"\"\n|       refY=\"\"\n|       repeatCount=\"\"\n|       repeatDur=\"\"\n|       requiredExtensions=\"\"\n|       requiredFeatures=\"\"\n|       specularConstant=\"\"\n|       specularExponent=\"\"\n|       spreadMethod=\"\"\n|       startOffset=\"\"\n|       stdDeviation=\"\"\n|       stitchTiles=\"\"\n|       surfaceScale=\"\"\n|       systemLanguage=\"\"\n|       tableValues=\"\"\n|       targetX=\"\"\n|       targetY=\"\"\n|       textLength=\"\"\n|       viewBox=\"\"\n|       viewtarget=\"\"\n|       xChannelSelector=\"\"\n|       yChannelSelector=\"\"\n|       zoomAndPan=\"\""
-PASS html5lib_tests11.html f71dd198831309fc9ccd66ef91cde63fda9b9bda
-PASS html5lib_tests11.html a8f7a23601363454b4a13f66aed99ec9708ae87b
-PASS html5lib_tests11.html f8f7f6c576acc9eb874acb0dce6988f0f7b6fc5f
-PASS html5lib_tests11.html fb4dc9f70129a8a045fca3a1e3acee052d0990b3
-PASS html5lib_tests11.html 8f77b846acce75edf1988ea655c79f1de4321de9
-FAIL html5lib_tests11.html 39c50f080b2b9ae9e7a1070679ab97d7b814f9ec assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altGlyph>\n|       <svg altGlyphDef>\n|       <svg altGlyphItem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphRef>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altglyph>\n|       <svg altglyphdef>\n|       <svg altglyphitem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphref>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>"
-FAIL html5lib_tests11.html 6d1fa1599f75625fe4d019abb04a064cf6ed39e8 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altGlyph>\n|       <svg altGlyphDef>\n|       <svg altGlyphItem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphRef>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altglyph>\n|       <svg altglyphdef>\n|       <svg altglyphitem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphref>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>"
-FAIL html5lib_tests11.html 791437ece7ba684e00162d1dd79dfe540e3621a7 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altGlyph>\n|       <svg altGlyphDef>\n|       <svg altGlyphItem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphRef>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <svg svg>\n|       <svg altglyph>\n|       <svg altglyphdef>\n|       <svg altglyphitem>\n|       <svg animateColor>\n|       <svg animateMotion>\n|       <svg animateTransform>\n|       <svg clipPath>\n|       <svg feBlend>\n|       <svg feColorMatrix>\n|       <svg feComponentTransfer>\n|       <svg feComposite>\n|       <svg feConvolveMatrix>\n|       <svg feDiffuseLighting>\n|       <svg feDisplacementMap>\n|       <svg feDistantLight>\n|       <svg feFlood>\n|       <svg feFuncA>\n|       <svg feFuncB>\n|       <svg feFuncG>\n|       <svg feFuncR>\n|       <svg feGaussianBlur>\n|       <svg feImage>\n|       <svg feMerge>\n|       <svg feMergeNode>\n|       <svg feMorphology>\n|       <svg feOffset>\n|       <svg fePointLight>\n|       <svg feSpecularLighting>\n|       <svg feSpotLight>\n|       <svg feTile>\n|       <svg feTurbulence>\n|       <svg foreignObject>\n|       <svg glyphref>\n|       <svg linearGradient>\n|       <svg radialGradient>\n|       <svg textPath>"
-PASS html5lib_tests11.html af40d26164229c29b9be77ed6dd7dda780cba55c
-PASS html5lib_tests11.html 16e68d18f8f0fb81013fe77a30b7d396c5081e5e
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt
deleted file mode 100644
index 90886a9..0000000
--- a/third_party/WebKit/LayoutTests/platform/win7/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-This is a testharness.js-based test.
-PASS html5lib_webkit02.html f50b8c15847159a6d2c6ecc2bd1e4a944ba5aae6
-PASS html5lib_webkit02.html 326328ea805a2ebdde707e08567713f88a4cf8ab
-PASS html5lib_webkit02.html 05138397908cfdad69a3bfe5da5a06098320b504
-PASS html5lib_webkit02.html 2aaa2ac0d7cec6144633d8f82f3bcaafa7498cd9
-PASS html5lib_webkit02.html 4a256d7ef602c7c917c758e15981b9710f9b4130
-PASS html5lib_webkit02.html 98cea04429ddbe4ffaaa0b91fe77b8c0b1f7c1f4
-PASS html5lib_webkit02.html 209ad7d6f6c9c53cb856c7d78b2bc4a7f38abd5f
-PASS html5lib_webkit02.html cb9a86fbac96b08a6e708a2dbcd9f78539dfe9c6
-PASS html5lib_webkit02.html c46a4badc6b1ebc524e6f90ea56183310e93ab25
-PASS html5lib_webkit02.html 464eeaecc49646ff810cadad537880c9b473a262
-PASS html5lib_webkit02.html 7b4eb6981451ede406f2f4112e83a8584e7adbf5
-PASS html5lib_webkit02.html 73aed96d7cd3116e4a3e701104616c07d1ec5e0c
-PASS html5lib_webkit02.html 139a546c72bfcedf638d031f33da43f24995f688
-FAIL html5lib_webkit02.html 6e33515b4dc011dd390d433a6358bf68b786b1fd assert_equals: expected "#document\n| <html>\n|   <head>\n|   <body>\n|     <b>\n|       <em>\n|         <foo>\n|           <foo>\n|             <foo>\n|     <aside>\n|       <b>" but got "#document\n| <html>\n|   <head>\n|   <body>\n|     <b>\n|       <em>\n|         <foo>\n|           <foo>\n|             <foo>\n|     <aside>\n|       <em>\n|         <b>"
-PASS html5lib_webkit02.html b6d2377b0dd710ca812c97b2b65cb5d2e93b0e5b
-PASS html5lib_webkit02.html 21a5b2b413c4db8ed588334b9a50dea9872bbcfa
-PASS html5lib_webkit02.html 90d3f6f2dff994f63293ca46f7cd50a75cde96a6
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
similarity index 100%
copy from third_party/WebKit/LayoutTests/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
copy to third_party/WebKit/LayoutTests/platform/win7/external/wpt/webauthn/createcredential-badargs-rp.https-expected.txt
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 5bdac13..8341dd68 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -3267,7 +3267,6 @@
     method getPhotoCapabilities
     method getPhotoSettings
     method grabFrame
-    method setOptions
     method takePhoto
 interface ImageData
     attribute @@toStringTag
diff --git a/third_party/WebKit/LayoutTests/webauth/idl.html b/third_party/WebKit/LayoutTests/webauth/idl.html
index 668a2176..2f94976 100644
--- a/third_party/WebKit/LayoutTests/webauth/idl.html
+++ b/third_party/WebKit/LayoutTests/webauth/idl.html
@@ -32,7 +32,7 @@
 interface AuthenticatorAssertionResponse : AuthenticatorResponse {
     [SameObject] readonly attribute ArrayBuffer      authenticatorData;
     [SameObject] readonly attribute ArrayBuffer      signature;
-    [SameObject] readonly attribute ArrayBuffer      userHandle;
+    [SameObject] readonly attribute ArrayBuffer?     userHandle;
 };
 
 dictionary PublicKeyCredentialParameters {
@@ -44,12 +44,12 @@
     required PublicKeyCredentialRpEntity rp;
     required PublicKeyCredentialUserEntity user;
 
-    required BufferSource                         challenge;
+    required BufferSource                            challenge;
     required sequence<PublicKeyCredentialParameters> pubKeyCredParams;
 
-    unsigned long                        timeout;
-    sequence<PublicKeyCredentialDescriptor> excludeCredentials = [];
-    AuthenticatorSelectionCriteria       authenticatorSelection;
+    unsigned long                                    timeout;
+    sequence<PublicKeyCredentialDescriptor>          excludeCredentials = [];
+    AuthenticatorSelectionCriteria                   authenticatorSelection;
 };
 
 dictionary PublicKeyCredentialEntity {
@@ -63,13 +63,13 @@
 
 dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity {
     required BufferSource   id;
-    required DOMString displayName;
+    required DOMString      displayName;
 };
 
 dictionary AuthenticatorSelectionCriteria {
-    Attachment    attachment;
-    boolean       requireResidentKey = false;
-    boolean       requireUserVerification = false;
+    AuthenticatorAttachment    authenticatorAttachment;
+    boolean                    requireResidentKey = false;
+    boolean                    requireUserVerification = false;
 };
 
 enum AuthenticatorAttachment {
@@ -78,9 +78,9 @@
 };
 
 dictionary PublicKeyCredentialRequestOptions {
-    required BufferSource                challenge;
-    unsigned long                        timeout;
-    USVString                            rpId;
+    required BufferSource                   challenge;
+    unsigned long                           timeout;
+    USVString                               rpId;
     sequence<PublicKeyCredentialDescriptor> allowCredentials = [];
 };
 
@@ -88,7 +88,6 @@
     required DOMString           type;
     required DOMString           challenge;
     required DOMString           origin;
-    required DOMString           hashAlgorithm;
     DOMString                    tokenBindingId;
 };
 
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 0c2b5a2..58dd784 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -3897,7 +3897,6 @@
     method getPhotoCapabilities
     method getPhotoSettings
     method grabFrame
-    method setOptions
     method takePhoto
 interface ImageData
     attribute @@toStringTag
diff --git a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
index 6b3d0e7..63e7e71 100644
--- a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
+++ b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
@@ -146,10 +146,6 @@
       return ToV8(impl->IdbCursorWithValue(), creation_context, isolate);
     case IDBAny::kIDBDatabaseType:
       return ToV8(impl->IdbDatabase(), creation_context, isolate);
-    case IDBAny::kIDBIndexType:
-      return ToV8(impl->IdbIndex(), creation_context, isolate);
-    case IDBAny::kIDBObjectStoreType:
-      return ToV8(impl->IdbObjectStore(), creation_context, isolate);
     case IDBAny::kIDBValueType:
       return DeserializeIDBValue(isolate, creation_context, impl->Value());
     case IDBAny::kIDBValueArrayType:
diff --git a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp
index 7765fd61..364504f 100644
--- a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp
@@ -66,23 +66,16 @@
 
 CSSImageGeneratorValue::~CSSImageGeneratorValue() = default;
 
-void CSSImageGeneratorValue::AddClient(const ImageResourceObserver* client,
-                                       const LayoutSize& size) {
+void CSSImageGeneratorValue::AddClient(const ImageResourceObserver* client) {
   DCHECK(client);
   if (clients_.IsEmpty()) {
     DCHECK(!keep_alive_);
     keep_alive_ = this;
   }
 
-  cached_images_.AddSize(size);
-
-  ClientSizeCountMap::iterator it = clients_.find(client);
-  if (it == clients_.end()) {
-    clients_.insert(client, SizeAndCount(size, 1));
-  } else {
-    SizeAndCount& size_count = it->value;
-    ++size_count.count;
-  }
+  SizeAndCount& size_count =
+      clients_.insert(client, SizeAndCount()).stored_value->value;
+  size_count.count++;
 }
 
 CSSImageGeneratorValue* CSSImageGeneratorValue::ValueWithURLsMadeAbsolute() {
diff --git a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h
index d82da84..62e3205 100644
--- a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h
+++ b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h
@@ -59,8 +59,7 @@
 
 struct SizeAndCount {
   DISALLOW_NEW();
-  SizeAndCount(LayoutSize new_size = LayoutSize(), int new_count = 0)
-      : size(new_size), count(new_count) {}
+  SizeAndCount() : size(), count(0) {}
 
   LayoutSize size;
   int count;
@@ -72,7 +71,7 @@
  public:
   ~CSSImageGeneratorValue();
 
-  void AddClient(const ImageResourceObserver*, const LayoutSize&);
+  void AddClient(const ImageResourceObserver*);
   void RemoveClient(const ImageResourceObserver*);
   // The |container_size| is the container size with subpixel snapping.
   scoped_refptr<Image> GetImage(const ImageResourceObserver&,
diff --git a/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp b/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp
index e5499cd..72a6ac03 100644
--- a/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp
+++ b/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp
@@ -37,7 +37,9 @@
 #include "core/editing/VisibleUnits.h"
 #include "core/layout/LayoutBlock.h"
 #include "core/layout/LayoutText.h"
+#include "core/layout/api/LineLayoutBlockFlow.h"
 #include "core/layout/line/InlineTextBox.h"
+#include "core/layout/line/RootInlineBox.h"
 
 namespace blink {
 
@@ -151,11 +153,14 @@
   return InlineBoxPosition(result_box, result_box->CaretLeftmostOffset());
 }
 
+// TODO(editing-dev): We should get rid of |TextDirection| parameter.
 InlineBoxPosition AdjustInlineBoxPositionForTextDirection(
     InlineBox* inline_box,
     int caret_offset,
     UnicodeBidi unicode_bidi,
-    TextDirection primary_direction) {
+    TextDirection) {
+  const TextDirection primary_direction =
+      inline_box->Root().Block().Style()->Direction();
   if (inline_box->Direction() == primary_direction)
     return AdjustInlineBoxPositionForPrimaryDirection(inline_box, caret_offset);
 
diff --git a/third_party/WebKit/Source/core/editing/InlineBoxPosition.h b/third_party/WebKit/Source/core/editing/InlineBoxPosition.h
index b237cdd1..0bb2594a 100644
--- a/third_party/WebKit/Source/core/editing/InlineBoxPosition.h
+++ b/third_party/WebKit/Source/core/editing/InlineBoxPosition.h
@@ -67,13 +67,7 @@
 CORE_EXPORT InlineBoxPosition
 ComputeInlineBoxPosition(const PositionWithAffinity&);
 CORE_EXPORT InlineBoxPosition
-ComputeInlineBoxPosition(const PositionWithAffinity&,
-                         TextDirection primary_direction);
-CORE_EXPORT InlineBoxPosition
 ComputeInlineBoxPosition(const PositionInFlatTreeWithAffinity&);
-CORE_EXPORT InlineBoxPosition
-ComputeInlineBoxPosition(const PositionInFlatTreeWithAffinity&,
-                         TextDirection primary_direction);
 CORE_EXPORT InlineBoxPosition ComputeInlineBoxPosition(const VisiblePosition&);
 
 PositionWithAffinity ComputeInlineAdjustedPosition(const PositionWithAffinity&);
diff --git a/third_party/WebKit/Source/core/editing/SelectionModifierCharacter.cpp b/third_party/WebKit/Source/core/editing/SelectionModifierCharacter.cpp
index d56b7ae..a2d3a81 100644
--- a/third_party/WebKit/Source/core/editing/SelectionModifierCharacter.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionModifierCharacter.cpp
@@ -249,7 +249,7 @@
 
   while (true) {
     InlineBoxPosition box_position = ComputeInlineBoxPosition(
-        PositionWithAffinityTemplate<Strategy>(p, affinity), primary_direction);
+        PositionWithAffinityTemplate<Strategy>(p, affinity));
     const InlineBox* box = box_position.inline_box;
     int offset = box_position.offset_in_box;
     if (!box) {
@@ -297,8 +297,7 @@
 
           const InlineBox* box_on_left =
               ComputeInlineBoxPosition(PositionWithAffinityTemplate<Strategy>(
-                                           position_on_left, affinity),
-                                       primary_direction)
+                                           position_on_left, affinity))
                   .inline_box;
           if (box_on_left && box_on_left->Root() == box->Root())
             return PositionTemplate<Strategy>();
diff --git a/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.cpp b/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.cpp
index 13bf2fee..af54be1b 100644
--- a/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.cpp
@@ -1028,17 +1028,18 @@
 
   LayoutBox* box = ToLayoutBox(owner_element->GetLayoutObject());
 
-  // Note: FrameRect() for this plugin is equal to contentBoxRect, mapped to the
-  // containing view space, and rounded off.
-  // See LayoutEmbeddedContent.cpp::updateGeometryInternal. To remove the lossy
-  // effect of rounding off, use contentBoxRect directly.
+  // Note: FrameRect() for this plugin is equal to contentBoxRect, mapped to
+  // the containing view space, and rounded off.  See
+  // LayoutEmbeddedContent::UpdateGeometry. To remove the lossy effect of
+  // rounding off, use contentBoxRect directly.
   LayoutRect unclipped_absolute_rect(box->ContentBoxRect());
   box->MapToVisualRectInAncestorSpace(root_view, unclipped_absolute_rect);
+  unclipped_absolute_rect =
+      box->View()->GetFrameView()->DocumentToAbsolute(unclipped_absolute_rect);
 
   // The frameRect is already in absolute space of the local frame to the
-  // plugin.
+  // plugin so map it up to the root frame.
   window_rect = frame_rect_;
-  // Map up to the root frame.
   LayoutRect layout_window_rect =
       LayoutRect(element_->GetDocument()
                      .View()
@@ -1046,9 +1047,12 @@
                      ->LocalToAbsoluteQuad(FloatQuad(FloatRect(frame_rect_)),
                                            kTraverseDocumentBoundaries)
                      .BoundingBox());
+
   // Finally, adjust for scrolling of the root frame, which the above does not
-  // take into account.
-  layout_window_rect.MoveBy(-root_view->ViewRect().Location());
+  // take into account (until root-layer-scrolling ships at which point we can
+  // remove the AbsoluteToRootFrame).
+  layout_window_rect =
+      root_view->GetFrameView()->AbsoluteToRootFrame(layout_window_rect);
   window_rect = PixelSnappedIntRect(layout_window_rect);
 
   LayoutRect layout_clipped_local_rect = unclipped_absolute_rect;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
index 2a39742..286bf14 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
@@ -3672,6 +3672,15 @@
   return ConvertToRootFrame(point_in_frame);
 }
 
+LayoutRect LocalFrameView::AbsoluteToRootFrame(
+    const LayoutRect& layout_rect) const {
+  LayoutPoint point_in_frame(layout_rect.Location());
+  // With RLS turned on, this will be a no-op.
+  point_in_frame -= LayoutSize(ScrollOffsetInt());
+  LayoutRect rect_in_root_frame(point_in_frame, layout_rect.Size());
+  return rect_in_root_frame;
+}
+
 IntRect LocalFrameView::RootFrameToDocument(const IntRect& rect_in_root_frame) {
   IntPoint offset =
       FlooredIntPoint(RootFrameToDocument(rect_in_root_frame.Location()));
@@ -3697,6 +3706,19 @@
   return FloatPoint(DocumentToAbsolute(DoublePoint(point_in_document)));
 }
 
+LayoutPoint LocalFrameView::DocumentToAbsolute(
+    const LayoutPoint& point_in_document) const {
+  return point_in_document -
+         LayoutSize(GetLayoutView()->GetScrollableArea()->GetScrollOffset());
+}
+
+LayoutRect LocalFrameView::DocumentToAbsolute(
+    const LayoutRect& rect_in_document) const {
+  // With RLS turned off, this will be a no-op.
+  return LayoutRect(DocumentToAbsolute(rect_in_document.Location()),
+                    rect_in_document.Size());
+}
+
 IntRect LocalFrameView::ConvertToContainingEmbeddedContentView(
     const IntRect& local_rect) const {
   if (LocalFrameView* parent = ParentFrameView()) {
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.h b/third_party/WebKit/Source/core/frame/LocalFrameView.h
index 67f00b2..2b16e0f 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.h
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.h
@@ -696,10 +696,13 @@
   // coordinates". https://crbug.com/417782.
   IntRect AbsoluteToRootFrame(const IntRect&) const;
   IntPoint AbsoluteToRootFrame(const IntPoint&) const;
+  LayoutRect AbsoluteToRootFrame(const LayoutRect&) const;
   IntRect RootFrameToDocument(const IntRect&);
   FloatPoint RootFrameToDocument(const FloatPoint&);
   DoublePoint DocumentToAbsolute(const DoublePoint&) const;
   FloatPoint DocumentToAbsolute(const FloatPoint&) const;
+  LayoutPoint DocumentToAbsolute(const LayoutPoint&) const;
+  LayoutRect DocumentToAbsolute(const LayoutRect&) const;
 
   // Handles painting of the contents of the view as well as the scrollbars.
   void Paint(GraphicsContext&,
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
index 335d686..00298cb 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
@@ -42,6 +42,7 @@
 #include "platform/wtf/DynamicAnnotations.h"
 #include "platform/wtf/Vector.h"
 #include "platform/wtf/text/TextPosition.h"
+#include "services/network/public/interfaces/request_context_frame_type.mojom-shared.h"
 #include "v8/include/v8-profiler.h"
 #include "v8/include/v8.h"
 
@@ -687,6 +688,8 @@
     LocalFrame* frame,
     const ResourceRequest& request) {
   String request_id = IdentifiersFactory::RequestId(loader, identifier);
+  if (request.GetFrameType() != network::mojom::RequestContextFrameType::kNone)
+    request_id = IdentifiersFactory::LoaderId(loader);
 
   std::unique_ptr<TracedValue> value = TracedValue::Create();
   value->SetString("requestId", request_id);
diff --git a/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp b/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp
index 49dc0e7..98e523b9 100644
--- a/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp
+++ b/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp
@@ -484,8 +484,15 @@
       if (i > 0 && span.StartLine() <= flexible_sized_tracks_index[i - 1])
         continue;
 
-      flex_fraction = std::max(
-          flex_fraction, FindFrUnitSize(span, MaxContentForChild(*grid_item)));
+      // Removing gutters from the max-content contribution of the item,
+      // so they are not taken into account in FindFrUnitSize().
+      LayoutUnit left_over_space =
+          MaxContentForChild(*grid_item) -
+          GetLayoutGrid()->GuttersSize(algorithm_.GetGrid(), direction,
+                                       span.StartLine(), span.IntegerSpan(),
+                                       AvailableSpace());
+      flex_fraction =
+          std::max(flex_fraction, FindFrUnitSize(span, left_over_space));
     }
   }
 
@@ -1255,6 +1262,8 @@
       flex_factor_sum += track_size.MaxTrackBreadth().Flex();
     }
   }
+  // We don't remove the gutters from left_over_space here, because that was
+  // already done before.
 
   // The function is not called if we don't have <flex> grid tracks.
   DCHECK(!flexible_tracks_indexes.IsEmpty());
diff --git a/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.cpp b/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.cpp
index 5ffba0b..52366acc 100644
--- a/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.cpp
@@ -71,33 +71,9 @@
          box_model_ == paint_info.PaintContainer();
 }
 
-void BoxModelObjectPainter::PaintFillLayerTextFillBox(
-    GraphicsContext& context,
-    const BoxPainterBase::FillLayerInfo& info,
-    Image* image,
-    SkBlendMode composite_op,
-    const BackgroundImageGeometry& geometry,
-    const LayoutRect& rect,
-    LayoutRect scrolled_paint_rect) {
-  // First figure out how big the mask has to be. It should be no bigger
-  // than what we need to actually render, so we should intersect the dirty
-  // rect with the border box of the background.
-  IntRect mask_rect = PixelSnappedIntRect(rect);
-
-  // We draw the background into a separate layer, to be later masked with
-  // yet another layer holding the text content.
-  GraphicsContextStateSaver background_clip_state_saver(context, false);
-  background_clip_state_saver.Save();
-  context.Clip(mask_rect);
-  context.BeginLayer(1, composite_op);
-
-  PaintFillLayerBackground(context, info, image, SkBlendMode::kSrcOver,
-                           geometry, scrolled_paint_rect);
-
-  // Create the text mask layer and draw the text into the mask. We do this by
-  // painting using a special paint phase that signals to InlineTextBoxes that
-  // they should just add their contents to the clip.
-  context.BeginLayer(1, SkBlendMode::kDstIn);
+void BoxModelObjectPainter::PaintTextClipMask(GraphicsContext& context,
+                                              const IntRect& mask_rect,
+                                              const LayoutPoint& paint_offset) {
   PaintInfo paint_info(context, mask_rect, PaintPhase::kTextClip,
                        kGlobalPaintNormalPhase, 0);
   if (flow_box_) {
@@ -107,19 +83,16 @@
       local_offset -= LogicalOffsetOnLine(*flow_box_);
     }
     const RootInlineBox& root = flow_box_->Root();
-    flow_box_->Paint(paint_info, scrolled_paint_rect.Location() - local_offset,
-                     root.LineTop(), root.LineBottom());
+    flow_box_->Paint(paint_info, paint_offset - local_offset, root.LineTop(),
+                     root.LineBottom());
   } else {
     // FIXME: this should only have an effect for the line box list within
     // |box_model_|. Change this to create a LineBoxListPainter directly.
     LayoutSize local_offset = box_model_.IsBox()
                                   ? ToLayoutBox(&box_model_)->LocationOffset()
                                   : LayoutSize();
-    box_model_.Paint(paint_info, scrolled_paint_rect.Location() - local_offset);
+    box_model_.Paint(paint_info, paint_offset - local_offset);
   }
-
-  context.EndLayer();  // Text mask layer.
-  context.EndLayer();  // Background layer.
 }
 
 FloatRoundedRect BoxModelObjectPainter::GetBackgroundRoundedRect(
diff --git a/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.h b/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.h
index a0b832b..223b3dc 100644
--- a/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.h
+++ b/third_party/WebKit/Source/core/paint/BoxModelObjectPainter.h
@@ -17,7 +17,6 @@
 class LayoutRect;
 struct PaintInfo;
 class LayoutBoxModelObject;
-class Image;
 
 // BoxModelObjectPainter is a class that can paint either a LayoutBox or a
 // LayoutInline and allows code sharing between block and inline block painting.
@@ -39,13 +38,9 @@
       const FillLayer&,
       BackgroundBleedAvoidance) const override;
 
-  void PaintFillLayerTextFillBox(GraphicsContext&,
-                                 const BoxPainterBase::FillLayerInfo&,
-                                 Image*,
-                                 SkBlendMode composite_op,
-                                 const BackgroundImageGeometry&,
-                                 const LayoutRect&,
-                                 LayoutRect scrolled_paint_rect) override;
+  void PaintTextClipMask(GraphicsContext&,
+                         const IntRect& mask_rect,
+                         const LayoutPoint& paint_offset) override;
   LayoutRect AdjustForScrolledContent(const PaintInfo&,
                                       const BoxPainterBase::FillLayerInfo&,
                                       const LayoutRect&) override;
diff --git a/third_party/WebKit/Source/core/paint/BoxPainterBase.cpp b/third_party/WebKit/Source/core/paint/BoxPainterBase.cpp
index e16fd0ac..47c048845 100644
--- a/third_party/WebKit/Source/core/paint/BoxPainterBase.cpp
+++ b/third_party/WebKit/Source/core/paint/BoxPainterBase.cpp
@@ -608,6 +608,40 @@
                            scrolled_paint_rect);
 }
 
+void BoxPainterBase::PaintFillLayerTextFillBox(
+    GraphicsContext& context,
+    const BoxPainterBase::FillLayerInfo& info,
+    Image* image,
+    SkBlendMode composite_op,
+    const BackgroundImageGeometry& geometry,
+    const LayoutRect& rect,
+    const LayoutRect& scrolled_paint_rect) {
+  // First figure out how big the mask has to be. It should be no bigger
+  // than what we need to actually render, so we should intersect the dirty
+  // rect with the border box of the background.
+  IntRect mask_rect = PixelSnappedIntRect(rect);
+
+  // We draw the background into a separate layer, to be later masked with
+  // yet another layer holding the text content.
+  GraphicsContextStateSaver background_clip_state_saver(context, false);
+  background_clip_state_saver.Save();
+  context.Clip(mask_rect);
+  context.BeginLayer(1, composite_op);
+
+  PaintFillLayerBackground(context, info, image, SkBlendMode::kSrcOver,
+                           geometry, scrolled_paint_rect);
+
+  // Create the text mask layer and draw the text into the mask. We do this by
+  // painting using a special paint phase that signals to InlineTextBoxes that
+  // they should just add their contents to the clip.
+  context.BeginLayer(1, SkBlendMode::kDstIn);
+
+  PaintTextClipMask(context, mask_rect, scrolled_paint_rect.Location());
+
+  context.EndLayer();  // Text mask layer.
+  context.EndLayer();  // Background layer.
+}
+
 FloatRoundedRect BoxPainterBase::RoundedBorderRectForClip(
     const BoxPainterBase::FillLayerInfo& info,
     const FillLayer& bg_layer,
diff --git a/third_party/WebKit/Source/core/paint/BoxPainterBase.h b/third_party/WebKit/Source/core/paint/BoxPainterBase.h
index 9d0cfbc..46386d3 100644
--- a/third_party/WebKit/Source/core/paint/BoxPainterBase.h
+++ b/third_party/WebKit/Source/core/paint/BoxPainterBase.h
@@ -151,13 +151,16 @@
   LayoutRectOutsets BorderOutsets(const FillLayerInfo&) const;
   LayoutRectOutsets PaddingOutsets(const FillLayerInfo&) const;
 
-  virtual void PaintFillLayerTextFillBox(GraphicsContext&,
-                                         const FillLayerInfo&,
-                                         Image*,
-                                         SkBlendMode composite_op,
-                                         const BackgroundImageGeometry&,
-                                         const LayoutRect&,
-                                         LayoutRect scrolled_paint_rect) = 0;
+  void PaintFillLayerTextFillBox(GraphicsContext&,
+                                 const FillLayerInfo&,
+                                 Image*,
+                                 SkBlendMode composite_op,
+                                 const BackgroundImageGeometry&,
+                                 const LayoutRect&,
+                                 const LayoutRect& scrolled_paint_rect);
+  virtual void PaintTextClipMask(GraphicsContext&,
+                                 const IntRect& mask_rect,
+                                 const LayoutPoint& paint_offset) = 0;
   virtual LayoutRect AdjustForScrolledContent(const PaintInfo&,
                                               const FillLayerInfo&,
                                               const LayoutRect&) = 0;
diff --git a/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc b/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc
index 590bfa8a..033da33 100644
--- a/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.cc
@@ -537,40 +537,13 @@
   return paint_info.GetCullRect().IntersectsCullRect(overflow_rect);
 }
 
-void NGBoxFragmentPainter::PaintFillLayerTextFillBox(
-    GraphicsContext& context,
-    const BoxPainterBase::FillLayerInfo& info,
-    Image* image,
-    SkBlendMode composite_op,
-    const BackgroundImageGeometry& geometry,
-    const LayoutRect& rect,
-    LayoutRect scrolled_paint_rect) {
-  // First figure out how big the mask has to be. It should be no bigger
-  // than what we need to actually render, so we should intersect the dirty
-  // rect with the border box of the background.
-  IntRect mask_rect = PixelSnappedIntRect(rect);
-
-  // We draw the background into a separate layer, to be later masked with
-  // yet another layer holding the text content.
-  GraphicsContextStateSaver background_clip_state_saver(context, false);
-  background_clip_state_saver.Save();
-  context.Clip(mask_rect);
-  context.BeginLayer();
-
-  PaintFillLayerBackground(context, info, image, composite_op, geometry,
-                           scrolled_paint_rect);
-
-  // Create the text mask layer and draw the text into the mask. We do this by
-  // painting using a special paint phase that signals to InlineTextBoxes that
-  // they should just add their contents to the clip.
-  context.BeginLayer(1, SkBlendMode::kDstIn);
+void NGBoxFragmentPainter::PaintTextClipMask(GraphicsContext& context,
+                                             const IntRect& mask_rect,
+                                             const LayoutPoint& paint_offset) {
   PaintInfo paint_info(context, mask_rect, PaintPhase::kTextClip,
                        kGlobalPaintNormalPhase, 0);
 
   // TODO(eae): Paint text child fragments.
-
-  context.EndLayer();  // Text mask layer.
-  context.EndLayer();  // Background layer.
 }
 
 LayoutRect NGBoxFragmentPainter::AdjustForScrolledContent(
diff --git a/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.h b/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.h
index 8f3441e..8db155b0 100644
--- a/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.h
+++ b/third_party/WebKit/Source/core/paint/ng/ng_box_fragment_painter.h
@@ -19,7 +19,6 @@
 class HitTestLocation;
 class HitTestRequest;
 class HitTestResult;
-class Image;
 class LayoutRect;
 class NGPaintFragment;
 class NGPhysicalFragment;
@@ -50,13 +49,9 @@
       const FillLayer&,
       BackgroundBleedAvoidance) const override;
 
-  void PaintFillLayerTextFillBox(GraphicsContext&,
-                                 const BoxPainterBase::FillLayerInfo&,
-                                 Image*,
-                                 SkBlendMode composite_op,
-                                 const BackgroundImageGeometry&,
-                                 const LayoutRect&,
-                                 LayoutRect scrolled_paint_rect) override;
+  void PaintTextClipMask(GraphicsContext&,
+                         const IntRect& mask_rect,
+                         const LayoutPoint& paint_offset) override;
   LayoutRect AdjustForScrolledContent(const PaintInfo&,
                                       const BoxPainterBase::FillLayerInfo&,
                                       const LayoutRect&) override;
diff --git a/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp b/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp
index 37c27fff..1f8bfb3 100644
--- a/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp
+++ b/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp
@@ -61,7 +61,7 @@
 }
 
 void StyleGeneratedImage::AddClient(ImageResourceObserver* observer) {
-  image_generator_value_->AddClient(observer, LayoutSize());
+  image_generator_value_->AddClient(observer);
 }
 
 void StyleGeneratedImage::RemoveClient(ImageResourceObserver* observer) {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXARIAGridCell.h b/third_party/WebKit/Source/modules/accessibility/AXARIAGridCell.h
index b9344d8..170c41a 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXARIAGridCell.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXARIAGridCell.h
@@ -51,15 +51,15 @@
       std::pair<unsigned, unsigned>& column_range) const override;
   AccessibilityRole ScanToDecideHeaderRole() final;
   AXRestriction Restriction() const final;
-  bool CanSetSelectedAttribute() const final {
-    return Restriction() != kDisabled;
-  }
 
  protected:
   bool IsAriaColumnHeader() const;
   bool IsAriaRowHeader() const;
   AXObject* ParentTable() const override;
   AXObject* ParentRow() const override;
+  bool CanSetSelectedAttribute() const final {
+    return Restriction() != kDisabled;
+  }
 
   DISALLOW_COPY_AND_ASSIGN(AXARIAGridCell);
 };
diff --git a/third_party/WebKit/Source/modules/accessibility/AXARIAGridRow.h b/third_party/WebKit/Source/modules/accessibility/AXARIAGridRow.h
index 5f0487d..7febf74 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXARIAGridRow.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXARIAGridRow.h
@@ -48,9 +48,6 @@
   ~AXARIAGridRow() override;
 
   void HeaderObjectsForRow(AXObjectVector&) override;
-  bool CanSetSelectedAttribute() const final {
-    return Restriction() != kDisabled;
-  }
   AXObject* ParentTable() const final;
 
   void AddChildren() final;
@@ -63,6 +60,11 @@
     return cells_;
   };
 
+ protected:
+  bool CanSetSelectedAttribute() const final {
+    return Restriction() != kDisabled;
+  }
+
  private:
   bool IsARIARow() const final;
   void ComputeCells(AXObjectVector from_child_list);
diff --git a/third_party/WebKit/Source/modules/accessibility/AXEnums.h b/third_party/WebKit/Source/modules/accessibility/AXEnums.h
index 66f83e2bd..11e4a45 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXEnums.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXEnums.h
@@ -196,6 +196,12 @@
   kExpandedExpanded,
 };
 
+enum AccessibilitySelectedState {
+  kSelectedStateUndefined = 0,
+  kSelectedStateFalse,
+  kSelectedStateTrue,
+};
+
 enum AriaCurrentState {
   kAriaCurrentStateUndefined = 0,
   kAriaCurrentStateFalse,
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
index ef30667..c272a4b7 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
@@ -431,29 +431,31 @@
   return false;
 }
 
-bool AXLayoutObject::IsSelected() const {
+AccessibilitySelectedState AXLayoutObject::IsSelected() const {
   if (!GetLayoutObject() || !GetNode() || !CanSetSelectedAttribute())
-    return false;
+    return kSelectedStateUndefined;
 
   // aria-selected overrides automatic behaviors
   bool is_selected;
   if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kSelected, is_selected))
-    return is_selected;
+    return is_selected ? kSelectedStateTrue : kSelectedStateFalse;
 
   // Tab item with focus in the associated tab
   if (IsTabItem() && IsTabItemSelected())
-    return true;
+    return kSelectedStateTrue;
 
   // Selection follows focus, but ONLY in single selection containers,
   // and only if aria-selected was not present to override
 
   AXObject* container = ContainerWidget();
   if (!container || container->IsMultiSelectable())
-    return false;
+    return kSelectedStateFalse;
 
   AXObject* focused_object = AXObjectCache().FocusedObject();
-  return focused_object == this ||
-         (focused_object && focused_object->ActiveDescendant() == this);
+  return (focused_object == this ||
+          (focused_object && focused_object->ActiveDescendant() == this))
+             ? kSelectedStateTrue
+             : kSelectedStateFalse;
 }
 
 //
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h
index 2b2516f6..a9afe6d 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h
@@ -85,7 +85,7 @@
 
   // Check object state.
   bool IsFocused() const override;
-  bool IsSelected() const override;
+  AccessibilitySelectedState IsSelected() const override;
 
   // Whether objects are ignored, i.e. not included in the tree.
   AXObjectInclusion DefaultObjectInclusion(
diff --git a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp
index 011cd5f..94c7d270 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp
@@ -79,9 +79,14 @@
   return false;
 }
 
-bool AXListBoxOption::IsSelected() const {
-  return IsHTMLOptionElement(GetNode()) &&
-         ToHTMLOptionElement(GetNode())->Selected();
+AccessibilitySelectedState AXListBoxOption::IsSelected() const {
+  if (!GetNode() || !CanSetSelectedAttribute())
+    return kSelectedStateUndefined;
+
+  return (IsHTMLOptionElement(GetNode()) &&
+          ToHTMLOptionElement(GetNode())->Selected())
+             ? kSelectedStateTrue
+             : kSelectedStateFalse;
 }
 
 bool AXListBoxOption::IsSelectedOptionActive() const {
@@ -144,8 +149,12 @@
   if (!CanSetSelectedAttribute())
     return false;
 
-  bool is_option_selected = IsSelected();
-  if ((is_option_selected && selected) || (!is_option_selected && !selected))
+  AccessibilitySelectedState is_option_selected = IsSelected();
+  if (is_option_selected == kSelectedStateUndefined)
+    return false;
+
+  bool is_selected = (is_option_selected == kSelectedStateTrue) ? true : false;
+  if ((is_selected && selected) || (!is_selected && !selected))
     return false;
 
   select_element->SelectOptionByAccessKey(ToHTMLOptionElement(GetNode()));
diff --git a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h
index b71a863..9eb175a 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h
@@ -48,7 +48,7 @@
 
   bool IsAXListBoxOption() const override { return true; }
   AccessibilityRole DetermineAccessibilityRole() final;
-  bool IsSelected() const override;
+  AccessibilitySelectedState IsSelected() const override;
   bool IsSelectedOptionActive() const override;
   bool OnNativeSetSelectedAction(bool) override;
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp
index ab7199bb..a8b77f0 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp
@@ -104,7 +104,8 @@
 
   // In a single-option select with the popup collapsed, only the selected
   // item is considered visible.
-  return !parent_->IsOffScreen() || IsSelected();
+  return !parent_->IsOffScreen() ||
+         ((IsSelected() == kSelectedStateTrue) ? true : false);
 }
 
 bool AXMenuListOption::IsOffScreen() const {
@@ -112,11 +113,17 @@
   return !IsVisible();
 }
 
-bool AXMenuListOption::IsSelected() const {
+AccessibilitySelectedState AXMenuListOption::IsSelected() const {
+  if (!GetNode() || !CanSetSelectedAttribute())
+    return kSelectedStateUndefined;
+
   AXMenuListPopup* parent = static_cast<AXMenuListPopup*>(ParentObject());
-  if (parent && !parent->IsOffScreen())
-    return parent->ActiveDescendant() == this;
-  return element_ && element_->Selected();
+  if (parent && !parent->IsOffScreen()) {
+    return ((parent->ActiveDescendant() == this) ? kSelectedStateTrue
+                                                 : kSelectedStateFalse);
+  }
+  return ((element_ && element_->Selected()) ? kSelectedStateTrue
+                                             : kSelectedStateFalse);
 }
 
 bool AXMenuListOption::OnNativeSetSelectedAction(bool b) {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h
index c3fea4d5..2a18f181 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h
@@ -59,7 +59,7 @@
   Element* ActionElement() const override;
   bool IsVisible() const override;
   bool IsOffScreen() const override;
-  bool IsSelected() const override;
+  AccessibilitySelectedState IsSelected() const override;
   bool OnNativeSetSelectedAction(bool) override;
 
   void GetRelativeBounds(AXObject** out_container,
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.h b/third_party/WebKit/Source/modules/accessibility/AXObject.h
index b381d9f..8fc717d 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXObject.h
@@ -376,7 +376,9 @@
   virtual bool IsMultiSelectable() const { return false; }
   virtual bool IsOffScreen() const { return false; }
   virtual bool IsRequired() const { return false; }
-  virtual bool IsSelected() const { return false; }
+  virtual AccessibilitySelectedState IsSelected() const {
+    return kSelectedStateUndefined;
+  }
   virtual bool IsSelectedOptionActive() const { return false; }
   virtual bool IsVisible() const { return true; }
   virtual bool IsVisited() const { return false; }
@@ -384,7 +386,6 @@
   // Check whether certain properties can be modified.
   virtual bool CanSetFocusAttribute() const;
   bool CanSetValueAttribute() const;
-  virtual bool CanSetSelectedAttribute() const;
 
   // Whether objects are ignored, i.e. not included in the tree.
   bool AccessibilityIsIgnored();
@@ -810,6 +811,7 @@
     return nullptr;
   }
 
+  virtual bool CanSetSelectedAttribute() const;
   const AXObject* InertRoot() const;
 
   // Returns true if the event was handled.
diff --git a/third_party/WebKit/Source/modules/accessibility/AXTableCell.h b/third_party/WebKit/Source/modules/accessibility/AXTableCell.h
index 84ca1496..c8f464a 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXTableCell.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXTableCell.h
@@ -59,12 +59,12 @@
   unsigned AriaRowIndex() const;
 
   void SetARIAColIndexFromRow(int index) { aria_col_index_from_row_ = index; }
-  virtual bool CanSetSelectedAttribute() const { return false; }
 
  protected:
   virtual AXObject* ParentTable() const;
   virtual AXObject* ParentRow() const;
   AccessibilityRole DetermineAccessibilityRole() final;
+  virtual bool CanSetSelectedAttribute() const { return false; }
 
  private:
   bool IsTableHeaderCell() const;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXTableColumn.h b/third_party/WebKit/Source/modules/accessibility/AXTableColumn.h
index f23269e..85e4750d 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXTableColumn.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXTableColumn.h
@@ -55,11 +55,13 @@
 
   void SetColumnIndex(int column_index) { column_index_ = column_index; }
   int ColumnIndex() const { return column_index_; }
-  virtual bool CanSetSelectedAttribute() const { return false; }
 
   void AddChildren() override;
   void SetParent(AXObject*) override;
 
+ protected:
+  virtual bool CanSetSelectedAttribute() const { return false; }
+
  private:
   unsigned column_index_;
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXTableRow.h b/third_party/WebKit/Source/modules/accessibility/AXTableRow.h
index cdc7c63..c28c8d12 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXTableRow.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXTableRow.h
@@ -61,10 +61,9 @@
   unsigned AriaColumnIndex() const;
   unsigned AriaRowIndex() const;
 
-  virtual bool CanSetSelectedAttribute() const { return false; }
-
  protected:
   AccessibilityRole DetermineAccessibilityRole() final;
+  virtual bool CanSetSelectedAttribute() const { return false; }
 
  private:
   int row_index_;
diff --git a/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp b/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
index f2741b46..1b6650a 100644
--- a/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
@@ -145,13 +145,6 @@
   return role == kColumnHeaderRole || role == kRowHeaderRole;
 }
 
-bool RoleAllowsSelected(AccessibilityRole role) {
-  return role == kCellRole || role == kListBoxOptionRole || role == kRowRole ||
-         role == kTabRole || role == kColumnHeaderRole ||
-         role == kMenuItemRadioRole || role == kRadioButtonRole ||
-         role == kRowHeaderRole || role == kTreeItemRole;
-}
-
 void FillWidgetProperties(AXObject& ax_object,
                           protocol::Array<AXProperty>& properties) {
   AccessibilityRole role = ax_object.RoleValue();
@@ -286,10 +279,20 @@
       break;
   }
 
-  if (RoleAllowsSelected(role)) {
-    properties.addItem(
-        CreateProperty(AXPropertyNameEnum::Selected,
-                       CreateBooleanValue(ax_object.IsSelected())));
+  AccessibilitySelectedState selected = ax_object.IsSelected();
+  switch (selected) {
+    case kSelectedStateUndefined:
+      break;
+    case kSelectedStateFalse:
+      properties.addItem(CreateProperty(
+          AXPropertyNameEnum::Selected,
+          CreateBooleanValue(false, AXValueTypeEnum::BooleanOrUndefined)));
+      break;
+    case kSelectedStateTrue:
+      properties.addItem(CreateProperty(
+          AXPropertyNameEnum::Selected,
+          CreateBooleanValue(true, AXValueTypeEnum::BooleanOrUndefined)));
+      break;
   }
 
   if (RoleAllowsModal(role)) {
diff --git a/third_party/WebKit/Source/modules/credentialmanager/AuthenticatorAssertionResponse.idl b/third_party/WebKit/Source/modules/credentialmanager/AuthenticatorAssertionResponse.idl
index ca29887..61c9e2b 100644
--- a/third_party/WebKit/Source/modules/credentialmanager/AuthenticatorAssertionResponse.idl
+++ b/third_party/WebKit/Source/modules/credentialmanager/AuthenticatorAssertionResponse.idl
@@ -9,7 +9,7 @@
     SecureContext,
     Exposed=Window
 ] interface AuthenticatorAssertionResponse : AuthenticatorResponse {
-    [SameObject] readonly attribute ArrayBuffer authenticatorData;
-    [SameObject] readonly attribute ArrayBuffer signature;
-    [SameObject] readonly attribute ArrayBuffer userHandle;
+    [SameObject] readonly attribute ArrayBuffer  authenticatorData;
+    [SameObject] readonly attribute ArrayBuffer  signature;
+    [SameObject] readonly attribute ArrayBuffer? userHandle;
 };
diff --git a/third_party/WebKit/Source/modules/credentialmanager/CollectedClientData.idl b/third_party/WebKit/Source/modules/credentialmanager/CollectedClientData.idl
index 846432c..4616ca58 100644
--- a/third_party/WebKit/Source/modules/credentialmanager/CollectedClientData.idl
+++ b/third_party/WebKit/Source/modules/credentialmanager/CollectedClientData.idl
@@ -8,7 +8,6 @@
     required DOMString type;
     required DOMString challenge;
     required DOMString origin;
-    required DOMString hashAlgorithm;
     DOMString tokenBindingId;
     // TODO(crbug.com/733033): Add extension support
 };
diff --git a/third_party/WebKit/Source/modules/exported/WebAXObject.cpp b/third_party/WebKit/Source/modules/exported/WebAXObject.cpp
index 6a73e39..08b0758 100644
--- a/third_party/WebKit/Source/modules/exported/WebAXObject.cpp
+++ b/third_party/WebKit/Source/modules/exported/WebAXObject.cpp
@@ -233,13 +233,6 @@
   private_->GetSparseAXAttributes(adapter);
 }
 
-bool WebAXObject::CanSetSelectedAttribute() const {
-  if (IsDetached())
-    return false;
-
-  return private_->CanSetSelectedAttribute();
-}
-
 bool WebAXObject::IsAnchor() const {
   if (IsDetached())
     return false;
@@ -366,11 +359,11 @@
   return private_->IsRequired();
 }
 
-bool WebAXObject::IsSelected() const {
+WebAXSelectedState WebAXObject::IsSelected() const {
   if (IsDetached())
-    return false;
+    return kWebAXSelectedStateUndefined;
 
-  return private_->IsSelected();
+  return static_cast<WebAXSelectedState>(private_->IsSelected());
 }
 
 bool WebAXObject::IsSelectedOptionActive() const {
diff --git a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl
index b2a5494a..b38692c 100644
--- a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl
+++ b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl
@@ -16,7 +16,6 @@
 
     [CallWith=ScriptState] Promise<PhotoCapabilities> getPhotoCapabilities();
     [CallWith=ScriptState] Promise<PhotoSettings> getPhotoSettings();
-    [CallWith=ScriptState, MeasureAs=ImageCaptureSetOptions] Promise<void> setOptions(PhotoSettings photoSettings);
     [CallWith=ScriptState] Promise<Blob> takePhoto(optional PhotoSettings photoSettings);
     [CallWith=ScriptState] Promise<ImageBitmap> grabFrame();
 };
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBAny.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBAny.cpp
index b19300e..5e91b0078 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBAny.cpp
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBAny.cpp
@@ -76,16 +76,6 @@
   return idb_database_.Get();
 }
 
-IDBIndex* IDBAny::IdbIndex() const {
-  DCHECK_EQ(type_, kIDBIndexType);
-  return idb_index_.Get();
-}
-
-IDBObjectStore* IDBAny::IdbObjectStore() const {
-  DCHECK_EQ(type_, kIDBObjectStoreType);
-  return idb_object_store_.Get();
-}
-
 const IDBKey* IDBAny::Key() const {
   // If type is IDBValueType then instead use value()->primaryKey().
   DCHECK_EQ(type_, kKeyType);
@@ -118,11 +108,6 @@
 IDBAny::IDBAny(IDBDatabase* value)
     : type_(kIDBDatabaseType), idb_database_(value) {}
 
-IDBAny::IDBAny(IDBIndex* value) : type_(kIDBIndexType), idb_index_(value) {}
-
-IDBAny::IDBAny(IDBObjectStore* value)
-    : type_(kIDBObjectStoreType), idb_object_store_(value) {}
-
 IDBAny::IDBAny(Vector<std::unique_ptr<IDBValue>> values)
     : type_(kIDBValueArrayType), idb_values_(std::move(values)) {}
 
@@ -138,8 +123,6 @@
   visitor->Trace(dom_string_list_);
   visitor->Trace(idb_cursor_);
   visitor->Trace(idb_database_);
-  visitor->Trace(idb_index_);
-  visitor->Trace(idb_object_store_);
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBAny.h b/third_party/WebKit/Source/modules/indexeddb/IDBAny.h
index 29946921..fed8a93 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBAny.h
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBAny.h
@@ -85,8 +85,6 @@
     kIDBCursorType,
     kIDBCursorWithValueType,
     kIDBDatabaseType,
-    kIDBIndexType,
-    kIDBObjectStoreType,
     kIntegerType,
     kKeyType,
     kIDBValueType,
@@ -99,8 +97,6 @@
   IDBCursor* IdbCursor() const;
   IDBCursorWithValue* IdbCursorWithValue() const;
   IDBDatabase* IdbDatabase() const;
-  IDBIndex* IdbIndex() const;
-  IDBObjectStore* IdbObjectStore() const;
   IDBValue* Value() const;
   const Vector<std::unique_ptr<IDBValue>>& Values() const;
   int64_t Integer() const;
@@ -111,8 +107,6 @@
   explicit IDBAny(DOMStringList*);
   explicit IDBAny(IDBCursor*);
   explicit IDBAny(IDBDatabase*);
-  explicit IDBAny(IDBIndex*);
-  explicit IDBAny(IDBObjectStore*);
   explicit IDBAny(std::unique_ptr<IDBKey>);
   explicit IDBAny(Vector<std::unique_ptr<IDBValue>>);
   explicit IDBAny(std::unique_ptr<IDBValue>);
@@ -124,8 +118,6 @@
   const Member<DOMStringList> dom_string_list_;
   const Member<IDBCursor> idb_cursor_;
   const Member<IDBDatabase> idb_database_;
-  const Member<IDBIndex> idb_index_;
-  const Member<IDBObjectStore> idb_object_store_;
   const std::unique_ptr<IDBKey> idb_key_;
   const std::unique_ptr<IDBValue> idb_value_;
   const Vector<std::unique_ptr<IDBValue>> idb_values_;
diff --git a/third_party/WebKit/Source/modules/shapedetection/BUILD.gn b/third_party/WebKit/Source/modules/shapedetection/BUILD.gn
index 663f27599..3a14eb6f 100644
--- a/third_party/WebKit/Source/modules/shapedetection/BUILD.gn
+++ b/third_party/WebKit/Source/modules/shapedetection/BUILD.gn
@@ -24,6 +24,6 @@
 
   public_deps = [
     "//services/shape_detection/public/interfaces:interfaces_blink",
-    "//skia/public/interfaces:interfaces_blink",
+    "//skia/public/interfaces",
   ]
 }
diff --git a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
index 072e94c1..48cf42a3 100644
--- a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
@@ -31,7 +31,7 @@
 }
 
 ScriptPromise BarcodeDetector::DoDetect(ScriptPromiseResolver* resolver,
-                                        skia::mojom::blink::BitmapPtr bitmap) {
+                                        SkBitmap bitmap) {
   ScriptPromise promise = resolver->Promise();
   if (!barcode_service_) {
     resolver->Reject(DOMException::Create(
diff --git a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.h b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.h
index 0b0b7f4..40eb68d 100644
--- a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.h
+++ b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.h
@@ -28,8 +28,7 @@
   explicit BarcodeDetector(ExecutionContext*);
   ~BarcodeDetector() override = default;
 
-  ScriptPromise DoDetect(ScriptPromiseResolver*,
-                         skia::mojom::blink::BitmapPtr) override;
+  ScriptPromise DoDetect(ScriptPromiseResolver*, SkBitmap) override;
   void OnDetectBarcodes(
       ScriptPromiseResolver*,
       Vector<shape_detection::mojom::blink::BarcodeDetectionResultPtr>);
diff --git a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
index 8bd3e71..22dcd3f 100644
--- a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
@@ -45,7 +45,7 @@
 }
 
 ScriptPromise FaceDetector::DoDetect(ScriptPromiseResolver* resolver,
-                                     skia::mojom::blink::BitmapPtr bitmap) {
+                                     SkBitmap bitmap) {
   ScriptPromise promise = resolver->Promise();
   if (!face_service_) {
     resolver->Reject(DOMException::Create(
diff --git a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.h b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.h
index e86f236..7fc08816 100644
--- a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.h
+++ b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.h
@@ -29,8 +29,7 @@
   FaceDetector(ExecutionContext*, const FaceDetectorOptions&);
   ~FaceDetector() override = default;
 
-  ScriptPromise DoDetect(ScriptPromiseResolver*,
-                         skia::mojom::blink::BitmapPtr) override;
+  ScriptPromise DoDetect(ScriptPromiseResolver*, SkBitmap) override;
   void OnDetectFaces(
       ScriptPromiseResolver*,
       Vector<shape_detection::mojom::blink::FaceDetectionResultPtr>);
diff --git a/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp
index 5fb5e2d..c1f08ec9 100644
--- a/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.cpp
@@ -21,28 +21,6 @@
 
 namespace blink {
 
-namespace {
-
-skia::mojom::blink::BitmapPtr createBitmapFromData(int width,
-                                                   int height,
-                                                   Vector<uint8_t> bitmapData) {
-  skia::mojom::blink::BitmapPtr bitmap = skia::mojom::blink::Bitmap::New();
-
-  bitmap->color_type = (kN32_SkColorType == kRGBA_8888_SkColorType)
-                           ? skia::mojom::blink::ColorType::RGBA_8888
-                           : skia::mojom::blink::ColorType::BGRA_8888;
-  bitmap->alpha_type = skia::mojom::blink::AlphaType::ALPHA_TYPE_OPAQUE;
-  bitmap->profile_type = skia::mojom::blink::ColorProfileType::LINEAR;
-  bitmap->width = width;
-  bitmap->height = height;
-  bitmap->row_bytes = width * 4 /* bytes per pixel */;
-  bitmap->pixel_data = std::move(bitmapData);
-
-  return bitmap;
-}
-
-}  // anonymous namespace
-
 ScriptPromise ShapeDetector::detect(
     ScriptState* script_state,
     const ImageBitmapSourceUnion& image_source) {
@@ -103,20 +81,14 @@
     return promise;
   }
 
-  SkPixmap pixmap;
-  scoped_refptr<Uint8Array> pixel_data;
-  uint8_t* pixel_data_ptr = nullptr;
-  WTF::CheckedNumeric<int> allocation_size = 0;
-
   // makeNonTextureImage() will make a raster copy of
   // PaintImageForCurrentFrame() if needed, otherwise returning the original
   // SkImage.
   const sk_sp<SkImage> sk_image =
       image->PaintImageForCurrentFrame().GetSkImage()->makeNonTextureImage();
-  if (sk_image && sk_image->peekPixels(&pixmap)) {
-    pixel_data_ptr = static_cast<uint8_t*>(pixmap.writable_addr());
-    allocation_size = pixmap.computeByteSize();
-  } else {
+
+  SkBitmap sk_bitmap;
+  if (!sk_image->asLegacyBitmap(&sk_bitmap, SkImage::kRO_LegacyBitmapMode)) {
     // TODO(mcasas): retrieve the pixels from elsewhere.
     NOTREACHED();
     resolver->Reject(DOMException::Create(
@@ -124,13 +96,7 @@
     return promise;
   }
 
-  WTF::Vector<uint8_t> bitmap_data;
-  bitmap_data.Append(pixel_data_ptr,
-                     static_cast<int>(allocation_size.ValueOrDefault(0)));
-
-  return DoDetect(resolver,
-                  createBitmapFromData(image->width(), image->height(),
-                                       std::move(bitmap_data)));
+  return DoDetect(resolver, std::move(sk_bitmap));
 }
 
 ScriptPromise ShapeDetector::DetectShapesOnImageData(
@@ -143,15 +109,23 @@
     return promise;
   }
 
-  uint8_t* const data = image_data->data()->Data();
+  SkBitmap sk_bitmap;
+  if (!sk_bitmap.tryAllocPixels(
+          SkImageInfo::Make(image_data->width(), image_data->height(),
+                            kN32_SkColorType, kOpaque_SkAlphaType),
+          image_data->width() * 4 /* bytes per pixel */)) {
+    resolver->Reject(DOMException::Create(
+        kInvalidStateError, "Failed to allocate pixels for current frame."));
+    return promise;
+  }
+
   WTF::CheckedNumeric<int> allocation_size = image_data->Size().Area() * 4;
+  CHECK_EQ(allocation_size.ValueOrDefault(0), sk_bitmap.computeByteSize());
 
-  WTF::Vector<uint8_t> bitmap_data;
-  bitmap_data.Append(data, static_cast<int>(allocation_size.ValueOrDefault(0)));
+  memcpy(sk_bitmap.getPixels(), image_data->data()->Data(),
+         sk_bitmap.computeByteSize());
 
-  return DoDetect(
-      resolver, createBitmapFromData(image_data->width(), image_data->height(),
-                                     std::move(bitmap_data)));
+  return DoDetect(resolver, std::move(sk_bitmap));
 }
 
 ScriptPromise ShapeDetector::DetectShapesOnImageElement(
@@ -178,34 +152,21 @@
     return promise;
   }
 
-  const sk_sp<SkImage> image =
+  const sk_sp<SkImage> sk_image =
       blink_image->PaintImageForCurrentFrame().GetSkImage();
-  DCHECK_EQ(img->naturalWidth(), static_cast<unsigned>(image->width()));
-  DCHECK_EQ(img->naturalHeight(), static_cast<unsigned>(image->height()));
+  DCHECK_EQ(img->naturalWidth(), static_cast<unsigned>(sk_image->width()));
+  DCHECK_EQ(img->naturalHeight(), static_cast<unsigned>(sk_image->height()));
 
-  if (!image) {
+  SkBitmap sk_bitmap;
+
+  if (!sk_image ||
+      !sk_image->asLegacyBitmap(&sk_bitmap, SkImage::kRO_LegacyBitmapMode)) {
     resolver->Reject(DOMException::Create(
         kInvalidStateError, "Failed to get image from current frame."));
     return promise;
   }
 
-  const SkImageInfo skia_info =
-      SkImageInfo::MakeN32(image->width(), image->height(), image->alphaType());
-  size_t rowBytes = skia_info.minRowBytes();
-
-  Vector<uint8_t> bitmap_data(skia_info.computeByteSize(rowBytes));
-  const SkPixmap pixmap(skia_info, bitmap_data.data(), rowBytes);
-
-  if (!image->readPixels(pixmap, 0, 0)) {
-    resolver->Reject(DOMException::Create(
-        kInvalidStateError,
-        "Failed to read pixels: Unable to decompress or unsupported format."));
-    return promise;
-  }
-
-  return DoDetect(
-      resolver, createBitmapFromData(img->naturalWidth(), img->naturalHeight(),
-                                     std::move(bitmap_data)));
+  return DoDetect(resolver, std::move(sk_bitmap));
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.h b/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.h
index ec9b9b17..4bb576e0 100644
--- a/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.h
+++ b/third_party/WebKit/Source/modules/shapedetection/ShapeDetector.h
@@ -12,6 +12,7 @@
 #include "modules/canvas/canvas2d/CanvasRenderingContext2D.h"
 #include "platform/bindings/ScriptWrappable.h"
 #include "skia/public/interfaces/bitmap.mojom-blink.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 
 namespace blink {
 
@@ -26,8 +27,7 @@
   ScriptPromise DetectShapesOnImageElement(ScriptPromiseResolver*,
                                            const HTMLImageElement*);
 
-  virtual ScriptPromise DoDetect(ScriptPromiseResolver*,
-                                 skia::mojom::blink::BitmapPtr) = 0;
+  virtual ScriptPromise DoDetect(ScriptPromiseResolver*, SkBitmap) = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
index 5457605..f295cc6 100644
--- a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
@@ -30,7 +30,7 @@
 }
 
 ScriptPromise TextDetector::DoDetect(ScriptPromiseResolver* resolver,
-                                     skia::mojom::blink::BitmapPtr bitmap) {
+                                     SkBitmap bitmap) {
   ScriptPromise promise = resolver->Promise();
   if (!text_service_) {
     resolver->Reject(DOMException::Create(
diff --git a/third_party/WebKit/Source/modules/shapedetection/TextDetector.h b/third_party/WebKit/Source/modules/shapedetection/TextDetector.h
index b9f85c1c..dfc4dd9 100644
--- a/third_party/WebKit/Source/modules/shapedetection/TextDetector.h
+++ b/third_party/WebKit/Source/modules/shapedetection/TextDetector.h
@@ -28,8 +28,7 @@
   explicit TextDetector(ExecutionContext*);
   ~TextDetector() override = default;
 
-  ScriptPromise DoDetect(ScriptPromiseResolver*,
-                         skia::mojom::blink::BitmapPtr) override;
+  ScriptPromise DoDetect(ScriptPromiseResolver*, SkBitmap) override;
   void OnDetectText(
       ScriptPromiseResolver*,
       Vector<shape_detection::mojom::blink::TextDetectionResultPtr>);
diff --git a/third_party/WebKit/Source/platform/bindings/DOMDataStore.h b/third_party/WebKit/Source/platform/bindings/DOMDataStore.h
index 793dc5fc..ef280fa 100644
--- a/third_party/WebKit/Source/platform/bindings/DOMDataStore.h
+++ b/third_party/WebKit/Source/platform/bindings/DOMDataStore.h
@@ -36,6 +36,7 @@
 #include "platform/bindings/DOMWrapperMap.h"
 #include "platform/bindings/DOMWrapperWorld.h"
 #include "platform/bindings/ScriptWrappable.h"
+#include "platform/bindings/ScriptWrappableVisitor.h"
 #include "platform/bindings/WrapperTypeInfo.h"
 #include "platform/wtf/Allocator.h"
 #include "platform/wtf/Noncopyable.h"
@@ -133,7 +134,12 @@
     DCHECK(!wrapper.IsEmpty());
     if (is_main_world_)
       return object->SetWrapper(isolate, wrapper_type_info, wrapper);
-    return wrapper_map_->Set(object, wrapper_type_info, wrapper);
+    bool updated = wrapper_map_->Set(object, wrapper_type_info, wrapper);
+    if (updated) {
+      ScriptWrappableVisitor::WriteBarrier(isolate, &wrapper_map_.value(),
+                                           object);
+    }
+    return updated;
   }
 
   void MarkWrapper(ScriptWrappable* script_wrappable) {
diff --git a/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.cpp b/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.cpp
index f732617..a5193b9 100644
--- a/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.cpp
+++ b/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.cpp
@@ -6,6 +6,7 @@
 
 #include "platform/Supplementable.h"
 #include "platform/bindings/ActiveScriptWrappableBase.h"
+#include "platform/bindings/DOMWrapperMap.h"
 #include "platform/bindings/DOMWrapperWorld.h"
 #include "platform/bindings/ScopedPersistent.h"
 #include "platform/bindings/ScriptWrappable.h"
@@ -232,6 +233,23 @@
   visitor->TraceWrappers(dst_object);
 }
 
+void ScriptWrappableVisitor::WriteBarrier(
+    v8::Isolate* isolate,
+    DOMWrapperMap<ScriptWrappable>* wrapper_map,
+    ScriptWrappable* key) {
+  ScriptWrappableVisitor* visitor = CurrentVisitor(isolate);
+  if (!visitor->WrapperTracingInProgress())
+    return;
+  // Conservatively assume that the source object key is marked.
+  visitor->TraceWrappers(wrapper_map, key);
+}
+
+void ScriptWrappableVisitor::TraceWrappers(
+    DOMWrapperMap<ScriptWrappable>* wrapper_map,
+    ScriptWrappable* key) {
+  Visit(wrapper_map, key);
+}
+
 void ScriptWrappableVisitor::Visit(
     const TraceWrapperV8Reference<v8::Value>& traced_wrapper) const {
   // The write barrier may try to mark a wrapper because cleanup is still
@@ -259,6 +277,11 @@
 #endif
 }
 
+void ScriptWrappableVisitor::Visit(DOMWrapperMap<ScriptWrappable>* wrapper_map,
+                                   ScriptWrappable* key) {
+  wrapper_map->MarkWrapper(key);
+}
+
 void ScriptWrappableVisitor::DispatchTraceWrappers(
     const TraceWrapperBase* wrapper_base) const {
   wrapper_base->TraceWrappers(this);
diff --git a/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.h b/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.h
index 58e0819..072b3a9 100644
--- a/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.h
+++ b/third_party/WebKit/Source/platform/bindings/ScriptWrappableVisitor.h
@@ -15,6 +15,8 @@
 
 namespace blink {
 
+template <typename T>
+class DOMWrapperMap;
 class HeapObjectHeader;
 class ScriptWrappable;
 class ScriptWrappableVisitor;
@@ -144,6 +146,10 @@
   static void WriteBarrier(v8::Isolate*,
                            const TraceWrapperV8Reference<v8::Value>&);
 
+  static void WriteBarrier(v8::Isolate*,
+                           DOMWrapperMap<ScriptWrappable>*,
+                           ScriptWrappable* key);
+
   ScriptWrappableVisitor(v8::Isolate* isolate) : isolate_(isolate){};
   ~ScriptWrappableVisitor() override;
 
@@ -186,6 +192,11 @@
     Visit(v8reference.template Cast<v8::Value>());
   }
 
+  // Trace a wrapper in a non-main world.
+  // TODO(ulan): call this from ScriptWrappable::TraceWrappers and
+  // remove all MarkWrappersInAllWorlds methods.
+  void TraceWrappers(DOMWrapperMap<ScriptWrappable>*, ScriptWrappable* key);
+
   virtual void DispatchTraceWrappers(const TraceWrapperBase*) const;
   template <typename T>
   void DispatchTraceWrappers(const Supplement<T>* traceable) const {
@@ -228,6 +239,7 @@
   // TODO(ulan): extract Visit methods to a general visitor interface.
   virtual void Visit(const TraceWrapperV8Reference<v8::Value>&) const;
   virtual void Visit(const WrapperDescriptor&) const;
+  virtual void Visit(DOMWrapperMap<ScriptWrappable>*, ScriptWrappable* key);
 
   v8::Isolate* isolate() const { return isolate_; }
 
diff --git a/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.cpp b/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.cpp
index 8c62f1f..0604a54 100644
--- a/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.cpp
+++ b/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.cpp
@@ -61,14 +61,10 @@
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     V8ContextSnapshotMode v8_context_snapshot_mode)
     : v8_context_snapshot_mode_(v8_context_snapshot_mode),
-      isolate_holder_(
-          task_runner,
-          gin::IsolateHolder::kSingleThread,
-          IsMainThread() ? gin::IsolateHolder::kDisallowAtomicsWait
-                         : gin::IsolateHolder::kAllowAtomicsWait,
-          v8_context_snapshot_mode_ == V8ContextSnapshotMode::kUseSnapshot
-              ? &startup_data_
-              : nullptr),
+      isolate_holder_(task_runner,
+                      gin::IsolateHolder::kSingleThread,
+                      IsMainThread() ? gin::IsolateHolder::kDisallowAtomicsWait
+                                     : gin::IsolateHolder::kAllowAtomicsWait),
       interface_template_map_for_v8_context_snapshot_(GetIsolate()),
       string_cache_(WTF::WrapUnique(new StringCache(GetIsolate()))),
       private_property_(V8PrivateProperty::Create()),
@@ -77,13 +73,6 @@
       is_handling_recursion_level_error_(false),
       is_reporting_exception_(false),
       runtime_call_stats_(base::DefaultTickClock::GetInstance()) {
-  // If it fails to load the snapshot file, falls back to kDontUseSnapshot mode.
-  // TODO(peria): Remove this fallback routine.
-  if (v8_context_snapshot_mode_ == V8ContextSnapshotMode::kUseSnapshot &&
-      !startup_data_.data) {
-    v8_context_snapshot_mode_ = V8ContextSnapshotMode::kDontUseSnapshot;
-  }
-
   // FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone.
   GetIsolate()->Enter();
   GetIsolate()->AddBeforeCallEnteredCallback(&BeforeCallEnteredCallback);
@@ -92,13 +81,15 @@
     g_main_thread_per_isolate_data = this;
 }
 
-// This constructor is used for taking a V8 context snapshot. It must run on the
-// main thread.
+// This constructor is used for creating a V8 context snapshot. It must run on
+// the main thread.
 V8PerIsolateData::V8PerIsolateData()
     : v8_context_snapshot_mode_(V8ContextSnapshotMode::kTakeSnapshot),
       isolate_holder_(
           Platform::Current()->MainThread()->GetSingleThreadTaskRunner(),
-          &startup_data_),
+          gin::IsolateHolder::kSingleThread,
+          gin::IsolateHolder::kAllowAtomicsWait,
+          gin::IsolateHolder::IsolateCreationMode::kCreateSnapshot),
       interface_template_map_for_v8_context_snapshot_(GetIsolate()),
       string_cache_(WTF::WrapUnique(new StringCache(GetIsolate()))),
       private_property_(V8PrivateProperty::Create()),
diff --git a/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h b/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h
index 2696918..58f1170 100644
--- a/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h
+++ b/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h
@@ -277,9 +277,6 @@
   // Contains lists of eternal names, such as dictionary keys.
   HashMap<const void*, Vector<v8::Eternal<v8::Name>>> eternal_name_cache_;
 
-  // Members required for the V8 context snapshot.
-  // v8::Context is created from this blob data image.
-  v8::StartupData startup_data_;
   // When taking a V8 context snapshot, we can't keep V8 objects with eternal
   // handles. So we use a special interface map that doesn't use eternal handles
   // instead of the default V8FunctionTemplateMap.
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
index d6a29494..2a763f6 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
@@ -18,8 +18,6 @@
       return "control_tq";
     case MainThreadTaskQueue::QueueType::kDefault:
       return "default_tq";
-    case MainThreadTaskQueue::QueueType::kDefaultLoading:
-      return "default_loading_tq";
     case MainThreadTaskQueue::QueueType::kDefaultTimer:
       return "default_timer_tq";
     case MainThreadTaskQueue::QueueType::kUnthrottled:
@@ -66,7 +64,6 @@
     case QueueType::kV8:
     case QueueType::kIPC:
       return QueueClass::kNone;
-    case QueueType::kDefaultLoading:
     case QueueType::kFrameLoading:
     case QueueType::kFrameLoading_kControl:
       return QueueClass::kLoading;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
index f96f276..f569c8f 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
@@ -25,7 +25,9 @@
     // the situation settles.
     kControl = 0,
     kDefault = 1,
-    kDefaultLoading = 2,
+
+    // 2 was used for default loading task runner but this was deprecated.
+
     // kDefaultTimer is deprecated and should be replaced with appropriate
     // per-frame task queues.
     kDefaultTimer = 3,
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc b/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc
index 7d79cada..6bc59d1 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc
@@ -109,8 +109,6 @@
   switch (queue_type) {
     case MainThreadTaskQueue::QueueType::kDefault:
       return TASK_QUEUE_PREFIX "Default";
-    case MainThreadTaskQueue::QueueType::kDefaultLoading:
-      return TASK_QUEUE_PREFIX "DefaultLoading";
     case MainThreadTaskQueue::QueueType::kUnthrottled:
       return TASK_QUEUE_PREFIX "Unthrottled";
     case MainThreadTaskQueue::QueueType::kFrameLoading:
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator_unittest.cc
index 0f2eec3..0765de6 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator_unittest.cc
@@ -779,12 +779,11 @@
 // Split ExpectedQueueingTime only reports once per disjoint window. The
 // following is a detailed explanation of EQT per window and task queue:
 // Window 1: A 3000ms default queue task contributes 900 to that EQT.
-// Window 2: Two 2000ms default loading queue tasks: 400 each, total 800 EQT.
-// Window 3: 3000 ms default loading queue task: 900 EQT for that type. Also,
-// the first 2000ms from a 3000ms default task: 800 EQT for that.
-// Window 4: The remaining 100 EQT for default type. Also 1000ms tasks (which
+// Window 2: After 3000ms, the first 2000ms from a 3000ms default task: 800 EQT
+// for that.
+// Window 3: The remaining 100 EQT for default type. Also 1000ms tasks (which
 // contribute 100) for FrameLoading, FrameThrottleable, and Unthrottled.
-// Window 5: 600 ms tasks (which contribute 36) for each of the buckets except
+// Window 4: 600 ms tasks (which contribute 36) for each of the buckets except
 // other. Two 300 ms (each contributing 9) and one 200 ms tasks (contributes 4)
 // for the other bucket.
 TEST_F(QueueingTimeEstimatorTest, SplitEQTByTaskQueueType) {
@@ -804,26 +803,12 @@
   estimator.OnTopLevelTaskCompleted(time);
 
   time += base::TimeDelta::FromMilliseconds(1500);
+
   // Beginning of window 2.
-  scoped_refptr<MainThreadTaskQueueForTest> default_loading_queue(
-      new MainThreadTaskQueueForTest(QueueType::kDefaultLoading));
-  estimator.OnTopLevelTaskStarted(time, default_loading_queue.get());
-  time += base::TimeDelta::FromMilliseconds(2000);
-  estimator.OnTopLevelTaskCompleted(time);
-
-  time += base::TimeDelta::FromMilliseconds(1000);
-  estimator.OnTopLevelTaskStarted(time, default_loading_queue.get());
-  time += base::TimeDelta::FromMilliseconds(2000);
-  estimator.OnTopLevelTaskCompleted(time);
-
-  // Beginning of window 3.
-  estimator.OnTopLevelTaskStarted(time, default_loading_queue.get());
   time += base::TimeDelta::FromMilliseconds(3000);
-  estimator.OnTopLevelTaskCompleted(time);
-
   estimator.OnTopLevelTaskStarted(time, default_queue.get());
   time += base::TimeDelta::FromMilliseconds(3000);
-  // 1000 ms after beginning of window 4.
+  // 1000 ms after beginning of window 3.
   estimator.OnTopLevelTaskCompleted(time);
 
   time += base::TimeDelta::FromMilliseconds(1000);
@@ -842,21 +827,24 @@
     estimator.OnTopLevelTaskCompleted(time);
   }
 
-  // Beginning of window 5.
+  // Beginning of window 4.
   scoped_refptr<MainThreadTaskQueueForTest> frame_pausable_queue(
       new MainThreadTaskQueueForTest(QueueType::kFramePausable));
   scoped_refptr<MainThreadTaskQueueForTest> compositor_queue(
       new MainThreadTaskQueueForTest(QueueType::kCompositor));
   MainThreadTaskQueue* queues_for_six_hundred[] = {
-      default_queue.get(),        default_loading_queue.get(),
-      frame_loading_queue.get(),  frame_throttleable_queue.get(),
-      frame_pausable_queue.get(), unthrottled_queue.get(),
+      default_queue.get(),
+      frame_loading_queue.get(),
+      frame_throttleable_queue.get(),
+      frame_pausable_queue.get(),
+      unthrottled_queue.get(),
       compositor_queue.get()};
   for (auto queue : queues_for_six_hundred) {
     estimator.OnTopLevelTaskStarted(time, queue);
     time += base::TimeDelta::FromMilliseconds(600);
     estimator.OnTopLevelTaskCompleted(time);
   }
+  time += base::TimeDelta::FromMilliseconds(600);
 
   // The following task contributes to "Other" because kControl is not a
   // supported queue type.
@@ -879,108 +867,89 @@
   time += base::TimeDelta::FromMilliseconds(200);
   estimator.OnTopLevelTaskCompleted(time);
 
-  // End of window 5. Now check the vectors per task queue type.
+  // End of window 4. Now check the vectors per task queue type.
   EXPECT_THAT(client.QueueTypeValues(QueueType::kDefault),
               ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(900),
-                                     base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(800),
                                      base::TimeDelta::FromMilliseconds(100),
                                      base::TimeDelta::FromMilliseconds(36)));
   std::vector<BucketExpectation> expected = {
-      {0, 1}, {36, 1}, {100, 1}, {800, 1}, {900, 1}};
-  TestHistogram("RendererScheduler.ExpectedQueueingTimeByTaskQueue.Default", 5,
+      {36, 1}, {100, 1}, {800, 1}, {900, 1}};
+  TestHistogram("RendererScheduler.ExpectedQueueingTimeByTaskQueue.Default", 4,
                 GetFineGrained(expected));
 
-  EXPECT_THAT(client.QueueTypeValues(QueueType::kDefaultLoading),
-              ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(800),
-                                     base::TimeDelta::FromMilliseconds(900),
-                                     base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(36)));
-  expected = {{0, 2}, {36, 1}, {800, 1}, {900, 1}};
-  TestHistogram(
-      "RendererScheduler.ExpectedQueueingTimeByTaskQueue.DefaultLoading", 5,
-      GetFineGrained(expected));
-
   EXPECT_THAT(client.QueueTypeValues(QueueType::kFrameLoading),
               ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(100),
                                      base::TimeDelta::FromMilliseconds(36)));
-  expected = {{0, 3}, {36, 1}, {100, 1}};
+  expected = {{0, 2}, {36, 1}, {100, 1}};
   TestHistogram(
-      "RendererScheduler.ExpectedQueueingTimeByTaskQueue.FrameLoading", 5,
+      "RendererScheduler.ExpectedQueueingTimeByTaskQueue.FrameLoading", 4,
       GetFineGrained(expected));
 
   EXPECT_THAT(client.QueueTypeValues(QueueType::kFrameThrottleable),
               ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(100),
                                      base::TimeDelta::FromMilliseconds(36)));
-  expected = {{0, 3}, {36, 1}, {100, 1}};
+  expected = {{0, 2}, {36, 1}, {100, 1}};
   TestHistogram(
-      "RendererScheduler.ExpectedQueueingTimeByTaskQueue.FrameThrottleable", 5,
+      "RendererScheduler.ExpectedQueueingTimeByTaskQueue.FrameThrottleable", 4,
       GetFineGrained(expected));
 
   EXPECT_THAT(client.QueueTypeValues(QueueType::kFramePausable),
               ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(36)));
-  expected = {{0, 4}, {36, 1}};
+  expected = {{0, 3}, {36, 1}};
   TestHistogram(
-      "RendererScheduler.ExpectedQueueingTimeByTaskQueue.FramePausable", 5,
+      "RendererScheduler.ExpectedQueueingTimeByTaskQueue.FramePausable", 4,
       GetFineGrained(expected));
 
   EXPECT_THAT(client.QueueTypeValues(QueueType::kUnthrottled),
               ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(100),
                                      base::TimeDelta::FromMilliseconds(36)));
-  expected = {{0, 3}, {36, 1}, {100, 1}};
+  expected = {{0, 2}, {36, 1}, {100, 1}};
   TestHistogram("RendererScheduler.ExpectedQueueingTimeByTaskQueue.Unthrottled",
-                5, GetFineGrained(expected));
+                4, GetFineGrained(expected));
 
   EXPECT_THAT(client.QueueTypeValues(QueueType::kCompositor),
               ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(36)));
-  expected = {{0, 4}, {36, 1}};
+  expected = {{0, 3}, {36, 1}};
   TestHistogram("RendererScheduler.ExpectedQueueingTimeByTaskQueue.Compositor",
-                5, GetFineGrained(expected));
+                4, GetFineGrained(expected));
 
   EXPECT_THAT(client.QueueTypeValues(QueueType::kOther),
               ::testing::ElementsAre(base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(0),
-                                     base::TimeDelta::FromMilliseconds(0),
                                      base::TimeDelta::FromMilliseconds(22)));
-  expected = {{0, 4}, {22, 1}};
-  TestHistogram("RendererScheduler.ExpectedQueueingTimeByTaskQueue.Other", 5,
+  expected = {{0, 3}, {22, 1}};
+  TestHistogram("RendererScheduler.ExpectedQueueingTimeByTaskQueue.Other", 4,
                 GetFineGrained(expected));
 
   // Check that the sum of split EQT equals the total EQT for each window.
   base::TimeDelta expected_sums[] = {base::TimeDelta::FromMilliseconds(900),
                                      base::TimeDelta::FromMilliseconds(800),
-                                     base::TimeDelta::FromMilliseconds(1700),
                                      base::TimeDelta::FromMilliseconds(400),
-                                     base::TimeDelta::FromMilliseconds(274)};
+                                     base::TimeDelta::FromMilliseconds(238)};
   EXPECT_THAT(client.FrameStatusValues(FrameStatus::kNone),
               ::testing::ElementsAreArray(expected_sums));
-  expected = {{274, 1}, {400, 1}, {800, 1}, {900, 1}, {1700, 1}};
+  expected = {{238, 1}, {400, 1}, {800, 1}, {900, 1}};
   std::vector<BucketExpectation> fine_grained = GetFineGrained(expected);
-  TestHistogram("RendererScheduler.ExpectedQueueingTimeByFrameStatus.Other", 5,
+  TestHistogram("RendererScheduler.ExpectedQueueingTimeByFrameStatus.Other", 4,
                 fine_grained);
-  TestHistogram("RendererScheduler.ExpectedTaskQueueingDuration", 5, expected);
-  TestHistogram("RendererScheduler.ExpectedTaskQueueingDuration2", 5,
+  TestHistogram("RendererScheduler.ExpectedTaskQueueingDuration", 4, expected);
+  TestHistogram("RendererScheduler.ExpectedTaskQueueingDuration2", 4,
                 fine_grained);
-  TestSplitSumsTotal(expected_sums, 6);
+  TestSplitSumsTotal(expected_sums, 5);
 }
 
 // Split ExpectedQueueingTime only reports once per disjoint window. The
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
index f8c2c7a..effc032 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
@@ -218,8 +218,6 @@
   RunTask(QueueType::kDefault, Milliseconds(3),
           base::TimeDelta::FromMicroseconds(700));
 
-  RunTask(QueueType::kDefaultLoading, Milliseconds(200),
-          base::TimeDelta::FromMilliseconds(20));
   RunTask(QueueType::kControl, Milliseconds(400),
           base::TimeDelta::FromMilliseconds(30));
   RunTask(QueueType::kDefaultTimer, Milliseconds(600),
@@ -263,7 +261,6 @@
   std::vector<base::Bucket> expected_samples = {
       {static_cast<int>(QueueType::kControl), 75},
       {static_cast<int>(QueueType::kDefault), 2},
-      {static_cast<int>(QueueType::kDefaultLoading), 20},
       {static_cast<int>(QueueType::kDefaultTimer), 5},
       {static_cast<int>(QueueType::kUnthrottled), 25},
       {static_cast<int>(QueueType::kFrameLoading), 105},
@@ -282,7 +279,6 @@
               UnorderedElementsAre(
                   Bucket(static_cast<int>(QueueType::kControl), 30),
                   Bucket(static_cast<int>(QueueType::kDefault), 2),
-                  Bucket(static_cast<int>(QueueType::kDefaultLoading), 20),
                   Bucket(static_cast<int>(QueueType::kDefaultTimer), 5),
                   Bucket(static_cast<int>(QueueType::kFrameLoading), 70),
                   Bucket(static_cast<int>(QueueType::kCompositor), 25),
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
index 8ba52e58..b5746de 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -241,8 +241,6 @@
       std::make_pair(compositor_task_queue_,
                      compositor_task_queue_->CreateQueueEnabledVoter()));
 
-  default_loading_task_queue_ =
-      NewLoadingTaskQueue(MainThreadTaskQueue::QueueType::kDefaultLoading);
   default_timer_task_queue_ =
       NewTimerTaskQueue(MainThreadTaskQueue::QueueType::kDefaultTimer);
   v8_task_queue_ = NewTaskQueue(MainThreadTaskQueue::QueueCreationParams(
@@ -609,11 +607,6 @@
   return compositor_task_queue_;
 }
 
-scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::LoadingTaskQueue() {
-  helper_.CheckOnValidThread();
-  return default_loading_task_queue_;
-}
-
 scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::TimerTaskQueue() {
   helper_.CheckOnValidThread();
   return default_timer_task_queue_;
@@ -2284,7 +2277,6 @@
   // with renderer scheduler which do not have a corresponding frame.
   control_task_queue_->SetBlameContext(blame_context);
   DefaultTaskQueue()->SetBlameContext(blame_context);
-  default_loading_task_queue_->SetBlameContext(blame_context);
   default_timer_task_queue_->SetBlameContext(blame_context);
   compositor_task_queue_->SetBlameContext(blame_context);
   idle_helper_.IdleTaskRunner()->SetBlameContext(blame_context);
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
index a854e58..399808801 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
@@ -183,7 +183,6 @@
 
   scoped_refptr<MainThreadTaskQueue> DefaultTaskQueue();
   scoped_refptr<MainThreadTaskQueue> CompositorTaskQueue();
-  scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue();
   scoped_refptr<MainThreadTaskQueue> TimerTaskQueue();
   scoped_refptr<MainThreadTaskQueue> V8TaskQueue();
 
@@ -609,7 +608,6 @@
 
   TaskQueueVoterMap task_runners_;
 
-  scoped_refptr<MainThreadTaskQueue> default_loading_task_queue_;
   scoped_refptr<MainThreadTaskQueue> default_timer_task_queue_;
   scoped_refptr<MainThreadTaskQueue> v8_task_queue_;
   scoped_refptr<MainThreadTaskQueue> ipc_task_queue_;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
index ed76627..577ae0d 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -297,7 +297,8 @@
     }
     default_task_runner_ = scheduler_->DefaultTaskQueue();
     compositor_task_runner_ = scheduler_->CompositorTaskQueue();
-    loading_task_runner_ = scheduler_->LoadingTaskQueue();
+    loading_task_runner_ = scheduler_->NewLoadingTaskQueue(
+        MainThreadTaskQueue::QueueType::kFrameLoading);
     loading_control_task_runner_ = scheduler_->NewLoadingTaskQueue(
         MainThreadTaskQueue::QueueType::kFrameLoading_kControl);
     idle_task_runner_ = scheduler_->IdleTaskRunner();
@@ -709,11 +710,6 @@
     return scheduler->ThrottleableTaskQueue();
   }
 
-  static scoped_refptr<TaskQueue> LoadingTaskQueue(
-      WebFrameSchedulerImpl* scheduler) {
-    return scheduler->LoadingTaskQueue();
-  }
-
   base::SimpleTestTickClock clock_;
   TaskQueue::Task fake_task_;
   scoped_refptr<MainThreadTaskQueue> fake_queue_;
@@ -724,7 +720,7 @@
   std::unique_ptr<RendererSchedulerImplForTest> scheduler_;
   scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_;
+  scoped_refptr<TaskQueue> loading_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> loading_control_task_runner_;
   scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> timer_task_runner_;
@@ -3779,7 +3775,7 @@
             scheduler_->GetVirtualTimeDomain());
   EXPECT_EQ(scheduler_->CompositorTaskQueue()->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
-  EXPECT_EQ(scheduler_->LoadingTaskQueue()->GetTimeDomain(),
+  EXPECT_EQ(loading_task_runner_->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
   EXPECT_EQ(scheduler_->TimerTaskQueue()->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
@@ -3857,7 +3853,7 @@
             scheduler_->real_time_domain());
   EXPECT_EQ(scheduler_->CompositorTaskQueue()->GetTimeDomain(),
             scheduler_->real_time_domain());
-  EXPECT_EQ(scheduler_->LoadingTaskQueue()->GetTimeDomain(),
+  EXPECT_EQ(loading_task_runner_->GetTimeDomain(),
             scheduler_->real_time_domain());
   EXPECT_EQ(scheduler_->TimerTaskQueue()->GetTimeDomain(),
             scheduler_->real_time_domain());
@@ -3893,9 +3889,8 @@
 
   scheduler_->TimerTaskQueue()->PostTask(FROM_HERE, base::Bind(NullTask));
 
-  LoadingTaskQueue(web_frame_scheduler.get())
-      ->PostDelayedTask(FROM_HERE, base::Bind(NullTask),
-                        TimeDelta::FromMilliseconds(10));
+  loading_task_runner_->PostDelayedTask(FROM_HERE, base::BindOnce(NullTask),
+                                        TimeDelta::FromMilliseconds(10));
 
   std::unique_ptr<base::trace_event::ConvertableToTraceFormat> value =
       scheduler_->AsValue(base::TimeTicks());
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index 7bc2dd3f..6b758c26 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -795,6 +795,7 @@
     "//mojo/common:common_custom_types",
     "//services/network/public/interfaces:interfaces",
     "//services/service_manager/public/interfaces",
+    "//skia/public/interfaces",
     "//third_party/WebKit/common:mojo_platform_bindings",
     "//ui/gfx/geometry/mojo",
     "//url/mojo:url_mojom_gurl",
diff --git a/third_party/WebKit/public/blink_typemaps.gni b/third_party/WebKit/public/blink_typemaps.gni
index 535da553..b2be8d2 100644
--- a/third_party/WebKit/public/blink_typemaps.gni
+++ b/third_party/WebKit/public/blink_typemaps.gni
@@ -13,5 +13,6 @@
   "//services/viz/public/cpp/compositing/surface_id.typemap",
   "//services/viz/public/cpp/compositing/surface_info.typemap",
   "//services/viz/public/cpp/compositing/surface_sequence.typemap",
+  "//skia/public/interfaces/skbitmap_for_blink.typemap",
   "//ui/gfx/mojo/gpu_fence_handle_for_blink.typemap",
 ]
diff --git a/third_party/WebKit/public/platform/web_feature.mojom b/third_party/WebKit/public/platform/web_feature.mojom
index dab69f9..fbeb7b7b60 100644
--- a/third_party/WebKit/public/platform/web_feature.mojom
+++ b/third_party/WebKit/public/platform/web_feature.mojom
@@ -1692,7 +1692,6 @@
   kCrossOriginWorkerTextHtml = 2184,
   kCrossOriginWorkerTextPlain = 2185,
   kCrossOriginWorkerTextXml = 2186,
-  kImageCaptureSetOptions = 2187,
   kPerformanceObserverForWindow = 2188,
   kPerformanceObserverForWorker = 2189,
   kPaintTimingObserved = 2190,
diff --git a/third_party/WebKit/public/web/WebAXEnums.h b/third_party/WebKit/public/web/WebAXEnums.h
index 43d4df5..9f6a9443 100644
--- a/third_party/WebKit/public/web/WebAXEnums.h
+++ b/third_party/WebKit/public/web/WebAXEnums.h
@@ -245,6 +245,14 @@
   kWebAXExpandedExpanded
 };
 
+// Selected State.
+// These values must match blink::AccessibilitySelectedState values.
+enum WebAXSelectedState {
+  kWebAXSelectedStateUndefined = 0,
+  kWebAXSelectedStateFalse,
+  kWebAXSelectedStateTrue
+};
+
 // These values must match blink::AccessibilityOrientation values.
 // Enforced in AssertMatchingEnums.cpp.
 enum WebAXOrientation {
diff --git a/third_party/WebKit/public/web/WebAXObject.h b/third_party/WebKit/public/web/WebAXObject.h
index 0a69d583..fbce0d4 100644
--- a/third_party/WebKit/public/web/WebAXObject.h
+++ b/third_party/WebKit/public/web/WebAXObject.h
@@ -146,7 +146,7 @@
   BLINK_EXPORT bool IsOffScreen() const;
   BLINK_EXPORT bool IsPasswordField() const;
   BLINK_EXPORT bool IsRequired() const;
-  BLINK_EXPORT bool IsSelected() const;
+  BLINK_EXPORT WebAXSelectedState IsSelected() const;
   BLINK_EXPORT bool IsSelectedOptionActive() const;
   BLINK_EXPORT bool IsVisible() const;
   BLINK_EXPORT bool IsVisited() const;
@@ -156,7 +156,6 @@
   BLINK_EXPORT bool CanPress() const;
   BLINK_EXPORT bool CanSetValueAttribute() const;
   BLINK_EXPORT bool CanSetFocusAttribute() const;
-  BLINK_EXPORT bool CanSetSelectedAttribute() const;
   BLINK_EXPORT unsigned GetColor() const;
   // Deprecated.
   BLINK_EXPORT void ColorValue(int& r, int& g, int& b) const;
diff --git a/third_party/android_crazy_linker/README.chromium b/third_party/android_crazy_linker/README.chromium
index 565a58f..1589b139 100644
--- a/third_party/android_crazy_linker/README.chromium
+++ b/third_party/android_crazy_linker/README.chromium
@@ -89,3 +89,7 @@
 
 - Start zip EOCD signature search at size of EOCD record bytes from file end.
 
+- Add custom operator new(size_t) and operator delete(void*) in order to
+  reduce the size of the final binaries (24 kiB on ARM, 64 kiB on AARCH4).
+
+- Allow client disable debugger support.
diff --git a/third_party/android_crazy_linker/src/include/crazy_linker.h b/third_party/android_crazy_linker/src/include/crazy_linker.h
index 347cd7c..dcf91055 100644
--- a/third_party/android_crazy_linker/src/include/crazy_linker.h
+++ b/third_party/android_crazy_linker/src/include/crazy_linker.h
@@ -35,6 +35,13 @@
 // Maximum path length of a file in a zip file.
 const size_t kMaxFilePathLengthInZip = 256;
 
+// Enable or disable debugger support. Disabling debugger support makes
+// shared libraries loaded by the crazy linker invisible to GDB (though they
+// will still be visible in stack traces and Breakpad minidumps), but allows
+// rare runtime crashes on certain Android devices. For more details, see
+// https://crbug.com/796938.
+void crazy_set_debugger_support(bool enabled) _CRAZY_PUBLIC;
+
 // Status values returned by crazy linker functions to indicate
 // success or failure. They were chosen to match boolean values,
 // this allows one to test for failures with:
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
index d0ac3a55..6148509 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
@@ -65,6 +65,11 @@
 
 extern "C" {
 
+void crazy_set_debugger_support(bool enabled) {
+  ScopedGlobalLock lock;
+  Globals::GetRDebug()->SetDebuggerSupport(enabled);
+}
+
 void crazy_set_sdk_build_version(int sdk_build_version) {
   *Globals::GetSDKBuildVersion() = sdk_build_version;
 }
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_debug.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_debug.cpp
index 0730a637..3d692d5 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_debug.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_debug.cpp
@@ -12,6 +12,7 @@
 #endif
 #include <stdarg.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 namespace crazy {
 
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.cpp
index fd410c46..b75ece1 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.cpp
@@ -13,8 +13,8 @@
 #include "crazy_linker_debug.h"
 #include "crazy_linker_globals.h"
 #include "crazy_linker_proc_maps.h"
-#include "crazy_linker_util.h"
 #include "crazy_linker_system.h"
+#include "crazy_linker_util.h"
 #include "elf_traits.h"
 
 namespace crazy {
@@ -213,6 +213,7 @@
   // The address of '_r_debug' is in the DT_DEBUG entry of the current
   // executable.
   init_ = true;
+  call_r_brk_ = true;
 
   size_t dynamic_addr = 0;
   size_t dynamic_size = 0;
@@ -277,6 +278,23 @@
   return false;
 }
 
+void RDebug::SetDebuggerSupport(bool enabled) {
+  LOG("%s: Setting debugger support to: %s", __FUNCTION__,
+      enabled ? "enabled" : "DISABLED");
+  call_r_brk_ = enabled;
+}
+
+bool RDebug::GetDebuggerSupport() const {
+  return call_r_brk_;
+}
+
+void RDebug::CallRBrk(int state) {
+  if (call_r_brk_) {
+    r_debug_->r_state = state;
+    r_debug_->r_brk();
+  }
+}
+
 namespace {
 
 // Helper class providing a simple scoped pthreads mutex.
@@ -435,10 +453,6 @@
     return;
   }
 
-  // Tell GDB the list is going to be modified.
-  r_debug_->r_state = RT_ADD;
-  r_debug_->r_brk();
-
   // IMPORTANT: GDB expects the first entry in the list to correspond
   // to the executable. So add our new entry just after it. This is ok
   // because by default, the linker is always the second entry, as in:
@@ -465,6 +479,9 @@
     return;
   }
 
+  // Tell GDB the list is going to be modified.
+  CallRBrk(RT_ADD);
+
   link_map_t* before = r_debug_->r_map->l_next;
   link_map_t* after = before->l_next;
 
@@ -479,9 +496,8 @@
   WriteLinkMapField(&before->l_next, entry);
   WriteLinkMapField(&after->l_prev, entry);
 
-  // Tell GDB that the list modification has completed.
-  r_debug_->r_state = RT_CONSISTENT;
-  r_debug_->r_brk();
+  // Tell GDB the list modification has completed.
+  CallRBrk(RT_CONSISTENT);
 }
 
 void RDebug::DelEntryImpl(link_map_t* entry) {
@@ -491,8 +507,7 @@
     return;
 
   // Tell GDB the list is going to be modified.
-  r_debug_->r_state = RT_DELETE;
-  r_debug_->r_brk();
+  CallRBrk(RT_DELETE);
 
   // IMPORTANT: Before modifying the previous and next entries in the
   // list, ensure that they are writable. See comment above for more
@@ -509,8 +524,7 @@
   entry->l_next = NULL;
 
   // Tell GDB the list modification has completed.
-  r_debug_->r_state = RT_CONSISTENT;
-  r_debug_->r_brk();
+  CallRBrk(RT_CONSISTENT);
 }
 
 }  // namespace crazy
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.h b/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.h
index aacc21a..0030399 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.h
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_rdebug.h
@@ -197,6 +197,17 @@
 
   r_debug* GetAddress() { return r_debug_; }
 
+  // Debugger support, which is the default, implies calling the special
+  // hook function r_brk(). Unfortunately, this sometimes results in rare
+  // runtime crashes (see https://crbug.com/796938). This method allows the
+  // client to disable this operation. If |enabled| is false, shared
+  // libraries loaded through the crazy linker will *not* be visible to GDB
+  // (but will continue to appear in stack traces).
+  void SetDebuggerSupport(bool enabled);
+
+  // Return the state of debugger support.
+  bool GetDebuggerSupport() const;
+
  private:
   // Try to find the address of the global _r_debug variable, even
   // though there is no symbol for it. Returns true on success.
@@ -234,12 +245,20 @@
       (*handler)(this, entry);
   }
 
+  // Call the debugger hook function |r_debug_->r_brk|.
+  // |state| is the value to write to |r_debug_->r_state|
+  // before that. This is done to coordinate with the
+  // debugger when modifications of the global |r_debug_|
+  // list are performed.
+  void CallRBrk(int state);
+
   RDebug(const RDebug&);
   RDebug& operator=(const RDebug&);
 
   r_debug* r_debug_;
   bool init_;
   bool readonly_entries_;
+  bool call_r_brk_;
   rdebug_callback_poster_t post_for_later_execution_;
   void* post_for_later_execution_context_;
 };
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp
index d2f0734..d676896 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp
@@ -10,6 +10,10 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
+#ifdef __ANDROID__
+#include <android/log.h>
+#endif
+
 #include "crazy_linker_util.h"
 
 // Note: unit-testing support files are in crazy_linker_files_mock.cpp
@@ -49,7 +53,14 @@
 void FileDescriptor::Close() {
   if (fd_ != -1) {
     int old_errno = errno;
-    TEMP_FAILURE_RETRY(close(fd_));
+    // SUBTLE: Do not loop when close() returns EINTR. On Linux, this simply
+    // means that a corresponding flush operation failed, but the file
+    // descriptor will always be closed anyway.
+    //
+    // Other platforms have different behavior: e.g. on OS X, this could be
+    // the result of an interrupt, and there is no reliable way to know
+    // whether the fd was closed or not on exit :-(
+    (void)close(fd_);
     errno = old_errno;
     fd_ = -1;
   }
@@ -88,3 +99,77 @@
 #endif  // !UNIT_TESTS
 
 }  // namespace crazy
+
+// Custom implementation of new and malloc, this prevents dragging
+// the libc++ implementation, which drags exception-related machine
+// code that is not needed here. This helps reduce the size of the
+// final binary considerably.
+
+// IMPORTANT: These symbols are not exported by the crazy linker, thus this
+//            does not affect the libraries that it will load, only the
+//            linker binary itself!
+//
+void* operator new(size_t size) {
+  void* ptr = ::malloc(size);
+  if (ptr != nullptr)
+    return ptr;
+
+  // Don't assume it is possible to call any C library function like
+  // snprintf() here, since it might allocate heap memory and crash at
+  // runtime. Hence our fatal message does not contain the number of
+  // bytes requested by the allocation.
+  static const char kFatalMessage[] = "Out of memory!";
+#ifdef __ANDROID__
+  __android_log_write(ANDROID_LOG_FATAL, "crazy_linker", kFatalMessage);
+#else
+  ::write(STDERR_FILENO, kFatalMessage, sizeof(kFatalMessage) - 1);
+#endif
+  _exit(1);
+#if defined(__GNUC__)
+  __builtin_unreachable();
+#endif
+
+  // NOTE: Adding a 'return nullptr' here will make the compiler error
+  // with a message stating that 'operator new(size_t)' is not allowed
+  // to return nullptr.
+  //
+  // Indeed, an new expression like 'new T' shall never return nullptr,
+  // according to the C++ specification, and an optimizing compiler will gladly
+  // remove any null-checks after them (something the Fuschsia team had to
+  // learn the hard way when writing their kernel in C++). What is meant here
+  // is something like:
+  //
+  //   Foo* foo = new Foo(10);
+  //   if (!foo) {                             <-- entire check and branch
+  //      ... Handle out-of-memory condition.  <-- removed by an optimizing
+  //   }                                       <-- compiler.
+  //
+  // Note that some C++ library implementations (e.g. recent libc++) recognize
+  // when they are compiled with -fno-exceptions and provide a simpler version
+  // of operator new that can return nullptr. However, it is very hard to
+  // guarantee at build time that this code is linked against such a version
+  // of the runtime. Moreoever, technically disabling exceptions is completely
+  // out-of-spec regarding the C++ language, and what the compiler is allowed
+  // to do in this case is mostly implementation-defined, so better be safe
+  // than sorry here.
+  //
+  // C++ provides a non-throwing new expression that can return a nullptr
+  // value, but it must be written as 'new (std::nothrow) T' instead of
+  // 'new T', and thus nobody uses this. This ends up calling
+  // 'operator new(size_t, const std::nothrow_t&)' which is not implemented
+  // here.
+}
+
+void* operator new[](size_t size) {
+  return operator new(size);
+}
+
+void operator delete(void* ptr) {
+  // The compiler-generated code already checked that |ptr != nullptr|
+  // so don't to it a second time.
+  ::free(ptr);
+}
+
+void operator delete[](void* ptr) {
+  ::free(ptr);
+}
diff --git a/third_party/ashmem/README.chromium b/third_party/ashmem/README.chromium
index 833e1f5..36f8f77b 100644
--- a/third_party/ashmem/README.chromium
+++ b/third_party/ashmem/README.chromium
@@ -4,3 +4,7 @@
 Version: 7203eb2a8a29a7b721a48cd291700f38f3da1456
 Security Critical: yes
 License: Apache 2.0
+Patches:
+  0001-Add-ashmem-get-prot-region.path:
+     Add ashmem_get_prot_region() declaration and implementation to return
+     the current protection mask of a given Ashmem region.
diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c
index 2303369d..52b3f47 100644
--- a/third_party/ashmem/ashmem-dev.c
+++ b/third_party/ashmem/ashmem-dev.c
@@ -72,6 +72,11 @@
 	return ioctl(fd, ASHMEM_SET_PROT_MASK, prot);
 }
 
+int ashmem_get_prot_region(int fd)
+{
+	return ioctl(fd, ASHMEM_GET_PROT_MASK);
+}
+
 int ashmem_pin_region(int fd, size_t offset, size_t len)
 {
 	struct ashmem_pin pin = { offset, len };
diff --git a/third_party/ashmem/ashmem.h b/third_party/ashmem/ashmem.h
index 7d411cc..d8afccbd 100644
--- a/third_party/ashmem/ashmem.h
+++ b/third_party/ashmem/ashmem.h
@@ -18,6 +18,7 @@
 
 int ashmem_create_region(const char *name, size_t size);
 int ashmem_set_prot_region(int fd, int prot);
+int ashmem_get_prot_region(int fd);
 int ashmem_pin_region(int fd, size_t offset, size_t len);
 int ashmem_unpin_region(int fd, size_t offset, size_t len);
 int ashmem_get_size_region(int fd);
diff --git a/third_party/ashmem/patches/0001-Add-ashmem-get-prot-region.patch b/third_party/ashmem/patches/0001-Add-ashmem-get-prot-region.patch
new file mode 100644
index 0000000..5bba42dc
--- /dev/null
+++ b/third_party/ashmem/patches/0001-Add-ashmem-get-prot-region.patch
@@ -0,0 +1,28 @@
+diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c
+index 2303369d8167..52b3f47eeae0 100644
+--- a/third_party/ashmem/ashmem-dev.c
++++ b/third_party/ashmem/ashmem-dev.c
+@@ -72,6 +72,11 @@ int ashmem_set_prot_region(int fd, int prot)
+ 	return ioctl(fd, ASHMEM_SET_PROT_MASK, prot);
+ }
+ 
++int ashmem_get_prot_region(int fd)
++{
++	return ioctl(fd, ASHMEM_GET_PROT_MASK);
++}
++
+ int ashmem_pin_region(int fd, size_t offset, size_t len)
+ {
+ 	struct ashmem_pin pin = { offset, len };
+diff --git a/third_party/ashmem/ashmem.h b/third_party/ashmem/ashmem.h
+index 7d411cc064ba..d8afccbd2a6e 100644
+--- a/third_party/ashmem/ashmem.h
++++ b/third_party/ashmem/ashmem.h
+@@ -18,6 +18,7 @@ extern "C" {
+ 
+ int ashmem_create_region(const char *name, size_t size);
+ int ashmem_set_prot_region(int fd, int prot);
++int ashmem_get_prot_region(int fd);
+ int ashmem_pin_region(int fd, size_t offset, size_t len);
+ int ashmem_unpin_region(int fd, size_t offset, size_t len);
+ int ashmem_get_size_region(int fd);
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 78c90db9..b11c2f88 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -17517,7 +17517,7 @@
   <int value="2184" label="CrossOriginWorkerTextHtml"/>
   <int value="2185" label="CrossOriginWorkerTextPlain"/>
   <int value="2186" label="CrossOriginWorkerTextXml"/>
-  <int value="2187" label="ImageCaptureSetOptions"/>
+  <int value="2187" label="OBSOLETE_ImageCaptureSetOptions"/>
   <int value="2188" label="PerformanceObserverForWindow"/>
   <int value="2189" label="PerformanceObserverForWorker"/>
   <int value="2190" label="PaintTimingObserved"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index e1204b4..7ed52d58d 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -88465,6 +88465,15 @@
   </summary>
 </histogram>
 
+<histogram name="Sync.SesssionsDuplicateSyncId" units="count">
+  <owner>skym@chromium.org</owner>
+  <summary>
+    https://crbug.com/639009, count of duplicate sync ids (tab node id) when any
+    are encountered. Likely caused from a persistence race between native tab
+    storage and sync db on Android. Should be trending to zero.
+  </summary>
+</histogram>
+
 <histogram name="Sync.Shutdown.BackendDestroyedTime" units="ms">
   <owner>zea@chromium.org</owner>
   <summary>
@@ -111798,6 +111807,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="TaskSchedulerName" separator=".">
+  <suffix base="true" name="Browser"
+      label="TaskScheduler for the browser process."/>
   <suffix base="true" name="Renderer"
       label="TaskSchedulers for renderer processes."/>
   <suffix base="true" name="ContentChild"
@@ -111916,13 +111927,28 @@
       Deprecated 01/2018. In favor of TaskSchedulerName suffix.
     </obsolete>
   </suffix>
-  <affected-histogram name="TaskScheduler.DetachDuration"/>
+  <affected-histogram name="TaskScheduler.DetachDuration">
+    <obsolete>
+      Deprecated 01/2018. In favor of explicit .Browser suffix.
+    </obsolete>
+  </affected-histogram>
+  <affected-histogram name="TaskScheduler.DetachDuration.Browser"/>
   <affected-histogram name="TaskScheduler.DetachDuration.ContentChild"/>
   <affected-histogram name="TaskScheduler.DetachDuration.Renderer"/>
-  <affected-histogram name="TaskScheduler.NumTasksBeforeDetach"/>
+  <affected-histogram name="TaskScheduler.NumTasksBeforeDetach">
+    <obsolete>
+      Deprecated 01/2018. In favor of explicit .Browser suffix.
+    </obsolete>
+  </affected-histogram>
+  <affected-histogram name="TaskScheduler.NumTasksBeforeDetach.Browser"/>
   <affected-histogram name="TaskScheduler.NumTasksBeforeDetach.ContentChild"/>
   <affected-histogram name="TaskScheduler.NumTasksBeforeDetach.Renderer"/>
-  <affected-histogram name="TaskScheduler.NumTasksBetweenWaits"/>
+  <affected-histogram name="TaskScheduler.NumTasksBetweenWaits">
+    <obsolete>
+      Deprecated 01/2018. In favor of explicit .Browser suffix.
+    </obsolete>
+  </affected-histogram>
+  <affected-histogram name="TaskScheduler.NumTasksBetweenWaits.Browser"/>
   <affected-histogram name="TaskScheduler.NumTasksBetweenWaits.ContentChild"/>
   <affected-histogram name="TaskScheduler.NumTasksBetweenWaits.Renderer"/>
   <affected-histogram name="TaskScheduler.TaskLatency">
diff --git a/tools/perf/chromium.perf.fyi.extras.json b/tools/perf/chromium.perf.fyi.extras.json
index c8fe61c7..5c4ca2eb 100644
--- a/tools/perf/chromium.perf.fyi.extras.json
+++ b/tools/perf/chromium.perf.fyi.extras.json
@@ -481,43 +481,7 @@
           "ignore_task_failure": false,
           "io_timeout": 360
         }
-      }
-    ]
-  },
-  "Linux ChromeOS Perf (mus-viz)": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "smoothness.top_25_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=exact",
-          "--browser-executable=./chrome"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.top_25_smooth",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "id": "build34-a1",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      }
-    ]
-  },
-  "OOP Raster Perf": {
-    "isolated_scripts": [
+      },
       {
         "args": [
           "smoothness.oop_rasterization.top_25_smooth",
@@ -572,6 +536,39 @@
           "io_timeout": 360
         }
       }
+
+    ]
+  },
+  "Linux ChromeOS Perf (mus-viz)": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "smoothness.top_25_smooth",
+          "-v",
+          "--upload-results",
+          "--output-format=chartjson",
+          "--browser=exact",
+          "--browser-executable=./chrome"
+        ],
+        "isolate_name": "telemetry_perf_tests",
+        "name": "smoothness.top_25_smooth",
+        "override_compile_targets": [
+          "telemetry_perf_tests"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "id": "build34-a1",
+              "pool": "Chrome-perf-fyi"
+            }
+          ],
+          "expiration": 36000,
+          "hard_timeout": 10800,
+          "ignore_task_failure": false,
+          "io_timeout": 3600
+        }
+      }
     ]
   }
 }
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 41497d3..494bfda6 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -112,6 +112,7 @@
 crbug.com/667432 [ All ] smoothness.gpu_rasterization.top_25_smooth/Pinterest [ Skip ]
 crbug.com/667432 [ All ] smoothness.gpu_rasterization.top_25_smooth/http://www.amazon.com [ Skip ]
 crbug.com/528474 [ All ] smoothness.gpu_rasterization.top_25_smooth/http://www.cnn.com [ Skip ]
+crbug.com/803869 [ Nexus_5X ] smoothness.gpu_rasterization.top_25_smooth/http://www.youtube.com [ Skip ]
 
 # Benchmark: smoothness.key_desktop_move_cases
 crbug.com/750131 [ Win ] smoothness.key_desktop_move_cases/https://mail.google.com/mail/ [ Skip ]
@@ -307,6 +308,7 @@
 crbug.com/708300 [ Mobile ] v8.browsing_mobile/browse:shopping:flipkart [ Skip ]
 [ Android_Webview ] v8.browsing_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/803465 [ Nexus_5 ] v8.browsing_mobile/browse:chrome:newtab [ Skip ]
+crbug.com/803870 [ Cherry_Mobile_Android_One ] v8.browsing_mobile/browse:social:tumblr_infinite_scroll [ Skip ]
 crbug.com/799080 [ Nexus_7 ] v8.browsing_mobile-future/browse:news:cnn [ Skip ]
 
 # Benchmark: v8.browsing_mobile-future
diff --git a/tools/perf/generate_profile b/tools/perf/generate_profile
deleted file mode 100755
index d477115..0000000
--- a/tools/perf/generate_profile
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import os
-import sys
-
-from chrome_telemetry_build import chromium_config
-sys.path.insert(1, chromium_config.GetTelemetryDir())
-
-from profile_creators import profile_generator
-
-if __name__ == '__main__':
-  sys.exit(profile_generator.Main())
diff --git a/tools/perf/page_sets/dual_browser_story.py b/tools/perf/page_sets/dual_browser_story.py
index 30e015b..a6fbd1ac 100644
--- a/tools/perf/page_sets/dual_browser_story.py
+++ b/tools/perf/page_sets/dual_browser_story.py
@@ -80,8 +80,8 @@
     extra_browser_types = set(story.browser_type for story in story_set)
     extra_browser_types.remove('default')  # Must include 'default' browser.
     for browser_type in extra_browser_types:
-      options = _OptionsForBrowser(browser_type, finder_options)
-      if not self._PrepareBrowser(browser_type, options):
+      finder_options_copy = _OptionsForBrowser(browser_type, finder_options)
+      if not self._PrepareBrowser(browser_type, finder_options_copy):
         logging.warning(
           'Cannot run %s (%s) because %s browser is not available',
           test.__name__, str(test), browser_type)
@@ -109,7 +109,7 @@
   def platform(self):
     return self._platform
 
-  def _PrepareBrowser(self, browser_type, options):
+  def _PrepareBrowser(self, browser_type, finder_options):
     """Add a browser to the dict of possible browsers.
 
     TODO(perezju): When available, use the GetBrowserForPlatform API instead.
@@ -118,7 +118,7 @@
     Returns:
       The possible browser if found, or None otherwise.
     """
-    possible_browser = browser_finder.FindBrowser(options)
+    possible_browser = browser_finder.FindBrowser(finder_options)
     if possible_browser is None:
       return None
 
@@ -126,7 +126,8 @@
       self._platform = possible_browser.platform
     else:
       assert self._platform is possible_browser.platform
-    self._possible_browsers[browser_type] = (possible_browser, options)
+    self._possible_browsers[browser_type] = (
+        possible_browser, finder_options.browser_options)
     return possible_browser
 
   def _CreateAllBrowsersIfNeeeded(self):
@@ -139,20 +140,26 @@
     if self._browsers_created:
       return
     for browser_type in self._browsers:
-      possible_browser, options = self._possible_browsers[browser_type]
-      self._browsers[browser_type] = possible_browser.Create(options)
+      possible_browser, browser_options = self._possible_browsers[browser_type]
+      possible_browser.SetUpEnvironment(browser_options)
+      self._browsers[browser_type] = possible_browser.Create()
     self._browsers_created = True
 
   def _CloseAllBrowsers(self):
     """Close all of the browsers that were launched for this benchmark."""
-    if not self._browsers_created:
-      return
-    for browser_type, browser in self._browsers.iteritems():
+    for browser_type, browser in list(self._browsers.iteritems()):
+      if browser is not None:
+        try:
+          browser.Close()
+        except Exception:
+          logging.exception('Error while closing %s browser', browser_type)
+        self._browsers[browser_type] = None
+      possible_browser, _ = self._possible_browsers[browser_type]
       try:
-        browser.Close()
+        possible_browser.CleanUpEnvironment()
       except Exception:
-        logging.exception('Error while closing %s browser', browser_type)
-      self._browsers[browser_type] = None
+        logging.exception(
+            'Error while cleaning up environment for %s', browser_type)
     self._browsers_created = False
 
   def CanRunStory(self, _):
diff --git a/tools/perf/page_sets/extension_profile_shared_state.py b/tools/perf/page_sets/extension_profile_shared_state.py
deleted file mode 100644
index a0b4bab2..0000000
--- a/tools/perf/page_sets/extension_profile_shared_state.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2015 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.
-
-import shutil
-
-from profile_creators import extension_profile_extender
-from profile_creators import profile_generator
-from telemetry.page import shared_page_state
-
-
-class ExtensionProfileSharedState(shared_page_state.SharedPageState):
-  """Shared state tied with extension profile.
-
-  Generates extension profile on initialization.
-  """
-
-  def __init__(self, test, finder_options, story_set):
-    super(ExtensionProfileSharedState, self).__init__(
-        test, finder_options, story_set)
-    generator = profile_generator.ProfileGenerator(
-        extension_profile_extender.ExtensionProfileExtender,
-        'extension_profile')
-    self._out_dir, self._owns_out_dir = generator.Run(finder_options)
-    if self._out_dir:
-      finder_options.browser_options.profile_dir = self._out_dir
-    else:
-      finder_options.browser_options.dont_override_profile = True
-
-  def TearDownState(self):
-    """Clean up generated profile directory."""
-    super(ExtensionProfileSharedState, self).TearDownState()
-    if self._owns_out_dir:
-      shutil.rmtree(self._out_dir)
diff --git a/tools/perf/page_sets/pregenerated_large_profile_shared_state.py b/tools/perf/page_sets/pregenerated_large_profile_shared_state.py
deleted file mode 100644
index 3f81b3a..0000000
--- a/tools/perf/page_sets/pregenerated_large_profile_shared_state.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 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.
-import os
-
-from page_sets import pregenerated_profile_shared_state
-
-
-class PregeneratedLargeProfileSharedState(
-    pregenerated_profile_shared_state.PregeneratedProfileSharedState):
-  def __init__(self, test, finder_options, story_set):
-    super(PregeneratedLargeProfileSharedState, self).__init__(
-        test, finder_options, story_set)
-    perf_dir = os.path.normpath(
-        os.path.join(os.path.dirname(__file__), os.path.pardir))
-    self._pregenerated_profile_archive_dir = os.path.join(
-        perf_dir, 'generated_profiles', self._possible_browser.target_os,
-        'large_profile.zip')
diff --git a/tools/perf/page_sets/pregenerated_profile_shared_state.py b/tools/perf/page_sets/pregenerated_profile_shared_state.py
deleted file mode 100644
index 4f7cb02..0000000
--- a/tools/perf/page_sets/pregenerated_profile_shared_state.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright 2016 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.
-import logging
-import os
-import shutil
-import sys
-import tempfile
-import zipfile
-
-from py_utils import cloud_storage
-
-from telemetry.page import shared_page_state
-
-
-class PregeneratedProfileSharedState(shared_page_state.SharedPageState):
-  def __init__(self, test, finder_options, story_set):
-    super(PregeneratedProfileSharedState, self).__init__(
-        test, finder_options, story_set)
-    self._unzipped_profile = None
-    self._migrated_profile = None
-    self._pregenerated_profile_archive_dir = None
-
-  def WillRunStory(self, page):
-    if self._ShouldDownloadPregeneratedProfileArchive():
-      self._DownloadPregeneratedProfileArchive()
-
-      if self._ShouldMigrateProfile():
-        self._MigratePregeneratedProfile()
-    super(PregeneratedProfileSharedState, self).WillRunStory(page)
-
-  def TearDownState(self):
-    if self._unzipped_profile:
-      shutil.rmtree(self._unzipped_profile)
-      self._unzipped_profile = None
-    if self._migrated_profile:
-      shutil.rmtree(self._migrated_profile)
-      self._migrated_profile = None
-    super(PregeneratedProfileSharedState, self).TearDownState()
-
-  def _ShouldDownloadPregeneratedProfileArchive(self):
-    """Whether to download a pre-generated profile archive."""
-    if not self._pregenerated_profile_archive_dir:
-      return False
-
-    if self._finder_options.browser_options.profile_dir:
-      logging.warning("Profile directory specified on command line: %s, this"
-                      "overrides the benchmark's default profile directory.",
-                      self._finder_options.browser_options.profile_dir)
-      return False
-
-    if self._possible_browser.IsRemote():
-      return False
-
-    return True
-
-  def _DownloadPregeneratedProfileArchive(self):
-    """Download and extract the profile directory archive if one exists.
-
-    On success, updates self._finder_options.browser_options.profile_dir with
-    the directory of the extracted profile.
-    """
-    try:
-      cloud_storage.GetIfChanged(self._pregenerated_profile_archive_dir,
-                                 cloud_storage.PUBLIC_BUCKET)
-    except (cloud_storage.CredentialsError,
-            cloud_storage.PermissionError) as e:
-      if os.path.exists(self._pregenerated_profile_archive_dir):
-        # If the profile directory archive exists, assume the user has their
-        # own local copy simply warn.
-        logging.warning('Could not download Profile archive: %s',
-                        self._pregenerated_profile_archive_dir)
-      else:
-        # If the archive profile directory doesn't exist, this is fatal.
-        logging.error('Can not run without required profile archive: %s. '
-                      'If you believe you have credentials, follow the '
-                      'instructions below.',
-                      self._pregenerated_profile_archive_dir)
-        logging.error(str(e))
-        sys.exit(-1)
-
-    # Check to make sure the zip file exists.
-    if not os.path.isfile(self._pregenerated_profile_archive_dir):
-      raise Exception("Profile directory archive not downloaded: ",
-                      self._pregenerated_profile_archive_dir)
-
-    # The location to extract the profile into.
-    self._unzipped_profile = tempfile.mkdtemp()
-    profile_archive_path_basename = os.path.basename(
-        self._pregenerated_profile_archive_dir)
-    extracted_profile_dir_path = os.path.join(
-        self._unzipped_profile,
-        os.path.splitext(profile_archive_path_basename)[0])
-
-    # Unzip profile directory.
-    with zipfile.ZipFile(self._pregenerated_profile_archive_dir) as f:
-      try:
-        f.extractall(self._unzipped_profile)
-      except Exception as e:
-        # Cleanup any leftovers from unzipping.
-        shutil.rmtree(self._unzipped_profile)
-        logging.error("Error extracting profile directory zip file: %s", e)
-        sys.exit(-1)
-
-    if not os.path.exists(extracted_profile_dir_path):
-      raise Exception("Failed to extract profile: ",
-                      extracted_profile_dir_path)
-
-    # Run with freshly extracted profile directory.
-    logging.info("Using profile archive directory: %s",
-                 extracted_profile_dir_path)
-    self._finder_options.browser_options.profile_dir = (
-        extracted_profile_dir_path)
-
-  def _ShouldMigrateProfile(self):
-    return not self._migrated_profile
-
-  def _MigrateProfile(self, finder_options, found_browser,
-                      initial_profile, final_profile):
-    """Migrates a profile to be compatible with a newer version of Chrome.
-
-    Launching Chrome with the old profile will perform the migration.
-    """
-    # Save the current input and output profiles.
-    saved_input_profile = finder_options.browser_options.profile_dir
-    saved_output_profile = finder_options.browser_options.output_profile_path
-
-    # Set the input and output profiles.
-    finder_options.browser_options.profile_dir = initial_profile
-    finder_options.browser_options.output_profile_path = final_profile
-
-    # Launch the browser, then close it.
-    browser = found_browser.Create(finder_options)
-    browser.Close()
-
-    # Load the saved input and output profiles.
-    finder_options.browser_options.profile_dir = saved_input_profile
-    finder_options.browser_options.output_profile_path = saved_output_profile
-
-  def _MigratePregeneratedProfile(self):
-    """Migrates the pre-generated profile by launching Chrome with it.
-
-    On success, updates self._migrated_profile and
-    self._finder_options.browser_options.profile_dir with the directory of the
-    migrated profile.
-    """
-    self._migrated_profile = tempfile.mkdtemp()
-    logging.info("Starting migration of pre-generated profile to %s",
-                 self._migrated_profile)
-    pregenerated_profile = self._finder_options.browser_options.profile_dir
-
-    possible_browser = self._FindBrowser(self._finder_options)
-    self._MigrateProfile(self._finder_options, possible_browser,
-                         pregenerated_profile, self._migrated_profile)
-    self._finder_options.browser_options.profile_dir = self._migrated_profile
-    logging.info("Finished migration of pre-generated profile to %s",
-                 self._migrated_profile)
diff --git a/tools/perf/profile_creators/__init__.py b/tools/perf/profile_creators/__init__.py
deleted file mode 100644
index 29e73ca8..0000000
--- a/tools/perf/profile_creators/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Generators for Chrome profiles for testing purposes."""
-import os
-import sys
-
-sys.path.insert(1, os.path.abspath(os.path.join(
-    __file__, '..', '..')))
-from core import path_util
-
-
-path_util.AddTelemetryToPath()
-path_util.AddPyUtilsToPath()
diff --git a/tools/perf/profile_creators/cookie_profile_extender.py b/tools/perf/profile_creators/cookie_profile_extender.py
deleted file mode 100644
index c75f32c..0000000
--- a/tools/perf/profile_creators/cookie_profile_extender.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2015 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.
-import multiprocessing
-import os
-
-try:
-  import sqlite3  # Not present on ChromeOS DUT.
-except ImportError:
-  pass
-
-import page_sets
-
-from profile_creators import fast_navigation_profile_extender
-
-
-class CookieProfileExtender(
-    fast_navigation_profile_extender.FastNavigationProfileExtender):
-  """This extender fills in the cookie database.
-
-  By default, Chrome purges the cookie DB down to 3300 cookies. However, it
-  won't purge cookies accessed in the last month. This means the extender needs
-  to be careful not to create an artificially high number of cookies.
-  """
-  _COOKIE_DB_EXPECTED_SIZE = 3300
-
-  def __init__(self, finder_options):
-    # The rate limiting factors are fetching network resources and executing
-    # javascript. There's not much to be done about the former, and having one
-    # tab per logical core appears close to optimum for the latter.
-    maximum_batch_size = multiprocessing.cpu_count()
-
-    # Web page replay cannot handle too many requests over a duration of 4
-    # minutes (maximum segment lifetime), as it may exhaust the socket pool.
-    # Artificially limit the rate to no more than 5 simultaneous tab loads.
-    if not finder_options.use_live_sites:
-      maximum_batch_size = min(5, maximum_batch_size)
-
-    super(CookieProfileExtender, self).__init__(
-        finder_options, maximum_batch_size)
-
-    # A list of urls that have not yet been navigated to. This list will shrink
-    # over time. Each navigation will add a diminishing number of new cookies,
-    # since there's a high probability that the cookie is already present.
-    self._page_set = page_sets.ProfileSafeUrlsPageSet()
-    urls = []
-    for story in self._page_set.stories:
-      urls.append(story.url)
-    self._navigation_urls = urls
-
-  def GetUrlIterator(self):
-    """Superclass override."""
-    return iter(self._navigation_urls)
-
-  def ShouldExitAfterBatchNavigation(self):
-    """Superclass override."""
-    return self._IsCookieDBFull()
-
-  def WebPageReplayArchivePath(self):
-    return self._page_set.WprFilePathForStory(
-        self._page_set.stories[0])
-
-  def FetchWebPageReplayArchives(self):
-    """Superclass override."""
-    self._page_set.wpr_archive_info.DownloadArchivesIfNeeded()
-
-  @staticmethod
-  def _CookieCountInDB(db_path):
-    """The number of cookies in the db at |db_path|."""
-    connection = sqlite3.connect(db_path)
-    try:
-      cursor = connection.cursor()
-      cursor.execute("select count(*) from cookies")
-      cookie_count = cursor.fetchone()[0]
-    except:
-      raise
-    finally:
-      connection.close()
-    return cookie_count
-
-  def _IsCookieDBFull(self):
-    """Chrome does not immediately flush cookies to its database. It's possible
-    that this method will return a false negative."""
-    cookie_db_path = os.path.join(self.profile_path, "Default", "Cookies")
-    try:
-      cookie_count = CookieProfileExtender._CookieCountInDB(cookie_db_path)
-    except sqlite3.OperationalError:
-      # There will occasionally be contention for the SQLite database. This
-      # shouldn't happen often, so ignore the errors.
-      return False
-
-    return cookie_count > CookieProfileExtender._COOKIE_DB_EXPECTED_SIZE
diff --git a/tools/perf/profile_creators/cookie_profile_extender_unittest.py b/tools/perf/profile_creators/cookie_profile_extender_unittest.py
deleted file mode 100644
index 8760159..0000000
--- a/tools/perf/profile_creators/cookie_profile_extender_unittest.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2015 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.
-import os
-import tempfile
-import unittest
-
-try:
-  import sqlite3  # Not present on ChromeOS.
-except ImportError:
-  pass
-
-
-from telemetry import decorators
-from profile_creators.cookie_profile_extender import CookieProfileExtender
-
-
-# Testing private method.
-# pylint: disable=protected-access
-class CookieProfileExtenderTest(unittest.TestCase):
-
-  def _CreateCookieTable(self, path):
-    connection = sqlite3.connect(path)
-    cursor = connection.cursor()
-    cursor.execute("CREATE TABLE cookies (url text)")
-    connection.commit()
-    connection.close()
-
-  def _AddCookiesToTable(self, path, count):
-    connection = sqlite3.connect(path)
-    cursor = connection.cursor()
-    for i in range(count):
-      cursor.execute("INSERT INTO cookies VALUES ('%s')" % i)
-    connection.commit()
-    connection.close()
-
-  @decorators.Disabled("chromeos")  # crbug.com/483212
-  def testCookieCount(self):
-    # Neither tempfile.TemporaryFile() nor tempfile.NamedTemporaryFile() work
-    # well here. The former doesn't work at all, since it doesn't guarantee a
-    # file-system visible path. The latter doesn't work well, since the
-    # returned file cannot be opened a second time on Windows. The returned
-    # file would have to be closed, and the method would need to be called with
-    # Delete=False, which makes its functionality no simpler than
-    # tempfile.mkstemp().
-    handle, path = tempfile.mkstemp()
-    try:
-      os.close(handle)
-
-      self._CreateCookieTable(path)
-      self.assertEquals(CookieProfileExtender._CookieCountInDB(path), 0)
-
-      self._AddCookiesToTable(path, 100)
-      self.assertEquals(CookieProfileExtender._CookieCountInDB(path), 100)
-    finally:
-      os.remove(path)
diff --git a/tools/perf/profile_creators/extension_profile_extender.py b/tools/perf/profile_creators/extension_profile_extender.py
deleted file mode 100644
index 52b46152a..0000000
--- a/tools/perf/profile_creators/extension_profile_extender.py
+++ /dev/null
@@ -1,175 +0,0 @@
-# Copyright 2015 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.
-
-import atexit
-import json
-import logging
-import os
-import shutil
-import sys
-import time
-import zipfile
-
-if sys.platform == 'win32':
-  import _winreg as winreg  # pylint: disable=import-error
-
-from profile_creators import profile_extender
-from py_utils import cloud_storage
-from telemetry.core import exceptions
-
-
-# Remote target upload directory in cloud storage for extensions.
-REMOTE_DIR = 'extension_set'
-
-# Target zip file.
-ZIP_NAME = 'extensions.zip'
-
-
-class InvalidExtensionArchiveError(exceptions.Error):
-  """Exception thrown when remote archive is invalid or malformed.
-
-  Remote archive should be located at REMOTE_DIR/ZIP_NAME. Upon failure,
-  prompts user to update remote archive using update_remote_extensions
-  script.
-  """
-
-  def __init__(self, msg=''):
-    msg += ('\nTry running\n'
-            '\tpython update_remote_extensions.py -e extension_set.csv\n'
-            'in src/tools/perf/profile_creator subdirectory.')
-    super(InvalidExtensionArchiveError, self).__init__(msg)
-
-
-class ExtensionProfileExtender(profile_extender.ProfileExtender):
-  """Creates a profile with many extensions."""
-
-  def __init__(self, finder_options):
-    super(ExtensionProfileExtender, self).__init__(finder_options)
-    self._extensions = []
-    self.finder_options.browser_options.disable_default_apps = False
-    self.finder_options.browser_options.AppendExtraBrowserArgs(
-        '--prompt-for-external-extensions=0')
-
-  def Run(self):
-    """Superclass override."""
-    # Download extensions from cloud and force-install extensions into profile.
-    local_extensions_dir = os.path.join(self.profile_path,
-                                        'external_extensions_crx')
-    self._DownloadRemoteExtensions(cloud_storage.PARTNER_BUCKET,
-                                   local_extensions_dir)
-    atexit.register(self._CleanUpExtensions)
-    self._LoadExtensions(local_extensions_dir, self.profile_path)
-    try:
-      self.SetUpBrowser()
-      self._WaitForExtensionsToLoad()
-    finally:
-      self.TearDownBrowser()
-
-  def _DownloadRemoteExtensions(self, remote_bucket, local_extensions_dir):
-    """Downloads and unzips archive of common extensions to disk.
-
-    Args:
-        remote_bucket: bucket to download remote archive from.
-        local_extensions_dir: destination extensions directory.
-
-    Raises:
-        InvalidExtensionArchiveError if remote archive is not found.
-    """
-    # Force Unix directory separator for remote path.
-    remote_zip_path = '%s/%s' % (REMOTE_DIR, ZIP_NAME)
-    local_zip_path = os.path.join(local_extensions_dir, ZIP_NAME)
-    try:
-      cloud_storage.Get(remote_bucket, remote_zip_path, local_zip_path)
-    except cloud_storage.ServerError:
-      raise InvalidExtensionArchiveError('Can\'t find archive at gs://%s/%s..'
-                                         % (remote_bucket, remote_zip_path))
-    try:
-      with zipfile.ZipFile(local_zip_path, 'r') as extensions_zip:
-        extensions_zip.extractall(local_extensions_dir)
-    finally:
-      os.remove(local_zip_path)
-
-  def _GetExtensionInfoFromCrx(self, crx_file):
-    """Retrieves version + name of extension from CRX archive."""
-    with zipfile.ZipFile(crx_file, 'r') as crx_zip:
-      manifest_contents = crx_zip.read('manifest.json')
-      decoded_manifest = json.loads(manifest_contents)
-      crx_version = decoded_manifest['version']
-      extension_name = decoded_manifest['name']
-    return (crx_version, extension_name)
-
-  def _LoadExtensions(self, local_extensions_dir, profile_dir):
-    """Loads extensions in _local_extensions_dir into user profile.
-
-    Extensions are loaded according to platform specifications at
-    https://developer.chrome.com/extensions/external_extensions.html
-
-    Args:
-        local_extensions_dir: directory containing CRX files.
-        profile_dir: target profile directory for the extensions.
-
-    Raises:
-        InvalidExtensionArchiveError if archive contains a non-CRX file.
-    """
-    ext_files = os.listdir(local_extensions_dir)
-    external_ext_dir = os.path.join(profile_dir, 'External Extensions')
-    os.makedirs(external_ext_dir)
-    for ext_file in ext_files:
-      ext_path = os.path.join(local_extensions_dir, ext_file)
-      if not ext_file.endswith('.crx'):
-        raise InvalidExtensionArchiveError('Archive contains non-crx file %s.'
-                                           % ext_file)
-      (version, name) = self._GetExtensionInfoFromCrx(ext_path)
-      ext_id = os.path.splitext(os.path.basename(ext_path))[0]
-      extension_info = {
-          'extension_id': ext_id,
-          'external_crx': ext_path,
-          'external_version': version,
-          '_comment': name
-      }
-      # Platform-specific external extension installation
-      if self.os_name == 'win':  # Windows
-        key_path = 'Software\\Google\\Chrome\\Extensions\\%s' % ext_id
-        self._WriteRegistryValue(key_path, 'Path', ext_path)
-        self._WriteRegistryValue(key_path, 'Version', version)
-      else:
-        extension_json_path = os.path.join(external_ext_dir, '%s.json' % ext_id)
-        with open(extension_json_path, 'w') as f:
-          f.write(json.dumps(extension_info))
-      self._extensions.append(ext_id)
-
-  def _WriteRegistryValue(self, key_path, name, value):
-    """Writes (or overwrites) registry value specified to HKCU\\key_path."""
-    with winreg.CreateKey(winreg.HKEY_CURRENT_USER, key_path) as key:
-      try:  # Does registry value already exist?
-        path_value = winreg.QueryValueEx(key, name)
-        if path_value != value:
-          logging.warning(
-              'Overwriting registry value %s\\%s:'
-              '\n%s with %s', key_path, name, path_value, value)
-      except OSError:
-        pass
-      winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value)
-
-  def _CleanUpExtensions(self):
-    """Cleans up registry keys or JSON files used to install extensions."""
-    if self.os_name == 'win':
-      for ext_id in self._extensions:
-        winreg.DeleteKey(winreg.HKEY_CURRENT_USER,
-                         'Software\\Google\\Chrome\\Extensions\\%s' % ext_id)
-    else:
-      to_remove = os.path.join(self.profile_path, 'External Extensions')
-      if os.path.exists(to_remove):
-        shutil.rmtree(to_remove)
-
-  def _WaitForExtensionsToLoad(self):
-    """Stall until browser has finished installing/loading all extensions."""
-    unloaded_extensions = set(self._extensions)
-    while unloaded_extensions:
-      loaded_extensions = set([key.extension_id for key in
-                               self.browser.extensions.keys()])
-      unloaded_extensions = unloaded_extensions - loaded_extensions
-      # There's no event signalling when browser finishes installing
-      # or loading an extension so re-check every 5 seconds.
-      time.sleep(5)
diff --git a/tools/perf/profile_creators/extension_profile_extender_unittest.py b/tools/perf/profile_creators/extension_profile_extender_unittest.py
deleted file mode 100644
index 6f5992d..0000000
--- a/tools/perf/profile_creators/extension_profile_extender_unittest.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2016 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.
-
-import os
-import shutil
-import tempfile
-
-from profile_creators import extension_profile_extender
-from telemetry import decorators
-from telemetry.testing import options_for_unittests
-from telemetry.testing import page_test_test_case
-
-
-class ExtensionProfileExtenderUnitTest(page_test_test_case.PageTestTestCase):
-  """Smoke test for creating an extension profile.
-
-     Creates an extension profile and verifies that it has non-empty contents.
-  """
-  # Should be enabled on mac, disabled because flaky: https://crbug.com/586362.
-  @decorators.Disabled('all')  # Extension generation only works on Mac for now.
-  def testExtensionProfileCreation(self):
-    tmp_dir = tempfile.mkdtemp()
-    files_in_crx_dir = 0
-    try:
-      options = options_for_unittests.GetCopy()
-      # TODO(eakuefner): Remove this after crrev.com/1874473006 rolls in.
-      try:
-        getattr(options, 'output_profile_path')
-        options.output_profile_path = tmp_dir
-      except AttributeError:
-        options.browser_options.output_profile_path = tmp_dir
-      extender = extension_profile_extender.ExtensionProfileExtender(options)
-      extender.Run()
-
-      crx_dir = os.path.join(tmp_dir, 'external_extensions_crx')
-      files_in_crx_dir = len(os.listdir(crx_dir))
-    finally:
-      shutil.rmtree(tmp_dir)
-    self.assertGreater(files_in_crx_dir, 0)
diff --git a/tools/perf/profile_creators/extension_set.csv b/tools/perf/profile_creators/extension_set.csv
deleted file mode 100644
index f3550987..0000000
--- a/tools/perf/profile_creators/extension_set.csv
+++ /dev/null
@@ -1,25 +0,0 @@
-# Fields automatically updated by update_remote_extensions.py.
-# Do not manually alter individual fields.
-# To manually add extension, append line:
-#     <extension_name>,<extension_id>,,
-# and run update_remote_extensions.py to update hash and version columns.
-# To manually remove extension, remove the entire line.
-extension_name,id,hash,version
-Avast Online Security,gomekmidlodglbbmalcneegieacbdmki,YTIzNDZlYjE4NWI5NzM4ZTExYTI0MDBhN2RkODg2ZGRiZTE5MTdlYg==,10.2.0.190
-Skype Click to Call,lifbcibllhkdhoafpjfnlhfpfgnpldfl,OWY2MTYwNDg0ZDkyNmNjZDlmMGNlMWUyOWFiNjJmMWMxZTY3N2ZlNw==,7.4.0.9058
-AdBlock,gighmmpiobklfepjocnamgkkbiglidom,NDNlMmEwZTNjMjFjNzk2OTQzMWFkMWYzYmZkM2Q2YjViODA0OTRkZQ==,2.36.2
-Bookmark Manager,gmlllbghnfkpflemihljekbapjopfjik,ZGJlNmRkMDE3N2I2ZTZlZmNjYjE5MTBkY2M5NDJkNTRlMDM3NTQ1Yg==,2.2015.611.10417
-Adblock Plus,cfhdojbkjhnklbpkdaibdccddilifddb,YjJhNjljMWFkNjFhNjA3ODk3OTJhNjVjZmY4ZTJmMzFkN2UyYzU0Nw==,1.9.1
-iLivid,nafaimnnclfjfedmmabolbppcngeolgf,MzdiZGE1NmRjODRlOTZjNmIwYTM0ZDVjYjJhYzcxZGJmOGZiYjg0YQ==,1.1
-SiteAdvisor,fheoggkfdfchfphceeifdbepaooicaho,MzE1YjNhYjg2Mjk0NTYwYTllZGJlYTk5MjMyZjYwZGNmOGNlMGQ2Mw==,4.0.0.0
-Avast SafePrice,eofcbnmajmjmplflapaojjnihcjkigck,MWVlYjBlYWYyZGUzNjQxMWE4NWRkNDczMzRlZWY5Nzc1N2M4Y2M0Yg==,10.2.0.190
-Norton Identity Safe,iikflkcanblccfahdhdonehdalibjnif,OTA1NGI5MThiZGFkOWRkNjAzNGQ2N2EzODdhNzUwNTNkZTIyMjAyZA==,1.0.5
-Application Launcher for Drive (by Google),lmjegmlicamnimmfhcmpkclmigmmcbeh,NWY0NjY2ZDNhNGNlOWU3MTY4MjlhMTE5MWFhZTk4Y2FlZTI5NmUwMQ==,3.2
-Norton Security Toolbar,mkfokfffehpeedafpekjeddnmnjhmcmk,NTdlOWVlZjQ0OTU3MDYyMzlhODEzZDc4N2FiYWIyNDhjMTQxYmI1Yw==,2014.7.12.29
-Ask App for iLivid,mppnoffgpafgpgbaigljliadgbnhljfl,ZTg5YzhhMWIyMDk5MGMzN2ZlNTU5ZGU3MjM5NjMwZTAyZTc1Y2E5NA==,1.1
-Avira Browser Safety,flliilndjeohchalpbbcdekjklbdgfkk,ZTk5NGQ4NzRiNWQ2ZGNmZmE1MWFlMTM3YWYxYzcwZTA1NmI3N2RlYw==,1.4.10
-MSN Homepage & Bing Search Engine,fcfenmboojpjinhpgggodefccipikbpd,NjNkNGVkZDFlNTYzNTBkOGY1ZDFiOWZmZGQyOWIxZDkzOWMwODM0Yg==,0.0.0.8
-Adobe Acrobat - Create PDF,efaidnbmnnnibpcajpcglclefindmkaj,MjdkNzdjM2MwYzNhMDJmZDRlYTI1ODc3MjZkZGViMDJmMjkzNTFlMw==,15.0.0.0
-Cisco WebEx Extension,jlhmfgmfgeifomenelglieieghnjghma,NmQ0Y2VhMDI0OGU5YzcxNDAxZjdmYWZmYzBjNGUwZjgzYjI0YWZmYg==,1.0.1
-IDM Helper Module,ngpampappnmepgilojfohadhhmbhlaek,YzIzYzUwYmQ3MGNmOGRmMzFhOWE4OGI0NDg0ZWRhNzU1OTIxZGI5Zg==,6.22.3
-Pin It Button,gpdjojdkbbmdfjfahjcgigfpmkopogic,M2Q2NGU0ZTkwZDBhMmI5M2NkYzFkY2I2ZTFiYTFiZjE3ZDVhZjZhMQ==,1.38.2
diff --git a/tools/perf/profile_creators/fast_navigation_profile_extender.py b/tools/perf/profile_creators/fast_navigation_profile_extender.py
deleted file mode 100644
index f2003d4..0000000
--- a/tools/perf/profile_creators/fast_navigation_profile_extender.py
+++ /dev/null
@@ -1,245 +0,0 @@
-# Copyright 2015 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.
-import time
-
-from profile_creators import profile_extender
-from telemetry.core import exceptions
-from telemetry.core import util
-
-
-class FastNavigationProfileExtender(profile_extender.ProfileExtender):
-  """Extends a Chrome profile.
-
-  This class creates or extends an existing profile by performing a set of tab
-  navigations in large batches. This is accomplished by opening a large number
-  of tabs, simultaneously navigating all the tabs, and then waiting for all the
-  tabs to load. This provides two benefits:
-    - Takes advantage of the high number of logical cores on modern CPUs.
-    - The total time spent waiting for navigations to time out scales linearly
-      with the number of batches, but does not scale with the size of the
-      batch.
-  """
-
-  def __init__(self, finder_options, maximum_batch_size):
-    """Initializer.
-
-    Args:
-      maximum_batch_size: A positive integer indicating the number of tabs to
-      simultaneously perform navigations.
-    """
-    super(FastNavigationProfileExtender, self).__init__(finder_options)
-
-    # The instance keeps a list of Tabs that can be navigated successfully.
-    # This means that the Tab is not crashed, and is processing JavaScript in a
-    # timely fashion.
-    self._navigation_tabs = []
-
-    # The number of tabs to use.
-    self._NUM_TABS = maximum_batch_size
-
-    # The amount of additional time to wait for a batch of pages to finish
-    # loading for each page in the batch.
-    self._BATCH_TIMEOUT_PER_PAGE_IN_SECONDS = 20
-
-    # The amount of time to wait for a page to quiesce. Some pages will never
-    # quiesce.
-    self._TIME_TO_WAIT_FOR_PAGE_TO_QUIESCE_IN_SECONDS = 10
-
-  def Run(self):
-    """Superclass override."""
-    try:
-      self.SetUpBrowser()
-      self._PerformNavigations()
-    finally:
-      self.TearDownBrowser()
-
-    # When there hasn't been an exception, verify that the profile was
-    # correctly extended.
-    # TODO(erikchen): I've intentionally omitted my implementation of
-    # VerifyProfileWasExtended() in small_profile_extender, since the profile
-    # is not being correctly extended. http://crbug.com/484833
-    # http://crbug.com/484880
-    self.VerifyProfileWasExtended()
-
-  def VerifyProfileWasExtended(self):
-    """Verifies that the profile was correctly extended.
-
-    Can be overridden by subclasses.
-    """
-    pass
-
-  def GetUrlIterator(self):
-    """Gets URLs for the browser to navigate to.
-
-    Intended for subclass override.
-
-    Returns:
-      An iterator whose elements are urls to be navigated to.
-    """
-    raise NotImplementedError()
-
-  def ShouldExitAfterBatchNavigation(self):
-    """Returns a boolean indicating whether profile extension is finished.
-
-    Intended for subclass override.
-    """
-    raise NotImplementedError()
-
-  def CleanUpAfterBatchNavigation(self):
-    """A hook for subclasses to perform cleanup after each batch of
-    navigations.
-
-    Can be overridden by subclasses.
-    """
-    pass
-
-  def _RefreshNavigationTabs(self):
-    """Updates the member self._navigation_tabs to contain self._NUM_TABS
-    elements, each of which is not crashed. The crashed tabs are intentionally
-    leaked, since Telemetry doesn't have a good way of killing crashed tabs.
-
-    It is also possible for a tab to be stalled in an infinite JavaScript loop.
-    These tabs will be in self.browser.tabs, but not in self._navigation_tabs.
-    There is no way to kill these tabs, so they are also leaked. This method is
-    careful to only use tabs in self._navigation_tabs, or newly created tabs.
-    """
-    live_tabs = [tab for tab in self._navigation_tabs if tab.IsAlive()]
-    self._navigation_tabs = live_tabs
-
-    while len(self._navigation_tabs) < self._NUM_TABS:
-      self._navigation_tabs.append(self._browser.tabs.New())
-
-  def _RemoveNavigationTab(self, tab):
-    """Removes a tab which is no longer in a useable state from
-    self._navigation_tabs. The tab is not removed from self.browser.tabs,
-    since there is no guarantee that the tab can be safely removed."""
-    self._navigation_tabs.remove(tab)
-
-  def _RetrieveTabUrl(self, tab, timeout):
-    """Retrives the URL of the tab."""
-    # TODO(erikchen): Use tab.url instead, which talks to the browser process
-    # instead of the renderer process. http://crbug.com/486119
-    return tab.EvaluateJavaScript('document.URL', timeout=timeout)
-
-  def _WaitForUrlToChange(self, tab, initial_url, end_time):
-    """Waits for the tab to navigate away from its initial url.
-
-    If time.time() is larger than end_time, the function does nothing.
-    Otherwise, the function tries to return no later than end_time.
-    """
-    while True:
-      seconds_to_wait = end_time - time.time()
-      if seconds_to_wait <= 0:
-        break
-
-      current_url = self._RetrieveTabUrl(tab, seconds_to_wait)
-      if current_url != initial_url and current_url != '':
-        break
-
-      # Retrieving the current url is a non-trivial operation. Add a small
-      # sleep here to prevent this method from contending with the actual
-      # navigation.
-      time.sleep(0.01)
-
-  def _WaitForTabToBeReady(self, tab, end_time):
-    """Waits for the tab to be ready.
-
-    If time.time() is larger than end_time, the function does nothing.
-    Otherwise, the function tries to return no later than end_time.
-    """
-    seconds_to_wait = end_time - time.time()
-    if seconds_to_wait <= 0:
-      return
-    tab.WaitForDocumentReadyStateToBeComplete(seconds_to_wait)
-
-    # Wait up to 10 seconds for the page to quiesce. If the page hasn't
-    # quiesced in 10 seconds, it will probably never quiesce.
-    seconds_to_wait = end_time - time.time()
-    seconds_to_wait = max(0, seconds_to_wait)
-    try:
-      util.WaitFor(tab.HasReachedQuiescence, seconds_to_wait)
-    except exceptions.TimeoutException:
-      pass
-
-  def _BatchNavigateTabs(self, batch):
-    """Performs a batch of tab navigations with minimal delay.
-
-    Args:
-      batch: A list of tuples (tab, url).
-
-    Returns:
-      A list of tuples (tab, initial_url). |initial_url| is the url of the
-      |tab| prior to a navigation command being sent to it.
-    """
-    # Attempting to pass in a timeout of 0 seconds results in a synchronous
-    # socket error from the websocket library. Pass in a very small timeout
-    # instead so that the websocket library raises a Timeout exception. This
-    # prevents the logic from accidentally catching different socket
-    # exceptions.
-    timeout_in_seconds = 0.01
-
-    queued_tabs = []
-    for tab, url in batch:
-      initial_url = self._RetrieveTabUrl(tab, 20)
-      try:
-        tab.Navigate(url, None, timeout_in_seconds)
-      except exceptions.TimeoutException:
-        # We expect to receive a timeout exception, since we're not waiting for
-        # the navigation to complete.
-        pass
-      queued_tabs.append((tab, initial_url))
-    return queued_tabs
-
-  def _WaitForQueuedTabsToLoad(self, queued_tabs):
-    """Waits for all the batch navigated tabs to finish loading.
-
-    Args:
-      queued_tabs: A list of tuples (tab, initial_url). Each tab is guaranteed
-      to have already been sent a navigation command.
-    """
-    total_batch_timeout = (len(queued_tabs) *
-                           self._BATCH_TIMEOUT_PER_PAGE_IN_SECONDS)
-    end_time = time.time() + total_batch_timeout
-    for tab, initial_url in queued_tabs:
-      # Since we didn't wait any time for the tab url navigation to commit, it's
-      # possible that the tab hasn't started navigating yet.
-      self._WaitForUrlToChange(tab, initial_url, end_time)
-      self._WaitForTabToBeReady(tab, end_time)
-
-  def _GetUrlsToNavigate(self, url_iterator):
-    """Returns an array of urls to navigate to, given a url_iterator."""
-    urls = []
-    for _ in xrange(self._NUM_TABS):
-      try:
-        urls.append(url_iterator.next())
-      except StopIteration:
-        break
-    return urls
-
-  def _PerformNavigations(self):
-    """Repeatedly fetches a batch of urls, and navigates to those urls. This
-    will run until an empty batch is returned, or
-    ShouldExitAfterBatchNavigation() returns True.
-    """
-    url_iterator = self.GetUrlIterator()
-    while True:
-      self._RefreshNavigationTabs()
-      urls = self._GetUrlsToNavigate(url_iterator)
-
-      if len(urls) == 0:
-        break
-
-      batch = []
-      for i in range(len(urls)):
-        url = urls[i]
-        tab = self._navigation_tabs[i]
-        batch.append((tab, url))
-
-      queued_tabs = self._BatchNavigateTabs(batch)
-      self._WaitForQueuedTabsToLoad(queued_tabs)
-
-      self.CleanUpAfterBatchNavigation()
-
-      if self.ShouldExitAfterBatchNavigation():
-        break
diff --git a/tools/perf/profile_creators/fast_navigation_profile_extender_unittest.py b/tools/perf/profile_creators/fast_navigation_profile_extender_unittest.py
deleted file mode 100644
index 0a065b0..0000000
--- a/tools/perf/profile_creators/fast_navigation_profile_extender_unittest.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2015 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.
-import unittest
-
-from profile_creators.fast_navigation_profile_extender import (
-    FastNavigationProfileExtender)
-from telemetry.testing import options_for_unittests
-
-import mock  # pylint: disable=import-error
-
-
-class FakeTab(object):
-  pass
-
-
-class FakeTabList(object):
-
-  def __init__(self):
-    self._tabs = []
-
-  def New(self):
-    tab = FakeTab()
-    self._tabs.append(tab)
-    return tab
-
-  def __len__(self):
-    return len(self._tabs)
-
-
-class FakeBrowser(object):
-
-  def __init__(self):
-    self.tabs = FakeTabList()
-
-
-# Testing private method.
-# pylint: disable=protected-access
-class FastNavigationProfileExtenderTest(unittest.TestCase):
-
-  def testPerformNavigations(self):
-    maximum_batch_size = 15
-    options = options_for_unittests.GetCopy()
-    extender = FastNavigationProfileExtender(options, maximum_batch_size)
-
-    navigation_urls = []
-    for i in range(extender._NUM_TABS):
-      navigation_urls.append('http://test%s.com' % i)
-    batch_size = 5
-    navigation_urls_batch = navigation_urls[3:3 + batch_size]
-
-    extender.GetUrlIterator = mock.MagicMock(
-        return_value=iter(navigation_urls_batch))
-    extender.ShouldExitAfterBatchNavigation = mock.MagicMock(return_value=True)
-    extender._WaitForQueuedTabsToLoad = mock.MagicMock()
-
-    extender._browser = FakeBrowser()
-    extender._BatchNavigateTabs = mock.MagicMock()
-
-    # Set up a callback to record the tabs and urls in each navigation.
-    callback_tabs_batch = []
-    callback_urls_batch = []
-
-    def SideEffect(*args, **_):
-      batch = args[0]
-      for tab, url in batch:
-        callback_tabs_batch.append(tab)
-        callback_urls_batch.append(url)
-    extender._BatchNavigateTabs.side_effect = SideEffect
-
-    # Perform the navigations.
-    extender._PerformNavigations()
-
-    # Each url in the batch should have been navigated to exactly once.
-    self.assertEqual(set(callback_urls_batch), set(navigation_urls_batch))
-
-    # The other urls should not have been navigated to.
-    navigation_urls_remaining = (set(navigation_urls) -
-                                 set(navigation_urls_batch))
-    self.assertFalse(navigation_urls_remaining & set(callback_urls_batch))
-
-    # The first couple of tabs should have been navigated once. The remaining
-    # tabs should not have been navigated.
-    for i in range(len(extender._browser.tabs)):
-      tab = extender._browser.tabs._tabs[i]
-
-      if i < batch_size:
-        expected_tab_navigation_count = 1
-      else:
-        expected_tab_navigation_count = 0
-
-      count = callback_tabs_batch.count(tab)
-      self.assertEqual(count, expected_tab_navigation_count)
diff --git a/tools/perf/profile_creators/large_profile_extender.py b/tools/perf/profile_creators/large_profile_extender.py
deleted file mode 100644
index 1afe6e4..0000000
--- a/tools/perf/profile_creators/large_profile_extender.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from profile_creators import cookie_profile_extender
-from profile_creators import profile_extender
-
-
-class LargeProfileExtender(profile_extender.ProfileExtender):
-  """This class creates a large profile by performing a large number of url
-  navigations."""
-
-  def Run(self):
-    extender = cookie_profile_extender.CookieProfileExtender(
-        self.finder_options)
-    extender.Run()
diff --git a/tools/perf/profile_creators/profile_extender.py b/tools/perf/profile_creators/profile_extender.py
deleted file mode 100644
index da356a2..0000000
--- a/tools/perf/profile_creators/profile_extender.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import copy
-
-from telemetry.core import platform
-from telemetry.util import wpr_modes
-from telemetry.internal.browser import browser_finder
-from telemetry.internal.browser import browser_finder_exceptions
-
-
-class ProfileExtender(object):
-  """Abstract base class for an object that constructs a Chrome profile."""
-
-  def __init__(self, finder_options):
-    """Initializer.
-
-    |finder_options| is an instance of BrowserFinderOptions. When subclass
-    implementations of this method inevitably attempt to find and launch a
-    browser, they should pass |finder_options| to the relevant methods.
-
-    Several properties of |finder_options| might require direct manipulation by
-    subclasses. These are:
-      |finder_options.output_profile_path|: The path at which the profile
-      should be created.
-      |finder_options.browser_options.profile_dir|: If this property is None,
-      then a new profile is created. Otherwise, the existing profile is
-      appended on to.
-    """
-    self._finder_options = copy.deepcopy(finder_options)
-    # Since profile extenders are not supported on remote platforms,
-    # this should be the same as target platform.
-    self._os_name = platform.GetHostPlatform().GetOSName()
-
-    # A reference to the browser that will be performing all of the tab
-    # navigations.
-    # This member is initialized during SetUpBrowser().
-    self._browser = None
-
-    # We only need to close network controller if we opened it before.
-    # If it was already open, we should not close it.
-    self._should_close_network_controller = False
-
-  def Run(self):
-    """Creates or extends the profile."""
-    raise NotImplementedError()
-
-  def WebPageReplayArchivePath(self):
-    """Returns the path to the WPR archive.
-
-    Can be overridden by subclasses.
-    """
-    return None
-
-  @property
-  def finder_options(self):
-    """The options to use to find and run the browser."""
-    return self._finder_options
-
-  @property
-  def profile_path(self):
-    """The path of the profile that the browser will use while it's running."""
-    # TODO(eakuefner): Remove this after crrev.com/1874473006 rolls in.
-    return getattr(self.finder_options, 'output_profile_path',
-                   self.finder_options.browser_options.output_profile_path)
-
-  @property
-  def browser(self):
-    return self._browser
-
-  @property
-  def os_name(self):
-    """Name of OS that extender is currently running on."""
-    return self._os_name
-
-  def EnabledOSList(self):
-    """Returns a list of OSes that this extender can run on.
-
-    Can be overridden by subclasses.
-
-    Returns:
-        List of OS ('win', 'mac', or 'linux') that this extender can run on.
-    """
-    return ['win', 'mac', 'linux']
-
-  def SetUpBrowser(self):
-    """Finds and starts the browser.
-
-    Can be overridden by subclasses. The subclass implementation must call the
-    super class implementation.
-
-    Subclasses do not need to call this method. This method is only necessary
-    if the subclass needs to start a browser. If a subclass does call this
-    method, the subclass must also call TearDownBrowser().
-    """
-    possible_browser = self._GetPossibleBrowser(self.finder_options)
-    enabled_os_list = self.EnabledOSList()
-    if self._os_name not in enabled_os_list:
-      raise NotImplementedError(
-          'This profile extender on %s is not yet supported'
-          % self._os_name)
-    if possible_browser.IsRemote():
-      raise NotImplementedError(
-          'Profile extenders are not yet supported on remote platforms.')
-    assert possible_browser.supports_tab_control
-
-    self._SetUpWebPageReplay(self.finder_options, possible_browser)
-    self._browser = possible_browser.Create(self.finder_options)
-
-  def TearDownBrowser(self):
-    """Tears down the browser.
-
-    Can be overridden by subclasses. The subclass implementation must call the
-    super class implementation.
-    """
-    if self._browser:
-      if self._should_close_network_controller:
-        self._browser.platform.network_controller.Close()
-      self._browser.Close()
-      self._browser = None
-
-  def FetchWebPageReplayArchives(self):
-    """Fetches the web page replay archives.
-
-    Can be overridden by subclasses.
-    """
-    pass
-
-  def _SetUpWebPageReplay(self, finder_options, possible_browser):
-    """Sets up Web Page Replay, if necessary."""
-
-    wpr_archive_path = self.WebPageReplayArchivePath()
-    if not wpr_archive_path:
-      return
-
-    self.FetchWebPageReplayArchives()
-
-    if finder_options.use_live_sites:
-      wpr_mode = wpr_modes.WPR_OFF
-    else:
-      wpr_mode = wpr_modes.WPR_REPLAY
-
-    network_controller = possible_browser.platform.network_controller
-    if not network_controller.is_open:
-      self._should_close_network_controller = True
-      network_controller.Open(wpr_mode)
-    network_controller.StartReplay(
-        wpr_archive_path, make_javascript_deterministic=True,
-        extra_wpr_args=finder_options.browser_options.extra_wpr_args)
-
-  def _GetPossibleBrowser(self, finder_options):
-    """Return a possible_browser with the given options."""
-    possible_browser = browser_finder.FindBrowser(finder_options)
-    if not possible_browser:
-      raise browser_finder_exceptions.BrowserFinderException(
-          'No browser found.\n\nAvailable browsers:\n%s\n' %
-          '\n'.join(browser_finder.GetAllAvailableBrowserTypes(finder_options)))
-    finder_options.browser_options.browser_type = (
-        possible_browser.browser_type)
-
-    return possible_browser
diff --git a/tools/perf/profile_creators/profile_generator.py b/tools/perf/profile_creators/profile_generator.py
deleted file mode 100644
index 3b880a5..0000000
--- a/tools/perf/profile_creators/profile_generator.py
+++ /dev/null
@@ -1,216 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Handles generating profiles and transferring them to/from mobile devices."""
-
-import logging
-import optparse
-import os
-import shutil
-import stat
-import sys
-import tempfile
-
-from profile_creators import profile_extender
-from telemetry.core import util
-from telemetry.internal import story_runner
-from telemetry.internal.browser import browser_finder
-from telemetry.internal.browser import browser_options
-from telemetry.internal.util import binary_manager
-
-from py_utils import discover
-
-def _DiscoverProfileExtenderClasses():
-  profile_extenders_dir = (
-      os.path.abspath(
-          os.path.join(
-              util.GetBaseDir(), '..', 'perf',
-              'profile_creators')))
-  base_dir = os.path.abspath(os.path.join(profile_extenders_dir, '..'))
-
-  profile_extenders_unfiltered = discover.DiscoverClasses(
-      profile_extenders_dir, base_dir, profile_extender.ProfileExtender)
-
-  # Remove 'extender' suffix from keys.
-  profile_extenders = {}
-  for test_name, test_class in profile_extenders_unfiltered.iteritems():
-    assert test_name.endswith('_extender')
-    test_name = test_name[:-len('_extender')]
-    profile_extenders[test_name] = test_class
-  return profile_extenders
-
-
-def _IsPseudoFile(directory, paths):
-  """Filter function for shutil.copytree() to reject socket files and symlinks
-  since those can't be copied around on bots."""
-  def IsSocket(full_path):
-    """Check if a file at a given path is a socket."""
-    try:
-      if stat.S_ISSOCK(os.stat(full_path).st_mode):
-        return True
-    except OSError:
-      # Thrown if we encounter a broken symlink.
-      pass
-    return False
-
-  ignore_list = []
-  for path in paths:
-    full_path = os.path.join(directory, path)
-
-    if os.path.isdir(full_path):
-      continue
-    if not IsSocket(full_path) and not os.path.islink(full_path):
-      continue
-
-    logging.warning('Ignoring pseudo file: %s', full_path)
-    ignore_list.append(path)
-
-  return ignore_list
-
-
-class ProfileGenerator(object):
-  """Generate profile.
-
-  On desktop the generated profile is copied to the specified location so later
-  runs can reuse it.
-  On CrOS profile resides on cryptohome and there is no easy way to
-  override it before user login. So for CrOS we just generate the profile
-  every time when the benchmark starts to run.
-  """
-
-  def __init__(self, profile_extender_class, profile_name):
-    self._profile_extender_class = profile_extender_class
-    self._profile_name = profile_name
-
-  def Run(self, options):
-    """Kick off the process.
-
-    Args:
-      options: Instance of BrowserFinderOptions to search for proper browser.
-
-    Returns:
-      A 2-tuple (path, new_profile).
-
-      path: The path of the generated profile or existing profile if
-      --profile-dir is given. Could be None if it's generated on default
-      location (e.g., cryptohome on CrOS).
-
-      new_profile: Whether a new profile has been generated. If this is True,
-      the caller is responsible for deleting the profile.
-    """
-    possible_browser = browser_finder.FindBrowser(options)
-
-    if possible_browser.browser_type.startswith('cros'):
-      self.Create(options, None)
-      return (None, False)
-
-    # Use the given --profile-dir.
-    if options.browser_options.profile_dir:
-      return (options.browser_options.profile_dir, False)
-
-    out_dir = tempfile.mkdtemp(prefix=self._profile_name)
-
-    self.Create(options, out_dir)
-    return (out_dir, True)
-
-  def Create(self, options, out_dir):
-    """Generate profile.
-
-    If out_dir is given, copy the generated profile to out_dir.
-    Otherwise the profile is generated to its default position
-    (e.g., cryptohome on CrOS).
-    """
-
-    # Leave the global options intact.
-    creator_options = options.Copy()
-
-    if out_dir:
-      sys.stderr.write('Generating profile to: %s \n' % out_dir)
-      # The genrated profile is copied to out_dir only if the generation is
-      # successful. In the generation process a temp directory is used so
-      # the default profile is not polluted on failure.
-      tmp_profile_path = tempfile.mkdtemp()
-      # TODO(eakuefner): Remove this after crrev.com/1874473006 rolls in.
-      try:
-        getattr(creator_options, 'output_profile_path')
-        creator_options.output_profile_path = tmp_profile_path
-      except AttributeError:
-        creator_options.browser_options.output_profile_path = tmp_profile_path
-
-    creator = self._profile_extender_class(creator_options)
-
-    try:
-      creator.Run()
-    except Exception as e:
-      logging.exception('Profile creation failed.')
-      raise e
-    else:
-      sys.stderr.write('SUCCESS: Profile generated.\n')
-
-      # Copy generated profile to final destination if out_dir is given.
-      if out_dir:
-        if os.path.exists(out_dir):
-          shutil.rmtree(out_dir)
-        shutil.copytree(tmp_profile_path,
-                        out_dir, ignore=_IsPseudoFile)
-        sys.stderr.write(
-            "SUCCESS: Generated profile copied to: '%s'.\n" % out_dir)
-    finally:
-      if out_dir:
-        shutil.rmtree(tmp_profile_path)
-
-
-def AddCommandLineArgs(parser):
-  story_runner.AddCommandLineArgs(parser)
-
-  profile_extenders = _DiscoverProfileExtenderClasses().keys()
-  legal_profile_creators = '|'.join(profile_extenders)
-  group = optparse.OptionGroup(parser, 'Profile generation options')
-  group.add_option('--profile-type-to-generate',
-                   dest='profile_type_to_generate',
-                   default=None,
-                   help='Type of profile to generate. '
-                   'Supported values: %s' % legal_profile_creators)
-  parser.add_option_group(group)
-
-
-def ProcessCommandLineArgs(parser, args):
-  story_runner.ProcessCommandLineArgs(parser, args)
-
-  if not args.profile_type_to_generate:
-    parser.error('Must specify --profile-type-to-generate option.')
-
-  profile_extenders = _DiscoverProfileExtenderClasses().keys()
-  if args.profile_type_to_generate not in profile_extenders:
-    legal_profile_creators = '|'.join(profile_extenders)
-    parser.error('Invalid profile type, legal values are: %s.' %
-                 legal_profile_creators)
-
-  if not args.browser_type:
-    parser.error('Must specify --browser option.')
-
-  if not args.output_dir:
-    parser.error('Must specify --output-dir option.')
-
-  if args.browser_options.dont_override_profile:
-    parser.error("Can't use existing profile when generating profile.")
-
-
-def Main():
-  binary_manager.InitDependencyManager(None)
-  options = browser_options.BrowserFinderOptions()
-  parser = options.CreateParser(
-      '%%prog <--profile-type-to-generate=...> <--browser=...> <--output-dir>')
-  AddCommandLineArgs(parser)
-  _, _ = parser.parse_args()
-  ProcessCommandLineArgs(parser, options)
-
-  # Generate profile.
-  profile_extenders = _DiscoverProfileExtenderClasses()
-  profile_extender_class = profile_extenders[options.profile_type_to_generate]
-
-  generator = ProfileGenerator(profile_extender_class,
-                               options.profile_type_to_generate)
-  generator.Create(options, options.output_dir)
-  return 0
diff --git a/tools/perf/profile_creators/profile_generator_unittest.py b/tools/perf/profile_creators/profile_generator_unittest.py
deleted file mode 100644
index f3cd6302..0000000
--- a/tools/perf/profile_creators/profile_generator_unittest.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import shutil
-import socket
-import tempfile
-import unittest
-
-from profile_creators import profile_generator
-
-
-class ProfileGeneratorUnitTest(unittest.TestCase):
-
-  def setUp(self):
-    self.test_directory = tempfile.mkdtemp()
-    super(ProfileGeneratorUnitTest, self).setUp()
-
-  def _CreateFunkyFilesAndOnePlainFile(self, sandbox_directory):
-    """Create several special files and one plain file in |sandbox_directory|.
-    """
-    if os.path.exists(sandbox_directory):
-      shutil.rmtree(sandbox_directory)
-
-    os.mkdir(sandbox_directory)
-
-    # Make a plain file.
-    plain_filename = os.path.join(sandbox_directory, 'plain_file')
-    open(plain_filename, 'a').close()
-
-    # Make a directory.
-    directory_filename = os.path.join(sandbox_directory, 'directory')
-    os.mkdir(directory_filename)
-
-    if getattr(os, 'symlink', None):  # Symlinks not supported on Windows.
-      # Make a symlink.
-      symlink_filename = os.path.join(sandbox_directory, 'symlink')
-      os.symlink(plain_filename, symlink_filename)
-
-      # Make a broken symlink.
-      nonexistant_filename = os.path.join(sandbox_directory, 'i_dont_exist')
-      broken_symlink_filename = os.path.join(sandbox_directory,
-                                             'broken_symlink')
-      os.symlink(nonexistant_filename, broken_symlink_filename)
-
-    # Make a named socket.
-    if getattr(socket, 'AF_UNIX', None):  # Windows doesn't support these.
-      socket_filename = os.path.join(sandbox_directory, 'named_socket')
-      the_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
-      the_socket.bind(socket_filename)
-
-  def testIsPseudoFile(self):
-    sandbox_dir = os.path.join(self.test_directory, 'sandbox')
-    self._CreateFunkyFilesAndOnePlainFile(sandbox_dir)
-
-    # If we can copy the directory, we're golden!
-    sandbox_dir_copy = os.path.join(self.test_directory, 'sandbox_copy')
-    # pylint: disable=protected-access
-    shutil.copytree(sandbox_dir, sandbox_dir_copy,
-                    ignore=profile_generator._IsPseudoFile)
-
-    # Check that only the directory and plain file got copied.
-    dir_contents = os.listdir(sandbox_dir_copy)
-    dir_contents.sort()
-    self.assertEqual(['directory', 'plain_file'], dir_contents)
-
-  def tearDown(self):
-    shutil.rmtree(self.test_directory)
diff --git a/tools/perf/profile_creators/profile_safe_url_generator.py b/tools/perf/profile_creators/profile_safe_url_generator.py
deleted file mode 100644
index 0355735..0000000
--- a/tools/perf/profile_creators/profile_safe_url_generator.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# Copyright 2015 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.
-
-import HTMLParser
-import json
-import logging
-import urllib2
-import urlparse
-
-
-class _HRefParser(HTMLParser.HTMLParser):
-
-  def __init__(self):
-    HTMLParser.HTMLParser.__init__(self)
-    self.hrefs = []
-
-  def handle_starttag(self, tag, attrs):
-    if tag == "a":
-      for name, value in attrs:
-        if name == "href":
-          self.hrefs.append(value)
-
-
-def _AbsoluteUrlHasSaneScheme(absolute_url):
-  if len(absolute_url) < 4:
-    return False
-  return absolute_url[0:4] == "http"
-
-
-def GenerateSafeUrls():
-  """Prints a list of safe urls.
-
-  Generates a safe list of urls from a seed list. Each href in the HTML
-  fetched from the url from the seed list is placed into the safe list. The
-  safe list contains unsanitized urls.
-  """
-  # A list of websites whose hrefs are unlikely to link to sites that contain
-  # malware.
-  seed_urls = [
-      "http://www.cnn.com",
-      "https://www.youtube.com",
-      "https://www.facebook.com",
-      "https://www.twitter.com",
-      "https://www.yahoo.com",
-      "https://www.amazon.com",
-      "https://www.wikipedia.com",
-      "https://www.bing.com",
-      "https://www.dailymotion.com",
-      "https://www.stackoverflow.com",
-      "https://www.google.com/#q=dumpling",
-      "http://www.baidu.com/s?wd=rice",
-      "http://www.baidu.com/s?wd=cow",
-      "https://www.google.com/#q=fox",
-      "http://www.yahoo.co.jp/",
-      "http://www.yandex.ru/",
-      "https://www.imdb.com/",
-      "http://www.huffingtonpost.com/",
-      "https://www.deviantart.com/",
-      "http://www.wsj.com/",
-  ]
-
-  safe_urls = set()
-
-  for url in seed_urls:
-    try:
-      # Fetch and parse the HTML.
-      response = urllib2.urlopen(url)
-      encoding = response.headers.getparam("charset")
-      html = response.read()
-      if encoding:
-        html = html.decode(encoding)
-
-      parser = _HRefParser()
-      parser.feed(html)
-    except:
-      logging.exception("Error fetching or parsing url: %s", url)
-      raise
-
-    # Looks for all hrefs.
-    for relative_url in parser.hrefs:
-      if not relative_url:
-        continue
-
-      absolute_url = urlparse.urljoin(url, relative_url)
-      if not _AbsoluteUrlHasSaneScheme(absolute_url):
-        continue
-      safe_urls.add(absolute_url)
-
-  # Sort the urls, to make them easier to view in bulk.
-  safe_urls_list = list(safe_urls)
-  safe_urls_list.sort()
-
-  print json.dumps(safe_urls_list, indent=2, separators=(",", ":"))
-
-if __name__ == "__main__":
-  GenerateSafeUrls()
diff --git a/tools/perf/profile_creators/profile_safe_url_list.json b/tools/perf/profile_creators/profile_safe_url_list.json
deleted file mode 100644
index fb0849f..0000000
--- a/tools/perf/profile_creators/profile_safe_url_list.json
+++ /dev/null
@@ -1,3796 +0,0 @@
-[
-  "http://abcnews.go.com/",
-  "http://abcnews.go.com/Health/texas-hospital-welcomes-girl-quintuplets-born-us/story?id=30314322",
-  "http://abcnews.go.com/blogs/politics/george-stephanopoulos",
-  "http://about.deviantart.com/",
-  "http://about.deviantart.com/advertising/",
-  "http://about.deviantart.com/advertising/adcast",
-  "http://about.deviantart.com/contact/",
-  "http://about.deviantart.com/policy/copyright/",
-  "http://about.deviantart.com/policy/etiquette/",
-  "http://about.deviantart.com/policy/privacy/",
-  "http://about.deviantart.com/policy/service/",
-  "http://academia.stackexchange.com/questions/43469/how-serious-should-i-regard-the-compliments-in-an-email-denying-my-application",
-  "http://academia.stackexchange.com/questions/43565/consistent-programming-language-for-computation-mathematica-python-matlab",
-  "http://ad.doubleclick.net/ddm/clk/285991468;111620318;k",
-  "http://ad.doubleclick.net/ddm/clk/285992548;112853330;n",
-  "http://adbravo.deviantart.com/",
-  "http://adinfo.aol.com/about-our-ads/",
-  "http://advertising.aol.com/brands/huffington-post",
-  "http://advertising.dailymotion.com/",
-  "http://advertising.yandex.ru/?from=main_bottom",
-  "http://advertising.yandex.ru/welcome/?from=maintest_ru_razmestitrekl",
-  "http://ajgiel.deviantart.com/",
-  "http://ajgiel.deviantart.com/art/King-of-the-North-523308495",
-  "http://alderion-al.deviantart.com/",
-  "http://alderion-al.deviantart.com/art/Puppet-Zelda-514215697",
-  "http://alexdeb.deviantart.com/",
-  "http://amazonlocal.com/",
-  "http://amukauroy.deviantart.com/art/Pokemon-One-Up-d-178954047",
-  "http://andikapatrya.deviantart.com/art/Is-this-Love-105384621",
-  "http://andrew-robinson.deviantart.com/art/King-Pin-280401033",
-  "http://arvalis.deviantart.com/art/Kyogre-526534240",
-  "http://auranapse.deviantart.com",
-  "http://auranapse.deviantart.com?connect",
-  "http://autos.yahoo.com/news/ford-patent-11-speed-automatic-transmission-wars-escalate-150000430.html",
-  "http://aws.amazon.com/what-is-cloud-computing/?sc_channel=EL&sc_campaign=amazonfooter",
-  "http://baseball.fantasysports.yahoo.com/b1",
-  "http://bconklin.deviantart.com/",
-  "http://bigcharts.marketwatch.com/",
-  "http://bikeaddiction.deviantart.com",
-  "http://bikeaddiction.deviantart.com?connect",
-  "http://bleacherreport.com",
-  "http://bleacherreport.com/?utm_source=cnn.com&utm_medium=referral&utm_campaign=editorial",
-  "http://bleacherreport.com/articles/2421374-the-zidane-clan-can-zinedines-four-sons-make-the-grade-at-real-madrid?utm_source=cnn.com&utm_medium=referral&utm_campaign=cnn-sports-bin",
-  "http://bleacherreport.com/articles/2429164-matt-miller-and-chris-simms-reveal-their-biggest-2015-nfl-draft-sleepers?utm_source=cnn.com&utm_medium=referral&utm_campaign=cnn-sports-bin",
-  "http://bleacherreport.com/articles/2429164-matt-miller-and-chris-simms-reveal-their-biggest-2015-nfl-draft-sleepers?utm_source=cnn.com&utm_medium=referral&utm_campaign=editorial",
-  "http://bleacherreport.com/articles/2429456-watch-65-200-pound-8th-graders-jaw-dropping-megatron-like-highlight-tape?utm_source=cnn.com&utm_medium=referral&utm_campaign=cnn-sports-bin",
-  "http://bleacherreport.com/articles/2429504-tom-brady-bounces-1st-pitch-at-red-sox-game?utm_source=cnn.com&utm_medium=referral&utm_campaign=editorial",
-  "http://bleacherreport.com/articles/2429905-how-much-should-jon-lesters-slow-start-to-2015-worry-the-cubs?utm_source=cnn.com&utm_medium=referral&utm_campaign=cnn-sports-bin",
-  "http://bleacherreport.com/articles/2430134-golfer-in-australia-bitten-by-a-crocodile-while-looking-for-ball-in-the-water?utm_source=cnn.com&utm_medium=referral&utm_campaign=cnn-sports-bin",
-  "http://bleacherreport.com/articles/2430363-lebron-james-stephen-curry-headline-list-of-2015s-most-popular-nba-jerseys?utm_source=cnn.com&utm_medium=referral&utm_campaign=editorial",
-  "http://bleacherreport.com/articles/2430547-western-kentucky-swim-team-suspended-5-years-after-hazing-allegations?utm_source=cnn.com&utm_medium=referral&utm_campaign=editorial",
-  "http://blender.stackexchange.com/questions/28473/how-to-avoid-particle-data-being-stored-in-blend-file-to-make-it-smaller",
-  "http://blog.dailymotion.com/en",
-  "http://blog.foreignpolicy.com/",
-  "http://blog.stackoverflow.com",
-  "http://blog.stackoverflow.com/2009/06/attribution-required/",
-  "http://blog.stackoverflow.com?blb=1",
-  "http://blog.yandex.ru",
-  "http://bloggingheads.tv/",
-  "http://blogs.reuters.com/felix-salmon/",
-  "http://blogs.reuters.com/jackshafer/",
-  "http://blogs.rollcall.com/white-house/marco-rubios-opening-speech-goof/",
-  "http://blogs.wsj.com/?mod=WSJ_formfactor",
-  "http://blogs.wsj.com/briefly/2015/04/14/5-great-quotes-for-tax-day/?mod=WSJ_hpp_sections_yourmoney",
-  "http://blogs.wsj.com/briefly/2015/04/14/nokia-alcatel-dial-up-potential-40-billion-merger-at-a-glance/",
-  "http://blogs.wsj.com/cfo/2015/04/13/cost-of-finance-teams-heading-lower-accenture/?mod=WSJ_hpp_sections_cfo",
-  "http://blogs.wsj.com/cfo/2015/04/14/corporate-pension-funds-pile-into-bonds/?mod=WSJ_hpp_sections_cfo",
-  "http://blogs.wsj.com/cfo/2015/04/14/proxy-proposals-call-for-social-responsibility-and-lobbying-disclosures/?mod=WSJ_hpp_sections_cfo",
-  "http://blogs.wsj.com/cio/2015/04/14/nokia-alcatel-lucent-talks-follow-networking-shift-to-software/?mod=WSJ_hpp_sections_cio",
-  "http://blogs.wsj.com/cio/2015/04/14/nokias-alcatel-lucent-deal-could-reshape-sdn-market/?mod=WSJ_hpp_sections_cio",
-  "http://blogs.wsj.com/cio/2015/04/14/state-street-draws-on-neuroscience-for-financial-systems-analytics-project/?mod=WSJ_hpp_sections_cio",
-  "http://blogs.wsj.com/dailyfix/2015/04/14/atletico-madrid-vs-real-madrid-live-blog/?mod=WSJ_hpp_MIDDLENexttoWhatsNewsForth",
-  "http://blogs.wsj.com/digits/2015/04/14/cannabis-delivery-service-eaze-raises-10-million-to-expand/?mod=WSJ_hpp_sections_tech",
-  "http://blogs.wsj.com/economics/2015/04/14/imf-euro-depreciation-will-restrain-the-u-s-and-china-for-years/",
-  "http://blogs.wsj.com/economics/2015/04/14/supply-or-demand-the-imf-breaks-down-the-collapse-of-oil-prices/",
-  "http://blogs.wsj.com/expat/2015/04/13/for-expats-spice-is-the-spice-of-life/?mod=WSJ_hpp_sections_lifestyle",
-  "http://blogs.wsj.com/experts/2015/04/14/six-financial-issues-expats-need-to-know-before-accepting-an-assignment/",
-  "http://blogs.wsj.com/experts/2015/04/14/what-a-paper-route-taught-me-about-business/",
-  "http://blogs.wsj.com/metropolis/2015/04/14/nypd-collars-coyote-in-manhattan/?mod=WSJ_hpp_sections_newyork",
-  "http://blogs.wsj.com/moneybeat/?mod=WSJ_hpp_marketdata",
-  "http://blogs.wsj.com/pharmalot/2015/04/13/former-execs-charged-with-securities-fraud-at-device-maker-bought-by-jj/?mod=WSJ_hpp_sections_health",
-  "http://blogs.wsj.com/riskandcompliance/2015/04/14/corruption-currents-oregon-bank-drops-marijuana-clients/?mod=WSJ_hpp_sections_riskcompliance",
-  "http://blogs.wsj.com/riskandcompliance/2015/04/14/crisis-of-the-week-ice-cream-recall-snags-blue-bell/?mod=WSJ_hpp_sections_riskcompliance",
-  "http://blogs.wsj.com/riskandcompliance/2015/04/14/u-s-official-cites-critical-need-for-criminal-prosecutions/?mod=WSJ_hpp_sections_riskcompliance",
-  "http://blogs.wsj.com/speakeasy/2015/04/14/rb-pioneer-percy-sledge-dies-at-73/?mod=WSJ_hp_EditorsPicks",
-  "http://blogs.wsj.com/totalreturn/2015/04/14/if-you-made-a-mistake-on-your-taxes/?mod=WSJ_hpp_sections_yourmoney",
-  "http://blogs.wsj.com/washwire/2015/04/14/capital-journal-rubio-rejects-leaders-and-ideas-of-the-past-russia-lifts-iran-missile-ban-whats-in-a-logo-how-2016-designs-stack-up/",
-  "http://boingboing.net/",
-  "http://bootslof.deviantart.com/art/Kingpin-217309024",
-  "http://boredwithmodesty.deviantart.com/art/Kiss-40752557",
-  "http://buzzmachine.com/",
-  "http://bymyimagination.deviantart.com",
-  "http://bymyimagination.deviantart.com?connect",
-  "http://cache.baiducontent.com/c?m=9d78d513d9831afe0ff9d33e53198d205f1697624fcacd432485d55f93130a1d5a26b8ea70&p=84759a46d6c51ef40be2963f5f079c&newp=89769a4786cc42af5ebaca2f584181231610db2151d2d51f&user=baidu&fm=sc&query=rice&qid=b8b471d5000008a5&p1=10",
-  "http://cache.baiducontent.com/c?m=9d78d513d9831afe0ff9d33e53198d205f1697624fcacd503a918448e43f0a1a1735f4bb50734d5bce85273656b2&p=84759a46d6c31ef40be2963f5f079c&newp=89769a4786cc42af58baca2f584181231610db2151d4d415&user=baidu&fm=sc&query=rice&qid=b8b471d5000008a5&p1=9",
-  "http://cache.baiducontent.com/c?m=9d78d513d9921cea4caad420024c91205b43811021ca864e2e928448e43d0c18103ab4fd302267558e9a61305db21801af&p=c467c54ad5c447e80ab4d12d02149d&newp=8b2a97379e8711a05bea923f5c4a81231610db2151d0d41f0d9cd7&user=baidu&fm=sc&query=cow&qid=f537508b0000092e&p1=9",
-  "http://cache.baiducontent.com/c?m=9d78d513d9921cea4caad420024c91205b43811021ca874968d4e40dc83d00031030b8e830226759939061225af612419bad73&p=8e67c64ad48310ff57ee957f150e8e&newp=937cc815d9c040ae12be9b7c464bcf231610db2151d4d51435&user=baidu&fm=sc&query=cow&qid=f537508b0000092e&p1=8",
-  "http://cache.baiducontent.com/c?m=9d78d513d9921cea4caad420024c91205b43811021ca95503ac3933fc82f080a1471e3cc767f4f19919e202552f45414b0ab6a216b1e22aa9ccc95&p=882a9642d09812a05ab8c535594da5&newp=916fdc5986cc42a85ea5c7710f448a231610db2151d6db1337&user=baidu&fm=sc&query=cow&qid=f537508b0000092e&p1=10",
-  "http://cache.baiducontent.com/c?m=9d78d513d9921cea4caad420024c91205b43811021ca95503ac3933fcb324c413037bee43a604b589196277a02ae4357fdf04071360526bc8cc8ff109be4cc&p=8d7ac20293904ead46bd9b7d0d178d&newp=97769a4786cc42af59f68c12455ec1231610db2151d3d710&user=baidu&fm=sc&query=cow&qid=f537508b0000092e&p1=4",
-  "http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310408c375f438014668f87492a8ac809c9735b36163bbca6623f415996d1393a41f9460db7b5&p=882a9644d1971af910b6c7710f4cc9&newp=882a9644d18c1bfa4bafc7710f50c9231610db2151d6d112308ec65bd1&user=baidu&fm=sc&query=cow&qid=f537508b0000092e&p1=7",
-  "http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310408c375f4380146d8bcd442291870dce240d4e163ba6&p=8b2a9701828211a05beb94625c7ac4&newp=8b2a9753948b57ff57ee927e135586231610db2151d0db116996db5e&user=baidu&fm=sc&query=cow&qid=f537508b0000092e&p1=6",
-  "http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310418b711923c538658c9242298fc05f93130601127ba6e07e790d6488942b7344f2090ae5b06d2360&p=806fcf1485cc43e610bd9b7d0f129f&newp=926adf16d9c109ff57ee967a1649bb231611d63f6fbad11137&user=baidu&fm=sc&query=rice&qid=b8b471d5000008a5&p1=5",
-  "http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f723678687027fa3c41ed4794f041a26b5b467794153&p=806fcf1485cc43e610bd9b7d0c179f&newp=926adf16d9c109ff57ee957f1649bb231610db2151d6d51437&user=baidu&fm=sc&query=rice&qid=b8b471d5000008a5&p1=3",
-  "http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7386d8c804668d4e419ce3b46101a23feaf627f5052dc942122&p=8549d51785cc43f908e2977e070c86&newp=aa3bc54ad5c34bf70fabc7710f478b231610db2151dd884239&user=baidu&fm=sc&query=cow&qid=f537508b0000092e&p1=3",
-  "http://calvinhollywood.deviantart.com/",
-  "http://canuckgurl22.deviantart.com/art/The-Kiss-98404598",
-  "http://celebrity.yahoo.com/blogs/celeb-news/kimora-lee-simmons-gives-birth-boy-203354029.html",
-  "http://chat.deviantart.com/",
-  "http://chat.stackoverflow.com",
-  "http://chemistry.stackexchange.com/questions/28702/how-come-there-arent-any-silicon-analogs-of-alkenes-or-alkynes",
-  "http://christiannauck.deviantart.com/art/Daredevil-roof-jump-134553438",
-  "http://christopherpollari.deviantart.com/",
-  "http://classifieds.wsj.com?mod=WSJ_footer",
-  "http://classroom.wsj.com/",
-  "http://clsa.deviantart.com/art/Bullseye-131165042",
-  "http://cn.wsj.com/gb/index.asp",
-  "http://cnn.it/go",
-  "http://cnnnewsource.com",
-  "http://codereview.stackexchange.com/questions/86895/checking-validity-of-nxn-sudoku",
-  "http://company.yandex.com/",
-  "http://company.yandex.ru",
-  "http://creativecommons.org/licenses/by-sa/3.0/",
-  "http://criticalrobotboy.deviantart.com/art/Enderdragon-Logo-526806276",
-  "http://critiques.deviantart.com",
-  "http://crooksandliars.com/",
-  "http://dailycaller.com/",
-  "http://dailykos.com/",
-  "http://dailylitrecognition.deviantart.com/",
-  "http://dailylitrecognition.deviantart.com/journal/Daily-Lit-Recognition-for-April-13th-2015-526578496",
-  "http://dailylitrecognition.deviantart.com/journal/Daily-Lit-Recognition-for-April-14-2015-526808625",
-  "http://dailynews.yahoo.co.jp/fc/domestic/air_crash/?id=6156593",
-  "http://dailynews.yahoo.co.jp/fc/domestic/defence_policy/?id=6156606",
-  "http://dailynews.yahoo.co.jp/fc/domestic/volcanoes/?id=6156604",
-  "http://dailynews.yahoo.co.jp/fc/economy/bankruptcy/?id=6156598",
-  "http://dailynews.yahoo.co.jp/fc/entertainment/broad_casting/?id=6156600",
-  "http://dailynews.yahoo.co.jp/fc/local/hiroshima/?id=6156609",
-  "http://dailynews.yahoo.co.jp/fc/sports/aoki_norichika/?id=6156607",
-  "http://dailynews.yahoo.co.jp/fc/sports/vahid_halilhodzic/?id=6156610",
-  "http://danluvisiart.deviantart.com/art/REDEMPTION-FREEFALL-525627886",
-  "http://daringfireball.net/",
-  "http://data.stackexchange.com",
-  "http://dav-19.deviantart.com/art/Cherep-526720215",
-  "http://declanshalvey.deviantart.com/art/PUISHER-V-DAREDEVIL-colour-183351045",
-  "http://deevelliott.deviantart.com/",
-  "http://deevelliott.deviantart.com/favourites/63948030/Daredevil",
-  "http://depthradius.deviantart.com/gallery/51277529/Zeitgeist",
-  "http://depthradius.deviantart.com/gallery/51442382/Collections",
-  "http://developer.dailymotion.com",
-  "http://developer.dailymotion.com/documentation#graph-api",
-  "http://developer.dailymotion.com/documentation#player-api",
-  "http://deviantart.theresumator.com/apply/",
-  "http://digbysblog.blogspot.com/",
-  "http://digital-art-fantasy.deviantart.com/",
-  "http://digital-art-fantasy.deviantart.com/journal/NEW-CONTEST-526844932",
-  "http://dish.andrewsullivan.com/",
-  "http://dj.wsj.com/hub?mod=WSJ_Hat",
-  "http://dj.wsj.com/rt/pages/dash?mod=ProdX_MktgHub",
-  "http://djx.wsj.com?mod=ProdX_MktgHub",
-  "http://dkfktl1004.deviantart.com/",
-  "http://dkfktl1004.deviantart.com/art/errand-444620756",
-  "http://drudgereport.com/",
-  "http://elections.huffingtonpost.com/",
-  "http://elections.huffingtonpost.com/pollster",
-  "http://electronics.stackexchange.com/questions/164705/mains-voltage-on-strip-board",
-  "http://ell.stackexchange.com/questions/54733/what-are-some-polite-ways-to-address-a-group-in-a-forum-post",
-  "http://english.stackexchange.com/questions/238824/is-there-a-word-that-means-cheating-but-legitimate",
-  "http://english.stackexchange.com/questions/239208/when-did-more-tea-vicar-start-to-be-used-after-farting-where-did-it-come-fro",
-  "http://enigma-fotos.deviantart.com/art/Myranda-526722461",
-  "http://everything.yahoo.com/",
-  "http://feedback.yahoo.com/forums/206380-us-homepage",
-  "http://feedback2.yandex.ru/default/",
-  "http://finance.yahoo.com",
-  "http://finance.yahoo.com/",
-  "http://finance.yahoo.com/news/heres-budget-family-feels-theyve-160000283.html",
-  "http://finance.yahoo.com/q?s=^DJI",
-  "http://finance.yahoo.com/q?s=^GSPC",
-  "http://finance.yahoo.com/q?s=^IXIC",
-  "http://firedoglake.com/",
-  "http://fivethirtyeight.com/",
-  "http://fivethirtyeight.com/contributors/nate-silver/",
-  "http://football.fantasysports.yahoo.com/?ovchn=YAH&ovcpn=Front+Page&ovcrn=Front+page+P+Link+Nav+button&ovrfd=YAH&ovtac=AD",
-  "http://forum.deviantart.com/",
-  "http://fotki.yandex.ru/",
-  "http://foxied3.deviantart.com",
-  "http://foxied3.deviantart.com?connect",
-  "http://freebeacon.com/",
-  "http://fresh.amazon.com",
-  "http://fucking2princess.deviantart.com/art/I-need-a-kiss-32314312",
-  "http://games.dailymotion.com",
-  "http://globalvoicesonline.org/",
-  "http://gma.yahoo.com/rita-wilson-breast-cancer-underwent-double-mastectomy-130715475--abc-news-celebrities.html",
-  "http://go.microsoft.com/?linkid=9844325",
-  "http://go.microsoft.com/fwlink/?LinkID=246338&CLCID=0409",
-  "http://go.microsoft.com/fwlink/?LinkID=286759&CLCID=409",
-  "http://go.microsoft.com/fwlink/?LinkId=248686&CLCID=0409",
-  "http://gothamist.com/",
-  "http://graphics.wsj.com/2016-candidate-tracker/",
-  "http://graphics.wsj.com/quarterly-bank-earnings/",
-  "http://groups.deviantart.com",
-  "http://guzeetia.deviantart.com/art/art-kiss-102427677",
-  "http://headlines.yahoo.co.jp/hl?a=20150415-00000009-san-l28.view-000",
-  "http://help.baidu.com/question",
-  "http://help.deviantart.com/",
-  "http://help.wsj.com/customer-service/?mod=WSJ_footer",
-  "http://help.yahoo.com/kb/index?page=content&y=PROD_FRONT&locale=en_US&id=SLN14553",
-  "http://help.yandex.ru/",
-  "http://home.yandex.ru/?from=prov_main",
-  "http://hotlineblog.nationaljournal.com/",
-  "http://ie8.smoothfusion.com/WallStreetJournal/view.aspx",
-  "http://image.baidu.com/i?tn=baiduimage&ct=201326592&lm=-1&cl=2&word=rice&&fr=ala&ori_query=rice&ala=0&alatpl=sp&pos=3",
-  "http://image.baidu.com/i?tn=baiduimage&ct=201326592&lm=-1&cl=2&word=rice&fr=ala&ori_query=rice&ala=0&alatpl=sp&pos=0",
-  "http://image.baidu.com/i?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=cow",
-  "http://image.baidu.com/i?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=rice",
-  "http://indo.wsj.com/home-page?_wsjregion=asia,indo&_homepage=/home/indo",
-  "http://info.yahoo.com/",
-  "http://info.yahoo.com/privacy/us/yahoo/relevantads.html",
-  "http://inhealth.cnn.com/taking-control-of-low-testosterone/boosting-intimacy-when-you-have-low-t?did=t1_rss5",
-  "http://ireport.cnn.com",
-  "http://itunes.apple.com/us/app/the-huffington-post/id306621789?mt=8",
-  "http://itunes.apple.com/us/app/the-wall-street-journal./id364387007?mt=8",
-  "http://jane-po.deviantart.com/",
-  "http://janpirnatphoto.deviantart.com/art/Love-84241487",
-  "http://jeffieb.deviantart.com/art/Daredevil-Batman-165338550",
-  "http://jnkboy.deviantart.com/",
-  "http://jnkboy.deviantart.com/art/Doomguy-526592769",
-  "http://jobs.dailymotion.com/en/home",
-  "http://jon-lock.deviantart.com/art/Reflect-526904127",
-  "http://jp.wsj.com/home-page?_wsjregion=asia,jp&_homepage=/home/jp",
-  "http://jtart876.deviantart.com",
-  "http://jtart876.deviantart.com?connect",
-  "http://judaism.stackexchange.com/questions/57330/the-history-of-the-sephardic-chief-rabbis-outfit",
-  "http://justabreyerdreamer.deviantart.com",
-  "http://justabreyerdreamer.deviantart.com?connect",
-  "http://kawacy.deviantart.com/art/Normal-vs-my-shading-526828438",
-  "http://kaz-d.deviantart.com/",
-  "http://kdp.amazon.com/",
-  "http://koloromuj.deviantart.com/",
-  "http://kr.wsj.com/home-page?_wsjregion=asia,kr&_homepage=/home/kr",
-  "http://kr0npr1nz.deviantart.com/art/Apple-526648081",
-  "http://krugman.blogs.nytimes.com/",
-  "http://l.deviantart.com/",
-  "http://lisa-lou-who.deviantart.com/art/Custom-Handmade-Harry-Potter-Letterman-Jackets-526868122",
-  "http://little-pretty.deviantart.com/art/Oh-It-Is-Love-55313318",
-  "http://live.huffingtonpost.com/",
-  "http://live.huffingtonpost.com/r/segment/5506f95602a7606fd600061e",
-  "http://live.huffingtonpost.com/r/segment/5519718702a7606fd6001335",
-  "http://live.huffingtonpost.com/r/segment/552c06e502a760e8d900061e",
-  "http://live.huffingtonpost.com/r/segment/552c226402a760eece00060d",
-  "http://live.huffingtonpost.com/r/segment/552c22da78c90a6c5f0005a0",
-  "http://live.wsj.com",
-  "http://live.wsj.com/?category=markets",
-  "http://live.wsj.com/?category=news hub am",
-  "http://live.wsj.com/?category=opinion",
-  "http://m.huffingtonpost.com",
-  "http://m.imdb.com?ref_=ft_mdot",
-  "http://m.twitter.com",
-  "http://maddog197x.deviantart.com/",
-  "http://maddog197x.deviantart.com/journal/FNAF-Do-You-Wanna-Make-a-Pizza-Parody-526610047",
-  "http://map.baidu.com",
-  "http://map.baidu.com/m?word=cow&fr=ps01000",
-  "http://map.baidu.com/m?word=rice&fr=ps01000",
-  "http://maps.yandex.ru",
-  "http://marioluevanos.deviantart.com/",
-  "http://market.yandex.ru/?clid=505",
-  "http://market.yandex.ru/?clid=506",
-  "http://market.yandex.ru/catalog?hid=7812191&clid=514&utm_source=face&utm_medium=cpc&utm_term=shoes&utm_campaign=world",
-  "http://markets.wsj.com/us",
-  "http://markets.wsj.com/us?mod=WSJ_hpp_marketdata",
-  "http://marthig.deviantart.com/",
-  "http://marthig.deviantart.com/journal/April-May-2015-Happy-Easter-and-Stuff-526302602",
-  "http://math.stackexchange.com/questions/1233283/why-did-euler-use-e-to-represent-complex-numbers",
-  "http://mathematica.stackexchange.com/questions/79866/create-a-list-of-rules-built-from-data-set-fields",
-  "http://maxromanchak.deviantart.com/art/Kingpin-206522937",
-  "http://mbreitweiser.deviantart.com/art/Daredevil-Yellow-138971835",
-  "http://mediamatters.org/",
-  "http://messenger.yahoo.com",
-  "http://meta.stackoverflow.com",
-  "http://metrika.yandex.ru/",
-  "http://minhtrucdiep.deviantart.com",
-  "http://minhtrucdiep.deviantart.com?connect",
-  "http://modyrabi3.deviantart.com/",
-  "http://modyrabi3.deviantart.com/favourites/11305942/kiss",
-  "http://money.cnn.com",
-  "http://money.cnn.com/",
-  "http://money.cnn.com/2015/04/12/technology/game-of-thrones-leaked-episodes/index.html",
-  "http://money.cnn.com/2015/04/14/pf/college/corinthian-college-fine/index.html",
-  "http://money.cnn.com/gallery/pf/taxes/2014/04/08/tax-mistakes/",
-  "http://money.cnn.com/magazines/fortune/",
-  "http://moonbeam13.deviantart.com/",
-  "http://moonbeam13.deviantart.com/journal/Celebrating-Deviousness-April-2015-523811377",
-  "http://moviefone.com",
-  "http://music.baidu.com/search?fr=ps&ie=utf-8&key=cow",
-  "http://music.baidu.com/search?fr=ps&ie=utf-8&key=rice",
-  "http://my.yahoo.com?mkg=015",
-  "http://naktarra.deviantart.com/",
-  "http://naktarra.deviantart.com/journal/April-THE-GROOVIEST-LIT-IN-TOWN-VOLUME-THIRTEEN-526576202",
-  "http://nanomortis.deviantart.com/art/Followers-526688319",
-  "http://new.dowjones.com/factiva/?link=djcom_factiva_o_hsad2_5jun14",
-  "http://news.baidu.com",
-  "http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=cow",
-  "http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=rice",
-  "http://news.google.com/",
-  "http://news.yahoo.co.jp/fc",
-  "http://news.yahoo.co.jp/list/?d=20150415&mc=f&mp=f",
-  "http://news.yahoo.com/",
-  "http://news.yahoo.com/christie-proposing-overhaul-social-security-benefits-131803972--finance.html",
-  "http://news.yahoo.com/clinton-starts-iowa-campaign-small-town-meetings-072032295--election.html",
-  "http://news.yahoo.com/comics/dilbert-slideshow/",
-  "http://news.yahoo.com/former-atlanta-public-school-educators-sentenced-125312564.html",
-  "http://news.yahoo.com/lightbox/dilbert-slideshow/20150414-dt150414-gif-photo-050305838.html",
-  "http://news.yahoo.com/marion-marechal-le-pen-poster-girl-french-far-171254622.html",
-  "http://news.yahoo.com/n-korea-first-lady-appears-public-first-time-034036151.html",
-  "http://news.yahoo.com/obama-removes-cuba-state-sponsor-terror-list-190658891--politics.html",
-  "http://news.yahoo.com/pleas-mulled-former-atlanta-educators-test-cheating-scandal-120733406.html",
-  "http://news.yahoo.com/senate-committee-challenge-obama-vote-iran-bill-072425948--politics.html",
-  "http://news.yahoo.com/suspect-arrested-florida-deadly-shooting-north-carolina-college-113059552.html",
-  "http://news.yahoo.com/video/man-kicked-florida-bar-lights-121529294.html",
-  "http://news.yahoo.com/video/marco-rubio-152011188.html",
-  "http://news.yandex.ru/yandsearch?cl4url=lenta.ru/news/2015/04/14/osce/&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=ria.ru/economy/20150414/1058505479.html&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=ria.ru/science/20150415/1058595666.html&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=ria.ru/world/20150414/1058574421.html&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=rusplt.ru/news/pentagon-zayavil-o-nevozmojnosti-ssha-protivostoyat-kiberugrozam-333759.html&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=sport.rbc.ru/article/254275/&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=www.gazeta.ru/comments/2015/04/14_e_6638881.shtml&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=www.ng.ru/news/500284.html&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=www.rg.ru/2015/04/14/kuba-site-anons.html&lang=ru&lr=102567",
-  "http://news.yandex.ru/yandsearch?cl4url=www.vz.ru/news/2015/4/15/740016.html&lang=ru&lr=102567",
-  "http://nunoplati.deviantart.com/art/Elektra-quickie-262134791",
-  "http://nymag.com/",
-  "http://nymag.com/author/jonathan%20chait/",
-  "http://odetoempyrean.deviantart.com/",
-  "http://offers.lendingtree.com/splitter/splitter.ashx?id=CNN_Article_Credit2&800num=hide&siteid=credit&hpt=hp_bn17",
-  "http://offers.lendingtree.com/splitter/splitter.ashx?id=CNN_Article_Personal3&hpt=hp_bn17",
-  "http://offers.lendingtree.com/splitter/splitter.ashx?id=CNN_Article_Refi1&800num=hide&siteid=seetodays&hpt=hp_bn17",
-  "http://offers.lendingtree.com/splitter/splitter.ashx?id=RefisavingsJDT1",
-  "http://offers.lendingtree.com/splitter/splitter.ashx?id=cnn-homepage",
-  "http://office.com/start/default.aspx?WT.mc_id=O16_BingHP",
-  "http://official.dailymotion.com",
-  "http://oilprice.com/",
-  "http://oneforthetable.com/",
-  "http://online.barrons.com/?mod=ProdX_MktgHub",
-  "http://online.barrons.com/home",
-  "http://online.wsj.com",
-  "http://online.wsj.com/10point",
-  "http://online.wsj.com/?mod=WSJDE_footer",
-  "http://online.wsj.com/article/SB10001424052702303754904577531431270923056.html",
-  "http://online.wsj.com/article/SB12202959562200624841004580578553193939656.html?mod=WSJ_hpp_PhotosModule_2",
-  "http://online.wsj.com/article/SB12202959562200624841004580580721622231574.html?mod=WSJ_hpp_PhotosModule_1",
-  "http://online.wsj.com/conferences?mod=WSJ_footer",
-  "http://online.wsj.com/home-page",
-  "http://online.wsj.com/news/column/Corrections?mod=WSJ_footer",
-  "http://online.wsj.com/news/politics",
-  "http://online.wsj.com/public/page/classified-search.html",
-  "http://online.wsj.com/public/page/email-setup.html?sub=capital_journal_daybreak&mod=WSJHomeCapitalJournalDaybreak",
-  "http://online.wsj.com/public/page/email-setup.html?sub=the_10_point&mod=WSJHome10Point",
-  "http://online.wsj.com/public/page/news-lifestyle-arts-entertainment.html",
-  "http://online.wsj.com/public/page/news-opinion-commentary.html",
-  "http://online.wsj.com/public/page/news-real-estate-homes.html",
-  "http://online.wsj.com/public/page/peggy-noonan.html",
-  "http://online.wsj.com/public/page/podcast.html?mod=WSJ_footer",
-  "http://online.wsj.com/public/page/rss_news_and_feeds.html?mod=WSJ_footer",
-  "http://online.wsj.com/public/search?article-doc-type=%7BThe+10-Point%7D&HEADER_TEXT=the+10-point",
-  "http://onlinehelp.microsoft.com/en-US/bing/ff808535.aspx",
-  "http://open.baidu.com/",
-  "http://openvod.dailymotion.com",
-  "http://past1978.deviantart.com/",
-  "http://peskykid.deviantart.com/art/KINGPIN-379068877",
-  "http://pevc.dowjones.com/?mod=ProdX_MktgHub",
-  "http://physics.stackexchange.com/questions/175985/can-we-theoretically-balance-a-perfectly-symmetry-pencil-on-its-one-atom-tip",
-  "http://picolo-kun.deviantart.com/art/6Teen-526818194",
-  "http://pix-man.deviantart.com/",
-  "http://pixiveo.deviantart.com/art/Animated-Girl-Weight-Gain-Expansion-526501668",
-  "http://poldhannahms.deviantart.com/art/Tender-Kiss-66694744",
-  "http://politicalwire.com/",
-  "http://politics.suntimes.com/authors/lsweet",
-  "http://poll.deviantart.com/439/",
-  "http://portfolio.deviantart.com",
-  "http://portfolio.wsj.com?mod=wsj_port_foot",
-  "http://portfolio.wsj.com?mod=wsj_port_hat",
-  "http://press.dailymotion.com/us",
-  "http://privacy.aol.com/",
-  "http://pro.imdb.com/signup/index.html?rf=cons_ft_hm&ref_=cons_ft_hm",
-  "http://pro.imdb.com/signup/index.html?rf=cons_nb_hm&ref_=cons_nb_hm",
-  "http://professor.wsj.com/",
-  "http://projectporkchop.deviantart.com",
-  "http://promotion.yahoo.co.jp/event/disney_easter2015/interview/",
-  "http://psychoheat.deviantart.com/art/Bullseye-6447212",
-  "http://pubads.g.doubleclick.net/gampad/clk?id=165311666&iu=/2/interactive.wsj.com/default",
-  "http://pubads.g.doubleclick.net/gampad/clk?id=189483626&iu=/2/interactive.wsj.com/default",
-  "http://pubads.g.doubleclick.net/gampad/clk?id=196199186&iu=/2",
-  "http://publisher.dailymotion.com/?l=en",
-  "http://puzzling.stackexchange.com/questions/12087/poor-dvorak-a-limerick",
-  "http://qosim.doubleclick.net/cgi-bin/honeypot.pl?client=downjones",
-  "http://quotes.wsj.com/bond/BX/TMBMKDE-10Y",
-  "http://quotes.wsj.com/bond/BX/TMBMKES-10Y",
-  "http://quotes.wsj.com/bond/BX/TMBMKGB-10Y",
-  "http://quotes.wsj.com/bond/BX/TMBMKIT-10Y",
-  "http://quotes.wsj.com/bond/BX/TMBMKJP-10Y",
-  "http://quotes.wsj.com/bond/BX/TMUBMUSD10Y",
-  "http://quotes.wsj.com/futures/CORN",
-  "http://quotes.wsj.com/futures/CRUDE OIL - ELECTRONIC",
-  "http://quotes.wsj.com/futures/DOW JONES INDUSTRIAL FUTURES",
-  "http://quotes.wsj.com/futures/GOLD",
-  "http://quotes.wsj.com/futures/S%26P 500 FUTURES",
-  "http://quotes.wsj.com/futures/SILVER",
-  "http://quotes.wsj.com/fx/AUDUSD",
-  "http://quotes.wsj.com/fx/EURUSD",
-  "http://quotes.wsj.com/fx/GBPUSD",
-  "http://quotes.wsj.com/fx/USDCHF",
-  "http://quotes.wsj.com/fx/USDJPY",
-  "http://quotes.wsj.com/index/CN/SHCOMP",
-  "http://quotes.wsj.com/index/COMP",
-  "http://quotes.wsj.com/index/DJI",
-  "http://quotes.wsj.com/index/DWCF",
-  "http://quotes.wsj.com/index/DX/DAX",
-  "http://quotes.wsj.com/index/FR/PX1",
-  "http://quotes.wsj.com/index/GDOW",
-  "http://quotes.wsj.com/index/HK/HSI",
-  "http://quotes.wsj.com/index/IN/1",
-  "http://quotes.wsj.com/index/JP/NIK",
-  "http://quotes.wsj.com/index/RUT",
-  "http://quotes.wsj.com/index/SG/STI",
-  "http://quotes.wsj.com/index/SPX",
-  "http://quotes.wsj.com/index/UK/UKX",
-  "http://quotes.wsj.com/index/XX/ADOW",
-  "http://quotes.wsj.com/index/XX/BUXX",
-  "http://quotes.wsj.com/index/XX/FTSEMIB",
-  "http://quotes.wsj.com/index/XX/IBEX?mod=DNH_S",
-  "http://quotes.wsj.com/index/XX/SXXP",
-  "http://rabota.yandex.ru/?from=morda&_openstat=yandex;title;salary;salaryStatall",
-  "http://rabota.yandex.ru/salary.xml?from=morda&_openstat=yandex;text;salary;salaryStatall",
-  "http://rashomon707.deviantart.com/art/Kiss-23611807",
-  "http://rasix-designs.deviantart.com/",
-  "http://rdsig.yahoo.co.jp/shopping/points/premium/evt=125378/RV=1/RU=aHR0cDovL3RvcGljcy5zaG9wcGluZy55YWhvby5jby5qcC9jYW1wYWlnbi9wb2ludHMvcHJlbWl1bS8_c2NfZT15dHRs",
-  "http://realty.yandex.ru/?from=morda&_openstat=yandex;title;sell;sell1appAllruru",
-  "http://realty.yandex.ru/search.xml?type=SELL&category=APARTMENT&roomsTotal=1&from=morda&_openstat=yandex;text;sell;sell1appAllruru",
-  "http://recommend.yahoo.co.jp/onepiece77/",
-  "http://redstate.com/",
-  "http://reiq.deviantart.com/art/Sherry-Patreon-Commish-526710915",
-  "http://reneaigner.deviantart.com/",
-  "http://reporting.sunlightfoundation.com/blog/",
-  "http://rich35211.deviantart.com/",
-  "http://robertreich.org/",
-  "http://sakimichan.deviantart.com/art/Harley-Quinn-Caution-nsfw-526774728",
-  "http://sakuraanxinh.deviantart.com",
-  "http://sakuraanxinh.deviantart.com?connect",
-  "http://saphiredesign.deviantart.com/",
-  "http://scifi.stackexchange.com/questions/86221/was-aragorn-based-on-bard-from-the-hobbit",
-  "http://scifi.stackexchange.com/questions/86250/what-books-are-shown-on-the-bookshelf-in-interstellar",
-  "http://scifi.stackexchange.com/questions/86253/looking-for-a-sci-fi-about-life-after-death",
-  "http://screen.yahoo.com/other-space/episode-1-great-beyond-beyond-070100400.html",
-  "http://search.yahoo.com/",
-  "http://search.yahoo.com/local",
-  "http://seattletimes.nwsource.com/html/home/index.html",
-  "http://security.stackexchange.com/questions/85963/what-is-the-purpose-of-frequently-rotating-tls-certificates-without-changing-und",
-  "http://serhatbayram.deviantart.com/art/Kiss-98458361",
-  "http://services.amazon.com/content/product-ads-on-amazon.htm/ref=footer_pads?ld=AZPADSFooter",
-  "http://setup1.wsj.com/pznsetup/sub/ksemail/setup.html?mod=WSJ_footer",
-  "http://setup1.wsj.com/pznsetup/sub/pvemail/setup.html?mod=WSJ_footer",
-  "http://shine.yahoo.com/horoscope/",
-  "http://shop.deviantart.com",
-  "http://shousetsu.deviantart.com/art/A-kiss-67714339",
-  "http://siriussteve.deviantart.com/art/Hulk-and-Daredevil-458117073",
-  "http://slovari.yandex.ru/",
-  "http://spilt-sugar.deviantart.com/art/The-Adorable-Ones-Kiss-104463992",
-  "http://sports.yahoo.com",
-  "http://sports.yahoo.com/",
-  "http://sports.yahoo.com/fantasy",
-  "http://sports.yahoo.com/mlb/teams/ari",
-  "http://sports.yahoo.com/mlb/teams/bos",
-  "http://sports.yahoo.com/mlb/teams/chc",
-  "http://sports.yahoo.com/mlb/teams/cin",
-  "http://sports.yahoo.com/mlb/teams/det",
-  "http://sports.yahoo.com/mlb/teams/laa",
-  "http://sports.yahoo.com/mlb/teams/lad",
-  "http://sports.yahoo.com/mlb/teams/pit",
-  "http://sports.yahoo.com/mlb/teams/sdg",
-  "http://sports.yahoo.com/mlb/teams/sea",
-  "http://sports.yahoo.com/mlb/teams/tex",
-  "http://sports.yahoo.com/mlb/teams/was",
-  "http://sports.yahoo.com/nba/teams/bos",
-  "http://sports.yahoo.com/nba/teams/den",
-  "http://sports.yahoo.com/nba/teams/gsw",
-  "http://sports.yahoo.com/nba/teams/ind",
-  "http://sports.yahoo.com/nba/teams/lac",
-  "http://sports.yahoo.com/nba/teams/mem",
-  "http://sports.yahoo.com/nba/teams/pho",
-  "http://sports.yahoo.com/nba/teams/tor",
-  "http://sports.yahoo.com/nba/teams/was",
-  "http://sports.yahoo.com/news/clippers-eke-6th-straight-win-110-103-over-053647163--nba.html",
-  "http://sports.yahoo.com/news/clippers-suns-preview-135440723--nba.html",
-  "http://sports.yahoo.com/news/dodgers-beat-mariners-6-5-10-innings-053526333--mlb.html",
-  "http://sports.yahoo.com/news/inciartes-career-high-4-rbis-help-d-backs-051830505--mlb.html",
-  "http://sports.yahoo.com/news/klay-thompson-scores-42-warriors-down-memphis-111-050505414--nba.html",
-  "http://sports.yahoo.com/news/nationals-red-sox-preview-012751752--mlb.html",
-  "http://sports.yahoo.com/news/raptors-celtics-preview-135440146--nba.html",
-  "http://sports.yahoo.com/news/reds-cubs-preview-135234539--mlb.html",
-  "http://sports.yahoo.com/news/tigers-pirates-preview-135131838--mlb.html",
-  "http://sports.yahoo.com/news/wizards-pacers-preview-135440877--nba.html",
-  "http://sports.yahoo.com/photos/10-most-popular-nba-teams-according-to-merchandise-sales-1429031016-slideshow/",
-  "http://sta.sh",
-  "http://sta.sh/0173o5y7gti6",
-  "http://sta.sh/muro",
-  "http://sta.sh/muro/",
-  "http://sta.sh/writer",
-  "http://stackexchange.com/legal",
-  "http://stackexchange.com/legal/privacy-policy",
-  "http://stackexchange.com/mediakit",
-  "http://stackexchange.com/sites#culturerecreation",
-  "http://stackexchange.com/sites#lifearts",
-  "http://stackexchange.com/sites#science",
-  "http://stackexchange.com/sites#technology",
-  "http://stackexchange.com/work-here",
-  "http://status.twitter.com",
-  "http://subscription.wsj.com/",
-  "http://superuser.com/questions/901556/does-increasing-upload-or-download-speed-reduce-ping",
-  "http://support.twitter.com/articles/14226-how-to-find-your-twitter-short-code-or-long-code",
-  "http://support.twitter.com/forums/26810/entries/78525",
-  "http://susib.deviantart.com/art/Sunset-Kiss-58122131",
-  "http://swampland.time.com/",
-  "http://sweetpeapix.deviantart.com/art/First-Kiss-49646473",
-  "http://techgnotic.deviantart.com/",
-  "http://techgnotic.deviantart.com/art/Today-s-Headlines-From-The-News-Desk-4-14-15-526757199",
-  "http://techgnotic.deviantart.com/art/Today-s-Headlines-From-The-News-Desk-4-14-15-526757199#Destiny-Expansion-Trailer",
-  "http://techgnotic.deviantart.com/art/Today-s-Headlines-From-The-News-Desk-4-14-15-526757199#Katee-Sackhoff-To-Create-New-Series",
-  "http://techgnotic.deviantart.com/art/Today-s-Headlines-From-The-News-Desk-4-14-15-526757199#Olivia-Munn-To-Play-Psylocke",
-  "http://techgnotic.deviantart.com/art/Today-s-Headlines-From-The-News-Desk-4-14-15-526757199#Photography-Debate",
-  "http://techgnotic.deviantart.com/art/Today-s-Headlines-From-The-News-Desk-4-14-15-526757199#Scream-Trailer",
-  "http://techgnotic.deviantart.com/art/Today-s-Headlines-From-The-News-Desk-4-14-15-526757199#Wonder-Woman-Loses-Its-Director",
-  "http://techgnotic.deviantart.com/journal/Chasing-The-Sun-Solar-Power-Is-The-Next-Big-Thing-526784981",
-  "http://techgnotic.deviantart.com/journal/Collection-Gnomes-Are-of-the-Earth-524480804",
-  "http://techgnotic.deviantart.com/journal/Collection-Major-League-Baseball-525430006",
-  "http://techgnotic.deviantart.com/journal/Collection-Mazes-Puzzles-For-The-Truly-Committed-526759351",
-  "http://techgnotic.deviantart.com/journal/Collection-The-Artist-s-Toolkit-524244375",
-  "http://techgnotic.deviantart.com/journal/Cosplay-Friday-Mortal-Kombat-525687698",
-  "http://techgnotic.deviantart.com/journal/Daredevil-Man-Without-Fear-517994215",
-  "http://techgnotic.deviantart.com/journal/DeviantArt-Road-Trip-Isle-of-Wight-526094317",
-  "http://techgnotic.deviantart.com/journal/Edward-Gorey-Illustrator-Or-Artist-518419735",
-  "http://techgnotic.deviantart.com/journal/Fan-Art-Friday-Gargoyles-525639001",
-  "http://techgnotic.deviantart.com/journal/Food-In-Focus-A-Taste-Of-Japan-524467347",
-  "http://techgnotic.deviantart.com/journal/Furious-7-Have-Car-Chases-Finally-Jumped-The-Shark-513488584",
-  "http://techgnotic.deviantart.com/journal/Game-of-Thrones-9-Worst-Destinations-In-Westeros-521429710",
-  "http://techgnotic.deviantart.com/journal/Lightning-Boy-Studio-Pursuing-A-Dream-524555790",
-  "http://techgnotic.deviantart.com/journal/Margaret-Atwood-Queen-Of-Devious-Ideas-524309809",
-  "http://techgnotic.deviantart.com/journal/Project-Porkchop-Vol-364-525892839",
-  "http://techgnotic.deviantart.com/journal/The-Battle-For-Breakfast-Is-Fought-With-Ads-524255897",
-  "http://techgnotic.deviantart.com/journal/The-Power-Of-Tomorrow-Tesla-Develops-Future-Tech-524494920",
-  "http://techgnotic.deviantart.com/journal/The-Procrastinator-A-Day-In-The-Life-526043463",
-  "http://techgnotic.deviantart.com/journal/The-Written-Revolution-Interviews-On-Writing-510605539",
-  "http://techgnotic.deviantart.com/journal/Watch-The-Throne-S5-E1-The-Wars-To-Come-526718761",
-  "http://tex.stackexchange.com/questions/238503/tip-on-how-to-make-a-visually-good-table",
-  "http://thehill.com/",
-  "http://themoderatevoice.com/",
-  "http://theweek.com/speedreads/549552/construction-worker-accidentally-discovers-1000yearold-hideout",
-  "http://thinkprogress.org/",
-  "http://thinkprogress.org/justice/2015/04/14/3646567/no-go-zones-nra-convention/",
-  "http://thrive.huffingtonpost.com/events/",
-  "http://thrive.huffingtonpost.com/news/",
-  "http://tieba.baidu.com",
-  "http://tieba.baidu.com/f?kw=cow&fr=wwwt",
-  "http://tieba.baidu.com/f?kw=rice&fr=ps0bt&ie=utf-8",
-  "http://tieba.baidu.com/f?kw=rice&fr=wwwt",
-  "http://time.yandex.ru",
-  "http://tintinspartan.deviantart.com/",
-  "http://tonytorrid.deviantart.com/art/Elektra-Assassin-WIP-179330968",
-  "http://topics.nytimes.com/top/opinion/editorialsandoped/oped/columnists/davidbrooks/index.html",
-  "http://topics.nytimes.com/top/opinion/editorialsandoped/oped/columnists/rossdouthat/",
-  "http://topics.wsj.com/?mod=WSJ_footer",
-  "http://translate.yandex.ru/",
-  "http://tune.yandex.ru",
-  "http://tune.yandex.ru/?retpath=http%3A%2F%2Fwww.yandex.ru%2F%3Fdomredir%3D1",
-  "http://tune.yandex.ru/region/?retpath=http%3A%2F%2Fwww.yandex.ru%2F%3Fdomredir%3D1",
-  "http://tv.yahoo.com/news/tom-brokaw-breaks-silence-brian-williams-really-really-180431228.html",
-  "http://twitter.com/WSJ",
-  "http://twpictures.deviantart.com/",
-  "http://uncannyknack.deviantart.com/",
-  "http://unix.stackexchange.com/questions/196135/problems-when-trying-to-execute-sh-file-from-another-sh-file",
-  "http://unix.stackexchange.com/questions/196227/using-the-variable-file-obtained-from-for-file-in-and-pass-to-another-scri",
-  "http://unkopierbar.deviantart.com/",
-  "http://unkopierbar.deviantart.com/journal/Light-Hunters-Feature-108-526680866",
-  "http://v.baidu.com",
-  "http://v.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&ie=utf-8&word=cow",
-  "http://v.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&ie=utf-8&word=rice",
-  "http://vaxzone.deviantart.com/art/League-of-Legends-Get-Jinxed-526191916",
-  "http://videos.huffingtonpost.com/world",
-  "http://voces.huffingtonpost.com/",
-  "http://wallpaper.deviantart.com/?q=",
-  "http://web-trunk-qa.youtube.com/test_languages?prepare_for_screenshotting=1",
-  "http://welcome.deviantart.com",
-  "http://welcome.deviantart.com/",
-  "http://wenku.baidu.com/search?word=cow&lm=0&od=0&ie=utf-8",
-  "http://wenku.baidu.com/search?word=rice&lm=0&od=0&ie=utf-8",
-  "http://whitneychristine.deviantart.com/art/kiss-52986647",
-  "http://widgets.yandex.ru?consumer=www",
-  "http://wolftamer358.deviantart.com",
-  "http://wolftamer358.deviantart.com?connect",
-  "http://wonkette.com/",
-  "http://worldbuilding.stackexchange.com/questions/14254/how-would-a-post-planetary-civilization-measure-time",
-  "http://worldbuilding.stackexchange.com/questions/14300/how-can-i-explain-a-planet-with-perpetual-rain",
-  "http://wsj.com/partner/?mod=WSJ_footer",
-  "http://wsj.com/worldstream",
-  "http://wsjstudent.com/",
-  "http://www.6pm.com/",
-  "http://www.GlobalPost.com",
-  "http://www.abebooks.com/",
-  "http://www.accesshollywood.com",
-  "http://www.actionamerica.com/",
-  "http://www.acx.com",
-  "http://www.afterschool.com/",
-  "http://www.alexa.com/",
-  "http://www.aljazeera.com/",
-  "http://www.amazon.ca/",
-  "http://www.amazon.cn/",
-  "http://www.amazon.co.jp/",
-  "http://www.amazon.co.uk/",
-  "http://www.amazon.com.au",
-  "http://www.amazon.com.br",
-  "http://www.amazon.com.mx/",
-  "http://www.amazon.com/services",
-  "http://www.amazon.de/",
-  "http://www.amazon.es/",
-  "http://www.amazon.fr/",
-  "http://www.amazon.in/",
-  "http://www.amazon.it/",
-  "http://www.amazon.nl/",
-  "http://www.amazonsupply.com/",
-  "http://www.americablog.com/",
-  "http://www.artlebedev.ru",
-  "http://www.audible.com/",
-  "http://www.bagnewsnotes.com/",
-  "http://www.baidu.com/",
-  "http://www.baidu.com/gaoji/preferences.html",
-  "http://www.baidu.com/link?url=-M91t8L7rn2kU_un4Mo2wO-p3qp6o5yTofPuHNwv7BRbOttA4-UAH4yAbTAnxkwil3mfSEqFi0EO8-Algv59aq",
-  "http://www.baidu.com/link?url=0mQV9609slSYX24q8klfO6QNPDS4KRmp7MJ7al3xOZrdcfIwru3UHk0v3x5mu9nEoykWs6q8TCOXwXw5F3VUHbqv6lUkWarNoVv4GulM-T3",
-  "http://www.baidu.com/link?url=0mQV9609slSYX24q8klfO79QOL1mV2G6YCk5rYUBAz6GIoxmPXR7ny4p4Uhq6V7ceRiP0P1uVXfbgHPgzE4CmtqWmqYq8WSE9mXAzSiSHeW-fYPIbXC7akeB-FaU5qBMHvTGVFWRAaN2Ph4hc7UcIj_Cc2jq7sn5uIeTNNWe-0rgKC81FOSNoj6Iq5n9kJ_r",
-  "http://www.baidu.com/link?url=0mQV9609slSYX24q8klfO8k5FF1XdSGtfGqb3L12GLb1y4UhOobfEzWxKWkEcxk7BlbxXRWZDowWhEXM5TW3hqrOa1VI9UiMzHXIpwNDwue",
-  "http://www.baidu.com/link?url=0mQV9609slSYX24q8klfO8k5FF1XdSGtfGqb3L12GLb766FUGGJ2OhZ-8D11ASC9TQ0BK8Q9p6U9KXyrlXEBwkIVMAsAqcZTTLuFmB3u_7qFMGdy5-wJzwJRur09COfMmosC9Z3IqBijpVdcaLR87TgPqm_jMriLMrRCJDcPoAC",
-  "http://www.baidu.com/link?url=0mQV9609slSYX24q8klfO9xNybEKvMAzqbU-nGEllsXxp1JIL5W3fs_G3LqC40H4plJzvhl6T3e5cLKDl2NJm2fhUckux6aw04dRKrasobDFf_IvWy0Pz3YC8ulaJajFIAq_YBkDFNXCIG0D4GT0cAGIShsMEu11_gcwo3ar3jQcX9TTisjnDVbNEwG3Ra6s-H_STlfLaxbQjPzAFln51_",
-  "http://www.baidu.com/link?url=0mQV9609slSYX24q8klfOq90QIZJXsV2nOlAbzs0Yp6o6wNTkqIMybfuSet091hc1K86eRWI7DOskzBotzhUDv2T0_MhsKzzLEZHi2teMaa",
-  "http://www.baidu.com/link?url=0mQV9609slSYX24q8klfOqHEyaLk64jpV8WHABKLhNvkeRCuTEdZV_fdb7VJ_vd43oA9IIvNzkxJ6XOpvvwGqqTfAn8SaUxlSj0aQ2KVUGWG_3Imo847zhsBZ0ATt-36e8k5YiM7r1CmcYtfI2cjpBdguox5ToM2Iqh9D0YbOsbVY-6EifiyiZDySchQcX81",
-  "http://www.baidu.com/link?url=2PhJ5AqeTnSbSr9XDWFWi_HWyi0bzBf2y5KmcHeVYK105XPDXgrJCmobJITaqdO3",
-  "http://www.baidu.com/link?url=3hOFcy9XXCTbBiNXtU7Gaf9PSvxUi-Ni25gGeym_GMGppjHQEpHFyEfmgBdDCR1p",
-  "http://www.baidu.com/link?url=3hOFcy9XXCTbBiNXtU7Gaf9PSvxUi-Ni25gGeym_GMIDgQKIOuJVvz38ek1ORvFwcMokY4LZcyGzdPqhfLy38nc9AcUJiIJG0dsvuAv7U_LNBf13meTPpRNAZTIvpX7kagZ81psl2PW4EKjxzn4D8_",
-  "http://www.baidu.com/link?url=5uns9UowL1ZepzZm8E26sOL3uJezwjIT3mfcNR7_FPkYt2IbV1UMvsBT_n0hqEjs",
-  "http://www.baidu.com/link?url=7hk-Iao0WutqX5osf6LjfZ53ONWYZV1lecGvT1HEupLm76juUIY13-Ay61JXIGjcDLd0_YH_ZAGrugaQVTaB0_",
-  "http://www.baidu.com/link?url=AL-zsBN7Wl1skmBFU4Btrgr_nU66vqigpOhaSI-BDnqO5_eSF4bZxW2wQienf5qC3qm3TleOiLRfYMtRaaPeX-lczbwVge_ILsgx09uo56u",
-  "http://www.baidu.com/link?url=AL-zsBN7Wl1skmBFU4BtrnNKvYGgVAIGcR5FDxKPWX85tZx7eAYH8XmH9tGks6ZBwX4Eyd2pFlzqaykfluIDGAU1MdZ72W9S7D1pFb23D2VppU6oH5Aoy68wcY6q64R3Pfqlru3eb6QYWLOAULu4DZWxJKymDbEiolqC0RE8c_a",
-  "http://www.baidu.com/link?url=EVxa_BTrai2lPssN74SEUDpGRvPjETEVq9sOfNk4OLq-UBQP2ZS5oCNtRG-L5HtDpm4oFd39a1JwVno-8c9E5a",
-  "http://www.baidu.com/link?url=EVxa_BTrai2lPssN74SEUI3M9lF6d30AUrvubL2VO-XL3MUo4WNhUG7AhKAidFq0",
-  "http://www.baidu.com/link?url=EVxa_BTrai2lPssN74SEUI3M9lF6d30AUrvubL2VO-YWfFzN4oqQccQXSZQIDCI7Tz95VJzKGPeYW-nsCNjuIncJqpMzXZqb4yTj3dPK9I7Icbm_aGzVCYB2uj17-X2bRLuX5DTxsURPqDv_KGvAKq",
-  "http://www.baidu.com/link?url=E_410vcScg2dOp6vwBY4WLNHpMFVnXDpG6_NgiFwj2FwmGRF3a9I8tKmTHYriXJ4JK4uGv7cjn2kyH_HtwZCNa",
-  "http://www.baidu.com/link?url=E_410vcScg2dOp6vwBY4WLNHpMFVnXDpG6_NgiFwj2FwmGRF3a9I8tKmTHYriXJ4WHI2qD6oRIrV53OGjxZNc_",
-  "http://www.baidu.com/link?url=E_410vcScg2dOp6vwBY4WLNHpMFVnXDpG6_NgiFwj2FwmGRF3a9I8tKmTHYriXJ4g7wsaDzyImFypFT5725nuq",
-  "http://www.baidu.com/link?url=FI5j5ft6lL75AJ3TV3DKS-Fj4QUK_6j-MngMpo3a4pW",
-  "http://www.baidu.com/link?url=IBoWOqaaEB2q3BbeNvVU5hvYa6S5B8HfbCNMlY9LonGWdIU_9cxkLuz4Z3UFaYaH34MvVrXjipALdHYwr9lUTn0KFCHYCiAyFTcaEtjDYvW",
-  "http://www.baidu.com/link?url=IyBgTYFahSFX-kHwc44jAhmYGKxY6JdH--kbhyhcWLccG2bm7OoaNzbwX0tct4zOxTMDGamsiosayde438FQeq",
-  "http://www.baidu.com/link?url=JHCMcSB6vseh77VSTAZ-YqU5KyEOSbCBIZj1WMC4cba",
-  "http://www.baidu.com/link?url=MiBQS6vM7KZu_dzfdpvtlB4jfCo1J7LNeOPza0gMz6hzxnUxLIgtDHIyL1D1HScDRvTmAOsl0tvrtYMtTGsmHa",
-  "http://www.baidu.com/link?url=NFE7_4jfpxJ7nvruIvBkmbCk4y6kSJ3aWWvojsASX1efdDQVxfsXoaKlpb9pA2in8GmrHbz2aOXW-ZszEERH6a",
-  "http://www.baidu.com/link?url=NFE7_4jfpxJ7nvruIvBkmbCk4y6kSJ3aWWvojsASX1go61yAq474lNBuDWlWMcjufjdPq8RwyNoqS2sOJTnwJK",
-  "http://www.baidu.com/link?url=UCI8DqUdy7_rlCN0vRN8OgO8IXIwwkUX0VOdViCKrurm_sT2o_SeDKhHsOn04OWp",
-  "http://www.baidu.com/link?url=avDdsoc1OwlkyKfgrInz5KyWHhKEnQ6jWDBH-9mMB9wEhyYrDmlRbGIkUiOJ-ykLq5WviBhmLLOSuyMkxzcuyq",
-  "http://www.baidu.com/link?url=bx9sWi5WnXjBkUhM5gvOSmz2CbZJ_-OiKdNgZr3udsS",
-  "http://www.baidu.com/link?url=f8pIyc0EEqRxtjnXi4mBlHJgaWX740RBVpMqsiALfKyXOeeGbMkQTxdMCswYkeh9H5pxo0drsY83Ucp9DkoY5iwf_3OIPPvl852Vdy9l34eEPzSdmL2HOM-hpLtFItO-pFh0YQExVbi_tDiTXcWrMEIxvEwOYgNOf4UoyLemN45k5YsQZOE5MI0keCmdXYcS_Q97aQq-LofBjDGgvJmj8K",
-  "http://www.baidu.com/link?url=f8pIyc0EEqRxtjnXi4mBlJFtLD-21u4Jd-cb0WmmjNCGe3la0qEQJzGnp3O_75ZNbn_kW5YJU4g0xqrla1n3boVyqmwjDGR-Mg_L1e3X92q",
-  "http://www.baidu.com/link?url=hMgPFqAn_EueXnigQ4nGVGqkcyhhVJzKjKHP5hl52rroccqSxUtaE7t0u5yl_Ero",
-  "http://www.baidu.com/link?url=nV4HENY9ckVeSVWwFshKgaY3DvOnJrVd_g_0qMg-UUM9GcmCeqxG96TLk-X5jzWFJfhE82mQTApIiYKXF1VUbk_jTcDmMJkInnaHgl86ZSDhXkkZabhN5wh7BDJc7FEWtWM1Ud1pWKfIQ0mLfbE57zV4vbzuiwdyRHJQ7DWtcti",
-  "http://www.baidu.com/link?url=nV4HENY9ckVeSVWwFshKgaY3DvOnJrVd_g_0qMg-UUM9GcmCeqxG96TLk-X5jzWFhsp5fJQ91LvyGlZG-76XyedyYEgtdpilkS7ymmWpLVl1gMQ_JWi4BBdIvKo0t2AL3P7O5NOjZD9qPUVSOTvglyNfYK81dItwR5Wdr0nczt2qXnuSEUsigTyqhFtr_6d_",
-  "http://www.baidu.com/link?url=nV4HENY9ckVeSVWwFshKgaY3DvOnJrVd_g_0qMg-UUM9GcmCeqxG96TLk-X5jzWFo_dukZSLbCUI0tPBqr1qG7pe_TKOnSfE4H5bpvZoe-QA3HFsgJEQJJbsJM4zGUOWuXwyrNp5oYXFzTA3EubYQf8TVFst68NRj_XBQXcKmyK",
-  "http://www.baidu.com/link?url=suRUK_eZMGFmYicXQcmxdjOadwrLx9aoyZ8JcEqZrvSCQZsEMz8ykdB_vK28_zoI9dEGJ_EAOn7DEA2wOffDkn6mPhg5MN6w3PONfoJ6j897u1f6CbMgnXP4bY3KAqR7mg-IbbgQUi8__eNXve0t2nFea82VD1gUjSg9YkLRP4G",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTaMJ3SpQllS4sYslfxi6_IlpNUbdcI-_HmKrZzqqU7RpzI9kNRm2dTTaUWzDvTajpCylp5VKUYx1sL86wiKNfNXhzvsIh98Ez0shhxxkCUck3AQ4W61KIilalRK8ckmYIOq5c7dtbFrh1rCcjRYlYUq",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTihM5xvFvedBLokDBjxVKVAoUKsFuApGSFObcyiy2bda1_chv_qZzXQtNL9QccQ8bq",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTihM5xvFvedBLokDBjxVKVAoUKsFuApGSFObcyiy2bdafs3dpkTeQXZy4moBKznKJ_",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTihM5xvFvedBLokDBjxVKVAoUKsFuApGSFObcyiy2bdah0eaRoqUnf-k_W3pu9kA9K",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTihM5xvFvedBLokDBjxVKVAoUKsFuApGSFObcyiy2bdanqj3TkivteOVWzlHY5eeo_",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTihM5xvFvedBLokDBjxVKVAoUKsFuApGSFObcyiy2bdaoJt5NgTDOX5So9Cee1kIO_",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTihM5xvFvedBLokDBjxVKVAoUKsFuApGSFObcyiy2bdawPu6E_vc9wVWxzA4mfpGna",
-  "http://www.baidu.com/link?url=uVssCQzZkZf1-DfdOQaCTknerArVcL26zMlNQrlYOwi",
-  "http://www.baidu.com/link?url=xIVPE7l3aIThwsbTHHUhIO_jc890BBOkQnDcd7ivNnZKOihdfpF4ZNHKcHdiVvVA",
-  "http://www.baidu.com/link?url=zEqHe_131latzXbpoiWEUdRKz89U8vSYQ4Juku48s37gUI2VVATwH9m-ohQUlQEh",
-  "http://www.baidu.com/more/",
-  "http://www.baidu.com/s?usm=1&wd=%E4%B8%AD%E5%BC%8F%E8%8B%B1%E8%AF%AD&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=300085",
-  "http://www.baidu.com/s?usm=1&wd=%E5%BF%85%E5%BA%94%E8%AF%8D%E5%85%B8&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=6527206",
-  "http://www.baidu.com/s?usm=1&wd=%E6%8B%93%E8%AF%8D&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=6685701",
-  "http://www.baidu.com/s?usm=1&wd=%E6%96%B0%E4%B8%9C%E6%96%B9%E5%9C%A8%E7%BA%BF&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=2225295",
-  "http://www.baidu.com/s?usm=1&wd=%E6%9C%80%E9%95%BF%E7%9A%84%E8%8B%B1%E6%96%87%E5%8D%95%E8%AF%8D&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=657095",
-  "http://www.baidu.com/s?usm=1&wd=%E6%9C%89%E9%81%93%E8%AF%8D%E5%85%B8&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=1641307",
-  "http://www.baidu.com/s?usm=1&wd=%E6%B2%AA%E6%B1%9F%E8%8B%B1%E8%AF%AD&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=405084",
-  "http://www.baidu.com/s?usm=1&wd=%E6%B5%B7%E8%AF%8D%E8%AF%8D%E5%85%B8&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=7611882",
-  "http://www.baidu.com/s?usm=1&wd=%E7%81%B5%E6%A0%BC%E6%96%AF&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=758224",
-  "http://www.baidu.com/s?usm=1&wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=608784",
-  "http://www.baidu.com/s?usm=1&wd=%E7%99%BE%E8%AF%8D%E6%96%A9&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=9089046",
-  "http://www.baidu.com/s?usm=1&wd=%E7%BB%8F%E5%85%B8%E8%8B%B1%E6%96%87%E6%AD%8C%E6%9B%B2&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=1216241",
-  "http://www.baidu.com/s?usm=1&wd=%E8%8B%B1%E8%AF%AD%E8%B0%9A%E8%AF%AD&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=17075",
-  "http://www.baidu.com/s?usm=1&wd=%E8%AE%B0%E5%BF%86%E6%B3%95&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=1520914",
-  "http://www.baidu.com/s?usm=1&wd=%E9%87%91%E5%B1%B1%E8%AF%8D%E9%9C%B8&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=6599",
-  "http://www.baidu.com/s?usm=1&wd=91%E5%A4%96%E6%95%99%E7%BD%91&ie=utf-8&rsv_cq=cow&rsv_dl=0_right_recommends_merge_20826&cq=cow&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=10142484",
-  "http://www.baidu.com/s?usm=1&wd=a+cattle&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=basketball%E7%9A%84%E9%9F%B3%E6%A0%87&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=cattle&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow%E5%8F%AF%E6%95%B0%E5%90%97&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=1&wd=cow%E6%80%8E%E4%B9%88%E8%AF%BB&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=1&wd=cow%E6%80%8E%E4%B9%88%E8%AF%BB&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D&ie=utf-8&rsv_rq=2&rsv_cq=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow%E6%B4%97%E9%9D%A2%E5%A5%B6&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=1&wd=cow%E6%B4%97%E9%9D%A2%E5%A5%B6&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=1&wd=cow%E6%B4%97%E9%9D%A2%E5%A5%B6&ie=utf-8&rsv_rq=2&rsv_cq=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow%E7%89%9B%E4%B9%B3%E7%9F%B3%E7%A2%B1&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=1&wd=cow%E7%89%9B%E4%B9%B3%E7%9F%B3%E7%A2%B1&ie=utf-8&rsv_rq=2&rsv_cq=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow%E8%8B%B1%E8%AF%AD%E6%80%8E%E4%B9%88%E8%AF%BB&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow%E9%B8%A1%E5%B0%BE%E9%85%92&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=1&wd=cow+%E4%BB%A3%E7%90%86&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=1&wd=cow+%E5%86%99%E6%97%B6%E5%A4%8D%E5%88%B6&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=1&wd=cow+&ie=utf-8&gate=&rsv_rq=2&rsv_cq=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow+gate%E5%AE%98%E7%BD%91&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow+gate&ie=utf-8&rsv_rq=2&rsv_cq=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow+gate+nutrilon&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=cow+girl&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=1&wd=cow+milk&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=dairy+cattle&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=1&wd=holy+cow&ie=utf-8&rsv_cq=cow&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=1&wd=the+biggest+cow%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D&ie=utf-8&rsv_crq=7&bs=cow",
-  "http://www.baidu.com/s?usm=5&wd=%E4%B8%AD%E5%BC%8F%E8%8B%B1%E8%AF%AD&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=300085",
-  "http://www.baidu.com/s?usm=5&wd=%E4%BF%A1%E6%89%98%E5%9F%BA%E9%87%91+rice&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_shares_simple_16311_18695",
-  "http://www.baidu.com/s?usm=5&wd=%E5%BF%85%E5%BA%94%E8%AF%8D%E5%85%B8&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=6527206",
-  "http://www.baidu.com/s?usm=5&wd=%E6%8B%93%E8%AF%8D&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=6685701",
-  "http://www.baidu.com/s?usm=5&wd=%E6%96%B0%E4%B8%9C%E6%96%B9%E5%9C%A8%E7%BA%BF&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=2225295",
-  "http://www.baidu.com/s?usm=5&wd=%E6%9C%80%E9%95%BF%E7%9A%84%E8%8B%B1%E6%96%87%E5%8D%95%E8%AF%8D&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=657095",
-  "http://www.baidu.com/s?usm=5&wd=%E6%9C%89%E9%81%93%E8%AF%8D%E5%85%B8&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=1641307",
-  "http://www.baidu.com/s?usm=5&wd=%E6%B2%AA%E6%B1%9F%E8%8B%B1%E8%AF%AD&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=405084",
-  "http://www.baidu.com/s?usm=5&wd=%E6%B5%B7%E8%AF%8D%E8%AF%8D%E5%85%B8&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=7611882",
-  "http://www.baidu.com/s?usm=5&wd=%E7%81%B5%E6%A0%BC%E6%96%AF&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=758224",
-  "http://www.baidu.com/s?usm=5&wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=608784",
-  "http://www.baidu.com/s?usm=5&wd=%E7%99%BE%E8%AF%8D%E6%96%A9&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=9089046",
-  "http://www.baidu.com/s?usm=5&wd=%E7%BB%8F%E5%85%B8%E8%8B%B1%E6%96%87%E6%AD%8C%E6%9B%B2&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=1216241",
-  "http://www.baidu.com/s?usm=5&wd=%E8%8B%B1%E8%AF%AD%E8%B0%9A%E8%AF%AD&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=17075",
-  "http://www.baidu.com/s?usm=5&wd=%E8%AE%B0%E5%BF%86%E6%B3%95&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u5176\u4ed6\u4eba\u8fd8\u641c&recid=20826&euri=1520914",
-  "http://www.baidu.com/s?usm=5&wd=%E9%87%91%E5%B1%B1%E8%AF%8D%E9%9C%B8&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u7ffb\u8bd1&recid=20826&euri=6599",
-  "http://www.baidu.com/s?usm=5&wd=%E9%9F%A9%E5%9B%BD%E5%8C%96%E5%A6%86%E5%93%81rice%E5%85%AC%E5%8F%B8&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_shares_simple_16311_18695",
-  "http://www.baidu.com/s?usm=5&wd=91%E5%A4%96%E6%95%99%E7%BD%91&ie=utf-8&rsv_cq=rice&rsv_dl=0_right_recommends_merge_20826&cq=rice&srcid=20910&rt=\u82f1\u8bed\u5b66\u4e60\u52a9\u624b&recid=20826&euri=10142484",
-  "http://www.baidu.com/s?usm=5&wd=damien+rice&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=5&wd=damien+rice&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_sp_img_4_18696",
-  "http://www.baidu.com/s?usm=5&wd=damien+rice&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_vd_mininewest_1_18695",
-  "http://www.baidu.com/s?usm=5&wd=damien+rice&ie=utf-8&rsv_rq=2&rsv_cq=rice",
-  "http://www.baidu.com/s?usm=5&wd=damien+rice+cold+ater&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_vd_mininewest_1_18695",
-  "http://www.baidu.com/s?usm=5&wd=damien+rice+long+long+way&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_vd_mininewest_1_18695",
-  "http://www.baidu.com/s?usm=5&wd=deoproce&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_shares_simple_16311_18695",
-  "http://www.baidu.com/s?usm=5&wd=northwestern+university&ie=utf-8&rsv_crq=7&bs=rice",
-  "http://www.baidu.com/s?usm=5&wd=rice%E5%8C%96%E5%A6%86%E5%93%81&ie=utf-8&rsv_rq=2&rsv_cq=rice",
-  "http://www.baidu.com/s?usm=5&wd=rice%E5%8F%AF%E6%95%B0%E5%90%97&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=5&wd=rice%E5%8F%AF%E6%95%B0%E5%90%97&ie=utf-8&rsv_rq=2&rsv_cq=rice",
-  "http://www.baidu.com/s?usm=5&wd=rice%E5%A4%A7%E5%AD%A6&ie=utf-8&rsv_rq=2&rsv_cq=rice",
-  "http://www.baidu.com/s?usm=5&wd=rice%E6%80%8E%E4%B9%88%E8%AF%BB&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=5&wd=rice%E6%98%AF%E5%8F%AF%E6%95%B0%E5%90%8D%E8%AF%8D%E5%90%97&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=5&wd=rice%E7%9A%84%E6%B5%B7%E6%8A%A5&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_sp_img_4_18696",
-  "http://www.baidu.com/s?usm=5&wd=rice+%26+shine&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=5&wd=rice+%E7%BB%9F%E8%AE%A1&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=5&wd=rice+&ie=utf-8&shine=&rsv_rq=2&rsv_cq=rice",
-  "http://www.baidu.com/s?usm=5&wd=rice+cooker&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_sp_img_4_18696",
-  "http://www.baidu.com/s?usm=5&wd=rice+dumpling&ie=utf-8&rsv_rq=2&rsv_cq=rice",
-  "http://www.baidu.com/s?usm=5&wd=rice+energy&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_shares_simple_16311_18695",
-  "http://www.baidu.com/s?usm=5&wd=rice+pudding&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_sp_img_4_18696",
-  "http://www.baidu.com/s?usm=5&wd=rice+queen&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_dict3_85_18695",
-  "http://www.baidu.com/s?usm=5&wd=rice+university%E6%8E%92%E5%90%8D&ie=utf-8&rsv_cq=rice&rsv_dl=0_left_bk_polysemy_91_19781",
-  "http://www.baidu.com/s?usm=5&wd=rice+university&ie=utf-8&rsv_rq=2&rsv_cq=rice",
-  "http://www.baidu.com/s?usm=5&wd=talk+does+not+cook+rice&ie=utf-8&rsv_crq=7&bs=rice",
-  "http://www.baidu.com/s?usm=5&wd=turn+o62n+the+cooker+%E7%9A%84%E8%8B%B1%E8%AF%AD%E6%84%8F%E6%80%9D&ie=utf-8&rsv_crq=7&bs=rice",
-  "http://www.baidu.com/s?usm=5&wd=white+rice+organic+texmati&ie=utf-8&rsv_crq=7&bs=rice",
-  "http://www.baidu.com/s?wd=%E5%A4%8F%E8%88%AA%E7%87%95&rsp=7&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=%E6%9E%97%E7%A7%8B%E7%A6%BB&rsp=6&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=%E6%B0%B4%E7%86%8A&rsp=6&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=%E9%99%88%E5%A5%95%E8%BF%85&rsp=7&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=cow%20gate%E5%AE%98%E7%BD%91&rsp=3&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow%20gate&rsp=2&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D&rsp=1&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow%E6%B4%97%E9%9D%A2%E5%A5%B6&rsp=0&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow%E7%89%9B%E4%B9%B3%E7%9F%B3%E7%A2%B1&rsp=4&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=10&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=10&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_page=1",
-  "http://www.baidu.com/s?wd=cow&pn=20&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=30&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=40&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=50&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=60&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=70&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=80&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cow&pn=90&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=cowboy&rsp=5&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=damien%20rice&rsp=5&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=dict.cn@v&vmp_ec=2d76f41b6c01eb92d92p3aYaXbX75e3f45=Qu3faR5474Y2d67s4Ja08451532b4&vmp_ectm=1427987238&from=vs",
-  "http://www.baidu.com/s?wd=dict.hjenglish.com@v&vmp_ec=3c1949e0a03c5746997971744766e3a1f=Yeu3bXeRf77b7d2=8eXQ3fLovNpmpQNladasbmbGaJ42X6ded2cs2e5c91ed05&vmp_ectm=1427893909&from=vs",
-  "http://www.baidu.com/s?wd=dict.kekenet.com@v&vmp_ec=a97033531653664ebeb5a67657e7add5Z073W5radf74d751b7b=s2jC5lY8uVap2aQ23XR32370J35X74ef92ed&vmp_ectm=1419410638&from=vs",
-  "http://www.baidu.com/s?wd=openrice&rsp=8&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice",
-  "http://www.baidu.com/s?wd=rice%20shine&rsp=3&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice%20university&rsp=2&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice%E5%8F%AF%E6%95%B0%E5%90%97&rsp=4&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=10&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=10&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_page=1",
-  "http://www.baidu.com/s?wd=rice&pn=20&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=30&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=40&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=50&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=60&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=70&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=80&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rice&pn=90&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=rise&rsp=1&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=shine&rsp=0&f=1&oq=rice&ie=utf-8&usm=5&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc&rsv_ers=xdt0&rs_src=0&rsv_pq=b8b471d5000008a5&rsv_t=3453uWIvu2sbVpZ6oCuwvXflyrudK42UZQILLesFKD54VodI4hsL52diKkc",
-  "http://www.baidu.com/s?wd=slamacow&rsp=8&f=1&oq=cow&ie=utf-8&usm=1&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE&rsv_ers=xdt0&rs_src=0&rsv_pq=f537508b0000092e&rsv_t=3ba1NEgMEGYo0PYSwo6tX5sslRvA81yOlYQgEie8eSwiLaHYIF5Lq9ZSeFE",
-  "http://www.baidu.com/s?wd=www.iciba.com@v&vmp_ec=44bb91c76017fd30076a0bea8=j25s0d2J1Y2235fd3b2Yi9ayl55Sef3cbp0dc34Xd5Xe36593ddce0&vmp_ectm=1427712608&from=vs",
-  "http://www.baidu.com/s?wd=www.iyaya.com@v&vmp_ec=a0344a20ec76845c7d8333e703d5S0yabdc7599ef5772bj=739WF5YXdpce59JXs83919d7570801d3&vmp_ectm=1429054691&from=vs",
-  "http://www.baidu.com/s?wd=www.jd.com@v&vmp_ec=5421364aa037f76d2d2fbd3d2j=35Z12089fe8c0aby955c5sC9qXdJ83fX5d58454f9be3c&vmp_ectm=1429021679&from=vs",
-  "http://www.baidu.com/search/jubao.html",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D-M91t8L7rn2kU_un4Mo2wO-p3qp6o5yTofPuHNwv7BRbOttA4-UAH4yAbTAnxkwil3mfSEqFi0EO8-Algv59aq&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%02cow%03%E5%92%8C%01cattle%01%E6%9C%89%01%E4%BB%80%E4%B9%88%01%E5%8C%BA%E5%88%AB%01%3F%01_%01%E7%99%BE%E5%BA%A6%01%E7%9F%A5%E9%81%93%01%26q%3Dcow&key=surl",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D5uns9UowL1ZepzZm8E26sOL3uJezwjIT3mfcNR7_FPkYt2IbV1UMvsBT_n0hqEjs&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%02cow%03%E6%98%AF%01%E4%BB%80%E4%B9%88%01%E6%84%8F%E6%80%9D%01_%01%E8%8B%B1%E8%AF%AD%01%E5%9C%A8%E7%BA%BF%01%E7%BF%BB%E8%AF%91%01_%02cow%03%E7%9A%84%01%E7%BF%BB%E8%AF%91%01%E3%80%81%01%E5%90%AB%E4%B9%89%01%E3%80%81%01%E8%AF%BB%E9%9F%B3%01%E3%80%81%01%E7%94%A8%E6%B3%95%01%E3%80%81%01%E5%8F%82%E8%80%83%01...%26q%3Dcow&key=surl",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DFI5j5ft6lL75AJ3TV3DKS-Fj4QUK_6j-MngMpo3a4pW&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%02rice%03%E6%98%AF%01%E4%BB%80%E4%B9%88%01%E6%84%8F%E6%80%9D%01_%02rice%03%E5%9C%A8%E7%BA%BF%01%E7%BF%BB%E8%AF%91%01_%01%E8%8B%B1%E8%AF%AD%01_%01%E8%AF%BB%E9%9F%B3%01_%01%E7%94%A8%E6%B3%95%01_%01%E4%BE%8B%E5%8F%A5%01_%01%E6%B5%B7%01%E8%AF%8D%01%E8%AF%8D%E5%85%B8%01%26q%3Drice&key=surl",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DJHCMcSB6vseh77VSTAZ-YqU5KyEOSbCBIZj1WMC4cba&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%01Home%01%20%01-%01%20%02Rice%03%20%01University%01%26q%3Drice&key=surl",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DUCI8DqUdy7_rlCN0vRN8OgO8IXIwwkUX0VOdViCKrurm_sT2o_SeDKhHsOn04OWp&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%02cow%03%E6%98%AF%01%E4%BB%80%E4%B9%88%01%E6%84%8F%E6%80%9D%01_%02cow%03%E7%9A%84%01%E7%BF%BB%E8%AF%91%01_%01%E9%9F%B3%E6%A0%87%01_%01%E8%AF%BB%E9%9F%B3%01_%01%E7%94%A8%E6%B3%95%01_%01%E4%BE%8B%E5%8F%A5%01_%01%E7%88%B1%01%E8%AF%8D%E9%9C%B8%01%E5%9C%A8%E7%BA%BF%01%E8%AF%8D%E5%85%B8%01%26q%3Dcow&key=surl",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dbx9sWi5WnXjBkUhM5gvOSmz2CbZJ_-OiKdNgZr3udsS&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%02cow%03%E6%98%AF%01%E4%BB%80%E4%B9%88%01%E6%84%8F%E6%80%9D%01_%02cow%03%E5%9C%A8%E7%BA%BF%01%E7%BF%BB%E8%AF%91%01_%01%E8%8B%B1%E8%AF%AD%01_%01%E8%AF%BB%E9%9F%B3%01_%01%E7%94%A8%E6%B3%95%01_%01%E4%BE%8B%E5%8F%A5%01_%01%E6%B5%B7%01%E8%AF%8D%01%E8%AF%8D%E5%85%B8%01%26q%3Dcow&key=surl",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DhMgPFqAn_EueXnigQ4nGVGqkcyhhVJzKjKHP5hl52rroccqSxUtaE7t0u5yl_Ero&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%02rice%03%E6%98%AF%01%E4%BB%80%E4%B9%88%01%E6%84%8F%E6%80%9D%01_%02rice%03%E7%9A%84%01%E7%BF%BB%E8%AF%91%01_%01%E9%9F%B3%E6%A0%87%01_%01%E8%AF%BB%E9%9F%B3%01_%01%E7%94%A8%E6%B3%95%01_%01%E4%BE%8B%E5%8F%A5%01_%01%E7%88%B1%01%E8%AF%8D%E9%9C%B8%01%E5%9C%A8%E7%BA%BF%01%E8%AF%8D%E5%85%B8%01%26q%3Drice&key=surl",
-  "http://www.baidu.com/tools?url=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DxIVPE7l3aIThwsbTHHUhIO_jc890BBOkQnDcd7ivNnZKOihdfpF4ZNHKcHdiVvVA&jump=http%3A%2F%2Fkoubei.baidu.com%2Fwomc%2Fp%2Fsentry%3Ftitle%3D%01%22%02cow%03%22%01%E6%98%AF%01%E4%BB%80%E4%B9%88%01%E6%84%8F%E6%80%9D%01-%01%22%02cow%03%22%01%E7%BF%BB%E8%AF%91%01_%02cow%03%E7%9A%84%01%E5%8F%91%E9%9F%B3%01%E3%80%81%01%E7%BF%BB%E8%AF%91%01%E3%80%81%01%E5%8F%82%E8%80%83%01%E4%BE%8B%E5%8F%A5%01-%01%E5%8F%AF%E5%8F%AF%01%E6%9F%A5%01%E8%AF%8D%01%26q%3Dcow&key=surl",
-  "http://www.bbc.co.uk/news/world/us_and_canada/",
-  "http://www.beautybar.com/",
-  "http://www.bloomberg.com/",
-  "http://www.bookdepository.com/",
-  "http://www.bostonglobe.com/",
-  "http://www.bravenewfilms.org/",
-  "http://www.businessinsider.com/",
-  "http://www.businessinsider.com/iron-man-suit-has-one-key-problem-2015-4",
-  "http://www.businessinsider.com/profile-of-corinthian-student-michael-adorno-2015-4",
-  "http://www.businessweek.com/blogs/joshua-green-on-politics",
-  "http://www.buzzfeed.com/",
-  "http://www.c-span.org",
-  "http://www.casa.com/",
-  "http://www.cbsnews.com/",
-  "http://www.cbsnews.com/news/video-mob-of-high-school-students-attacks-man-at-gas-station/?ftag=YHF4eb9d17",
-  "http://www.chicagotribune.com/",
-  "http://www.cnn.com",
-  "http://www.cnn.com/",
-  "http://www.cnn.com/2013/02/13/showbiz/gallery/pregnant-celebrities-2013/index.html",
-  "http://www.cnn.com/2013/07/13/world/oil-spills-fast-facts/index.html",
-  "http://www.cnn.com/2014/12/26/opinion/reddy-valentine-fighting-oil-spills/index.html",
-  "http://www.cnn.com/2015/01/05/showbiz/gallery/celebs-turning-50-in-2015/index.html",
-  "http://www.cnn.com/2015/01/09/world/gallery/people-we-lost-2015/index.html",
-  "http://www.cnn.com/2015/03/06/politics/obamacare-enrollments-florida-repubican/index.html",
-  "http://www.cnn.com/2015/03/09/world/gallery/sites-damaged-by-isis/index.html",
-  "http://www.cnn.com/2015/03/27/us/gallery/military-photography-of-the-year/index.html",
-  "http://www.cnn.com/2015/04/02/world/cnnphotos-cuba-solares/index.html",
-  "http://www.cnn.com/2015/04/03/travel/gallery/lincoln-assassination-anniversary/index.html",
-  "http://www.cnn.com/2015/04/05/living/cnnphotos-swedish-dads-parental-leave/index.html",
-  "http://www.cnn.com/2015/04/07/politics/how-russians-hacked-the-wh/index.html",
-  "http://www.cnn.com/2015/04/10/travel/feat-abraham-lincoln-assassination-150-anniversary/index.html",
-  "http://www.cnn.com/2015/04/10/us/oil-rig-victim-families-five-years-later/index.html",
-  "http://www.cnn.com/2015/04/12/sport/andy-murray-wedding/index.html",
-  "http://www.cnn.com/2015/04/12/us/rowing-flying-carp-feat-irpt/index.html",
-  "http://www.cnn.com/2015/04/13/entertainment/feat-madonna-kiss-drake/index.html",
-  "http://www.cnn.com/2015/04/13/entertainment/olivia-munn-xmen-psylocke-feat-thr/index.html",
-  "http://www.cnn.com/2015/04/13/entertainment/wonder-woman-director-michelle-maclaren-feat/index.html",
-  "http://www.cnn.com/2015/04/13/europe/italy-oldest-neanderthal-dna-sample-altamura/index.html",
-  "http://www.cnn.com/2015/04/13/football/paddy-power-liverpool-newcastle-football-tweet/index.html",
-  "http://www.cnn.com/2015/04/13/health/superfoods-stress-relief/index.html",
-  "http://www.cnn.com/2015/04/13/living/feat-maryland-free-range-parenting-family-under-investigation-again/index.html",
-  "http://www.cnn.com/2015/04/13/opinions/reyes-marco-rubio-candidacy/index.html",
-  "http://www.cnn.com/2015/04/13/opinions/urry-alien-life/index.html",
-  "http://www.cnn.com/2015/04/13/politics/ben-carson-may-4-presidential-announcement/index.html",
-  "http://www.cnn.com/2015/04/13/politics/nra-convention-2015-2016-elections/index.html",
-  "http://www.cnn.com/2015/04/13/travel/cuba-travel-us-sanctions/index.html",
-  "http://www.cnn.com/2015/04/13/travel/gallery/game-of-thrones-locations-gallery/index.html",
-  "http://www.cnn.com/2015/04/13/us/cleveland-zoo-cheetah-fall/index.html",
-  "http://www.cnn.com/2015/04/13/us/tulsa-shooting-robert-bates-volunteer-deputy/index.html",
-  "http://www.cnn.com/2015/04/14/asia/gallery/kim-jong-un-wife-ri-jol-su/index.html",
-  "http://www.cnn.com/2015/04/14/entertainment/feat-pink-weight-response-hln/index.html",
-  "http://www.cnn.com/2015/04/14/entertainment/feat-rita-wilson-cancer/index.html",
-  "http://www.cnn.com/2015/04/14/entertainment/feat-stephen-hawking-sings-galaxy-song/index.html",
-  "http://www.cnn.com/2015/04/14/entertainment/percy-sledge-dies-feat/index.html",
-  "http://www.cnn.com/2015/04/14/europe/hilary-clinton-18-rating-russia/index.html",
-  "http://www.cnn.com/2015/04/14/health/annual-physical-ritual-costly/index.html",
-  "http://www.cnn.com/2015/04/14/health/breast-milk-online-dangers/index.html",
-  "http://www.cnn.com/2015/04/14/living/feat-foster-child-davion-only-gets-forever-home/index.html",
-  "http://www.cnn.com/2015/04/14/living/most-challenged-books-2014-feat/index.html",
-  "http://www.cnn.com/2015/04/14/opinions/al-qaeda-fading-peter-bergen/index.html",
-  "http://www.cnn.com/2015/04/14/opinions/drexler-dont-call-her-hillary/index.html",
-  "http://www.cnn.com/2015/04/14/opinions/zelizer-iran-deal-congress-involved/index.html",
-  "http://www.cnn.com/2015/04/14/politics/chris-christie-new-hampshire-2016-elections/index.html",
-  "http://www.cnn.com/2015/04/14/politics/corker-iran-bill-deal-reached/index.html",
-  "http://www.cnn.com/2015/04/14/politics/dea-head-oversight-committee-hearing/index.html",
-  "http://www.cnn.com/2015/04/14/politics/gao-newer-aircraft-vulnerable-to-hacking/index.html",
-  "http://www.cnn.com/2015/04/14/politics/george-pataki-new-hampshire-ad/index.html",
-  "http://www.cnn.com/2015/04/14/politics/hillary-clinton-2016-elections-iowa-trip/index.html",
-  "http://www.cnn.com/2015/04/14/politics/iraqi-prime-ministers-visit-to-white-house/index.html",
-  "http://www.cnn.com/2015/04/14/politics/kelley-paul-book-2016-elections/index.html",
-  "http://www.cnn.com/2015/04/14/politics/rand-paul-wife-kelley-election-2016-turtlenecks/index.html",
-  "http://www.cnn.com/2015/04/14/sport/gallery/what-a-shot-sports-0414/index.html",
-  "http://www.cnn.com/2015/04/14/travel/bourdain-top-10-episodes/index.html",
-  "http://www.cnn.com/2015/04/14/travel/chernobyl-tourism/index.html",
-  "http://www.cnn.com/2015/04/14/us/arizona-police-run-over-suspect/index.html",
-  "http://www.cnn.com/2015/04/14/us/florida-panama-city-gang-rape-case/index.html",
-  "http://www.cnn.com/2015/04/14/us/georgia-atlanta-public-schools-cheating-scandal-verdicts/index.html",
-  "http://www.cnn.com/2015/04/14/us/gulf-oil-spill-unknowns/index.html",
-  "http://www.cnn.com/2015/04/14/us/mom-bee-attack-twins-drown/index.html",
-  "http://www.cnn.com/2015/04/14/us/north-carolina-college-shooting/index.html",
-  "http://www.cnn.com/2015/04/14/us/philadelphia-quadriplegic-man-abandoned-mom-extradition/index.html",
-  "http://www.cnn.com/2015/04/14/us/spacex-rocket-launch/index.html",
-  "http://www.cnn.com/2015/04/14/us/washington-overpass-accident-concrete-barrier/index.html",
-  "http://www.cnn.com/2015/04/14/world/cnnphotos-boragaon-landfill-india/index.html",
-  "http://www.cnn.com/2015/04/14/world/uk-russia-aircraft-intercepted/index.html",
-  "http://www.cnn.com/about",
-  "http://www.cnn.com/collection",
-  "http://www.cnn.com/entertainment",
-  "http://www.cnn.com/go/?stream=CNN",
-  "http://www.cnn.com/health",
-  "http://www.cnn.com/help",
-  "http://www.cnn.com/interactive/2014/05/specials/city-of-tomorrow/index.html",
-  "http://www.cnn.com/interactive/2014/12/us/cnn-guns-project/index.html",
-  "http://www.cnn.com/living",
-  "http://www.cnn.com/login.html",
-  "http://www.cnn.com/more",
-  "http://www.cnn.com/mycnn",
-  "http://www.cnn.com/opinions",
-  "http://www.cnn.com/politics",
-  "http://www.cnn.com/privacy",
-  "http://www.cnn.com/services/advertise/main.html",
-  "http://www.cnn.com/shows/cnn-films",
-  "http://www.cnn.com/shows/high-profits",
-  "http://www.cnn.com/shows/mike-rowe",
-  "http://www.cnn.com/shows/wonder-list",
-  "http://www.cnn.com/specials/cnn-heroes",
-  "http://www.cnn.com/specials/cnn-investigations",
-  "http://www.cnn.com/specials/cnn-longform",
-  "http://www.cnn.com/specials/digital-studios",
-  "http://www.cnn.com/specials/impact-your-world",
-  "http://www.cnn.com/specials/last-50-stories",
-  "http://www.cnn.com/specials/latest-news-videos",
-  "http://www.cnn.com/specials/more/cnn-leadership",
-  "http://www.cnn.com/specials/opinion/change-the-list",
-  "http://www.cnn.com/specials/opinion/opinion-politics",
-  "http://www.cnn.com/specials/opinion/opinion-social-issues",
-  "http://www.cnn.com/specials/photos",
-  "http://www.cnn.com/specials/profiles/",
-  "http://www.cnn.com/specials/tv/all-shows",
-  "http://www.cnn.com/specials/tv/anchors-and-reporters",
-  "http://www.cnn.com/specials/video-landing/gotta-watch-video-collection",
-  "http://www.cnn.com/specials/videos/digital-shorts",
-  "http://www.cnn.com/tech",
-  "http://www.cnn.com/terms",
-  "http://www.cnn.com/transcripts",
-  "http://www.cnn.com/travel",
-  "http://www.cnn.com/tv",
-  "http://www.cnn.com/tv/schedule/cnn",
-  "http://www.cnn.com/us",
-  "http://www.cnn.com/videos",
-  "http://www.cnn.com/videos/business/2014/04/08/orig-pkg-what-is-a-ponzi-scheme-zain-asher.cnn",
-  "http://www.cnn.com/videos/business/2014/04/15/orig-pkg-what-is-high-frequency-trading-zain-asher.cnn",
-  "http://www.cnn.com/videos/business/2014/04/29/what-is-your-credit-score-fico-christine-romans-cnnmoney.cnn",
-  "http://www.cnn.com/videos/business/2014/10/10/cnn-orig-what-is-bankruptcy-cristina-alesci.cnn",
-  "http://www.cnn.com/videos/business/2014/10/24/cnn-orig-what-is-inversion-cristina-alesci.cnn",
-  "http://www.cnn.com/videos/business/2015/04/14/qmb-pickpocket-james-freedman-intv.cnn",
-  "http://www.cnn.com/videos/entertainment/2015/04/13/late-night-television-hosts-lisas-desk-orig-mg.cnn",
-  "http://www.cnn.com/videos/health/2014/03/10/orig-brain-on-weed-sanjay-jr-jt.cnn",
-  "http://www.cnn.com/videos/living/2015/04/13/erin-pkg-moos-chimp-takes-down-drone.cnn",
-  "http://www.cnn.com/videos/politics/2015/04/13/marco-rubio-explained-under-90-seconds-origwx-al.cnn",
-  "http://www.cnn.com/videos/politics/2015/04/14/nr-hillary-clinton-unrecognized-at-chipotle.cnn",
-  "http://www.cnn.com/videos/tech/2015/04/13/apps-aim-catch-police-camera-orig.cnn",
-  "http://www.cnn.com/videos/tv/2015/04/13/nr-seg-armenia-kanye-west-jumps-in-lake.cnn",
-  "http://www.cnn.com/videos/tv/2015/04/13/pkg-griffin-bp-gulf-oil-spill-dive.cnn",
-  "http://www.cnn.com/videos/tv/2015/04/14/lead-live-marsh-planes-hacked.cnn",
-  "http://www.cnn.com/videos/us/2015/04/11/bts-soccer-player-attacked-on-plane.cnn",
-  "http://www.cnn.com/videos/us/2015/04/11/pkg-mom-reunited-with-daughter-50-years-later.ktvi-kplr",
-  "http://www.cnn.com/videos/us/2015/04/14/dnt-mountain-lion-p-22-sneaks-into-home.ktla",
-  "http://www.cnn.com/videos/us/2015/04/14/pkg-milwaukee-crash-shooting-death.wtmj",
-  "http://www.cnn.com/videos/world/2015/04/13/orig-u-s-ships-pass-through-suez-canal.cnn",
-  "http://www.cnn.com/world",
-  "http://www.createspace.com/",
-  "http://www.csmonitor.com/",
-  "http://www.dailymail.co.uk/ushome/index.html",
-  "http://www.dailymotion.com/video/x2j5um5_the-50-most-bizarre-couple-photos-compilation_fun",
-  "http://www.dailymotion.com/video/x2jy5zi_omg-chain-snatching-on-the-road-from-a-woman_news",
-  "http://www.dailymotion.com/video/x2lslaq_%EC%9E%A5%EB%AF%B8%EB%B9%9B-%EC%97%B0%EC%9D%B8%EB%93%A4-e50-150405-h1_creation",
-  "http://www.dailymotion.com/video/x2lvdqc_%EB%B9%9B%EB%82%98%EA%B1%B0%EB%82%98-%EB%AF%B8%EC%B9%98%EA%B1%B0%EB%82%98-e23-150406-1_creation",
-  "http://www.dailymotion.com/video/x2lvpai_%EB%B9%84%EC%A0%95%EC%83%81%ED%9A%8C%EB%8B%B4-e40-150406-l1_creation",
-  "http://www.dailymotion.com/video/x2m5eo2_new-latest-punjabi-song-2015-jeevan-leather-life-sad-top-hit-2014-indian-pakistani-rock-movies-bolly_music",
-  "http://www.dailymotion.com/video/x2m7x9n_little-boy-heartbreakingly-says-goodbye-to-his-best-friend_fun",
-  "http://www.dailymotion.com/video/x2m9zq7_german-shepherd-lovingly-cares-for-adopted-new-puppy_animals",
-  "http://www.dailymotion.com/video/x2ma90d_sadqay-tumhare-last-episode-27-in-high-quality-10th-april-2015_shortfilms",
-  "http://www.dailymotion.com/video/x2mfnhb_tyler-the-creator-live-coachella-2015_music",
-  "http://www.dailymotion.com/video/x2mjvre_rowers-challenged-as-several-flying-asian-carp-join-in-training_fun",
-  "http://www.dailymotion.com/video/x2mkwgg_top-5-benefits-of-apple-carplay-and-google-android_tech",
-  "http://www.dailymotion.com/video/x2ml6qg_ice-waves-n-ice-to-meet-you_travel",
-  "http://www.dailymotion.com/video/x2ml8ox_awesome-jetsprint-boat-pov-holy-sprint_auto",
-  "http://www.dailymotion.com/video/x2mlb4j_i-am-bread-review-commentary_videogames",
-  "http://www.dailymotion.com/video/x2mldhx_5-star-s-brandon-jones-nacogdoches-tx_sport",
-  "http://www.dailymotion.com/video/x2mlh4k_things-that-go-wrong-when-trying-to-watch-netflix_lifestyle",
-  "http://www.dailymotion.com/video/x2mlh4r_how-to-get-the-best-chips-in-the-bowl_lifestyle",
-  "http://www.dailymotion.com/video/x2mm5mh_mission-impossible-rogue-nation-fate-2015-tom-cruise_shortfilms",
-  "http://www.dailymotion.com/video/x2mnl05_terrified-skiers-appear-to-encounter-giant-mountain-lion-on-slopes_fun",
-  "http://www.dailymotion.com/video/x2mo9bq_gentlemen-lobsters-what-really-happens-at-coachella_lifestyle",
-  "http://www.dailymotion.com/video/x2mo9ds_astronauts-take-a-gopro-on-their-spacewalk_tech",
-  "http://www.dailymotion.com/video/x2mogov_flawed-perceptions-of-chris-paul_sport",
-  "http://www.dailymotion.com/video/x2mon13_dennis-quaid-freaks-out-on-set-and-it-s-caught-on-camera_people",
-  "http://www.dailymotion.com/video/x2mow8y_rihanna-wants-you-to-know-she-s-not-using-cocaine-in-this-video_news",
-  "http://www.democracyarsenal.org/",
-  "http://www.democracynow.org/",
-  "http://www.deviantart.com/",
-  "http://www.deviantart.com/?day=2015-04-13",
-  "http://www.deviantart.com/browse/all/",
-  "http://www.deviantart.com/browse/undiscovered/",
-  "http://www.deviantart.com/browse/whatshot ",
-  "http://www.deviantart.com/browse/whatshot/",
-  "http://www.deviantart.com/dailydeviations",
-  "http://www.deviantart.com/dailydeviations/",
-  "http://www.deviantart.com/developers",
-  "http://www.deviantart.com/journals/",
-  "http://www.deviantart.com/mobile",
-  "http://www.deviantart.com/random/deviant",
-  "http://www.deviantart.com/random/deviation",
-  "http://www.deviantart.com/random/group",
-  "http://www.deviantart.com/submit/deviation",
-  "http://www.deviantart.com/tag/animation",
-  "http://www.deviantart.com/tag/animationstudio",
-  "http://www.deviantart.com/tag/art",
-  "http://www.deviantart.com/tag/artist",
-  "http://www.deviantart.com/tag/arttools",
-  "http://www.deviantart.com/tag/baseball",
-  "http://www.deviantart.com/tag/breakfast",
-  "http://www.deviantart.com/tag/burgerking",
-  "http://www.deviantart.com/tag/collection",
-  "http://www.deviantart.com/tag/comics",
-  "http://www.deviantart.com/tag/cosplay",
-  "http://www.deviantart.com/tag/cosplayfriday",
-  "http://www.deviantart.com/tag/daredevil",
-  "http://www.deviantart.com/tag/dart",
-  "http://www.deviantart.com/tag/depthradius",
-  "http://www.deviantart.com/tag/destiny",
-  "http://www.deviantart.com/tag/discover",
-  "http://www.deviantart.com/tag/disney",
-  "http://www.deviantart.com/tag/dragons",
-  "http://www.deviantart.com/tag/earthday",
-  "http://www.deviantart.com/tag/edwardgorey",
-  "http://www.deviantart.com/tag/electriccar",
-  "http://www.deviantart.com/tag/elonmusk",
-  "http://www.deviantart.com/tag/energy",
-  "http://www.deviantart.com/tag/fanartfriday",
-  "http://www.deviantart.com/tag/fastandfurious",
-  "http://www.deviantart.com/tag/fastfood",
-  "http://www.deviantart.com/tag/food",
-  "http://www.deviantart.com/tag/foodinfocus",
-  "http://www.deviantart.com/tag/foodphotography",
-  "http://www.deviantart.com/tag/furious7",
-  "http://www.deviantart.com/tag/gameofthrones",
-  "http://www.deviantart.com/tag/gardengnomes",
-  "http://www.deviantart.com/tag/gargoyles",
-  "http://www.deviantart.com/tag/gnomes",
-  "http://www.deviantart.com/tag/got",
-  "http://www.deviantart.com/tag/highfantasy",
-  "http://www.deviantart.com/tag/illustrator",
-  "http://www.deviantart.com/tag/india",
-  "http://www.deviantart.com/tag/isleofwight",
-  "http://www.deviantart.com/tag/japan",
-  "http://www.deviantart.com/tag/japanesecuisine",
-  "http://www.deviantart.com/tag/kingslanding",
-  "http://www.deviantart.com/tag/kiss",
-  "http://www.deviantart.com/tag/lazy",
-  "http://www.deviantart.com/tag/literature",
-  "http://www.deviantart.com/tag/majorleaguebaseball",
-  "http://www.deviantart.com/tag/margaretatwood",
-  "http://www.deviantart.com/tag/marvelcomics",
-  "http://www.deviantart.com/tag/mazes",
-  "http://www.deviantart.com/tag/mcdonalds",
-  "http://www.deviantart.com/tag/mlb",
-  "http://www.deviantart.com/tag/mortalkombat",
-  "http://www.deviantart.com/tag/newsdesk",
-  "http://www.deviantart.com/tag/novel",
-  "http://www.deviantart.com/tag/paulwalker",
-  "http://www.deviantart.com/tag/photography",
-  "http://www.deviantart.com/tag/photogtraphy",
-  "http://www.deviantart.com/tag/poll",
-  "http://www.deviantart.com/tag/procrastination",
-  "http://www.deviantart.com/tag/projectporkchop",
-  "http://www.deviantart.com/tag/puzzles",
-  "http://www.deviantart.com/tag/recap",
-  "http://www.deviantart.com/tag/shortfilm",
-  "http://www.deviantart.com/tag/solarenergy",
-  "http://www.deviantart.com/tag/solarpanels",
-  "http://www.deviantart.com/tag/solarpower",
-  "http://www.deviantart.com/tag/spoilersahead",
-  "http://www.deviantart.com/tag/stars",
-  "http://www.deviantart.com/tag/tacobell",
-  "http://www.deviantart.com/tag/teslamotors",
-  "http://www.deviantart.com/tag/thehandmaidstale",
-  "http://www.deviantart.com/tag/theironislands",
-  "http://www.deviantart.com/tag/thewrittenrevolution",
-  "http://www.deviantart.com/tag/toolsoftrade",
-  "http://www.deviantart.com/tag/vindiesel",
-  "http://www.deviantart.com/tag/westeros",
-  "http://www.deviantart.com/tag/winterfell",
-  "http://www.deviantart.com/tag/witches",
-  "http://www.deviantart.com/tag/writer",
-  "http://www.deviantart.com/today",
-  "http://www.deviantart.com/today/",
-  "http://www.deviantart.com?q=special:critiquable",
-  "http://www.diapers.com/",
-  "http://www.digg.com/",
-  "http://www.djreprints.com/?mod=WSJ_footer",
-  "http://www.dowjones.com/careers.asp?mod=WSJ_footer",
-  "http://www.dpreview.com/",
-  "http://www.eastdane.com/welcome",
-  "http://www.efinancialnews.com/",
-  "http://www.engadget.com",
-  "http://www.eonline.com/",
-  "http://www.ew.com/ew/",
-  "http://www.fabric.com/",
-  "http://www.facebook.com/dailymotion",
-  "http://www.facebook.com/wsj",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/14523607768/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/15533024319/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/15615019488/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/15814864721/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/16055716103/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/16069733286/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/16301542813/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/16371429136/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/16470173515/lightbox/?yc=https://www.yahoo.com",
-  "http://www.flickr.com/photos/flickr/galleries/72157649608126894/with/5631862261/lightbox/?yc=https://www.yahoo.com",
-  "http://www.food.com/slideshow/15-easy-coffee-drinks-229?c1=CNN_Brand-Priorities&c2=CNN",
-  "http://www.food.com/slideshow/easter-treats-for-kids-174?c1=CNN_Brand-Priorities&c2=CNN",
-  "http://www.food.com/slideshow/eggs-50-ways-225/baked-eggs-in-bread-7?c1=CNN_Brand-Priorities&c2=CNN",
-  "http://www.food.com/slideshow/quick-easy-make-breakfast-for-dinner-78?c1=CNN_Brand-Priorities&c2=CNN",
-  "http://www.forbes.com/",
-  "http://www.foreignaffairs.com/",
-  "http://www.foreignpolicy.com/",
-  "http://www.foxnews.com/",
-  "http://www.ft.com/home/us",
-  "http://www.funnyordie.com/",
-  "http://www.goodreads.com/",
-  "http://www.google.com/history/optout?hl=en",
-  "http://www.google.com/intl/en/options/",
-  "http://www.guardiannews.com/",
-  "http://www.haaretz.com/",
-  "http://www.hao123.com",
-  "http://www.healthgrades.com/procedures/top-10-womens-health-concerns?cid=t1_rss1d&amp;sr=C53310a10",
-  "http://www.healthgrades.com/provider-search-directory/search?q=Rheumatology&amp;prof.type=provider&amp;search.type=PracticingSpecialty&amp;loc=locIsSolrCity%3Dfalse%3Fcid%3Dt1_rss1d&amp;sr=C53310a10",
-  "http://www.healthgrades.com/right-care/birth-control/birth-control-choices-for-women-35-and-older?cid=t1_rss1d&amp;sr=C53310a10",
-  "http://www.healthgrades.com/right-care/diabetes/12-things-your-diabetes-doctor-wants-you-to-know?cid=t1_rss1d&amp;sr=C53310a10",
-  "http://www.healthgrades.com/right-care/diabetes/7-celebrities-living-with-diabetes?cid=t1_rss1d&amp;sr=C53310a10",
-  "http://www.hlntv.com/video/2015/04/13/bobby-brown-bobbi-kristina-coma-status",
-  "http://www.huffingtonpost.com/",
-  "http://www.huffingtonpost.com/#blog_links",
-  "http://www.huffingtonpost.com/2015/04/08/anti-inflammatory-foods_n_7028052.html?ir=Healthy+Living",
-  "http://www.huffingtonpost.com/2015/04/09/finding-a-partner_n_7030736.html",
-  "http://www.huffingtonpost.com/2015/04/09/finding-a-partner_n_7030736.html#comments",
-  "http://www.huffingtonpost.com/2015/04/09/hillary-clinton-funny-tweets_n_7035396.html?ir=Comedy",
-  "http://www.huffingtonpost.com/2015/04/12/moti-device_n_7028556.html?ir=Technology",
-  "http://www.huffingtonpost.com/2015/04/13/apple-watch-sales_n_7054492.html?ir=Technology",
-  "http://www.huffingtonpost.com/2015/04/13/best-jobs-2015_n_7056118.html?ir=Business",
-  "http://www.huffingtonpost.com/2015/04/13/bill-oreilly-open-season_n_7059058.html?ir=Media",
-  "http://www.huffingtonpost.com/2015/04/13/blackwater-guard-sentenced_n_7057452.html?ir=Politics",
-  "http://www.huffingtonpost.com/2015/04/13/corker-iran-bill-markup_n_7058600.html?ir=Politics",
-  "http://www.huffingtonpost.com/2015/04/13/corker-iran-bill-veto_n_7058600.html",
-  "http://www.huffingtonpost.com/2015/04/13/dixon-white-redneck_n_7059414.html?ir=Media",
-  "http://www.huffingtonpost.com/2015/04/13/drake-madonna-kiss-coachella_n_7053822.html?ir=Entertainment",
-  "http://www.huffingtonpost.com/2015/04/13/epidiolex_n_7055784.html?ir=Healthy+Living",
-  "http://www.huffingtonpost.com/2015/04/13/funny-tombstones_n_7051048.html?ir=Comedy",
-  "http://www.huffingtonpost.com/2015/04/13/hillary-clinton-404-page_n_7056172.html?ir=Technology",
-  "http://www.huffingtonpost.com/2015/04/13/hillary-clinton-video-announcement-2016_n_7054350.html?ir=Media",
-  "http://www.huffingtonpost.com/2015/04/13/holiness-the-17th-karmapa_n_7057622.html",
-  "http://www.huffingtonpost.com/2015/04/13/holiness-the-17th-karmapa_n_7057622.html#comments",
-  "http://www.huffingtonpost.com/2015/04/13/honest-inspirational-quotes_n_7055172.html?ir=Comedy",
-  "http://www.huffingtonpost.com/2015/04/13/house-vote-on-iran_n_7056150.html",
-  "http://www.huffingtonpost.com/2015/04/13/improve-internet-privacy_n_6902622.html?ir=Technology",
-  "http://www.huffingtonpost.com/2015/04/13/indiana-pr-firm_n_7056268.html?ir=Politics",
-  "http://www.huffingtonpost.com/2015/04/13/iraq-isis-counter-attack-anbar_n_7057974.html?ir=WorldPost",
-  "http://www.huffingtonpost.com/2015/04/13/jennifer-lopez-mtv-movie-awards_n_7054560.html?ir=Entertainment",
-  "http://www.huffingtonpost.com/2015/04/13/lena-dunham-mental-health_n_7053556.html?ir=Entertainment",
-  "http://www.huffingtonpost.com/2015/04/13/low-wages-cost-taxpayers-153-billion_n_7055202.html?ir=Business",
-  "http://www.huffingtonpost.com/2015/04/13/madison-small-bacterial-meningitis_n_7057822.html?ir=Healthy+Living",
-  "http://www.huffingtonpost.com/2015/04/13/manny-pacquiao-music-video-mayweather-_n_7054776.html",
-  "http://www.huffingtonpost.com/2015/04/13/manny-pacquiao-music-video-mayweather-_n_7054776.html#comments",
-  "http://www.huffingtonpost.com/2015/04/13/mother-65-quadruplets-german_n_7054068.html?ir=WorldPost",
-  "http://www.huffingtonpost.com/2015/04/13/nate-silver-vox-chart_n_7056154.html?ir=Media",
-  "http://www.huffingtonpost.com/2015/04/13/norovirus-cruise-ship_n_7058434.html?ir=Healthy+Living",
-  "http://www.huffingtonpost.com/2015/04/13/pink-weight-critics_n_7054238.html?ir=Entertainment",
-  "http://www.huffingtonpost.com/2015/04/13/redneck-dixon-white_n_7059414.html",
-  "http://www.huffingtonpost.com/2015/04/13/redneck-dixon-white_n_7059414.html#comments",
-  "http://www.huffingtonpost.com/2015/04/13/rich-people-live-longer-are-healthier_n_7054548.html?ir=Business",
-  "http://www.huffingtonpost.com/2015/04/13/rnc-gave-reporters-gag-fl_n_7055564.html?ir=Media",
-  "http://www.huffingtonpost.com/2015/04/13/russia-iran-missiles_n_7053940.html?ir=WorldPost",
-  "http://www.huffingtonpost.com/2015/04/13/toddler-sleep-problems-_n_7056016.html",
-  "http://www.huffingtonpost.com/2015/04/13/toddler-sleep-problems-_n_7056016.html#comments",
-  "http://www.huffingtonpost.com/2015/04/13/watch-spacex-launch-rocket-landing_n_7055812.html",
-  "http://www.huffingtonpost.com/2015/04/13/watch-spacex-launch-rocket-landing_n_7055812.html#comments",
-  "http://www.huffingtonpost.com/2015/04/13/whole-grain-health-benefits_n_6968990.html?ir=Healthy+Living",
-  "http://www.huffingtonpost.com/2015/04/14/abraham-lincoln-assassination-150th-anniversary_n_7065854.html",
-  "http://www.huffingtonpost.com/2015/04/14/abraham-lincoln-assassination-150th-anniversary_n_7065854.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/abraham-lincoln-dog-animal-lover_n_7055640.html",
-  "http://www.huffingtonpost.com/2015/04/14/abraham-lincoln-dog-animal-lover_n_7055640.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/amandla-stenberg-cultural_n_7064420.html?utm_hp_ref=mostpopular",
-  "http://www.huffingtonpost.com/2015/04/14/andrew-wiggins-omer-asik-dunk_n_7061260.html",
-  "http://www.huffingtonpost.com/2015/04/14/andrew-wiggins-omer-asik-dunk_n_7061260.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/anti-inflammatory-foods_n_7028052.html",
-  "http://www.huffingtonpost.com/2015/04/14/anti-inflammatory-foods_n_7028052.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/asiana-airlines-skids-runway_n_7061700.html",
-  "http://www.huffingtonpost.com/2015/04/14/asiana-airlines-skids-runway_n_7061700.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/brad-gooch-smash-cut_n_7058084.html",
-  "http://www.huffingtonpost.com/2015/04/14/brad-gooch-smash-cut_n_7058084.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/bringbackourgirls-one-year-anniversary_n_7056592.html",
-  "http://www.huffingtonpost.com/2015/04/14/bringbackourgirls-one-year-anniversary_n_7056592.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/bringbackourgirls-one-year-anniversary_n_7056592.html?ir=WorldPost",
-  "http://www.huffingtonpost.com/2015/04/14/c-section-rate-recommendation_n_7058954.html",
-  "http://www.huffingtonpost.com/2015/04/14/c-section-rate-recommendation_n_7058954.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/california-campus-rape-punishments_n_7056554.html",
-  "http://www.huffingtonpost.com/2015/04/14/california-campus-rape-punishments_n_7056554.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/chris-christie-2016_n_7061276.html",
-  "http://www.huffingtonpost.com/2015/04/14/chris-christie-blames-bri_n_7066226.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/cigarette-packaging_n_7064268.html",
-  "http://www.huffingtonpost.com/2015/04/14/cigarette-packaging_n_7064268.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/coffee-shop-bans-anti-gay_n_7061982.html",
-  "http://www.huffingtonpost.com/2015/04/14/coffee-shop-bans-anti-gay_n_7061982.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/congress-iran-bill_n_7062704.html?ir=Politics",
-  "http://www.huffingtonpost.com/2015/04/14/couple-killed-by-falling-construction-debris_n_7065862.html",
-  "http://www.huffingtonpost.com/2015/04/14/couple-killed-by-falling-construction-debris_n_7065862.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/cuba-terror-list_n_7064762.html",
-  "http://www.huffingtonpost.com/2015/04/14/cuba-terror-list_n_7064762.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/cuba-terror-list_n_7064762.html?utm_hp_ref=mostpopular",
-  "http://www.huffingtonpost.com/2015/04/14/dea-sex-parties_n_7063474.html",
-  "http://www.huffingtonpost.com/2015/04/14/dea-sex-parties_n_7063474.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/detention-center-hunger-strike_n_7064532.html",
-  "http://www.huffingtonpost.com/2015/04/14/detention-center-hunger-strike_n_7064532.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/drake-madonna-kiss-response_n_7061150.html?ir=Entertainment",
-  "http://www.huffingtonpost.com/2015/04/14/edward-snowden-bust-nypd_n_7065936.html",
-  "http://www.huffingtonpost.com/2015/04/14/edward-snowden-bust-nypd_n_7065936.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/epa-carbon-rule_n_7064302.html",
-  "http://www.huffingtonpost.com/2015/04/14/epa-carbon-rule_n_7064302.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/eu-google-antitrust-annou_n_7066634.html",
-  "http://www.huffingtonpost.com/2015/04/14/eu-google-antitrust-annou_n_7066634.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/family-feud-avengers_n_7061860.html?ir=Comedy",
-  "http://www.huffingtonpost.com/2015/04/14/fiduciary-standard-retirement-fees_n_7065110.html",
-  "http://www.huffingtonpost.com/2015/04/14/fiduciary-standard-retirement-fees_n_7065110.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/france-anorexia-bill_n_7066084.html",
-  "http://www.huffingtonpost.com/2015/04/14/france-anorexia-bill_n_7066084.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/free-cone-day-ben-and-jerrys-where_n_7033084.html",
-  "http://www.huffingtonpost.com/2015/04/14/free-cone-day-ben-and-jerrys-where_n_7033084.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/gravity-payments-raise_n_7061676.html?ir=Business",
-  "http://www.huffingtonpost.com/2015/04/14/hillary-clinton-chipotle_n_7063558.html",
-  "http://www.huffingtonpost.com/2015/04/14/hillary-clinton-chipotle_n_7063558.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/hillary-clinton-iowa-video_n_7064176.html",
-  "http://www.huffingtonpost.com/2015/04/14/hillary-clinton-iowa-video_n_7064176.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/ibrahim-al-rubaish-killed-yemen_n_7062758.html",
-  "http://www.huffingtonpost.com/2015/04/14/ibrahim-al-rubaish-killed-yemen_n_7062758.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/international-circus-anno_n_7062520.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/iran-bill-vote_n_7066070.html",
-  "http://www.huffingtonpost.com/2015/04/14/iran-bill-vote_n_7066070.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/iran-deal-senate_n_7063266.html",
-  "http://www.huffingtonpost.com/2015/04/14/jeb-bushs-administration-_n_7062336.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/jesse-williams-support-police-shootings_n_7063512.html",
-  "http://www.huffingtonpost.com/2015/04/14/jesse-williams-support-police-shootings_n_7063512.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/jon-stewart-hillary-clinton-announcement_n_7060206.html",
-  "http://www.huffingtonpost.com/2015/04/14/jon-stewart-hillary-clinton-announcement_n_7060206.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/jon-stewart-hillary-clinton-announcement_n_7060206.html?ir=Comedy",
-  "http://www.huffingtonpost.com/2015/04/14/ka-holt-house-arrest-poems_n_7058066.html",
-  "http://www.huffingtonpost.com/2015/04/14/ka-holt-house-arrest-poems_n_7058066.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/kenneth-morgan-stancil-iii-shooting_n_7061256.html",
-  "http://www.huffingtonpost.com/2015/04/14/kenneth-morgan-stancil-iii-shooting_n_7061256.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/kylie-jenner-lips_n_7064364.html?utm_hp_ref=mostpopular",
-  "http://www.huffingtonpost.com/2015/04/14/lawyer-tulsa-reserve-depu_n_7065652.html",
-  "http://www.huffingtonpost.com/2015/04/14/lawyer-tulsa-reserve-depu_n_7065652.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/lostandhungry-sorted-team_n_7062696.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/manufactured-housing-republicans_n_7065810.html",
-  "http://www.huffingtonpost.com/2015/04/14/manufactured-housing-republicans_n_7065810.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/marco-rubio-nicki-minaj_n_7062232.html",
-  "http://www.huffingtonpost.com/2015/04/14/marco-rubio-nicki-minaj_n_7062232.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/marco-rubios-announcement_n_7061846.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/missouri-state-auditor_n_7065144.html",
-  "http://www.huffingtonpost.com/2015/04/14/missouri-state-auditor_n_7065144.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/nancy-pelosi-iran-bill_n_7063826.html",
-  "http://www.huffingtonpost.com/2015/04/14/nancy-pelosi-iran-bill_n_7063826.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/oitnb-star-diane-guerrero_n_7063912.html",
-  "http://www.huffingtonpost.com/2015/04/14/oitnb-star-diane-guerrero_n_7063912.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/party-primary-poll_n_7064270.html",
-  "http://www.huffingtonpost.com/2015/04/14/party-primary-poll_n_7064270.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/percy-sledge-dead_n_7062944.html",
-  "http://www.huffingtonpost.com/2015/04/14/percy-sledge-dead_n_7062944.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/police-body-cameras-dc-mayor_n_7064060.html",
-  "http://www.huffingtonpost.com/2015/04/14/police-body-cameras-dc-mayor_n_7064060.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/republicans-equal-pay_n_7062128.html",
-  "http://www.huffingtonpost.com/2015/04/14/republicans-equal-pay_n_7062128.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/republicans-push-269-bill_n_7061458.html",
-  "http://www.huffingtonpost.com/2015/04/14/republicans-push-269-bill_n_7061458.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/republicans-push-269-bill_n_7061458.html?ir=Politics",
-  "http://www.huffingtonpost.com/2015/04/14/rikers-island-de-blasio-justice-reboot_n_7065438.html",
-  "http://www.huffingtonpost.com/2015/04/14/rikers-island-de-blasio-justice-reboot_n_7065438.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/romantic-comedies-failing-women_n_7026302.html",
-  "http://www.huffingtonpost.com/2015/04/14/romantic-comedies-failing-women_n_7026302.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/ron-johnson-obamacare-lawsuit_n_7064688.html?utm_hp_ref=mostpopular",
-  "http://www.huffingtonpost.com/2015/04/14/salomon-melgen-medicare-fraud_n_7066336.html",
-  "http://www.huffingtonpost.com/2015/04/14/salomon-melgen-medicare-fraud_n_7066336.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/sentence-teacher-scandal_n_7063296.html",
-  "http://www.huffingtonpost.com/2015/04/14/sentence-teacher-scandal_n_7063296.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/sexual-violence-report-boko-haram-isis_n_7059652.html?ir=WorldPost",
-  "http://www.huffingtonpost.com/2015/04/14/socially-responsible-companies-ranked_n_7063106.html",
-  "http://www.huffingtonpost.com/2015/04/14/socially-responsible-companies-ranked_n_7063106.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/summer-movie-preview-2015_n_7058302.html",
-  "http://www.huffingtonpost.com/2015/04/14/summer-movie-preview-2015_n_7058302.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/tech-visas_n_7061010.html?ir=Technology",
-  "http://www.huffingtonpost.com/2015/04/14/thabo-sefolosha-police-nypd_n_7064750.html",
-  "http://www.huffingtonpost.com/2015/04/14/thabo-sefolosha-police-nypd_n_7064750.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/thabo-sefolosha-police-nypd_n_7064750.html?utm_hp_ref=mostpopular",
-  "http://www.huffingtonpost.com/2015/04/14/the-future-project_n_7043956.html",
-  "http://www.huffingtonpost.com/2015/04/14/the-future-project_n_7043956.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/times-square-cookie-monster-gropes-teen_n_7062860.html",
-  "http://www.huffingtonpost.com/2015/04/14/times-square-cookie-monster-gropes-teen_n_7062860.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/tk-signs-of-oral-cancer_0_n_7055712.html",
-  "http://www.huffingtonpost.com/2015/04/14/tk-signs-of-oral-cancer_0_n_7055712.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/tom-brady-first-pitch_n_7062180.html",
-  "http://www.huffingtonpost.com/2015/04/14/tom-brady-first-pitch_n_7062180.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/tylenol-emotion-reduce-pleasure_n_7055518.html",
-  "http://www.huffingtonpost.com/2015/04/14/tylenol-emotion-reduce-pleasure_n_7055518.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/us-war-on-wildlife_n_7065294.html#comments",
-  "http://www.huffingtonpost.com/2015/04/14/what-chefs-eat-after-work_n_7019412.html",
-  "http://www.huffingtonpost.com/2015/04/14/what-chefs-eat-after-work_n_7019412.html#comments",
-  "http://www.huffingtonpost.com/50/",
-  "http://www.huffingtonpost.com/?country=BR",
-  "http://www.huffingtonpost.com/?country=CA",
-  "http://www.huffingtonpost.com/?country=DE",
-  "http://www.huffingtonpost.com/?country=ES",
-  "http://www.huffingtonpost.com/?country=FR",
-  "http://www.huffingtonpost.com/?country=GR",
-  "http://www.huffingtonpost.com/?country=IN",
-  "http://www.huffingtonpost.com/?country=IT",
-  "http://www.huffingtonpost.com/?country=JP",
-  "http://www.huffingtonpost.com/?country=KR",
-  "http://www.huffingtonpost.com/?country=MG",
-  "http://www.huffingtonpost.com/?country=UK",
-  "http://www.huffingtonpost.com/?country=US",
-  "http://www.huffingtonpost.com/?m=true",
-  "http://www.huffingtonpost.com/abraham-h-foxman",
-  "http://www.huffingtonpost.com/abraham-h-foxman/",
-  "http://www.huffingtonpost.com/abraham-h-foxman/how-to-deal-with-iranian-expansionism_b_7064596.html",
-  "http://www.huffingtonpost.com/amy-morin",
-  "http://www.huffingtonpost.com/amy-morin/",
-  "http://www.huffingtonpost.com/amy-morin/friends-health-science_b_7042042.html",
-  "http://www.huffingtonpost.com/arts/",
-  "http://www.huffingtonpost.com/arturo-lopez-levy",
-  "http://www.huffingtonpost.com/arturo-lopez-levy/",
-  "http://www.huffingtonpost.com/arturo-lopez-levy/marco-rubio-cuba-family-story_b_7058486.html",
-  "http://www.huffingtonpost.com/barry-levinson/",
-  "http://www.huffingtonpost.com/barry-levinson/the-age-of-insanity-part-5_b_7057854.html?utm_hp_ref=homepage",
-  "http://www.huffingtonpost.com/beth-markley",
-  "http://www.huffingtonpost.com/beth-markley/",
-  "http://www.huffingtonpost.com/beth-markley/whats-the-real-takeaway-from-gwyneths-29-effort_b_7059194.html",
-  "http://www.huffingtonpost.com/big-news/",
-  "http://www.huffingtonpost.com/big-news/#homepage",
-  "http://www.huffingtonpost.com/black-voices/",
-  "http://www.huffingtonpost.com/books/",
-  "http://www.huffingtonpost.com/bruce-ackerman/",
-  "http://www.huffingtonpost.com/bruce-ackerman/hillary-clintons-bad-beginning_b_7053662.html?utm_hp_ref=homepage",
-  "http://www.huffingtonpost.com/bruce-ackerman/hillary-clintons-bad-beginning_b_7053662.html?utm_hp_ref=yahoo&ir=Yahoo",
-  "http://www.huffingtonpost.com/bruce-wilson",
-  "http://www.huffingtonpost.com/bruce-wilson/",
-  "http://www.huffingtonpost.com/bruce-wilson/marco-rubios-miami-church_b_7063336.html",
-  "http://www.huffingtonpost.com/business/",
-  "http://www.huffingtonpost.com/celebrity/",
-  "http://www.huffingtonpost.com/charles-t-rubin",
-  "http://www.huffingtonpost.com/charles-t-rubin/",
-  "http://www.huffingtonpost.com/charles-t-rubin/ethical-artificial-intelligence_b_7034070.html",
-  "http://www.huffingtonpost.com/chicago/",
-  "http://www.huffingtonpost.com/code/",
-  "http://www.huffingtonpost.com/college/",
-  "http://www.huffingtonpost.com/comedy/",
-  "http://www.huffingtonpost.com/comment/policy/",
-  "http://www.huffingtonpost.com/contact/",
-  "http://www.huffingtonpost.com/crime/",
-  "http://www.huffingtonpost.com/dana-beyer",
-  "http://www.huffingtonpost.com/dana-beyer/",
-  "http://www.huffingtonpost.com/dana-beyer/as-the-wedge-turns----is_b_7065002.html",
-  "http://www.huffingtonpost.com/david-bromwich",
-  "http://www.huffingtonpost.com/david-bromwich/",
-  "http://www.huffingtonpost.com/david-bromwich/what-makes-abraham-lincoln_b_7063234.html",
-  "http://www.huffingtonpost.com/david-bromwich/what-makes-abraham-lincoln_b_7063234.html?utm_hp_ref=homepage",
-  "http://www.huffingtonpost.com/david-bromwich/what-makes-abraham-lincoln_b_7063234.html?utm_hp_ref=yahoo&ir=Yahoo",
-  "http://www.huffingtonpost.com/davidhalperin/video-in-iowa-clinton-str_b_7065662.html",
-  "http://www.huffingtonpost.com/davidhalperin/video-in-iowa-clinton-str_b_7065662.html#comments",
-  "http://www.huffingtonpost.com/dc/",
-  "http://www.huffingtonpost.com/dean-baker",
-  "http://www.huffingtonpost.com/dean-baker/",
-  "http://www.huffingtonpost.com/dean-baker/bonanza-for-the-super-rich_b_7058952.html",
-  "http://www.huffingtonpost.com/dennis-d-parker",
-  "http://www.huffingtonpost.com/dennis-d-parker/",
-  "http://www.huffingtonpost.com/dennis-d-parker/recent-slayings-of-unarme_b_7066128.html",
-  "http://www.huffingtonpost.com/denver/",
-  "http://www.huffingtonpost.com/detroit/",
-  "http://www.huffingtonpost.com/divorce/",
-  "http://www.huffingtonpost.com/dl-cade",
-  "http://www.huffingtonpost.com/dl-cade/",
-  "http://www.huffingtonpost.com/dl-cade/35-beautiful-photos-of-ch_b_7054670.html",
-  "http://www.huffingtonpost.com/drphil/",
-  "http://www.huffingtonpost.com/education/",
-  "http://www.huffingtonpost.com/elizabeth-barnett",
-  "http://www.huffingtonpost.com/elizabeth-barnett/",
-  "http://www.huffingtonpost.com/elizabeth-barnett/mental-health-stigma-_b_7054722.html",
-  "http://www.huffingtonpost.com/entertainment/",
-  "http://www.huffingtonpost.com/faq/",
-  "http://www.huffingtonpost.com/feeds/index.xml",
-  "http://www.huffingtonpost.com/fernando-espuelas",
-  "http://www.huffingtonpost.com/fernando-espuelas/",
-  "http://www.huffingtonpost.com/fernando-espuelas/enraged-congressman-confr_b_7063456.html",
-  "http://www.huffingtonpost.com/fifty/",
-  "http://www.huffingtonpost.com/food/",
-  "http://www.huffingtonpost.com/gary-a-olson",
-  "http://www.huffingtonpost.com/gary-a-olson/",
-  "http://www.huffingtonpost.com/gary-a-olson/how-to-understand-the-high-cost-of-college_b_7064796.html",
-  "http://www.huffingtonpost.com/gay-voices/",
-  "http://www.huffingtonpost.com/good-news/",
-  "http://www.huffingtonpost.com/gps-for-the-soul/",
-  "http://www.huffingtonpost.com/green/",
-  "http://www.huffingtonpost.com/grover-norquist/in-land-of-gridlock_b_7042874.html",
-  "http://www.huffingtonpost.com/grover-norquist/in-land-of-gridlock_b_7042874.html#comments",
-  "http://www.huffingtonpost.com/hawaii/",
-  "http://www.huffingtonpost.com/health-fitness/",
-  "http://www.huffingtonpost.com/health-news/",
-  "http://www.huffingtonpost.com/healthy-living/",
-  "http://www.huffingtonpost.com/home/",
-  "http://www.huffingtonpost.com/horoscopes/",
-  "http://www.huffingtonpost.com/huff-wires/",
-  "http://www.huffingtonpost.com/impact/",
-  "http://www.huffingtonpost.com/jack-stahlmann",
-  "http://www.huffingtonpost.com/jack-stahlmann/",
-  "http://www.huffingtonpost.com/jack-stahlmann/learning-from-the-masters_b_7061948.html",
-  "http://www.huffingtonpost.com/jobs/",
-  "http://www.huffingtonpost.com/joe-wilson",
-  "http://www.huffingtonpost.com/joe-wilson/",
-  "http://www.huffingtonpost.com/joe-wilson/were-for-hillary-and-here_b_7062940.html",
-  "http://www.huffingtonpost.com/joshua-l-schank-phd",
-  "http://www.huffingtonpost.com/joshua-l-schank-phd/",
-  "http://www.huffingtonpost.com/joshua-l-schank-phd/infrastructure-2-congress-and-the-terrible-horrible-no-good-very-bad-roads_b_7064222.html",
-  "http://www.huffingtonpost.com/kristin-rowefinkbeiner",
-  "http://www.huffingtonpost.com/kristin-rowefinkbeiner/",
-  "http://www.huffingtonpost.com/kristin-rowefinkbeiner/equalpayday-women-are-worth-more-than-spare-change_b_7064474.html",
-  "http://www.huffingtonpost.com/kristin-rowefinkbeiner/equalpayday-women-are-worth-more-than-spare-change_b_7064474.html?utm_hp_ref=mostpopular",
-  "http://www.huffingtonpost.com/latino-voices/",
-  "http://www.huffingtonpost.com/lori-pollan",
-  "http://www.huffingtonpost.com/lori-pollan/",
-  "http://www.huffingtonpost.com/lori-pollan/5-healthy-eating-strategies-that-will-outlast-any-trend_b_7054008.html",
-  "http://www.huffingtonpost.com/los-angeles/",
-  "http://www.huffingtonpost.com/makehome/",
-  "http://www.huffingtonpost.com/marc-lamont-hill",
-  "http://www.huffingtonpost.com/marc-lamont-hill/",
-  "http://www.huffingtonpost.com/margee-ensign",
-  "http://www.huffingtonpost.com/margee-ensign/",
-  "http://www.huffingtonpost.com/margee-ensign/we-the-survivors-of-boko-haram-kidnapping-have-not-been-broken_b_7062340.html",
-  "http://www.huffingtonpost.com/marlothomas/",
-  "http://www.huffingtonpost.com/mary-bottari",
-  "http://www.huffingtonpost.com/mary-bottari/",
-  "http://www.huffingtonpost.com/mary-bottari/hotel-industry-spins-wage_b_7058634.html",
-  "http://www.huffingtonpost.com/matt_green",
-  "http://www.huffingtonpost.com/matt_green/",
-  "http://www.huffingtonpost.com/matt_green/building-better-men_b_7064994.html",
-  "http://www.huffingtonpost.com/media/",
-  "http://www.huffingtonpost.com/miami/",
-  "http://www.huffingtonpost.com/money/",
-  "http://www.huffingtonpost.com/nancy-roman/things-i-learned-at-a-nude-resort_b_7029124.html",
-  "http://www.huffingtonpost.com/nancy-roman/things-i-learned-at-a-nude-resort_b_7029124.html#comments",
-  "http://www.huffingtonpost.com/new-york/",
-  "http://www.huffingtonpost.com/news/@sleep123/",
-  "http://www.huffingtonpost.com/news/afghanistan-war-blog/",
-  "http://www.huffingtonpost.com/news/ap/",
-  "http://www.huffingtonpost.com/news/becoming-fearless/",
-  "http://www.huffingtonpost.com/news/bob-menendez",
-  "http://www.huffingtonpost.com/news/bob-menendez/",
-  "http://www.huffingtonpost.com/news/brain/",
-  "http://www.huffingtonpost.com/news/buddhism",
-  "http://www.huffingtonpost.com/news/climate-change/",
-  "http://www.huffingtonpost.com/news/comedy-club/",
-  "http://www.huffingtonpost.com/news/comedy-original-video/",
-  "http://www.huffingtonpost.com/news/crossing-the-line/",
-  "http://www.huffingtonpost.com/news/dating/",
-  "http://www.huffingtonpost.com/news/diet/",
-  "http://www.huffingtonpost.com/news/drug-war",
-  "http://www.huffingtonpost.com/news/eat-the-press/",
-  "http://www.huffingtonpost.com/news/entertainment-originals/",
-  "http://www.huffingtonpost.com/news/floyd-mayweather/",
-  "http://www.huffingtonpost.com/news/for-profit-colleges/",
-  "http://www.huffingtonpost.com/news/foreign-affairs/",
-  "http://www.huffingtonpost.com/news/france",
-  "http://www.huffingtonpost.com/news/funny-videos/",
-  "http://www.huffingtonpost.com/news/gay-rights/",
-  "http://www.huffingtonpost.com/news/google",
-  "http://www.huffingtonpost.com/news/hpl",
-  "http://www.huffingtonpost.com/news/hpl/",
-  "http://www.huffingtonpost.com/news/hplifestyle/",
-  "http://www.huffingtonpost.com/news/huffpolitics-blog/",
-  "http://www.huffingtonpost.com/news/icon-next/",
-  "http://www.huffingtonpost.com/news/immigration/",
-  "http://www.huffingtonpost.com/news/income-inequality/",
-  "http://www.huffingtonpost.com/news/iran",
-  "http://www.huffingtonpost.com/news/iran/",
-  "http://www.huffingtonpost.com/news/japan/",
-  "http://www.huffingtonpost.com/news/jon-stewart/",
-  "http://www.huffingtonpost.com/news/kristen-bell",
-  "http://www.huffingtonpost.com/news/less-stress-more-living/",
-  "http://www.huffingtonpost.com/news/lgbt-history/",
-  "http://www.huffingtonpost.com/news/love-and-relationships",
-  "http://www.huffingtonpost.com/news/michelle-obama",
-  "http://www.huffingtonpost.com/news/nasa/",
-  "http://www.huffingtonpost.com/news/nature/",
-  "http://www.huffingtonpost.com/news/new-england-patriots/",
-  "http://www.huffingtonpost.com/news/nude/",
-  "http://www.huffingtonpost.com/news/nypd/",
-  "http://www.huffingtonpost.com/news/own-eating/",
-  "http://www.huffingtonpost.com/news/pet/",
-  "http://www.huffingtonpost.com/news/planning-for-retirement/",
-  "http://www.huffingtonpost.com/news/political-humor/",
-  "http://www.huffingtonpost.com/news/positive-change/",
-  "http://www.huffingtonpost.com/news/refugees",
-  "http://www.huffingtonpost.com/news/retirement",
-  "http://www.huffingtonpost.com/news/sleep/",
-  "http://www.huffingtonpost.com/news/smarter-ideas/",
-  "http://www.huffingtonpost.com/news/social-media/",
-  "http://www.huffingtonpost.com/news/spain",
-  "http://www.huffingtonpost.com/news/syria/",
-  "http://www.huffingtonpost.com/news/the-backstory/",
-  "http://www.huffingtonpost.com/news/third-metric/",
-  "http://www.huffingtonpost.com/news/trail-to-the-chief/",
-  "http://www.huffingtonpost.com/news/tulsa-shooting/",
-  "http://www.huffingtonpost.com/news/urban_progress/",
-  "http://www.huffingtonpost.com/news/video/",
-  "http://www.huffingtonpost.com/news/viral/",
-  "http://www.huffingtonpost.com/news/walter-scott/",
-  "http://www.huffingtonpost.com/news/warren-buffett",
-  "http://www.huffingtonpost.com/news/warren-buffett/",
-  "http://www.huffingtonpost.com/news/washington-post/",
-  "http://www.huffingtonpost.com/news/whats-working/",
-  "http://www.huffingtonpost.com/news/white-house/",
-  "http://www.huffingtonpost.com/news/yemen/",
-  "http://www.huffingtonpost.com/own/",
-  "http://www.huffingtonpost.com/p/arianna-in-print.html",
-  "http://www.huffingtonpost.com/p/ariannas-radio-and-podcas.html",
-  "http://www.huffingtonpost.com/p/ariannas-tv-appearances.html",
-  "http://www.huffingtonpost.com/p/huffington-post.html",
-  "http://www.huffingtonpost.com/parents/",
-  "http://www.huffingtonpost.com/patrick-r-krill",
-  "http://www.huffingtonpost.com/patrick-r-krill/",
-  "http://www.huffingtonpost.com/patrick-r-krill/price-of-alcohol_b_7054270.html",
-  "http://www.huffingtonpost.com/politics/",
-  "http://www.huffingtonpost.com/religion/",
-  "http://www.huffingtonpost.com/rep-jan-schakowsky",
-  "http://www.huffingtonpost.com/rep-jan-schakowsky/",
-  "http://www.huffingtonpost.com/rep-jan-schakowsky/on-equal-pay-day-lets-sta_b_7062680.html",
-  "http://www.huffingtonpost.com/rev-al-sharpton",
-  "http://www.huffingtonpost.com/rev-al-sharpton/",
-  "http://www.huffingtonpost.com/rev-al-sharpton/-will-the-south-teach-the_b_7055866.html",
-  "http://www.huffingtonpost.com/rev-al-sharpton/-will-the-south-teach-the_b_7055866.html?utm_hp_ref=homepage",
-  "http://www.huffingtonpost.com/rev-al-sharpton/-will-the-south-teach-the_b_7055866.html?utm_hp_ref=yahoo&ir=Yahoo",
-  "http://www.huffingtonpost.com/robert-l-borosage",
-  "http://www.huffingtonpost.com/robert-l-borosage/",
-  "http://www.huffingtonpost.com/robert-l-borosage/hillary-is-in-the-challen_b_7054712.html",
-  "http://www.huffingtonpost.com/roy-sekoff",
-  "http://www.huffingtonpost.com/roy-sekoff/",
-  "http://www.huffingtonpost.com/roy-sekoff/from-mississippi-1963-to-south-carolina-2015_b_7057048.html",
-  "http://www.huffingtonpost.com/san-francisco/",
-  "http://www.huffingtonpost.com/science/",
-  "http://www.huffingtonpost.com/sen-sheldon-whitehouse/",
-  "http://www.huffingtonpost.com/sen-sheldon-whitehouse/right-wing-groups-get-ove_b_7054956.html?utm_hp_ref=homepage",
-  "http://www.huffingtonpost.com/seungyoon-lee/noam-chomsky-twitter-interview_b_7064462.html",
-  "http://www.huffingtonpost.com/seungyoon-lee/noam-chomsky-twitter-interview_b_7064462.html#comments",
-  "http://www.huffingtonpost.com/shelley-emling",
-  "http://www.huffingtonpost.com/shelley-emling/",
-  "http://www.huffingtonpost.com/shelley-emling/17-things-i-want-my-son-to-know-on-his-17th-birthday_b_7034756.html",
-  "http://www.huffingtonpost.com/simple-thrifty-living/4-things-to-do-when-your-_b_7059046.html?ir=Business",
-  "http://www.huffingtonpost.com/small-business/",
-  "http://www.huffingtonpost.com/social/",
-  "http://www.huffingtonpost.com/sports/",
-  "http://www.huffingtonpost.com/style/",
-  "http://www.huffingtonpost.com/susan-brink",
-  "http://www.huffingtonpost.com/susan-brink/",
-  "http://www.huffingtonpost.com/susan-brink/the-permanent-loss-of-an-ex_b_7043310.html",
-  "http://www.huffingtonpost.com/syndication",
-  "http://www.huffingtonpost.com/syndication/",
-  "http://www.huffingtonpost.com/taste/",
-  "http://www.huffingtonpost.com/tavis-smiley",
-  "http://www.huffingtonpost.com/tavis-smiley/",
-  "http://www.huffingtonpost.com/tavis-smiley/my-conversation-with-isaiah-washington-on-black-identity_b_7059306.html",
-  "http://www.huffingtonpost.com/tech/",
-  "http://www.huffingtonpost.com/technology/",
-  "http://www.huffingtonpost.com/tedweekends/",
-  "http://www.huffingtonpost.com/teen/",
-  "http://www.huffingtonpost.com/terms.html",
-  "http://www.huffingtonpost.com/theworldpost/",
-  "http://www.huffingtonpost.com/travel/",
-  "http://www.huffingtonpost.com/tv/",
-  "http://www.huffingtonpost.com/users/logout/?referer=%2F",
-  "http://www.huffingtonpost.com/users/preferences/",
-  "http://www.huffingtonpost.com/valerie-plame-wilson",
-  "http://www.huffingtonpost.com/valerie-plame-wilson/",
-  "http://www.huffingtonpost.com/webslices/?v=home",
-  "http://www.huffingtonpost.com/weddings/",
-  "http://www.huffingtonpost.com/weird-news/",
-  "http://www.huffingtonpost.com/william-hartung",
-  "http://www.huffingtonpost.com/william-hartung/",
-  "http://www.huffingtonpost.com/william-hartung/on-pentagon-spending-will_b_7061698.html",
-  "http://www.huffingtonpost.com/women/",
-  "http://www.huffingtonpost.com/world/",
-  "http://www.ibtimes.com/jeb-bushs-administration-steered-florida-pension-money-george-w-bushs-fundraisers-1880592",
-  "http://www.imdb.com/",
-  "http://www.imdb.com/board/bd0000088/thread/242355070?ref_=hm_poll_lk1",
-  "http://www.imdb.com/imdbpicks/imdbtv-weekly-picks?ref_=hm_hm_tvpks_hd",
-  "http://www.imdb.com/imdbpicks/imdbtv-weekly-picks?ref_=hm_hm_tvpks_sm",
-  "http://www.imdb.com/list/ls002595589/?ref_=hm_aiv_hd",
-  "http://www.imdb.com/list/ls002595589/?ref_=hm_aiv_sm",
-  "http://www.imdb.com/poll/?ref_=hm_poll_mp",
-  "http://www.imdb.com/seen/ls076901727/?ref_=hm_poll_lk2",
-  "http://www.imdb.com/title/tt4120544/synopsis?ref_=hm_tvr_lk2",
-  "http://www.imdb.com/title/tt4260872/synopsis?ref_=hm_tvr_lk3",
-  "http://www.imdb.com/title/tt4294382/?ref_=hm_tvr_lk1",
-  "http://www.imdb.com/title/tt4294382/synopsis?ref_=hm_tvr_i_1",
-  "http://www.independent.co.uk/news/",
-  "http://www.instagram.com/dailymotion",
-  "http://www.instapundit.com/",
-  "http://www.juancole.com/",
-  "http://www.junglee.com/",
-  "http://www.kcrw.com/news/programs/lr",
-  "http://www.kottke.org/",
-  "http://www.latimes.com/",
-  "http://www.linkedin.com/today/online.wsj.com",
-  "http://www.linktv.org/mosaic/",
-  "http://www.look.com/",
-  "http://www.marginalrevolution.com/",
-  "http://www.marketwatch.com/Game/",
-  "http://www.mcclatchydc.com/",
-  "http://www.mediaite.com/",
-  "http://www.motherjones.com/",
-  "http://www.moviefone.com/",
-  "http://www.msn.com/",
-  "http://www.msnbc.com/maddowblog",
-  "http://www.myhabit.com/",
-  "http://www.nationaljournal.com/",
-  "http://www.nationaljournal.com/columns/political-connections",
-  "http://www.nationalreview.com/corner",
-  "http://www.nbcnews.com/",
-  "http://www.ndnblog.com",
-  "http://www.newrepublic.com/",
-  "http://www.newsmax.com/",
-  "http://www.newsweek.com",
-  "http://www.newsy.com/",
-  "http://www.newyorker.com/",
-  "http://www.npr.org/",
-  "http://www.nydailynews.com/",
-  "http://www.nydailynews.com/topics/Stanley+Crouch",
-  "http://www.nytimes.com/",
-  "http://www.nytimes.com/politics/first-draft/2015/04/14/christie-blames-trusting-nature-for-bridge-scandal/",
-  "http://www.observer.com/",
-  "http://www.offthebus.org",
-  "http://www.opednews.com/",
-  "http://www.pandagon.net/",
-  "http://www.pbs.org/newshour/",
-  "http://www.people.com/people",
-  "http://www.people.com/people/gallery/0,,20911186,00.html?xid=CNNApril16",
-  "http://www.people.com/people/gallery/0,,20911200,00.html?xid=CNNApril2",
-  "http://www.people.com/people/gallery/0,,20911278,00.html?xid=CNNApril7",
-  "http://www.peoplestylewatch.com/people/stylewatch/gallery/0,,20772704,00.html?xid=CNNApril9",
-  "http://www.politico.com/",
-  "http://www.propublica.org/",
-  "http://www.publicintegrity.org/",
-  "http://www.rawstory.com",
-  "http://www.realtor.com",
-  "http://www.reuters.com/",
-  "http://www.rollcall.com/",
-  "http://www.rollingstone.com/",
-  "http://www.salon.com/",
-  "http://www.sbnation.com/nfl-mock-draft/2015/4/14/8408341/2015-nfl-draft-trades-rams-broncos-marcus-mariota",
-  "http://www.seeingtheforest.com/",
-  "http://www.sfgate.com/",
-  "http://www.shopbop.com/welcome",
-  "http://www.slate.com/",
-  "http://www.slate.com/blogs/weigel.html",
-  "http://www.soap.com/",
-  "http://www.subscribe.wsj.com/getweekendnow?mod=WSJ_footer",
-  "http://www.suntimes.com/",
-  "http://www.talkingpointsmemo.com/",
-  "http://www.talkleft.com/",
-  "http://www.taylormarsh.com/",
-  "http://www.techcrunch.com",
-  "http://www.ted.com/",
-  "http://www.telegraph.co.uk/",
-  "http://www.tenmarks.com/",
-  "http://www.thatminoritything.com/",
-  "http://www.theatlantic.com/",
-  "http://www.theatlantic.com/james-fallows/",
-  "http://www.theglobeandmail.com/",
-  "http://www.thenation.com/",
-  "http://www.thenation.com/authors/eric-alterman",
-  "http://www.thenation.com/blogs/thebeat/",
-  "http://www.theroot.com",
-  "http://www.theyoungturks.com/",
-  "http://www.thismodernworld.com/",
-  "http://www.time.com/time/?xid=huffpo-direct",
-  "http://www.tmz.com",
-  "http://www.today.com/food/lostandhungry-sorted-teams-today-find-best-food-america-t14671?cid=par-huffingtonpost",
-  "http://www.tomdispatch.com/",
-  "http://www.tripadvisor.com/hotelhighlight?geo=45963&m=21194",
-  "http://www.tripadvisor.com/smartdeals?geo=186338&m=21194",
-  "http://www.tripadvisor.com/smartdeals?geo=34438&m=21194",
-  "http://www.tripadvisor.com/smartdeals?geo=60763&m=21194",
-  "http://www.tripadvisor.com/smartdeals?geo=60982&m=21194",
-  "http://www.trulia.com/?ecampaign=partner_cnn_home_search",
-  "http://www.trulia.com/?ecampaign=partner_cnn_home_title",
-  "http://www.trulia.com/for_rent?ecampaign=partner_cnn_rent",
-  "http://www.trulia.com/rent_vs_buy?ecampaign=partner_cnn_rentvbuy",
-  "http://www.trulia.com/sell?ts=CNN&tscamp=home_page_sell&ecampaign=partner_cnn_sell",
-  "http://www.trulia.com?ecampaign=partner_cnn_home_moving",
-  "http://www.truthdig.com/",
-  "http://www.turner.com",
-  "http://www.turner.com/careers",
-  "http://www.twitter.com/DailymotionUSA",
-  "http://www.usatoday.com/",
-  "http://www.usnews.com/news/blogs/washington-whispers",
-  "http://www.vanityfair.com/",
-  "http://www.vanityfair.com/online/wolcott",
-  "http://www.vinemarket.com/",
-  "http://www.vox.com/",
-  "http://www.vox.com/2015/4/14/8389515/iran-war",
-  "http://www.vox.com/2015/4/14/8410679/gender-wage-gap-retirement",
-  "http://www.wag.com/",
-  "http://www.washingtonmonthly.com/",
-  "http://www.washingtonpost.com/",
-  "http://www.washingtonpost.com/blogs/wonkblog/",
-  "http://www.washingtonpost.com/ej-dionne-jr/2011/02/24/ABhJNkM_page.html",
-  "http://www.washingtonpost.com/wp-dyn/content/linkset/2005/03/24/LI2005032402294.html",
-  "http://www.washingtontimes.com/",
-  "http://www.wired.com/dangerroom/",
-  "http://www.wired.com/threatlevel/",
-  "http://www.wsj.com/",
-  "http://www.wsj.com/ http://markets.wsj.com/us",
-  "http://www.wsj.com/#next",
-  "http://www.wsj.com/#prev",
-  "http://www.wsj.com/#top",
-  "http://www.wsj.com/10point",
-  "http://www.wsj.com/?_wsjregion=na,us&_homepage=/home/us",
-  "http://www.wsj.com/?mod=WSJ_hpp_videohome_1",
-  "http://www.wsj.com/?mod=WSJ_hpp_videohome_2",
-  "http://www.wsj.com/?mod=WSJ_hpp_videohome_3",
-  "http://www.wsj.com/?mod=WSJ_hpp_videohome_top",
-  "http://www.wsj.com/americas",
-  "http://www.wsj.com/articles/a-changing-nicaragua-attracts-resort-investor-1429027235?mod=WSJ_hpp_MIDDLE_Video_second",
-  "http://www.wsj.com/articles/a-churchs-light-inspires-a-jewelry-designer-from-afar-1429036012?mod=WSJ_hp_EditorsPicks",
-  "http://www.wsj.com/articles/a-consumer-drone-pioneer-were-learning-as-we-go-1428511868?mod=WSJ_hpp_sections_smallbusiness",
-  "http://www.wsj.com/articles/a-look-at-the-tax-year-2015-1428895367?mod=WSJ_hpp_sections_yourmoney",
-  "http://www.wsj.com/articles/a-new-jersey-home-that-doubles-as-a-resort-1429023305?mod=WSJ_hpp_sections_realestate",
-  "http://www.wsj.com/articles/a-to-be-renovated-westchester-house-is-listing-for-29-5-million-1428605768?mod=WSJ_hpp_sections_realestate",
-  "http://www.wsj.com/articles/after-two-years-new-york-baccarat-condo-sells-for-19-75-million-1428607165?mod=WSJ_hpp_sections_realestate",
-  "http://www.wsj.com/articles/alibaba-tencent-alumni-fuel-chinas-startup-success-1429028237?mod=WSJ_hp_EditorsPicks",
-  "http://www.wsj.com/articles/alibaba-tencent-alumni-fuel-chinas-startup-success-1429028237?mod=WSJ_hpp_sections_business",
-  "http://www.wsj.com/articles/annoying-things-donors-do-that-nonprofits-wish-they-would-stop-1428894145",
-  "http://www.wsj.com/articles/apple-buys-israeli-camera-technology-company-linx-1429037790#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/apple-buys-israeli-camera-technology-company-linx-1429037790?mod=WSJ_hpp_sections_tech",
-  "http://www.wsj.com/articles/apple-buys-israeli-camera-technology-company-linx-1429037790?mod=trending_now_10",
-  "http://www.wsj.com/articles/at-t-sues-to-overturn-fccs-net-neutrality-rules-1429052166?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/atlantas-groundbreaking-discovery-we-have-an-nba-team-1428940903?mod=WSJ_hpp_sections_sports",
-  "http://www.wsj.com/articles/avon-explores-strategic-alternatives-1429030371?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/california-water-supplier-cuts-summer-deliveries-1429044013?mod=WSJ_hpp_MIDDLENexttoWhatsNewsFifth",
-  "http://www.wsj.com/articles/californias-water-woes-are-priceless-1429051903",
-  "http://www.wsj.com/articles/castleton-emerges-as-leading-bidder-for-morgan-stanley-oil-business-1429046478?mod=WSJ_hpp_sections_markets",
-  "http://www.wsj.com/articles/china-expands-islands-in-disputed-waters-photos-show-1429011466?mod=WSJ_hpp_sections_world",
-  "http://www.wsj.com/articles/chinese-drone-maker-dji-in-talks-to-raise-funding-at-valuation-of-10-billion-1429050685?mod=WSJ_hpp_MIDDLENexttoWhatsNewsThird",
-  "http://www.wsj.com/articles/christie-to-call-for-raising-age-for-social-security-cutting-benefit-for-some-seniors-1429018212#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/christie-to-call-for-raising-age-for-social-security-cutting-benefit-for-some-seniors-1429018212?mod=WSJ_hpp_sections_newyork",
-  "http://www.wsj.com/articles/christie-to-call-for-raising-age-for-social-security-cutting-benefit-for-some-seniors-1429018212?mod=trending_now_2",
-  "http://www.wsj.com/articles/citigroups-asia-pacific-head-stephen-bird-to-run-consumer-bank-1428941075?mod=WSJ_hpp_sections_management",
-  "http://www.wsj.com/articles/digital-music-sales-overtake-cds-for-first-time-1429034467?mod=WSJ_hp_EditorsPicks",
-  "http://www.wsj.com/articles/digital-music-sales-overtake-cds-for-first-time-1429034467?mod=WSJ_hpp_sections_business",
-  "http://www.wsj.com/articles/does-your-whole-home-need-antivirus-now-1429036789?mod=WSJ_hpp_MIDDLENexttoWhatsNewsThird",
-  "http://www.wsj.com/articles/dont-overlook-netflixs-bigger-picture-ahead-of-the-tape-1429036988?mod=WSJ_hpp_sections_markets",
-  "http://www.wsj.com/articles/energy-future-files-42-billion-chapter-11-reorganization-plan-1429018731?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/eu-to-file-antitrust-charges-against-google-1429039881#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/eu-to-file-antitrust-charges-against-google-1429039881?mod=WSJ_hp_LEFTTopStories",
-  "http://www.wsj.com/articles/eu-to-file-antitrust-charges-against-google-1429039881?mod=trending_now_9",
-  "http://www.wsj.com/articles/ex-educator-accepts-deal-in-atlanta-cheating-case-1429025212?mod=WSJ_hpp_MIDDLENexttoWhatsNewsFifth",
-  "http://www.wsj.com/articles/extreme-closet-makeover-1429028352?mod=WSJ_hpp_MIDDLE_Video_second",
-  "http://www.wsj.com/articles/fare-increase-of-9-proposed-for-nj-transit-1429025661?mod=WSJ_hpp_sections_newyork",
-  "http://www.wsj.com/articles/for-duponts-ceo-high-stakes-vote-looms-1428951201?mod=WSJ_hpp_sections_management",
-  "http://www.wsj.com/articles/french-government-weighs-in-on-nokia-alcatel-lucent-deal-1429007493",
-  "http://www.wsj.com/articles/from-kale-to-chia-plot-the-arc-of-a-food-fad-1429034489#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/from-kale-to-chia-plot-the-arc-of-a-food-fad-1429034489?mod=WSJ_hp_EditorsPicks",
-  "http://www.wsj.com/articles/from-kale-to-chia-plot-the-arc-of-a-food-fad-1429034489?mod=WSJ_hpp_sections_lifestyle",
-  "http://www.wsj.com/articles/from-kale-to-chia-plot-the-arc-of-a-food-fad-1429034489?mod=trending_now_7",
-  "http://www.wsj.com/articles/germanys-rising-wages-bode-well-for-global-economy-1428861139?mod=WSJ_hpp_sections_careerjournal",
-  "http://www.wsj.com/articles/gm-seeks-longer-term-supplier-contracts-in-bid-to-cut-costs-1429046498?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/good-mental-health-away-from-home-starts-before-college-1428944477#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/good-mental-health-away-from-home-starts-before-college-1428944477?mod=trending_now_3",
-  "http://www.wsj.com/articles/google-may-offer-new-way-to-target-ads-1429044389?mod=WSJ_hpp_MIDDLENexttoWhatsNewsThird",
-  "http://www.wsj.com/articles/hillary-and-the-liberal-way-of-lying-1428968021#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/hillary-and-the-liberal-way-of-lying-1428968021?mod=trending_now_1",
-  "http://www.wsj.com/articles/hillary-clinton-vows-campaign-finance-fix-1429051307?mod=WSJ_hppMIDDLENexttoWhatsNewsSecond",
-  "http://www.wsj.com/articles/how-to-catch-a-rocket-with-a-helicopter-1429055300?mod=WSJ_hp_RightTopStories",
-  "http://www.wsj.com/articles/ibm-positions-itself-as-large-broker-of-health-data-1428961227?mod=WSJ_hpp_sections_health",
-  "http://www.wsj.com/articles/imf-slowing-emerging-market-growth-is-sapping-global-economic-prospects-1429016407?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/intel-reports-3-rise-in-earnings-1429042439?mod=WSJ_hpp_sections_tech",
-  "http://www.wsj.com/articles/investors-hunt-bargains-in-european-corporate-bonds-1429033188?mod=WSJ_hpp_sections_markets",
-  "http://www.wsj.com/articles/iran-foreign-minister-javad-zarif-puts-forward-peace-plan-for-yemen-1429006525?mod=WSJ_hpp_sections_world",
-  "http://www.wsj.com/articles/j-p-morgan-chases-wells-fargos-profitability-heard-on-the-street-1429040256",
-  "http://www.wsj.com/articles/japan-skirts-immigration-debate-by-offering-internships-to-foreigners-1429049533?mod=WSJ_hpp_sections_world",
-  "http://www.wsj.com/articles/jet-blue-wants-to-get-into-hotel-business-at-jfks-former-twa-terminal-1429035857?mod=WSJ_hpp_MIDDLE_Video_second",
-  "http://www.wsj.com/articles/justice-department-charges-former-export-import-bank-official-with-bribery-1429050539?mod=WSJ_hpp_sections_news",
-  "http://www.wsj.com/articles/kenyan-money-transfer-ban-puts-strain-on-somalis-1429053973?mod=WSJ_hpp_MIDDLE_Video_Top",
-  "http://www.wsj.com/articles/los-angeles-dodgers-turn-to-technology-in-hopes-of-engaging-fans-1429040649?mod=WSJ_hpp_MIDDLENexttoWhatsNewsThird",
-  "http://www.wsj.com/articles/lynda-com-a-60-year-old-earns-internet-glory-1428625176?mod=WSJ_hpp_sections_careerjournal",
-  "http://www.wsj.com/articles/lynda-com-a-60-year-old-earns-internet-glory-1428625176?mod=WSJ_hpp_sections_smallbusiness",
-  "http://www.wsj.com/articles/machinists-may-cancel-vote-on-unionizing-boeing-plant-in-south-carolina-1429043870?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/matomy-media-to-acquire-70-of-avenlo-1429052401?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/mogadishu-ukraine-hillary-china-wsj-photos-of-the-day-1429045997",
-  "http://www.wsj.com/articles/nba-playoff-chase-it-all-comes-down-to-this-1429042343?mod=WSJ_hpp_sections_sports",
-  "http://www.wsj.com/articles/new-jersey-gov-christie-calls-for-social-security-cuts-1429054912?mod=WSJ_hppMIDDLENexttoWhatsNewsSecond",
-  "http://www.wsj.com/articles/nokia-in-talks-to-buy-alcatel-lucent-1428996832?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/nokia-looks-to-reinvent-itself-yet-again-1429023574",
-  "http://www.wsj.com/articles/obama-to-remove-cuba-from-terror-list-1429040182?mod=WSJ_hp_LEFTTopStories",
-  "http://www.wsj.com/articles/obamas-one-man-nuclear-deal-1429054186",
-  "http://www.wsj.com/articles/obamas-one-man-nuclear-deal-1429054186?mod=WSJ_hpp_sections_opinion",
-  "http://www.wsj.com/articles/oil-layoffs-hit-100-000-and-counting-1429055740?mod=WSJ_hp_LEFTTopStories",
-  "http://www.wsj.com/articles/one-way-to-get-unstuck-and-move-up-all-you-have-to-do-is-ask-1429037179?mod=WSJ_hpp_MIDDLE_Video_Third",
-  "http://www.wsj.com/articles/p-g-ceo-lafley-lays-groundwork-for-exit-1428972027?mod=WSJ_hpp_sections_management",
-  "http://www.wsj.com/articles/photos-drawings-by-child-victims-of-boko-haram-attacks-1428958782",
-  "http://www.wsj.com/articles/police-arrest-suspect-in-north-carolina-campus-shooting-1429010542?mod=WSJ_hpp_sections_news",
-  "http://www.wsj.com/articles/regulators-call-for-short-term-loan-changes-to-handle-too-big-to-fail-1429051454?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/reserve-deputy-in-oklahoma-police-shooting-booked-for-manslaughter-1429037783?mod=WSJ_hpp_sections_news",
-  "http://www.wsj.com/articles/sec-reaches-settlement-with-former-freddie-mac-executives-1429044796?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/senate-panel-nears-compromise-on-iran-nuclear-deal-1429026751#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/senate-panel-nears-compromise-on-iran-nuclear-deal-1429026751?mod=WSJ_hp_LEFTTopStories",
-  "http://www.wsj.com/articles/senate-panel-nears-compromise-on-iran-nuclear-deal-1429026751?mod=trending_now_5",
-  "http://www.wsj.com/articles/spacex-rocket-fails-to-survive-landing-1429045616#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/spacex-rocket-fails-to-survive-landing-1429045616?mod=trending_now_4",
-  "http://www.wsj.com/articles/teen-years-are-a-window-of-opportunity-to-learn-empathy-1429051107?mod=WSJ_hpp_MIDDLE_Video_Third",
-  "http://www.wsj.com/articles/the-benefit-of-good-financial-habits-learned-early-1428894139",
-  "http://www.wsj.com/articles/the-best-or-worst-moment-to-make-a-big-change-1429044087?mod=WSJ_hp_RightTopStories",
-  "http://www.wsj.com/articles/the-cia-needs-an-iran-team-b-1429052586",
-  "http://www.wsj.com/articles/the-cia-needs-an-iran-team-b-1429052586?mod=WSJ_hpp_sections_opinion",
-  "http://www.wsj.com/articles/the-hillary-pay-ratio-1429054250",
-  "http://www.wsj.com/articles/the-hillary-pay-ratio-1429054250?mod=WSJ_hpp_sections_opinion",
-  "http://www.wsj.com/articles/these-tax-collectors-say-few-understand-their-passion-1429030555?mod=WSJ_hp_EditorsPicks",
-  "http://www.wsj.com/articles/u-s-could-eliminate-net-energy-imports-by-2030-1429037457?mod=WSJ_hpp_MIDDLENexttoWhatsNewsFifth",
-  "http://www.wsj.com/articles/u-s-stock-futures-trade-little-changed-1429013691?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/u-s-tech-giants-double-down-in-europe-1429046792?mod=WSJ_hpp_sections_business",
-  "http://www.wsj.com/articles/wall-street-rebounds-for-banks-in-first-quarter-1429038112?mod=WSJ_hp_LEFTWhatsNewsCollection",
-  "http://www.wsj.com/articles/webs-most-maniacal-bargain-hunters-1428619524?mod=WSJ_hpp_sections_smallbusiness",
-  "http://www.wsj.com/articles/what-parents-can-do-to-help-preemies-1428940972#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/what-parents-can-do-to-help-preemies-1428940972?mod=WSJ_hpp_sections_lifestyle",
-  "http://www.wsj.com/articles/what-parents-can-do-to-help-preemies-1428940972?mod=trending_now_8",
-  "http://www.wsj.com/articles/where-luxury-homes-sell-the-fastest-1429028433?mod=WSJ_hpp_MIDDLE_Video_second",
-  "http://www.wsj.com/articles/who-will-rule-the-nhl-now-1429030826?mod=WSJ_hpp_MIDDLENexttoWhatsNewsForth",
-  "http://www.wsj.com/articles/why-masters-champion-jordan-spieth-hired-a-former-schoolteacher-as-his-caddie-1428881077#articleTabs%3Dcomments",
-  "http://www.wsj.com/articles/why-masters-champion-jordan-spieth-hired-a-former-schoolteacher-as-his-caddie-1428881077?mod=trending_now_6",
-  "http://www.wsj.com/articles/wreck-of-migrant-vessel-headed-to-italy-leaves-up-to-400-dead-1429046306?mod=WSJ_hpp_MIDDLE_Video_Top",
-  "http://www.wsj.com/articles/youre-not-getting-a-pay-raise-youre-getting-a-money-management-class-1428423285?mod=WSJ_hpp_sections_careerjournal",
-  "http://www.wsj.com/articles/zimmer-extends-termination-date-for-biomet-deal-1428961625?mod=WSJ_hpp_sections_health",
-  "http://www.wsj.com/asia?_wsjregion=asia&_homepage=/home/asia",
-  "http://www.wsj.com/europe?_wsjregion=europe&_homepage=/home/europe",
-  "http://www.wsj.com/india?_wsjregion=asia,india&_homepage=/home/india",
-  "http://www.wsj.com/itp?mod=WSJ_formfactor",
-  "http://www.wsj.com/maketime",
-  "http://www.wsj.com/mdc/public/npage/2_3023_creditdervs.html?mod=topnav_2_3000",
-  "http://www.wsj.com/mdc/public/page/marketsdata.html",
-  "http://www.wsj.com/mdc/public/page/mdc_bonds.html",
-  "http://www.wsj.com/mdc/public/page/mdc_commodities.html",
-  "http://www.wsj.com/mdc/public/page/mdc_currencies.html",
-  "http://www.wsj.com/mdc/public/page/mdc_international.html",
-  "http://www.wsj.com/mdc/public/page/mdc_us_stocks.html",
-  "http://www.wsj.com/news/politics",
-  "http://www.wsj.com/news/technology",
-  "http://www.wsj.com/news/technology?mod=WSJ_hpp_sections_tech",
-  "http://www.wsj.com/news/technology?mod=WSJ_topnav_tech_main",
-  "http://www.wsj.com/page/columnists.html?mod=WSJ_footer",
-  "http://www.wsj.com/portuguese",
-  "http://www.wsj.com/public/page/archive.html",
-  "http://www.wsj.com/public/page/cfo-journal.html?mod=WSJ_hpp_sections_cfo",
-  "http://www.wsj.com/public/page/cio-journal.html?mod=WSJ_hpp_sections_cio",
-  "http://www.wsj.com/public/page/cookie-policy.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/cookie-policy.html?mod=WSJ_footer#cookies_advertising",
-  "http://www.wsj.com/public/page/copyright_policy.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/data-policy.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/designtech-wsjModuleHome.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/email-setup.html",
-  "http://www.wsj.com/public/page/email-setup.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/guides.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/journal-report-wealth.html",
-  "http://www.wsj.com/public/page/management.html",
-  "http://www.wsj.com/public/page/management.html?mod=WSJ_hpp_sections_management",
-  "http://www.wsj.com/public/page/management.html?mod=WSJ_topnav_management_main",
-  "http://www.wsj.com/public/page/new-york-main.html",
-  "http://www.wsj.com/public/page/new-york-main.html?mod=WSJ_hpp_sections_newyork",
-  "http://www.wsj.com/public/page/new-york-main.html?mod=WSJ_topnav_ny_main",
-  "http://www.wsj.com/public/page/news-business-us.html",
-  "http://www.wsj.com/public/page/news-business-us.html?mod=WSJ_hpp_sections_business",
-  "http://www.wsj.com/public/page/news-business-us.html?mod=WSJ_topnav_business_main",
-  "http://www.wsj.com/public/page/news-career-jobs.html?mod=WSJ_hpp_sections_careerjournal",
-  "http://www.wsj.com/public/page/news-financial-markets-stock.html",
-  "http://www.wsj.com/public/page/news-financial-markets-stock.html?mod=WSJ_hpp_sections_markets",
-  "http://www.wsj.com/public/page/news-financial-markets-stock.html?mod=WSJ_topnav_markets_main",
-  "http://www.wsj.com/public/page/news-global-world.html",
-  "http://www.wsj.com/public/page/news-global-world.html?mod=WSJ_hpp_sections_world",
-  "http://www.wsj.com/public/page/news-global-world.html?mod=WSJ_topnav_world_main",
-  "http://www.wsj.com/public/page/news-health-industry.html?mod=WSJ_hpp_sections_health",
-  "http://www.wsj.com/public/page/news-interactive-features-trends.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/news-lifestyle-arts-entertainment.html",
-  "http://www.wsj.com/public/page/news-lifestyle-arts-entertainment.html?mod=WSJ_hpp_sections_lifestyle",
-  "http://www.wsj.com/public/page/news-lifestyle-arts-entertainment.html?mod=WSJ_topnav_lifeculture_main",
-  "http://www.wsj.com/public/page/news-opinion-commentary.html",
-  "http://www.wsj.com/public/page/news-opinion-commentary.html?mod=WSJ_hpp_sections_opinion",
-  "http://www.wsj.com/public/page/news-opinion-commentary.html?mod=WSJ_topnav_opinion_main",
-  "http://www.wsj.com/public/page/news-personal-finance.html",
-  "http://www.wsj.com/public/page/news-personal-finance.html?mod=WSJ_hpp_sections_yourmoney",
-  "http://www.wsj.com/public/page/news-personal-finance.html?mod=WSJ_topnav_yourmoney_main",
-  "http://www.wsj.com/public/page/news-real-estate-homes.html",
-  "http://www.wsj.com/public/page/news-real-estate-homes.html?mod=WSJ_hpp_sections_realestate",
-  "http://www.wsj.com/public/page/news-real-estate-homes.html?mod=WSJ_topnav_realestate_main",
-  "http://www.wsj.com/public/page/news-small-business-marketing.html?mod=WSJ_hpp_sections_smallbusiness",
-  "http://www.wsj.com/public/page/news-sports-scores.html",
-  "http://www.wsj.com/public/page/news-sports-scores.html?mod=WSJ_hpp_sections_sports",
-  "http://www.wsj.com/public/page/news-wall-street-heard.html?mod=WSJ_formfactor",
-  "http://www.wsj.com/public/page/news-world-business.html",
-  "http://www.wsj.com/public/page/news-world-business.html?mod=WSJ_hpp_sections_news",
-  "http://www.wsj.com/public/page/news-world-business.html?mod=WSJ_topnav_us_main",
-  "http://www.wsj.com/public/page/privacy-policy.html?mod=WSJ_footer",
-  "http://www.wsj.com/public/page/risk-compliance-journal.html?mod=WSJ_hpp_sections_riskcompliance",
-  "http://www.wsj.com/public/page/subscriber_agreement.html?mod=WSJ_footer",
-  "http://www.wsj.com/video-center",
-  "http://www.wsj.com/video/christie-proposes-social-security-cuts/766B079B-59A6-4192-83BE-F9B0376688CC.html?mod=WSJ_hpp_videohome_3",
-  "http://www.wsj.com/video/do-you-need-antivirus-protection-for-your-whole-home/098D6AB5-74AD-4875-B8D0-439D878B728A.html?mod=WSJ_hpp_videohome_2",
-  "http://www.wsj.com/video/jerry-seib-clintons-nontraditional-campaign-strategy/397E64AA-3E01-4FC3-B03B-64B1D867CBC2.html",
-  "http://www.wsj.com/video/volunteer-cops-90-carry-guns-says-new-study/014526ED-61B3-40D6-A1CB-CBFD12BEA0A9.html?mod=WSJ_hpp_videohome_1",
-  "http://www.wsj.com/video/volunteer-cops-90-carry-guns-says-new-study/014526ED-61B3-40D6-A1CB-CBFD12BEA0A9.html?mod=WSJ_hpp_videohome_top",
-  "http://www.wsj.com/wsjdlive",
-  "http://www.wsjdigital.com?mod=WSJ_footer",
-  "http://www.wsjlocal.com?mod=WSJ_footer",
-  "http://www.wsjplus.com",
-  "http://www.wsjwine.com/",
-  "http://www.wsjwine.com/5941002",
-  "http://www.yahoo.co.jp/r/c1",
-  "http://www.yahoo.co.jp/r/c12",
-  "http://www.yahoo.co.jp/r/c13",
-  "http://www.yahoo.co.jp/r/c14",
-  "http://www.yahoo.co.jp/r/c15",
-  "http://www.yahoo.co.jp/r/c2",
-  "http://www.yahoo.co.jp/r/c25",
-  "http://www.yahoo.co.jp/r/c26",
-  "http://www.yahoo.co.jp/r/c32",
-  "http://www.yahoo.co.jp/r/c33",
-  "http://www.yahoo.co.jp/r/c34",
-  "http://www.yahoo.co.jp/r/c37",
-  "http://www.yahoo.co.jp/r/c41",
-  "http://www.yahoo.co.jp/r/c44",
-  "http://www.yahoo.co.jp/r/c46",
-  "http://www.yahoo.co.jp/r/c48",
-  "http://www.yahoo.co.jp/r/c5",
-  "http://www.yahoo.co.jp/r/c53",
-  "http://www.yahoo.co.jp/r/c57",
-  "http://www.yahoo.co.jp/r/c73",
-  "http://www.yahoo.co.jp/r/c97",
-  "http://www.yahoo.co.jp/r/cf17",
-  "http://www.yahoo.co.jp/r/cf20",
-  "http://www.yahoo.co.jp/r/cf21",
-  "http://www.yahoo.co.jp/r/cp3",
-  "http://www.yahoo.co.jp/r/fad",
-  "http://www.yahoo.co.jp/r/fcgi",
-  "http://www.yahoo.co.jp/r/fcsr",
-  "http://www.yahoo.co.jp/r/fdi",
-  "http://www.yahoo.co.jp/r/fhr",
-  "http://www.yahoo.co.jp/r/fin",
-  "http://www.yahoo.co.jp/r/fiv",
-  "http://www.yahoo.co.jp/r/fpv",
-  "http://www.yahoo.co.jp/r/fsec",
-  "http://www.yahoo.co.jp/r/ftm",
-  "http://www.yahoo.co.jp/r/lst",
-  "http://www.yahoo.co.jp/r/mht",
-  "http://www.yahoo.co.jp/r/pbk",
-  "http://www.yahoo.co.jp/r/pbx",
-  "http://www.yahoo.co.jp/r/pcl",
-  "http://www.yahoo.co.jp/r/pclplo",
-  "http://www.yahoo.co.jp/r/pet",
-  "http://www.yahoo.co.jp/r/pl1",
-  "http://www.yahoo.co.jp/r/plh1",
-  "http://www.yahoo.co.jp/r/plpb",
-  "http://www.yahoo.co.jp/r/pmllo",
-  "http://www.yahoo.co.jp/r/pnr",
-  "http://www.yahoo.co.jp/r/ppml",
-  "http://www.yandex.ru/?edit=1",
-  "http://www.yandex.ru/all",
-  "http://www.yandex.ru/themes",
-  "http://www.youthradio.org/",
-  "http://www.youtube.com/user/WSJDigitalNetwork",
-  "http://www.yoyo.com/",
-  "http://www.zappos.com/c/top-searches",
-  "http://wyv1.deviantart.com/art/Bullseye-2-0-353106293",
-  "http://wyv1.deviantart.com/art/Bullseye-351810171",
-  "http://xsu.deviantart.com/art/Kiss-17315599",
-  "http://yabs.yandex.ru/count/6TYBwTAPH4u40WW0gQA0022EiwtQKWLHbGAR1cbQYBW6yGe7feK9YgI4Bskg0QMM66IHlD19P0QJcYW7GgC1hlNeBE7T4xWJ1R41mV__________3yMF3tm9",
-  "http://yahoo.match.com?trackingid=526100&bannerid=673168",
-  "http://yahoonews.tumblr.com/MayweatherVsPacquiao",
-  "http://yandex.ru/images/",
-  "http://yandex.ru/video",
-  "http://zen-emma.deviantart.com/",
-  "http://zhidao.baidu.com/q?ct=17&pn=0&tn=ikaslist&rn=10&word=cow&fr=wwwt",
-  "http://zhidao.baidu.com/q?ct=17&pn=0&tn=ikaslist&rn=10&word=rice&fr=wwwt",
-  "http://zwyer.deviantart.com/art/kingpin-rodeo-100244386",
-  "https://ab.wikipedia.org/",
-  "https://about.twitter.com/careers",
-  "https://about.twitter.com/press/brand-assets",
-  "https://academia.stackexchange.com",
-  "https://accounts.google.com/ServiceLogin?continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fapp%3Ddesktop%26action_handle_signin%3Dtrue%26next%3D%252F%26hl%3Den%26feature%3Dplaylist&passive=true&uilel=3&hl=en&service=youtube",
-  "https://accounts.google.com/ServiceLogin?continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fapp%3Ddesktop%26action_handle_signin%3Dtrue%26next%3D%252F%26hl%3Den%26feature%3Dsign_in_promo&passive=true&uilel=3&hl=en&service=youtube",
-  "https://accounts.google.com/ServiceLogin?hl=en&continue=https://www.google.com/",
-  "https://ace.wikipedia.org/",
-  "https://ads.twitter.com/start?ref=gl-tw-tw-twitter-advertise",
-  "https://advertising.yahoo.com/",
-  "https://af.wikipedia.org/",
-  "https://ak.wikipedia.org/",
-  "https://als.wikipedia.org/",
-  "https://am.wikipedia.org/",
-  "https://an.wikipedia.org/",
-  "https://android.stackexchange.com",
-  "https://ang.wikipedia.org/",
-  "https://answers.yahoo.com/",
-  "https://apple.stackexchange.com",
-  "https://appworld.blackberry.com/webstore/content/19143/",
-  "https://ar-ar.facebook.com/",
-  "https://ar.wikipedia.org/",
-  "https://arc.wikipedia.org/",
-  "https://area51.stackexchange.com",
-  "https://arz.wikipedia.org/",
-  "https://as.wikipedia.org/",
-  "https://askubuntu.com",
-  "https://ast.wikipedia.org/",
-  "https://auto.yandex.ru/?from=morda&_openstat=yandex_c_b;title;vned5y;earalr5y_c_b_2",
-  "https://auto.yandex.ru/search?body_type=ALLROAD&year_from=2008&from=morda&_openstat=yandex_c_b;text;vned5y;earalr5y_c_b_2",
-  "https://av.wikipedia.org/",
-  "https://ay.wikipedia.org/",
-  "https://az.wikipedia.org/",
-  "https://ba.wikipedia.org/",
-  "https://bar.wikipedia.org/",
-  "https://bat-smg.wikipedia.org/",
-  "https://bcl.wikipedia.org/",
-  "https://be-x-old.wikipedia.org/",
-  "https://be.wikipedia.org/",
-  "https://beap.gemini.yahoo.com/mbclk?bv=1.0.0&es=MonthW8GIS_drcBjX3XSzP2AuLEQ.sSvZF9kctnyweQe9NyeVccbhN8pWRmKIZxJaT06ULgYjeTBs7zzm3_0y_.qtPm2iFzDTDviSCVZF4sZm69DOwi3hhY5lDLyoyGa4wvx9NEs8QWVk0wF_4DfSg7tdW0mXyp.myb_H4YB72sTaK6klW4asP1SxrqvEv_ODoZyyjJZ.ckSJPvLebOWWEWm85I4LAauCoojUEx03nCjOz0HrQDAcv_OJuP04DVMm4xqUpm2ckvlQ1eLGMTFz6hL7JY3dr7_prhOBd69Mi.xbtvnhA_FCIn40WMVG50Om1n9Berixti1a8YQnqA.tni5jYfg.ax6LRhNCOafZRqB8kvdQaRgZq8daVjpi0gs2S1L8K0ABR9G0BIRKzCzHklaEzMWQyUHlNSAvnotlsEbIP2wlGZp6J6mc8n0vrNrrOvv9ZMx.TOFAhg30wXGgaSLgggNe4mez8UPVSuvG7ZGhq1zdRe1svV2ldXMGNZC8Bg02C52iGP5d585o68GbXLKbmFp7XzC3P99W5mRBIJySjw-%26lp=",
-  "https://beap.gemini.yahoo.com/mbclk?bv=1.0.0&es=WCnObs0GIS9nbXiRw_DPZJUTacoX68H6gv8HYk2MB4OUDh2XXkpRVi.V7pMkN_SlTOL1yqFNwIXv8SF_JBVfICXXSZHhJ1FsupqpK93YeDgGinXDeGyUK4Kh5aEhcFFHuW962hi82VoXsX4AMBhCsQrPpWaU5D2htV6r0cEUiwJNBAlyVZk4_LkyZ3NSnqkWcDAZl1fnLSEAMWr1nXtAVBaFfHsU_dT4_l6fyjal2fA.FBQNW0n7SJEspxGEXCpznD.dhurDXm7UmW2d76S2Jb_0Ox80IG4dlbEdiwRNSYqwR83NksS4rqTsXzAbpgAtHelmgsSnFKPnwoLNcHj2UbOvLQHjEYLyShd6_aMSk3NWXnWWhPwINL0Hjc7q1KYayU6DzpoKrvM5aOI8ZHWN6Yd5Q.VpBI4zR8vHzrDfBWbdcT_WeDw3VNgkh44n8_6oflciAt3wsXbjgCgeeu8bxBuBKGVwWKgE8NG54jSX%26lp=",
-  "https://beap.gemini.yahoo.com/mbclk?bv=1.0.0&es=YBp6pYUGIS9MBDTQtcnaLw549xd7ZhIKYkrlIhITDGMuFu2LikIvMAUjGh.9tMXi7MBkuGnsI2mj6Z3V8yGpNjNCWxFockU3GknFP0GTw74KePGo8o9.DekcnwVzWIi51z34DSBnPVFtlpwOUSI1FcxuOlisu4zSd2IlVtUwma7C3ZqlPBRK7k9DxCBVjK5tuZ.peL_phzOIfgZYVdwuOTmTVjSRrv_Ym9MQ56Ipw9UNvfoaYm4vMzj3R85cAPLlOdxMEkBkwKNg1dpOerqgZLfv9WyNxWwS2EaiMSvDjNzPu6Vn9rolCJjBGqpm_t66Vq41AWkdTMB1IICzevCf6V07pOgsx2pXRBxygcpbLjD5m.9IOQDsD3wyV0sF98ejic9gSZulPPElSiKIRq9zI2kd_LWRcif2hHdKnunzILK3g8j0gpvqCDHlgwTJtTiBngUXjqB6Kg61IfsRfYHnXdAaOgogvT3H1RuH_pX6c9J3FBfutmeHis424_BMcrVH7INMHsPxclxzyLD4tSdmxcML9jhtD.H78AzGOjwFuhxqLpHb2QyxkkGJorpDFGRSgR.SLahbq4NjgZm7OFoWKWpCHQ--%26lp=",
-  "https://beap.gemini.yahoo.com/mbclk?bv=1.0.0&es=p.a5KLcGIS.8klbqtcJonC1UUNfBl7noU_MGU2obXL3c2yz5.17LQzpbHWp7aoIh9tHMCsszj847uckzoAdBrcagtNpMtKCoB9DUIfRsMoDsAZs2HEeQ_06_MOXtRTlrPrg6b5FK6zpelNd.nIdryR_hraRTlA0OqUnQBqFI68CEjyQDL8yKiisSs.BEnq3GAhdE1V.DqkextmN7bI0Lv0tlf5KNa_LsxdjKs6z7qHXwh3XCznXhzK5MOTK5oiUsuFLoCZpZSC1p2EyxLISV_rQWMLNzzhslM54Agf.q_SNGuG6c7mOKK6TAxnrKFb1ooBpMMOMyu7euCFTsacQ_NHgK3WO5DHS6FgAIFDgWQ8Tn09nHsjuJvM5DoB.g5IymYZjmU27B9pTWT7zUuozlY_N76wFyZy8YFlt48Leut1EM.7OlXZp3OoeW_XE7WtoDxFMKSqozlrEfFGjzF0718zbAkxxu4Uk7WCqbU27jgmud2o.PGvE60piEJRLBj_MNFx2a3ek3hqiwrPewOlvMVDWGpN0kZq1X1TokofHxVjYUHshTBp6ZDkknB4ZkLg--%26lp=",
-  "https://beap.gemini.yahoo.com/mbclk?bv=1.0.0&es=wb9qsqYGIS_MawyqahMhDJi2q7Dx74gUpsCCOe9C.nUjDzmuxgmAPf_TSHKSBhjIBOF479lJbaIl.yNrx3d8AVK0zhpl5gjgRhgkGQJnycE7vBqQl0pXeoUZKi9dMiEqRpxgLm8nASLlYuWMyf7mJ5bDkEWeoEpveix9HCfX07YNsr55sR7vEGolRP7aujSeLfLqiHrq2ss.YM0.hG_KogbiiqdUKVafoOUHke4qIpLtcVhmd233xeQC1jXvMLOBzRq562RaFYPKNb4.fNK9_DVXBdO_hnjLRucfz9pUeZh4Ak9pTuJJinGqPLwhCvMtpKYK6ogwGHyAjjwXKkTOuUfEMdSEc6MxUppzk095OXBY17ZLzbcPJplWWYayy8n1hCRCo_KqlXwVrsNvoyOeEszFkJbm3JTa9jau2dqQ1RvS9EffDr6XDKItCDXS65241.oXwhGiyAqxAF6kKbfQaXh8tP0yPNt0q5SU4XZTbmYWV1ELKV8mRiZCUbI4DDNyAWOrIm9v1zm6j1wUVmqGMr8J.FUeI76A49Og2MyOtr2crJdGbg25JQxqRu7apm8lcc3eAA0L%26lp=",
-  "https://bg.wikipedia.org/",
-  "https://bh.wikipedia.org/",
-  "https://bi.wikipedia.org/",
-  "https://bicycles.stackexchange.com",
-  "https://bjn.wikipedia.org/",
-  "https://blog.twitter.com",
-  "https://bm.wikipedia.org/",
-  "https://bn.wikipedia.org/",
-  "https://bo.wikipedia.org/",
-  "https://bpy.wikipedia.org/",
-  "https://br.wikipedia.org/",
-  "https://bs.wikipedia.org/",
-  "https://bug.wikipedia.org/",
-  "https://business.twitter.com",
-  "https://bxr.wikipedia.org/",
-  "https://ca.wikipedia.org/",
-  "https://calendar.live.com/?WT.mc_id=O16_BingHP",
-  "https://careers.stackoverflow.com",
-  "https://careers.stackoverflow.com?utm_source=stackoverflow.com&utm_medium=site-ui&utm_campaign=anon-topbar",
-  "https://careers.stackoverflow.com?utm_source=stackoverflow.com&utm_medium=site-ui&utm_campaign=multicollider",
-  "https://careers.yahoo.com",
-  "https://careers.yahoo.com/",
-  "https://cbk-zam.wikipedia.org/",
-  "https://cdo.wikipedia.org/",
-  "https://ce.wikipedia.org/",
-  "https://ceb.wikipedia.org/",
-  "https://celebrity.yahoo.com/",
-  "https://celebrity.yahoo.com/horoscope/aries/overview-daily-20150414.html",
-  "https://ch.wikipedia.org/",
-  "https://chr.wikipedia.org/",
-  "https://christianity.stackexchange.com",
-  "https://chy.wikipedia.org/",
-  "https://ckb.wikipedia.org/",
-  "https://classifieds.wsj.com/ad/Business-For-Sale-Ads?mod=WSJ_footer",
-  "https://classifieds.wsj.com/ad/Commercial-Real-Estate-Ads?mod=WSJ_footer",
-  "https://classifieds.wsj.com/ad/Franchise-For-Sale-Ads?mod=WSJ_footer",
-  "https://classifieds.wsj.com/ad/Job-Ads?mod=WSJ_footer",
-  "https://classifieds.wsj.com/ad/Residential-Real-Estate-Ads?mod=WSJ_footer",
-  "https://co.wikipedia.org/",
-  "https://commons.wikimedia.org/",
-  "https://cooking.stackexchange.com",
-  "https://crh.wikipedia.org/",
-  "https://cs.wikipedia.org/",
-  "https://csb.wikipedia.org/",
-  "https://cstheory.stackexchange.com",
-  "https://cu.wikipedia.org/",
-  "https://customercenter.wsj.com/view/contactus.html?mod=WSJ_footer",
-  "https://customercenter.wsj.com/view/ctdir/contactdirectory.html?mod=WSJ_footer",
-  "https://cv.wikipedia.org/",
-  "https://cy.wikipedia.org/",
-  "https://da.wikipedia.org/",
-  "https://dba.stackexchange.com",
-  "https://de-de.facebook.com/",
-  "https://de.wikipedia.org/",
-  "https://de.wikipedia.org/wiki/Wikipedia:Sprachen",
-  "https://dev.twitter.com",
-  "https://dev.twitter.com/docs/embedded-tweets",
-  "https://developers.facebook.com/?ref=pf",
-  "https://diq.wikipedia.org/",
-  "https://direct.yandex.ru/?from=maintest_ru_razmestitrekl",
-  "https://disk.yandex.ru/?auth&source=main-nonlogin",
-  "https://diy.stackexchange.com",
-  "https://djrc.dowjones.com/?mod=ProdX_MktgHub",
-  "https://drive.google.com/?tab=wo",
-  "https://drupal.stackexchange.com",
-  "https://dsb.wikipedia.org/",
-  "https://dv.wikipedia.org/",
-  "https://dz.wikipedia.org/",
-  "https://edit.yahoo.com/registration?.src=fpctx&.intl=us&.done=https%3A%2F%2Fwww.yahoo.com%2F",
-  "https://ee.wikipedia.org/",
-  "https://el.wikipedia.org/",
-  "https://electronics.stackexchange.com",
-  "https://eml.wikipedia.org/",
-  "https://en.wikipedia.org/",
-  "https://english.stackexchange.com",
-  "https://eo.wikipedia.org/",
-  "https://eo.wikipedia.org/wiki/Vikipedio:Internacia_Vikipedio",
-  "https://es-la.facebook.com/",
-  "https://es.wikipedia.org/",
-  "https://espanol.yahoo.com/",
-  "https://et.wikipedia.org/",
-  "https://eu.wikipedia.org/",
-  "https://everything.yahoo.com",
-  "https://ext.wikipedia.org/",
-  "https://fa.wikipedia.org/",
-  "https://faq.dailymotion.com/hc/en-us",
-  "https://faq.dailymotion.com/hc/en-us/requests/new",
-  "https://ff.wikipedia.org/",
-  "https://fi.wikipedia.org/",
-  "https://firstlook.org/theintercept/",
-  "https://fiu-vro.wikipedia.org/",
-  "https://fj.wikipedia.org/",
-  "https://flickr.com",
-  "https://fo.wikipedia.org/",
-  "https://foursquare.com/wsj",
-  "https://fr-fr.facebook.com/",
-  "https://fr.wikipedia.org/",
-  "https://frp.wikipedia.org/",
-  "https://frr.wikipedia.org/",
-  "https://fur.wikipedia.org/",
-  "https://fy.wikipedia.org/",
-  "https://ga.wikipedia.org/",
-  "https://gag.wikipedia.org/",
-  "https://gamedev.stackexchange.com",
-  "https://games.yahoo.com/",
-  "https://games.yahoo.com/game/gamepoint-bingo.html?_s_icmp=yahoofrontpage&adid=yahoofrontpageapprecommended&adcamp=yahoofrontpageapp&adop=org&adprop=yahoofrontpage",
-  "https://games.yahoo.com/game/royal-story.html?_s_icmp=yahoofrontpage&adid=yahoofrontpageapprecommended&adcamp=yahoofrontpageapp&adop=org&adprop=yahoofrontpage",
-  "https://games.yahoo.com/game/superhero-slots.html?_s_icmp=yahoofrontpage&adid=yahoofrontpageapprecommended&adcamp=yahoofrontpageapp&adop=org&adprop=yahoofrontpage",
-  "https://games.yahoo.com?_s_icmp=yahoofrontpage&adid=yahoofrontpageappmoregames&adcamp=yahoofrontpageapp&adop=org&adprop=yahoofrontpage",
-  "https://gaming.stackexchange.com",
-  "https://gan.wikipedia.org/",
-  "https://gd.wikipedia.org/",
-  "https://gis.stackexchange.com",
-  "https://gl.wikipedia.org/",
-  "https://glk.wikipedia.org/",
-  "https://global.factiva.com/du/global.aspx?mod=ProdX_MktgHub",
-  "https://gn.wikipedia.org/",
-  "https://got.wikipedia.org/",
-  "https://graphicdesign.stackexchange.com",
-  "https://groups.yahoo.com/",
-  "https://gu.wikipedia.org/",
-  "https://gv.wikipedia.org/",
-  "https://ha.wikipedia.org/",
-  "https://hak.wikipedia.org/",
-  "https://haw.wikipedia.org/",
-  "https://he.wikipedia.org/",
-  "https://help.yahoo.com/l/us/yahoo/helpcentral/",
-  "https://hi-in.facebook.com/",
-  "https://hi.wikipedia.org/",
-  "https://hif.wikipedia.org/",
-  "https://homes.yahoo.com/",
-  "https://hr.wikipedia.org/",
-  "https://hsb.wikipedia.org/",
-  "https://ht.wikipedia.org/",
-  "https://hu.wikipedia.org/",
-  "https://hy.wikipedia.org/",
-  "https://ia.wikipedia.org/",
-  "https://id.wikipedia.org/",
-  "https://id.wsj.com/access/509b1a086458232f6e000002/latest/register_standalone.html",
-  "https://id.wsj.com/auth/log-in",
-  "https://ie.wikipedia.org/",
-  "https://ig.wikipedia.org/",
-  "https://ik.wikipedia.org/",
-  "https://ilo.wikipedia.org/",
-  "https://info.yahoo.com",
-  "https://info.yahoo.com/legal/us/yahoo/utos/terms/",
-  "https://info.yahoo.com/privacy/us/yahoo/",
-  "https://info.yahoo.com/privacy/us/yahoo/relevantads.html",
-  "https://io.wikipedia.org/",
-  "https://is.wikipedia.org/",
-  "https://it-it.facebook.com/",
-  "https://it.wikipedia.org/",
-  "https://itunes.apple.com/us/app/huffpost-live/id572584499?ls=1&mt=8",
-  "https://itunes.apple.com/us/app/the-huffington-post/id306621789?mt=8",
-  "https://iu.wikipedia.org/",
-  "https://ja.wikipedia.org/",
-  "https://ja.wikipedia.org/wiki/Wikipedia:%E5%A4%9A%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2",
-  "https://jbo.wikipedia.org/",
-  "https://judaism.stackexchange.com",
-  "https://jv.wikipedia.org/",
-  "https://ka.wikipedia.org/",
-  "https://kaa.wikipedia.org/",
-  "https://kab.wikipedia.org/",
-  "https://kbd.wikipedia.org/",
-  "https://kg.wikipedia.org/",
-  "https://ki.wikipedia.org/",
-  "https://kk.wikipedia.org/",
-  "https://kl.wikipedia.org/",
-  "https://km.wikipedia.org/",
-  "https://kn.wikipedia.org/",
-  "https://ko-kr.facebook.com/",
-  "https://ko.wikipedia.org/",
-  "https://koi.wikipedia.org/",
-  "https://krc.wikipedia.org/",
-  "https://ks.wikipedia.org/",
-  "https://ksh.wikipedia.org/",
-  "https://ku.wikipedia.org/",
-  "https://kv.wikipedia.org/",
-  "https://kw.wikipedia.org/",
-  "https://ky.wikipedia.org/",
-  "https://la.wikipedia.org/",
-  "https://lad.wikipedia.org/",
-  "https://lb.wikipedia.org/",
-  "https://lbe.wikipedia.org/",
-  "https://lez.wikipedia.org/",
-  "https://lg.wikipedia.org/",
-  "https://li.wikipedia.org/",
-  "https://lij.wikipedia.org/",
-  "https://lmo.wikipedia.org/",
-  "https://ln.wikipedia.org/",
-  "https://lo.wikipedia.org/",
-  "https://login.yahoo.com/config/login?.src=fpctx&.intl=us&.done=https%3A%2F%2Fwww.yahoo.com%2F",
-  "https://lt.wikipedia.org/",
-  "https://ltg.wikipedia.org/",
-  "https://lv.wikipedia.org/",
-  "https://mai.wikipedia.org/",
-  "https://mail.google.com/mail/?tab=wm",
-  "https://mail.yahoo.com?.src=ym&.intl=us",
-  "https://mail.yandex.ru",
-  "https://map-bms.wikipedia.org/",
-  "https://maps.google.com/maps?hl=en&tab=wl",
-  "https://maps.yahoo.com/",
-  "https://maps.yandex.ru/",
-  "https://maps.yandex.ru/?index&ll=43.506343%2C55.219296&spn=22.434082%2C7.001578&z=6&l=map%2Cstv%2Csta&hint=zaglpano",
-  "https://math.stackexchange.com",
-  "https://mathematica.stackexchange.com",
-  "https://mathoverflow.net",
-  "https://mdf.wikipedia.org/",
-  "https://media.twitter.com",
-  "https://messenger.com/",
-  "https://meta.stackexchange.com",
-  "https://meta.stackoverflow.com",
-  "https://meta.wikimedia.org/",
-  "https://meta.wikimedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC%EC%9D%98_%EB%AA%A9%EB%A1%9D",
-  "https://meta.wikimedia.org/wiki/List_of_Wikipedias",
-  "https://meta.wikimedia.org/wiki/Lista_de_Wikipedias",
-  "https://meta.wikimedia.org/wiki/Liste_des_Wikip%C3%A9dias",
-  "https://mg.wikipedia.org/",
-  "https://mhr.wikipedia.org/",
-  "https://mi.wikipedia.org/",
-  "https://min.wikipedia.org/",
-  "https://mk.wikipedia.org/",
-  "https://ml.wikipedia.org/",
-  "https://mn.wikipedia.org/",
-  "https://mo.wikipedia.org/",
-  "https://mobile.yahoo.com",
-  "https://mobile.yahoo.com/yahoo/?src=gta",
-  "https://money.stackexchange.com",
-  "https://money.yandex.ru/",
-  "https://mr.wikipedia.org/",
-  "https://mrj.wikipedia.org/",
-  "https://ms.wikipedia.org/",
-  "https://mt.wikipedia.org/",
-  "https://music.yahoo.com",
-  "https://mwl.wikipedia.org/",
-  "https://my.wikipedia.org/",
-  "https://my.yahoo.com/?fr=yfp-t-403",
-  "https://myv.wikipedia.org/",
-  "https://mzn.wikipedia.org/",
-  "https://na.wikipedia.org/",
-  "https://nah.wikipedia.org/",
-  "https://nap.wikipedia.org/",
-  "https://nds-nl.wikipedia.org/",
-  "https://nds.wikipedia.org/",
-  "https://ne.wikipedia.org/",
-  "https://new.wikipedia.org/",
-  "https://news.google.com/nwshp?hl=en&tab=wn",
-  "https://news.yandex.ru/",
-  "https://news.yandex.ru/?lang=ru",
-  "https://news.yandex.ru/USA",
-  "https://news.yandex.ru/quotes/1.html",
-  "https://news.yandex.ru/quotes/1006.html",
-  "https://news.yandex.ru/quotes/2000.html",
-  "https://news.yandex.ru/quotes/2002.html",
-  "https://news.yandex.ru/quotes/23.html",
-  "https://nl.wikipedia.org/",
-  "https://nn.wikipedia.org/",
-  "https://no.wikipedia.org/",
-  "https://nov.wikipedia.org/",
-  "https://nrm.wikipedia.org/",
-  "https://nso.wikipedia.org/",
-  "https://nv.wikipedia.org/",
-  "https://ny.wikipedia.org/",
-  "https://oc.wikipedia.org/",
-  "https://offers.lendingtree.com/splitter/splitter.ashx?id=cnn-bizloan",
-  "https://office.live.com/start/Excel.aspx?WT.mc_id=O16_BingHP",
-  "https://office.live.com/start/PowerPoint.aspx?WT.mc_id=O16_BingHP",
-  "https://office.live.com/start/Word.aspx?WT.mc_id=O16_BingHP",
-  "https://om.wikipedia.org/",
-  "https://or.wikipedia.org/",
-  "https://os.wikipedia.org/",
-  "https://outlook.com/?WT.mc_id=O16_BingHP?mkt=en-US",
-  "https://pa.wikipedia.org/",
-  "https://pag.wikipedia.org/",
-  "https://pam.wikipedia.org/",
-  "https://pap.wikipedia.org/",
-  "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F",
-  "https://passport.yandex.ru/passport?mode=restore",
-  "https://passport.yandex.ru/registration/mail?mode=register&retpath=https://mail.yandex.ru%2F%3Forigin%3Dhome_ru_old&origin=home_ru_old",
-  "https://pcd.wikipedia.org/",
-  "https://pdc.wikipedia.org/",
-  "https://people.live.com/?WT.mc_id=O16_BingHP",
-  "https://pfl.wikipedia.org/",
-  "https://photo.stackexchange.com",
-  "https://physics.stackexchange.com",
-  "https://pi.wikipedia.org/",
-  "https://pih.wikipedia.org/",
-  "https://pl.wikipedia.org/",
-  "https://pl.wikipedia.org/wiki/Wikipedia:Lista_wersji_j%C4%99zykowych",
-  "https://play.google.com/?hl=en&tab=w8",
-  "https://play.google.com/store/apps/details?id=com.huffingtonpost.android",
-  "https://play.google.com/store/apps/details?id=com.huffingtonpost.android&hl=en",
-  "https://play.google.com/store/apps/details?id=com.huffingtonpost.android&hl=en_US",
-  "https://plus.google.com/+youtube",
-  "https://plus.google.com/116899029375914044550",
-  "https://plus.google.com/117720626238470886461/posts",
-  "https://pms.wikipedia.org/",
-  "https://pnb.wikipedia.org/",
-  "https://pnt.wikipedia.org/",
-  "https://pogoda.yandex.ru/mountain-view/",
-  "https://portfolio.wsj.com/portfolio?mod=wsj_port_mdc",
-  "https://programmers.stackexchange.com",
-  "https://ps.wikipedia.org/",
-  "https://pt-br.facebook.com/",
-  "https://pt.wikipedia.org/",
-  "https://qu.wikipedia.org/",
-  "https://rm.wikipedia.org/",
-  "https://rmy.wikipedia.org/",
-  "https://rn.wikipedia.org/",
-  "https://ro.wikipedia.org/",
-  "https://roa-rup.wikipedia.org/",
-  "https://roa-tara.wikipedia.org/",
-  "https://rpg.stackexchange.com",
-  "https://ru.wikipedia.org/",
-  "https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%A1%D0%92",
-  "https://rue.wikipedia.org/",
-  "https://rw.wikipedia.org/",
-  "https://sa.wikipedia.org/",
-  "https://sah.wikipedia.org/",
-  "https://salesforce.stackexchange.com",
-  "https://sc.wikipedia.org/",
-  "https://scifi.stackexchange.com",
-  "https://scn.wikipedia.org/",
-  "https://sco.wikipedia.org/",
-  "https://screen.yahoo.com",
-  "https://screen.yahoo.com/",
-  "https://screen.yahoo.com/live/",
-  "https://screen.yahoo.com/live/event/bad-religion",
-  "https://screen.yahoo.com/meghan-trainor-music-videos/bass-live-house-blues-chicago-020038973.html",
-  "https://screen.yahoo.com/sin-city-saints/episode-7-urine-gods-hands-070100636.html",
-  "https://sd.wikipedia.org/",
-  "https://se.wikipedia.org/",
-  "https://search.yahoo.com/search?cs=bz&p=Tax+deadline&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?cs=bz&p=Tax+deadline&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Alexis+Roderick&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Alexis+Roderick&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Anna+Kendrick&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Anna+Kendrick&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Carly+Rae+Jepsen&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Carly+Rae+Jepsen&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Chrissy+Teigen&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Chrissy+Teigen&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Christy+Mack&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Christy+Mack&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Nina+Dobrev&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Nina+Dobrev&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Olivia+Munn&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Olivia+Munn&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Wonder+Woman&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Wonder+Woman&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://search.yahoo.com/search?p=Wu-Tang+Clan&fr=fp-tts-901&fr2=ps&woeid=12587712&fp=1",
-  "https://search.yahoo.com/search?p=Wu-Tang+Clan&fr=fp-tts-901&woeid=12587712&fp=1&fr2=p:fp,m:tn,ct:all,pg:1,stl:crsl",
-  "https://secure.imdb.com/register-imdb/form-v2?ref_=ft_reg",
-  "https://secure.imdb.com/register-imdb/form-v2?ref_=nv_usr_reg_2",
-  "https://security.stackexchange.com",
-  "https://serverfault.com",
-  "https://sg.wikipedia.org/",
-  "https://sh.wikipedia.org/",
-  "https://sharepoint.stackexchange.com",
-  "https://shopping.yahoo.com/",
-  "https://si.wikipedia.org/",
-  "https://simple.wikipedia.org/",
-  "https://sk.wikipedia.org/",
-  "https://skeptics.stackexchange.com",
-  "https://skydrive.live.com/?gologin=1&WT.mc_id=O16_BingHP",
-  "https://sl.wikipedia.org/",
-  "https://sm.wikipedia.org/",
-  "https://smallbusiness.yahoo.com/?s_fptrough=ysb_acq_fp",
-  "https://sn.wikipedia.org/",
-  "https://so.wikipedia.org/",
-  "https://species.wikimedia.org/",
-  "https://sprav.yandex.ru/",
-  "https://sq.wikipedia.org/",
-  "https://sr.wikipedia.org/",
-  "https://srn.wikipedia.org/",
-  "https://ss.wikipedia.org/",
-  "https://st.wikipedia.org/",
-  "https://stackapps.com",
-  "https://stackexchange.com",
-  "https://stackexchange.com/questions?tab=hot",
-  "https://stackexchange.com/sites",
-  "https://stackoverflow.com",
-  "https://stackoverflow.com/users/login?returnurl=http%3a%2f%2fstackoverflow.com%2f",
-  "https://stackoverflow.com/users/signup?returnurl=http%3a%2f%2fstackoverflow.com%2f",
-  "https://stats.stackexchange.com",
-  "https://stq.wikipedia.org/",
-  "https://su.wikipedia.org/",
-  "https://subscribe.wsj.com/hphousead",
-  "https://superuser.com",
-  "https://support.google.com/youtube/?hl=en",
-  "https://support.twitter.com",
-  "https://support.twitter.com/articles/20170451",
-  "https://support.twitter.com/articles/20170514",
-  "https://sv.wikipedia.org/",
-  "https://sw.wikipedia.org/",
-  "https://szl.wikipedia.org/",
-  "https://ta.wikipedia.org/",
-  "https://te.wikipedia.org/",
-  "https://tet.wikipedia.org/",
-  "https://tex.stackexchange.com",
-  "https://tg.wikipedia.org/",
-  "https://th.wikipedia.org/",
-  "https://ti.wikipedia.org/",
-  "https://tk.wikipedia.org/",
-  "https://tl.wikipedia.org/",
-  "https://tn.wikipedia.org/",
-  "https://to.wikipedia.org/",
-  "https://tpi.wikipedia.org/",
-  "https://tr.wikipedia.org/",
-  "https://travel.stackexchange.com",
-  "https://ts.wikipedia.org/",
-  "https://tt.wikipedia.org/",
-  "https://tum.wikipedia.org/",
-  "https://tw.wikipedia.org/",
-  "https://twitter.com/HuffingtonPost",
-  "https://twitter.com/IMDb",
-  "https://twitter.com/dpsahoo/status/588051373901512704",
-  "https://twitter.com/intent/follow?screen_name=dpsahoo",
-  "https://twitter.com/intent/user?screen_name=NationalDefense",
-  "https://twitter.com/intent/user?screen_name=StewMagnusonNDM",
-  "https://twitter.com/intent/user?screen_name=dpsahoo",
-  "https://twitter.com/signup?context=login",
-  "https://ty.wikipedia.org/",
-  "https://tyv.wikipedia.org/",
-  "https://udm.wikipedia.org/",
-  "https://ug.wikipedia.org/",
-  "https://uk.wikipedia.org/",
-  "https://unix.stackexchange.com",
-  "https://ur.wikipedia.org/",
-  "https://ux.stackexchange.com",
-  "https://uz.wikipedia.org/",
-  "https://ve.wikipedia.org/",
-  "https://vec.wikipedia.org/",
-  "https://vep.wikipedia.org/",
-  "https://vi.wikipedia.org/",
-  "https://vi.wikipedia.org/wiki/Wikipedia:Phi%C3%AAn_b%E1%BA%A3n_ng%C3%B4n_ng%E1%BB%AF",
-  "https://vls.wikipedia.org/",
-  "https://vo.wikipedia.org/",
-  "https://wa.wikipedia.org/",
-  "https://war.wikipedia.org/",
-  "https://weather.yahoo.com",
-  "https://weather.yahoo.com/united-states/California/SantaClaraCounty-12587712/",
-  "https://webapps.stackexchange.com",
-  "https://webmasters.stackexchange.com",
-  "https://wikimediafoundation.org/",
-  "https://wikimediafoundation.org/wiki/Privacy_policy",
-  "https://wikimediafoundation.org/wiki/Terms_of_Use",
-  "https://wo.wikipedia.org/",
-  "https://wordpress.stackexchange.com",
-  "https://wuu.wikipedia.org/",
-  "https://www.amazon.com",
-  "https://www.amazon.com#gw-ftGr-desktop-hero-1",
-  "https://www.amazon.com#gw-ftGr-desktop-hero-2",
-  "https://www.amazon.com#gw-ftGr-desktop-hero-3",
-  "https://www.amazon.com#gw-ftGr-desktop-hero-4",
-  "https://www.amazon.com#gw-ftGr-desktop-hero-5",
-  "https://www.amazon.com/",
-  "https://www.amazon.com/101-Dalmatians-Diamond-Edition-Blu-ray/dp/B00OZLF4AG",
-  "https://www.amazon.com/AGPtEK%C2%AE-Playback-Lossless-Player-Supports/dp/B00SD18E60",
-  "https://www.amazon.com/AR-AR383-Electric-Pressure-Washer/dp/B002Z8E52Y",
-  "https://www.amazon.com/ARRIS-Motorola-SurfBoard-SB6121-DOCSIS/dp/B004XC6GJ0",
-  "https://www.amazon.com/Amazon-1_US_Email-Gift-Card-Email/dp/B004LLIKVU",
-  "https://www.amazon.com/Amazon-Kindle-Paperwhite-Special-Offers/dp/B00JG8GOWU",
-  "https://www.amazon.com/Amazon-W87CUN-Fire-TV-Stick/dp/B00GDQ0RMG",
-  "https://www.amazon.com/AmazonBasics-Apple-Certified-Lightning-Cable/dp/B00NH12YN0",
-  "https://www.amazon.com/Annie-HD-Albert-Finney/dp/B009V5KI98",
-  "https://www.amazon.com/Apple-MC544L-Generation-Discontinued-Manufacturer/dp/B001FA1O18",
-  "https://www.amazon.com/Apple-ME179LL-Generation-Discontinued-Manufacturer/dp/B0097BEFEU",
-  "https://www.amazon.com/Apple-classic-160GB-Generation-Player/dp/B001F7AHOG",
-  "https://www.amazon.com/Apple-iPod-Nano-Generation-MD477LL/dp/B0097BEDTC",
-  "https://www.amazon.com/Apple-iPod-Touch-16GB-Player/dp/B00LG71NZ2",
-  "https://www.amazon.com/Apple-shuffle-Space-Generation-NEWEST/dp/B0097BEEW8",
-  "https://www.amazon.com/Apple-touch-Generation-Discontinued-Manufacturer/dp/B001FA1O0O",
-  "https://www.amazon.com/BE365-CAM-609-Camelot-Deadbolt/dp/B001COBTBC",
-  "https://www.amazon.com/Barefoot-HD-Evan-Rachel-Wood/dp/B00JUIZMMY",
-  "https://www.amazon.com/Batman-Arkham-Knight-PlayStation-4/dp/B00IQCRKT8",
-  "https://www.amazon.com/Batman-HD-Michael-Keaton/dp/B00A3Z384M",
-  "https://www.amazon.com/Best-Sellers-Home-Improvement-Hand-Tools/zgbs/hi/551238",
-  "https://www.amazon.com/Big-Hero-Blu-ray-DVD-Digital/dp/B00O4ZC57I",
-  "https://www.amazon.com/Black-mini-Clip-Mp3-player/dp/B004S464WM",
-  "https://www.amazon.com/Brilliant-Flashlight-Waterproof-Shock-Resistant-MAGNETIZED/dp/B00TA2X4MU",
-  "https://www.amazon.com/Canon-EOS-Rebel-T5-Professional/dp/B00J34YO92",
-  "https://www.amazon.com/Canon-EOS-T5-Professional-lightweight/dp/B00L3NY180",
-  "https://www.amazon.com/Canon-LP-E8-Battery-Digital-Cameras/dp/B00393THEK",
-  "https://www.amazon.com/Canon-PowerShot-Digital-Camera-Black/dp/B00HLDFNKQ",
-  "https://www.amazon.com/Canon-PowerShot-SX520-16Digital-Stabilized/dp/B00M0QVTOS",
-  "https://www.amazon.com/Canon-Rebel-EF-S-18-55mm-Digital/dp/B00IB1BTWI",
-  "https://www.amazon.com/Captain-America-Winter-Soldier-Blu-ray/dp/B0090SI3GQ",
-  "https://www.amazon.com/Chicka-Boom-Book/dp/1442450703",
-  "https://www.amazon.com/Cinderella-2-Disc-Blu-ray-DVD-Digital/dp/B00UI5CTE2",
-  "https://www.amazon.com/Cinderella-Ilene-Woods/dp/B003ZHVJGO",
-  "https://www.amazon.com/Cowboy-Bebop-Complete-Series-Blu-ray/dp/B00NP06DJE",
-  "https://www.amazon.com/Currency-Converter/b?ie=UTF8&node=388305011",
-  "https://www.amazon.com/Dark-Souls-II-Scholar-First-PlayStation/dp/B00Q03M3HY",
-  "https://www.amazon.com/Fantasy-Remaster-Limited-Edition-playstation-4/dp/B00QU47SJG",
-  "https://www.amazon.com/Fast-Furious-6-Movie-Collection-Diesel/dp/B00IMYVCA8",
-  "https://www.amazon.com/Fiio-X1-FiiO-Silver/dp/B00NS3MRKC",
-  "https://www.amazon.com/Fire-HD-Display-Wi-Fi-GB/dp/B00KC6I06S",
-  "https://www.amazon.com/Fire-TV-streaming-media-player/dp/B00CX5P8FC",
-  "https://www.amazon.com/Flashlight-Modes-Torch-Adjustable-Focus/dp/B006E0QAFY",
-  "https://www.amazon.com/Force-Assisted-Opening-Folding-4-5-Inch/dp/B00FOR2DTU",
-  "https://www.amazon.com/G-G-Martinsen-Player-Media-Music-accessories-Blue/dp/B00NPTLAFW",
-  "https://www.amazon.com/G-I-Joe-Retaliation-Bruce-Willis/dp/B00DFFHUUA",
-  "https://www.amazon.com/Gods-Not-Dead-Kevin-Sorbo/dp/B00LPRKH5U",
-  "https://www.amazon.com/Godzilla-HD-Matthew-Broderick/dp/B008Y79HE6",
-  "https://www.amazon.com/Guardians-Galaxy-Blu-ray-3D-Digital/dp/B00N1JQ2UO",
-  "https://www.amazon.com/Hakko-CHP-170-Stand-off-Construction-21-Degree/dp/B00FZPDG1K",
-  "https://www.amazon.com/Halo-Master-Chief-Collection-Xbox-One/dp/B00KSQHX1K",
-  "https://www.amazon.com/Headlamp-Brightness-Headlamps-Batteries-Included/dp/B005FEGYJC",
-  "https://www.amazon.com/Iain-Sinclair-Design-Cardsharp2-Folding/dp/B006O9V2OY",
-  "https://www.amazon.com/Ill-Follow-You-Down-HD/dp/B00KMGZWVO",
-  "https://www.amazon.com/Indiana-Jones-Complete-Adventures-Raiders/dp/B000NQRE9Q",
-  "https://www.amazon.com/Interstellar-Blu-ray-Matthew-McConaughey/dp/B00SI7GCJK",
-  "https://www.amazon.com/Into-Woods-1-Disc-Blu-ray-Digital/dp/B00Q7WBFTA",
-  "https://www.amazon.com/Jack-Reacher-HD-Tom-Cruise/dp/B00BUCXVPI",
-  "https://www.amazon.com/Jack-Ryan-Shadow-Recruit-HD/dp/B00HZ3C4N6",
-  "https://www.amazon.com/Jupiter-Ascending-Blu-ray-UltraViolet-Combo/dp/B00K2CHYTQ",
-  "https://www.amazon.com/Kindle-Glare-Free-Touchscreen-Display-Wi-Fi/dp/B00I15SB16",
-  "https://www.amazon.com/Kubik-Player-Radio-Expandable-MicroSD/dp/B0041MMMWW",
-  "https://www.amazon.com/Lonve-Player-Music-Screen-Audio/dp/B00SASFBJE",
-  "https://www.amazon.com/Lonve-Player-Music-Screen-Audio/dp/B00SASFGF8",
-  "https://www.amazon.com/Lytro-Light-Field-Camera-16GB/dp/B0099QUUBU",
-  "https://www.amazon.com/Mario-Kart-8-Nintendo-Wii-U/dp/B00DC7G2W8",
-  "https://www.amazon.com/Mario-Party-10-Wii-U/dp/B00KWG4HG0",
-  "https://www.amazon.com/Metal-Gear-Solid-Phantom-Pain-PlayStation/dp/B00JKM06HG",
-  "https://www.amazon.com/Mortal-Kombat-X-PlayStation-4/dp/B00KOOUVNI",
-  "https://www.amazon.com/My-Old-Lady-Kevin-Kline/dp/B00S65W70M",
-  "https://www.amazon.com/Nikon-COOLPIX-Digital-Certified-Refurbished/dp/B00P18BDKC",
-  "https://www.amazon.com/Nikon-COOLPIX-Digital-Discontinued-Manufacturer/dp/B00HQ4W3OE",
-  "https://www.amazon.com/Nikon-COOLPIX-Waterproof-Discontinued-Manufacturer/dp/B00IA9LQK6",
-  "https://www.amazon.com/Nikon-Coolpix-Digital-Camera-Optical/dp/B00LMIKR6Q",
-  "https://www.amazon.com/Nikon-Coolpix-L330-Digital-Camera/dp/B00HQDBLDO",
-  "https://www.amazon.com/Nikon-Digital-NIKKOR-18-55mm-3-5-5-6G/dp/B00HQ4W1QE",
-  "https://www.amazon.com/Nintendo-Wii-Deluxe-Set-Bundle-U/dp/B00MVUKM0A",
-  "https://www.amazon.com/Outlander-Season-One-Volume/dp/B00RGQ4674",
-  "https://www.amazon.com/Panasonic-DMC-FZ70-Digital-Optical-Stabilized/dp/B00DY2Y28M",
-  "https://www.amazon.com/Panasonic-DMC-ZS50K-Travel-Camera-Viewfinder/dp/B00RBG687A",
-  "https://www.amazon.com/PlayStation-3-500-GB-System/dp/B009DL2TBA",
-  "https://www.amazon.com/PlayStation-4-Console/dp/B00BGA9WK2",
-  "https://www.amazon.com/Pok%C3%A9mon-Omega-Ruby-Nintendo-3DS/dp/B00KI2OZ9M",
-  "https://www.amazon.com/Robocop-HD-Joel-Kinnaman/dp/B00IK590UI",
-  "https://www.amazon.com/SE-MZ101B-Helping-Hands-Magnifying/dp/B000RB38X8",
-  "https://www.amazon.com/Samsung-2-5-Inch-Internal-MZ-75E250B-AM/dp/B00OAJ412U",
-  "https://www.amazon.com/Samsung-GC200-Galaxy-Camera-Touchscreen/dp/B00R3DGKWY",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Black-Sapphire/dp/B00V5LZUWQ",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Black-Sapphire/dp/B00V5LZXCS",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Platinum/dp/B00V5M0QTC",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Platinum/dp/B00V5M0TJ4",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Platinum/dp/B00V5M0VV0",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Sapphire/dp/B00V5M0J3U",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Sapphire/dp/B00V5M0LQ0",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Sapphire/dp/B00V7FWZVY",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Sapphire/dp/B00V7FX36U",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Sapphire/dp/B00V7FY076",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Sprint/dp/B00V7FWSY8",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Sprint/dp/B00V7FWWA8",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-White/dp/B00V5M09EY",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-White/dp/B00V5M0DU4",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Wireless/dp/B00V7FY44A",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Edge-Wireless/dp/B00V7FYD32",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Gold-Platinum/dp/B00V5M028W",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Gold-Platinum/dp/B00V5M04OE",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Platinum-128GB/dp/B00V5M072I",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Sapphire-Sprint/dp/B00V7FWBZY",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Sapphire-Sprint/dp/B00V7FWEX8",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Sapphire-Wireless/dp/B00V7FXCZ2",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Sapphire-Wireless/dp/B00V7FXLNA",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Verizon-Wireless/dp/B00V7FXHC0",
-  "https://www.amazon.com/Samsung-Galaxy-S6-Verizon-Wireless/dp/B00V7FXP5E",
-  "https://www.amazon.com/Samsung-Galaxy-S6-White-Pearl/dp/B00V5LZNFK",
-  "https://www.amazon.com/Samsung-Galaxy-S6-White-Pearl/dp/B00V5LZPAI",
-  "https://www.amazon.com/Samsung-Galaxy-S6-White-Sprint/dp/B00V7FVZ74",
-  "https://www.amazon.com/Samsung-Galaxy-S6-White-Sprint/dp/B00V7FW4MY",
-  "https://www.amazon.com/Samsung-WB350F-16-3MP-Digital-Optical/dp/B00HV6KK0G",
-  "https://www.amazon.com/SanDisk-Player-Screen-MicroSDHC-SDMX24-004G-G46R/dp/B00HCMZ19Y",
-  "https://www.amazon.com/SanDisk-Sansa-Clip-Player-Black/dp/B002MAPS6W",
-  "https://www.amazon.com/Schlage-B60N716-Deadbolt-Keyed-Bronze/dp/B0030ZM6JK",
-  "https://www.amazon.com/Schlage-BE365-PLY-619-Plymouth/dp/B0026SZNW4",
-  "https://www.amazon.com/Schlage-F10VACC619-Accent-Passage-Nickel/dp/B0007PNP2I",
-  "https://www.amazon.com/Schlage-F170-LAT-619-Latitude/dp/B0046ZRI5A",
-  "https://www.amazon.com/Schlage-F170ACC619RH-Accent-Right-Nickel/dp/B000HE7U98",
-  "https://www.amazon.com/Schlage-F170GEO619-Georgian-Dummy-Nickel/dp/B000HE314Q",
-  "https://www.amazon.com/Schlage-F170PLY619-Plymouth-Dummy-Nickel/dp/B000KKVDRY",
-  "https://www.amazon.com/Schlage-F60-CEN-619-LAT/dp/B0081Q6L4Y",
-  "https://www.amazon.com/Schlage-FE285-CAM-619-ACC/dp/B001NEK976",
-  "https://www.amazon.com/Schlage-FE595-16-234-10-027-Lock/dp/B0097GTAMC",
-  "https://www.amazon.com/Schlage-FE595-PLY-505-FLA/dp/B002057UWO",
-  "https://www.amazon.com/Schlage-FE595-PLY-505-Flex-Lock/dp/B001COEZT0",
-  "https://www.amazon.com/Schlage-Touchscreen-Deadbolt-Built-In-BE469NXCAM716/dp/B00AGK9KUU",
-  "https://www.amazon.com/Secret-Garden-Inky-Treasure-Coloring/dp/1780671067",
-  "https://www.amazon.com/Skyfall-HD-Daniel-Craig/dp/B00B5HQLMI",
-  "https://www.amazon.com/Smiths-PP1-Pocket-Multifunction-Sharpener/dp/B000O8OTNC",
-  "https://www.amazon.com/Sony-NEX-5TL-Compact-Interchangeable-Digital/dp/B00ENZRP38",
-  "https://www.amazon.com/Sony-NWZE385-Walkman-Video-Player/dp/B00ECQUY2M",
-  "https://www.amazon.com/Sony-W800-Digital-Camera-Black/dp/B00I8BIBCW",
-  "https://www.amazon.com/Sony-Walkman-NWZW273S-Waterproof-Swimming/dp/B00I05EFO4",
-  "https://www.amazon.com/Spirited-Away-2-Disc-Blu-ray-Combo/dp/B00V3QQF6I",
-  "https://www.amazon.com/Stanley-66-344-4-in-1-Pocket-Screwdriver/dp/B0014KMDZ0",
-  "https://www.amazon.com/Star-Trek-Into-Darkness-HD/dp/B00E5Q1HJS",
-  "https://www.amazon.com/Star-Wars-Digital-Movie-Collection/dp/B00VJ04TH0",
-  "https://www.amazon.com/Super-Smash-Bros-Nintendo-3DS/dp/B00DD0B1R0",
-  "https://www.amazon.com/The-Book-Pictures-B-J-Novak/dp/0803741715",
-  "https://www.amazon.com/The-Brothers-Grimm-Matt-Damon/dp/B008Y6U5AM",
-  "https://www.amazon.com/The-Hobbit-Blu-ray-Digital-UltraViolet/dp/B00R3DO58K",
-  "https://www.amazon.com/The-Hohng-Company-Catistry/dp/B00JBN7TUQ",
-  "https://www.amazon.com/The-Hunger-Games-Catching-Fire/dp/B00I2TV3NO",
-  "https://www.amazon.com/The-Hunger-Games-Mockingjay-Blu-ray/dp/B00PYLT4YI",
-  "https://www.amazon.com/The-Imitation-Game-Blu-ray-Ultraviolet/dp/B00RY86HSU",
-  "https://www.amazon.com/The-Last-Legion-HD-weinstein/dp/B009TGWVRG",
-  "https://www.amazon.com/The-Legend-Zelda-Majoras-Mask-3DS/dp/B00PB9LZQI",
-  "https://www.amazon.com/The-Lord-Rings-Fellowship-Extended/dp/B007ZQAKHU",
-  "https://www.amazon.com/The-Order-1886-PlayStation-4/dp/B00DBLBMBQ",
-  "https://www.amazon.com/Tyler-Perrys-Single-Moms-Club/dp/B00LFE43QC",
-  "https://www.amazon.com/Ultraviolet-flashlight-Blacklight-Scorpions-Guarantee/dp/B007SIR08C",
-  "https://www.amazon.com/Universal-Capacity-Exclusive-ChargeWise-Technology/dp/B00P060KB8",
-  "https://www.amazon.com/World-War-HD-Brad-Pitt/dp/B00EL8I8IS",
-  "https://www.amazon.com/Xbox-360-Wireless-Controller-Glossy-Black/dp/B003ZSP0WW",
-  "https://www.amazon.com/Xbox-One-Halo-Master-Collection-Bundle/dp/B00TY9KYKE",
-  "https://www.amazon.com/Xbox-One/dp/B00KAI3KW2",
-  "https://www.amazon.com/Xenoblade-Chronicles-3D-New-Nintendo-3DS/dp/B00T9Z8CHU",
-  "https://www.amazon.com/access",
-  "https://www.amazon.com/ap/signin?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fyourstore%2Fhome%3Fie%3DUTF8%26ref_%3Dnav_ya_signin",
-  "https://www.amazon.com/b/?_encoding=UTF8&node=11275476011",
-  "https://www.amazon.com/b?_encoding=UTF8&node=10048700011",
-  "https://www.amazon.com/b?_encoding=UTF8&node=8546790011",
-  "https://www.amazon.com/b?ie=UTF8&node=10158976011",
-  "https://www.amazon.com/b?ie=UTF8&node=10394030011",
-  "https://www.amazon.com/b?ie=UTF8&node=10659983011",
-  "https://www.amazon.com/b?ie=UTF8&node=10772747011",
-  "https://www.amazon.com/b?ie=UTF8&node=13786321",
-  "https://www.amazon.com/b?ie=UTF8&node=13786411",
-  "https://www.amazon.com/compare-credit-card-offers/b?ie=UTF8&node=3561432011",
-  "https://www.amazon.com/earn-spend-rewards-points/b?ie=UTF8&node=2634438011",
-  "https://www.amazon.com/gift-cards/b?ie=UTF8&node=2238192011",
-  "https://www.amazon.com/gp/bestsellers/electronics/1264866011",
-  "https://www.amazon.com/gp/bestsellers/electronics/281052",
-  "https://www.amazon.com/gp/cart/view.html",
-  "https://www.amazon.com/gp/cobrandcard/marketing.html?ie=UTF-8&place=camp&plattr=CCLFOOT&pr=ibprox",
-  "https://www.amazon.com/gp/css/homepage.html",
-  "https://www.amazon.com/gp/css/returns/homepage.html",
-  "https://www.amazon.com/gp/digital/fiona/manage",
-  "https://www.amazon.com/gp/feature.html?ie=UTF8&docId=1002989221",
-  "https://www.amazon.com/gp/goldbox",
-  "https://www.amazon.com/gp/help/customer/display.html?ie=UTF8&nodeId=468496",
-  "https://www.amazon.com/gp/help/customer/display.html?ie=UTF8&nodeId=468520",
-  "https://www.amazon.com/gp/help/customer/display.html?ie=UTF8&nodeId=508088",
-  "https://www.amazon.com/gp/help/customer/display.html?ie=UTF8&nodeId=508510",
-  "https://www.amazon.com/gp/most-wished-for/movies-tv",
-  "https://www.amazon.com/gp/most-wished-for/videogames",
-  "https://www.amazon.com/gp/prime",
-  "https://www.amazon.com/gp/product/B00DBYBNEE",
-  "https://www.amazon.com/gp/redirect.html?_encoding=UTF8&location=http%3A%2F%2Fphx.corporate-ir.net%2Fphoenix.zhtml%3Fc%3D176060%26p%3Dirol-mediaHome&source=standards&token=F9CAD8A11D4336B5E0B3C3B089FA066D0A467C1C",
-  "https://www.amazon.com/gp/redirect.html?_encoding=UTF8&location=http%3A%2F%2Fphx.corporate-ir.net%2Fphoenix.zhtml%3Fc%3D97664%26p%3Dirol-irhome&source=standards&token=F9CAD8A11D4336B5E0B3C3B089FA066D0A467C1C",
-  "https://www.amazon.com/gp/redirect.html?_encoding=UTF8&location=http%3A%2F%2Fservices.amazon.com%2Fselling-services%2Fbenefits.htm%3Fld%3DAZUSVAS-globalfooter&source=standards&token=2EF4DF105FC57E2F8FA2BB129755A3E03E343571",
-  "https://www.amazon.com/gp/redirect.html?_encoding=UTF8&location=http%3A%2F%2Fwww.amazon.com%2Fb%3Fnode%3D10048108011&source=standards&token=3A0F170E7CEFE27BDC730D3D7344512BC1296B83",
-  "https://www.amazon.com/gp/redirect.html?_encoding=UTF8&location=http%3A%2F%2Fwww.amazonservices.com%2Fcontent%2Fsell-on-amazon.htm%2Fref%3Dfooter_soa%3Fld%3DAZFSSOA&source=standards&token=1E60AB4AC0ECCA00151B45353E21782E539DC601",
-  "https://www.amazon.com/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.jobs%2Fgp%2Fredirect.html%3Flocation%3D%252F&source=standards&token=25117E9F01C8F0AB1D649F37EDDD2DEBE047C3A6",
-  "https://www.amazon.com/gp/redirect.html?location=http://affiliate-program.amazon.com/&token=020E83530EE2B7F2EDA65ADA51F882D31A4AC155&source=standards",
-  "https://www.amazon.com/gp/registry/wishlist",
-  "https://www.amazon.com/gp/seller-account/mm-landing.html?ie=UTF8&ld=AZSOAviewallMakeM",
-  "https://www.amazon.com/gp/seller-account/mm-product-page.html?ie=UTF8&ld=AZSOAUSCSNav",
-  "https://www.amazon.com/gp/seller-account/mm-summary-page.html?ie=UTF8&ld=AZFooterSelfPublish&topic=200260520",
-  "https://www.amazon.com/gp/site-directory",
-  "https://www.amazon.com/gp/wedding/homepage",
-  "https://www.amazon.com/gp/yourstore/home",
-  "https://www.amazon.com/interestbasedads",
-  "https://www.amazon.com/iss/credit/rewardscardmember?_encoding=UTF8&plattr=CBFOOT",
-  "https://www.amazon.com/iss/credit/storecardmember?_encoding=UTF8&plattr=PLCCFOOT",
-  "https://www.amazon.com/mortal-kombat-x/dp/B00US76GJY",
-  "https://www.amazon.com/s?_encoding=UTF8&bbn=172648&rh=i%3Aoffice-electronics%2Cn%3A1064954%2Cn%3A!1084128%2Cn%3A172574%2Cn%3A9424016011%2Cn%3A172635%2Cn%3A172648%2Cp_89%3ACanon%2Cp_36%3A0-9900",
-  "https://www.amazon.com/s?_encoding=UTF8&bbn=5856181011&rh=i%3Abeauty%2Cp_6%2Cn%3A5856181011%2Cn%3A3760911%2Cn%3A!11055981%2Cn%3A11057241",
-  "https://www.amazon.com/s?_encoding=UTF8&node=2858778011%2C7613704011&search-alias=prime-instant-video",
-  "https://www.amazon.com/s?_encoding=UTF8&rh=i%3Aoffice-products%2Cn%3A2563256011",
-  "https://www.amazon.com/s?_encoding=UTF8&rh=n%3A13889001%2Ci%3Abeauty",
-  "https://www.amazon.com:443/gp/redirect.html?_encoding=UTF8&location=https%3A%2F%2Fdeveloper.amazon.com%2Fappsandservices%3Fsc_channel%3Dba%26sc_place%3Damazonhome&source=standards&token=DF0CFA9EECFD0DEDEAE6094981480E48DBC1E112",
-  "https://www.bing.com",
-  "https://www.bing.com/account/general?ru=https%3a%2f%2fwww.bing.com%3a443%2f&FORM=SEFD",
-  "https://www.bing.com/explore?FORM=HPSFLT",
-  "https://www.bing.com/explore?FORM=Z9LH4",
-  "https://www.bing.com/images/search?q=Mount+Yoshino+Japan&FORM=hphot1",
-  "https://www.bing.com/images?FORM=Z9LH",
-  "https://www.bing.com/maps/?FORM=Z9LH2",
-  "https://www.bing.com/news?FORM=Z9LH3",
-  "https://www.bing.com/profile/history?FORM=Z9LH5",
-  "https://www.bing.com/rewards/dashboard",
-  "https://www.bing.com/search?q=Mount+Yoshino+&form=hpcapt&filters=HpDate%3a%2220150414_0700%22",
-  "https://www.bing.com/set/homepage?PUBL=BINGCOM",
-  "https://www.bing.com/translator?FORM=HPSFLT",
-  "https://www.bing.com/travel?FORM=HPSFLT",
-  "https://www.bing.com/videos/search?q=Mount+Yoshino&form=hphot2#view=detail&mid=662667328FC2B5E200A0662667328FC2B5E200A0",
-  "https://www.bing.com/videos/search?q=cherry+blossom+bonsai+dessert&FORM=hphot3#view=detail&mid=2E5DB183A7392542575F2E5DB183A7392542575F",
-  "https://www.bing.com/videos?FORM=Z9LH1",
-  "https://www.bing.com/weather/search?q=weather&FORM=HPSFLT",
-  "https://www.bing.com?FORM=HYLH",
-  "https://www.bing.com?FORM=HYLH1",
-  "https://www.comixology.com/",
-  "https://www.dailymotion.com",
-  "https://www.dailymotion.com/AgrigentoTV",
-  "https://www.dailymotion.com/CNET",
-  "https://www.dailymotion.com/Complex",
-  "https://www.dailymotion.com/HollyscoopTV",
-  "https://www.dailymotion.com/JukinVideo",
-  "https://www.dailymotion.com/LincolnLaunchDecember2012",
-  "https://www.dailymotion.com/LocalNews-GrabNetworks",
-  "https://www.dailymotion.com/MaxPreps",
-  "https://www.dailymotion.com/MojoSupreme",
-  "https://www.dailymotion.com/NowThis",
-  "https://www.dailymotion.com/Showtime",
-  "https://www.dailymotion.com/archived/index.html",
-  "https://www.dailymotion.com/buzzfeedvideo",
-  "https://www.dailymotion.com/carefreecooking",
-  "https://www.dailymotion.com/cbssports",
-  "https://www.dailymotion.com/dramashq",
-  "https://www.dailymotion.com/gq",
-  "https://www.dailymotion.com/ign",
-  "https://www.dailymotion.com/legal/childprotection",
-  "https://www.dailymotion.com/legal/copyright",
-  "https://www.dailymotion.com/legal/privacy",
-  "https://www.dailymotion.com/legal/prohibited",
-  "https://www.dailymotion.com/legal/terms",
-  "https://www.dailymotion.com/ndrive",
-  "https://www.dailymotion.com/oddsquadtumblr--",
-  "https://www.dailymotion.com/prime-pollution",
-  "https://www.dailymotion.com/rss/us",
-  "https://www.dailymotion.com/s-driver",
-  "https://www.dailymotion.com/splashnews",
-  "https://www.dailymotion.com/storyfulviral",
-  "https://www.dailymotion.com/stream",
-  "https://www.dailymotion.com/t-drive",
-  "https://www.dailymotion.com/teasertrailer",
-  "https://www.dailymotion.com/upload",
-  "https://www.dailymotion.com/us",
-  "https://www.dailymotion.com/us/about",
-  "https://www.dailymotion.com/us/browse",
-  "https://www.dailymotion.com/us/channel/animals",
-  "https://www.dailymotion.com/us/channel/auto",
-  "https://www.dailymotion.com/us/channel/fun",
-  "https://www.dailymotion.com/us/channel/lifestyle",
-  "https://www.dailymotion.com/us/channel/news",
-  "https://www.dailymotion.com/us/channel/people",
-  "https://www.dailymotion.com/us/channel/shortfilms",
-  "https://www.dailymotion.com/us/channel/sport",
-  "https://www.dailymotion.com/us/channel/tech",
-  "https://www.dailymotion.com/us/channel/travel",
-  "https://www.dailymotion.com/us/channel/videogames",
-  "https://www.dailymotion.com/us/everywhere",
-  "https://www.dailymotion.com/us/extras/jukebox",
-  "https://www.dailymotion.com/us/extras/mass_uploader",
-  "https://www.dailymotion.com/us/trending/1",
-  "https://www.dailymotion.com/us/users/no-explicit/list/recommended/1",
-  "https://www.dailymotion.com/us/users/no-explicit/list/recommended/1:10",
-  "https://www.dailymotion.com/video/x2j5um5_the-50-most-bizarre-couple-photos-compilation_fun",
-  "https://www.dailymotion.com/video/x2jy5zi_omg-chain-snatching-on-the-road-from-a-woman_news",
-  "https://www.dailymotion.com/video/x2lslaq_%EC%9E%A5%EB%AF%B8%EB%B9%9B-%EC%97%B0%EC%9D%B8%EB%93%A4-e50-150405-h1_creation",
-  "https://www.dailymotion.com/video/x2lvdqc_%EB%B9%9B%EB%82%98%EA%B1%B0%EB%82%98-%EB%AF%B8%EC%B9%98%EA%B1%B0%EB%82%98-e23-150406-1_creation",
-  "https://www.dailymotion.com/video/x2lvpai_%EB%B9%84%EC%A0%95%EC%83%81%ED%9A%8C%EB%8B%B4-e40-150406-l1_creation",
-  "https://www.dailymotion.com/video/x2lz0en_%EC%9A%A9%EA%B0%90%ED%95%9C-%EA%B8%B0%EC%9E%90%EB%93%A4-e106-150408_tv",
-  "https://www.dailymotion.com/video/x2lz46d_%EA%BD%83%EB%B3%B4%EB%8B%A4-%ED%95%A0%EB%B0%B0-in-%EA%B7%B8%EB%A6%AC%EC%8A%A4-e03-150410-480-1_tv",
-  "https://www.dailymotion.com/video/x2m5eo2_new-latest-punjabi-song-2015-jeevan-leather-life-sad-top-hit-2014-indian-pakistani-rock-movies-bolly_music",
-  "https://www.dailymotion.com/video/x2m7x9n_little-boy-heartbreakingly-says-goodbye-to-his-best-friend_fun",
-  "https://www.dailymotion.com/video/x2m9zq7_german-shepherd-lovingly-cares-for-adopted-new-puppy_animals",
-  "https://www.dailymotion.com/video/x2ma90d_sadqay-tumhare-last-episode-27-in-high-quality-10th-april-2015_shortfilms",
-  "https://www.dailymotion.com/video/x2me84t_kekkai-sensen-02-hd_tv",
-  "https://www.dailymotion.com/video/x2meh8f_women-s-makeup-throughout-history_news",
-  "https://www.dailymotion.com/video/x2mfnhb_tyler-the-creator-live-coachella-2015_music",
-  "https://www.dailymotion.com/video/x2miwgx_jeep-cherokee-2015-marrakesh-challenge-driving_auto",
-  "https://www.dailymotion.com/video/x2mjvre_rowers-challenged-as-several-flying-asian-carp-join-in-training_fun",
-  "https://www.dailymotion.com/video/x2mkwgg_top-5-benefits-of-apple-carplay-and-google-android_tech",
-  "https://www.dailymotion.com/video/x2ml6qg_ice-waves-n-ice-to-meet-you_travel",
-  "https://www.dailymotion.com/video/x2ml8ox_awesome-jetsprint-boat-pov-holy-sprint_auto",
-  "https://www.dailymotion.com/video/x2mlb4j_i-am-bread-review-commentary_videogames",
-  "https://www.dailymotion.com/video/x2mldhx_5-star-s-brandon-jones-nacogdoches-tx_sport",
-  "https://www.dailymotion.com/video/x2mlh4k_things-that-go-wrong-when-trying-to-watch-netflix_lifestyle",
-  "https://www.dailymotion.com/video/x2mlh4r_how-to-get-the-best-chips-in-the-bowl_lifestyle",
-  "https://www.dailymotion.com/video/x2mm5mh_mission-impossible-rogue-nation-fate-2015-tom-cruise_shortfilms",
-  "https://www.dailymotion.com/video/x2mnl05_terrified-skiers-appear-to-encounter-giant-mountain-lion-on-slopes_fun",
-  "https://www.dailymotion.com/video/x2mo9bq_gentlemen-lobsters-what-really-happens-at-coachella_lifestyle",
-  "https://www.dailymotion.com/video/x2mo9ds_astronauts-take-a-gopro-on-their-spacewalk_tech",
-  "https://www.dailymotion.com/video/x2mogov_flawed-perceptions-of-chris-paul_sport",
-  "https://www.dailymotion.com/video/x2mon13_dennis-quaid-freaks-out-on-set-and-it-s-caught-on-camera_people",
-  "https://www.dailymotion.com/video/x2mow8y_rihanna-wants-you-to-know-she-s-not-using-cocaine-in-this-video_news",
-  "https://www.dailymotion.com/videobash",
-  "https://www.dailymotion.com/worldtalk",
-  "https://www.dailymotion.com/worldwideinterweb",
-  "https://www.deviantart.com/",
-  "https://www.deviantart.com/#skins",
-  "https://www.deviantart.com/checkout/?mx=premium&subpref=22870_0&point=footer",
-  "https://www.deviantart.com/checkout/?mx=premium&subpref=22870_0&point=loginbar",
-  "https://www.deviantart.com/join",
-  "https://www.deviantart.com/join/?joinpoint=header",
-  "https://www.deviantart.com/join?joinpoint=standard",
-  "https://www.deviantart.com/users/forgot",
-  "https://www.facebook.com",
-  "https://www.facebook.com/",
-  "https://www.facebook.com/about/privacy",
-  "https://www.facebook.com/badges/?ref=pf",
-  "https://www.facebook.com/campaign/landing.php?placement=pflo&campaign_id=402047449186&extra_1=auto",
-  "https://www.facebook.com/careers/?ref=pf",
-  "https://www.facebook.com/directory/pages/",
-  "https://www.facebook.com/directory/people/",
-  "https://www.facebook.com/directory/places/",
-  "https://www.facebook.com/facebook",
-  "https://www.facebook.com/find-friends?ref=pf",
-  "https://www.facebook.com/games/",
-  "https://www.facebook.com/help/?ref=pf",
-  "https://www.facebook.com/help/cookies",
-  "https://www.facebook.com/help/cookies/?ref=sitefooter",
-  "https://www.facebook.com/legal/terms",
-  "https://www.facebook.com/login/",
-  "https://www.facebook.com/mobile/?ref=pf",
-  "https://www.facebook.com/pages/create/?ref_type=registration_form",
-  "https://www.facebook.com/pages/create/?ref_type=sitefooter",
-  "https://www.facebook.com/places/",
-  "https://www.facebook.com/policies/?ref=pf",
-  "https://www.facebook.com/privacy/explanation",
-  "https://www.facebook.com/r.php",
-  "https://www.facebook.com/recover/initiate",
-  "https://www.flickr.com/",
-  "https://www.flickr.com/photos/19716902@N00/2289844848",
-  "https://www.flickr.com/photos/35807342@N00/8622380863",
-  "https://www.flickr.com/photos/50668516@N00/8757590849",
-  "https://www.flickr.com/photos/8452611@N05/7942369750",
-  "https://www.flickr.com/photos/86665756@N00/7980261511",
-  "https://www.google.com/advanced_search?hl=en&authuser=0",
-  "https://www.google.com/chrome/index.html?hl=en&brand=CHNG&utm_source=en-hpp&utm_medium=hpp&utm_campaign=en",
-  "https://www.google.com/imghp?hl=en&tab=wi",
-  "https://www.google.com/intl/en/about.html",
-  "https://www.google.com/intl/en/ads/",
-  "https://www.google.com/intl/en/policies/privacy/",
-  "https://www.google.com/intl/en/policies/terms/",
-  "https://www.google.com/language_tools?hl=en&authuser=0",
-  "https://www.google.com/preferences?hl=en",
-  "https://www.google.com/search?site=&ie=UTF-8&q=when+was+the+first+mail+delivered+via+the+pony+express&oi=ddle&ct=155th-anniversary-of-the-pony-express-5959391580782592&hl=en&sa=X&ei=0qotVdGjDoK0yASvrIHAAg&ved=0CAMQNg",
-  "https://www.google.com/search?site=&ie=UTF-8&q=when+was+the+first+mail+delivered+via+the+pony+express&oi=ddle&ct=155th-anniversary-of-the-pony-express-5959391580782592&hl=en&sa=X&ei=z6otVcj0FZKzyATP6YCgAg&ved=0CAMQNg",
-  "https://www.google.com/services/",
-  "https://www.imdb.com/?ref_=ft_hm",
-  "https://www.imdb.com/?ref_=nv_home",
-  "https://www.imdb.com/a2z?ref_=ft_si",
-  "https://www.imdb.com/academymuseum/?ref_=nv_sf_am_1",
-  "https://www.imdb.com/apps/?ref_=ft_apps",
-  "https://www.imdb.com/apps/?ref_=nb_app",
-  "https://www.imdb.com/awards-central/?ref_=nv_ev_all_10",
-  "https://www.imdb.com/awards-central/?ref_=nv_ev_awrd_1",
-  "https://www.imdb.com/awards-central/?ref_=nv_tp_awrd_2",
-  "https://www.imdb.com/best-of/?ref_=nv_sf_bo_3",
-  "https://www.imdb.com/boards/?ref_=ft_mb",
-  "https://www.imdb.com/boards/?ref_=nv_cm_bd_1",
-  "https://www.imdb.com/boards/?ref_=nv_tp_bd_2",
-  "https://www.imdb.com/calendar/?ref_=nv_mv_cal_5",
-  "https://www.imdb.com/cannes/?ref_=nv_ev_can_5",
-  "https://www.imdb.com/chart/?ref_=ft_cht",
-  "https://www.imdb.com/chart/?ref_=hm_cht_sm",
-  "https://www.imdb.com/chart/?ref_=nv_ch_cht_2",
-  "https://www.imdb.com/chart/top?ref_=ft_250",
-  "https://www.imdb.com/chart/top?ref_=nv_ch_250_4",
-  "https://www.imdb.com/comic-con/?ref_=nv_ev_comic_6",
-  "https://www.imdb.com/czone/?ref_=nv_cm_cz_2",
-  "https://www.imdb.com/emmys/?ref_=nv_ev_rte_7",
-  "https://www.imdb.com/gallery/rg49781504?ref_=hm_ultron_ph_hd",
-  "https://www.imdb.com/gallery/rg49781504?ref_=hm_ultron_ph_sm",
-  "https://www.imdb.com/games/guess?ref_=nv_cm_qz_3",
-  "https://www.imdb.com/genre/?ref_=nv_ch_gr_5",
-  "https://www.imdb.com/help/",
-  "https://www.imdb.com/help/?ref_=nb_hlp",
-  "https://www.imdb.com/help/show_article?conditions",
-  "https://www.imdb.com/help/show_article?conditions&ref_=ft_cou",
-  "https://www.imdb.com/helpdesk/contact?ref_=ft_con",
-  "https://www.imdb.com/imdbpicks/?ref_=nv_sf_pks_2",
-  "https://www.imdb.com/imdbpicks/imdbtv-summer-premieres?ref_=hm_eds_cap_pri_1",
-  "https://www.imdb.com/imdbpicks/imdbtv-summer-premieres?ref_=hm_eds_i_1",
-  "https://www.imdb.com/imdbpicks/imdbtv-weekly-picks?ref_=hm_eds_cap_pri_2",
-  "https://www.imdb.com/imdbpicks/imdbtv-weekly-picks?ref_=hm_eds_i_2",
-  "https://www.imdb.com/imdbpicks/imdbtv-weekly-picks?ref_=hm_hm_tvpks_i_1",
-  "https://www.imdb.com/imdbpicks/imdbtv-weekly-picks?ref_=hm_hm_tvpks_i_2",
-  "https://www.imdb.com/imdbpicks/imdbtv-weekly-picks?ref_=hm_hm_tvpks_i_3",
-  "https://www.imdb.com/imdbpicks/month/april/indie-releases/?ref_=hm_eds_cap_pri_3",
-  "https://www.imdb.com/imdbpicks/month/april/indie-releases/?ref_=hm_eds_i_3",
-  "https://www.imdb.com/imdbpicks/month/april/tv-premieres/?ref_=hm_eds_cap_pri_4",
-  "https://www.imdb.com/imdbpicks/month/april/tv-premieres/?ref_=hm_eds_i_4",
-  "https://www.imdb.com/jobs?ref_=ft_jb",
-  "https://www.imdb.com/list/watchlist?ref_=nv_wl_all_0",
-  "https://www.imdb.com/media/index/rg1176148480?ref_=nv_ph_ls_1",
-  "https://www.imdb.com/media/index/rg1176148480?ref_=nv_tp_ph_3",
-  "https://www.imdb.com/media/index/rg1528338944?ref_=nv_ph_lp_2",
-  "https://www.imdb.com/media/index/rg2465176320?ref_=nv_ph_lv_3",
-  "https://www.imdb.com/media/rm1204876800/rg49781504?ref_=hm_ultron_ph_i_2",
-  "https://www.imdb.com/media/rm1708193280/rg49781504?ref_=hm_ultron_ph_i_1",
-  "https://www.imdb.com/media/rm2848978432/rg1056414464?ref_=hm_snp_cap_pri_2",
-  "https://www.imdb.com/media/rm2848978432/rg1056414464?ref_=hm_snp_i_2",
-  "https://www.imdb.com/media/rm3722442240/rg49781504?ref_=hm_ultron_ph_i_3",
-  "https://www.imdb.com/media/rm3804624384/rg955751168?ref_=hm_snp_cap_pri_3",
-  "https://www.imdb.com/media/rm3804624384/rg955751168?ref_=hm_snp_i_3",
-  "https://www.imdb.com/media/rm670234112/rg720870144?ref_=hm_snp_cap_pri_1",
-  "https://www.imdb.com/media/rm670234112/rg720870144?ref_=hm_snp_i_1",
-  "https://www.imdb.com/movies-coming-soon/?ref_=ft_cs",
-  "https://www.imdb.com/movies-coming-soon/?ref_=hm_cs_sm",
-  "https://www.imdb.com/movies-coming-soon/?ref_=nv_mv_cs_4",
-  "https://www.imdb.com/movies-in-theaters/?ref_=ft_inth",
-  "https://www.imdb.com/movies-in-theaters/?ref_=hm_otw_sm",
-  "https://www.imdb.com/movies-in-theaters/?ref_=nv_mv_inth_1",
-  "https://www.imdb.com/movies-in-theaters/?ref_=nv_tp_inth_1",
-  "https://www.imdb.com/name/nm0000234?ref_=hm_nw_cel1_lk1",
-  "https://www.imdb.com/name/nm0000576?ref_=hm_nw_cel1_lk2",
-  "https://www.imdb.com/name/nm0000598?ref_=hm_nw_tp1_lk1",
-  "https://www.imdb.com/name/nm0000598?ref_=hm_nw_tp1_lk2",
-  "https://www.imdb.com/name/nm0001015?ref_=hm_brn_cap_pri_lk1_4",
-  "https://www.imdb.com/name/nm0001015?ref_=hm_brn_i_4",
-  "https://www.imdb.com/name/nm0001264?ref_=hm_brn_cap_pri_lk1_2",
-  "https://www.imdb.com/name/nm0001264?ref_=hm_brn_i_2",
-  "https://www.imdb.com/name/nm0001309?ref_=hm_brn_cap_pri_lk1_5",
-  "https://www.imdb.com/name/nm0001309?ref_=hm_brn_i_5",
-  "https://www.imdb.com/name/nm0001570?ref_=hm_nw_mv1_lk1",
-  "https://www.imdb.com/name/nm0004778?ref_=hm_brn_cap_pri_lk1_3",
-  "https://www.imdb.com/name/nm0004778?ref_=hm_brn_i_3",
-  "https://www.imdb.com/name/nm0749263?ref_=hm_nw_mv1_lk2",
-  "https://www.imdb.com/name/nm0805476?ref_=hm_nw_tp1_lk4",
-  "https://www.imdb.com/name/nm1113550?ref_=hm_brn_cap_pri_lk1_1",
-  "https://www.imdb.com/name/nm1113550?ref_=hm_brn_i_1",
-  "https://www.imdb.com/news/?ref_=ft_nw",
-  "https://www.imdb.com/news/celebrity?ref_=hm_nw_cel_tb",
-  "https://www.imdb.com/news/celebrity?ref_=hm_nw_sm",
-  "https://www.imdb.com/news/celebrity?ref_=nv_cel_nw_2",
-  "https://www.imdb.com/news/celebrity?ref_=nv_nw_cel_4",
-  "https://www.imdb.com/news/indie?ref_=nv_nw_ind_5",
-  "https://www.imdb.com/news/movie?ref_=hm_nw_mv_tb",
-  "https://www.imdb.com/news/movie?ref_=hm_nw_sm",
-  "https://www.imdb.com/news/movie?ref_=nv_nw_mv_2",
-  "https://www.imdb.com/news/ni58503006?ref_=hm_nw_mv2",
-  "https://www.imdb.com/news/ni58504217?ref_=hm_nw_mv3",
-  "https://www.imdb.com/news/ni58504376/?ref_=nv_nw_tn_2",
-  "https://www.imdb.com/news/ni58504376?ref_=hm_nw_tp2",
-  "https://www.imdb.com/news/ni58504454?ref_=hm_nw_cel3",
-  "https://www.imdb.com/news/ni58504489?ref_=hm_nw_mv4",
-  "https://www.imdb.com/news/ni58504514/?ref_=nv_nw_tn_3",
-  "https://www.imdb.com/news/ni58504514?ref_=hm_nw_tp3",
-  "https://www.imdb.com/news/ni58504595?ref_=hm_nw_cel2",
-  "https://www.imdb.com/news/ni58504683?ref_=hm_nw_cel1",
-  "https://www.imdb.com/news/ni58504683?ref_=hm_nw_cel1_i",
-  "https://www.imdb.com/news/ni58504683?ref_=hm_nw_cel1_sm",
-  "https://www.imdb.com/news/ni58504790?ref_=hm_nw_tp5",
-  "https://www.imdb.com/news/ni58504791?ref_=hm_nw_mv1",
-  "https://www.imdb.com/news/ni58504791?ref_=hm_nw_mv1_i",
-  "https://www.imdb.com/news/ni58504791?ref_=hm_nw_mv1_sm",
-  "https://www.imdb.com/news/ni58504848?ref_=hm_nw_mv5",
-  "https://www.imdb.com/news/ni58504852?ref_=hm_nw_tv1",
-  "https://www.imdb.com/news/ni58504852?ref_=hm_nw_tv1_i",
-  "https://www.imdb.com/news/ni58504852?ref_=hm_nw_tv1_sm",
-  "https://www.imdb.com/news/ni58504981?ref_=hm_nw_tp4",
-  "https://www.imdb.com/news/ni58505067/?ref_=nv_nw_tn_1",
-  "https://www.imdb.com/news/ni58505067?ref_=hm_nw_tp1",
-  "https://www.imdb.com/news/ni58505067?ref_=hm_nw_tp1_i",
-  "https://www.imdb.com/news/ni58505067?ref_=hm_nw_tp1_sm",
-  "https://www.imdb.com/news/ni58505271?ref_=hm_nw_tv3",
-  "https://www.imdb.com/news/ni58505642?ref_=hm_nw_tv2",
-  "https://www.imdb.com/news/ni58506924?ref_=hm_nw_tv4",
-  "https://www.imdb.com/news/ni58506925?ref_=hm_nw_tv5",
-  "https://www.imdb.com/news/ni58507004?ref_=hm_nw_cel4",
-  "https://www.imdb.com/news/ni58507021?ref_=hm_nw_cel5",
-  "https://www.imdb.com/news/ns0000001?ref_=hm_nw_tp1_src",
-  "https://www.imdb.com/news/ns0000001?ref_=hm_nw_tp2_src",
-  "https://www.imdb.com/news/ns0000001?ref_=hm_nw_tv1_src",
-  "https://www.imdb.com/news/ns0000088?ref_=hm_nw_cel5_src",
-  "https://www.imdb.com/news/ns0000098?ref_=hm_nw_mv1_src",
-  "https://www.imdb.com/news/ns0000139?ref_=hm_nw_mv5_src",
-  "https://www.imdb.com/news/ns0000141?ref_=hm_nw_cel1_src",
-  "https://www.imdb.com/news/ns0000141?ref_=hm_nw_cel2_src",
-  "https://www.imdb.com/news/ns0000151?ref_=hm_nw_mv3_src",
-  "https://www.imdb.com/news/ns0000151?ref_=hm_nw_mv4_src",
-  "https://www.imdb.com/news/ns0000151?ref_=hm_nw_tp4_src",
-  "https://www.imdb.com/news/ns0000151?ref_=hm_nw_tp5_src",
-  "https://www.imdb.com/news/ns0000173?ref_=hm_nw_tv2_src",
-  "https://www.imdb.com/news/ns0000236?ref_=hm_nw_cel3_src",
-  "https://www.imdb.com/news/ns0000358?ref_=hm_nw_cel4_src",
-  "https://www.imdb.com/news/ns0004912?ref_=hm_nw_mv2_src",
-  "https://www.imdb.com/news/ns0013977?ref_=hm_nw_tv3_src",
-  "https://www.imdb.com/news/ns0052791?ref_=hm_nw_tp3_src",
-  "https://www.imdb.com/news/ns0052792?ref_=hm_nw_tv4_src",
-  "https://www.imdb.com/news/ns0052792?ref_=hm_nw_tv5_src",
-  "https://www.imdb.com/news/top?ref_=hm_nw_sm",
-  "https://www.imdb.com/news/top?ref_=hm_nw_tp_tb",
-  "https://www.imdb.com/news/top?ref_=nv_nw_tp_1",
-  "https://www.imdb.com/news/top?ref_=nv_tp_nw_1",
-  "https://www.imdb.com/news/tv?ref_=hm_nw_sm",
-  "https://www.imdb.com/news/tv?ref_=hm_nw_tv_tb",
-  "https://www.imdb.com/news/tv?ref_=nv_nw_tv_3",
-  "https://www.imdb.com/offsite/?page-action=ft-aiv&token=BCYnS4pbDbSJ_Z3uM-U4enQKsyVpEdAF0brwgB0pn8a7o_ru9zV92gIaPfWQhKzkurQ1dajYyA6p%0D%0A2uaqx8CYri8gn68-dOpOSytBo9ZWpuJTFQCw25YB32EzwiT6g4skhifvPSOllxzmnxHvoleFyOpd%0D%0AIpFLWFChtvt3Fiaw6tynNyA6wYbiu3Py3Rnu0xzfd1pBc2kGHsIv7pMdiOzWaAII-88UgyHFfo04%0D%0AbhwvsVW2ZE0%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-amzn-aud&token=BCYslYPVtgdBjNCAXnFH31o4XJ-U1p2Tm3QbdVdbsV-3eI0E3kTM1p8RUOPAT1CvKZgA1qdlbf6Q%0D%0AAmJLsgt0NfMb6VxcLJHkW5zgMj7Uww0ZP_-5vlA0DLzPjKx2klilqhyOoUfhWQ44pnz1bUDEc9j0%0D%0AkHAVo0YZrFGxZ6HN4y5HnUYHSP-VbE3wM_1QdPAzyG2f%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-amzn-de&token=BCYnvtJRxiJ-WjA0r0keBo8q9a9BGGN3xCEi7magPzgJ0b1sUXOoTcI4Ph5SWjRaTrXAOz03Rwmz%0D%0Avj_ILFubJJAiFE3ampmW7zFlCTWXF_BbvcyAhDMt1T8K03bMfw02jO5uPIx1YYEQMtYBj8y4SkAc%0D%0AC9dL3pMYoDYcz49wSceXILvGcX8WKcNIb5fzbowp741bl9VjYjUAypM88tM5iE7UzSFAM_yJqhxV%0D%0Aevvdgxz_k_U%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-amzn-dpr&token=BCYl6nwtyOMPyNnfeK71cDJgbjB4w77n3WxtaCboXjhpmHDRhgR-kuolQPAElqkOe0oYcGrE0ijm%0D%0ANGOq46qBkGWqhE5u0SsOgZkJTNAI6T2Z1jjl_XzCAMGPlHRwtEiiiwLjHuTMVJ7Jw5U0RV0HMXdC%0D%0AWo75bc1FBUH9RommUqrO5OYA9rd-qWDbqLZQ929BmcUD%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-amzn-fr&token=BCYlh9XCR5KIpnSe1ExgbvvaF_91vXecwZ9XZf6HoNGmZum2qugPaGgJGWm5Mu7P_fLFEIautVSK%0D%0ArMd3qe50UYqpOTTY8Efwic4g31sEIFMWa_A0mPc5EOW9hFN5bmq3wK1XmxPf8q71Sp_llP_918mo%0D%0AWkEB_4UlIZ1Qtx6Uilg_iz1JTM755pZa0F3OP7cYZTrc4AIFl3SKKKuCvtAaI54G6X_8xYQ0C1x_%0D%0Ar_zq3P2YC1M%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-amzn-in&token=BCYu_ApKeCqzDQagRzBRDV9VIa0aWqHwgltHX9yzp4iuso5FmMuUWRRKFZAQynsko8eUcEhdFuUy%0D%0AUFSB3QIV91LLKDFsVKaSYQ6Eltqnz75JthrcxQHVV07kFb_iQOxl2fg9RxMUstgXEmnKkHc0JWXA%0D%0A50sqcKt_UvCz_sr0xGMFaVeEEbxle0OaklLcLSmbnlc0DgsYzFn2Q59Hm9Rwj6iyUCnsoG9c3AfB%0D%0AXsZQiwNcsgc1v7vdhtgKhEq0-U2MoeXh%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-amzn-it&token=BCYsOfV7DyzBMAgSWcIxpm2XDPDd_dvF0oh3S18UVaPo3DV2xozRTrmLRviFNoN6pTJ2l2tRyvKa%0D%0AkYbx2Iie21FMHJTHBgdwbMhuUBUaerqGKwZPqkNCjTDWvLdiw5OOeVVWP7o_S3eUEHrwukUjHqD2%0D%0AyV_OtTsN5AUfqhVRHSYWHKt6JdQEj2YogFbFSBnWiIE4C1moNuaujXaGYnQwj8nlfXtaPkVRYlk7%0D%0AYcMbpXsghGU%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-fb&token=BCYgb2kuzPH8coLcEkz_x2XQz0fcMGN2KkTgbo7SgOgTi1RbKGg8HdH9P0VBIfphm2yUmWylrT3j%0D%0AhCcRvJPjvj_yLh7dDST3ErQgXSm7RzudClLBhH9T4uAHe4gRAMVH6ogTXloNmiBVSnvEnyZLTU6X%0D%0A_3iFfDUQO3XGMaR5clNKDFwauCxG1bLXyF1j5g0HbBfK%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-iba&token=BCYsTA_15a8K1N2bBz7F1dk4gzQb1uBT733WUnh3-b3el7JJchRGuN1hrLpQGxrPVre5YLoqzcB8%0D%0Amp47gBTf1stfZ17abfDHX2NKO0zKrYuiv0bTA6yZbPBNF3y2eYY9XY-UAOKX4F2gDsECCYPn6N0-%0D%0ANKLEBF6UilKr3VxnBtl16ZYDar6vHkh8jIdRLA8j8hnl%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-mojo&token=BCYp3Egvw7PXYeiN8Hv_YGLkY_xiYFYaikvqYdvvfFaA9nnRdzWDgz5Fc-Oy-wg15puIiE2xlJ_l%0D%0AZjMnyG97F2gaBEQ2YnZ5wr73qL_5XukJqWSgBCnihT5E2HMacTvt06Ul58rmFTJgyOhuzy-Hxotk%0D%0A3rHisWOoVEiIc0pPs7I7D4uch1Iljwjbali1RndBjs5w%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-piv&token=BCYux-hLrLj7UzVf4eEGkZzlx1VkmmmiCC8nRg0EMLKasHnLXk-rAoUlFazw4NW10eesUTBjVNYi%0D%0AV4zzmJkFRslFKm0XrUJWYJx6DcbknNuJElX8PutPRhOWTvgmcIP9pXBNm3pCVIBFeqHTMX0lNWI2%0D%0A-l7Od-sso2xdX8TLolrjP_ahUrbQcaaxm25t4IJSX0Du_NccbrqrrmaOEml2Ape1WN2pRR8dQeQI%0D%0Ai8p1KE5e22o%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-twt&token=BCYrqpPSe0gj2RDl6NbeQmf8SX2apiS6bB2bhxusZGt_TYs3q1m0sGu0E5PMDLiQjPePGC3ApM7o%0D%0AtAObl04Bxhn6_0LbdiGh3B0CHyTtBmkDfvsucBDUQRSIdfhHWoFZ7ybwcDIEfkJPY9rtegfS4CzH%0D%0AOANqxwd-EDQVY8dFn_xIjg0%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft-wab&token=BCYqPAFnJLQWMA58a5RS3U44O0zVhjBkVUIzrMkBefnvaiaO4oJkq4jT59Jqgpy7lcQcd8hqj-xj%0D%0Aa_aH5wNI2ChH3qWnfojo2XiGjTDJf-FSKPy1RQkT8ALfPlf3ZmVekdiCdFZtwUZyoB8G-3qBZEnN%0D%0Ag-nZEiEWmCnK5kZvnWvPsjJzKnS4ieboY9wGus_7sdkx%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=ft_ad&token=BCYmWEiQlooMv8N_zbAY3FWobPb54arUcug0QGhGFtYV91b9Nm2TKuvLS7vFr9QezSAY0DJ3x1ow%0D%0AJGsEN5ZZ3wliIT20ZJ5pQGq_VJE0XWEyMiXO1SPG_c04bpEqpUtFo_Lt3DQoJ8r9v_2L62Khqc-4%0D%0Aw2WKCvLnC1JXxVxe3G70_CykmDEhHBl9LY9DS7MIDgtQkZinVDEzSSz7a2OgFq0FwaqaY09ptpYW%0D%0A-b6SFAgVK2Aq3yPVqbMzdFUdjR6yBHn9%0D%0A",
-  "https://www.imdb.com/offsite/?page-action=offsite-amazon&token=BCYouCi7ir9DKNdmwjpk3jL2B9kCnuatXGbFsBfgUAx7rE95D4tG0Y6_ww5tNvjWC9NeDKSXKUvY%0D%0AmfLVrhmWPJ3pGyOH2Bqe8rpt1_Q7vXP-tOP2s0u5DAS811ggUW3MI9cRl3av1PbP0ZQokShaGl22%0D%0Anw1vS7uzmzBTZNZxTG3xI7f6yHIvNx2WT-6zdTtBt-6tXKeraWZQxNchpHQBDSCQCvNVBhXylKWQ%0D%0AFZcoGqvh0KporJOWVeRqLHCXuxf61vmLT-yTiOuzDnCPyWGK5k9vNg%0D%0A&ref_=hm_aiv_i_2",
-  "https://www.imdb.com/offsite/?page-action=offsite-amazon&token=BCYsqURNXyyiZQ3VQ3Xh5qQ4zEsp0i66qhm6p4szalkw0rZLi6ODuqnsPUYvhTXuM_zrQ75-nQDx%0D%0A-j7a0bXtY_Hbx7hDF-Mq_z8DEdJGRnGOdBe46G5vzGC7HMczyl3eRsElQj0JrE1t5S3YWUqXIPGK%0D%0ARyNpQ4eVJxd59kvTx0CH3b6qcBtYBN8WyA_bJ8OLBH9eQQK8aTAjrHSyFMgyPBSt6hAekyO-j7Yz%0D%0ATrevobv3JhX24RCN209hPYyUlQvuYilg2W91MHNPaettGzUbYbUstw%0D%0A&ref_=hm_aiv_i_3",
-  "https://www.imdb.com/offsite/?page-action=offsite-amazon&token=BCYvDo9qpkcamcnzHqUKZ42sSfpllJFeuuUzSkmFa9m5ggMk-jxdSDLks0qRCRJuq90zeTHnAtcX%0D%0AYPKGdTuXCHqJqLy5RScbWm4zcuLlou-gVGClYn0Q0ZpaY7LVY_zLTLpXakTyLgrE50Ju7d3FU3fp%0D%0AAlMNZYmqOWN2Kp5I0er5r-24YgNGXviMS9bCaBHR-_C914-y9DYo2bmmLo2o8VMzyHDqOXMWPezU%0D%0A-BFqqmhf825U08mkKDNwLlMIz8MBo2pls8hdRNRveH61QV0o7_dukA%0D%0A&ref_=hm_aiv_i_1",
-  "https://www.imdb.com/offsite/?page-action=watch-aiv&token=BCYhWzeSjyrDVhwNX7Uxe81g5ku054A5_8FizYe-RhD5Sl2rt9vz3i-Duku52pRwR4wgdkVs3Hqu%0D%0ApARap21ysYAZhl7QvqdQ3dz91dfGTtLFsjR-tcdOeefPApbvJIMdaCS9lQUoDgMwpz4G3IVYS5XZ%0D%0AaGebvCeOcMlmxIamRurAMhdIPElM6r_qHmEgkM6BGDbZwNgaf9Rjn7TwTdH97IEg1-nm-ZWvR0VE%0D%0A_l0xiOnWqW37DaxGQwBHaojf_7SKOZwB%0D%0A&ref_=hm_cs_aiv_1",
-  "https://www.imdb.com/poll/?ref_=nv_cm_pl_4",
-  "https://www.imdb.com/poll/mXFsH63S28Y/?ref_=hm_poll_hd",
-  "https://www.imdb.com/poll/mXFsH63S28Y/?ref_=hm_poll_i_1",
-  "https://www.imdb.com/poll/mXFsH63S28Y/?ref_=hm_poll_i_2",
-  "https://www.imdb.com/poll/mXFsH63S28Y/?ref_=hm_poll_sm",
-  "https://www.imdb.com/pressroom/?ref_=ft_pr",
-  "https://www.imdb.com/privacy?ref_=ft_pvc",
-  "https://www.imdb.com/register/login?ref_=nv_usr_lgin_1",
-  "https://www.imdb.com/register/login?ref_=nv_usr_lgin_3",
-  "https://www.imdb.com/search/",
-  "https://www.imdb.com/search/name?birth_monthday=04-15&refine=birth_monthday&ref_=nv_cel_brn_1",
-  "https://www.imdb.com/search/name?gender=male,female&ref_=nv_cel_m_3",
-  "https://www.imdb.com/search/name?gender=male,female&ref_=nv_tp_cel_1",
-  "https://www.imdb.com/search/name?refine=birth_monthday&birth_monthday=4-14&ref_=hm_brn_hd",
-  "https://www.imdb.com/search/name?refine=birth_monthday&birth_monthday=4-14&ref_=hm_brn_sm",
-  "https://www.imdb.com/search/title?count=100&groups=oscar_best_picture_winners&sort=year,desc&ref_=nv_ch_osc_3",
-  "https://www.imdb.com/search/title?count=100&title_type=feature,tv_series,tv_movie&explore=title_type,genres,year,countries&ref_=nv_ch_mm_1",
-  "https://www.imdb.com/search?ref_=ft_sr",
-  "https://www.imdb.com/sections/dvd/?ref_=nv_tvv_dvd_4",
-  "https://www.imdb.com/sections/tv/?ref_=ft_tv",
-  "https://www.imdb.com/showtimes/?ref_=nv_mv_sh_2",
-  "https://www.imdb.com/showtimes/?ref_=nv_tp_sh_3",
-  "https://www.imdb.com/showtimes/title/tt1014763/2015-04-16?ref_=hm_otw_gt",
-  "https://www.imdb.com/showtimes/title/tt1655441?ref_=hm_cs_gt",
-  "https://www.imdb.com/showtimes/title/tt1661199?ref_=hm_cht_gt",
-  "https://www.imdb.com/showtimes/title/tt1810683/2015-04-23?ref_=hm_cs_gt",
-  "https://www.imdb.com/showtimes/title/tt2224026?ref_=hm_cht_gt",
-  "https://www.imdb.com/showtimes/title/tt2273657/2015-04-16?ref_=hm_otw_gt",
-  "https://www.imdb.com/showtimes/title/tt2561572?ref_=hm_cht_gt",
-  "https://www.imdb.com/showtimes/title/tt2726560?ref_=hm_cht_gt",
-  "https://www.imdb.com/showtimes/title/tt2820852?ref_=hm_cht_gt",
-  "https://www.imdb.com/showtimes/title/tt3450650/2015-04-16?ref_=hm_otw_gt",
-  "https://www.imdb.com/showtimes/title/tt3660770/2015-04-16?ref_=hm_otw_gt",
-  "https://www.imdb.com/showtimes/title/tt3713166/2015-04-16?ref_=hm_otw_gt",
-  "https://www.imdb.com/showtimes?ref_=hm_sh_lk1",
-  "https://www.imdb.com/sundance/?ref_=nv_ev_sun_2",
-  "https://www.imdb.com/sxsw/?ref_=nv_ev_sxsw_3",
-  "https://www.imdb.com/title/tt0478970?ref_=hm_hp_cap_pri_2",
-  "https://www.imdb.com/title/tt0478970?ref_=hm_hp_i_2",
-  "https://www.imdb.com/title/tt0804503?ref_=hm_nw_tp1_lk3",
-  "https://www.imdb.com/title/tt0944947?ref_=hm_nw_tv1_lk1",
-  "https://www.imdb.com/title/tt1014763?ref_=hm_otw_t2",
-  "https://www.imdb.com/title/tt1340138?ref_=hm_hp_cap_pri_3",
-  "https://www.imdb.com/title/tt1340138?ref_=hm_hp_i_3",
-  "https://www.imdb.com/title/tt1489428?ref_=hm_ontv_t3",
-  "https://www.imdb.com/title/tt1655441?ref_=hm_cs_t0",
-  "https://www.imdb.com/title/tt1661199?ref_=hm_cht_t4",
-  "https://www.imdb.com/title/tt1810683?ref_=hm_cs_t1",
-  "https://www.imdb.com/title/tt1839578?ref_=hm_ontv_t4",
-  "https://www.imdb.com/title/tt1935302?ref_=hm_otw_t8",
-  "https://www.imdb.com/title/tt2224026?ref_=hm_cht_t1",
-  "https://www.imdb.com/title/tt2273657?ref_=hm_otw_t4",
-  "https://www.imdb.com/title/tt2364582?ref_=hm_ontv_t1",
-  "https://www.imdb.com/title/tt2395427/trivia?item=tr2442275&ref_=hm_trv_hd",
-  "https://www.imdb.com/title/tt2395427/trivia?item=tr2442275&ref_=hm_trv_sm",
-  "https://www.imdb.com/title/tt2395427?ref_=hm_trv_i_1",
-  "https://www.imdb.com/title/tt2395427?ref_=hm_trv_lk1",
-  "https://www.imdb.com/title/tt2561572?ref_=hm_cht_t3",
-  "https://www.imdb.com/title/tt2726560?ref_=hm_cht_t2",
-  "https://www.imdb.com/title/tt2820852?ref_=hm_cht_t0",
-  "https://www.imdb.com/title/tt2911668?ref_=hm_otw_t6",
-  "https://www.imdb.com/title/tt2977090?ref_=hm_otw_t5",
-  "https://www.imdb.com/title/tt3007512?ref_=hm_cs_t3",
-  "https://www.imdb.com/title/tt3107288?ref_=hm_ontv_t0",
-  "https://www.imdb.com/title/tt3107288?ref_=hm_ontv_t0_cap",
-  "https://www.imdb.com/title/tt3107288?ref_=hm_ontv_t0_i",
-  "https://www.imdb.com/title/tt3132632?ref_=hm_cs_t2",
-  "https://www.imdb.com/title/tt3318750?ref_=hm_cs_t4",
-  "https://www.imdb.com/title/tt3399916?ref_=hm_otw_t9",
-  "https://www.imdb.com/title/tt3450650?ref_=hm_otw_t0",
-  "https://www.imdb.com/title/tt3501584?ref_=hm_ontv_t2",
-  "https://www.imdb.com/title/tt3660770?ref_=hm_otw_t3",
-  "https://www.imdb.com/title/tt3685218?ref_=hm_otw_t7",
-  "https://www.imdb.com/title/tt3713166?ref_=hm_otw_t1",
-  "https://www.imdb.com/title/tt4120544/synopsis?ref_=hm_tvr_cap_pri_2",
-  "https://www.imdb.com/title/tt4120544/synopsis?ref_=hm_tvr_i_2",
-  "https://www.imdb.com/title/tt4120730/?ref_=hm_hm_tvpks_cap_pri_2",
-  "https://www.imdb.com/title/tt4138352/?ref_=hm_hm_tvpks_cap_pri_1",
-  "https://www.imdb.com/title/tt4217814/?ref_=hm_hm_tvpks_cap_pri_3",
-  "https://www.imdb.com/title/tt4260872/synopsis?ref_=hm_tvr_cap_pri_3",
-  "https://www.imdb.com/title/tt4260872/synopsis?ref_=hm_tvr_i_3",
-  "https://www.imdb.com/title/tt4294382/synopsis?ref_=hm_tvr_cap_pri_1",
-  "https://www.imdb.com/toronto/?ref_=nv_ev_tff_9",
-  "https://www.imdb.com/trailers/?ref_=nv_mv_tr_3",
-  "https://www.imdb.com/trailers?ref_=hm_hp_sm",
-  "https://www.imdb.com/tribeca/?ref_=nv_ev_tri_4",
-  "https://www.imdb.com/tv/?ref_=nv_tp_tvhm_2",
-  "https://www.imdb.com/tv/?ref_=nv_tvv_hm_1",
-  "https://www.imdb.com/tv/blog?ref_=nv_tvv_blog_5",
-  "https://www.imdb.com/tvgrid/?ref_=hm_ontv_sm",
-  "https://www.imdb.com/tvgrid/?ref_=nv_tvv_ls_2",
-  "https://www.imdb.com/venice/?ref_=nv_ev_venice_8",
-  "https://www.imdb.com/watchnow/?ref_=nv_tvv_wn_3",
-  "https://www.imdb.com/whattowatch/?ref_=hm_hp_i_1",
-  "https://www.imdb.com/whattowatch/?ref_=nv_sf_wtw_5",
-  "https://www.imdb.com/x-ray/?ref_=nv_sf_xray_4",
-  "https://www.mediawiki.org/",
-  "https://www.mozilla.org/firefox/new/?utm_source=yahoo&utm_medium=referral&utm_content=uh&utm_campaign=y-upgrade-new-firefox",
-  "https://www.onenote.com/notebooks?WT.mc_id=O16_BingHP",
-  "https://www.stackoverflow.com",
-  "https://www.stackoverflow.com/",
-  "https://www.stackoverflow.com/contact",
-  "https://www.stackoverflow.com/feeds",
-  "https://www.stackoverflow.com/help",
-  "https://www.stackoverflow.com/help/badges",
-  "https://www.stackoverflow.com/questions",
-  "https://www.stackoverflow.com/questions/1160516/javascript-code-to-capture-networks-served-ad",
-  "https://www.stackoverflow.com/questions/1160516/javascript-code-to-capture-networks-served-ad/?lastactivity",
-  "https://www.stackoverflow.com/questions/11835894/tidy-css-for-notepad",
-  "https://www.stackoverflow.com/questions/11835894/tidy-css-for-notepad/?lastactivity",
-  "https://www.stackoverflow.com/questions/15386861/user-permissions-in-microsoft-access-2010",
-  "https://www.stackoverflow.com/questions/15386861/user-permissions-in-microsoft-access-2010/?lastactivity",
-  "https://www.stackoverflow.com/questions/29104784/how-to-import-dropbox-chooser-sdk-in-android-studio",
-  "https://www.stackoverflow.com/questions/29104784/how-to-import-dropbox-chooser-sdk-in-android-studio/?lastactivity",
-  "https://www.stackoverflow.com/questions/29548687/how-do-i-automatically-add-threads-to-a-pool-based-on-the-computational-needs-of",
-  "https://www.stackoverflow.com/questions/29548687/how-do-i-automatically-add-threads-to-a-pool-based-on-the-computational-needs-of/?lastactivity",
-  "https://www.stackoverflow.com/questions/29611139/steps-to-get-signalr-working-in-android-studio",
-  "https://www.stackoverflow.com/questions/29611139/steps-to-get-signalr-working-in-android-studio/?lastactivity",
-  "https://www.stackoverflow.com/questions/29633263/rails-4-devise-with-after-sign-in-path-forresource-always-redirect-to-show-ac",
-  "https://www.stackoverflow.com/questions/29636099/php-iconv-special-character-conversion",
-  "https://www.stackoverflow.com/questions/29637382/maxdoubleslicesum-algorithm",
-  "https://www.stackoverflow.com/questions/29637516/projecting-domain-model-child-count-onto-view-model-without-extra-queries",
-  "https://www.stackoverflow.com/questions/29637516/projecting-domain-model-child-count-onto-view-model-without-extra-queries/?lastactivity",
-  "https://www.stackoverflow.com/questions/29637985/how-to-rename-a-bucket-in-couchbase",
-  "https://www.stackoverflow.com/questions/29637985/how-to-rename-a-bucket-in-couchbase/?lastactivity",
-  "https://www.stackoverflow.com/questions/29638020/transposing-items-with-prices-to-separate-section",
-  "https://www.stackoverflow.com/questions/29638020/transposing-items-with-prices-to-separate-section/?lastactivity",
-  "https://www.stackoverflow.com/questions/29638035/java-try-block-code-does-not-execute",
-  "https://www.stackoverflow.com/questions/29638035/java-try-block-code-does-not-execute/?lastactivity",
-  "https://www.stackoverflow.com/questions/29638148/prevent-scrolling-when-mouse-enters-wpf-combobox-dropdown",
-  "https://www.stackoverflow.com/questions/29638177/tyconpackage-changed-from-ghc-7-8-to-ghc-7-10",
-  "https://www.stackoverflow.com/questions/29638263/avoiding-excels-scientific-notation-rounding-when-parsing-with-pandas",
-  "https://www.stackoverflow.com/questions/29638454/c-sharp-linq-to-sql-query-not-returning-results-but-generated-sql-works-fine",
-  "https://www.stackoverflow.com/questions/29638454/c-sharp-linq-to-sql-query-not-returning-results-but-generated-sql-works-fine/?lastactivity",
-  "https://www.stackoverflow.com/questions/29638503/what-is-wrong-with-this-laravel-5-response",
-  "https://www.stackoverflow.com/questions/29638547/slow-animation-pushpage",
-  "https://www.stackoverflow.com/questions/29638838/how-do-we-store-a-pfx-file-in-certstore-which-is-protected-using-password-retri",
-  "https://www.stackoverflow.com/questions/29638924/one-of-files-in-my-project-is-not-treated-as-python-code-file-by-pycharm",
-  "https://www.stackoverflow.com/questions/29638997/send-email-with-material-from-tableview-or-nsmutabledictionary",
-  "https://www.stackoverflow.com/questions/29639015/scipy-periodogram-for-finite-length-signal",
-  "https://www.stackoverflow.com/questions/29639038/deploy-to-ec2-with-rubber",
-  "https://www.stackoverflow.com/questions/29639078/maven-no-longer-adding-dependencies-in-eclipse",
-  "https://www.stackoverflow.com/questions/29639093/why-does-r-store-the-loop-variable-index-dummy-in-memory",
-  "https://www.stackoverflow.com/questions/29639098/nstextattachment-cut-off-when-appended-to-nsmutableattributedstring",
-  "https://www.stackoverflow.com/questions/29639100/implementing-dynamic-radiobuttons-in-java-gui",
-  "https://www.stackoverflow.com/questions/29639102/uninitialized-constant-anioturnoscontroller-routing-error",
-  "https://www.stackoverflow.com/questions/29639117/why-arent-my-values-being-input-into-my-database-php-mysql-html",
-  "https://www.stackoverflow.com/questions/29639117/why-arent-my-values-being-input-into-my-database-php-mysql-html/?lastactivity",
-  "https://www.stackoverflow.com/questions/29639119/nsmenuitem-key-equivalent-set-to-enter-key-from-number-pad",
-  "https://www.stackoverflow.com/questions/29639150/complex-0-1-backpack-with-multiple-compartments",
-  "https://www.stackoverflow.com/questions/29639152/how-to-find-out-if-winjs-promise-was-cancelled-by-timeout-or-cancel-call",
-  "https://www.stackoverflow.com/questions/29639158/programmatically-determine-number-of-cores-and-amount-of-memory-available-to-spa",
-  "https://www.stackoverflow.com/questions/29639166/netbeans-struts-config-xml-action-configuration",
-  "https://www.stackoverflow.com/questions/29639169/xml-schema-element-is-not-declared",
-  "https://www.stackoverflow.com/questions/29639173/urlrewritefilter-behaving-differently-with-the-order-of-rule-with-http-post",
-  "https://www.stackoverflow.com/questions/29639190/window-title-is-overwritten-when-using-caliburns-conductorobject-in-view-mode",
-  "https://www.stackoverflow.com/questions/29639198/django-imagekit-not-uploading-images",
-  "https://www.stackoverflow.com/questions/29639202/matlab-save-a-class-property",
-  "https://www.stackoverflow.com/questions/29639204/generating-at-runtime-autogenerate-spring-mvc-controllers-services-etc",
-  "https://www.stackoverflow.com/questions/29639205/unable-to-execute-pig-scripts-using-azure-powershell",
-  "https://www.stackoverflow.com/questions/29639208/hive-tables-not-visible-when-connecting-via-odbc",
-  "https://www.stackoverflow.com/questions/29639210/custom-size-for-modal-view-controller-swift",
-  "https://www.stackoverflow.com/questions/29639223/custom-file-owner-of-a-nib-file-leaks-in-os-x-swift",
-  "https://www.stackoverflow.com/questions/29639230/google-dataflow-failure",
-  "https://www.stackoverflow.com/questions/29639236/vsc-create-a-class-and-run-functions-from-dll-without-the-h",
-  "https://www.stackoverflow.com/questions/29639240/regex-for-searching-or-gripping-complex-passwords-in-code-repos",
-  "https://www.stackoverflow.com/questions/29639253/how-do-i-make-a-proper-post-to-symfony-requestmethod",
-  "https://www.stackoverflow.com/questions/29639272/running-android-emulator-on-travis-ci-without-no-window-option",
-  "https://www.stackoverflow.com/questions/29639276/pydev-tab-alignment-in-inline-comments",
-  "https://www.stackoverflow.com/questions/29639277/reading-smallint-and-timestamp-field-using-serde2",
-  "https://www.stackoverflow.com/questions/29639280/multiple-page-native-flow-using-wl-nativepage-show",
-  "https://www.stackoverflow.com/questions/29639283/how-to-fork-actions-in-oozie",
-  "https://www.stackoverflow.com/questions/29639284/expected-before-token-c",
-  "https://www.stackoverflow.com/questions/29639284/expected-before-token-c/?lastactivity",
-  "https://www.stackoverflow.com/questions/29639285/merging-with-pdftk-output-path",
-  "https://www.stackoverflow.com/questions/29639286/google-map-geocoding-with-form-submit",
-  "https://www.stackoverflow.com/questions/29639295/how-to-combine-header-and-footer-in-collection-view-in-swift",
-  "https://www.stackoverflow.com/questions/29639297/docker-container-time-timezone-will-not-reflect-changes",
-  "https://www.stackoverflow.com/questions/29639301/vba-dom-variable-attribute-in-xpath",
-  "https://www.stackoverflow.com/questions/29639305/opengl-why-is-my-framebuffer-not-work-if-my-fragment-code-is-in-a-function",
-  "https://www.stackoverflow.com/questions/29639306/cloud-code-vs-express",
-  "https://www.stackoverflow.com/questions/29639316/display-variable-content-not-varialbe-namein-ruby-on-rails",
-  "https://www.stackoverflow.com/questions/29639318/how-to-add-more-than-one-panel-in-a-single-panel",
-  "https://www.stackoverflow.com/questions/29639331/how-to-use-graphics2d-g-scale-on-only-some-things-but-not-others",
-  "https://www.stackoverflow.com/questions/29639340/can-you-run-javascript-as-a-dynamic-language-in-visual-studio-2013",
-  "https://www.stackoverflow.com/questions/29639345/angular-ui-grid-add-value-of-selected-cell-to-model",
-  "https://www.stackoverflow.com/questions/29639350/aurelia-one-way-binding-to-a-checkbox",
-  "https://www.stackoverflow.com/questions/29639352/fading-between-svg-sprite-background-position-using-background-check-js",
-  "https://www.stackoverflow.com/questions/29639360/using-autofac-and-moqs-with-delegate-factories",
-  "https://www.stackoverflow.com/questions/29639362/aweber-integration-with-rails-error-oauthunauthorized",
-  "https://www.stackoverflow.com/questions/29639373/mips-32-floating-point-addition-computation",
-  "https://www.stackoverflow.com/questions/29639375/how-can-i-remove-an-object-from-an-array",
-  "https://www.stackoverflow.com/questions/29639377/vb-net-datagridview-update-insert-sql-views",
-  "https://www.stackoverflow.com/questions/29639378/know-if-device-is-connected-to-a-network",
-  "https://www.stackoverflow.com/questions/29639380/ntlm-authentication-with-jersey-rest-service-keeps-logging-warning-how-stop",
-  "https://www.stackoverflow.com/questions/29639381/php-timestamps-timezone-configuration",
-  "https://www.stackoverflow.com/questions/29639384/c-weird-folder-locking-for-child-process",
-  "https://www.stackoverflow.com/questions/29639393/returning-html-from-asp-net-mvc-extension-function",
-  "https://www.stackoverflow.com/questions/29639394/how-to-create-a-new-customer-via-code",
-  "https://www.stackoverflow.com/questions/29639396/sequence-contains-no-matching-element-error-using-boolean",
-  "https://www.stackoverflow.com/questions/29639401/lisp-compiler-design-for-embedded-systems",
-  "https://www.stackoverflow.com/questions/29639404/a-405-error-when-using-spring-data-rest-restcontroller-at-the-same-time",
-  "https://www.stackoverflow.com/questions/29639405/continuous-integration-with-gerrit-and-xcode-server",
-  "https://www.stackoverflow.com/questions/29639410/how-to-use-pygments-in-pelican-with-markdown",
-  "https://www.stackoverflow.com/questions/29639413/sign-xml-using-pure-javascript-in-the-browser",
-  "https://www.stackoverflow.com/questions/29639416/make-tabs-stick-to-top-of-div",
-  "https://www.stackoverflow.com/questions/29639420/database-not-being-filled-quick-enough-to-be-used-with-cursorloader-on-app-launc",
-  "https://www.stackoverflow.com/questions/29639423/pinning-results-of-ivy-resolution",
-  "https://www.stackoverflow.com/questions/29639424/propagation-requires-new-seems-to-not-work",
-  "https://www.stackoverflow.com/questions/29639426/using-your-nsurlresponsewebviewhack",
-  "https://www.stackoverflow.com/questions/29639427/openam-unable-to-get-application-sso-token",
-  "https://www.stackoverflow.com/questions/29639430/monitoring-docker-container-performance-using-cadvisor-cgroup-best-approach",
-  "https://www.stackoverflow.com/questions/29639431/rest-spring-http-post-request-no-working",
-  "https://www.stackoverflow.com/questions/7385228/serial-port-rs232-communication-with-visual-c-2010",
-  "https://www.stackoverflow.com/questions/7385228/serial-port-rs232-communication-with-visual-c-2010/?lastactivity",
-  "https://www.stackoverflow.com/questions/822841/android-recent-apps-seem-to-have-google-provided-ads-is-there-some-new-api-for",
-  "https://www.stackoverflow.com/questions/822841/android-recent-apps-seem-to-have-google-provided-ads-is-there-some-new-api-for/?lastactivity",
-  "https://www.stackoverflow.com/questions/ask",
-  "https://www.stackoverflow.com/questions/tagged/acumatica",
-  "https://www.stackoverflow.com/questions/tagged/algorithm",
-  "https://www.stackoverflow.com/questions/tagged/amazon-ec2",
-  "https://www.stackoverflow.com/questions/tagged/android",
-  "https://www.stackoverflow.com/questions/tagged/android-studio",
-  "https://www.stackoverflow.com/questions/tagged/angular-ui-grid",
-  "https://www.stackoverflow.com/questions/tagged/angularjs",
-  "https://www.stackoverflow.com/questions/tagged/apache-pig",
-  "https://www.stackoverflow.com/questions/tagged/apache-spark",
-  "https://www.stackoverflow.com/questions/tagged/api",
-  "https://www.stackoverflow.com/questions/tagged/applet",
-  "https://www.stackoverflow.com/questions/tagged/asp.net-mvc",
-  "https://www.stackoverflow.com/questions/tagged/assembly",
-  "https://www.stackoverflow.com/questions/tagged/aurelia",
-  "https://www.stackoverflow.com/questions/tagged/autofac",
-  "https://www.stackoverflow.com/questions/tagged/aweber",
-  "https://www.stackoverflow.com/questions/tagged/azure",
-  "https://www.stackoverflow.com/questions/tagged/c",
-  "https://www.stackoverflow.com/questions/tagged/c%23",
-  "https://www.stackoverflow.com/questions/tagged/c%23-4.0",
-  "https://www.stackoverflow.com/questions/tagged/c%2b%2b",
-  "https://www.stackoverflow.com/questions/tagged/caching",
-  "https://www.stackoverflow.com/questions/tagged/caliburn",
-  "https://www.stackoverflow.com/questions/tagged/certificate",
-  "https://www.stackoverflow.com/questions/tagged/cgroups",
-  "https://www.stackoverflow.com/questions/tagged/cloud-code",
-  "https://www.stackoverflow.com/questions/tagged/collectd",
-  "https://www.stackoverflow.com/questions/tagged/combobox",
-  "https://www.stackoverflow.com/questions/tagged/compiler-construction",
-  "https://www.stackoverflow.com/questions/tagged/containers",
-  "https://www.stackoverflow.com/questions/tagged/cordova",
-  "https://www.stackoverflow.com/questions/tagged/couchbase",
-  "https://www.stackoverflow.com/questions/tagged/css",
-  "https://www.stackoverflow.com/questions/tagged/csstidy",
-  "https://www.stackoverflow.com/questions/tagged/data-binding",
-  "https://www.stackoverflow.com/questions/tagged/data-transfer",
-  "https://www.stackoverflow.com/questions/tagged/datagridview",
-  "https://www.stackoverflow.com/questions/tagged/date",
-  "https://www.stackoverflow.com/questions/tagged/datetime",
-  "https://www.stackoverflow.com/questions/tagged/delegate-factories",
-  "https://www.stackoverflow.com/questions/tagged/dependency-management",
-  "https://www.stackoverflow.com/questions/tagged/devise",
-  "https://www.stackoverflow.com/questions/tagged/digital-signature",
-  "https://www.stackoverflow.com/questions/tagged/django",
-  "https://www.stackoverflow.com/questions/tagged/django-imagekit",
-  "https://www.stackoverflow.com/questions/tagged/django-models",
-  "https://www.stackoverflow.com/questions/tagged/dll",
-  "https://www.stackoverflow.com/questions/tagged/docker",
-  "https://www.stackoverflow.com/questions/tagged/dom",
-  "https://www.stackoverflow.com/questions/tagged/dropbox",
-  "https://www.stackoverflow.com/questions/tagged/dropbox-api",
-  "https://www.stackoverflow.com/questions/tagged/dynamic",
-  "https://www.stackoverflow.com/questions/tagged/eclipse",
-  "https://www.stackoverflow.com/questions/tagged/embedded",
-  "https://www.stackoverflow.com/questions/tagged/emulator",
-  "https://www.stackoverflow.com/questions/tagged/entity-framework",
-  "https://www.stackoverflow.com/questions/tagged/exception-handling",
-  "https://www.stackoverflow.com/questions/tagged/express",
-  "https://www.stackoverflow.com/questions/tagged/firefox",
-  "https://www.stackoverflow.com/questions/tagged/floating-point",
-  "https://www.stackoverflow.com/questions/tagged/for-loop",
-  "https://www.stackoverflow.com/questions/tagged/form-submit",
-  "https://www.stackoverflow.com/questions/tagged/forms",
-  "https://www.stackoverflow.com/questions/tagged/fragment-shader",
-  "https://www.stackoverflow.com/questions/tagged/geocode",
-  "https://www.stackoverflow.com/questions/tagged/gerrit",
-  "https://www.stackoverflow.com/questions/tagged/ghc",
-  "https://www.stackoverflow.com/questions/tagged/google-cloud-dataflow",
-  "https://www.stackoverflow.com/questions/tagged/google-maps",
-  "https://www.stackoverflow.com/questions/tagged/google-spreadsheet",
-  "https://www.stackoverflow.com/questions/tagged/grafana",
-  "https://www.stackoverflow.com/questions/tagged/graphics2d",
-  "https://www.stackoverflow.com/questions/tagged/graphite",
-  "https://www.stackoverflow.com/questions/tagged/grep",
-  "https://www.stackoverflow.com/questions/tagged/hadoop",
-  "https://www.stackoverflow.com/questions/tagged/haskell",
-  "https://www.stackoverflow.com/questions/tagged/hdinsight",
-  "https://www.stackoverflow.com/questions/tagged/hibernate",
-  "https://www.stackoverflow.com/questions/tagged/hive",
-  "https://www.stackoverflow.com/questions/tagged/hiveql",
-  "https://www.stackoverflow.com/questions/tagged/html",
-  "https://www.stackoverflow.com/questions/tagged/htmltidy",
-  "https://www.stackoverflow.com/questions/tagged/import-from-excel",
-  "https://www.stackoverflow.com/questions/tagged/interface-builder",
-  "https://www.stackoverflow.com/questions/tagged/ios",
-  "https://www.stackoverflow.com/questions/tagged/ios7",
-  "https://www.stackoverflow.com/questions/tagged/ivy",
-  "https://www.stackoverflow.com/questions/tagged/java",
-  "https://www.stackoverflow.com/questions/tagged/java-ee",
-  "https://www.stackoverflow.com/questions/tagged/javascript",
-  "https://www.stackoverflow.com/questions/tagged/jax-rs",
-  "https://www.stackoverflow.com/questions/tagged/jersey-client",
-  "https://www.stackoverflow.com/questions/tagged/jpa",
-  "https://www.stackoverflow.com/questions/tagged/jquery",
-  "https://www.stackoverflow.com/questions/tagged/jradiobutton",
-  "https://www.stackoverflow.com/questions/tagged/keyboard-shortcuts",
-  "https://www.stackoverflow.com/questions/tagged/laravel-5",
-  "https://www.stackoverflow.com/questions/tagged/linq-to-sql",
-  "https://www.stackoverflow.com/questions/tagged/linux",
-  "https://www.stackoverflow.com/questions/tagged/lisp",
-  "https://www.stackoverflow.com/questions/tagged/locking",
-  "https://www.stackoverflow.com/questions/tagged/loops",
-  "https://www.stackoverflow.com/questions/tagged/machine-learning",
-  "https://www.stackoverflow.com/questions/tagged/mapreduce",
-  "https://www.stackoverflow.com/questions/tagged/markdown",
-  "https://www.stackoverflow.com/questions/tagged/mathematical-optimization",
-  "https://www.stackoverflow.com/questions/tagged/matlab",
-  "https://www.stackoverflow.com/questions/tagged/maven",
-  "https://www.stackoverflow.com/questions/tagged/mips32",
-  "https://www.stackoverflow.com/questions/tagged/mobilefirst",
-  "https://www.stackoverflow.com/questions/tagged/mongodb",
-  "https://www.stackoverflow.com/questions/tagged/mongoose",
-  "https://www.stackoverflow.com/questions/tagged/moq",
-  "https://www.stackoverflow.com/questions/tagged/ms-access",
-  "https://www.stackoverflow.com/questions/tagged/multithreading",
-  "https://www.stackoverflow.com/questions/tagged/mvvm",
-  "https://www.stackoverflow.com/questions/tagged/mysql",
-  "https://www.stackoverflow.com/questions/tagged/n1ql",
-  "https://www.stackoverflow.com/questions/tagged/netbeans",
-  "https://www.stackoverflow.com/questions/tagged/networking",
-  "https://www.stackoverflow.com/questions/tagged/notepad%2b%2b",
-  "https://www.stackoverflow.com/questions/tagged/nsattributedstring",
-  "https://www.stackoverflow.com/questions/tagged/nsmenuitem",
-  "https://www.stackoverflow.com/questions/tagged/nsmutableattributedstring",
-  "https://www.stackoverflow.com/questions/tagged/nstextattachment",
-  "https://www.stackoverflow.com/questions/tagged/onsen-ui",
-  "https://www.stackoverflow.com/questions/tagged/oop",
-  "https://www.stackoverflow.com/questions/tagged/oozie",
-  "https://www.stackoverflow.com/questions/tagged/oozie-coordinator",
-  "https://www.stackoverflow.com/questions/tagged/openam",
-  "https://www.stackoverflow.com/questions/tagged/opengl",
-  "https://www.stackoverflow.com/questions/tagged/osx",
-  "https://www.stackoverflow.com/questions/tagged/pandas",
-  "https://www.stackoverflow.com/questions/tagged/panels",
-  "https://www.stackoverflow.com/questions/tagged/parse.com",
-  "https://www.stackoverflow.com/questions/tagged/parsing",
-  "https://www.stackoverflow.com/questions/tagged/pdftk",
-  "https://www.stackoverflow.com/questions/tagged/pelican",
-  "https://www.stackoverflow.com/questions/tagged/performance",
-  "https://www.stackoverflow.com/questions/tagged/php",
-  "https://www.stackoverflow.com/questions/tagged/phpunit",
-  "https://www.stackoverflow.com/questions/tagged/post",
-  "https://www.stackoverflow.com/questions/tagged/powershell",
-  "https://www.stackoverflow.com/questions/tagged/process",
-  "https://www.stackoverflow.com/questions/tagged/promise",
-  "https://www.stackoverflow.com/questions/tagged/pycharm",
-  "https://www.stackoverflow.com/questions/tagged/pydev",
-  "https://www.stackoverflow.com/questions/tagged/pygments",
-  "https://www.stackoverflow.com/questions/tagged/python",
-  "https://www.stackoverflow.com/questions/tagged/python-2.7",
-  "https://www.stackoverflow.com/questions/tagged/r",
-  "https://www.stackoverflow.com/questions/tagged/radio-button",
-  "https://www.stackoverflow.com/questions/tagged/regex",
-  "https://www.stackoverflow.com/questions/tagged/rest",
-  "https://www.stackoverflow.com/questions/tagged/routes",
-  "https://www.stackoverflow.com/questions/tagged/rubber",
-  "https://www.stackoverflow.com/questions/tagged/ruby",
-  "https://www.stackoverflow.com/questions/tagged/ruby-on-rails",
-  "https://www.stackoverflow.com/questions/tagged/schema",
-  "https://www.stackoverflow.com/questions/tagged/serial-port",
-  "https://www.stackoverflow.com/questions/tagged/server",
-  "https://www.stackoverflow.com/questions/tagged/session",
-  "https://www.stackoverflow.com/questions/tagged/shader",
-  "https://www.stackoverflow.com/questions/tagged/signalr",
-  "https://www.stackoverflow.com/questions/tagged/signals",
-  "https://www.stackoverflow.com/questions/tagged/single-sign-on",
-  "https://www.stackoverflow.com/questions/tagged/spectrum",
-  "https://www.stackoverflow.com/questions/tagged/spreadsheet",
-  "https://www.stackoverflow.com/questions/tagged/spring",
-  "https://www.stackoverflow.com/questions/tagged/spring-data-rest",
-  "https://www.stackoverflow.com/questions/tagged/spring-mvc",
-  "https://www.stackoverflow.com/questions/tagged/sql",
-  "https://www.stackoverflow.com/questions/tagged/sql-server",
-  "https://www.stackoverflow.com/questions/tagged/string-interpolation",
-  "https://www.stackoverflow.com/questions/tagged/svg",
-  "https://www.stackoverflow.com/questions/tagged/swift",
-  "https://www.stackoverflow.com/questions/tagged/swing",
-  "https://www.stackoverflow.com/questions/tagged/symfony2",
-  "https://www.stackoverflow.com/questions/tagged/systems-programming",
-  "https://www.stackoverflow.com/questions/tagged/threadpool",
-  "https://www.stackoverflow.com/questions/tagged/timezone",
-  "https://www.stackoverflow.com/questions/tagged/travis-ci",
-  "https://www.stackoverflow.com/questions/tagged/try-catch",
-  "https://www.stackoverflow.com/questions/tagged/tuckey-urlrewrite-filter",
-  "https://www.stackoverflow.com/questions/tagged/uicollectionview",
-  "https://www.stackoverflow.com/questions/tagged/uicollectionviewcell",
-  "https://www.stackoverflow.com/questions/tagged/uiwebview",
-  "https://www.stackoverflow.com/questions/tagged/unit-testing",
-  "https://www.stackoverflow.com/questions/tagged/user-interface",
-  "https://www.stackoverflow.com/questions/tagged/variables",
-  "https://www.stackoverflow.com/questions/tagged/vb.net",
-  "https://www.stackoverflow.com/questions/tagged/vba",
-  "https://www.stackoverflow.com/questions/tagged/viewmodel",
-  "https://www.stackoverflow.com/questions/tagged/visual-c%2b%2b",
-  "https://www.stackoverflow.com/questions/tagged/visual-studio-2013",
-  "https://www.stackoverflow.com/questions/tagged/wifi",
-  "https://www.stackoverflow.com/questions/tagged/windows",
-  "https://www.stackoverflow.com/questions/tagged/windows-7",
-  "https://www.stackoverflow.com/questions/tagged/winjs",
-  "https://www.stackoverflow.com/questions/tagged/worklight",
-  "https://www.stackoverflow.com/questions/tagged/wpf",
-  "https://www.stackoverflow.com/questions/tagged/xcode",
-  "https://www.stackoverflow.com/questions/tagged/xml",
-  "https://www.stackoverflow.com/questions/tagged/xml-parsing",
-  "https://www.stackoverflow.com/questions/tagged/xpath",
-  "https://www.stackoverflow.com/tags",
-  "https://www.stackoverflow.com/tour",
-  "https://www.stackoverflow.com/unanswered",
-  "https://www.stackoverflow.com/users",
-  "https://www.stackoverflow.com/users/-1/community",
-  "https://www.stackoverflow.com/users/1045881/toddmo",
-  "https://www.stackoverflow.com/users/1091853/brian-thomas",
-  "https://www.stackoverflow.com/users/1146822/user1146822",
-  "https://www.stackoverflow.com/users/1151334/soleil",
-  "https://www.stackoverflow.com/users/1261774/user1261774",
-  "https://www.stackoverflow.com/users/1295877/svonborries",
-  "https://www.stackoverflow.com/users/1296178/maxhud",
-  "https://www.stackoverflow.com/users/1336797/dan-g",
-  "https://www.stackoverflow.com/users/1366938/yogiraj",
-  "https://www.stackoverflow.com/users/1371968/grayfoxnz",
-  "https://www.stackoverflow.com/users/1373663/adaml",
-  "https://www.stackoverflow.com/users/138105/joegaggler",
-  "https://www.stackoverflow.com/users/1409907/milos",
-  "https://www.stackoverflow.com/users/1440762/fabiocosta",
-  "https://www.stackoverflow.com/users/1503554/thisisnozaku",
-  "https://www.stackoverflow.com/users/1505120/pnuts",
-  "https://www.stackoverflow.com/users/1571407/niton",
-  "https://www.stackoverflow.com/users/1649952/james-shaw",
-  "https://www.stackoverflow.com/users/165198/davidk01",
-  "https://www.stackoverflow.com/users/16861/simon-fox",
-  "https://www.stackoverflow.com/users/1778038/sunsin1985",
-  "https://www.stackoverflow.com/users/1795874/bmuk",
-  "https://www.stackoverflow.com/users/1858225/kyle-strand",
-  "https://www.stackoverflow.com/users/1894630/mohab-hassan",
-  "https://www.stackoverflow.com/users/1899010/h-z",
-  "https://www.stackoverflow.com/users/1908292/tim-hauser",
-  "https://www.stackoverflow.com/users/19224/ricardo-acras",
-  "https://www.stackoverflow.com/users/219166/erikvold",
-  "https://www.stackoverflow.com/users/2251200/cdell",
-  "https://www.stackoverflow.com/users/2258616/samirman",
-  "https://www.stackoverflow.com/users/234401/dva",
-  "https://www.stackoverflow.com/users/2362671/come-raczy",
-  "https://www.stackoverflow.com/users/2392106/medbo",
-  "https://www.stackoverflow.com/users/2581928/rainingchain",
-  "https://www.stackoverflow.com/users/2669425/david-hall",
-  "https://www.stackoverflow.com/users/2695387/victor-sigler",
-  "https://www.stackoverflow.com/users/2752334/paddy",
-  "https://www.stackoverflow.com/users/2775185/user2775185",
-  "https://www.stackoverflow.com/users/2868481/d8d0d65b3f7cf42",
-  "https://www.stackoverflow.com/users/2913800/andrew-sumner",
-  "https://www.stackoverflow.com/users/2917993/chockomonkey",
-  "https://www.stackoverflow.com/users/2988919/benjour",
-  "https://www.stackoverflow.com/users/299209/philk",
-  "https://www.stackoverflow.com/users/3034030/dsal1951",
-  "https://www.stackoverflow.com/users/3075435/emmanuel-orozco",
-  "https://www.stackoverflow.com/users/3195200/ioskmt",
-  "https://www.stackoverflow.com/users/3200823/casekey",
-  "https://www.stackoverflow.com/users/3267086/user3267086",
-  "https://www.stackoverflow.com/users/3324220/mongothegeek",
-  "https://www.stackoverflow.com/users/337134/knows-not-much",
-  "https://www.stackoverflow.com/users/3576984/michaelchirico",
-  "https://www.stackoverflow.com/users/3759159/user3759159",
-  "https://www.stackoverflow.com/users/3813605/misunderstood",
-  "https://www.stackoverflow.com/users/3866309/jaredramirez",
-  "https://www.stackoverflow.com/users/3909196/rashadb",
-  "https://www.stackoverflow.com/users/3920526/user3920526",
-  "https://www.stackoverflow.com/users/3924273/user3924273",
-  "https://www.stackoverflow.com/users/3930335/tom",
-  "https://www.stackoverflow.com/users/4040102/velkerr",
-  "https://www.stackoverflow.com/users/4111363/novice-programmer",
-  "https://www.stackoverflow.com/users/416631/kenny-wyland",
-  "https://www.stackoverflow.com/users/4199865/zombie",
-  "https://www.stackoverflow.com/users/4208583/grender",
-  "https://www.stackoverflow.com/users/4276217/pwnies",
-  "https://www.stackoverflow.com/users/4312650/whyyounowork",
-  "https://www.stackoverflow.com/users/4328443/chen-chen",
-  "https://www.stackoverflow.com/users/4344581/basma",
-  "https://www.stackoverflow.com/users/4441082/user4441082",
-  "https://www.stackoverflow.com/users/4443576/chris-paterson",
-  "https://www.stackoverflow.com/users/4481308/david-park",
-  "https://www.stackoverflow.com/users/4537802/joey-hanlon",
-  "https://www.stackoverflow.com/users/4552955/miles",
-  "https://www.stackoverflow.com/users/4643092/nrh",
-  "https://www.stackoverflow.com/users/4647993/alexandra-feldman",
-  "https://www.stackoverflow.com/users/4680156/teaspoon",
-  "https://www.stackoverflow.com/users/4703156/zach-templeton",
-  "https://www.stackoverflow.com/users/4714646/sanchay-subhedar",
-  "https://www.stackoverflow.com/users/472495/halfer",
-  "https://www.stackoverflow.com/users/4727821/dungey-140",
-  "https://www.stackoverflow.com/users/4783618/marrioa",
-  "https://www.stackoverflow.com/users/4788577/robert",
-  "https://www.stackoverflow.com/users/4789423/srikat",
-  "https://www.stackoverflow.com/users/4789565/ji-chen",
-  "https://www.stackoverflow.com/users/4789579/eddy-p",
-  "https://www.stackoverflow.com/users/4789605/a-negrete",
-  "https://www.stackoverflow.com/users/4789643/chizbe-joe",
-  "https://www.stackoverflow.com/users/494343/schultz9999",
-  "https://www.stackoverflow.com/users/53771/spence",
-  "https://www.stackoverflow.com/users/736937/jedwards",
-  "https://www.stackoverflow.com/users/774575/mins",
-  "https://www.stackoverflow.com/users/877069/nick-chammas",
-  "https://www.stackoverflow.com/users/912772/vic",
-  "https://www.stackoverflow.com/users/957648/tyler-exposure",
-  "https://www.stackoverflow.com/users/972044/mikeb",
-  "https://www.stackoverflow.com?tab=featured",
-  "https://www.stackoverflow.com?tab=hot",
-  "https://www.stackoverflow.com?tab=interesting",
-  "https://www.stackoverflow.com?tab=month",
-  "https://www.stackoverflow.com?tab=week",
-  "https://www.subscribe.wsj.com/hpfooterlink",
-  "https://www.subscribe.wsj.com/hpheaderlink",
-  "https://www.thedodo.com/circus-elephants-carden-1089266986.html?utm_source=HuffPo",
-  "https://www.thedodo.com/millions-animals-killed-by-us-government-1090872400.html?utm_source=HuffPo",
-  "https://www.tumblr.com/",
-  "https://www.twitter.com",
-  "https://www.twitter.com#supported_languages",
-  "https://www.twitter.com/",
-  "https://www.twitter.com/JaredLeto/status/549847390342361088",
-  "https://www.twitter.com/NBA/status/560319834135998464",
-  "https://www.twitter.com/RaviVora/status/515695592656224256",
-  "https://www.twitter.com/Thursday_Neal/status/500060476571926528",
-  "https://www.twitter.com/about",
-  "https://www.twitter.com/account/begin_password_reset",
-  "https://www.twitter.com/account/complete",
-  "https://www.twitter.com/astro_reid/status/531567705368059904",
-  "https://www.twitter.com/i/cricket",
-  "https://www.twitter.com/i/directory/profiles",
-  "https://www.twitter.com/login",
-  "https://www.twitter.com/privacy",
-  "https://www.twitter.com/sanarao/status/531643781163261952",
-  "https://www.twitter.com/tos",
-  "https://www.twitter.com?lang=ar",
-  "https://www.twitter.com?lang=bn",
-  "https://www.twitter.com?lang=cs",
-  "https://www.twitter.com?lang=da",
-  "https://www.twitter.com?lang=de",
-  "https://www.twitter.com?lang=en-gb",
-  "https://www.twitter.com?lang=es",
-  "https://www.twitter.com?lang=fa",
-  "https://www.twitter.com?lang=fi",
-  "https://www.twitter.com?lang=fil",
-  "https://www.twitter.com?lang=fr",
-  "https://www.twitter.com?lang=he",
-  "https://www.twitter.com?lang=hi",
-  "https://www.twitter.com?lang=hu",
-  "https://www.twitter.com?lang=id",
-  "https://www.twitter.com?lang=it",
-  "https://www.twitter.com?lang=ja",
-  "https://www.twitter.com?lang=ko",
-  "https://www.twitter.com?lang=msa",
-  "https://www.twitter.com?lang=nl",
-  "https://www.twitter.com?lang=no",
-  "https://www.twitter.com?lang=pl",
-  "https://www.twitter.com?lang=pt",
-  "https://www.twitter.com?lang=ro",
-  "https://www.twitter.com?lang=ru",
-  "https://www.twitter.com?lang=sv",
-  "https://www.twitter.com?lang=th",
-  "https://www.twitter.com?lang=tr",
-  "https://www.twitter.com?lang=uk",
-  "https://www.twitter.com?lang=vi",
-  "https://www.twitter.com?lang=zh-cn",
-  "https://www.twitter.com?lang=zh-tw",
-  "https://www.wikibooks.org/",
-  "https://www.wikidata.org/",
-  "https://www.wikinews.org/",
-  "https://www.wikiquote.org/",
-  "https://www.wikisource.org/",
-  "https://www.wikiversity.org/",
-  "https://www.wikivoyage.org/",
-  "https://www.wiktionary.org/",
-  "https://www.yahoo.com",
-  "https://www.yahoo.com#suggestions",
-  "https://www.yahoo.com/",
-  "https://www.yahoo.com/autos",
-  "https://www.yahoo.com/autos/see-an-astronauts-daughter-use-cars-to-compose-a-116398297787.html",
-  "https://www.yahoo.com/beauty",
-  "https://www.yahoo.com/beauty/lorraine-bracco-takes-on-aging-one-food-at-a-time-116256087243.html",
-  "https://www.yahoo.com/food",
-  "https://www.yahoo.com/health",
-  "https://www.yahoo.com/health/moms-open-letter-to-handicap-parking-shamer-116388141197.html",
-  "https://www.yahoo.com/makers",
-  "https://www.yahoo.com/movies",
-  "https://www.yahoo.com/parenting",
-  "https://www.yahoo.com/politics",
-  "https://www.yahoo.com/politics/chris-christie-bets-on-bold-chris-christie-116349714161.html",
-  "https://www.yahoo.com/style",
-  "https://www.yahoo.com/tech",
-  "https://www.yahoo.com/tech/s/apple-just-made-big-move-could-next-gen-202430965.html",
-  "https://www.yahoo.com/travel",
-  "https://www.yahoo.com/tv",
-  "https://www.yahoo.com/tv/community-cheat-sheet-secrets-of-the-lunch-ladys-116386982085.html",
-  "https://www.youtube.com/",
-  "https://www.youtube.com/?tab=w1",
-  "https://www.youtube.com/channel/SBAaOjE-GIlRI",
-  "https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ",
-  "https://www.youtube.com/channel/UC3yA8nDwraeOfnYfBWun83g",
-  "https://www.youtube.com/channel/UC4uUNnBRq0CYscEMgdB6EJw",
-  "https://www.youtube.com/channel/UCBR8-60-B28hp2BmDPdntcQ",
-  "https://www.youtube.com/channel/UCDIfQhadlTH-AdaB8yDOMcA",
-  "https://www.youtube.com/channel/UCEgdi0XIXXZ-qJOFPf4JSKw",
-  "https://www.youtube.com/channel/UCF0pVplsI8R5kcAqgtoRqoA",
-  "https://www.youtube.com/channel/UCF16SjpLvjwG8O6_LZvj8Xw",
-  "https://www.youtube.com/channel/UCLRYsOHrkk5qcIhtq033bLQ",
-  "https://www.youtube.com/channel/UCOpNcN46UbXVtpKMrmU4Abg",
-  "https://www.youtube.com/channel/UCPSlVo6uTRt4whnlqsn9UIw",
-  "https://www.youtube.com/channel/UCYfdidRxbB8Qhf0Nx7ioOYw",
-  "https://www.youtube.com/channel/UCczhp4wznQWonO7Pb8HQ2MQ",
-  "https://www.youtube.com/channel/UCh4sCWxEhYe0rlmBjxEunQw",
-  "https://www.youtube.com/channel/UCl8dMTqDrJQ0c8y23UBu4kQ",
-  "https://www.youtube.com/channels",
-  "https://www.youtube.com/feed/history",
-  "https://www.youtube.com/feed/music",
-  "https://www.youtube.com/playlist?list=PLrEnWoR732-BHrPp_Pm8_VleD68f9s14-",
-  "https://www.youtube.com/t/terms",
-  "https://www.youtube.com/testtube",
-  "https://www.youtube.com/upload",
-  "https://www.youtube.com/user/ArianaGrandeVevo",
-  "https://www.youtube.com/user/CiaraVEVO",
-  "https://www.youtube.com/user/EllieGouldingVEVO",
-  "https://www.youtube.com/user/FoxSports",
-  "https://www.youtube.com/user/JimmyKimmelLive",
-  "https://www.youtube.com/user/LastWeekTonight",
-  "https://www.youtube.com/user/MARVEL",
-  "https://www.youtube.com/user/MTV",
-  "https://www.youtube.com/user/MarkRonsonVEVO",
-  "https://www.youtube.com/user/Maroon5VEVO",
-  "https://www.youtube.com/user/MeghanTrainorVEVO",
-  "https://www.youtube.com/user/RihannaVEVO",
-  "https://www.youtube.com/user/SiaVEVO",
-  "https://www.youtube.com/user/TaylorSwiftVEVO",
-  "https://www.youtube.com/user/TerminatorGenisys",
-  "https://www.youtube.com/user/VanossGaming",
-  "https://www.youtube.com/user/WatchMojo",
-  "https://www.youtube.com/user/YelawolfVEVO",
-  "https://www.youtube.com/user/destinygame",
-  "https://www.youtube.com/user/jonmillsswns",
-  "https://www.youtube.com/user/movieclipsTRAILERS",
-  "https://www.youtube.com/user/omarionmmg",
-  "https://www.youtube.com/watch?v=-CmadmM5cOk",
-  "https://www.youtube.com/watch?v=09R8_2nJtjg",
-  "https://www.youtube.com/watch?v=0ABiaTEd3Rw",
-  "https://www.youtube.com/watch?v=0OkB6p_FZAw",
-  "https://www.youtube.com/watch?v=0o81YZrNiqs",
-  "https://www.youtube.com/watch?v=0uY7gLZDmn4",
-  "https://www.youtube.com/watch?v=3ck68PrV668",
-  "https://www.youtube.com/watch?v=47lYbqjB97g",
-  "https://www.youtube.com/watch?v=6AHI_BUK_1E",
-  "https://www.youtube.com/watch?v=7Akvt9ZSOcg",
-  "https://www.youtube.com/watch?v=7LfFW8aA8vw",
-  "https://www.youtube.com/watch?v=7PCkvCPvDXk",
-  "https://www.youtube.com/watch?v=8xg3vE8Ie_E",
-  "https://www.youtube.com/watch?v=AJtDXIazrMo",
-  "https://www.youtube.com/watch?v=AgFeZr5ptV8",
-  "https://www.youtube.com/watch?v=ArrWgQS51Yc",
-  "https://www.youtube.com/watch?v=BPgEgaPk62M",
-  "https://www.youtube.com/watch?v=CQERFnGvi_A",
-  "https://www.youtube.com/watch?v=CieuGZ7TthE",
-  "https://www.youtube.com/watch?v=FLzfXQSPBOg",
-  "https://www.youtube.com/watch?v=GZgQjN0aNHM",
-  "https://www.youtube.com/watch?v=IbJwRcRSRyE",
-  "https://www.youtube.com/watch?v=IfbxK0EQrkQ",
-  "https://www.youtube.com/watch?v=IxUqZU4XW0E",
-  "https://www.youtube.com/watch?v=KWZGAExj-es",
-  "https://www.youtube.com/watch?v=MD5bFCDfySc",
-  "https://www.youtube.com/watch?v=Nn_Zln_4pA8",
-  "https://www.youtube.com/watch?v=OPf0YbXqDm0",
-  "https://www.youtube.com/watch?v=Shg53iv4B9o",
-  "https://www.youtube.com/watch?v=ShlW5plD_40",
-  "https://www.youtube.com/watch?v=UDbBXS-XlUI",
-  "https://www.youtube.com/watch?v=VSYjs5RnlRo",
-  "https://www.youtube.com/watch?v=VuNIsY6JdUw",
-  "https://www.youtube.com/watch?v=WA4iX5D9Z64",
-  "https://www.youtube.com/watch?v=X4do3Kus2nQ",
-  "https://www.youtube.com/watch?v=_6e5nE2SXYU",
-  "https://www.youtube.com/watch?v=aOjUSjghGI8",
-  "https://www.youtube.com/watch?v=aPxVSCfoYnU",
-  "https://www.youtube.com/watch?v=alQlJDRnQkE",
-  "https://www.youtube.com/watch?v=bV4jT0v1H_M",
-  "https://www.youtube.com/watch?v=cqmG5JWLRag",
-  "https://www.youtube.com/watch?v=dMMfSVfNkoA",
-  "https://www.youtube.com/watch?v=e-ORhEE9VVg",
-  "https://www.youtube.com/watch?v=fPg3jWn6Nn0",
-  "https://www.youtube.com/watch?v=j1p0_R8ZLB0",
-  "https://www.youtube.com/watch?v=ksrHwD9cZjQ",
-  "https://www.youtube.com/watch?v=kt0g4dWxEBo",
-  "https://www.youtube.com/watch?v=lWZ7O-RrATY",
-  "https://www.youtube.com/watch?v=meQEM3nVmi8",
-  "https://www.youtube.com/watch?v=nfWlot6h_JM",
-  "https://www.youtube.com/watch?v=ofxGAXSope8",
-  "https://www.youtube.com/watch?v=oiJWrNWDXvM",
-  "https://www.youtube.com/watch?v=okGcksYM0N8",
-  "https://www.youtube.com/watch?v=pWdKf3MneyI",
-  "https://www.youtube.com/watch?v=pXwaKB7YOjw",
-  "https://www.youtube.com/watch?v=qDc_5zpBj7s",
-  "https://www.youtube.com/watch?v=rGSxss7gWak",
-  "https://www.youtube.com/watch?v=u1XdfL42_ZA",
-  "https://www.youtube.com/watch?v=u9mcE-txqoQ",
-  "https://www.youtube.com/watch?v=vWa9iYYPYF4",
-  "https://www.youtube.com/watch?v=w1oM3kQpXRo",
-  "https://www.youtube.com/watch?v=xqc-akOWPe8",
-  "https://www.youtube.com/watch?v=yOkSedn_cfc",
-  "https://www.youtube.com/yt/about/",
-  "https://www.youtube.com/yt/advertise/",
-  "https://www.youtube.com/yt/copyright/",
-  "https://www.youtube.com/yt/creators/",
-  "https://www.youtube.com/yt/dev/",
-  "https://www.youtube.com/yt/policyandsafety/",
-  "https://www.youtube.com/yt/press/",
-  "https://xal.wikipedia.org/",
-  "https://xh.wikipedia.org/",
-  "https://xmf.wikipedia.org/",
-  "https://yandex.ru/jobs",
-  "https://yi.wikipedia.org/",
-  "https://yo.wikipedia.org/",
-  "https://za.wikipedia.org/",
-  "https://zea.wikipedia.org/",
-  "https://zh-classical.wikipedia.org/",
-  "https://zh-cn.facebook.com/",
-  "https://zh-min-nan.wikipedia.org/",
-  "https://zh-yue.wikipedia.org/",
-  "https://zh.wikipedia.org/",
-  "https://zh.wikipedia.org/wiki/Wikipedia:%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E8%A8%80%E5%88%97%E8%A1%A8",
-  "https://zu.wikipedia.org/"
-]
diff --git a/tools/perf/profile_creators/profile_safe_url_list.py b/tools/perf/profile_creators/profile_safe_url_list.py
deleted file mode 100644
index e7cda25..0000000
--- a/tools/perf/profile_creators/profile_safe_url_list.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2015 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.
-import json
-import os
-import random
-
-
-def GetShuffledSafeUrls():
-  """Returns a deterministic shuffling of safe urls.
-
-  The profile generators access the urls in order, and the urls are grouped by
-  domain. The shuffling reduces the load on external servers.
-  """
-  random.seed(0)
-  url_list_copy = list(GetSafeUrls())
-  random.shuffle(url_list_copy)
-  return url_list_copy
-
-
-def GetSafeUrls():
-  """Returns a list of safe urls by loading them from a pre-generated file."""
-  safe_url_dir = os.path.dirname(os.path.realpath(__file__))
-  safe_url_path = os.path.join(safe_url_dir, "profile_safe_url_list.json")
-  with open(safe_url_path, "r") as safe_url_file:
-    return json.load(safe_url_file)
diff --git a/tools/perf/profile_creators/small_profile_extender.py b/tools/perf/profile_creators/small_profile_extender.py
deleted file mode 100644
index 22664f5..0000000
--- a/tools/perf/profile_creators/small_profile_extender.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import page_sets
-
-from profile_creators import fast_navigation_profile_extender
-
-
-class SmallProfileExtender(
-    fast_navigation_profile_extender.FastNavigationProfileExtender):
-  """Creates a small profile by performing 25 navigations."""
-
-  def __init__(self, finder_options):
-    # Use exactly 5 tabs to generate the profile. This is because consumers of
-    # this profile will perform a session restore, and expect 5 restored tabs.
-    maximum_batch_size = 5
-    super(SmallProfileExtender, self).__init__(
-        finder_options, maximum_batch_size)
-
-    # Get the list of urls from the typical 25 page set.
-    self._page_set = page_sets.Typical25PageSet()
-    urls = []
-    for story in self._page_set.stories:
-      urls.append(story.url)
-    self._navigation_urls = urls
-
-  def GetUrlIterator(self):
-    """Superclass override."""
-    return iter(self._navigation_urls)
-
-  def ShouldExitAfterBatchNavigation(self):
-    """Superclass override."""
-    return False
-
-  def WebPageReplayArchivePath(self):
-    """Superclass override."""
-    return self._page_set.WprFilePathForStory(
-        self._page_set.stories[0])
-
-  def FetchWebPageReplayArchives(self):
-    """Superclass override."""
-    self._page_set.wpr_archive_info.DownloadArchivesIfNeeded()
diff --git a/tools/perf/profile_creators/update_remote_extensions.py b/tools/perf/profile_creators/update_remote_extensions.py
deleted file mode 100644
index bf28d4a..0000000
--- a/tools/perf/profile_creators/update_remote_extensions.py
+++ /dev/null
@@ -1,217 +0,0 @@
-# Copyright 2015 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.
-
-import base64
-import csv
-import json
-import optparse
-import os
-import shutil
-import sys
-import tempfile
-import urllib2
-import zipfile
-
-sys.path.insert(1, os.path.abspath(os.path.join(
-    __file__, '..', '..')))
-from core import path_util
-
-
-path_util.AddPyUtilsToPath()
-from py_utils import cloud_storage
-
-path_util.AddTelemetryToPath()
-from telemetry.core import exceptions
-
-
-# Remote target upload directory in cloud storage for extensions.
-REMOTE_DIR = 'extension_set'
-
-# Target zip file.
-ZIP_NAME = 'extensions.zip'
-
-
-def _DownloadCrxFromCws(ext_id, dst):
-  """Downloads CRX specified from Chrome Web Store.
-
-  Retrieves CRX (Chrome extension file) specified by ext_id from Chrome Web
-  Store, into directory specified by dst.
-
-  Args:
-      ext_id: id of extension to retrieve.
-      dst: directory to download CRX into
-
-  Returns:
-      Returns local path to downloaded CRX.
-      If download fails, return None.
-  """
-  dst_path = os.path.join(dst, '%s.crx' % ext_id)
-  cws_url = ('https://clients2.google.com/service/update2/crx?response='
-             'redirect&prodversion=38.0&x=id%%3D%s%%26installsource%%3D'
-             'ondemand%%26uc' % ext_id)
-  response = urllib2.urlopen(cws_url)
-  if response.getcode() is not 200:
-    return None
-  with open(dst_path, 'w') as f:
-    f.write(response.read())
-  return dst_path
-
-
-def _UpdateExtensionsInCloud(local_extensions_dir, extensions_csv, remote_dir):
-  """Updates set of extensions in Cloud Storage from a CSV of extension ids.
-
-  From well-formatted CSV file containing some set of extensions
-  (extensions_csv), download them, compress into archive, and update
-  the remote extension archive under REMOTE_DIR in CHROME-PARTNER-TELEMETRY
-  bucket. This script expects 2nd column of CSV file to contain extension ids.
-
-  Args:
-      local_extensions_dir: directory to download CRX files into.
-      extension_csv: CSV to pull extension_ids from.
-      remote_dir: remote directory to put extension archive in cloud storage.
-
-  Raises:
-      Exception if a CRX download fails.
-  """
-
-  # Download CRX to temp files and compress into archive
-  zip_path = os.path.join(local_extensions_dir, ZIP_NAME)
-  extension_zip = zipfile.ZipFile(zip_path, 'w')
-  update_csv = False
-  extensions_info = []
-  with open(extensions_csv, 'rb') as csv_file:
-    reader = csv.reader(csv_file)
-    # Stores comments (in case CSV needs to be updated/rewritten)
-    # and skips header line.
-    comments = []
-    line = ','.join(reader.next())
-    while line.startswith('#'):
-      comments.append(line)
-      line = ','.join(reader.next())
-    # Extract info from CSV.
-    for row in reader:
-      extension_info = {
-          'extension_name': row[0],
-          'id': row[1],
-          'hash': row[2],
-          'version': row[3]
-      }
-
-      print 'Fetching extension %s...' % extension_info['id']
-      crx_path = _DownloadCrxFromCws(extension_info['id'], local_extensions_dir)
-      if crx_path is None:
-        raise exceptions.Error('\tCould not fetch %s.\n\n'
-                               'If this extension dl consistently fails, '
-                               'remove this entry from %s.'
-                               % (extension_info['id'], extensions_csv))
-      (new_hash, new_version) = _CrxHashIfChanged(crx_path, extension_info)
-      if new_hash is not None:
-        update_csv = True
-        extension_info['hash'] = new_hash
-        extension_info['version'] = new_version
-      extensions_info.append(extension_info)
-      extension_zip.write(crx_path, arcname='%s.crx' % extension_info['id'])
-  extension_zip.close()
-
-  if update_csv:
-    print 'Updating CSV...'
-    _UpdateCsv(comments, extensions_csv, extensions_info)
-
-  print 'Uploading extensions to cloud...'
-  remote_zip_path = os.path.join(remote_dir, ZIP_NAME)
-  cloud_storage.Insert(cloud_storage.PARTNER_BUCKET, remote_zip_path, zip_path)
-
-
-def _CrxHashIfChanged(crx_path, extension_info):
-  """Checks whether downloaded Crx has been altered.
-
-  Compares stored hash with hash of downloaded Crx. If different, alerts user
-  that CRX version has changed and will be updated in CSV file.
-
-  Args:
-    crx_path: Path to downloaded CRX.
-    extension_info: Info from CSV (including id and previous hash) about CRX.
-
-  Returns:
-    New hash and version if extension differed. Otherwise, returns (None, None)
-  """
-  downloaded_hash = _Base64Hash(crx_path)
-  new_version = _GetVersionFromCrx(crx_path)
-  if downloaded_hash != extension_info['hash']:
-    if new_version != extension_info['version']:
-      ans = raw_input('\tWarning: Extension %s version from Web Store differs '
-                      'from CSV version.\n\tIf continued, script will write '
-                      'new hash and version to CSV.\n\tContinue? (y/n) '
-                      % extension_info['id']).lower()
-    else:
-      raise exceptions.Error('Extension %s hash from Web Store differs from '
-                             '\nhash stored in CSV, but versions are the same.')
-    if not ans.startswith('y'):
-      sys.exit('Web Store extension %s hash differs from hash in CSV.'
-               % extension_info['id'])
-    return (downloaded_hash, new_version)
-  return (None, None)
-
-
-def _UpdateCsv(comments, extensions_csv, extensions_info):
-  """Updates CSV with information in extensions_info.
-
-  Original CSV is overwritten with updated information about each extension.
-  Header comments from original CSV are preserved.
-
-  Args:
-    comments: List containing lines of comments found in header of original CSV.
-    extensions_csv: Path to CSV file.
-    extensions_info: List of extension info to write to CSV. Each entry is
-        a dict containing fields extension_name, id, hash, and version.
-  """
-  # Maintain pre-existing comments.
-  with open(extensions_csv, 'w') as csv_file:
-    csv_file.write('\n'.join(comments))
-    csv_file.write('\n')
-  with open(extensions_csv, 'a') as csv_file:
-    writer = csv.DictWriter(
-        csv_file, fieldnames=['extension_name', 'id', 'hash', 'version'])
-    writer.writeheader()
-    writer.writerows(extensions_info)
-
-
-def _GetCsvFromArgs():
-  """Parse options to retrieve name of CSV file."""
-  parser = optparse.OptionParser()
-  parser.add_option('-e', '--extension-csv', dest='extension_csv',
-                    help='CSV of extensions to load.')
-  (options, _) = parser.parse_args()
-  if not options.extension_csv:
-    parser.error('Must specify --extension-csv option.')
-  return options.extension_csv
-
-
-def _GetVersionFromCrx(crx_path):
-  """Retrieves extension version from CRX archive.
-
-  Args:
-    crx_path: path to CRX archive to extract version from.
-  """
-  with zipfile.ZipFile(crx_path, 'r') as crx_zip:
-    manifest_contents = crx_zip.read('manifest.json')
-    version = json.loads(manifest_contents)['version']
-  return version
-
-
-def _Base64Hash(file_path):
-  return base64.b64encode(cloud_storage.CalculateHash(file_path))
-
-
-def main():
-  extension_csv = _GetCsvFromArgs()
-  local_extensions_dir = tempfile.mkdtemp()
-  try:
-    _UpdateExtensionsInCloud(local_extensions_dir,
-                             extension_csv, REMOTE_DIR)
-  finally:
-    shutil.rmtree(local_extensions_dir)
-
-if __name__ == '__main__':
-  main()
diff --git a/tools/perf/record_android_profile.py b/tools/perf/record_android_profile.py
deleted file mode 100755
index da7d3e4..0000000
--- a/tools/perf/record_android_profile.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-import tempfile
-
-from core import path_util
-path_util.AddTelemetryToPath()
-
-from telemetry.internal.browser import browser_finder
-from telemetry.internal.browser import browser_options
-
-
-def _RunPrebuilt(options):
-  browser_to_create = browser_finder.FindBrowser(options)
-  with browser_to_create.Create(options) as browser:
-    output_file = os.path.join(tempfile.mkdtemp(), options.profiler)
-    raw_input('Press enter to start profiling...')
-    print '>> Starting profiler', options.profiler
-    browser.profiling_controller.Start(options.profiler, output_file)
-    try:
-      raw_input('Press enter or CTRL+C to stop')
-    except KeyboardInterrupt:
-      pass
-    finally:
-      print '<< Stopping ...',
-      sys.stdout.flush()
-      browser.profiling_controller.Stop()
-    print 'Stopped profiler ', options.profiler
-
-
-if __name__ == '__main__':
-  browser_finder_options = browser_options.BrowserFinderOptions()
-  parser = browser_finder_options.CreateParser('')
-  profiler_options, _ = parser.parse_args()
-  sys.exit(_RunPrebuilt(profiler_options))
diff --git a/ui/android/java/res/values-sw600dp/values.xml b/ui/android/java/res/values-sw600dp/values.xml
deleted file mode 100644
index 4a3fbb6..0000000
--- a/ui/android/java/res/values-sw600dp/values.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <!-- Whether the device is a tablet or large tablet. Used to determine which resources the OS
-         loaded. -->
-    <bool name="is_tablet">true</bool>
-    <bool name="is_large_tablet">false</bool>
-</resources>
diff --git a/ui/android/java/res/values/values.xml b/ui/android/java/res/values/values.xml
index 1dc6cfa..73f8c71 100644
--- a/ui/android/java/res/values/values.xml
+++ b/ui/android/java/res/values/values.xml
@@ -7,8 +7,4 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
     <item type="id" name="dropdown_popup_window" />
-    <!-- Whether the device is a tablet or large tablet. Used to determine which resources the OS
-         loaded. -->
-    <bool name="is_tablet">false</bool>
-    <bool name="is_large_tablet">false</bool>
-</resources>
+</resources>
\ No newline at end of file
diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
index 9c538a8..5a1a07b 100644
--- a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
+++ b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
@@ -11,16 +11,22 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.ui.R;
 
 /**
  * UI utilities for accessing form factor information.
  */
 public class DeviceFormFactor {
+
     /**
      * The minimum width that would classify the device as a tablet or a large tablet.
      */
     public static final int MINIMUM_TABLET_WIDTH_DP = 600;
+    private static final int MINIMUM_LARGE_TABLET_WIDTH_DP = 720;
+
+    private static Boolean sIsTablet;
+    private static Boolean sIsLargeTablet;
+    private static Integer sMinimumTabletWidthPx;
+    private static Float sDensity;
 
     /**
      * @return Whether the app should treat the device as a tablet for layout. This method is not
@@ -28,21 +34,22 @@
      */
     @CalledByNative
     public static boolean isTablet() {
-        // On some devices, OEM modifications have been made to the resource loader that cause the
-        // DeviceFormFactor calculation of whether a device is using tablet resources to be
-        // incorrect. Check which resources were actually loaded rather than look at screen size.
-        // See crbug.com/662338.
-        return ContextUtils.getApplicationContext().getResources().getBoolean(R.bool.is_tablet);
+        if (sIsTablet == null) {
+            sIsTablet = getSmallestDeviceWidthDp() >= MINIMUM_TABLET_WIDTH_DP;
+        }
+        return sIsTablet;
     }
 
     /**
      * @param context {@link Context} used to get the Application Context.
      * @return True if the app should treat the device as a large (> 720dp) tablet for layout. This
-     * method is not affected by Android N multi-window.
+     *         method is not affected by Android N multi-window.
      */
     public static boolean isLargeTablet(Context context) {
-        return ContextUtils.getApplicationContext().getResources().getBoolean(
-                R.bool.is_large_tablet);
+        if (sIsLargeTablet == null) {
+            sIsLargeTablet = getSmallestDeviceWidthDp() >= MINIMUM_LARGE_TABLET_WIDTH_DP;
+        }
+        return sIsLargeTablet;
     }
 
     /**
@@ -81,7 +88,34 @@
      *         layout.
      */
     public static int getMinimumTabletWidthPx(Context context) {
-        return Math.round(
-                MINIMUM_TABLET_WIDTH_DP * context.getResources().getDisplayMetrics().density);
+        if (sMinimumTabletWidthPx == null) {
+            sMinimumTabletWidthPx = Math.round(MINIMUM_TABLET_WIDTH_DP
+                    * context.getResources().getDisplayMetrics().density);
+        }
+        return sMinimumTabletWidthPx;
     }
-}
\ No newline at end of file
+
+    /**
+     * Resets all cached values if the display density has changed.
+     */
+    public static void resetValuesIfNeeded(Context context) {
+        float currentDensity = context.getResources().getDisplayMetrics().density;
+        if (sDensity != null && sDensity != currentDensity) {
+            sIsTablet = null;
+            sIsLargeTablet = null;
+            sMinimumTabletWidthPx = null;
+        }
+        sDensity = currentDensity;
+    }
+
+    /**
+     * Sets whether the device is a tablet.
+     * @param isTablet Whether the app should treat the device as a tablet for layout.
+     * @param isLargeTablet Whether the app should treat the device as a large tablet for layout.
+     *                      If this is true, isTablet should also be true.
+     */
+    public static void setIsTablet(boolean isTablet, boolean isLargeTablet) {
+        sIsTablet = isTablet;
+        sIsLargeTablet = isLargeTablet;
+    }
+}
diff --git a/ui/arc/notification/arc_notification_view_unittest.cc b/ui/arc/notification/arc_notification_view_unittest.cc
index 54935541..76ee02b 100644
--- a/ui/arc/notification/arc_notification_view_unittest.cc
+++ b/ui/arc/notification/arc_notification_view_unittest.cc
@@ -313,6 +313,7 @@
       ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
 
   notification()->set_pinned(true);
+  notification_view()->SetIsNested();
   UpdateNotificationViews();
   std::string notification_id = notification()->id();
 
diff --git a/ui/aura/test/window_event_dispatcher_test_api.cc b/ui/aura/test/window_event_dispatcher_test_api.cc
index b2a4098..24672d8 100644
--- a/ui/aura/test/window_event_dispatcher_test_api.cc
+++ b/ui/aura/test/window_event_dispatcher_test_api.cc
@@ -14,7 +14,16 @@
 }
 
 bool WindowEventDispatcherTestApi::HoldingPointerMoves() const {
-  return dispatcher_->move_hold_count_ > 0;
+  return dispatcher_->move_hold_count_ > 0 || dispatcher_->held_move_event_;
+}
+
+void WindowEventDispatcherTestApi::WaitUntilPointerMovesDispatched() {
+  if (!HoldingPointerMoves())
+    return;
+  base::RunLoop run_loop;
+  dispatcher_->did_dispatch_held_move_event_callback_ = run_loop.QuitClosure();
+  run_loop.Run();
+  DCHECK(!HoldingPointerMoves());
 }
 
 }  // namespace test
diff --git a/ui/aura/test/window_event_dispatcher_test_api.h b/ui/aura/test/window_event_dispatcher_test_api.h
index 331b763d..bcb6bbe 100644
--- a/ui/aura/test/window_event_dispatcher_test_api.h
+++ b/ui/aura/test/window_event_dispatcher_test_api.h
@@ -19,6 +19,10 @@
 
   bool HoldingPointerMoves() const;
 
+  // If pointer moves are being held, this method waits until they're
+  // dispatched.
+  void WaitUntilPointerMovesDispatched();
+
  private:
   WindowEventDispatcher* dispatcher_;
 
diff --git a/ui/aura/window_event_dispatcher.cc b/ui/aura/window_event_dispatcher.cc
index 6fb791a6..8bfba942 100644
--- a/ui/aura/window_event_dispatcher.cc
+++ b/ui/aura/window_event_dispatcher.cc
@@ -204,15 +204,22 @@
 void WindowEventDispatcher::ReleasePointerMoves() {
   --move_hold_count_;
   DCHECK_GE(move_hold_count_, 0);
-  if (!move_hold_count_ && held_move_event_) {
-    // We don't want to call DispatchHeldEvents directly, because this might be
-    // called from a deep stack while another event, in which case dispatching
-    // another one may not be safe/expected.  Instead we post a task, that we
-    // may cancel if HoldPointerMoves is called again before it executes.
-    base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
-        FROM_HERE, base::Bind(
-          base::IgnoreResult(&WindowEventDispatcher::DispatchHeldEvents),
-          held_event_factory_.GetWeakPtr()));
+  if (!move_hold_count_) {
+    if (held_move_event_) {
+      // We don't want to call DispatchHeldEvents directly, because this might
+      // be called from a deep stack while another event, in which case
+      // dispatching another one may not be safe/expected.  Instead we post a
+      // task, that we may cancel if HoldPointerMoves is called again before it
+      // executes.
+      base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
+          FROM_HERE,
+          base::BindOnce(
+              base::IgnoreResult(&WindowEventDispatcher::DispatchHeldEvents),
+              held_event_factory_.GetWeakPtr()));
+    } else {
+      if (did_dispatch_held_move_event_callback_)
+        base::ResetAndReturn(&did_dispatch_held_move_event_callback_).Run();
+    }
   }
   TRACE_EVENT_ASYNC_END0("ui", "WindowEventDispatcher::HoldPointerMoves", this);
 }
@@ -765,8 +772,11 @@
 // WindowEventDispatcher, private:
 
 ui::EventDispatchDetails WindowEventDispatcher::DispatchHeldEvents() {
-  if (!held_repostable_event_ && !held_move_event_)
+  if (!held_repostable_event_ && !held_move_event_) {
+    if (did_dispatch_held_move_event_callback_)
+      base::ResetAndReturn(&did_dispatch_held_move_event_callback_).Run();
     return DispatchDetails();
+  }
 
   CHECK(!dispatching_held_event_);
 
@@ -798,8 +808,12 @@
       held_move_event_.reset();
   }
 
-  if (!dispatch_details.dispatcher_destroyed)
+  if (!dispatch_details.dispatcher_destroyed) {
     dispatching_held_event_ = nullptr;
+    if (did_dispatch_held_move_event_callback_)
+      base::ResetAndReturn(&did_dispatch_held_move_event_callback_).Run();
+  }
+
   return dispatch_details;
 }
 
diff --git a/ui/aura/window_event_dispatcher.h b/ui/aura/window_event_dispatcher.h
index 4772bd1..283866d 100644
--- a/ui/aura/window_event_dispatcher.h
+++ b/ui/aura/window_event_dispatcher.h
@@ -293,6 +293,10 @@
 
   bool skip_ime_;
 
+  // This callback is called when the held move event is dispatched, or when
+  // pointer moves are released and there is no held move event.
+  base::OnceClosure did_dispatch_held_move_event_callback_;
+
   // Used to schedule reposting an event.
   base::WeakPtrFactory<WindowEventDispatcher> repost_event_factory_;
 
diff --git a/ui/events/ozone/BUILD.gn b/ui/events/ozone/BUILD.gn
index 613d448c..3c0a68c 100644
--- a/ui/events/ozone/BUILD.gn
+++ b/ui/events/ozone/BUILD.gn
@@ -70,6 +70,8 @@
     sources = [
       "evdev/device_event_dispatcher_evdev.cc",
       "evdev/device_event_dispatcher_evdev.h",
+      "evdev/event_auto_repeat_handler.cc",
+      "evdev/event_auto_repeat_handler.h",
       "evdev/event_converter_evdev.cc",
       "evdev/event_converter_evdev.h",
       "evdev/event_converter_evdev_impl.cc",
diff --git a/ui/events/ozone/evdev/event_auto_repeat_handler.cc b/ui/events/ozone/evdev/event_auto_repeat_handler.cc
new file mode 100644
index 0000000..502d2fae4
--- /dev/null
+++ b/ui/events/ozone/evdev/event_auto_repeat_handler.cc
@@ -0,0 +1,106 @@
+// 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 "ui/events/ozone/evdev/event_auto_repeat_handler.h"
+
+#include "base/threading/thread_task_runner_handle.h"
+#include "ui/events/base_event_utils.h"
+
+namespace ui {
+
+namespace {
+
+constexpr int kRepeatDelayMs = 500;
+constexpr int kRepeatIntervalMs = 50;
+
+}  // namespace
+
+EventAutoRepeatHandler::EventAutoRepeatHandler(Delegate* delegate)
+    : repeat_delay_(base::TimeDelta::FromMilliseconds(kRepeatDelayMs)),
+      repeat_interval_(base::TimeDelta::FromMilliseconds(kRepeatIntervalMs)),
+      delegate_(delegate),
+      weak_ptr_factory_(this) {
+  DCHECK(delegate_);
+}
+
+EventAutoRepeatHandler::~EventAutoRepeatHandler() {}
+
+bool EventAutoRepeatHandler::IsAutoRepeatEnabled() {
+  return auto_repeat_enabled_;
+}
+
+void EventAutoRepeatHandler::SetAutoRepeatEnabled(bool enabled) {
+  auto_repeat_enabled_ = enabled;
+}
+
+void EventAutoRepeatHandler::SetAutoRepeatRate(
+    const base::TimeDelta& delay,
+    const base::TimeDelta& interval) {
+  repeat_delay_ = delay;
+  repeat_interval_ = interval;
+}
+
+void EventAutoRepeatHandler::GetAutoRepeatRate(base::TimeDelta* delay,
+                                               base::TimeDelta* interval) {
+  *delay = repeat_delay_;
+  *interval = repeat_interval_;
+}
+
+void EventAutoRepeatHandler::UpdateKeyRepeat(unsigned int key,
+                                             bool down,
+                                             bool suppress_auto_repeat,
+                                             int device_id) {
+  if (!auto_repeat_enabled_ || suppress_auto_repeat)
+    StopKeyRepeat();
+  else if (key != repeat_key_ && down)
+    StartKeyRepeat(key, device_id);
+  else if (key == repeat_key_ && !down)
+    StopKeyRepeat();
+}
+
+void EventAutoRepeatHandler::StartKeyRepeat(unsigned int key, int device_id) {
+  repeat_key_ = key;
+  repeat_device_id_ = device_id;
+  repeat_sequence_++;
+
+  ScheduleKeyRepeat(repeat_delay_);
+}
+
+void EventAutoRepeatHandler::StopKeyRepeat() {
+  repeat_key_ = KEY_RESERVED;
+  repeat_sequence_++;
+}
+
+void EventAutoRepeatHandler::ScheduleKeyRepeat(const base::TimeDelta& delay) {
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&EventAutoRepeatHandler::OnRepeatTimeout,
+                     weak_ptr_factory_.GetWeakPtr(), repeat_sequence_),
+      delay);
+}
+
+void EventAutoRepeatHandler::OnRepeatTimeout(unsigned int sequence) {
+  if (repeat_sequence_ != sequence)
+    return;
+
+  // Post a task behind any pending key releases in the message loop
+  // FIFO. This ensures there's no spurious repeats during periods of UI
+  // thread jank.
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(&EventAutoRepeatHandler::OnRepeatCommit,
+                     weak_ptr_factory_.GetWeakPtr(), repeat_sequence_));
+}
+
+void EventAutoRepeatHandler::OnRepeatCommit(unsigned int sequence) {
+  if (repeat_sequence_ != sequence)
+    return;
+
+  delegate_->DispatchKey(repeat_key_, true /* down */, true /* repeat */,
+                         EventTimeForNow(), repeat_device_id_);
+
+  ScheduleKeyRepeat(repeat_interval_);
+}
+
+}  // namespace ui
diff --git a/ui/events/ozone/evdev/event_auto_repeat_handler.h b/ui/events/ozone/evdev/event_auto_repeat_handler.h
new file mode 100644
index 0000000..1be980e
--- /dev/null
+++ b/ui/events/ozone/evdev/event_auto_repeat_handler.h
@@ -0,0 +1,67 @@
+// 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 UI_EVENTS_OZONE_EVDEV_EVENT_AUTO_REPEAT_HANDLER_H
+#define UI_EVENTS_OZONE_EVDEV_EVENT_AUTO_REPEAT_HANDLER_H
+
+#include <linux/input.h>
+
+#include "base/callback.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "ui/events/events_export.h"
+
+namespace ui {
+
+class EVENTS_EXPORT EventAutoRepeatHandler {
+ public:
+  class Delegate {
+   public:
+    virtual void DispatchKey(unsigned int key,
+                             bool down,
+                             bool repeat,
+                             base::TimeTicks timestamp,
+                             int device_id) = 0;
+  };
+
+  explicit EventAutoRepeatHandler(Delegate* delegate);
+  ~EventAutoRepeatHandler();
+
+  void UpdateKeyRepeat(unsigned int key,
+                       bool down,
+                       bool suppress_auto_repeat,
+                       int device_id);
+
+  // Configuration for key repeat.
+  bool IsAutoRepeatEnabled();
+  void SetAutoRepeatEnabled(bool enabled);
+  void SetAutoRepeatRate(const base::TimeDelta& delay,
+                         const base::TimeDelta& interval);
+  void GetAutoRepeatRate(base::TimeDelta* delay, base::TimeDelta* interval);
+
+ private:
+  void StartKeyRepeat(unsigned int key, int device_id);
+  void StopKeyRepeat();
+  void ScheduleKeyRepeat(const base::TimeDelta& delay);
+  void OnRepeatTimeout(unsigned int sequence);
+  void OnRepeatCommit(unsigned int sequence);
+
+  // Key repeat state.
+  bool auto_repeat_enabled_ = true;
+  unsigned int repeat_key_ = KEY_RESERVED;
+  unsigned int repeat_sequence_ = 0;
+  int repeat_device_id_ = 0;
+  base::TimeDelta repeat_delay_;
+  base::TimeDelta repeat_interval_;
+
+  Delegate* delegate_ = nullptr;
+
+  base::WeakPtrFactory<EventAutoRepeatHandler> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(EventAutoRepeatHandler);
+};
+
+}  // namespace ui
+
+#endif  // UI_EVENTS_OZONE_EVDEV_EVENT_AUTO_REPEAT_HANDLER_H
diff --git a/ui/events/ozone/evdev/keyboard_evdev.cc b/ui/events/ozone/evdev/keyboard_evdev.cc
index 23b738d9..58921f2d 100644
--- a/ui/events/ozone/evdev/keyboard_evdev.cc
+++ b/ui/events/ozone/evdev/keyboard_evdev.cc
@@ -19,23 +19,14 @@
 
 namespace ui {
 
-namespace {
-
-const int kRepeatDelayMs = 500;
-const int kRepeatIntervalMs = 50;
-
-}  // namespace
-
 KeyboardEvdev::KeyboardEvdev(EventModifiers* modifiers,
                              KeyboardLayoutEngine* keyboard_layout_engine,
                              const EventDispatchCallback& callback)
     : callback_(callback),
       modifiers_(modifiers),
       keyboard_layout_engine_(keyboard_layout_engine),
-      weak_ptr_factory_(this) {
-  repeat_delay_ = base::TimeDelta::FromMilliseconds(kRepeatDelayMs);
-  repeat_interval_ = base::TimeDelta::FromMilliseconds(kRepeatIntervalMs);
-}
+      auto_repeat_handler_(this),
+      weak_ptr_factory_(this) {}
 
 KeyboardEvdev::~KeyboardEvdev() {
 }
@@ -54,7 +45,8 @@
     return;  // Key already released.
 
   key_state_.set(key, down);
-  UpdateKeyRepeat(key, down, suppress_auto_repeat, device_id);
+  auto_repeat_handler_.UpdateKeyRepeat(key, down, suppress_auto_repeat,
+                                       device_id);
   DispatchKey(key, down, is_repeat, timestamp, device_id);
 }
 
@@ -67,23 +59,21 @@
 }
 
 bool KeyboardEvdev::IsAutoRepeatEnabled() {
-  return auto_repeat_enabled_;
+  return auto_repeat_handler_.IsAutoRepeatEnabled();
 }
 
 void KeyboardEvdev::SetAutoRepeatEnabled(bool enabled) {
-  auto_repeat_enabled_ = enabled;
+  auto_repeat_handler_.SetAutoRepeatEnabled(enabled);
 }
 
 void KeyboardEvdev::SetAutoRepeatRate(const base::TimeDelta& delay,
                                       const base::TimeDelta& interval) {
-  repeat_delay_ = delay;
-  repeat_interval_ = interval;
+  auto_repeat_handler_.SetAutoRepeatRate(delay, interval);
 }
 
 void KeyboardEvdev::GetAutoRepeatRate(base::TimeDelta* delay,
                                       base::TimeDelta* interval) {
-  *delay = repeat_delay_;
-  *interval = repeat_interval_;
+  auto_repeat_handler_.GetAutoRepeatRate(delay, interval);
 }
 
 bool KeyboardEvdev::SetCurrentLayoutByName(const std::string& layout_name) {
@@ -135,62 +125,6 @@
   }
 }
 
-void KeyboardEvdev::UpdateKeyRepeat(unsigned int key,
-                                    bool down,
-                                    bool suppress_auto_repeat,
-                                    int device_id) {
-  if (!auto_repeat_enabled_ || suppress_auto_repeat)
-    StopKeyRepeat();
-  else if (key != repeat_key_ && down)
-    StartKeyRepeat(key, device_id);
-  else if (key == repeat_key_ && !down)
-    StopKeyRepeat();
-}
-
-void KeyboardEvdev::StartKeyRepeat(unsigned int key, int device_id) {
-  repeat_key_ = key;
-  repeat_device_id_ = device_id;
-  repeat_sequence_++;
-
-  ScheduleKeyRepeat(repeat_delay_);
-}
-
-void KeyboardEvdev::StopKeyRepeat() {
-  repeat_key_ = KEY_RESERVED;
-  repeat_sequence_++;
-}
-
-void KeyboardEvdev::ScheduleKeyRepeat(const base::TimeDelta& delay) {
-  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&KeyboardEvdev::OnRepeatTimeout,
-                     weak_ptr_factory_.GetWeakPtr(), repeat_sequence_),
-      delay);
-}
-
-void KeyboardEvdev::OnRepeatTimeout(unsigned int sequence) {
-  if (repeat_sequence_ != sequence)
-    return;
-
-  // Post a task behind any pending key releases in the message loop
-  // FIFO. This ensures there's no spurious repeats during periods of UI
-  // thread jank.
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&KeyboardEvdev::OnRepeatCommit,
-                     weak_ptr_factory_.GetWeakPtr(), repeat_sequence_));
-}
-
-void KeyboardEvdev::OnRepeatCommit(unsigned int sequence) {
-  if (repeat_sequence_ != sequence)
-    return;
-
-  DispatchKey(repeat_key_, true /* down */, true /* repeat */,
-              EventTimeForNow(), repeat_device_id_);
-
-  ScheduleKeyRepeat(repeat_interval_);
-}
-
 void KeyboardEvdev::DispatchKey(unsigned int key,
                                 bool down,
                                 bool repeat,
diff --git a/ui/events/ozone/evdev/keyboard_evdev.h b/ui/events/ozone/evdev/keyboard_evdev.h
index 4a6f59bf..1b8521a 100644
--- a/ui/events/ozone/evdev/keyboard_evdev.h
+++ b/ui/events/ozone/evdev/keyboard_evdev.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "ui/events/ozone/evdev/event_auto_repeat_handler.h"
 #include "ui/events/ozone/evdev/event_device_util.h"
 #include "ui/events/ozone/evdev/event_dispatch_callback.h"
 #include "ui/events/ozone/evdev/events_ozone_evdev_export.h"
@@ -28,7 +29,8 @@
 // one logical keyboard, applying modifiers & implementing key repeat.
 //
 // It also currently also applies the layout.
-class EVENTS_OZONE_EVDEV_EXPORT KeyboardEvdev {
+class EVENTS_OZONE_EVDEV_EXPORT KeyboardEvdev
+    : public EventAutoRepeatHandler::Delegate {
  public:
   KeyboardEvdev(EventModifiers* modifiers,
                 KeyboardLayoutEngine* keyboard_layout_engine,
@@ -65,20 +67,13 @@
   void UpdateModifier(int modifier_flag, bool down);
   void RefreshModifiers();
   void UpdateCapsLockLed();
-  void UpdateKeyRepeat(unsigned int key,
-                       bool down,
-                       bool suppress_auto_repeat,
-                       int device_id);
-  void StartKeyRepeat(unsigned int key, int device_id);
-  void StopKeyRepeat();
-  void ScheduleKeyRepeat(const base::TimeDelta& delay);
-  void OnRepeatTimeout(unsigned int sequence);
-  void OnRepeatCommit(unsigned int sequence);
+
+  // EventAutoRepeatHandler::Delegate
   void DispatchKey(unsigned int key,
                    bool down,
                    bool repeat,
                    base::TimeTicks timestamp,
-                   int device_id);
+                   int device_id) override;
 
   // Aggregated key state. There is only one bit of state per key; we do not
   // attempt to count presses of the same key on multiple keyboards.
@@ -98,13 +93,8 @@
   // Shared layout engine.
   KeyboardLayoutEngine* keyboard_layout_engine_;
 
-  // Key repeat state.
-  bool auto_repeat_enabled_ = true;
-  unsigned int repeat_key_ = KEY_RESERVED;
-  unsigned int repeat_sequence_ = 0;
-  int repeat_device_id_ = 0;
-  base::TimeDelta repeat_delay_;
-  base::TimeDelta repeat_interval_;
+  // Key repeat handler.
+  EventAutoRepeatHandler auto_repeat_handler_;
 
   base::WeakPtrFactory<KeyboardEvdev> weak_ptr_factory_;
 
diff --git a/ui/gl/test/gl_image_test_support.cc b/ui/gl/test/gl_image_test_support.cc
index 675d383..fb4dcf42 100644
--- a/ui/gl/test/gl_image_test_support.cc
+++ b/ui/gl/test/gl_image_test_support.cc
@@ -24,6 +24,7 @@
 #if defined(USE_OZONE)
   ui::OzonePlatform::InitParams params;
   params.single_process = true;
+  params.using_mojo = true;
   ui::OzonePlatform::InitializeForGPU(params);
 #endif
 
diff --git a/ui/gl/test/gl_surface_test_support.cc b/ui/gl/test/gl_surface_test_support.cc
index e4039b6..a1cab69 100644
--- a/ui/gl/test/gl_surface_test_support.cc
+++ b/ui/gl/test/gl_surface_test_support.cc
@@ -37,6 +37,7 @@
   ui::OzonePlatform::InitParams params;
   params.single_process = true;
   ui::OzonePlatform::InitializeForGPU(params);
+  ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
 #endif
 
   ui::test::EnableTestConfigForPlatformWindows();
@@ -116,6 +117,7 @@
   ui::OzonePlatform::InitParams params;
   params.single_process = true;
   ui::OzonePlatform::InitializeForGPU(params);
+  ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
 #endif
 
   InitializeOneOffImplementation(kGLImplementationMockGL, false);
@@ -126,6 +128,7 @@
   ui::OzonePlatform::InitParams params;
   params.single_process = true;
   ui::OzonePlatform::InitializeForGPU(params);
+  ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
 #endif
 
   InitializeOneOffImplementation(kGLImplementationStubGL, false);
diff --git a/ui/message_center/views/message_popup_collection.cc b/ui/message_center/views/message_popup_collection.cc
index 7e0e760a..f3054dc 100644
--- a/ui/message_center/views/message_popup_collection.cc
+++ b/ui/message_center/views/message_popup_collection.cc
@@ -170,10 +170,6 @@
     // Create top-level notification.
     MessageView* view = MessageViewFactory::Create(notification, true);
     observed_views_.Add(view);
-#if defined(OS_CHROMEOS)
-    // Disable pinned feature since this is a popup.
-    view->set_force_disable_pinned();
-#endif  // defined(OS_CHROMEOS)
     view->SetExpanded(true);
 
 #if !defined(OS_CHROMEOS)
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc
index 25904ad0..b28d5078 100644
--- a/ui/message_center/views/message_view.cc
+++ b/ui/message_center/views/message_view.cc
@@ -96,8 +96,7 @@
   UpdateWithNotification(notification);
 }
 
-MessageView::~MessageView() {
-}
+MessageView::~MessageView() {}
 
 void MessageView::UpdateWithNotification(const Notification& notification) {
   pinned_ = notification.pinned();
@@ -274,7 +273,9 @@
 }
 
 bool MessageView::GetPinned() const {
-  return pinned_ && !force_disable_pinned_;
+  // Only nested notifications can be pinned. Standalones (i.e. popups) can't
+  // be.
+  return pinned_ && is_nested_;
 }
 
 void MessageView::OnCloseButtonPressed() {
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h
index f899d64d..0efc0f4 100644
--- a/ui/message_center/views/message_view.h
+++ b/ui/message_center/views/message_view.h
@@ -94,11 +94,6 @@
   void set_scroller(views::ScrollView* scroller) { scroller_ = scroller; }
   std::string notification_id() const { return notification_id_; }
 
-#if defined(OS_CHROMEOS)
-  // By calling this, all notifications are treated as non-pinned forcibly.
-  void set_force_disable_pinned() { force_disable_pinned_ = true; }
-#endif
-
   bool manually_expanded_or_collapsed() const {
     return manually_expanded_or_collapsed_;
   }
@@ -129,9 +124,6 @@
 
   // Flag if the notification is set to pinned or not.
   bool pinned_ = false;
-  // Flag if pin is forcibly disabled on this view. If true, the view is never
-  // pinned regardless of the value of |pinned_|.
-  bool force_disable_pinned_ = false;
 
   // True if the notification is expanded/collapsed by user interaction.
   // If true, MessagePopupCollection will not auto-collapse the notification.
diff --git a/ui/message_center/views/notification_view_unittest.cc b/ui/message_center/views/notification_view_unittest.cc
index dcd68529..4ed7ff8 100644
--- a/ui/message_center/views/notification_view_unittest.cc
+++ b/ui/message_center/views/notification_view_unittest.cc
@@ -671,6 +671,7 @@
       ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
 
   notification()->set_pinned(true);
+  notification_view()->SetIsNested();
   UpdateNotificationViews();
   std::string notification_id = notification()->id();
 
@@ -682,12 +683,11 @@
   EXPECT_FALSE(IsRemoved(notification_id));
 }
 
-TEST_F(NotificationViewTest, SlideOutForceDisablePinned) {
+TEST_F(NotificationViewTest, PopupsCantPin) {
   ui::ScopedAnimationDurationScaleMode zero_duration_scope(
       ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
 
   notification()->set_pinned(true);
-  notification_view()->set_force_disable_pinned();
   UpdateNotificationViews();
   std::string notification_id = notification()->id();
 
@@ -711,13 +711,14 @@
 }
 
 TEST_F(NotificationViewTest, Pinned) {
+  // Notifications are popups by default (can't be pinned).
   notification()->set_pinned(true);
   UpdateNotificationViews();
-  EXPECT_EQ(NULL, GetCloseButton());
-
-  notification_view()->set_force_disable_pinned();
-  UpdateNotificationViews();
   EXPECT_TRUE(GetCloseButton());
+
+  notification_view()->SetIsNested();
+  UpdateNotificationViews();
+  EXPECT_FALSE(GetCloseButton());
 }
 
 #endif // defined(OS_CHROMEOS)
diff --git a/ui/ozone/demo/ozone_demo.cc b/ui/ozone/demo/ozone_demo.cc
index 38d3c919..9598ed8 100644
--- a/ui/ozone/demo/ozone_demo.cc
+++ b/ui/ozone/demo/ozone_demo.cc
@@ -206,6 +206,7 @@
   ui::OzonePlatform::InitParams params;
   params.single_process = true;
   ui::OzonePlatform::InitializeForGPU(params);
+  ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
 
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (!command_line->HasSwitch(kDisableGpu) && gl::init::InitializeGLOneOff() &&
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn
index 3eee627..99fc0d66 100644
--- a/ui/ozone/platform/drm/BUILD.gn
+++ b/ui/ozone/platform/drm/BUILD.gn
@@ -81,6 +81,8 @@
     "gpu/screen_manager.h",
     "host/drm_cursor.cc",
     "host/drm_cursor.h",
+    "host/drm_device_connector.cc",
+    "host/drm_device_connector.h",
     "host/drm_device_handle.cc",
     "host/drm_device_handle.h",
     "host/drm_display_host.cc",
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc
index a00011f..eb840a7 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -78,16 +78,18 @@
 }  // namespace
 
 DrmThread::DrmThread()
-    : base::Thread("DrmThread"), binding_(this), weak_ptr_factory_(this) {}
+    : base::Thread("DrmThread"), drm_binding_(this), weak_ptr_factory_(this) {}
 
 DrmThread::~DrmThread() {
   Stop();
 }
 
-void DrmThread::Start() {
+void DrmThread::Start(base::OnceClosure binding_completer) {
+  complete_early_binding_requests_ = std::move(binding_completer);
   base::Thread::Options thread_options;
   thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
   thread_options.priority = base::ThreadPriority::DISPLAY;
+
   if (!StartWithOptions(thread_options))
     LOG(FATAL) << "Failed to create DRM thread";
 }
@@ -104,6 +106,13 @@
 
   display_manager_.reset(
       new DrmGpuDisplayManager(screen_manager_.get(), device_manager_.get()));
+
+  DCHECK(task_runner())
+      << "DrmThread::Init -- thread doesn't have a task_runner";
+
+  // DRM thread is running now so can safely handle binding requests. So drain
+  // the queue of as-yet unhandled binding requests if there are any.
+  std::move(complete_early_binding_requests_).Run();
 }
 
 void DrmThread::CreateBuffer(gfx::AcceleratedWidget widget,
@@ -343,12 +352,12 @@
 // be used from multiple threads in multiple processes.
 void DrmThread::AddBindingCursorDevice(
     ozone::mojom::DeviceCursorRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+  cursor_bindings_.AddBinding(this, std::move(request));
 }
 
 void DrmThread::AddBindingDrmDevice(ozone::mojom::DrmDeviceRequest request) {
   TRACE_EVENT0("drm", "DrmThread::AddBindingDrmDevice");
-  binding_.Bind(std::move(request));
+  drm_binding_.Bind(std::move(request));
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.h b/ui/ozone/platform/drm/gpu/drm_thread.h
index 5c0dcad..ea944803 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.h
+++ b/ui/ozone/platform/drm/gpu/drm_thread.h
@@ -62,7 +62,7 @@
   DrmThread();
   ~DrmThread() override;
 
-  void Start();
+  void Start(base::OnceClosure binding_completer);
 
   // Must be called on the DRM thread. All methods for use from the GPU thread.
   // DrmThreadProxy (on GPU)thread) is the client for these methods.
@@ -150,12 +150,14 @@
   std::unique_ptr<ScreenManager> screen_manager_;
   std::unique_ptr<DrmGpuDisplayManager> display_manager_;
 
+  base::OnceClosure complete_early_binding_requests_;
+
   // The mojo implementation requires a BindingSet because the DrmThread serves
   // requests from two different client threads.
-  mojo::BindingSet<ozone::mojom::DeviceCursor> bindings_;
+  mojo::BindingSet<ozone::mojom::DeviceCursor> cursor_bindings_;
 
   // The mojo implementation of DrmDevice can use a simple binding.
-  mojo::Binding<ozone::mojom::DrmDevice> binding_;
+  mojo::Binding<ozone::mojom::DrmDevice> drm_binding_;
 
   base::WeakPtrFactory<DrmThread> weak_ptr_factory_;
 
diff --git a/ui/ozone/platform/drm/gpu/drm_thread_message_proxy.cc b/ui/ozone/platform/drm/gpu/drm_thread_message_proxy.cc
index 24a88ec..6e1d4a74 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread_message_proxy.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread_message_proxy.cc
@@ -26,10 +26,6 @@
 
 void DrmThreadMessageProxy::OnFilterAdded(IPC::Channel* channel) {
   sender_ = channel;
-
-  // The DRM thread needs to be started late since we need to wait for the
-  // sandbox to start.
-  drm_thread_->Start();
 }
 
 bool DrmThreadMessageProxy::OnMessageReceived(const IPC::Message& message) {
diff --git a/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc b/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc
index bdc798c..2bad52d 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc
@@ -17,13 +17,15 @@
 
 DrmThreadProxy::~DrmThreadProxy() {}
 
+// Used only with the paramtraits implementation.
 void DrmThreadProxy::BindThreadIntoMessagingProxy(
     InterThreadMessagingProxy* messaging_proxy) {
   messaging_proxy->SetDrmThread(&drm_thread_);
 }
 
-void DrmThreadProxy::StartDrmThread() {
-  drm_thread_.Start();
+// Used only for the mojo implementation.
+void DrmThreadProxy::StartDrmThread(base::OnceClosure binding_drainer) {
+  drm_thread_.Start(std::move(binding_drainer));
 }
 
 std::unique_ptr<DrmWindowProxy> DrmThreadProxy::CreateDrmWindowProxy(
@@ -36,7 +38,10 @@
     const gfx::Size& size,
     gfx::BufferFormat format,
     gfx::BufferUsage usage) {
+  DCHECK(drm_thread_.task_runner())
+      << "no task runner! in DrmThreadProxy::CreateBuffer";
   scoped_refptr<GbmBuffer> buffer;
+
   PostSyncTask(
       drm_thread_.task_runner(),
       base::Bind(&DrmThread::CreateBuffer, base::Unretained(&drm_thread_),
@@ -77,6 +82,9 @@
 
 void DrmThreadProxy::AddBindingDrmDevice(
     ozone::mojom::DrmDeviceRequest request) {
+  DCHECK(drm_thread_.task_runner()) << "DrmThreadProxy::AddBindingDrmDevice "
+                                       "drm_thread_ task runner missing";
+
   drm_thread_.task_runner()->PostTask(
       FROM_HERE,
       base::Bind(&DrmThread::AddBindingDrmDevice,
diff --git a/ui/ozone/platform/drm/gpu/drm_thread_proxy.h b/ui/ozone/platform/drm/gpu/drm_thread_proxy.h
index c8a0b4b..d46de5a 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread_proxy.h
+++ b/ui/ozone/platform/drm/gpu/drm_thread_proxy.h
@@ -27,7 +27,7 @@
 
   void BindThreadIntoMessagingProxy(InterThreadMessagingProxy* messaging_proxy);
 
-  void StartDrmThread();
+  void StartDrmThread(base::OnceClosure binding_drainer);
 
   std::unique_ptr<DrmWindowProxy> CreateDrmWindowProxy(
       gfx::AcceleratedWidget widget);
diff --git a/ui/ozone/platform/drm/host/drm_device_connector.cc b/ui/ozone/platform/drm/host/drm_device_connector.cc
new file mode 100644
index 0000000..c0468196
--- /dev/null
+++ b/ui/ozone/platform/drm/host/drm_device_connector.cc
@@ -0,0 +1,101 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/drm/host/drm_device_connector.h"
+
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+#include "services/service_manager/public/cpp/connector.h"
+#include "services/ui/public/interfaces/constants.mojom.h"
+#include "ui/ozone/platform/drm/host/host_drm_device.h"
+#include "ui/ozone/public/gpu_platform_support_host.h"
+
+namespace {
+// TODO(rjkroege): In the future when ozone/drm is always mojo-based, remove
+// this utility code.
+using BinderCallback = ui::GpuPlatformSupportHost::GpuHostBindInterfaceCallback;
+
+void BindInterfaceInGpuProcess(const std::string& interface_name,
+                               mojo::ScopedMessagePipeHandle interface_pipe,
+                               const BinderCallback& binder_callback) {
+  return binder_callback.Run(interface_name, std::move(interface_pipe));
+}
+
+template <typename Interface>
+void BindInterfaceInGpuProcess(mojo::InterfaceRequest<Interface> request,
+                               const BinderCallback& binder_callback) {
+  BindInterfaceInGpuProcess(
+      Interface::Name_, std::move(request.PassMessagePipe()), binder_callback);
+}
+
+}  // namespace
+
+namespace ui {
+
+DrmDeviceConnector::DrmDeviceConnector(
+    service_manager::Connector* connector,
+    scoped_refptr<HostDrmDevice> host_drm_device_)
+    : connector_(connector), host_drm_device_(host_drm_device_) {}
+
+DrmDeviceConnector::~DrmDeviceConnector() {}
+
+void DrmDeviceConnector::OnGpuProcessLaunched(
+    int host_id,
+    scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
+    scoped_refptr<base::SingleThreadTaskRunner> send_runner,
+    const base::RepeatingCallback<void(IPC::Message*)>& send_callback) {
+  NOTREACHED();
+}
+
+void DrmDeviceConnector::OnChannelDestroyed(int host_id) {
+  // TODO(rjkroege): Handle Viz restarting.
+  NOTIMPLEMENTED();
+}
+
+void DrmDeviceConnector::OnGpuServiceLaunched(
+    scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
+    scoped_refptr<base::SingleThreadTaskRunner> io_runner,
+    GpuHostBindInterfaceCallback binder) {
+  // We need to preserve |binder| to let us bind interfaces later.
+  binder_callback_ = std::move(binder);
+
+  ui::ozone::mojom::DrmDevicePtr drm_device_ptr;
+  BindInterfaceDrmDevice(&drm_device_ptr);
+  ui::ozone::mojom::DeviceCursorPtr cursor_ptr_ui, cursor_ptr_io;
+  BindInterfaceDeviceCursor(&cursor_ptr_ui);
+  BindInterfaceDeviceCursor(&cursor_ptr_io);
+
+  ui_runner->PostTask(
+      FROM_HERE,
+      base::BindOnce(&HostDrmDevice::OnGpuServiceLaunched, host_drm_device_,
+                     std::move(drm_device_ptr), std::move(cursor_ptr_ui),
+                     std::move(cursor_ptr_io)));
+}
+
+void DrmDeviceConnector::OnMessageReceived(const IPC::Message& message) {
+  NOTREACHED() << "This class should only be used with mojo transport but here "
+                  "we're wrongly getting invoked to handle IPC communication.";
+}
+
+void DrmDeviceConnector::BindInterfaceDrmDevice(
+    ui::ozone::mojom::DrmDevicePtr* drm_device_ptr) const {
+  if (connector_) {
+    connector_->BindInterface(ui::mojom::kServiceName, drm_device_ptr);
+  } else {
+    auto request = mojo::MakeRequest(drm_device_ptr);
+    BindInterfaceInGpuProcess(std::move(request), binder_callback_);
+  }
+}
+
+void DrmDeviceConnector::BindInterfaceDeviceCursor(
+    ui::ozone::mojom::DeviceCursorPtr* cursor_ptr) const {
+  if (connector_) {
+    connector_->BindInterface(ui::mojom::kServiceName, cursor_ptr);
+  } else {
+    auto request = mojo::MakeRequest(cursor_ptr);
+    BindInterfaceInGpuProcess(std::move(request), binder_callback_);
+  }
+}
+
+}  // namespace ui
\ No newline at end of file
diff --git a/ui/ozone/platform/drm/host/drm_device_connector.h b/ui/ozone/platform/drm/host/drm_device_connector.h
new file mode 100644
index 0000000..c717662
--- /dev/null
+++ b/ui/ozone/platform/drm/host/drm_device_connector.h
@@ -0,0 +1,70 @@
+// Copyright 2018 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 UI_OZONE_PLATFORM_DRM_HOST_DRM_DEVICE_CONNECTOR_H_
+#define UI_OZONE_PLATFORM_DRM_HOST_DRM_DEVICE_CONNECTOR_H_
+
+#include "ui/ozone/public/gpu_platform_support_host.h"
+#include "ui/ozone/public/interfaces/device_cursor.mojom.h"
+#include "ui/ozone/public/interfaces/drm_device.mojom.h"
+
+namespace service_manager {
+class Connector;
+}
+
+namespace ui {
+class HostDrmDevice;
+
+// DrmDeviceConnector sets up mojo pipes connecting the Viz host to the DRM
+// service. It operates in two modes: running on the I/O thread when invoked
+// from content and running on the VizHost main thread when operating with a
+// service_manager.
+class DrmDeviceConnector : public GpuPlatformSupportHost {
+ public:
+  DrmDeviceConnector(service_manager::Connector* connector,
+                     scoped_refptr<HostDrmDevice> host_drm_device_);
+  ~DrmDeviceConnector() override;
+
+  // GpuPlatformSupportHost:
+  void OnGpuProcessLaunched(
+      int host_id,
+      scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> send_runner,
+      const base::RepeatingCallback<void(IPC::Message*)>& send_callback)
+      override;
+  void OnChannelDestroyed(int host_id) override;
+  void OnMessageReceived(const IPC::Message& message) override;
+  void OnGpuServiceLaunched(
+      scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> io_runner,
+      GpuHostBindInterfaceCallback binder) override;
+
+  // BindInterface arranges for the drm_device_ptr to be connected.
+  void BindInterfaceDrmDevice(
+      ui::ozone::mojom::DrmDevicePtr* drm_device_ptr) const;
+
+  // BindInterface arranges for the cursor_ptr to be wired up.
+  void BindInterfaceDeviceCursor(
+      ui::ozone::mojom::DeviceCursorPtr* cursor_ptr) const;
+
+  // BindableNow returns true if this DrmDeviceConnector is capable of binding a
+  // mojo endpoint for the DrmDevice service.
+  bool BindableNow() const { return !!connector_; }
+
+ private:
+  // This will be present if the Viz host has a service manager.
+  service_manager::Connector* connector_;
+
+  // This will be used if we are operating under content/gpu without a service
+  // manager.
+  GpuHostBindInterfaceCallback binder_callback_;
+
+  scoped_refptr<HostDrmDevice> host_drm_device_;
+
+  DISALLOW_COPY_AND_ASSIGN(DrmDeviceConnector);
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_DRM_HOST_DRM_DEVICE_CONNECTOR_H_
\ No newline at end of file
diff --git a/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.cc b/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.cc
index c8267a2..df8585d 100644
--- a/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.cc
+++ b/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.cc
@@ -117,6 +117,14 @@
   return host_id_ >= 0 && channel_established_;
 }
 
+void DrmGpuPlatformSupportHost::OnGpuServiceLaunched(
+    scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
+    scoped_refptr<base::SingleThreadTaskRunner> io_runner,
+    GpuHostBindInterfaceCallback binder) {
+  NOTREACHED() << "DrmGpuPlatformSupportHost::OnGpuServiceLaunched shouldn't "
+                  "be used with pre-mojo IPC";
+}
+
 void DrmGpuPlatformSupportHost::OnGpuProcessLaunched(
     int host_id,
     scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
diff --git a/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.h b/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.h
index 1de15ce..ebcb9d5e 100644
--- a/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.h
+++ b/ui/ozone/platform/drm/host/drm_gpu_platform_support_host.h
@@ -41,6 +41,10 @@
       scoped_refptr<base::SingleThreadTaskRunner> send_runner,
       const base::Callback<void(IPC::Message*)>& send_callback) override;
   void OnChannelDestroyed(int host_id) override;
+  void OnGpuServiceLaunched(
+      scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> io_runner,
+      GpuHostBindInterfaceCallback binder) override;
 
   void OnMessageReceived(const IPC::Message& message) override;
 
diff --git a/ui/ozone/platform/drm/host/host_cursor_proxy.cc b/ui/ozone/platform/drm/host/host_cursor_proxy.cc
index ba5baeec..fa2880d 100644
--- a/ui/ozone/platform/drm/host/host_cursor_proxy.cc
+++ b/ui/ozone/platform/drm/host/host_cursor_proxy.cc
@@ -6,15 +6,17 @@
 
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/ui/public/interfaces/constants.mojom.h"
+#include "ui/ozone/public/gpu_platform_support_host.h"
 
 namespace ui {
 
-// We assume that this is invoked only on the UI thread.
-HostCursorProxy::HostCursorProxy(service_manager::Connector* connector)
-    : connector_(connector->Clone()) {
-  ui_thread_ref_ = base::PlatformThread::CurrentRef();
-  connector->BindInterface(ui::mojom::kServiceName, &main_cursor_ptr_);
-}
+// We assume that this is invoked only on the Mus/UI thread.
+HostCursorProxy::HostCursorProxy(
+    ui::ozone::mojom::DeviceCursorPtr main_cursor_ptr,
+    ui::ozone::mojom::DeviceCursorPtr evdev_cursor_ptr)
+    : main_cursor_ptr_(std::move(main_cursor_ptr)),
+      evdev_cursor_ptr_(std::move(evdev_cursor_ptr)),
+      ui_thread_ref_(base::PlatformThread::CurrentRef()) {}
 
 HostCursorProxy::~HostCursorProxy() {}
 
@@ -46,8 +48,14 @@
 // when the GpuThread/DrmThread pair are once again running), we need to run it
 // on cursor motions.
 void HostCursorProxy::InitializeOnEvdevIfNecessary() {
+  // TODO(rjkroege): Rebind on Viz process restart.
+  if (evdev_bound_)
+    return;
+
   if (ui_thread_ref_ != base::PlatformThread::CurrentRef()) {
-    connector_->BindInterface(ui::mojom::kServiceName, &evdev_cursor_ptr_);
+    // Rebind the mojo pipe on the current thread. We expect this to be the
+    // thread running EVDEV.
+    evdev_cursor_ptr_.Bind(evdev_cursor_ptr_.PassInterface());
   }
 }
 
diff --git a/ui/ozone/platform/drm/host/host_cursor_proxy.h b/ui/ozone/platform/drm/host/host_cursor_proxy.h
index 42feece..87115dd 100644
--- a/ui/ozone/platform/drm/host/host_cursor_proxy.h
+++ b/ui/ozone/platform/drm/host/host_cursor_proxy.h
@@ -9,10 +9,6 @@
 #include "ui/ozone/platform/drm/host/drm_cursor.h"
 #include "ui/ozone/public/interfaces/device_cursor.mojom.h"
 
-namespace service_manager {
-class Connector;
-}
-
 namespace ui {
 
 // Ozone requires a IPC from the browser (or mus-ws) process to the gpu (or
@@ -22,7 +18,8 @@
 // priviledged process.
 class HostCursorProxy : public DrmCursorProxy {
  public:
-  explicit HostCursorProxy(service_manager::Connector* connector);
+  HostCursorProxy(ui::ozone::mojom::DeviceCursorPtr main_cursor_ptr,
+                  ui::ozone::mojom::DeviceCursorPtr evdev_cursor_ptr);
   ~HostCursorProxy() override;
 
  private:
@@ -34,13 +31,13 @@
   void Move(gfx::AcceleratedWidget window, const gfx::Point& point) override;
   void InitializeOnEvdevIfNecessary() override;
 
-  std::unique_ptr<service_manager::Connector> connector_;
-
   // Mojo implementation of the DrmCursorProxy.
-  ui::ozone::mojom::DeviceCursorPtr main_cursor_ptr_;
-  ui::ozone::mojom::DeviceCursorPtr evdev_cursor_ptr_;
+  ui::ozone::mojom::DeviceCursorPtr main_cursor_ptr_ = nullptr;
+  ui::ozone::mojom::DeviceCursorPtr evdev_cursor_ptr_ = nullptr;
 
   base::PlatformThreadRef ui_thread_ref_;
+  bool evdev_bound_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(HostCursorProxy);
 };
 
diff --git a/ui/ozone/platform/drm/host/host_drm_device.cc b/ui/ozone/platform/drm/host/host_drm_device.cc
index 9d1311b..682942ae 100644
--- a/ui/ozone/platform/drm/host/host_drm_device.cc
+++ b/ui/ozone/platform/drm/host/host_drm_device.cc
@@ -13,19 +13,15 @@
 #include "services/ui/public/interfaces/constants.mojom.h"
 #include "ui/display/types/display_snapshot.h"
 #include "ui/ozone/platform/drm/common/drm_util.h"
+#include "ui/ozone/platform/drm/host/drm_device_connector.h"
 #include "ui/ozone/platform/drm/host/drm_display_host_manager.h"
 #include "ui/ozone/platform/drm/host/drm_overlay_manager.h"
 #include "ui/ozone/platform/drm/host/host_cursor_proxy.h"
 
 namespace ui {
 
-HostDrmDevice::HostDrmDevice(DrmCursor* cursor,
-                             service_manager::Connector* connector)
-    : cursor_(cursor), connector_(connector), weak_ptr_factory_(this) {
-  // Bind the viz process pointer here.
-  // TODO(rjkroege): Reconnect on error as that would indicate that the Viz
-  // process has failed.
-  connector->BindInterface(ui::mojom::kServiceName, &drm_device_ptr_);
+HostDrmDevice::HostDrmDevice(DrmCursor* cursor) : cursor_(cursor) {
+  DETACH_FROM_THREAD(on_io_thread_);
 }
 
 HostDrmDevice::~HostDrmDevice() {
@@ -34,15 +30,39 @@
     observer.OnGpuThreadRetired();
 }
 
-void HostDrmDevice::AsyncStartDrmDevice() {
-  auto callback = base::BindOnce(&HostDrmDevice::OnDrmServiceStartedCallback,
-                                 weak_ptr_factory_.GetWeakPtr());
+// Setup the DRM device if we are using the ServiceManager.
+void HostDrmDevice::AsyncStartDrmDevice(const DrmDeviceConnector& connector) {
+  DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
+
+  // We bind here using the provided connector object.
+  if (!connector.BindableNow())
+    return;
+
+  connector.BindInterfaceDrmDevice(&drm_device_ptr_);
+
+  // Launch the DRM thread.
+  auto callback =
+      base::BindOnce(&HostDrmDevice::OnDrmServiceStartedCallback, this);
   drm_device_ptr_->StartDrmDevice(std::move(callback));
+
+  // Bind the cursor interface pointers.
+  ui::ozone::mojom::DeviceCursorPtr cursor_ptr_ui, cursor_ptr_io;
+  connector.BindInterfaceDeviceCursor(&cursor_ptr_ui);
+
+  // This interface pointer is bound on the wrong thread. But that's OK because
+  // we'll re-bind it the first time that it's used from the I/O thread in
+  // HostCursorProxy.
+  connector.BindInterfaceDeviceCursor(&cursor_ptr_io);
+
+  // Stash the cursor_proxy so that we can install it in the callback.
+  cursor_proxy_ = std::make_unique<HostCursorProxy>(std::move(cursor_ptr_ui),
+                                                    std::move(cursor_ptr_io));
 }
 
+// TODO(rjkroege): Remove the need for this entry point.
 void HostDrmDevice::BlockingStartDrmDevice() {
   // Wait until startup related tasks posted to this thread that must precede
-  // blocking on
+  // blocking.
   base::RunLoop().RunUntilIdle();
 
   bool success;
@@ -54,15 +74,20 @@
   return;
 }
 
+// The callback is executed in response to getting back a message from a
+// DrmDevice service that we launched earlier via ServiceManager.
 void HostDrmDevice::OnDrmServiceStartedCallback(bool success) {
   // This can be called multiple times in the course of single-threaded startup.
+  // Ignore invocations after we've started.
   if (connected_)
     return;
+
   if (success == true) {
     connected_ = true;
     RunObservers();
   }
-  // TODO(rjkroege): Handle failure of launching a viz process.
+  // TODO(rjkroege): Handle failure of launching a viz process with the
+  // ServiceManager.
 }
 
 void HostDrmDevice::ProvideManagers(DrmDisplayHostManager* display_manager,
@@ -78,10 +103,9 @@
     observer.OnGpuThreadReady();
   }
 
-  // The cursor is special since it will process input events on the IO thread
-  // and can by-pass the UI thread. This means that we need to special case it
-  // and notify it after all other observers/handlers are notified.
-  cursor_->SetDrmCursorProxy(std::make_unique<HostCursorProxy>(connector_));
+  DCHECK(cursor_proxy_)
+      << "We should have already created a cursor proxy previously";
+  cursor_->SetDrmCursorProxy(std::move(cursor_proxy_));
 
   // TODO(rjkroege): Call ResetDrmCursorProxy when the mojo connection to the
   // DRM thread is broken.
@@ -146,14 +170,15 @@
     return false;
 
   drm_device_ptr_->SetWindowBounds(widget, bounds);
+
   return true;
 }
 
 // Services needed for DrmOverlayManager.
 void HostDrmDevice::RegisterHandlerForDrmOverlayManager(
     DrmOverlayManager* handler) {
-  // TODO(rjkroege): Permit overlay manager to run in viz when the display
-  // compositor runs in viz.
+  // TODO(rjkroege): Permit overlay manager to run in Viz when the display
+  // compositor runs in Viz.
   DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
   overlay_manager_ = handler;
 }
@@ -171,11 +196,11 @@
     return false;
 
   auto callback =
-      base::BindOnce(&HostDrmDevice::GpuCheckOverlayCapabilitiesCallback,
-                     weak_ptr_factory_.GetWeakPtr());
+      base::BindOnce(&HostDrmDevice::GpuCheckOverlayCapabilitiesCallback, this);
 
   drm_device_ptr_->CheckOverlayCapabilities(widget, overlays,
                                             std::move(callback));
+
   return true;
 }
 
@@ -183,10 +208,11 @@
   DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
   if (!IsConnected())
     return false;
+
   auto callback =
-      base::BindOnce(&HostDrmDevice::GpuRefreshNativeDisplaysCallback,
-                     weak_ptr_factory_.GetWeakPtr());
+      base::BindOnce(&HostDrmDevice::GpuRefreshNativeDisplaysCallback, this);
   drm_device_ptr_->RefreshNativeDisplays(std::move(callback));
+
   return true;
 }
 
@@ -200,11 +226,11 @@
   // TODO(rjkroege): Remove the use of mode here.
   auto mode = CreateDisplayModeFromParams(pmode);
   auto callback =
-      base::BindOnce(&HostDrmDevice::GpuConfigureNativeDisplayCallback,
-                     weak_ptr_factory_.GetWeakPtr());
+      base::BindOnce(&HostDrmDevice::GpuConfigureNativeDisplayCallback, this);
 
   drm_device_ptr_->ConfigureNativeDisplay(id, std::move(mode), origin,
                                           std::move(callback));
+
   return true;
 }
 
@@ -213,9 +239,10 @@
   if (!IsConnected())
     return false;
   auto callback =
-      base::BindOnce(&HostDrmDevice::GpuDisableNativeDisplayCallback,
-                     weak_ptr_factory_.GetWeakPtr());
+      base::BindOnce(&HostDrmDevice::GpuDisableNativeDisplayCallback, this);
+
   drm_device_ptr_->DisableNativeDisplay(id, std::move(callback));
+
   return true;
 }
 
@@ -223,9 +250,11 @@
   DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
   if (!IsConnected())
     return false;
-  auto callback = base::BindOnce(&HostDrmDevice::GpuTakeDisplayControlCallback,
-                                 weak_ptr_factory_.GetWeakPtr());
+  auto callback =
+      base::BindOnce(&HostDrmDevice::GpuTakeDisplayControlCallback, this);
+
   drm_device_ptr_->TakeDisplayControl(std::move(callback));
+
   return true;
 }
 
@@ -234,9 +263,10 @@
   if (!IsConnected())
     return false;
   auto callback =
-      base::BindOnce(&HostDrmDevice::GpuRelinquishDisplayControlCallback,
-                     weak_ptr_factory_.GetWeakPtr());
+      base::BindOnce(&HostDrmDevice::GpuRelinquishDisplayControlCallback, this);
+
   drm_device_ptr_->RelinquishDisplayControl(std::move(callback));
+
   return true;
 }
 
@@ -246,7 +276,9 @@
   if (!IsConnected())
     return false;
   base::File file(fd.release());
+
   drm_device_ptr_->AddGraphicsDevice(path, std::move(file));
+
   return true;
 }
 
@@ -254,7 +286,9 @@
   DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
   if (!IsConnected())
     return false;
+
   drm_device_ptr_->RemoveGraphicsDevice(std::move(path));
+
   return true;
 }
 
@@ -262,9 +296,10 @@
   DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
   if (!IsConnected())
     return false;
-  auto callback = base::BindOnce(&HostDrmDevice::GpuGetHDCPStateCallback,
-                                 weak_ptr_factory_.GetWeakPtr());
+  auto callback = base::BindOnce(&HostDrmDevice::GpuGetHDCPStateCallback, this);
+
   drm_device_ptr_->GetHDCPState(display_id, std::move(callback));
+
   return true;
 }
 
@@ -273,9 +308,10 @@
   DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
   if (!IsConnected())
     return false;
-  auto callback = base::BindOnce(&HostDrmDevice::GpuSetHDCPStateCallback,
-                                 weak_ptr_factory_.GetWeakPtr());
+  auto callback = base::BindOnce(&HostDrmDevice::GpuSetHDCPStateCallback, this);
+
   drm_device_ptr_->SetHDCPState(display_id, state, std::move(callback));
+
   return true;
 }
 
@@ -345,4 +381,30 @@
   display_manager_->GpuUpdatedHDCPState(display_id, success);
 }
 
+// Invoked in response to the successful launching of the GPU service.
+void HostDrmDevice::OnGpuServiceLaunched(
+    ui::ozone::mojom::DrmDevicePtr drm_device_ptr,
+    ui::ozone::mojom::DeviceCursorPtr cursor_ptr_ui,
+    ui::ozone::mojom::DeviceCursorPtr cursor_ptr_io) {
+  DCHECK_CALLED_ON_VALID_THREAD(on_window_server_thread_);
+
+  // Rebind InterfacePtrs to the window server thread.
+  cursor_ptr_ui.Bind(cursor_ptr_ui.PassInterface());
+  drm_device_ptr.Bind(drm_device_ptr.PassInterface());
+
+  drm_device_ptr_ = std::move(drm_device_ptr);
+
+  // Make sure that we've launched the DRM device service in the Viz process.
+  auto callback =
+      base::BindOnce(&HostDrmDevice::OnDrmServiceStartedCallback, this);
+  drm_device_ptr_->StartDrmDevice(std::move(callback));
+
+  // The cursor is special since it will process input events on the IO thread
+  // and can by-pass the UI thread. As a result, it has an InterfacePtr for both
+  // the window server and I/O thread.  cursor_ptr_io is already bound correctly
+  // to an I/O thread by GpuProcessHost.
+  cursor_proxy_ = std::make_unique<HostCursorProxy>(std::move(cursor_ptr_ui),
+                                                    std::move(cursor_ptr_io));
+}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/host/host_drm_device.h b/ui/ozone/platform/drm/host/host_drm_device.h
index 47c5b18..4562cc5f 100644
--- a/ui/ozone/platform/drm/host/host_drm_device.h
+++ b/ui/ozone/platform/drm/host/host_drm_device.h
@@ -14,6 +14,7 @@
 #include "ui/gfx/native_widget_types.h"
 #include "ui/ozone/platform/drm/host/drm_cursor.h"
 #include "ui/ozone/platform/drm/host/gpu_thread_adapter.h"
+#include "ui/ozone/public/gpu_platform_support_host.h"
 #include "ui/ozone/public/interfaces/device_cursor.mojom.h"
 #include "ui/ozone/public/interfaces/drm_device.mojom.h"
 
@@ -21,25 +22,23 @@
 class DisplaySnapshot;
 }
 
-namespace service_manager {
-class Connector;
-}
-
 namespace ui {
 class DrmDisplayHostManager;
 class DrmOverlayManager;
 class GpuThreadObserver;
+class DrmDeviceConnector;
+class HostCursorProxy;
 
 // This is the Viz host-side library for the DRM device service provided by the
 // viz process.
-class HostDrmDevice : public GpuThreadAdapter {
+class HostDrmDevice : public base::RefCountedThreadSafe<HostDrmDevice>,
+                      public GpuThreadAdapter {
  public:
-  HostDrmDevice(DrmCursor* cursor, service_manager::Connector* connector);
-  ~HostDrmDevice() override;
+  explicit HostDrmDevice(DrmCursor* cursor);
 
   // Start the DRM service. Runs the |OnDrmServiceStartedCallback| when the
   // service has launched and initiates the remaining startup.
-  void AsyncStartDrmDevice();
+  void AsyncStartDrmDevice(const DrmDeviceConnector& connector);
 
   // Blocks until the DRM service has come up. Use this entry point only when
   // supporting launch of the service where the ozone UI and GPU
@@ -49,6 +48,10 @@
   void ProvideManagers(DrmDisplayHostManager* display_manager,
                        DrmOverlayManager* overlay_manager);
 
+  void OnGpuServiceLaunched(ui::ozone::mojom::DrmDevicePtr drm_device_ptr,
+                            ui::ozone::mojom::DeviceCursorPtr cursor_ptr_ui,
+                            ui::ozone::mojom::DeviceCursorPtr cursor_ptr_io);
+
   // GpuThreadAdapter
   void AddGpuThreadObserver(GpuThreadObserver* observer) override;
   void RemoveGpuThreadObserver(GpuThreadObserver* observer) override;
@@ -93,8 +96,24 @@
                               const gfx::Rect& bounds) override;
 
  private:
+  friend class base::RefCountedThreadSafe<HostDrmDevice>;
+  ~HostDrmDevice() override;
+
+  void HostOnGpuServiceLaunched();
+
+  // BindInterface arranges for the drm_device_ptr to be wired up.
+  void BindInterfaceDrmDevice(
+      ui::ozone::mojom::DrmDevicePtr* drm_device_ptr) const;
+
+  // BindInterface arranges for the cursor_ptr to be wired up.
+  void BindInterfaceDeviceCursor(
+      ui::ozone::mojom::DeviceCursorPtr* cursor_ptr) const;
+
   void OnDrmServiceStartedCallback(bool success);
+
+  // TODO(rjkroege): Get rid of the need for this method in a subsequent CL.
   void PollForSingleThreadReady(int previous_delay);
+
   void RunObservers();
 
   void GpuCheckOverlayCapabilitiesCallback(
@@ -115,21 +134,25 @@
                                display::HDCPState state) const;
   void GpuSetHDCPStateCallback(int64_t display_id, bool success) const;
 
-  // Mojo implementation of the DrmDevice.
+  // Mojo implementation of the DrmDevice. Will be bound on the "main" thread.
   ui::ozone::mojom::DrmDevicePtr drm_device_ptr_;
 
   DrmDisplayHostManager* display_manager_;  // Not owned.
   DrmOverlayManager* overlay_manager_;      // Not owned.
   DrmCursor* cursor_;                       // Not owned.
 
-  service_manager::Connector* connector_;
+  std::unique_ptr<HostCursorProxy> cursor_proxy_;
+
+  scoped_refptr<base::SingleThreadTaskRunner> ws_runner_;
+  scoped_refptr<base::SingleThreadTaskRunner> io_runner_;
+
+  THREAD_CHECKER(on_io_thread_);  // Needs to be rebound as is allocated on the
+                                  // window server  thread.
   THREAD_CHECKER(on_window_server_thread_);
 
   bool connected_ = false;
   base::ObserverList<GpuThreadObserver> gpu_thread_observers_;
 
-  base::WeakPtrFactory<HostDrmDevice> weak_ptr_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(HostDrmDevice);
 };
 
diff --git a/ui/ozone/platform/drm/ozone_platform_gbm.cc b/ui/ozone/platform/drm/ozone_platform_gbm.cc
index 3ad0de48..bd56715d 100644
--- a/ui/ozone/platform/drm/ozone_platform_gbm.cc
+++ b/ui/ozone/platform/drm/ozone_platform_gbm.cc
@@ -37,6 +37,7 @@
 #include "ui/ozone/platform/drm/gpu/scanout_buffer.h"
 #include "ui/ozone/platform/drm/gpu/screen_manager.h"
 #include "ui/ozone/platform/drm/host/drm_cursor.h"
+#include "ui/ozone/platform/drm/host/drm_device_connector.h"
 #include "ui/ozone/platform/drm/host/drm_display_host_manager.h"
 #include "ui/ozone/platform/drm/host/drm_gpu_platform_support_host.h"
 #include "ui/ozone/platform/drm/host/drm_native_display_delegate.h"
@@ -100,47 +101,85 @@
     return event_factory_ozone_->input_controller();
   }
   IPC::MessageFilter* GetGpuMessageFilter() override {
-    return gpu_message_filter_.get();
+    if (using_mojo_) {
+      return nullptr;
+    } else {
+      return gpu_message_filter_.get();
+    }
   }
+
   GpuPlatformSupportHost* GetGpuPlatformSupportHost() override {
-    return gpu_platform_support_host_.get();
+    if (using_mojo_) {
+      return drm_device_connector_.get();
+    } else {
+      return gpu_platform_support_host_.get();
+    }
   }
+
   std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override {
     return event_factory_ozone_->CreateSystemInputInjector();
   }
 
+  // In multi-process mode, this function must be executed in Viz as it sets up
+  // the callbacks needed  for Mojo bindings.  In single process mode, it may be
+  // called on any thread.  It must follow one of |InitializeUI| or
+  // |InitializeGPU|. Invocations of this method when not using mojo will be
+  // ignored. While the caller may choose to invoke this method before entering
+  // the sandbox, the actual interface adding has to happen on the DRM Device
+  // thread and so will be deferred until the DRM thread is running.
   void AddInterfaces(
       service_manager::BinderRegistryWithArgs<
           const service_manager::BindSourceInfo&>* registry) override {
+    if (!using_mojo_)
+      return;
+
     registry->AddInterface<ozone::mojom::DeviceCursor>(
         base::Bind(&OzonePlatformGbm::CreateDeviceCursorBinding,
                    weak_factory_.GetWeakPtr()),
-        gpu_task_runner_);
+        base::ThreadTaskRunnerHandle::Get());
 
     registry->AddInterface<ozone::mojom::DrmDevice>(
         base::Bind(&OzonePlatformGbm::CreateDrmDeviceBinding,
                    weak_factory_.GetWeakPtr()),
-        gpu_task_runner_);
+        base::ThreadTaskRunnerHandle::Get());
   }
+
+  // Runs on the thread where AddInterfaces was invoked. But the endpoint is
+  // always bound on the DRM thread.
   void CreateDeviceCursorBinding(
       ozone::mojom::DeviceCursorRequest request,
       const service_manager::BindSourceInfo& source_info) {
-    if (drm_thread_proxy_)
+    if (drm_thread_started_)
       drm_thread_proxy_->AddBindingCursorDevice(std::move(request));
     else
       pending_cursor_requests_.push_back(std::move(request));
   }
-
+  // Runs on the thread where AddInterfaces was invoked. But the endpoint is
+  // always bound on the DRM thread.
   // service_manager::InterfaceFactory<ozone::mojom::DrmDevice>:
   void CreateDrmDeviceBinding(
       ozone::mojom::DrmDeviceRequest request,
       const service_manager::BindSourceInfo& source_info) {
-    if (drm_thread_proxy_)
+    if (drm_thread_started_)
       drm_thread_proxy_->AddBindingDrmDevice(std::move(request));
     else
       pending_gpu_adapter_requests_.push_back(std::move(request));
   }
 
+  // Runs on the thread that invoked |AddInterfaces| to drain the queue of
+  // binding requests that could not be satisfied until the DRM thread is
+  // available (i.e. if waiting until the sandbox has been entered.)
+  void DrainBindingRequests() {
+    for (auto& request : pending_cursor_requests_)
+      drm_thread_proxy_->AddBindingCursorDevice(std::move(request));
+    pending_cursor_requests_.clear();
+    for (auto& request : pending_gpu_adapter_requests_)
+      drm_thread_proxy_->AddBindingDrmDevice(std::move(request));
+    pending_gpu_adapter_requests_.clear();
+
+    drm_thread_started_ = true;
+  }
+
   std::unique_ptr<PlatformWindow> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       const gfx::Rect& bounds) override {
@@ -159,20 +198,30 @@
       override {
     return std::make_unique<DrmNativeDisplayDelegate>(display_manager_.get());
   }
+
   void InitializeUI(const InitParams& args) override {
-    // Ozone drm can operate in three modes configured at runtime:
+    // Ozone drm can operate in four modes configured at
+    // runtime. Three process modes:
     //   1. legacy mode where host and viz components communicate
     //      via param traits IPC.
     //   2. single-process mode where host and viz components
-    //      communicate via in-process mojo.
+    //      communicate via in-process mojo. Single-process mode can be single
+    //      or multi-threaded.
     //   3. multi-process mode where host and viz components communicate
     //      via mojo IPC.
-    single_process_ = args.single_process;
-    using_mojo_ = args.connector != nullptr;
-    host_thread_ = base::PlatformThread::CurrentRef();
+    //
+    // and 2 connection modes
+    //   a. Viz is launched via content::GpuProcessHost and it notifies the
+    //   ozone host when Viz becomes available. b. The ozone host uses a service
+    //   manager to launch and connect to Viz.
+    //
+    // Combinations 1a, 2b, and 3a, and 3b are supported and expected to work.
+    // Combination 1a will hopefully be deprecated and replaced with 3a.
+    // Combination 2b adds undesirable code-debt and the intent is to remove it.
 
-    DCHECK(!(using_mojo_ && !single_process_))
-        << "Multiprocess Mojo is not supported yet.";
+    single_process_ = args.single_process;
+    using_mojo_ = args.using_mojo || args.connector != nullptr;
+    host_thread_ = base::PlatformThread::CurrentRef();
 
     device_manager_ = CreateDeviceManager();
     window_manager_.reset(new DrmWindowHostManager());
@@ -195,8 +244,9 @@
       gl_api_loader_.reset(new GlApiLoader());
 
     if (using_mojo_) {
-      host_drm_device_ =
-          std::make_unique<HostDrmDevice>(cursor_.get(), args.connector);
+      host_drm_device_ = base::MakeRefCounted<HostDrmDevice>(cursor_.get());
+      drm_device_connector_ = std::make_unique<DrmDeviceConnector>(
+          args.connector, host_drm_device_);
       adapter = host_drm_device_.get();
     } else {
       gpu_platform_support_host_.reset(
@@ -214,17 +264,12 @@
     if (using_mojo_) {
       host_drm_device_->ProvideManagers(display_manager_.get(),
                                         overlay_manager_.get());
-      host_drm_device_->AsyncStartDrmDevice();
+      host_drm_device_->AsyncStartDrmDevice(*drm_device_connector_);
     }
   }
 
   void InitializeGPU(const InitParams& args) override {
-    // TODO(rjkroege): services/ui should initialize this with a connector.
-    // However, in-progress refactorings in services/ui make it difficult to
-    // require this at present. Set using_mojo_ like below once this is
-    // complete.
-    // TODO(rjk): Make it possible to turn this on.
-    // using_mojo_ = args.connector != nullptr;
+    using_mojo_ = args.using_mojo;
     gpu_task_runner_ = base::ThreadTaskRunnerHandle::Get();
 
     if (!single_process_)
@@ -239,48 +284,50 @@
     }
 
     // NOTE: Can't start the thread here since this is called before sandbox
-    // initialization in multi-process Chrome. In mus, we start the DRM thread.
+    // initialization in multi-process Chrome.
     drm_thread_proxy_.reset(new DrmThreadProxy());
 
     surface_factory_.reset(new GbmSurfaceFactory(drm_thread_proxy_.get()));
     if (!using_mojo_) {
       drm_thread_proxy_->BindThreadIntoMessagingProxy(itmp);
-    } else {
-      drm_thread_proxy_->StartDrmThread();
     }
 
-    // When the viz process (and hence the gpu portion of ozone/gbm) is
-    // operating in a single process, the AddInterfaces method is best
-    // invoked before the GPU thread launches.  As a result, requests to add
-    // mojom bindings to the as yet un-launched service will fail so we queue
-    // incoming binding requests until the GPU thread is running and play them
-    // back here.
-    for (auto& request : pending_cursor_requests_)
-      drm_thread_proxy_->AddBindingCursorDevice(std::move(request));
-    pending_cursor_requests_.clear();
-    for (auto& request : pending_gpu_adapter_requests_)
-      drm_thread_proxy_->AddBindingDrmDevice(std::move(request));
-    pending_gpu_adapter_requests_.clear();
-
     // If InitializeGPU and InitializeUI are invoked on the same thread, startup
     // sequencing is complicated because tasks are queued on the unbound mojo
     // pipe connecting the UI (the host) to the DRM thread before the DRM thread
-    // is launched above. Special case this sequence vis the
+    // is launched above. Special case this sequence via the
     // BlockingStartDrmDevice API.
     // TODO(rjkroege): In a future when we have completed splitting Viz, it will
     // be possible to simplify this logic.
-    if (using_mojo_ && single_process_ &&
-        host_thread_ == base::PlatformThread::CurrentRef()) {
+    if (using_mojo_ && single_process_) {
       CHECK(host_drm_device_)
           << "Mojo single-process mode requires a HostDrmDevice.";
-      host_drm_device_->BlockingStartDrmDevice();
+
+      // Wait here if host and gpu are one and the same thread.
+      if (host_thread_ == base::PlatformThread::CurrentRef()) {
+        // One-thread exection does not permit use of the sandbox.
+        AfterSandboxEntry();
+        host_drm_device_->BlockingStartDrmDevice();
+      }
     }
   }
 
+  // The DRM thread needs to be started late because we need to wait for the
+  // sandbox to start. This entry point in the Ozne API gives platforms
+  // flexibility in handing this requirement.
+  void AfterSandboxEntry() override {
+    CHECK(drm_thread_proxy_) << "AfterSandboxEntry before InitializeForGPU is "
+                                "invalid startup order.\n";
+    // Defer the actual startup of the DRM thread to here.
+    auto safe_binding_resquest_drainer = CreateSafeOnceCallback(base::BindOnce(
+        &OzonePlatformGbm::DrainBindingRequests, weak_factory_.GetWeakPtr()));
+
+    drm_thread_proxy_->StartDrmThread(std::move(safe_binding_resquest_drainer));
+  }
+
  private:
   bool using_mojo_;
   bool single_process_;
-  base::PlatformThreadRef host_thread_;
 
   // Objects in the GPU process.
   std::unique_ptr<DrmThreadProxy> drm_thread_proxy_;
@@ -293,6 +340,7 @@
   // running in single process mode.
   std::vector<ozone::mojom::DeviceCursorRequest> pending_cursor_requests_;
   std::vector<ozone::mojom::DrmDeviceRequest> pending_gpu_adapter_requests_;
+  bool drm_thread_started_;
 
   // gpu_platform_support_host_ is the IPC bridge to the GPU process while
   // host_drm_device_ is the mojo bridge to the Viz process. Only one can be in
@@ -304,9 +352,11 @@
   // To avoid a use after free, the following two members should be declared
   // before the two managers, so that they're deleted after them.
   std::unique_ptr<DrmGpuPlatformSupportHost> gpu_platform_support_host_;
-  std::unique_ptr<HostDrmDevice> host_drm_device_;
 
-  // Objects in the Browser process.
+  // Objects in the host process.
+  std::unique_ptr<DrmDeviceConnector> drm_device_connector_;
+  scoped_refptr<HostDrmDevice> host_drm_device_;
+  base::PlatformThreadRef host_thread_;
   std::unique_ptr<DeviceManager> device_manager_;
   std::unique_ptr<BitmapCursorFactoryOzone> cursor_factory_ozone_;
   std::unique_ptr<DrmWindowHostManager> window_manager_;
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index b8566cfd..849e68d 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -107,10 +107,6 @@
 
   import("//ui/base/ui_features.gni")
   if (use_xkbcommon) {
-    sources += [
-      "mock_wayland_xkb_keyboard_layout_engine.cc",
-      "mock_wayland_xkb_keyboard_layout_engine.h",
-    ]
     deps += [ "//ui/events/keycodes:xkb" ]
   }
 
diff --git a/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.cc b/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.cc
deleted file mode 100644
index 4dd5c352..0000000
--- a/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h"
-#include "ui/events/keycodes/keyboard_code_conversion.h"
-
-#if !BUILDFLAG(USE_XKBCOMMON)
-#error "This file should only be compiled if USE_XKBCOMMON is enabled."
-#endif
-
-namespace ui {
-
-bool MockWaylandXkbKeyboardLayoutEngine::Lookup(
-    ui::DomCode dom_code,
-    int event_flags,
-    ui::DomKey* dom_key,
-    ui::KeyboardCode* key_code) const {
-  return DomCodeToUsLayoutDomKey(dom_code, event_flags, dom_key, key_code);
-}
-
-}  // namespace ui
diff --git a/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h b/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h
deleted file mode 100644
index 8d60d2b..0000000
--- a/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 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 UI_OZONE_PLATFORM_WAYLAND_MOCK_WAYLAND_XKB_KEYBOARD_LAYOUT_ENGINE_H_
-#define UI_OZONE_PLATFORM_WAYLAND_MOCK_WAYLAND_XKB_KEYBOARD_LAYOUT_ENGINE_H_
-
-#include "ui/base/ui_features.h"
-
-#if !BUILDFLAG(USE_XKBCOMMON)
-#error "This file should only be included if USE_XKBCOMMON is enabled."
-#endif
-
-#include "ui/events/ozone/layout/xkb/xkb_evdev_codes.h"
-#include "ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h"
-
-namespace ui {
-
-class MockWaylandXkbKeyboardLayoutEngine
-    : public ui::WaylandXkbKeyboardLayoutEngine {
- public:
-  MockWaylandXkbKeyboardLayoutEngine(const ui::XkbKeyCodeConverter& converter)
-      : WaylandXkbKeyboardLayoutEngine(converter) {}
-
-  void UpdateModifiers(uint32_t depressed_mods,
-                       uint32_t latched_mods,
-                       uint32_t locked_mods,
-                       uint32_t group) override {}
-  void SetEventModifiers(ui::EventModifiers* event_modifiers) override {}
-
- private:
-  bool Lookup(ui::DomCode dom_code,
-              int event_flags,
-              ui::DomKey* dom_key,
-              ui::KeyboardCode* key_code) const override;
-
-  DISALLOW_COPY_AND_ASSIGN(MockWaylandXkbKeyboardLayoutEngine);
-};
-
-}  // namespace ui
-
-#endif  // UI_OZONE_PLATFORM_WAYLAND_MOCK_WAYLAND_XKB_KEYBOARD_LAYOUT_ENGINE_H_
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index e94ef56..843d7c99 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -77,7 +77,7 @@
   void InitializeUI(const InitParams& args) override {
 #if BUILDFLAG(USE_XKBCOMMON)
     KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
-        std::make_unique<WaylandXkbKeyboardLayoutEngineImpl>(
+        std::make_unique<WaylandXkbKeyboardLayoutEngine>(
             xkb_evdev_code_converter_));
 #else
     KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
diff --git a/ui/ozone/platform/wayland/wayland_test.cc b/ui/ozone/platform/wayland/wayland_test.cc
index 19814dfb..7bc6c91 100644
--- a/ui/ozone/platform/wayland/wayland_test.cc
+++ b/ui/ozone/platform/wayland/wayland_test.cc
@@ -8,7 +8,7 @@
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 
 #if BUILDFLAG(USE_XKBCOMMON)
-#include "ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h"
+#include "ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h"
 #else
 #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
 #endif
@@ -21,7 +21,7 @@
 WaylandTest::WaylandTest() {
 #if BUILDFLAG(USE_XKBCOMMON)
   KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
-      std::make_unique<WaylandXkbKeyboardLayoutEngineImpl>(
+      std::make_unique<WaylandXkbKeyboardLayoutEngine>(
           xkb_evdev_code_converter_));
 #else
   KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
diff --git a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc
index 367eb621..b2600ad 100644
--- a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc
+++ b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc
@@ -9,11 +9,7 @@
 
 namespace ui {
 
-WaylandXkbKeyboardLayoutEngineImpl::WaylandXkbKeyboardLayoutEngineImpl(
-    const XkbKeyCodeConverter& converter)
-    : WaylandXkbKeyboardLayoutEngine(converter) {}
-
-void WaylandXkbKeyboardLayoutEngineImpl::SetKeymap(xkb_keymap* keymap) {
+void WaylandXkbKeyboardLayoutEngine::SetKeymap(xkb_keymap* keymap) {
   XkbKeyboardLayoutEngine::SetKeymap(keymap);
 
   xkb_mod_indexes_.control =
@@ -23,11 +19,10 @@
   xkb_mod_indexes_.caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
 }
 
-void WaylandXkbKeyboardLayoutEngineImpl::UpdateModifiers(
-    uint32_t depressed_mods,
-    uint32_t latched_mods,
-    uint32_t locked_mods,
-    uint32_t group) {
+void WaylandXkbKeyboardLayoutEngine::UpdateModifiers(uint32_t depressed_mods,
+                                                     uint32_t latched_mods,
+                                                     uint32_t locked_mods,
+                                                     uint32_t group) {
   xkb_state_update_mask(xkb_state_.get(), depressed_mods, latched_mods,
                         locked_mods, 0, 0, group);
 
@@ -55,7 +50,7 @@
     event_modifiers_->SetModifierLock(MODIFIER_CAPS_LOCK, false);
 }
 
-void WaylandXkbKeyboardLayoutEngineImpl::SetEventModifiers(
+void WaylandXkbKeyboardLayoutEngine::SetEventModifiers(
     EventModifiers* event_modifiers) {
   event_modifiers_ = event_modifiers;
 }
diff --git a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h
index ccb02e91..18c8f8c 100644
--- a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h
+++ b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h
@@ -20,24 +20,12 @@
 
   // Used to sync up client side 'xkb_state' instance with modifiers status
   // update from the compositor.
-  virtual void UpdateModifiers(uint32_t depressed_mods,
-                               uint32_t latched_mods,
-                               uint32_t locked_mods,
-                               uint32_t group) = 0;
-  virtual void SetEventModifiers(EventModifiers* event_modifiers) = 0;
-};
-
-class WaylandXkbKeyboardLayoutEngineImpl
-    : public WaylandXkbKeyboardLayoutEngine {
- public:
-  WaylandXkbKeyboardLayoutEngineImpl(const XkbKeyCodeConverter& converter);
-
   void UpdateModifiers(uint32_t depressed_mods,
                        uint32_t latched_mods,
                        uint32_t locked_mods,
-                       uint32_t group) override;
+                       uint32_t group);
 
-  void SetEventModifiers(EventModifiers* event_modifiers) override;
+  void SetEventModifiers(EventModifiers* event_modifiers);
 
  private:
   void SetKeymap(xkb_keymap* keymap) override;
diff --git a/ui/ozone/public/interfaces/DEPS b/ui/ozone/public/DEPS
similarity index 100%
rename from ui/ozone/public/interfaces/DEPS
rename to ui/ozone/public/DEPS
diff --git a/ui/ozone/public/gpu_platform_support_host.cc b/ui/ozone/public/gpu_platform_support_host.cc
index 98a23b1..586186c 100644
--- a/ui/ozone/public/gpu_platform_support_host.cc
+++ b/ui/ozone/public/gpu_platform_support_host.cc
@@ -23,6 +23,10 @@
 
   void OnChannelDestroyed(int host_id) override {}
   void OnMessageReceived(const IPC::Message&) override {}
+  void OnGpuServiceLaunched(
+      scoped_refptr<base::SingleThreadTaskRunner> ui_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> io_runner,
+      GpuHostBindInterfaceCallback binder) override {}
 };
 
 }  // namespace
diff --git a/ui/ozone/public/gpu_platform_support_host.h b/ui/ozone/public/gpu_platform_support_host.h
index 50db642..f1120e74 100644
--- a/ui/ozone/public/gpu_platform_support_host.h
+++ b/ui/ozone/public/gpu_platform_support_host.h
@@ -5,10 +5,13 @@
 #ifndef UI_OZONE_PUBLIC_GPU_PLATFORM_SUPPORT_HOST_H_
 #define UI_OZONE_PUBLIC_GPU_PLATFORM_SUPPORT_HOST_H_
 
+#include <string>
+
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_sender.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "ui/ozone/ozone_base_export.h"
 
 namespace ui {
@@ -24,6 +27,10 @@
 // to support additional messages needed by specific platforms.
 class OZONE_BASE_EXPORT GpuPlatformSupportHost {
  public:
+  using GpuHostBindInterfaceCallback =
+      base::RepeatingCallback<void(const std::string&,
+                                   mojo::ScopedMessagePipeHandle)>;
+
   GpuPlatformSupportHost();
   virtual ~GpuPlatformSupportHost();
 
@@ -42,6 +49,13 @@
   // Called to handle an IPC message. Note that this can be called from any
   // thread.
   virtual void OnMessageReceived(const IPC::Message& message) = 0;
+
+  // Called when the GPU service is launched.
+  // Called from the browser IO thread.
+  virtual void OnGpuServiceLaunched(
+      scoped_refptr<base::SingleThreadTaskRunner> host_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> io_runner,
+      GpuHostBindInterfaceCallback binder) = 0;
 };
 
 // create a stub implementation.
diff --git a/ui/ozone/public/ozone_platform.cc b/ui/ozone/public/ozone_platform.cc
index 8b41780..58c114b 100644
--- a/ui/ozone/public/ozone_platform.cc
+++ b/ui/ozone/public/ozone_platform.cc
@@ -125,4 +125,6 @@
     service_manager::BinderRegistryWithArgs<
         const service_manager::BindSourceInfo&>* registry) {}
 
+void OzonePlatform::AfterSandboxEntry() {}
+
 }  // namespace ui
diff --git a/ui/ozone/public/ozone_platform.h b/ui/ozone/public/ozone_platform.h
index b6335ea..f715a6af 100644
--- a/ui/ozone/public/ozone_platform.h
+++ b/ui/ozone/public/ozone_platform.h
@@ -13,6 +13,7 @@
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "ui/events/system_input_injector.h"
 #include "ui/ozone/ozone_export.h"
+//#include "ui/ozone/public/interfaces/drm_device.mojom.h"
 
 namespace display {
 class NativeDisplayDelegate;
@@ -64,14 +65,23 @@
   // retain a reference to this structure.
   struct InitParams {
     // Ozone may retain this pointer for later use. An Ozone platform embedder
-    // must set this parameter in order for the Ozone platform implementation to
-    // be able to use Mojo.
+    // may set this value if operating in the idiomatic mojo fashion with a
+    // service manager. Mojo transport does not require a service manager but in
+    // that case ozone will not be able to connect to the DRM and cursor
+    // services. Instead the host must invoke |OnGpuServiceLaunched| as
+    // described in ui/ozone/public/gpu_platform_support_host.h to inform the
+    // ozone host that a process containing these services is running.
     service_manager::Connector* connector = nullptr;
 
     // Setting this to true indicates that the platform implementation should
     // operate as a single process for platforms (i.e. drm) that are usually
-    // split between a main and gpu specific portion.
+    // split between a host and viz specific portion.
     bool single_process = false;
+
+    //  Setting this to true indicates that the platform implementation should
+    //  use mojo. Setting this to true requires calling |AddInterfaces|
+    //  afterwards in the Viz process and providing a connector as part
+    bool using_mojo = false;
   };
 
   // Ensures the OzonePlatform instance without doing any initialization.
@@ -131,11 +141,23 @@
   // service_manager::BinderRegistry* pointer to export all Mojo interfaces
   // defined within Ozone.
   //
+  // Requests arriving before they can be immediately handled will be queued and
+  // executed later.
+  //
   // A default do-nothing implementation is provided to permit platform
   // implementations to opt out of implementing any Mojo interfaces.
   virtual void AddInterfaces(service_manager::BinderRegistryWithArgs<
                              const service_manager::BindSourceInfo&>* registry);
 
+  // The GPU-specific portion of Ozone would typically run in a sandboxed
+  // process for additional security. Some startup might need to wait until
+  // after the sandbox has been configured. The embedder should use this method
+  // to specify that the sandbox is configured and that GPU-side setup should
+  // complete. A default do-nothing implementation is provided to permit
+  // platform implementations to ignore sandboxing and any associated launch
+  // ordering issues.
+  virtual void AfterSandboxEntry();
+
  private:
   virtual void InitializeUI(const InitParams& params) = 0;
   virtual void InitializeGPU(const InitParams& params) = 0;
diff --git a/ui/ozone/public/ozone_switches.cc b/ui/ozone/public/ozone_switches.cc
index f7a772a5..4669cfa 100644
--- a/ui/ozone/public/ozone_switches.cc
+++ b/ui/ozone/public/ozone_switches.cc
@@ -15,4 +15,9 @@
 // Try to enable drm atomic. This works only with drm platform.
 const char kEnableDrmAtomic[] = "enable-drm-atomic";
 
+// Use mojo communication in the drm platform instead of paramtraits. Remove
+// this switch (and associated code) when the drm platform always uses mojo
+// communication.
+const char kEnableDrmMojo[] = "enable-drm-mojo";
+
 }  // namespace switches
diff --git a/ui/ozone/public/ozone_switches.h b/ui/ozone/public/ozone_switches.h
index e53912bf..b8360e80 100644
--- a/ui/ozone/public/ozone_switches.h
+++ b/ui/ozone/public/ozone_switches.h
@@ -16,6 +16,8 @@
 
 OZONE_BASE_EXPORT extern const char kEnableDrmAtomic[];
 
+OZONE_BASE_EXPORT extern const char kEnableDrmMojo[];
+
 }  // namespace switches
 
 #endif  // UI_OZONE_PUBLIC_OZONE_SWITCHES_H_
diff --git a/ui/views/bubble/tray_bubble_view.cc b/ui/views/bubble/tray_bubble_view.cc
index 392cbd1..6e32c79 100644
--- a/ui/views/bubble/tray_bubble_view.cc
+++ b/ui/views/bubble/tray_bubble_view.cc
@@ -360,7 +360,10 @@
 }
 
 base::string16 TrayBubbleView::GetAccessibleWindowTitle() const {
-  return delegate_->GetAccessibleNameForBubble();
+  if (delegate_)
+    return delegate_->GetAccessibleNameForBubble();
+  else
+    return base::string16();
 }
 
 gfx::Size TrayBubbleView::CalculatePreferredSize() const {
@@ -438,7 +441,8 @@
   // The mouse was accidentally over the bubble when it opened and the AutoClose
   // logic was not activated. Now that the user did move the mouse we tell the
   // delegate to disable AutoClose.
-  delegate_->OnMouseEnteredView();
+  if (delegate_)
+    delegate_->OnMouseEnteredView();
   mouse_actively_entered_ = true;
   mouse_watcher_->Stop();
 }
diff --git a/ui/views/controls/button/md_text_button.h b/ui/views/controls/button/md_text_button.h
index 8d0d6e3..27ba3c0 100644
--- a/ui/views/controls/button/md_text_button.h
+++ b/ui/views/controls/button/md_text_button.h
@@ -51,9 +51,10 @@
   void UpdateStyleToIndicateDefaultStatus() override;
   void StateChanged(ButtonState old_state) override;
 
- private:
+ protected:
   MdTextButton(ButtonListener* listener, int button_context);
 
+ private:
   void UpdatePadding();
   void UpdateColors();
 
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js
index 0fbed6d..a886a12 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -66,14 +66,14 @@
     enableConnect: {
       type: Boolean,
       notify: true,
-      computed: 'computeEnableConnect_(isConfigured_, propertiesSent_)',
+      value: false,
     },
 
     /** @private */
     enableSave: {
       type: Boolean,
       notify: true,
-      computed: 'computeEnableSave_(isConfigured_, propertiesReceived_)',
+      value: false,
     },
 
     /**
@@ -295,6 +295,8 @@
   },
 
   observers: [
+    'setEnableConnect_(isConfigured_, propertiesSent_)',
+    'setEnableSave_(isConfigured_, propertiesReceived_)',
     'updateConfigProperties_(networkProperties)',
     'updateSecurity_(configProperties_, security_)',
     'updateEapOuter_(eapProperties_.Outer)',
@@ -306,6 +308,7 @@
     // Multiple updateIsConfigured observers for different configurations.
     'updateIsConfigured_(configProperties_.*, security_)',
     'updateIsConfigured_(configProperties_, eapProperties_.*)',
+    'updateIsConfigured_(configProperties_.WiFi.*)',
     'updateIsConfigured_(configProperties_.VPN.*, vpnType_)',
   ],
 
@@ -344,7 +347,8 @@
           this.guid, this.getPropertiesCallback_.bind(this));
     }
     this.onCertificateListsChanged_();
-    this.async(() => {
+    this.updateIsConfigured_();
+    requestAnimationFrame(() => {
       var e = this.$$(
           'network-config-input:not([disabled]),' +
           'network-config-select:not([disabled])');
@@ -949,20 +953,14 @@
     return type == networkType;
   },
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  computeEnableSave_: function() {
-    return this.isConfigured_ && this.propertiesReceived_;
+  /** @private */
+  setEnableSave_: function() {
+    this.enableSave = this.isConfigured_ && this.propertiesReceived_;
   },
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  computeEnableConnect_: function() {
-    return this.isConfigured_ && !this.propertiesSent_;
+  /** @private */
+  setEnableConnect_: function() {
+    this.enableConnect = this.isConfigured_ && !this.propertiesSent_;
   },
 
   /**
@@ -1011,7 +1009,8 @@
    * @private
    */
   shareIsVisible_: function() {
-    return this.type == CrOnc.Type.WI_FI || this.type == CrOnc.Type.WI_MAX;
+    return !this.guid &&
+        (this.type == CrOnc.Type.WI_FI || this.type == CrOnc.Type.WI_MAX);
   },
 
   /**
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config_input.html b/ui/webui/resources/cr_components/chromeos/network/network_config_input.html
index 82967ca3..12784fd7 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config_input.html
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config_input.html
@@ -30,8 +30,8 @@
     <div class="control-box">
       <paper-input-container always-float-label>
         <label id="label">[[label]]</label>
-        <input is="iron-input" value="{{value::change}}"
-            disabled="[[disabled]]" aria-label$="[[label]]"
+        <input is="iron-input" value="{{value::input}}"
+            tabindex="1" disabled="[[disabled]]" aria-label$="[[label]]"
             type="[[getInputType_(password, showPassword)]]">
       </paper-input-container>
       <div id="iconDiv">