diff --git a/DEPS b/DEPS
index 37dd05f..10c4a9451 100644
--- a/DEPS
+++ b/DEPS
@@ -40,11 +40,11 @@
   # 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': 'dbb24efcc5f224a0d9a73ad9b200daf8013df0a1',
+  'skia_revision': '9cb11ab7e423e8209b68140df72675f06f7bb983',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '8cd4009c5b7072ad224f19a9e668ec0ed7430599',
+  'v8_revision': '20e02e2b7216fc4850cfcf35f3b0bd1913638b40',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -96,7 +96,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': '017fd5cf4ccbcbed7bba20760f1b3d923a7cd3ca',
+  'catapult_revision': 'd4179a057d4b2410cbe1d0eef9773558faec6a7c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -362,7 +362,7 @@
       Var('chromium_git') + '/external/github.com/swisspol/GCDWebServer.git' + '@' + '43555c66627f6ed44817855a0f6d465f559d30e0',
 
     'src/ios/third_party/material_components_ios/src':
-      Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '7026a1f8016419aa2a05ff08b3897a9878aeae63',
+      Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '604d601bf8e4db1e1d8e16960d20339509735f6a',
 
     'src/ios/third_party/material_font_disk_loader_ios/src':
       Var('chromium_git') + '/external/github.com/material-foundation/material-font-disk-loader-ios.git' + '@' + '8e30188777b016182658fbaa0a4a020a48183224',
diff --git a/android_webview/common/android_webview_message_generator.cc b/android_webview/common/android_webview_message_generator.cc
index cef229b..d8b0080 100644
--- a/android_webview/common/android_webview_message_generator.cc
+++ b/android_webview/common/android_webview_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "android_webview/common/android_webview_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "android_webview/common/android_webview_message_generator.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index d476e6a..3d25b644 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -597,6 +597,8 @@
     "system/virtual_keyboard/virtual_keyboard_tray.h",
     "system/web_notification/ash_popup_alignment_delegate.cc",
     "system/web_notification/ash_popup_alignment_delegate.h",
+    "system/web_notification/fullscreen_notification_blocker.cc",
+    "system/web_notification/fullscreen_notification_blocker.h",
     "system/web_notification/login_state_notification_blocker.cc",
     "system/web_notification/login_state_notification_blocker.h",
     "system/web_notification/message_center_bubble.cc",
diff --git a/ash/shell.cc b/ash/shell.cc
index e64a30aa..3ba93718 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -806,6 +806,7 @@
   wallpaper_controller_.reset();
   accessibility_controller_.reset();
   accessibility_delegate_.reset();
+  message_center_controller_.reset();
 
   // Balances the Install() in Initialize().
   views::FocusManagerFactory::Install(nullptr);
diff --git a/ash/system/bluetooth/bluetooth_power_controller.h b/ash/system/bluetooth/bluetooth_power_controller.h
index a702a9f3..fda86fd 100644
--- a/ash/system/bluetooth/bluetooth_power_controller.h
+++ b/ash/system/bluetooth/bluetooth_power_controller.h
@@ -8,13 +8,14 @@
 #include "ash/ash_export.h"
 #include "ash/session/session_observer.h"
 #include "ash/shell_observer.h"
-#include "base/containers/queue.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/user_manager/user_manager.h"
 #include "device/bluetooth/bluetooth_adapter.h"
 
+#include <queue>
+
 class PrefRegistrySimple;
 class PrefService;
 
@@ -128,7 +129,7 @@
 
   // Contains pending tasks which depend on the availability of bluetooth
   // adapter.
-  base::queue<BluetoothTask> pending_bluetooth_tasks_;
+  std::queue<BluetoothTask> pending_bluetooth_tasks_;
 
   // The registrar used to watch prefs changes in the above
   // |active_user_pref_service_| from outside ash.
diff --git a/ash/system/web_notification/fullscreen_notification_blocker.cc b/ash/system/web_notification/fullscreen_notification_blocker.cc
new file mode 100644
index 0000000..744fe52
--- /dev/null
+++ b/ash/system/web_notification/fullscreen_notification_blocker.cc
@@ -0,0 +1,69 @@
+// 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 "ash/system/web_notification/fullscreen_notification_blocker.h"
+
+#include "ash/root_window_controller.h"
+#include "ash/shell.h"
+#include "ash/system/system_notifier.h"
+#include "ash/wm/window_state.h"
+#include "base/metrics/histogram_macros.h"
+#include "ui/aura/window.h"
+#include "ui/message_center/notifier_settings.h"
+
+namespace ash {
+
+FullscreenNotificationBlocker::FullscreenNotificationBlocker(
+    message_center::MessageCenter* message_center)
+    : NotificationBlocker(message_center) {
+  Shell::Get()->AddShellObserver(this);
+}
+
+FullscreenNotificationBlocker::~FullscreenNotificationBlocker() {
+  Shell::Get()->RemoveShellObserver(this);
+}
+
+bool FullscreenNotificationBlocker::ShouldShowNotificationAsPopup(
+    const message_center::Notification& notification) const {
+  bool enabled =
+      !should_block_ ||
+      (notification.delegate() &&
+       notification.delegate()->ShouldDisplayOverFullscreen()) ||
+      system_notifier::ShouldAlwaysShowPopups(notification.notifier_id());
+
+  if (enabled && !should_block_) {
+    UMA_HISTOGRAM_ENUMERATION("Notifications.Display_Windowed",
+                              notification.notifier_id().type,
+                              message_center::NotifierId::SIZE);
+  }
+
+  return enabled;
+}
+
+void FullscreenNotificationBlocker::OnFullscreenStateChanged(
+    bool is_fullscreen,
+    aura::Window* root_window) {
+  if (root_window != Shell::GetRootWindowForNewWindows())
+    return;
+
+  RootWindowController* controller =
+      RootWindowController::ForWindow(root_window);
+
+  // During shutdown |controller| can be NULL.
+  if (!controller)
+    return;
+
+  // Block notifications if the shelf is hidden because of a fullscreen
+  // window.
+  const aura::Window* fullscreen_window =
+      controller->GetWindowForFullscreenMode();
+  bool was_blocked = should_block_;
+  should_block_ =
+      fullscreen_window &&
+      wm::GetWindowState(fullscreen_window)->hide_shelf_when_fullscreen();
+  if (was_blocked != should_block_)
+    NotifyBlockingStateChanged();
+}
+
+}  // namespace ash
diff --git a/ash/system/web_notification/fullscreen_notification_blocker.h b/ash/system/web_notification/fullscreen_notification_blocker.h
new file mode 100644
index 0000000..19de9cb
--- /dev/null
+++ b/ash/system/web_notification/fullscreen_notification_blocker.h
@@ -0,0 +1,39 @@
+// 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 ASH_SYSTEM_WEB_NOTIFICATION_FULLSCREEN_NOTIFICATION_BLOCKER_H_
+#define ASH_SYSTEM_WEB_NOTIFICATION_FULLSCREEN_NOTIFICATION_BLOCKER_H_
+
+#include "ash/shell_observer.h"
+#include "base/macros.h"
+#include "ui/message_center/notification_blocker.h"
+
+namespace ash {
+
+// A notification blocker which checks the fullscreen state.
+class FullscreenNotificationBlocker
+    : public message_center::NotificationBlocker,
+      public ShellObserver {
+ public:
+  explicit FullscreenNotificationBlocker(
+      message_center::MessageCenter* message_center);
+  ~FullscreenNotificationBlocker() override;
+
+  // message_center::NotificationBlocker:
+  bool ShouldShowNotificationAsPopup(
+      const message_center::Notification& notification) const override;
+
+ private:
+  // ShellObserver:
+  void OnFullscreenStateChanged(bool is_fullscreen,
+                                aura::Window* root_window) override;
+
+  bool should_block_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(FullscreenNotificationBlocker);
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_WEB_NOTIFICATION_FULLSCREEN_NOTIFICATION_BLOCKER_H_
diff --git a/ash/system/web_notification/message_center_controller.cc b/ash/system/web_notification/message_center_controller.cc
index fa11a0a..72eecaa 100644
--- a/ash/system/web_notification/message_center_controller.cc
+++ b/ash/system/web_notification/message_center_controller.cc
@@ -9,7 +9,8 @@
 namespace ash {
 
 MessageCenterController::MessageCenterController()
-    : login_notification_blocker_(message_center::MessageCenter::Get()) {}
+    : fullscreen_notification_blocker_(message_center::MessageCenter::Get()),
+      login_notification_blocker_(message_center::MessageCenter::Get()) {}
 
 MessageCenterController::~MessageCenterController() {}
 
diff --git a/ash/system/web_notification/message_center_controller.h b/ash/system/web_notification/message_center_controller.h
index 7b82854..257e0c3 100644
--- a/ash/system/web_notification/message_center_controller.h
+++ b/ash/system/web_notification/message_center_controller.h
@@ -5,6 +5,7 @@
 #ifndef ASH_SYSTEM_WEB_NOTIFICATION_MESSAGE_CENTER_CONTROLLER_H_
 #define ASH_SYSTEM_WEB_NOTIFICATION_MESSAGE_CENTER_CONTROLLER_H_
 
+#include "ash/system/web_notification/fullscreen_notification_blocker.h"
 #include "ash/system/web_notification/login_state_notification_blocker.h"
 #include "base/macros.h"
 
@@ -20,6 +21,7 @@
   ~MessageCenterController();
 
  private:
+  FullscreenNotificationBlocker fullscreen_notification_blocker_;
   LoginStateNotificationBlocker login_notification_blocker_;
 
   DISALLOW_COPY_AND_ASSIGN(MessageCenterController);
diff --git a/base/allocator/partition_allocator/address_space_randomization.cc b/base/allocator/partition_allocator/address_space_randomization.cc
index 36fdaf1..7f1653a 100644
--- a/base/allocator/partition_allocator/address_space_randomization.cc
+++ b/base/allocator/partition_allocator/address_space_randomization.cc
@@ -87,11 +87,12 @@
 // Calculates a random preferred mapping address. In calculating an address, we
 // balance good ASLR against not fragmenting the address space too badly.
 void* GetRandomPageBase() {
-  uintptr_t random;
-  random = static_cast<uintptr_t>(ranval(&s_ranctx));
+  uintptr_t random = static_cast<uintptr_t>(ranval(&s_ranctx));
+
 #if defined(ARCH_CPU_X86_64)
   random <<= 32UL;
   random |= static_cast<uintptr_t>(ranval(&s_ranctx));
+
 // This address mask gives a low likelihood of address space collisions. We
 // handle the situation gracefully if there is a collision.
 #if defined(OS_WIN)
@@ -113,12 +114,14 @@
 #else
   // Linux and OS X support the full 47-bit user space of x64 processors.
   random &= 0x3fffffffffffUL;
-#endif
+#endif  // defined(OS_WIN)
+
 #elif defined(ARCH_CPU_ARM64)
   // ARM64 on Linux has 39-bit user space.
   random &= 0x3fffffffffUL;
   random += 0x1000000000UL;
 #else  // !defined(ARCH_CPU_X86_64) && !defined(ARCH_CPU_ARM64)
+
 #if defined(OS_WIN)
   // On win32 host systems the randomization plus huge alignment causes
   // excessive fragmentation. Plus most of these systems lack ASLR, so the
@@ -129,12 +132,30 @@
     isWow64 = FALSE;
   if (!isWow64)
     return nullptr;
+#elif defined(OS_MACOSX)
+  // macOS as of 10.12.5 does not clean up entries in page map levels 3/4
+  // [PDP/PML4] created from mmap or mach_vm_allocate, even after the region is
+  // destroyed. Using a virtual address space that is too large causes a leak of
+  // about 1 wired [can never be paged out] page per call to mmap(). The page is
+  // only reclaimed when the process is killed. Confine the hint to a 39-bit
+  // section of the virtual address space.
+  //
+  // This implementation adapted from
+  // https://chromium-review.googlesource.com/c/v8/v8/+/557958. The difference
+  // is that here we clamp to 39 bits, not 32.
+  //
+  // TODO(crbug.com/738925): Remove this limitation if/when the macOS behavior
+  // changes.
+  random &= 0x3fffffffffUL;
+  random += 0x1000000000UL;
 #endif  // defined(OS_WIN)
+
   // This is a good range on Windows, Linux and Mac.
   // Allocates in the 0.5-1.5GB region.
   random &= 0x3fffffff;
   random += 0x20000000;
 #endif  // defined(ARCH_CPU_X86_64)
+
   random &= kPageAllocationGranularityBaseMask;
   return reinterpret_cast<void*>(random);
 }
diff --git a/base/allocator/partition_allocator/page_allocator.cc b/base/allocator/partition_allocator/page_allocator.cc
index e4d7b62d..bad1c61 100644
--- a/base/allocator/partition_allocator/page_allocator.cc
+++ b/base/allocator/partition_allocator/page_allocator.cc
@@ -31,42 +31,68 @@
 #define MAP_ANONYMOUS MAP_ANON
 #endif
 
+namespace base {
+
 namespace {
 
 // On POSIX |mmap| uses a nearby address if the hint address is blocked.
 const bool kHintIsAdvisory = true;
 std::atomic<int32_t> s_allocPageErrorCode{0};
 
-}  // namespace
+int GetAccessFlags(PageAccessibilityConfiguration page_accessibility) {
+  switch (page_accessibility) {
+    case PageReadWrite:
+      return PROT_READ | PROT_WRITE;
+    case PageReadExecute:
+      return PROT_READ | PROT_EXEC;
+    case PageReadWriteExecute:
+      return PROT_READ | PROT_WRITE | PROT_EXEC;
+    default:
+      NOTREACHED();
+    // Fall through.
+    case PageInaccessible:
+      return PROT_NONE;
+  }
+}
 
 #elif defined(OS_WIN)
 
 #include <windows.h>
 
+namespace base {
+
 namespace {
 
 // |VirtualAlloc| will fail if allocation at the hint address is blocked.
 const bool kHintIsAdvisory = false;
 std::atomic<int32_t> s_allocPageErrorCode{ERROR_SUCCESS};
 
-}  // namespace
+int GetAccessFlags(PageAccessibilityConfiguration page_accessibility) {
+  switch (page_accessibility) {
+    case PageReadWrite:
+      return PAGE_READWRITE;
+    case PageReadExecute:
+      return PAGE_EXECUTE_READ;
+    case PageReadWriteExecute:
+      return PAGE_EXECUTE_READWRITE;
+    default:
+      NOTREACHED();
+    // Fall through.
+    case PageInaccessible:
+      return PAGE_NOACCESS;
+  }
+}
 
 #else
 #error Unknown OS
 #endif  // defined(OS_POSIX)
 
-namespace base {
-
-namespace {
-
 // We may reserve / release address space on different threads.
 subtle::SpinLock s_reserveLock;
 // We only support a single block of reserved address space.
 void* s_reservation_address = nullptr;
 size_t s_reservation_size = 0;
 
-}  // namespace
-
 // This internal function wraps the OS-specific page allocation call:
 // |VirtualAlloc| on Windows, and |mmap| on POSIX.
 static void* SystemAllocPages(void* hint,
@@ -82,8 +108,7 @@
   // Retry failed allocations once after calling ReleaseReservation().
   bool have_retried = false;
 #if defined(OS_WIN)
-  const DWORD access_flag =
-      page_accessibility == PageAccessible ? PAGE_READWRITE : PAGE_NOACCESS;
+  DWORD access_flag = GetAccessFlags(page_accessibility);
   const DWORD type_flags = commit ? (MEM_RESERVE | MEM_COMMIT) : MEM_RESERVE;
   while (true) {
     ret = VirtualAlloc(hint, length, type_flags, access_flag);
@@ -105,9 +130,7 @@
 #else
   int fd = -1;
 #endif
-  int access_flag = page_accessibility == PageAccessible
-                        ? (PROT_READ | PROT_WRITE)
-                        : PROT_NONE;
+  int access_flag = GetAccessFlags(page_accessibility);
   while (true) {
     ret = mmap(hint, length, access_flag, MAP_ANONYMOUS | MAP_PRIVATE, fd, 0);
     if (ret != MAP_FAILED)
@@ -124,6 +147,8 @@
   return ret;
 }
 
+}  // namespace
+
 // Trims base to given length and alignment. Windows returns null on failure and
 // frees base.
 static void* TrimMapping(void* base,
@@ -244,23 +269,20 @@
 #endif
 }
 
-void SetSystemPagesInaccessible(void* address, size_t length) {
+bool SetSystemPagesAccess(void* address,
+                          size_t length,
+                          PageAccessibilityConfiguration page_accessibility) {
   DCHECK(!(length & kSystemPageOffsetMask));
 #if defined(OS_POSIX)
-  int ret = mprotect(address, length, PROT_NONE);
-  CHECK(!ret);
+  int access_flag = GetAccessFlags(page_accessibility);
+  return !mprotect(address, length, access_flag);
 #else
-  BOOL ret = VirtualFree(address, length, MEM_DECOMMIT);
-  CHECK(ret);
-#endif
-}
-
-bool SetSystemPagesAccessible(void* address, size_t length) {
-  DCHECK(!(length & kSystemPageOffsetMask));
-#if defined(OS_POSIX)
-  return !mprotect(address, length, PROT_READ | PROT_WRITE);
-#else
-  return !!VirtualAlloc(address, length, MEM_COMMIT, PAGE_READWRITE);
+  if (page_accessibility == PageInaccessible) {
+    return VirtualFree(address, length, MEM_DECOMMIT) != 0;
+  } else {
+    DWORD access_flag = GetAccessFlags(page_accessibility);
+    return !!VirtualAlloc(address, length, MEM_COMMIT, access_flag);
+  }
 #endif
 }
 
@@ -283,17 +305,23 @@
   }
   CHECK(!ret);
 #else
-  SetSystemPagesInaccessible(address, length);
+  CHECK(SetSystemPagesAccess(address, length, PageInaccessible));
 #endif
 }
 
-void RecommitSystemPages(void* address, size_t length) {
+bool RecommitSystemPages(void* address,
+                         size_t length,
+                         PageAccessibilityConfiguration page_accessibility) {
   DCHECK(!(length & kSystemPageOffsetMask));
+  DCHECK_NE(PageInaccessible, page_accessibility);
 #if defined(OS_POSIX)
+  // On POSIX systems, read the memory to recommit. This has the correct
+  // behavior because the API requires the permissions to be the same as before
+  // decommitting and all configurations can read.
   (void)address;
-#else
-  CHECK(SetSystemPagesAccessible(address, length));
+  return true;
 #endif
+  return SetSystemPagesAccess(address, length, page_accessibility);
 }
 
 void DiscardSystemPages(void* address, size_t length) {
@@ -336,13 +364,13 @@
 
   // Don't take |s_reserveLock| while allocating, since a failure would invoke
   // ReleaseReservation and deadlock.
-  void* mem = SystemAllocPages(nullptr, size, base::PageInaccessible, false);
+  void* mem = SystemAllocPages(nullptr, size, PageInaccessible, false);
   // We guarantee this alignment when reserving address space.
   DCHECK(!(reinterpret_cast<uintptr_t>(mem) &
            kPageAllocationGranularityOffsetMask));
   if (mem != nullptr) {
     {
-      base::subtle::SpinLock::Guard guard(s_reserveLock);
+      subtle::SpinLock::Guard guard(s_reserveLock);
       if (s_reservation_address == nullptr) {
         s_reservation_address = mem;
         s_reservation_size = size;
@@ -356,7 +384,7 @@
 }
 
 void ReleaseReservation() {
-  base::subtle::SpinLock::Guard guard(s_reserveLock);
+  subtle::SpinLock::Guard guard(s_reserveLock);
   if (s_reservation_address != nullptr) {
     FreePages(s_reservation_address, s_reservation_size);
     s_reservation_address = nullptr;
diff --git a/base/allocator/partition_allocator/page_allocator.h b/base/allocator/partition_allocator/page_allocator.h
index cbdcdb6c..f15062810 100644
--- a/base/allocator/partition_allocator/page_allocator.h
+++ b/base/allocator/partition_allocator/page_allocator.h
@@ -34,62 +34,64 @@
 static const size_t kSystemPageBaseMask = ~kSystemPageOffsetMask;
 
 enum PageAccessibilityConfiguration {
-  PageAccessible,
   PageInaccessible,
+  PageReadWrite,
+  PageReadExecute,
+  PageReadWriteExecute,
 };
 
 // Allocate one or more pages.
 // The requested address is just a hint; the actual address returned may
 // differ. The returned address will be aligned at least to align bytes.
-// len is in bytes, and must be a multiple of kPageAllocationGranularity.
+// length is in bytes, and must be a multiple of kPageAllocationGranularity.
 // align is in bytes, and must be a power-of-two multiple of
 // kPageAllocationGranularity.
-// If addr is null, then a suitable and randomized address will be chosen
+// If address is null, then a suitable and randomized address will be chosen
 // automatically.
-// PageAccessibilityConfiguration controls the permission of the
-// allocated pages.
+// page_accessibility controls the permission of the allocated pages.
 // This call will return null if the allocation cannot be satisfied.
 BASE_EXPORT void* AllocPages(void* address,
-                             size_t len,
+                             size_t length,
                              size_t align,
-                             PageAccessibilityConfiguration);
+                             PageAccessibilityConfiguration page_accessibility);
 
 // Free one or more pages.
-// addr and len must match a previous call to allocPages().
+// address and length must match a previous call to allocPages().
 BASE_EXPORT void FreePages(void* address, size_t length);
 
-// Mark one or more system pages as being inaccessible.
-// Subsequently accessing any address in the range will fault, and the
-// addresses will not be re-used by future allocations.
-// len must be a multiple of kSystemPageSize bytes.
-BASE_EXPORT void SetSystemPagesInaccessible(void* address, size_t length);
-
-// Mark one or more system pages as being accessible.
-// The pages will be readable and writeable.
-// len must be a multiple of kSystemPageSize bytes.
-// The result bool value indicates whether the permission
-// change succeeded or not. You must check the result
-// (in most cases you need to CHECK that it is true).
-BASE_EXPORT WARN_UNUSED_RESULT bool SetSystemPagesAccessible(void* address,
-                                                             size_t length);
+// Mark one or more system pages with the given access.
+// length must be a multiple of kSystemPageSize bytes.
+// The result bool value indicates whether the permission change succeeded or
+// not. You must check the result (in most cases you need to CHECK that it is
+// true).
+BASE_EXPORT WARN_UNUSED_RESULT bool SetSystemPagesAccess(
+    void* address,
+    size_t length,
+    PageAccessibilityConfiguration page_accessibility);
 
 // Decommit one or more system pages. Decommitted means that the physical memory
 // is released to the system, but the virtual address space remains reserved.
-// System pages are re-committed by calling recommitSystemPages(). Touching
+// System pages are re-committed by calling RecommitSystemPages(). Touching
 // a decommitted page _may_ fault.
 // Clients should not make any assumptions about the contents of decommitted
 // system pages, before or after they write to the page. The only guarantee
 // provided is that the contents of the system page will be deterministic again
 // after recommitting and writing to it. In particlar note that system pages are
-// not guaranteed to be zero-filled upon re-commit. len must be a multiple of
+// not guaranteed to be zero-filled upon re-commit. length must be a multiple of
 // kSystemPageSize bytes.
 BASE_EXPORT void DecommitSystemPages(void* address, size_t length);
 
-// Recommit one or more system pages. Decommitted system pages must be
-// recommitted before they are read are written again.
-// Note that this operation may be a no-op on some platforms.
-// len must be a multiple of kSystemPageSize bytes.
-BASE_EXPORT void RecommitSystemPages(void* address, size_t length);
+// Recommit one or more system pages with the given access. Decommitted system
+// pages must be recommitted with their original permissions before they are
+// used again. Note that this operation may be a no-op on some platforms.
+// length must be a multiple of kSystemPageSize bytes.
+// The result bool value indicates whether the recommit succeeded or
+// not. You must check the result (in most cases you need to CHECK that it is
+// true).
+BASE_EXPORT WARN_UNUSED_RESULT bool RecommitSystemPages(
+    void* address,
+    size_t length,
+    PageAccessibilityConfiguration page_accessibility);
 
 // Discard one or more system pages. Discarding is a hint to the system that
 // the page is no longer required. The hint may:
@@ -105,7 +107,7 @@
 // that the page is required again. Once written to, the content of the page is
 // guaranteed stable once more. After being written to, the page content may be
 // based on the original page content, or a page of zeroes.
-// len must be a multiple of kSystemPageSize bytes.
+// length must be a multiple of kSystemPageSize bytes.
 BASE_EXPORT void DiscardSystemPages(void* address, size_t length);
 
 ALWAYS_INLINE uintptr_t RoundUpToSystemPage(uintptr_t address) {
diff --git a/base/allocator/partition_allocator/partition_alloc.cc b/base/allocator/partition_allocator/partition_alloc.cc
index 1c23f10..7308a01 100644
--- a/base/allocator/partition_allocator/partition_alloc.cc
+++ b/base/allocator/partition_allocator/partition_alloc.cc
@@ -342,7 +342,7 @@
 static ALWAYS_INLINE void PartitionRecommitSystemPages(PartitionRootBase* root,
                                                        void* address,
                                                        size_t length) {
-  RecommitSystemPages(address, length);
+  CHECK(RecommitSystemPages(address, length, PageReadWrite));
   PartitionIncreaseCommittedPages(root, length);
 }
 
@@ -374,7 +374,7 @@
   // architectures.
   char* requestedAddress = root->next_super_page;
   char* super_page = reinterpret_cast<char*>(AllocPages(
-      requestedAddress, kSuperPageSize, kSuperPageSize, PageAccessible));
+      requestedAddress, kSuperPageSize, kSuperPageSize, PageReadWrite));
   if (UNLIKELY(!super_page))
     return 0;
 
@@ -389,12 +389,13 @@
   // hole in the middle.
   // This is where we put page metadata and also a tiny amount of extent
   // metadata.
-  SetSystemPagesInaccessible(super_page, kSystemPageSize);
-  SetSystemPagesInaccessible(super_page + (kSystemPageSize * 2),
-                             kPartitionPageSize - (kSystemPageSize * 2));
+  CHECK(SetSystemPagesAccess(super_page, kSystemPageSize, PageInaccessible));
+  CHECK(SetSystemPagesAccess(super_page + (kSystemPageSize * 2),
+                             kPartitionPageSize - (kSystemPageSize * 2),
+                             PageInaccessible));
   // Also make the last partition page a guard page.
-  SetSystemPagesInaccessible(super_page + (kSuperPageSize - kPartitionPageSize),
-                             kPartitionPageSize);
+  CHECK(SetSystemPagesAccess(super_page + (kSuperPageSize - kPartitionPageSize),
+                             kPartitionPageSize, PageInaccessible));
 
   // If we were after a specific address, but didn't get it, assume that
   // the system chose a lousy address. Here most OS'es have a default
@@ -644,7 +645,7 @@
   // TODO: these pages will be zero-filled. Consider internalizing an
   // allocZeroed() API so we can avoid a memset() entirely in this case.
   char* ptr = reinterpret_cast<char*>(
-      AllocPages(0, map_size, kSuperPageSize, PageAccessible));
+      AllocPages(0, map_size, kSuperPageSize, PageReadWrite));
   if (UNLIKELY(!ptr))
     return nullptr;
 
@@ -653,11 +654,12 @@
   PartitionIncreaseCommittedPages(root, committed_page_size);
 
   char* slot = ptr + kPartitionPageSize;
-  SetSystemPagesInaccessible(ptr + (kSystemPageSize * 2),
-                             kPartitionPageSize - (kSystemPageSize * 2));
+  CHECK(SetSystemPagesAccess(ptr + (kSystemPageSize * 2),
+                             kPartitionPageSize - (kSystemPageSize * 2),
+                             PageInaccessible));
 #if !defined(ARCH_CPU_64_BITS)
-  SetSystemPagesInaccessible(ptr, kSystemPageSize);
-  SetSystemPagesInaccessible(slot + size, kSystemPageSize);
+  CHECK(SetSystemPagesAccess(ptr, kSystemPageSize, PageInaccessible));
+  CHECK(SetSystemPagesAccess(slot + size, kSystemPageSize, PageInaccessible));
 #endif
 
   PartitionSuperPageExtentEntry* extent =
@@ -981,13 +983,14 @@
     // Shrink by decommitting unneeded pages and making them inaccessible.
     size_t decommitSize = current_size - new_size;
     PartitionDecommitSystemPages(root, char_ptr + new_size, decommitSize);
-    SetSystemPagesInaccessible(char_ptr + new_size, decommitSize);
+    CHECK(SetSystemPagesAccess(char_ptr + new_size, decommitSize,
+                               PageInaccessible));
   } else if (new_size <= partitionPageToDirectMapExtent(page)->map_size) {
     // Grow within the actually allocated memory. Just need to make the
     // pages accessible again.
     size_t recommit_size = new_size - current_size;
-    bool ret = SetSystemPagesAccessible(char_ptr + current_size, recommit_size);
-    CHECK(ret);
+    CHECK(SetSystemPagesAccess(char_ptr + current_size, recommit_size,
+                               PageReadWrite));
     PartitionRecommitSystemPages(root, char_ptr + current_size, recommit_size);
 
 #if DCHECK_IS_ON()
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index bb776f00..bcb2988d 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -1187,13 +1187,15 @@
   // with the goal of tripping up alignment of the next mapping.
   map1 = AllocPages(pageBase - kPageAllocationGranularity,
                     kPageAllocationGranularity, kPageAllocationGranularity,
-                    PageAccessible);
+                    PageReadWrite);
   EXPECT_TRUE(map1);
   map2 = AllocPages(pageBase + kSuperPageSize, kPageAllocationGranularity,
-                    kPageAllocationGranularity, PageAccessible);
+                    kPageAllocationGranularity, PageReadWrite);
   EXPECT_TRUE(map2);
-  SetSystemPagesInaccessible(map1, kPageAllocationGranularity);
-  SetSystemPagesInaccessible(map2, kPageAllocationGranularity);
+  EXPECT_TRUE(
+      SetSystemPagesAccess(map1, kPageAllocationGranularity, PageInaccessible));
+  EXPECT_TRUE(
+      SetSystemPagesAccess(map2, kPageAllocationGranularity, PageInaccessible));
 
   PartitionPage* pageInThirdSuperPage = GetFullPage(kTestAllocSize);
   FreePages(map1, kPageAllocationGranularity);
diff --git a/base/android/jni_generator/SampleForTests_jni.golden b/base/android/jni_generator/SampleForTests_jni.golden
index db497a3c..0594291 100644
--- a/base/android/jni_generator/SampleForTests_jni.golden
+++ b/base/android/jni_generator/SampleForTests_jni.golden
@@ -111,6 +111,7 @@
     Java_org_chromium_example_jni_1generator_SampleForTests_nativeInit(JNIEnv*
     env, jobject jcaller,
     jstring param) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller),
       base::android::JavaParamRef<jstring>(env, param));
 }
@@ -121,6 +122,7 @@
     jlong nativeCPPClass) {
   CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
   CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
+  HistogramValidator validator;
   return native->Destroy(env, base::android::JavaParamRef<jobject>(env,
       jcaller));
 }
@@ -131,6 +133,7 @@
 JNI_GENERATOR_EXPORT jdouble
     Java_org_chromium_example_jni_1generator_SampleForTests_nativeGetDoubleFunction(JNIEnv*
     env, jobject jcaller) {
+  HistogramValidator validator;
   return GetDoubleFunction(env, base::android::JavaParamRef<jobject>(env,
       jcaller));
 }
@@ -141,6 +144,7 @@
 JNI_GENERATOR_EXPORT jfloat
     Java_org_chromium_example_jni_1generator_SampleForTests_nativeGetFloatFunction(JNIEnv*
     env, jclass jcaller) {
+  HistogramValidator validator;
   return GetFloatFunction(env, base::android::JavaParamRef<jclass>(env,
       jcaller));
 }
@@ -153,6 +157,7 @@
     Java_org_chromium_example_jni_1generator_SampleForTests_nativeSetNonPODDatatype(JNIEnv*
     env, jobject jcaller,
     jobject rect) {
+  HistogramValidator validator;
   return SetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
       jcaller), base::android::JavaParamRef<jobject>(env, rect));
 }
@@ -163,6 +168,7 @@
 JNI_GENERATOR_EXPORT jobject
     Java_org_chromium_example_jni_1generator_SampleForTests_nativeGetNonPODDatatype(JNIEnv*
     env, jobject jcaller) {
+  HistogramValidator validator;
   return GetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
       jcaller)).Release();
 }
@@ -173,6 +179,7 @@
     jlong nativeCPPClass) {
   CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
   CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
+  HistogramValidator validator;
   return native->Method(env, base::android::JavaParamRef<jobject>(env,
       jcaller));
 }
@@ -184,6 +191,7 @@
   CPPClass::InnerClass* native =
       reinterpret_cast<CPPClass::InnerClass*>(nativePtr);
   CHECK_NATIVE_PTR(env, jcaller, native, "MethodOtherP0", 0);
+  HistogramValidator validator;
   return native->MethodOtherP0(env, base::android::JavaParamRef<jobject>(env,
       jcaller));
 }
@@ -195,6 +203,7 @@
     jobject b) {
   CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
   CHECK_NATIVE_PTR(env, jcaller, native, "AddStructB");
+  HistogramValidator validator;
   return native->AddStructB(env, base::android::JavaParamRef<jobject>(env,
       jcaller), base::android::JavaParamRef<jobject>(env, b));
 }
@@ -205,6 +214,7 @@
     jlong nativeCPPClass) {
   CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
   CHECK_NATIVE_PTR(env, jcaller, native, "IterateAndDoSomethingWithStructB");
+  HistogramValidator validator;
   return native->IterateAndDoSomethingWithStructB(env,
       base::android::JavaParamRef<jobject>(env, jcaller));
 }
@@ -215,6 +225,7 @@
     jlong nativeCPPClass) {
   CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
   CHECK_NATIVE_PTR(env, jcaller, native, "ReturnAString", NULL);
+  HistogramValidator validator;
   return native->ReturnAString(env, base::android::JavaParamRef<jobject>(env,
       jcaller)).Release();
 }
@@ -225,6 +236,7 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_example_jni_1generator_SampleForTests_00024InnerClass_nativeGetInnerIntFunction(JNIEnv*
     env, jclass jcaller) {
+  HistogramValidator validator;
   return GetInnerIntFunction(env, base::android::JavaParamRef<jclass>(env,
       jcaller));
 }
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index c7cee4b..5c3a39e 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -1032,6 +1032,7 @@
   ${PROFILING_ENTERED_NATIVE}
   ${P0_TYPE}* native = reinterpret_cast<${P0_TYPE}*>(${PARAM0_NAME});
   CHECK_NATIVE_PTR(env, jcaller, native, "${NAME}"${OPTIONAL_ERROR_RETURN});
+  HistogramValidator validator;
   return native->${NAME}(${PARAMS_IN_CALL})${POST_CALL};
 }
 """)
@@ -1041,6 +1042,7 @@
 
 JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
   ${PROFILING_ENTERED_NATIVE}
+  HistogramValidator validator;
   return ${NAME}(${PARAMS_IN_CALL})${POST_CALL};
 }
 """)
diff --git a/base/android/jni_generator/testInnerClassNatives.golden b/base/android/jni_generator/testInnerClassNatives.golden
index 93316ad..10aff7c 100644
--- a/base/android/jni_generator/testInnerClassNatives.golden
+++ b/base/android/jni_generator/testInnerClassNatives.golden
@@ -56,6 +56,7 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env, jobject
     jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
diff --git a/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden b/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden
index d9712089..0715b675 100644
--- a/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden
+++ b/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden
@@ -55,6 +55,7 @@
 
 JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(JNIEnv* env,
     jobject jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
@@ -64,6 +65,7 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv* env,
     jobject jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
diff --git a/base/android/jni_generator/testInnerClassNativesMultiple.golden b/base/android/jni_generator/testInnerClassNativesMultiple.golden
index ae93a86..360e10d8 100644
--- a/base/android/jni_generator/testInnerClassNativesMultiple.golden
+++ b/base/android/jni_generator/testInnerClassNativesMultiple.golden
@@ -73,6 +73,7 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env, jobject
     jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
@@ -82,6 +83,7 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv* env,
     jobject jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
diff --git a/base/android/jni_generator/testMultipleJNIAdditionalImport.golden b/base/android/jni_generator/testMultipleJNIAdditionalImport.golden
index 4a3d91c2..521d0f5 100644
--- a/base/android/jni_generator/testMultipleJNIAdditionalImport.golden
+++ b/base/android/jni_generator/testMultipleJNIAdditionalImport.golden
@@ -42,6 +42,7 @@
     env, jclass jcaller,
     jobject callback1,
     jobject callback2) {
+  HistogramValidator validator;
   return DoSomething(env, base::android::JavaParamRef<jclass>(env, jcaller),
       base::android::JavaParamRef<jobject>(env, callback1),
       base::android::JavaParamRef<jobject>(env, callback2));
diff --git a/base/android/jni_generator/testNativeExportsOnlyOption.golden b/base/android/jni_generator/testNativeExportsOnlyOption.golden
index f5be7c4..83d44efc 100644
--- a/base/android/jni_generator/testNativeExportsOnlyOption.golden
+++ b/base/android/jni_generator/testNativeExportsOnlyOption.golden
@@ -85,6 +85,7 @@
     jint arg1) {
   Test* native = reinterpret_cast<Test*>(nativeTest);
   CHECK_NATIVE_PTR(env, jcaller, native, "StaticMethod", 0);
+  HistogramValidator validator;
   return native->StaticMethod(env, base::android::JavaParamRef<jobject>(env,
       jcaller), arg1);
 }
@@ -96,6 +97,7 @@
     jint arg1) {
   Test* native = reinterpret_cast<Test*>(nativeTest);
   CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
+  HistogramValidator validator;
   return native->Method(env, base::android::JavaParamRef<jobject>(env, jcaller),
       arg1);
 }
@@ -106,6 +108,7 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_nativeInit(JNIEnv*
     env, jobject jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
@@ -115,6 +118,7 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_nativeInit(JNIEnv*
     env, jobject jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
diff --git a/base/android/jni_generator/testNatives.golden b/base/android/jni_generator/testNatives.golden
index b57f935..fbfdb7d 100644
--- a/base/android/jni_generator/testNatives.golden
+++ b/base/android/jni_generator/testNatives.golden
@@ -38,6 +38,7 @@
 
 JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(JNIEnv* env,
     jobject jcaller) {
+  HistogramValidator validator;
   return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
 }
 
@@ -47,6 +48,7 @@
   ChromeBrowserProvider* native =
       reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
   CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
+  HistogramValidator validator;
   return native->Destroy(env, base::android::JavaParamRef<jobject>(env,
       jcaller));
 }
@@ -61,6 +63,7 @@
   ChromeBrowserProvider* native =
       reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
   CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmark", 0);
+  HistogramValidator validator;
   return native->AddBookmark(env, base::android::JavaParamRef<jobject>(env,
       jcaller), base::android::JavaParamRef<jstring>(env, url),
       base::android::JavaParamRef<jstring>(env, title), isFolder, parentId);
@@ -74,6 +77,7 @@
     Java_org_chromium_TestJni_nativeGetDomainAndRegistry(JNIEnv* env, jclass
     jcaller,
     jstring url) {
+  HistogramValidator validator;
   return GetDomainAndRegistry(env, base::android::JavaParamRef<jclass>(env,
       jcaller), base::android::JavaParamRef<jstring>(env, url)).Release();
 }
@@ -88,6 +92,7 @@
     jclass jcaller,
     jbyteArray state,
     jint tab_index) {
+  HistogramValidator validator;
   return CreateHistoricalTabFromState(env,
       base::android::JavaParamRef<jclass>(env, jcaller),
       base::android::JavaParamRef<jbyteArray>(env, state), tab_index);
@@ -101,6 +106,7 @@
     Java_org_chromium_TestJni_nativeGetStateAsByteArray(JNIEnv* env, jobject
     jcaller,
     jobject view) {
+  HistogramValidator validator;
   return GetStateAsByteArray(env, base::android::JavaParamRef<jobject>(env,
       jcaller), base::android::JavaParamRef<jobject>(env, view)).Release();
 }
@@ -112,6 +118,7 @@
 JNI_GENERATOR_EXPORT jobjectArray
     Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs(JNIEnv* env, jclass
     jcaller) {
+  HistogramValidator validator;
   return GetAutofillProfileGUIDs(env, base::android::JavaParamRef<jclass>(env,
       jcaller)).Release();
 }
@@ -126,6 +133,7 @@
     jcaller,
     jint sessionId,
     jobjectArray results) {
+  HistogramValidator validator;
   return SetRecognitionResults(env, base::android::JavaParamRef<jobject>(env,
       jcaller), sessionId, base::android::JavaParamRef<jobjectArray>(env,
       results));
@@ -145,6 +153,7 @@
   ChromeBrowserProvider* native =
       reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
   CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmarkFromAPI", 0);
+  HistogramValidator validator;
   return native->AddBookmarkFromAPI(env,
       base::android::JavaParamRef<jobject>(env, jcaller),
       base::android::JavaParamRef<jstring>(env, url),
@@ -163,6 +172,7 @@
 JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeFindAll(JNIEnv* env,
     jobject jcaller,
     jstring find) {
+  HistogramValidator validator;
   return FindAll(env, base::android::JavaParamRef<jobject>(env, jcaller),
       base::android::JavaParamRef<jstring>(env, find));
 }
@@ -172,6 +182,7 @@
 
 JNI_GENERATOR_EXPORT jobject
     Java_org_chromium_TestJni_nativeGetInnerClass(JNIEnv* env, jclass jcaller) {
+  HistogramValidator validator;
   return GetInnerClass(env, base::android::JavaParamRef<jclass>(env,
       jcaller)).Release();
 }
@@ -186,6 +197,7 @@
   ChromeBrowserProvider* native =
       reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
   CHECK_NATIVE_PTR(env, jcaller, native, "QueryBitmap", NULL);
+  HistogramValidator validator;
   return native->QueryBitmap(env, base::android::JavaParamRef<jobject>(env,
       jcaller), base::android::JavaParamRef<jobjectArray>(env, projection),
       base::android::JavaParamRef<jstring>(env, selection),
@@ -202,6 +214,7 @@
   DataFetcherImplAndroid* native =
       reinterpret_cast<DataFetcherImplAndroid*>(nativeDataFetcherImplAndroid);
   CHECK_NATIVE_PTR(env, jcaller, native, "GotOrientation");
+  HistogramValidator validator;
   return native->GotOrientation(env, base::android::JavaParamRef<jobject>(env,
       jcaller), alpha, beta, gamma);
 }
@@ -215,6 +228,7 @@
     Java_org_chromium_TestJni_nativeMessWithJavaException(JNIEnv* env, jclass
     jcaller,
     jthrowable e) {
+  HistogramValidator validator;
   return MessWithJavaException(env, base::android::JavaParamRef<jclass>(env,
       jcaller), base::android::JavaParamRef<jthrowable>(env, e)).Release();
 }
diff --git a/base/android/jni_generator/testNativesLong.golden b/base/android/jni_generator/testNativesLong.golden
index 18d58fa4..ccdda75 100644
--- a/base/android/jni_generator/testNativesLong.golden
+++ b/base/android/jni_generator/testNativesLong.golden
@@ -38,6 +38,7 @@
   ChromeBrowserProvider* native =
       reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
   CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
+  HistogramValidator validator;
   return native->Destroy(env, base::android::JavaParamRef<jobject>(env,
       jcaller));
 }
diff --git a/base/android/jni_generator/testSingleJNIAdditionalImport.golden b/base/android/jni_generator/testSingleJNIAdditionalImport.golden
index c8b6907..45685029 100644
--- a/base/android/jni_generator/testSingleJNIAdditionalImport.golden
+++ b/base/android/jni_generator/testSingleJNIAdditionalImport.golden
@@ -40,6 +40,7 @@
 JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(JNIEnv*
     env, jclass jcaller,
     jobject callback) {
+  HistogramValidator validator;
   return DoSomething(env, base::android::JavaParamRef<jclass>(env, jcaller),
       base::android::JavaParamRef<jobject>(env, callback));
 }
diff --git a/base/android/jni_int_wrapper.h b/base/android/jni_int_wrapper.h
index fa0f3d5..e01e00b 100644
--- a/base/android/jni_int_wrapper.h
+++ b/base/android/jni_int_wrapper.h
@@ -5,6 +5,18 @@
 #ifndef BASE_ANDROID_JNI_INT_WRAPPER_H_
 #define BASE_ANDROID_JNI_INT_WRAPPER_H_
 
+// This isn't really the proper place for such a definition but it's only a
+// temporary CL for testing and will be reverted after a single build.
+// Placing it here is simply easier that creating a new header file for
+// this.
+#include "base/metrics/statistics_recorder.h"  // crbug/744734
+
+class HistogramValidator {
+ public:
+  HistogramValidator() { base::StatisticsRecorder::ValidateAllHistograms(-1); }
+  ~HistogramValidator() { base::StatisticsRecorder::ValidateAllHistograms(-2); }
+};
+
 // Wrapper used to receive int when calling Java from native.
 // The wrapper disallows automatic conversion of long to int.
 // This is to avoid a common anti-pattern where a Java int is used
diff --git a/base/linux_util.cc b/base/linux_util.cc
index bf50471..851a6c6 100644
--- a/base/linux_util.cc
+++ b/base/linux_util.cc
@@ -22,6 +22,7 @@
 #include "base/process/launch.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
+#include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
 #include "base/synchronization/lock.h"
 #include "build/build_config.h"
@@ -199,25 +200,24 @@
     std::string status;
     if (!ReadFileToString(FilePath(buf), &status))
       return -1;
-    StringPairs pairs;
-    SplitStringIntoKeyValuePairs(status, ':', '\n', &pairs);
-    for (const auto& pair : pairs) {
-      const std::string& key = pair.first;
-      const std::string& value_str = pair.second;
-      if (key == "NSpid") {
-        if (ns_pid_supported)
-          *ns_pid_supported = true;
-        std::vector<StringPiece> split_value_str = SplitStringPiece(
-            value_str, "\t", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
-        DCHECK_NE(split_value_str.size(), 0u);
-        int value;
-        // The last value in the list is the PID in the namespace.
-        if (StringToInt(split_value_str.back(), &value) && value == ns_tid) {
-          // The first value in the list is the real PID.
-          if (StringToInt(split_value_str.front(), &value))
-            return value;
-        }
+    StringTokenizer tokenizer(status, "\n");
+    while (tokenizer.GetNext()) {
+      StringPiece value_str(tokenizer.token_piece());
+      if (!value_str.starts_with("NSpid"))
+        continue;
+      if (ns_pid_supported)
+        *ns_pid_supported = true;
+      std::vector<StringPiece> split_value_str = SplitStringPiece(
+          value_str, "\t", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
+      DCHECK_GE(split_value_str.size(), 2u);
+      int value;
+      // The last value in the list is the PID in the namespace.
+      if (StringToInt(split_value_str.back(), &value) && value == ns_tid) {
+        // The second value in the list is the real PID.
+        if (StringToInt(split_value_str[1], &value))
+          return value;
       }
+      break;
     }
   }
   return -1;
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index fdc4c1a2..300692ac 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -559,22 +559,10 @@
   };
 
   uint32_t bad_fields = 0;
-  if (!unlogged_samples_)
-    bad_fields |= 1 << kUnloggedSamplesField;
-  else if (!unlogged_samples_->bucket_ranges())
-    bad_fields |= 1 << kUnloggedBucketRangesField;
-  if (!logged_samples_)
-    bad_fields |= 1 << kLoggedSamplesField;
-  else if (!logged_samples_->bucket_ranges())
-    bad_fields |= 1 << kLoggedBucketRangesField;
-  else if (logged_samples_->id() == 0)
-    bad_fields |= 1 << kIdField;
-  else if (histogram_name().length() > 20 && histogram_name().at(20) == '\0')
+  if (histogram_name().length() > 20 && histogram_name().at(20) == '\0')
     bad_fields |= 1 << kHistogramNameField;
   else if (histogram_name().length() > 40 && histogram_name().at(40) == '\0')
     bad_fields |= 1 << kHistogramNameField;
-  if (flags() == 0)
-    bad_fields |= 1 << kFlagsField;
   if (dummy_ != kDummyValue)
     bad_fields |= 1 << kDummyField;
 
@@ -589,7 +577,7 @@
   // Temporary for https://crbug.com/736675.
   base::debug::ScopedCrashKey crash_key("bad_histogram", debug_string);
 #endif
-  // CHECK(false) << debug_string;
+  CHECK(false) << debug_string;
   debug::Alias(&bad_fields);
   return false;
 }
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py
index 611439fb..6a727900 100755
--- a/build/android/apk_operations.py
+++ b/build/android/apk_operations.py
@@ -447,18 +447,22 @@
       print line
 
 
-# TODO(agrieve):add "--all" in the MultipleDevicesError message and use it here.
-def _GenerateMissingAllFlagMessage(devices):
+def _GenerateAvailableDevicesMessage(devices):
   devices_obj = device_utils.DeviceUtils.parallel(devices)
   descriptions = devices_obj.pMap(lambda d: d.build_description).pGet(None)
-  msg = ('More than one device available. Use --all to select all devices, '
-         'or use --device to select a device by serial.\n\nAvailable '
-         'devices:\n')
+  msg = 'Available devices:\n'
   for d, desc in zip(devices, descriptions):
     msg += '  %s (%s)\n' % (d, desc)
   return msg
 
 
+# TODO(agrieve):add "--all" in the MultipleDevicesError message and use it here.
+def _GenerateMissingAllFlagMessage(devices):
+  return ('More than one device available. Use --all to select all devices, ' +
+          'or use --device to select a device by serial.\n\n' +
+          _GenerateAvailableDevicesMessage(devices))
+
+
 def _DisplayArgs(devices, device_args_file):
   def flags_helper(d):
     changer = flag_changer.FlagChanger(d, device_args_file)
@@ -605,6 +609,10 @@
     # TODO(agrieve): Device cache should not depend on output directory.
     #     Maybe put int /tmp?
     _LoadDeviceCaches(devices, args.output_directory)
+    # Ensure these keys always exist. They are set by wrapper scripts, but not
+    # always added when not using wrapper scripts.
+    args.__dict__.setdefault('apk_path', None)
+    args.__dict__.setdefault('incremental_json', None)
 
     try:
       if len(devices) > 1:
@@ -664,6 +672,15 @@
       raise
 
 
+class _DevicesCommand(_Command):
+  name = 'devices'
+  description = 'Describe attached devices.'
+  all_devices_by_default = True
+
+  def Run(self):
+    print _GenerateAvailableDevicesMessage(self.devices)
+
+
 class _InstallCommand(_Command):
   name = 'install'
   description = 'Installs the APK to one or more devices.'
@@ -847,6 +864,7 @@
 
 
 _COMMANDS = [
+    _DevicesCommand,
     _InstallCommand,
     _UninstallCommand,
     _LaunchCommand,
diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py
index 1c968df..0020b28 100644
--- a/build/android/pylib/gtest/gtest_test_instance.py
+++ b/build/android/pylib/gtest/gtest_test_instance.py
@@ -15,6 +15,7 @@
 from pylib.constants import host_paths
 from pylib.base import base_test_result
 from pylib.base import test_instance
+from pylib.symbols import stack_symbolizer
 
 with host_paths.SysPath(host_paths.BUILD_COMMON_PATH):
   import unittest_util # pylint: disable=import-error
@@ -85,6 +86,9 @@
 _RE_DISABLED = re.compile(r'DISABLED_')
 _RE_FLAKY = re.compile(r'FLAKY_')
 
+# Detect stack line in stdout.
+_STACK_LINE_RE = re.compile(r'\s*#\d+')
+
 def ParseGTestListTests(raw_list):
   """Parses a raw test list as provided by --gtest_list_tests.
 
@@ -120,27 +124,40 @@
   return ret
 
 
-def ParseGTestOutput(output):
+def ParseGTestOutput(output, symbolizer, device_abi):
   """Parses raw gtest output and returns a list of results.
 
   Args:
     output: A list of output lines.
+    symbolizer: The symbolizer used to symbolize stack.
+    device_abi: Device abi that is needed for symbolization.
   Returns:
     A list of base_test_result.BaseTestResults.
   """
   duration = 0
   fallback_result_type = None
   log = []
+  stack = []
   result_type = None
   results = []
   test_name = None
 
+  def symbolize_stack_and_merge_with_log():
+    log_string = '\n'.join(log or [])
+    if not stack:
+      stack_string = ''
+    else:
+      stack_string = '\n'.join(
+          symbolizer.ExtractAndResolveNativeStackTraces(
+              stack, device_abi))
+    return '%s\n%s' % (log_string, stack_string)
+
   def handle_possibly_unknown_test():
     if test_name is not None:
       results.append(base_test_result.BaseTestResult(
           TestNameWithoutDisabledPrefix(test_name),
           fallback_result_type or base_test_result.ResultType.UNKNOWN,
-          duration, log=('\n'.join(log) if log else '')))
+          duration, log=symbolize_stack_and_merge_with_log()))
 
   for l in output:
     matcher = _RE_TEST_STATUS.match(l)
@@ -150,6 +167,7 @@
         duration = 0
         fallback_result_type = None
         log = []
+        stack = []
         result_type = None
       elif matcher.group(1) == 'OK':
         result_type = base_test_result.ResultType.PASS
@@ -170,12 +188,15 @@
         duration = 0 # Don't know.
 
     if log is not None:
-      log.append(l)
+      if _STACK_LINE_RE.match(l):
+        stack.append(l)
+      else:
+        log.append(l)
 
     if result_type and test_name:
       results.append(base_test_result.BaseTestResult(
           TestNameWithoutDisabledPrefix(test_name), result_type, duration,
-          log=('\n'.join(log) if log else '')))
+          log=symbolize_stack_and_merge_with_log()))
       test_name = None
 
   handle_possibly_unknown_test()
@@ -268,6 +289,7 @@
     self._store_tombstones = args.store_tombstones
     self._total_external_shards = args.test_launcher_total_shards
     self._suite = args.suite_name[0]
+    self._symbolizer = stack_symbolizer.Symbolizer(None, False)
 
     # GYP:
     if args.executable_dist_dir:
@@ -423,6 +445,10 @@
     return self._suite
 
   @property
+  def symbolizer(self):
+    return self._symbolizer
+
+  @property
   def test_apk_incremental_install_json(self):
     return self._test_apk_incremental_install_json
 
diff --git a/build/android/pylib/gtest/gtest_test_instance_test.py b/build/android/pylib/gtest/gtest_test_instance_test.py
index 5f6fdc25..95f9b00 100755
--- a/build/android/pylib/gtest/gtest_test_instance_test.py
+++ b/build/android/pylib/gtest/gtest_test_instance_test.py
@@ -98,7 +98,7 @@
       '[ RUN      ] FooTest.Bar',
       '[       OK ] FooTest.Bar (1 ms)',
     ]
-    actual = gtest_test_instance.ParseGTestOutput(raw_output)
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
     self.assertEquals(1, len(actual))
     self.assertEquals('FooTest.Bar', actual[0].GetName())
     self.assertEquals(1, actual[0].GetDuration())
@@ -109,7 +109,7 @@
       '[ RUN      ] FooTest.Bar',
       '[   FAILED ] FooTest.Bar (1 ms)',
     ]
-    actual = gtest_test_instance.ParseGTestOutput(raw_output)
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
     self.assertEquals(1, len(actual))
     self.assertEquals('FooTest.Bar', actual[0].GetName())
     self.assertEquals(1, actual[0].GetDuration())
@@ -120,7 +120,7 @@
       '[ RUN      ] FooTest.Bar',
       '[  CRASHED ] FooTest.Bar (1 ms)',
     ]
-    actual = gtest_test_instance.ParseGTestOutput(raw_output)
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
     self.assertEquals(1, len(actual))
     self.assertEquals('FooTest.Bar', actual[0].GetName())
     self.assertEquals(1, actual[0].GetDuration())
@@ -131,7 +131,7 @@
       '[ RUN      ] FooTest.Bar',
       '[ERROR:blah] Currently running: FooTest.Bar',
     ]
-    actual = gtest_test_instance.ParseGTestOutput(raw_output)
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
     self.assertEquals(1, len(actual))
     self.assertEquals('FooTest.Bar', actual[0].GetName())
     self.assertEquals(0, actual[0].GetDuration())
@@ -141,7 +141,7 @@
     raw_output = [
       '[ RUN      ] FooTest.Bar',
     ]
-    actual = gtest_test_instance.ParseGTestOutput(raw_output)
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
     self.assertEquals(1, len(actual))
     self.assertEquals('FooTest.Bar', actual[0].GetName())
     self.assertEquals(0, actual[0].GetDuration())
@@ -153,7 +153,7 @@
       '[ RUN      ] FooTest.Baz',
       '[       OK ] FooTest.Baz (1 ms)',
     ]
-    actual = gtest_test_instance.ParseGTestOutput(raw_output)
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
     self.assertEquals(2, len(actual))
 
     self.assertEquals('FooTest.Bar', actual[0].GetName())
@@ -170,7 +170,7 @@
       '[ CRASHED      ]',
       '[       OK ] FooTest.Bar (1 ms)',
     ]
-    actual = gtest_test_instance.ParseGTestOutput(raw_output)
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
     self.assertEquals(1, len(actual))
 
     self.assertEquals('FooTest.Bar', actual[0].GetName())
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py
index 3226230..5e701754 100644
--- a/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -441,7 +441,8 @@
     if self._test_instance.enable_xml_result_parsing:
       results = gtest_test_instance.ParseGTestXML(gtest_xml)
     else:
-      results = gtest_test_instance.ParseGTestOutput(output)
+      results = gtest_test_instance.ParseGTestOutput(
+          output, self._test_instance.symbolizer, device.product_cpu_abi)
 
     # Check whether there are any crashed testcases.
     self._crashes.update(r.GetName() for r in results
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index c8ba7419..ba5473f7 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2816,6 +2816,8 @@
         "//base:base_java",
         "//testing/android/appurify_support:appurify_support_java",
         "//testing/android/reporter:reporter_java",
+        ":${target_name}__runtime_deps",
+        ":${target_name}__secondary_abi_runtime_deps",
       ]
       data_deps += [
         "//build/android/pylib/device/commands",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 0acb460..9cba67e 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -899,14 +899,12 @@
 #   configs -= [ "//build/config/compiler:clang_stackrealign" ]
 # See https://crbug.com/556393 for details of where it must be avoided.
 config("clang_stackrealign") {
-  if (is_clang && current_cpu == "x86" && (is_android || is_linux)) {
-    # Android needs -mstackrealign due to a bug on ia32 Jelly Bean.
-    # See crbug.com/521527
-    cflags = [ "-mstackrealign" ]
-    if (is_linux) {
+  if (is_clang && current_cpu == "x86" && is_linux) {
+    cflags = [
       # Align the stack on 16-byte boundaries, http://crbug.com/418554.
-      cflags += [ "-mstack-alignment=16" ]
-    }
+      "-mstack-alignment=16",
+      "-mstackrealign",
+    ]
   }
 }
 
diff --git a/build/toolchain/win/midl.py b/build/toolchain/win/midl.py
index b7fdc5c..e2a3ffd6 100644
--- a/build/toolchain/win/midl.py
+++ b/build/toolchain/win/midl.py
@@ -2,12 +2,61 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import difflib
+import distutils.dir_util
+import filecmp
 import os
+import re
+import shutil
 import subprocess
 import sys
+import tempfile
+
+
+def ZapTimestamp(filename):
+  # midl.exe writes timestamp 2147483647 (2^31 - 1) as creation date into its
+  # outputs, but using the local timezone.  To make the output timezone-
+  # independent, replace that date with a fixed string of the same length.
+  if filename.endswith('.tlb'):
+    lookbehind = 'Created by MIDL version 8\.01\.0622 '
+  else:
+    lookbehind = 'File created by MIDL compiler version 8\.01\.0622 \*/\r\n/\* '
+  contents = open(filename, 'rb').read()
+  contents = re.sub(r'(?<=%s)at ... Jan 1. ..:..:.. 2038' % lookbehind,
+                            'at a redacted point in time', contents)
+  open(filename, 'wb').write(contents)
 
 
 def main(arch, outdir, tlb, h, dlldata, iid, proxy, idl, *flags):
+  # chromoting_lib.idl uses a uuid that's hashed of chrome's version string,
+  # i.e. it changes every few compiles.  So a checked-in file does not work
+  # for chromoting_lib.idl.  For now, call midl.exe for remoting instead of
+  # using checked-in artifacts for it.
+  is_chromoting = os.path.basename(idl) == 'chromoting_lib.idl'
+
+  # Copy checked-in outputs to final location.
+  THIS_DIR = os.path.abspath(os.path.dirname(__file__))
+  source = os.path.join(THIS_DIR, "..", "..", "..",
+      "third_party", "win_build_output", outdir.replace('gen/', 'midl/'))
+  if os.path.isdir(os.path.join(source, os.path.basename(idl))):
+    source = os.path.join(source, os.path.basename(idl))
+  source = os.path.join(source, arch.split('.')[1])  # Append 'x86' or 'x64'.
+  if not is_chromoting:
+    distutils.dir_util.copy_tree(source, outdir, preserve_times=False)
+
+  # On non-Windows, that's all we can do.
+  if sys.platform != 'win32':
+    return 0 if not is_chromoting else 1
+
+  # On Windows, run midl.exe on the input and check that its outputs are
+  # identical to the checked-in outputs.
+  if not is_chromoting:
+    tmp_dir = tempfile.mkdtemp()
+    delete_tmp_dir = True
+  else:
+    tmp_dir = outdir
+    delete_tmp_dir = False
+
   # Read the environment block from the file. This is stored in the format used
   # by CreateProcess. Drop last 2 NULs, one for list terminator, one for
   # trailing vs. separator.
@@ -15,28 +64,55 @@
   env_dict = dict([item.split('=', 1) for item in env_pairs])
 
   args = ['midl', '/nologo'] + list(flags) + [
-      '/out', outdir,
+      '/out', tmp_dir,
       '/tlb', tlb,
       '/h', h,
       '/dlldata', dlldata,
       '/iid', iid,
       '/proxy', proxy,
       idl]
-  popen = subprocess.Popen(args, shell=True, env=env_dict,
-                           stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-  out, _ = popen.communicate()
-  # Filter junk out of stdout, and write filtered versions. Output we want
-  # to filter is pairs of lines that look like this:
-  # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl
-  # objidl.idl
-  lines = out.splitlines()
-  prefixes = ('Processing ', '64 bit Processing ')
-  processing = set(os.path.basename(x)
-                   for x in lines if x.startswith(prefixes))
-  for line in lines:
-    if not line.startswith(prefixes) and line not in processing:
-      print line
-  return popen.returncode
+  try:
+    popen = subprocess.Popen(args, shell=True, env=env_dict,
+                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+    out, _ = popen.communicate()
+    # Filter junk out of stdout, and write filtered versions. Output we want
+    # to filter is pairs of lines that look like this:
+    # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl
+    # objidl.idl
+    lines = out.splitlines()
+    prefixes = ('Processing ', '64 bit Processing ')
+    processing = set(os.path.basename(x)
+                     for x in lines if x.startswith(prefixes))
+    for line in lines:
+      if not line.startswith(prefixes) and line not in processing:
+        print line
+    if popen.returncode != 0:
+      return popen.returncode
+    if is_chromoting:
+      return 0
+
+    for f in os.listdir(tmp_dir):
+      ZapTimestamp(os.path.join(tmp_dir, f))
+
+    # Now compare the output in tmp_dir to the checked-in outputs.
+    diff = filecmp.dircmp(tmp_dir, source)
+    if diff.diff_files or set(diff.left_list) != set(diff.right_list):
+      print 'midl.exe output different from files in %s, see %s' \
+          % (source, tmp_dir)
+      diff.report()
+      for f in diff.diff_files:
+        if f.endswith('.tlb'): continue
+        fromfile = os.path.join(source, f)
+        tofile = os.path.join(tmp_dir, f)
+        print ''.join(difflib.unified_diff(open(fromfile, 'U').readlines(),
+                                           open(tofile, 'U').readlines(),
+                                           fromfile, tofile))
+      delete_tmp_dir = False
+      sys.exit(1)
+    return 0
+  finally:
+    if os.path.exists(tmp_dir) and delete_tmp_dir:
+      shutil.rmtree(tmp_dir)
 
 
 if __name__ == '__main__':
diff --git a/build/win/message_compiler.py b/build/win/message_compiler.py
index b6fd03e..7edfe6e2 100644
--- a/build/win/message_compiler.py
+++ b/build/win/message_compiler.py
@@ -7,22 +7,67 @@
 #
 # Usage: message_compiler.py <environment_file> [<args to mc.exe>*]
 
+import distutils.dir_util
+import filecmp
 import os
+import re
+import shutil
 import subprocess
 import sys
+import tempfile
 
 def main():
+  env_file, rest = sys.argv[1], sys.argv[2:]
+
+  # Parse some argument flags.
+  header_dir = None
+  resource_dir = None
+  input_file = None
+  for i, arg in enumerate(rest):
+    if arg == '-h' and len(rest) > i + 1:
+      assert header_dir == None
+      header_dir = rest[i + 1]
+    elif arg == '-r' and len(rest) > i + 1:
+      assert resource_dir == None
+      resource_dir = rest[i + 1]
+    elif arg.endswith('.mc') or arg.endswith('.man'):
+      assert input_file == None
+      input_file = arg
+
+  # Copy checked-in outputs to final location.
+  THIS_DIR = os.path.abspath(os.path.dirname(__file__))
+  assert header_dir == resource_dir
+  source = os.path.join(THIS_DIR, "..", "..",
+      "third_party", "win_build_output",
+      re.sub(r'^(?:[^/]+/)?gen/', 'mc/', header_dir))
+  distutils.dir_util.copy_tree(source, header_dir, preserve_times=False)
+
+  # On non-Windows, that's all we can do.
+  if sys.platform != 'win32':
+    return
+
+  # On Windows, run mc.exe on the input and check that its outputs are
+  # identical to the checked-in outputs.
+
   # Read the environment block from the file. This is stored in the format used
   # by CreateProcess. Drop last 2 NULs, one for list terminator, one for
   # trailing vs. separator.
-  env_pairs = open(sys.argv[1]).read()[:-2].split('\0')
+  env_pairs = open(env_file).read()[:-2].split('\0')
   env_dict = dict([item.split('=', 1) for item in env_pairs])
 
   # mc writes to stderr, so this explicitly redirects to stdout and eats it.
   try:
+    tmp_dir = tempfile.mkdtemp()
+    delete_tmp_dir = True
+    if header_dir:
+      rest[rest.index('-h') + 1] = tmp_dir
+      header_dir = tmp_dir
+    if resource_dir:
+      rest[rest.index('-r') + 1] = tmp_dir
+      resource_dir = tmp_dir
+
     # This needs shell=True to search the path in env_dict for the mc
     # executable.
-    rest = sys.argv[2:]
     subprocess.check_output(['mc.exe'] + rest,
                             env=env_dict,
                             stderr=subprocess.STDOUT,
@@ -35,15 +80,6 @@
     # it generates an ANSI header, and includes broken versions of the message
     # text in the comment before the value. To work around this, for any invalid
     # // comment lines, we simply drop the line in the header after building it.
-    header_dir = None
-    input_file = None
-    for i, arg in enumerate(rest):
-      if arg == '-h' and len(rest) > i + 1:
-        assert header_dir == None
-        header_dir = rest[i + 1]
-      elif arg.endswith('.mc') or arg.endswith('.man'):
-        assert input_file == None
-        input_file = arg
     if header_dir:
       header_file = os.path.join(
           header_dir, os.path.splitext(os.path.basename(input_file))[0] + '.h')
@@ -55,9 +91,21 @@
           header_contents.append(line)
       with open(header_file, 'wb') as f:
         f.write(''.join(header_contents))
+
+    # mc.exe invocation and post-processing are complete, now compare the output
+    # in tmp_dir to the checked-in outputs.
+    diff = filecmp.dircmp(tmp_dir, source)
+    if diff.diff_files or set(diff.left_list) != set(diff.right_list):
+      print >>sys.stderr, 'mc.exe output different from files in %s, see %s' % (
+          source, tmp_dir)
+      delete_tmp_dir = False
+      sys.exit(1)
   except subprocess.CalledProcessError as e:
     print e.output
     sys.exit(e.returncode)
+  finally:
+    if os.path.exists(tmp_dir) and delete_tmp_dir:
+      shutil.rmtree(tmp_dir)
 
 if __name__ == '__main__':
   main()
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index c53c861..cecbbddc 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -76,8 +76,6 @@
     "layers/layer_position_constraint.h",
     "layers/layer_sticky_position_constraint.cc",
     "layers/layer_sticky_position_constraint.h",
-    "layers/layer_utils.cc",
-    "layers/layer_utils.h",
     "layers/nine_patch_layer.cc",
     "layers/nine_patch_layer.h",
     "layers/nine_patch_layer_impl.cc",
@@ -661,7 +659,6 @@
     "layers/layer_list_iterator_unittest.cc",
     "layers/layer_position_constraint_unittest.cc",
     "layers/layer_unittest.cc",
-    "layers/layer_utils_unittest.cc",
     "layers/nine_patch_layer_impl_unittest.cc",
     "layers/nine_patch_layer_unittest.cc",
     "layers/painted_scrollbar_layer_impl_unittest.cc",
diff --git a/cc/animation/animation_host.cc b/cc/animation/animation_host.cc
index c3ec776..992ef5b 100644
--- a/cc/animation/animation_host.cc
+++ b/cc/animation/animation_host.cc
@@ -471,24 +471,6 @@
   return element_animations->HasAnyAnimationTargetingProperty(property);
 }
 
-bool AnimationHost::HasTransformAnimationThatInflatesBounds(
-    ElementId element_id) const {
-  auto element_animations = GetElementAnimationsForElementId(element_id);
-  return element_animations
-             ? element_animations->HasTransformAnimationThatInflatesBounds()
-             : false;
-}
-
-bool AnimationHost::TransformAnimationBoundsForBox(ElementId element_id,
-                                                   const gfx::BoxF& box,
-                                                   gfx::BoxF* bounds) const {
-  *bounds = gfx::BoxF();
-  auto element_animations = GetElementAnimationsForElementId(element_id);
-  return element_animations
-             ? element_animations->TransformAnimationBoundsForBox(box, bounds)
-             : true;
-}
-
 bool AnimationHost::HasOnlyTranslationTransforms(
     ElementId element_id,
     ElementListType list_type) const {
diff --git a/cc/animation/animation_host.h b/cc/animation/animation_host.h
index a40f99f6..1ada563 100644
--- a/cc/animation/animation_host.h
+++ b/cc/animation/animation_host.h
@@ -133,13 +133,6 @@
       ElementId element_id,
       TargetProperty::Type property) const override;
 
-  bool HasTransformAnimationThatInflatesBounds(
-      ElementId element_id) const override;
-
-  bool TransformAnimationBoundsForBox(ElementId element_id,
-                                      const gfx::BoxF& box,
-                                      gfx::BoxF* bounds) const override;
-
   bool HasOnlyTranslationTransforms(ElementId element_id,
                                     ElementListType list_type) const override;
   bool AnimationsPreserveAxisAlignment(ElementId element_id) const override;
diff --git a/cc/animation/animation_player.cc b/cc/animation/animation_player.cc
index b44c736..c480e8e 100644
--- a/cc/animation/animation_player.cc
+++ b/cc/animation/animation_player.cc
@@ -829,43 +829,6 @@
   UpdateTickingState(UpdateTickingType::NORMAL);
 }
 
-bool AnimationPlayer::HasTransformAnimationThatInflatesBounds() const {
-  return IsCurrentlyAnimatingProperty(TargetProperty::TRANSFORM,
-                                      ElementListType::ACTIVE) ||
-         IsCurrentlyAnimatingProperty(TargetProperty::TRANSFORM,
-                                      ElementListType::PENDING);
-}
-
-bool AnimationPlayer::TransformAnimationBoundsForBox(const gfx::BoxF& box,
-                                                     gfx::BoxF* bounds) const {
-  DCHECK(HasTransformAnimationThatInflatesBounds())
-      << "TransformAnimationBoundsForBox will give incorrect results if there "
-      << "are no transform animations affecting bounds, non-animated transform "
-      << "is not known";
-
-  // Compute bounds based on animations for which is_finished() is false.
-  // Do nothing if there are no such animations; in this case, it is assumed
-  // that callers will take care of computing bounds based on the owning layer's
-  // actual transform.
-  *bounds = gfx::BoxF();
-  for (size_t i = 0; i < animations_.size(); ++i) {
-    if (animations_[i]->is_finished() ||
-        animations_[i]->target_property_id() != TargetProperty::TRANSFORM)
-      continue;
-
-    const TransformAnimationCurve* transform_animation_curve =
-        animations_[i]->curve()->ToTransformAnimationCurve();
-    gfx::BoxF animation_bounds;
-    bool success =
-        transform_animation_curve->AnimatedBoundsForBox(box, &animation_bounds);
-    if (!success)
-      return false;
-    bounds->Union(animation_bounds);
-  }
-
-  return true;
-}
-
 bool AnimationPlayer::HasOnlyTranslationTransforms(
     ElementListType list_type) const {
   for (size_t i = 0; i < animations_.size(); ++i) {
diff --git a/cc/animation/animation_player.h b/cc/animation/animation_player.h
index 277854b2..6a543d6 100644
--- a/cc/animation/animation_player.h
+++ b/cc/animation/animation_player.h
@@ -122,10 +122,6 @@
   // are deleted.
   void ActivateAnimations();
 
-  bool HasTransformAnimationThatInflatesBounds() const;
-
-  bool TransformAnimationBoundsForBox(const gfx::BoxF& box,
-                                      gfx::BoxF* bounds) const;
   bool HasOnlyTranslationTransforms(ElementListType list_type) const;
   bool AnimationsPreserveAxisAlignment() const;
 
diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc
index 3a8f9c7..5126a71 100644
--- a/cc/animation/element_animations.cc
+++ b/cc/animation/element_animations.cc
@@ -196,31 +196,6 @@
   UpdateClientAnimationState();
 }
 
-bool ElementAnimations::HasTransformAnimationThatInflatesBounds() const {
-  for (auto& player : players_list_) {
-    if (player.HasTransformAnimationThatInflatesBounds())
-      return true;
-  }
-  return false;
-}
-
-bool ElementAnimations::TransformAnimationBoundsForBox(
-    const gfx::BoxF& box,
-    gfx::BoxF* bounds) const {
-  *bounds = gfx::BoxF();
-
-  for (auto& player : players_list_) {
-    if (!player.HasTransformAnimationThatInflatesBounds())
-      continue;
-    gfx::BoxF player_bounds;
-    bool success = player.TransformAnimationBoundsForBox(box, &player_bounds);
-    if (!success)
-      return false;
-    bounds->Union(player_bounds);
-  }
-  return true;
-}
-
 bool ElementAnimations::HasOnlyTranslationTransforms(
     ElementListType list_type) const {
   for (auto& player : players_list_) {
diff --git a/cc/animation/element_animations.h b/cc/animation/element_animations.h
index 8f41e5c..73ffb12 100644
--- a/cc/animation/element_animations.h
+++ b/cc/animation/element_animations.h
@@ -114,8 +114,6 @@
     has_element_in_pending_list_ = has_element_in_pending_list;
   }
 
-  bool HasTransformAnimationThatInflatesBounds() const;
-
   bool TransformAnimationBoundsForBox(const gfx::BoxF& box,
                                       gfx::BoxF* bounds) const;
 
diff --git a/cc/animation/element_animations_unittest.cc b/cc/animation/element_animations_unittest.cc
index 7e3242f..620ee137 100644
--- a/cc/animation/element_animations_unittest.cc
+++ b/cc/animation/element_animations_unittest.cc
@@ -1673,113 +1673,6 @@
             client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
-TEST_F(ElementAnimationsTest, TransformAnimationBounds) {
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
-
-  std::unique_ptr<KeyframedTransformAnimationCurve> curve1(
-      KeyframedTransformAnimationCurve::Create());
-
-  TransformOperations operations1;
-  curve1->AddKeyframe(
-      TransformKeyframe::Create(base::TimeDelta(), operations1, nullptr));
-  operations1.AppendTranslate(10.0, 15.0, 0.0);
-  curve1->AddKeyframe(TransformKeyframe::Create(
-      base::TimeDelta::FromSecondsD(1.0), operations1, nullptr));
-
-  std::unique_ptr<Animation> animation(
-      Animation::Create(std::move(curve1), 1, 1, TargetProperty::TRANSFORM));
-  player_impl_->AddAnimation(std::move(animation));
-
-  std::unique_ptr<KeyframedTransformAnimationCurve> curve2(
-      KeyframedTransformAnimationCurve::Create());
-
-  TransformOperations operations2;
-  curve2->AddKeyframe(
-      TransformKeyframe::Create(base::TimeDelta(), operations2, nullptr));
-  operations2.AppendScale(2.0, 3.0, 4.0);
-  curve2->AddKeyframe(TransformKeyframe::Create(
-      base::TimeDelta::FromSecondsD(1.0), operations2, nullptr));
-
-  animation =
-      Animation::Create(std::move(curve2), 2, 2, TargetProperty::TRANSFORM);
-  player_impl_->AddAnimation(std::move(animation));
-
-  gfx::BoxF box(1.f, 2.f, -1.f, 3.f, 4.f, 5.f);
-  gfx::BoxF bounds;
-
-  EXPECT_TRUE(player_impl_->TransformAnimationBoundsForBox(box, &bounds));
-  EXPECT_EQ(gfx::BoxF(1.f, 2.f, -4.f, 13.f, 19.f, 20.f).ToString(),
-            bounds.ToString());
-
-  player_impl_->GetAnimationById(1)->SetRunState(Animation::FINISHED,
-                                                 TicksFromSecondsF(0.0));
-
-  // Only the unfinished animation should affect the animated bounds.
-  EXPECT_TRUE(player_impl_->TransformAnimationBoundsForBox(box, &bounds));
-  EXPECT_EQ(gfx::BoxF(1.f, 2.f, -4.f, 7.f, 16.f, 20.f).ToString(),
-            bounds.ToString());
-
-  player_impl_->GetAnimationById(2)->SetRunState(Animation::FINISHED,
-                                                 TicksFromSecondsF(0.0));
-
-  // There are no longer any running animations.
-  EXPECT_FALSE(player_impl_->HasTransformAnimationThatInflatesBounds());
-
-  // Add an animation whose bounds we don't yet support computing.
-  std::unique_ptr<KeyframedTransformAnimationCurve> curve3(
-      KeyframedTransformAnimationCurve::Create());
-  TransformOperations operations3;
-  gfx::Transform transform3;
-  transform3.Scale3d(1.0, 2.0, 3.0);
-  curve3->AddKeyframe(
-      TransformKeyframe::Create(base::TimeDelta(), operations3, nullptr));
-  operations3.AppendMatrix(transform3);
-  curve3->AddKeyframe(TransformKeyframe::Create(
-      base::TimeDelta::FromSecondsD(1.0), operations3, nullptr));
-  animation =
-      Animation::Create(std::move(curve3), 3, 3, TargetProperty::TRANSFORM);
-  player_impl_->AddAnimation(std::move(animation));
-  EXPECT_FALSE(player_impl_->TransformAnimationBoundsForBox(box, &bounds));
-}
-
-TEST_F(ElementAnimationsTest, TransformAnimationBoundsTwoPlayers) {
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
-
-  scoped_refptr<AnimationPlayer> player2 =
-      AnimationPlayer::Create(AnimationIdProvider::NextPlayerId());
-  timeline_->AttachPlayer(player2);
-  player2->AttachElement(element_id_);
-
-  std::unique_ptr<KeyframedTransformAnimationCurve> curve(
-      KeyframedTransformAnimationCurve::Create());
-
-  TransformOperations operations;
-  curve->AddKeyframe(
-      TransformKeyframe::Create(base::TimeDelta(), operations, nullptr));
-  operations.AppendScale(2.0, 3.0, 4.0);
-  curve->AddKeyframe(TransformKeyframe::Create(
-      base::TimeDelta::FromSecondsD(1.0), operations, nullptr));
-
-  std::unique_ptr<Animation> animation(
-      Animation::Create(std::move(curve), 1, 1, TargetProperty::TRANSFORM));
-  player2->AddAnimation(std::move(animation));
-
-  gfx::BoxF box(1.f, 2.f, -1.f, 3.f, 4.f, 5.f);
-  gfx::BoxF bounds;
-
-  EXPECT_FALSE(player_impl_->HasTransformAnimationThatInflatesBounds());
-  EXPECT_TRUE(player2->TransformAnimationBoundsForBox(box, &bounds));
-  EXPECT_EQ(gfx::BoxF(1.f, 2.f, -4.f, 7.f, 16.f, 20.f).ToString(),
-            bounds.ToString());
-
-  EXPECT_TRUE(
-      element_animations_->TransformAnimationBoundsForBox(box, &bounds));
-  EXPECT_EQ(gfx::BoxF(1.f, 2.f, -4.f, 7.f, 16.f, 20.f).ToString(),
-            bounds.ToString());
-}
-
 // Tests that AbortAnimations aborts all animations targeting the specified
 // property.
 TEST_F(ElementAnimationsTest, AbortAnimations) {
diff --git a/cc/ipc/cc_param_traits.cc b/cc/ipc/cc_param_traits.cc
index 2e0d2aab..2f45cd0 100644
--- a/cc/ipc/cc_param_traits.cc
+++ b/cc/ipc/cc_param_traits.cc
@@ -32,49 +32,6 @@
 
 namespace IPC {
 
-void ParamTraits<cc::FilterOperation>::GetSize(base::PickleSizer* s,
-                                               const param_type& p) {
-  GetParamSize(s, p.type());
-  switch (p.type()) {
-    case cc::FilterOperation::GRAYSCALE:
-    case cc::FilterOperation::SEPIA:
-    case cc::FilterOperation::SATURATE:
-    case cc::FilterOperation::HUE_ROTATE:
-    case cc::FilterOperation::INVERT:
-    case cc::FilterOperation::BRIGHTNESS:
-    case cc::FilterOperation::SATURATING_BRIGHTNESS:
-    case cc::FilterOperation::CONTRAST:
-    case cc::FilterOperation::OPACITY:
-      GetParamSize(s, p.amount());
-      break;
-    case cc::FilterOperation::BLUR:
-      GetParamSize(s, p.amount());
-      GetParamSize(s, p.blur_tile_mode());
-      break;
-    case cc::FilterOperation::DROP_SHADOW:
-      GetParamSize(s, p.drop_shadow_offset());
-      GetParamSize(s, p.amount());
-      GetParamSize(s, p.drop_shadow_color());
-      break;
-    case cc::FilterOperation::COLOR_MATRIX:
-      for (int i = 0; i < 20; ++i)
-        GetParamSize(s, p.matrix()[i]);
-      break;
-    case cc::FilterOperation::ZOOM:
-      GetParamSize(s, p.amount());
-      GetParamSize(s, p.zoom_inset());
-      break;
-    case cc::FilterOperation::REFERENCE:
-      GetParamSize(s, p.image_filter());
-      break;
-    case cc::FilterOperation::ALPHA_THRESHOLD:
-      GetParamSize(s, p.amount());
-      GetParamSize(s, p.outer_threshold());
-      GetParamSize(s, p.shape());
-      break;
-  }
-}
-
 void ParamTraits<cc::FilterOperation>::Write(base::Pickle* m,
                                              const param_type& p) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"),
@@ -272,14 +229,6 @@
   l->append(")");
 }
 
-void ParamTraits<cc::FilterOperations>::GetSize(base::PickleSizer* s,
-                                                const param_type& p) {
-  GetParamSize(s, base::checked_cast<uint32_t>(p.size()));
-  for (std::size_t i = 0; i < p.size(); ++i) {
-    GetParamSize(s, p.at(i));
-  }
-}
-
 void ParamTraits<cc::FilterOperations>::Write(base::Pickle* m,
                                               const param_type& p) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"),
@@ -319,17 +268,6 @@
   l->append(")");
 }
 
-void ParamTraits<sk_sp<SkImageFilter>>::GetSize(base::PickleSizer* s,
-                                                const param_type& p) {
-  SkImageFilter* filter = p.get();
-  if (filter) {
-    sk_sp<SkData> data(SkValidatingSerializeFlattenable(filter));
-    s->AddData(base::checked_cast<int>(data->size()));
-  } else {
-    s->AddData(0);
-  }
-}
-
 void ParamTraits<sk_sp<SkImageFilter>>::Write(base::Pickle* m,
                                               const param_type& p) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"),
@@ -461,10 +399,10 @@
   // The largest quad type, verified by a unit test.
   to_reserve += p.quad_list.size() * cc::LargestDrawQuadSize();
 
-  base::PickleSizer sizer;
-  GetParamSize(&sizer, p.filters);
-  GetParamSize(&sizer, p.background_filters);
-  to_reserve += sizer.payload_size();
+  to_reserve +=
+      sizeof(uint32_t) + p.filters.size() * sizeof(cc::FilterOperation);
+  to_reserve += sizeof(uint32_t) +
+                p.background_filters.size() * sizeof(cc::FilterOperation);
 
   return to_reserve;
 }
@@ -671,12 +609,6 @@
   l->append("])");
 }
 
-void ParamTraits<viz::FrameSinkId>::GetSize(base::PickleSizer* s,
-                                            const param_type& p) {
-  GetParamSize(s, p.client_id());
-  GetParamSize(s, p.sink_id());
-}
-
 void ParamTraits<viz::FrameSinkId>::Write(base::Pickle* m,
                                           const param_type& p) {
   WriteParam(m, p.client_id());
@@ -706,12 +638,6 @@
   l->append(")");
 }
 
-void ParamTraits<viz::LocalSurfaceId>::GetSize(base::PickleSizer* s,
-                                               const param_type& p) {
-  GetParamSize(s, p.local_id());
-  GetParamSize(s, p.nonce());
-}
-
 void ParamTraits<viz::LocalSurfaceId>::Write(base::Pickle* m,
                                              const param_type& p) {
   WriteParam(m, p.local_id());
@@ -742,12 +668,6 @@
   l->append(")");
 }
 
-void ParamTraits<viz::SurfaceId>::GetSize(base::PickleSizer* s,
-                                          const param_type& p) {
-  GetParamSize(s, p.frame_sink_id());
-  GetParamSize(s, p.local_surface_id());
-}
-
 void ParamTraits<viz::SurfaceId>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.frame_sink_id());
   WriteParam(m, p.local_surface_id());
@@ -776,13 +696,6 @@
   l->append(")");
 }
 
-void ParamTraits<viz::SurfaceInfo>::GetSize(base::PickleSizer* s,
-                                            const param_type& p) {
-  GetParamSize(s, p.id());
-  GetParamSize(s, p.device_scale_factor());
-  GetParamSize(s, p.size_in_pixels());
-}
-
 void ParamTraits<viz::SurfaceInfo>::Write(base::Pickle* m,
                                           const param_type& p) {
   WriteParam(m, p.id());
@@ -906,13 +819,6 @@
   l->append("])");
 }
 
-void ParamTraits<cc::DrawQuad::Resources>::GetSize(base::PickleSizer* s,
-                                                   const param_type& p) {
-  GetParamSize(s, p.count);
-  for (size_t i = 0; i < p.count; ++i)
-    GetParamSize(s, p.ids[i]);
-}
-
 void ParamTraits<cc::DrawQuad::Resources>::Write(base::Pickle* m,
                                                  const param_type& p) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"),
@@ -957,20 +863,6 @@
   l->append("])");
 }
 
-void ParamTraits<cc::YUVVideoDrawQuad>::GetSize(base::PickleSizer* s,
-                                                const param_type& p) {
-  ParamTraits<cc::DrawQuad>::GetSize(s, p);
-  GetParamSize(s, p.ya_tex_coord_rect);
-  GetParamSize(s, p.uv_tex_coord_rect);
-  GetParamSize(s, p.ya_tex_size);
-  GetParamSize(s, p.uv_tex_size);
-  GetParamSize(s, p.color_space);
-  GetParamSize(s, p.video_color_space);
-  GetParamSize(s, p.resource_offset);
-  GetParamSize(s, p.resource_multiplier);
-  GetParamSize(s, p.bits_per_channel);
-}
-
 void ParamTraits<cc::YUVVideoDrawQuad>::Write(base::Pickle* m,
                                               const param_type& p) {
   ParamTraits<cc::DrawQuad>::Write(m, p);
@@ -1027,12 +919,6 @@
   l->append("])");
 }
 
-void ParamTraits<viz::BeginFrameAck>::GetSize(base::PickleSizer* s,
-                                              const param_type& p) {
-  GetParamSize(s, p.sequence_number);
-  GetParamSize(s, p.source_id);
-}
-
 void ParamTraits<viz::BeginFrameAck>::Write(base::Pickle* m,
                                             const param_type& p) {
   m->WriteUInt64(p.sequence_number);
@@ -1058,13 +944,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef CC_IPC_CC_PARAM_TRAITS_MACROS_H_
-#include "cc/ipc/cc_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/cc/ipc/cc_param_traits.h b/cc/ipc/cc_param_traits.h
index a8ce4fa..2c87073 100644
--- a/cc/ipc/cc_param_traits.h
+++ b/cc/ipc/cc_param_traits.h
@@ -26,7 +26,6 @@
 template <>
 struct ParamTraits<cc::FilterOperation> {
   typedef cc::FilterOperation param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -37,7 +36,6 @@
 template <>
 struct ParamTraits<cc::FilterOperations> {
   typedef cc::FilterOperations param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -48,7 +46,6 @@
 template <>
 struct ParamTraits<sk_sp<SkImageFilter>> {
   typedef sk_sp<SkImageFilter> param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -69,7 +66,6 @@
 template <>
 struct CC_IPC_EXPORT ParamTraits<viz::FrameSinkId> {
   typedef viz::FrameSinkId param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -80,7 +76,6 @@
 template <>
 struct CC_IPC_EXPORT ParamTraits<viz::LocalSurfaceId> {
   typedef viz::LocalSurfaceId param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -91,7 +86,6 @@
 template <>
 struct CC_IPC_EXPORT ParamTraits<viz::SurfaceId> {
   typedef viz::SurfaceId param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -102,7 +96,6 @@
 template <>
 struct CC_IPC_EXPORT ParamTraits<viz::SurfaceInfo> {
   typedef viz::SurfaceInfo param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -123,7 +116,6 @@
 template <>
 struct CC_IPC_EXPORT ParamTraits<cc::DrawQuad::Resources> {
   typedef cc::DrawQuad::Resources param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -134,7 +126,6 @@
 template <>
 struct CC_IPC_EXPORT ParamTraits<cc::YUVVideoDrawQuad> {
   typedef cc::YUVVideoDrawQuad param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -145,7 +136,6 @@
 template <>
 struct CC_IPC_EXPORT ParamTraits<viz::BeginFrameAck> {
   typedef viz::BeginFrameAck param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 2cc1480..c3d251a 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -24,7 +24,6 @@
 #include "cc/input/main_thread_scrolling_reason.h"
 #include "cc/input/scroll_state.h"
 #include "cc/layers/layer.h"
-#include "cc/layers/layer_utils.h"
 #include "cc/quads/debug_border_draw_quad.h"
 #include "cc/quads/render_pass.h"
 #include "cc/trees/clip_node.h"
@@ -40,7 +39,6 @@
 #include "cc/trees/transform_node.h"
 #include "components/viz/common/quads/copy_output_request.h"
 #include "components/viz/common/traced_value.h"
-#include "ui/gfx/geometry/box_f.h"
 #include "ui/gfx/geometry/point_conversions.h"
 #include "ui/gfx/geometry/quad_f.h"
 #include "ui/gfx/geometry/rect_conversions.h"
@@ -781,10 +779,6 @@
   state->SetBoolean("has_will_change_transform_hint",
                     has_will_change_transform_hint());
 
-  gfx::BoxF box;
-  if (LayerUtils::GetAnimationBounds(*this, &box))
-    MathUtil::AddToTracedValue("animation_bounds", box, state);
-
   if (debug_info_) {
     std::string str;
     debug_info_->AppendAsTraceFormat(&str);
diff --git a/cc/layers/layer_utils.cc b/cc/layers/layer_utils.cc
deleted file mode 100644
index 715fd06f..0000000
--- a/cc/layers/layer_utils.cc
+++ /dev/null
@@ -1,117 +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.
-
-#include "cc/layers/layer_utils.h"
-
-#include "cc/layers/layer_impl.h"
-#include "cc/trees/layer_tree_host_common.h"
-#include "cc/trees/layer_tree_impl.h"
-#include "cc/trees/transform_node.h"
-#include "ui/gfx/geometry/box_f.h"
-
-namespace cc {
-
-namespace {
-
-inline bool HasAncestorTransformAnimation(const TransformNode* transform_node) {
-  return transform_node->to_screen_is_potentially_animated;
-}
-
-inline bool HasAncestorFilterAnimation(const LayerImpl& layer) {
-  // This function returns false, it should use the effect tree once filters
-  // and filter animations are known by the tree.
-  return false;
-}
-
-}  // namespace
-
-bool LayerUtils::GetAnimationBounds(const LayerImpl& layer_in, gfx::BoxF* out) {
-  // We don't care about animated bounds for invisible layers.
-  if (!layer_in.DrawsContent())
-    return false;
-
-  TransformTree& transform_tree =
-      layer_in.layer_tree_impl()->property_trees()->transform_tree;
-
-  // We also don't care for layers that are not animated or a child of an
-  // animated layer.
-  if (!HasAncestorTransformAnimation(
-          transform_tree.Node(layer_in.transform_tree_index())) &&
-      !HasAncestorFilterAnimation(layer_in))
-    return false;
-
-  // To compute the inflated bounds for a layer, we start by taking its bounds
-  // and converting it to a 3d box, and then we transform or inflate it
-  // repeatedly as we walk up the transform tree to the root.
-  //
-  // At each transform_node without transform animation that inflates bounds:
-  //
-  //   1) We concat transform_node->data.to_parent to the coalesced_transform.
-  //
-  // At each transform_node with a transform animation that inflates bounds:
-  //
-  //   1) We concat transform_node->data.pre_local to the coalesced_transform.
-  //   This is to translate the box so that the anchor point is the origin.
-  //   2) We apply coalesced_transform to the 3d box and make the transform
-  //   identity. This is apply the accumulated transform to the box to inflate
-  //   it.
-  //   3) We inflate the 3d box for animation as the node has a animated
-  //   transform.
-  //   4) We concat transform_node->data.post_local to the coalesced_transform.
-  //   This step undoes the translation in step (1), accounts for the layer's
-  //   position and the 2d translation to the space of the parent transform
-  //   node.
-
-  gfx::BoxF box(layer_in.bounds().width(), layer_in.bounds().height(), 0.f);
-
-  // We want to inflate/transform the box as few times as possible. Each time
-  // we do this, we have to make the box axis aligned again, so if we make many
-  // small adjustments to the box by transforming it repeatedly rather than
-  // once by the product of all these matrices, we will accumulate a bunch of
-  // unnecessary inflation because of the the many axis-alignment fixes. This
-  // matrix stores said product.
-  gfx::Transform coalesced_transform;
-
-  const TransformNode* transform_node =
-      transform_tree.Node(layer_in.transform_tree_index());
-
-  // If layer_in has a transform node, the offset_to_transform_parent() is 0
-  coalesced_transform.Translate(layer_in.offset_to_transform_parent().x(),
-                                layer_in.offset_to_transform_parent().y());
-
-  for (; transform_tree.parent(transform_node);
-       transform_node = transform_tree.parent(transform_node)) {
-    // Filter animation bounds are unimplemented, see function
-    // HasAncestorFilterAnimation() for reference.
-
-    if (transform_node->element_id != ElementId() &&
-        layer_in.GetMutatorHost()->HasTransformAnimationThatInflatesBounds(
-            transform_node->element_id)) {
-      coalesced_transform.ConcatTransform(transform_node->pre_local);
-      coalesced_transform.TransformBox(&box);
-      coalesced_transform.MakeIdentity();
-
-      gfx::BoxF inflated;
-      if (!layer_in.GetMutatorHost()->TransformAnimationBoundsForBox(
-              transform_node->element_id, box, &inflated))
-        return false;
-      box = inflated;
-
-      coalesced_transform.ConcatTransform(transform_node->post_local);
-    } else {
-      coalesced_transform.ConcatTransform(transform_node->to_parent);
-    }
-  }
-
-  // If we've got an unapplied coalesced transform at this point, it must still
-  // be applied.
-  if (!coalesced_transform.IsIdentity())
-    coalesced_transform.TransformBox(&box);
-
-  *out = box;
-
-  return true;
-}
-
-}  // namespace cc
diff --git a/cc/layers/layer_utils.h b/cc/layers/layer_utils.h
deleted file mode 100644
index e4a2088..0000000
--- a/cc/layers/layer_utils.h
+++ /dev/null
@@ -1,29 +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.
-
-#ifndef CC_LAYERS_LAYER_UTILS_H_
-#define CC_LAYERS_LAYER_UTILS_H_
-
-#include "cc/cc_export.h"
-
-namespace gfx {
-class BoxF;
-}  // namespace gfx
-
-namespace cc {
-class LayerImpl;
-
-class CC_EXPORT LayerUtils {
- public:
-  // Computes a box in screen space that should entirely contain the layer's
-  // bounds through the entirety of the layer's current animation. Returns
-  // true and sets |out| to the inflation if there are animations that can
-  // inflate bounds in the path to the root layer and that it was able to
-  // inflate correctly. Returns false otherwise.
-  static bool GetAnimationBounds(const LayerImpl& layer, gfx::BoxF* out);
-};
-
-}  // namespace cc
-
-#endif  // CC_LAYERS_LAYER_UTILS_H_
diff --git a/cc/layers/layer_utils_unittest.cc b/cc/layers/layer_utils_unittest.cc
deleted file mode 100644
index 119ce90e..0000000
--- a/cc/layers/layer_utils_unittest.cc
+++ /dev/null
@@ -1,585 +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.
-
-#include "cc/layers/layer_utils.h"
-
-#include "cc/animation/animation_host.h"
-#include "cc/animation/animation_id_provider.h"
-#include "cc/animation/transform_operations.h"
-#include "cc/layers/layer_impl.h"
-#include "cc/test/animation_test_common.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_host_impl.h"
-#include "cc/test/test_task_graph_runner.h"
-#include "cc/trees/layer_tree_host_common.h"
-#include "cc/trees/layer_tree_impl.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/geometry/box_f.h"
-#include "ui/gfx/test/gfx_util.h"
-
-namespace cc {
-namespace {
-
-float diagonal(float width, float height) {
-  return std::sqrt(width * width + height * height);
-}
-
-class LayerUtilsGetAnimationBoundsTest : public testing::Test {
- public:
-  LayerUtilsGetAnimationBoundsTest()
-      : host_impl_(&task_runner_provider_, &task_graph_runner_),
-        root_(CreateTwoForkTree(&host_impl_)),
-        parent1_(root_->test_properties()->children[0]),
-        parent2_(root_->test_properties()->children[1]),
-        child1_(parent1_->test_properties()->children[0]),
-        child2_(parent2_->test_properties()->children[0]),
-        grand_child_(child2_->test_properties()->children[0]),
-        great_grand_child_(grand_child_->test_properties()->children[0]) {
-    timeline_ =
-        AnimationTimeline::Create(AnimationIdProvider::NextTimelineId());
-    host_impl_.animation_host()->AddAnimationTimeline(timeline_);
-    host_impl_.active_tree()->SetElementIdsForTesting();
-  }
-
-  LayerImpl* root() { return root_; }
-  LayerImpl* parent1() { return parent1_; }
-  LayerImpl* child1() { return child1_; }
-  LayerImpl* parent2() { return parent2_; }
-  LayerImpl* child2() { return child2_; }
-  LayerImpl* grand_child() { return grand_child_; }
-  LayerImpl* great_grand_child() { return great_grand_child_; }
-
-  scoped_refptr<AnimationTimeline> timeline() { return timeline_; }
-  FakeLayerTreeHostImpl& host_impl() { return host_impl_; }
-
- private:
-  static LayerImpl* CreateTwoForkTree(LayerTreeHostImpl* host_impl) {
-    std::unique_ptr<LayerImpl> root =
-        LayerImpl::Create(host_impl->active_tree(), 1);
-    LayerImpl* root_ptr = root.get();
-    root->test_properties()->AddChild(
-        LayerImpl::Create(host_impl->active_tree(), 2));
-    root->test_properties()->children[0]->test_properties()->AddChild(
-        LayerImpl::Create(host_impl->active_tree(), 3));
-    root->test_properties()->AddChild(
-        LayerImpl::Create(host_impl->active_tree(), 4));
-    root->test_properties()->children[1]->test_properties()->AddChild(
-        LayerImpl::Create(host_impl->active_tree(), 5));
-    root->test_properties()
-        ->children[1]
-        ->test_properties()
-        ->children[0]
-        ->test_properties()
-        ->AddChild(LayerImpl::Create(host_impl->active_tree(), 6));
-    root->test_properties()
-        ->children[1]
-        ->test_properties()
-        ->children[0]
-        ->test_properties()
-        ->children[0]
-        ->test_properties()
-        ->AddChild(LayerImpl::Create(host_impl->active_tree(), 7));
-    host_impl->active_tree()->SetRootLayerForTesting(std::move(root));
-    return root_ptr;
-  }
-
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  TestTaskGraphRunner task_graph_runner_;
-  FakeLayerTreeHostImpl host_impl_;
-  LayerImpl* root_;
-  LayerImpl* parent1_;
-  LayerImpl* parent2_;
-  LayerImpl* child1_;
-  LayerImpl* child2_;
-  LayerImpl* grand_child_;
-  LayerImpl* great_grand_child_;
-  scoped_refptr<AnimationTimeline> timeline_;
-};
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, ScaleRoot) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendScale(1.f, 1.f, 1.f);
-  TransformOperations end;
-  end.AppendScale(2.f, 2.f, 1.f);
-  AddAnimatedTransformToElementWithPlayer(root()->element_id(), timeline(),
-                                          duration, start, end);
-
-  root()->SetPosition(gfx::PointF());
-  parent1()->SetPosition(gfx::PointF());
-  parent1()->SetBounds(gfx::Size(350, 200));
-
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(150.f, 50.f));
-  child1()->SetBounds(gfx::Size(100, 200));
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(150.f, 50.f, 0.f, 350.f, 450.f, 0.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, TranslateParentLayer) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendTranslate(0.f, 0.f, 0.f);
-  TransformOperations end;
-  end.AppendTranslate(50.f, 50.f, 0.f);
-  AddAnimatedTransformToElementWithPlayer(parent1()->element_id(), timeline(),
-                                          duration, start, end);
-
-  parent1()->SetBounds(gfx::Size(350, 200));
-
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(150.f, 50.f));
-  child1()->SetBounds(gfx::Size(100, 200));
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(150.f, 50.f, 0.f, 150.f, 250.f, 0.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, TranslateChildLayer) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendTranslate(0.f, 0.f, 0.f);
-  TransformOperations end;
-  end.AppendTranslate(50.f, 50.f, 0.f);
-  AddAnimatedTransformToElementWithPlayer(child1()->element_id(), timeline(),
-                                          duration, start, end);
-  parent1()->SetBounds(gfx::Size(350, 200));
-
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(150.f, 50.f));
-  child1()->SetBounds(gfx::Size(100, 200));
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(150.f, 50.f, 0.f, 150.f, 250.f, 0.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, TranslateBothLayers) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendTranslate(0.f, 0.f, 0.f);
-  TransformOperations child_end;
-  child_end.AppendTranslate(50.f, 0.f, 0.f);
-  AddAnimatedTransformToElementWithPlayer(parent1()->element_id(), timeline(),
-                                          duration, start, child_end);
-
-  TransformOperations grand_child_end;
-  grand_child_end.AppendTranslate(0.f, 50.f, 0.f);
-  AddAnimatedTransformToElementWithPlayer(child1()->element_id(), timeline(),
-                                          duration, start, grand_child_end);
-
-  parent1()->SetBounds(gfx::Size(350, 200));
-
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(150.f, 50.f));
-  child1()->SetBounds(gfx::Size(100, 200));
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(150.f, 50.f, 0.f, 150.f, 250.f, 0.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, RotateXNoPerspective) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendRotate(1.f, 0.f, 0.f, 0.f);
-  TransformOperations end;
-  end.AppendRotate(1.f, 0.f, 0.f, 90.f);
-
-  AddAnimatedTransformToElementWithPlayer(child1()->element_id(), timeline(),
-                                          duration, start, end);
-
-  parent1()->SetBounds(gfx::Size(350, 200));
-
-  gfx::Size bounds(100, 100);
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(150.f, 50.f));
-  child1()->SetBounds(bounds);
-  child1()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.5f, bounds.height() * 0.5f, 0);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(150.f, 50.f, -50.f, 100.f, 100.f, 100.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, RotateXWithPerspective) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendRotate(1.f, 0.f, 0.f, 0.f);
-  TransformOperations end;
-  end.AppendRotate(1.f, 0.f, 0.f, 90.f);
-
-  AddAnimatedTransformToElementWithPlayer(child1()->element_id(), timeline(),
-                                          duration, start, end);
-
-  // Make the anchor point not the default 0.5 value and line up with the
-  // child center to make the math easier.
-  parent1()->test_properties()->transform_origin =
-      gfx::Point3F(0.375f * 400.f, 0.375f * 400.f, 0.f);
-  parent1()->SetBounds(gfx::Size(400, 400));
-
-  gfx::Transform perspective;
-  perspective.ApplyPerspectiveDepth(100.f);
-  parent1()->test_properties()->transform = perspective;
-
-  gfx::Size bounds(100, 100);
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(100.f, 100.f));
-  child1()->SetBounds(bounds);
-  child1()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.5f, bounds.height() * 0.5f, 0);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(50.f, 50.f, -33.333336f, 200.f, 200.f, 133.333344f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, RotateXWithPerspectiveOnSameLayer) {
-  // This test is used to check whether GetAnimationBounds correctly ignores the
-  // local transform when there is an animation applied to the layer / node.
-  // The intended behavior is that the animation should overwrite the transform.
-
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendRotate(1.f, 0.f, 0.f, 0.f);
-  TransformOperations end;
-  end.AppendRotate(1.f, 0.f, 0.f, 90.f);
-
-  AddAnimatedTransformToElementWithPlayer(parent1()->element_id(), timeline(),
-                                          duration, start, end);
-
-  // Make the anchor point not the default 0.5 value and line up
-  // with the child center to make the math easier.
-  parent1()->test_properties()->transform_origin =
-      gfx::Point3F(0.375f * 400.f, 0.375f * 400.f, 0.f);
-  parent1()->SetBounds(gfx::Size(400, 400));
-
-  gfx::Transform perspective;
-  perspective.ApplyPerspectiveDepth(100.f);
-  parent1()->test_properties()->transform = perspective;
-
-  gfx::Size bounds(100, 100);
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(100.f, 100.f));
-  child1()->SetBounds(bounds);
-  child1()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.5f, bounds.height() * 0.5f, 0);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(100.f, 100.f, -50.f, 100.f, 100.f, 100.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, RotateZ) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendRotate(0.f, 0.f, 1.f, 0.f);
-  TransformOperations end;
-  end.AppendRotate(0.f, 0.f, 1.f, 90.f);
-  AddAnimatedTransformToElementWithPlayer(child1()->element_id(), timeline(),
-                                          duration, start, end);
-
-  parent1()->SetBounds(gfx::Size(350, 200));
-
-  gfx::Size bounds(100, 100);
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(150.f, 50.f));
-  child1()->SetBounds(bounds);
-  child1()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.5f, bounds.height() * 0.5f, 0);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_TRUE(success);
-  float diag = diagonal(bounds.width(), bounds.height());
-  gfx::BoxF expected(150.f + 0.5f * (bounds.width() - diag),
-                     50.f + 0.5f * (bounds.height() - diag),
-                     0.f,
-                     diag,
-                     diag,
-                     0.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest, MismatchedTransforms) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendTranslate(5, 6, 7);
-  TransformOperations end;
-  end.AppendRotate(0.f, 0.f, 1.f, 90.f);
-  AddAnimatedTransformToElementWithPlayer(child1()->element_id(), timeline(),
-                                          duration, start, end);
-
-  parent1()->SetBounds(gfx::Size(350, 200));
-
-  gfx::Size bounds(100, 100);
-  child1()->SetDrawsContent(true);
-  child1()->SetPosition(gfx::PointF(150.f, 50.f));
-  child1()->SetBounds(bounds);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*child1(), &box);
-  EXPECT_FALSE(success);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest,
-       TransformUnderAncestorsWithPositionOr2DTransform) {
-  // Tree topology:
-  // +root (Bounds)
-  // +--parent2 (Position)
-  // +----child2 (2d transform)
-  // +------grand_child (Transform animation)
-  // +--------great_grand_child (DrawsContent)
-  // This test is used to check if GetAnimationBounds correctly skips layers and
-  // take layers which do not own a transform_node into consideration.
-  // Under this topology, only root and grand_child own transform_nodes.
-
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendTranslate(0.f, 0.f, 0.f);
-  TransformOperations great_grand_child_end;
-  great_grand_child_end.AppendTranslate(50.f, 0.f, 0.f);
-  AddAnimatedTransformToElementWithPlayer(grand_child()->element_id(),
-                                          timeline(), duration, start,
-                                          great_grand_child_end);
-
-  gfx::Transform translate_2d_transform;
-  translate_2d_transform.Translate(80.f, 60.f);
-  root()->SetBounds(gfx::Size(350, 200));
-  parent2()->SetPosition(gfx::PointF(40.f, 45.f));
-  child2()->test_properties()->transform = translate_2d_transform;
-  great_grand_child()->SetDrawsContent(true);
-  great_grand_child()->SetPosition(gfx::PointF(150.f, 50.f));
-  great_grand_child()->SetBounds(gfx::Size(100, 200));
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*great_grand_child(), &box);
-  EXPECT_TRUE(success);
-  gfx::BoxF expected(270.f, 155.f, 0.f, 150.f, 200.f, 0.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest,
-       RotateZUnderAncestorsWithPositionOr2DTransform) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendRotate(0.f, 0.f, 1.f, 0.f);
-  TransformOperations great_grand_child_end;
-  great_grand_child_end.AppendRotate(0.f, 0.f, 1.f, 90.f);
-  AddAnimatedTransformToElementWithPlayer(grand_child()->element_id(),
-                                          timeline(), duration, start,
-                                          great_grand_child_end);
-
-  gfx::Transform translate_2d_transform;
-  translate_2d_transform.Translate(80.f, 60.f);
-  root()->SetBounds(gfx::Size(350, 200));
-  parent2()->SetPosition(gfx::PointF(40.f, 45.f));
-  child2()->test_properties()->transform = translate_2d_transform;
-
-  gfx::Size bounds(100, 100);
-  grand_child()->SetPosition(gfx::PointF(150.f, 50.f));
-  grand_child()->SetBounds(bounds);
-  grand_child()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.5f, bounds.height() * 0.5f, 0);
-
-  great_grand_child()->SetPosition(gfx::PointF(25.f, 25.f));
-  great_grand_child()->SetBounds(gfx::Size(50.f, 50.f));
-  great_grand_child()->SetDrawsContent(true);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*great_grand_child(), &box);
-  EXPECT_TRUE(success);
-
-  float diag = diagonal(50.f, 50.f);
-  gfx::BoxF expected(320.f - 0.5f * diag, 205.f - 0.5f * diag, 0.f, diag, diag,
-                     0.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest,
-       RotateXWithPerspectiveUnderAncestorsWithPositionOr2DTransform) {
-  // Tree topology:
-  // +root (Bounds)
-  // +--parent2 (Position)
-  // +----child2 (2d transform)
-  // +------grand_child (Perspective)
-  // +--------great_grand_child (RotateX, DrawsContent)
-  // Due to the RotateX animation, great_grand_child also owns a transform_node
-
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendRotate(1.f, 0.f, 0.f, 0.f);
-  TransformOperations great_grand_child_end;
-  great_grand_child_end.AppendRotate(1.f, 0.f, 0.f, 90.f);
-  AddAnimatedTransformToElementWithPlayer(great_grand_child()->element_id(),
-                                          timeline(), duration, start,
-                                          great_grand_child_end);
-
-  gfx::Transform translate_2d_transform;
-  translate_2d_transform.Translate(80.f, 60.f);
-
-  root()->SetBounds(gfx::Size(350, 200));
-  parent2()->SetPosition(gfx::PointF(40.f, 45.f));
-  child2()->test_properties()->transform = translate_2d_transform;
-
-  gfx::Transform perspective;
-  perspective.ApplyPerspectiveDepth(100.f);
-
-  gfx::Size bounds(100.f, 100.f);
-  grand_child()->SetPosition(gfx::PointF(150.f, 50.f));
-  grand_child()->SetBounds(bounds);
-  grand_child()->test_properties()->transform = perspective;
-  grand_child()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.5f, bounds.height() * 0.5f, 0);
-
-  great_grand_child()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.25f, bounds.height() * 0.25f, 0);
-  great_grand_child()->SetPosition(gfx::PointF(25.f, 25.f));
-  great_grand_child()->SetBounds(gfx::Size(50.f, 50.f));
-  great_grand_child()->SetDrawsContent(true);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*great_grand_child(), &box);
-  EXPECT_TRUE(success);
-
-  // Translate and position offset to the root:
-  //   40 + 150 + 80 + 25 = 295
-  //   45 + 60 +50 + 25 = 180
-  //   0
-  // Animation Bounds Before Perspective:
-  //   0, 0, -25, 50, 50, 50
-  // Apply Perspective:
-  //   When RotateX theta:
-  //                          y
-  //                          ^
-  //              d1          |
-  //             |  /         |
-  //             | /          |
-  //             |/           |
-  //            /|            |
-  //           / |            |
-  //          /  |            |
-  //         theta            |
-  //  z<----------------------X
-  //          d2
-  //
-  //     the diag is 25 * 2
-  //
-  //     box w: 2 * 25 * 100 / (100 - 25 * sin(theta)), max = 200 / 3 = 66.67
-  //         h: same as w, 66.67
-  //         d1: 25 * 100 * sin(theta) / (100 + 25 * sin(theta)), max = 100 / 5
-  //             = 20
-  //         d2: 25 * 100 * sin(theta) / (100 - 25 * sin(theta)), max = 100 / 3
-  //             = 33.33
-  //         d = d1 + d2 = 53.33
-  //
-  // Position Fix:
-  //   295 - (66.67 - 50) / 2 = 286.67
-  //   180 - (66.67 - 50) / 2 = 171.67
-  //   0 - 20 = -20
-
-  gfx::BoxF expected(286.666687f, 171.666672f, -20.f, 66.666656f, 66.666672f,
-                     53.333336f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-TEST_F(LayerUtilsGetAnimationBoundsTest,
-       RotateXNoPerspectiveUnderAncestorsWithPositionOr2DTransform) {
-  double duration = 1.0;
-
-  TransformOperations start;
-  start.AppendRotate(1.f, 0.f, 0.f, 0.f);
-  TransformOperations rotate_x_end;
-  rotate_x_end.AppendRotate(1.f, 0.f, 0.f, 90.f);
-  AddAnimatedTransformToElementWithPlayer(great_grand_child()->element_id(),
-                                          timeline(), duration, start,
-                                          rotate_x_end);
-
-  gfx::Transform translate_2d_transform;
-  translate_2d_transform.Translate(80.f, 60.f);
-
-  root()->SetBounds(gfx::Size(350, 200));
-  parent2()->SetPosition(gfx::PointF(40.f, 45.f));
-  child2()->test_properties()->transform = translate_2d_transform;
-
-  gfx::Size bounds(100.f, 100.f);
-  grand_child()->SetPosition(gfx::PointF(150.f, 50.f));
-  grand_child()->SetBounds(bounds);
-
-  great_grand_child()->test_properties()->transform_origin =
-      gfx::Point3F(bounds.width() * 0.25f, bounds.height() * 0.25f, 0);
-  great_grand_child()->SetPosition(gfx::PointF(25.f, 25.f));
-  great_grand_child()->SetBounds(
-      gfx::Size(bounds.width() * 0.5f, bounds.height() * 0.5f));
-  great_grand_child()->SetDrawsContent(true);
-
-  host_impl().active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-  gfx::BoxF box;
-  bool success = LayerUtils::GetAnimationBounds(*great_grand_child(), &box);
-  EXPECT_TRUE(success);
-
-  // Same as RotateXWithPerspectiveUnderAncestorsWithPositionOr2DTransform test,
-  // except for the perspective calculations.
-
-  gfx::BoxF expected(295.f, 180.f, -25.f, 50.f, 50.f, 50.f);
-  EXPECT_BOXF_EQ(expected, box);
-}
-
-}  // namespace
-
-}  // namespace cc
diff --git a/cc/trees/debug_rect_history.cc b/cc/trees/debug_rect_history.cc
index 4196051..aa99eb55 100644
--- a/cc/trees/debug_rect_history.cc
+++ b/cc/trees/debug_rect_history.cc
@@ -10,7 +10,6 @@
 #include "cc/base/math_util.h"
 #include "cc/layers/layer_impl.h"
 #include "cc/layers/layer_list_iterator.h"
-#include "cc/layers/layer_utils.h"
 #include "cc/layers/render_surface_impl.h"
 #include "cc/trees/damage_tracker.h"
 #include "cc/trees/layer_tree_host.h"
@@ -61,9 +60,6 @@
 
   if (debug_state.show_screen_space_rects)
     SaveScreenSpaceRects(render_surface_list);
-
-  if (debug_state.show_layer_animation_bounds_rects)
-    SaveLayerAnimationBoundsRects(tree_impl);
 }
 
 void DebugRectHistory::SavePaintRects(LayerTreeImpl* tree_impl) {
@@ -200,23 +196,4 @@
   }
 }
 
-void DebugRectHistory::SaveLayerAnimationBoundsRects(LayerTreeImpl* tree_impl) {
-  for (auto it = tree_impl->rbegin(); it != tree_impl->rend(); ++it) {
-    if (!(*it)->contributes_to_drawn_render_surface())
-      continue;
-
-    // TODO(avallee): Figure out if we should show something for a layer who's
-    // animating bounds but that we can't compute them.
-    gfx::BoxF inflated_bounds;
-    if (!LayerUtils::GetAnimationBounds(**it, &inflated_bounds))
-      continue;
-
-    debug_rects_.push_back(
-        DebugRect(ANIMATION_BOUNDS_RECT_TYPE,
-                  gfx::ToEnclosingRect(gfx::RectF(
-                      inflated_bounds.x(), inflated_bounds.y(),
-                      inflated_bounds.width(), inflated_bounds.height()))));
-  }
-}
-
 }  // namespace cc
diff --git a/cc/trees/debug_rect_history.h b/cc/trees/debug_rect_history.h
index 2e9c239..fb6b9021 100644
--- a/cc/trees/debug_rect_history.h
+++ b/cc/trees/debug_rect_history.h
@@ -97,7 +97,6 @@
   void SaveScrollEventHandlerRectsCallback(LayerImpl* layer);
   void SaveNonFastScrollableRects(LayerTreeImpl* layer);
   void SaveNonFastScrollableRectsCallback(LayerImpl* layer);
-  void SaveLayerAnimationBoundsRects(LayerTreeImpl* tree_impl);
 
   std::vector<DebugRect> debug_rects_;
 
diff --git a/cc/trees/mutator_host.h b/cc/trees/mutator_host.h
index f619819..bd055a7 100644
--- a/cc/trees/mutator_host.h
+++ b/cc/trees/mutator_host.h
@@ -103,13 +103,6 @@
       ElementId element_id,
       TargetProperty::Type property) const = 0;
 
-  virtual bool HasTransformAnimationThatInflatesBounds(
-      ElementId element_id) const = 0;
-
-  virtual bool TransformAnimationBoundsForBox(ElementId element_id,
-                                              const gfx::BoxF& box,
-                                              gfx::BoxF* bounds) const = 0;
-
   virtual bool HasOnlyTranslationTransforms(
       ElementId element_id,
       ElementListType list_type) const = 0;
diff --git a/chrome/VERSION b/chrome/VERSION
index 9b5e9cf..835095b7 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=63
 MINOR=0
-BUILD=3203
+BUILD=3206
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index b6a5875..a157cbf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -160,7 +160,6 @@
     public static final String CHROME_HOME_DOODLE = "ChromeHomeDoodle";
     public static final String CHROME_HOME_EXPAND_BUTTON = "ChromeHomeExpandButton";
     public static final String CHROME_HOME_MODERN_LAYOUT = "ChromeHomeModernLayout";
-    public static final String CONSISTENT_OMNIBOX_GEOLOCATION = "ConsistentOmniboxGeolocation";
     public static final String CONTENT_SUGGESTIONS_FAVICONS_FROM_NEW_SERVER =
             "ContentSuggestionsFaviconsFromNewServer";
     public static final String CONTENT_SUGGESTIONS_NOTIFICATIONS =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
index 24feb40..63eb33f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -228,7 +228,7 @@
             public void didAddTab(Tab tab, TabLaunchType type) {
                 // If we're in the process of promoting this tab, just return and don't mess with
                 // this state.
-                if (tab.getContentViewCore() == mSearchPanel.getContentViewCore()) return;
+                if (tab.getContentViewCore() == getSearchPanelContentViewCore()) return;
                 hideContextualSearch(StateChangeReason.UNKNOWN);
             }
         };
@@ -311,6 +311,7 @@
 
     @Override
     public void setContextualSearchPanel(ContextualSearchPanel panel) {
+        assert panel != null;
         mSearchPanel = panel;
         mPolicy.setContextualSearchPanel(panel);
     }
@@ -322,7 +323,20 @@
 
     /** @return Whether the Search Panel is opened. That is, whether it is EXPANDED or MAXIMIZED. */
     public boolean isSearchPanelOpened() {
-        return mSearchPanel.isPanelOpened();
+        return mSearchPanel != null && mSearchPanel.isPanelOpened();
+    }
+
+    /** @return Whether the {@code mSearchPanel} is not {@code null} and is showing. */
+    private boolean isSearchPanelShowing() {
+        return mSearchPanel != null && mSearchPanel.isShowing();
+    }
+
+    /**
+     * @return the {@link ContentViewCore} of the {@code mSearchPanel} or {@code null} if
+     *         {@code mSearchPanel} is null or the search panel doesn't currently hold a CVC.
+     */
+    private @Nullable ContentViewCore getSearchPanelContentViewCore() {
+        return mSearchPanel == null ? null : mSearchPanel.getContentViewCore();
     }
 
     /** @return The Base Page's {@link ContentViewCore}. */
@@ -391,7 +405,7 @@
 
     /** Called when the system back button is pressed. Will hide the layout. */
     public boolean onBackPressed() {
-        if (!mIsInitialized || !mSearchPanel.isShowing()) return false;
+        if (!mIsInitialized || !isSearchPanelShowing()) return false;
         hideContextualSearch(StateChangeReason.BACK_PRESS);
         return true;
     }
@@ -401,6 +415,7 @@
      * @param stateChangeReason The reason explaining the change of state.
      */
     private void showContextualSearch(StateChangeReason stateChangeReason) {
+        assert mSearchPanel != null;
         if (mFindToolbarManager != null) {
             mFindToolbarManager.hideToolbar(false);
         }
@@ -753,6 +768,7 @@
 
     /** Loads a Search Request in the Contextual Search's Content View. */
     private void loadSearchUrl() {
+        assert mSearchPanel != null;
         mLoadedSearchUrlTimeMs = System.currentTimeMillis();
         mLastSearchRequestLoaded = mSearchRequest;
         mSearchPanel.loadUrlInPanel(mSearchRequest.getSearchUrl());
@@ -764,8 +780,8 @@
         // to coordinate with Chrome-Android folks to come up with a proper fix for this.
         // For now, we force the ContentView to be displayed by calling onShow() again
         // when a URL is being loaded. See: crbug.com/398206
-        if (mSearchPanel.isContentShowing() && mSearchPanel.getContentViewCore() != null) {
-            mSearchPanel.getContentViewCore().onShow();
+        if (mSearchPanel.isContentShowing() && getSearchPanelContentViewCore() != null) {
+            getSearchPanelContentViewCore().onShow();
         }
     }
 
@@ -780,7 +796,7 @@
      */
     @CalledByNative
     private void onSetCaption(String caption, boolean doesAnswer) {
-        if (TextUtils.isEmpty(caption)) return;
+        if (TextUtils.isEmpty(caption) || mSearchPanel == null) return;
 
         // Notify the UI of the caption.
         mSearchPanel.setCaption(caption);
@@ -814,7 +830,9 @@
 
     @Override
     public void stopPanelContentsNavigation() {
-        mSearchPanel.getContentViewCore().getWebContents().stop();
+        if (getSearchPanelContentViewCore() == null) return;
+
+        getSearchPanelContentViewCore().getWebContents().stop();
     }
 
     // ============================================================================================
@@ -908,6 +926,7 @@
 
         @Override
         public void onMainFrameLoadStarted(String url, boolean isExternalUrl) {
+            assert mSearchPanel != null;
             mSearchPanel.updateBrowserControlsState();
 
             if (isExternalUrl) {
@@ -917,6 +936,7 @@
 
         @Override
         public void onMainFrameNavigation(String url, boolean isExternalUrl, boolean isFailure) {
+            assert mSearchPanel != null;
             if (isExternalUrl) {
                 if (!ContextualSearchFieldTrial.isAmpAsSeparateTabDisabled()
                         && mPolicy.isAmpUrl(url) && mSearchPanel.didTouchContent()) {
@@ -985,12 +1005,14 @@
 
         @Override
         public void onContentViewSeen() {
+            assert mSearchPanel != null;
             mSearchPanel.setWasSearchContentViewSeen();
         }
 
         @Override
         public boolean shouldInterceptNavigation(
                 ExternalNavigationHandler externalNavHandler, NavigationParams navigationParams) {
+            assert mSearchPanel != null;
             mTabRedirectHandler.updateNewUrlLoading(navigationParams.pageTransitionType,
                     navigationParams.isRedirect,
                     navigationParams.hasUserGesture || navigationParams.hasUserGestureCarryover,
@@ -1031,6 +1053,7 @@
 
     /** Removes the last resolved search URL from the Chrome history. */
     private void removeLastSearchVisit() {
+        assert mSearchPanel != null;
         if (mLastSearchRequestLoaded != null) {
             // TODO(pedrosimonetti): Consider having this feature builtin into OverlayPanelContent.
             mSearchPanel.removeLastHistoryEntry(
@@ -1059,14 +1082,14 @@
         if (isFailure && mSearchRequest.isUsingLowPriority()) {
             // We're navigating to an error page, so we want to stop and retry.
             // Stop loading the page that displays the error to the user.
-            if (mSearchPanel.getContentViewCore() != null) {
+            if (getSearchPanelContentViewCore() != null) {
                 // When running tests the Content View might not exist.
                 mNetworkCommunicator.stopPanelContentsNavigation();
             }
             mSearchRequest.setHasFailed();
             mSearchRequest.setNormalPriority();
             // If the content view is showing, load at normal priority now.
-            if (mSearchPanel.isContentShowing()) {
+            if (mSearchPanel != null && mSearchPanel.isContentShowing()) {
                 // NOTE: we must reuse the existing content view because we're called from within
                 // a WebContentsObserver.  If we don't reuse the content view then the WebContents
                 // being observed will be deleted.  We notify of the failure to trigger the reuse.
@@ -1096,6 +1119,7 @@
         // A navigation can be due to us loading a URL, or a touch in the search content view.
         // Require a touch, but no recent loading, in order to promote to a separate tab.
         // Note that tapping the opt-in button requires checking for recent loading.
+        assert mSearchPanel != null;
         return mSearchPanel.didTouchContent() && !mSearchPanel.isProcessingPendingNavigation();
     }
 
@@ -1105,10 +1129,9 @@
      * @param url The URL we are navigating to.
      */
     public void onExternalNavigation(String url) {
-        if (!mDidPromoteSearchNavigation
-                && !BLACKLISTED_URL.equals(url)
-                && !url.startsWith(INTENT_URL_PREFIX)
-                && shouldPromoteSearchNavigation()) {
+        if (!mDidPromoteSearchNavigation && !BLACKLISTED_URL.equals(url)
+                && !url.startsWith(INTENT_URL_PREFIX) && shouldPromoteSearchNavigation()
+                && mSearchPanel != null) {
             // Do not promote to a regular tab if we're loading our Resolved Search
             // URL, otherwise we'll promote it when prefetching the Serp.
             // Don't promote URLs when they are navigating to an intent - this is
@@ -1138,6 +1161,7 @@
 
     @Override
     public void promoteToTab() {
+        assert mSearchPanel != null;
         // TODO(pedrosimonetti): Consider removing this member.
         mIsPromotingToTab = true;
 
@@ -1146,10 +1170,9 @@
         // the Panel to a Tab will result in creating a new tab with URL about:blank. To prevent
         // this problem, we are ignoring tap gestures in the Search Bar if we don't know what
         // to search for.
-        if (mSearchRequest != null
-                && mSearchPanel.getContentViewCore() != null
-                && mSearchPanel.getContentViewCore().getWebContents() != null) {
-            String url = getContentViewUrl(mSearchPanel.getContentViewCore());
+        if (mSearchRequest != null && getSearchPanelContentViewCore() != null
+                && getSearchPanelContentViewCore().getWebContents() != null) {
+            String url = getContentViewUrl(getSearchPanelContentViewCore());
 
             // If it's a search URL, format it so the SearchBox becomes visible.
             if (mSearchRequest.isContextualSearchUrl(url)) {
@@ -1191,7 +1214,7 @@
 
     @Override
     public void onSelectionChanged(String selection) {
-        if (!isOverlayVideoMode()) {
+        if (!isOverlayVideoMode() && mSearchPanel != null) {
             mSelectionController.handleSelectionChanged(selection);
             mSearchPanel.updateBrowserControlsState(BrowserControlsState.BOTH, true);
         }
@@ -1339,8 +1362,10 @@
         mQuickAnswersHeuristic = new QuickAnswersHeuristic();
         mHeuristics.add(mQuickAnswersHeuristic);
 
-        mSearchPanel.getPanelMetrics().setResultsSeenExperiments(mHeuristics);
-        mSearchPanel.getPanelMetrics().setRankerLogger(mTapSuppressionRankerLogger);
+        if (mSearchPanel != null) {
+            mSearchPanel.getPanelMetrics().setResultsSeenExperiments(mHeuristics);
+            mSearchPanel.getPanelMetrics().setRankerLogger(mTapSuppressionRankerLogger);
+        }
     }
 
     @Override
@@ -1383,7 +1408,7 @@
     public void handleSelectionDismissal() {
         if (mIsAccessibilityModeEnabled) return;
 
-        if (mSearchPanel != null && mSearchPanel.isShowing()
+        if (isSearchPanelShowing()
                 && !mIsPromotingToTab
                 // If the selection is dismissed when the Panel is not peeking anymore,
                 // which means the Panel is at least partially expanded, then it means
@@ -1400,7 +1425,7 @@
             String selection, boolean selectionValid, float x, float y) {
         if (mIsAccessibilityModeEnabled) return;
 
-        if (mSearchPanel != null && mSearchPanel.isShowing()) {
+        if (isSearchPanelShowing()) {
             if (selectionValid) {
                 mSearchPanel.setSearchTerm(selection);
             } else {
@@ -1418,7 +1443,7 @@
 
     /** Shows the given selection as the Search Term in the Bar. */
     private void showSelectionAsSearchInBar(String selection) {
-        if (mSearchPanel.isShowing()) mSearchPanel.setSearchTerm(selection);
+        if (isSearchPanelShowing()) mSearchPanel.setSearchTerm(selection);
     }
 
     // ============================================================================================
@@ -1435,7 +1460,7 @@
                 mContext = null;
                 if (mSearchPanel == null) return;
 
-                if (mSearchPanel.isShowing()) {
+                if (isSearchPanelShowing()) {
                     mSearchPanel.closePanel(reason, false);
                 } else {
                     if (mSelectionController.getSelectionType() == SelectionType.TAP) {
@@ -1554,7 +1579,7 @@
                 mNetworkCommunicator.startSearchTermResolutionRequest(selection);
                 // If the we were unable to start the resolve, we've hidden the UI and set the
                 // context to null.
-                if (mContext == null) return;
+                if (mContext == null || mSearchPanel == null) return;
 
                 // Update the UI to show the resolve is in progress.
                 mSearchPanel.setContextDetails(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
index 7b398e59..7fde20c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -1372,7 +1372,7 @@
         Intent intent = DownloadNotificationService.buildActionIntent(mContext, action,
                 LegacyHelpers.buildLegacyContentId(false, downloadItem.getId()),
                 downloadItem.getDownloadInfo().isOffTheRecord());
-        mContext.startService(intent);
+        mContext.sendBroadcast(intent);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 87a51909..4ba6405 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -68,12 +68,10 @@
 import org.chromium.chrome.browser.omnibox.OmniboxResultsAdapter.OmniboxSuggestionDelegate;
 import org.chromium.chrome.browser.omnibox.VoiceSuggestionProvider.VoiceResult;
 import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader;
-import org.chromium.chrome.browser.omnibox.geo.GeolocationSnackbarController;
 import org.chromium.chrome.browser.page_info.PageInfoPopup;
 import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
-import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.toolbar.ToolbarActionModeCallback;
 import org.chromium.chrome.browser.toolbar.ToolbarDataProvider;
@@ -1105,15 +1103,6 @@
             mHasStartedNewOmniboxEditSession = false;
             mNewOmniboxEditSessionTimestamp = -1;
         }
-
-        if (hasFocus && mToolbarDataProvider.hasTab()) {
-            SnackbarManageable activity = (SnackbarManageable) mWindowAndroid.getActivity().get();
-            if (activity != null) {
-                GeolocationSnackbarController.maybeShowSnackbar(activity.getSnackbarManager(),
-                        LocationBarLayout.this, mToolbarDataProvider.isIncognito(),
-                        GEOLOCATION_SNACKBAR_SHOW_DELAY_MS);
-            }
-        }
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
index c409fba..f8d42a1dc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
@@ -245,16 +245,6 @@
         }
     }
 
-    /**
-     * Returns whether the X-Geo header is allowed to be sent for the current URL.
-     *
-     * @param url The URL of the request with which this header will be sent.
-     * @param isIncognito Whether the request will happen in an incognito tab.
-     */
-    public static boolean isGeoHeaderEnabledForUrl(String url, boolean isIncognito) {
-        return geoHeaderStateForUrl(url, isIncognito, false) == HEADER_ENABLED;
-    }
-
     @HeaderState
     private static int geoHeaderStateForUrl(String url, boolean isIncognito, boolean recordUma) {
         // Only send X-Geo in normal mode.
@@ -426,14 +416,10 @@
      * geolocation infobar).
      */
     static boolean isLocationDisabledForUrl(Uri uri, boolean isIncognito) {
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION)) {
-            boolean enabled = WebsitePreferenceBridge.shouldUseDSEGeolocationSetting(
-                                      uri.toString(), isIncognito)
-                    && WebsitePreferenceBridge.getDSEGeolocationSetting();
-            return !enabled;
-        } else {
-            return locationContentSettingForUrl(uri, isIncognito) == ContentSetting.BLOCK;
-        }
+        boolean enabled =
+                WebsitePreferenceBridge.shouldUseDSEGeolocationSetting(uri.toString(), isIncognito)
+                && WebsitePreferenceBridge.getDSEGeolocationSetting();
+        return !enabled;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationSnackbarController.java
deleted file mode 100644
index f8e7389..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationSnackbarController.java
+++ /dev/null
@@ -1,159 +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.
-
-package org.chromium.chrome.browser.omnibox.geo;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Build;
-import android.text.SpannableString;
-import android.text.style.TextAppearanceSpan;
-import android.view.View;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.SearchEnginePreference;
-import org.chromium.chrome.browser.search_engines.TemplateUrlService;
-import org.chromium.chrome.browser.snackbar.Snackbar;
-import org.chromium.chrome.browser.snackbar.SnackbarManager;
-import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
-import org.chromium.chrome.browser.util.AccessibilityUtil;
-import org.chromium.ui.UiUtils;
-import org.chromium.ui.text.SpanApplier;
-import org.chromium.ui.text.SpanApplier.SpanInfo;
-
-/**
- * Controller for the geolocation disclosure snackbar, which notifies the user that google.com uses
- * the device location to provide localized search results.
- *
- * This snackbar appears only once: the first time the user focuses the omnibox when the X-Geo
- * header has the potential to be sent along with a search request. For this to happen, several
- * conditions have to be met:
- *  - The current tab is not incognito
- *  - (Android M+) Chrome has been granted location permission
- *  - The default search engine is Google
- *  - Location is not disabled for google.com (or google.fr, etc) in Chrome's site settings
- */
-public class GeolocationSnackbarController implements SnackbarController {
-
-    private static final String GEOLOCATION_SNACKBAR_SHOWN_PREF = "geolocation_snackbar_shown";
-    private static final int SNACKBAR_DURATION_MS = 8000;
-    private static final int ACCESSIBILITY_SNACKBAR_DURATION_MS = 15000;
-
-    private static Boolean sGeolocationSnackbarShown;
-
-    private GeolocationSnackbarController() {}
-
-    /**
-     * Shows the geolocation snackbar if it hasn't already been shown and the geolocation snackbar
-     * is currently relevant: i.e. the default search engine is Google, location is enabled
-     * for Chrome, the tab is not incognito, etc.
-     *
-     * @param snackbarManager The SnackbarManager used to show the snackbar.
-     * @param view Any view that's attached to the view hierarchy.
-     * @param isIncognito Whether the currently visible tab is incognito.
-     * @param delayMs The delay in ms before the snackbar should be shown. This is intended to
-     *                give the keyboard time to animate in.
-     */
-    public static void maybeShowSnackbar(final SnackbarManager snackbarManager, View view,
-            boolean isIncognito, int delayMs) {
-        final Context context = view.getContext();
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION)) return;
-        if (getGeolocationSnackbarShown(context)) return;
-
-        // If in incognito mode, don't show the snackbar now, but maybe show it later.
-        if (isIncognito) return;
-
-        if (neverShowSnackbar(context)) {
-            setGeolocationSnackbarShown(context);
-            return;
-        }
-
-        Uri searchUri = Uri.parse(TemplateUrlService.getInstance().getUrlForSearchQuery("foo"));
-        TextAppearanceSpan robotoMediumSpan =
-                new TextAppearanceSpan(context, R.style.RobotoMediumStyle);
-        String messageWithoutSpans = context.getResources().getString(
-                R.string.omnibox_geolocation_disclosure, "<b>" + searchUri.getHost() + "</b>");
-        SpannableString message = SpanApplier.applySpans(messageWithoutSpans,
-                new SpanInfo("<b>", "</b>", robotoMediumSpan));
-        String settings = context.getResources().getString(R.string.preferences);
-        int durationMs = AccessibilityUtil.isAccessibilityEnabled()
-                ? ACCESSIBILITY_SNACKBAR_DURATION_MS : SNACKBAR_DURATION_MS;
-        final GeolocationSnackbarController controller = new GeolocationSnackbarController();
-        final Snackbar snackbar = Snackbar
-                .make(message, controller, Snackbar.TYPE_ACTION, Snackbar.UMA_OMNIBOX_GEOLOCATION)
-                .setAction(settings, view)
-                .setSingleLine(false)
-                .setDuration(durationMs);
-
-        view.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                snackbarManager.dismissSnackbars(controller);
-                snackbarManager.showSnackbar(snackbar);
-                setGeolocationSnackbarShown(context);
-            }
-        }, delayMs);
-    }
-
-    private static boolean neverShowSnackbar(Context context) {
-        // Don't show the snackbar on pre-M devices because location permission was explicitly
-        // granted at install time.
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true;
-
-        // Don't show the snackbar if Chrome doesn't have location permission since X-Geo won't be
-        // sent unless the user explicitly grants this permission.
-        if (!GeolocationHeader.hasGeolocationPermission()) return true;
-
-        // Don't show the snackbar if Google isn't the default search engine since X-Geo won't be
-        // sent unless the user explicitly sets Google as their default search engine and sees that
-        // "location is allowed" for omnibox searches in the process.
-        if (!TemplateUrlService.getInstance().isDefaultSearchEngineGoogle()) return true;
-
-        // Don't show the snackbar if location is disabled for google.com, since X-Geo won't be sent
-        // unless the user explicitly reenables location for google.com.
-        Uri searchUri = Uri.parse(TemplateUrlService.getInstance().getUrlForSearchQuery("foo"));
-        if (GeolocationHeader.isLocationDisabledForUrl(searchUri, false)) return true;
-
-        return false;
-    }
-
-    // SnackbarController implementation:
-
-    @Override
-    public void onDismissNoAction(Object actionData) {}
-
-    @Override
-    public void onAction(Object actionData) {
-        View view = (View) actionData;
-        UiUtils.hideKeyboard(view);
-
-        Context context = view.getContext();
-        Intent intent = PreferencesLauncher.createIntentForSettingsPage(
-                context, SearchEnginePreference.class.getName());
-        context.startActivity(intent);
-    }
-
-    /**
-     * Returns whether the geolocation snackbar has been shown before.
-     */
-    static boolean getGeolocationSnackbarShown(Context context) {
-        if (sGeolocationSnackbarShown == null) {
-            // Cache the preference value since this method is called often.
-            sGeolocationSnackbarShown = ContextUtils.getAppSharedPreferences()
-                    .getBoolean(GEOLOCATION_SNACKBAR_SHOWN_PREF, false);
-        }
-
-        return sGeolocationSnackbarShown;
-    }
-
-    private static void setGeolocationSnackbarShown(Context context) {
-        ContextUtils.getAppSharedPreferences().edit()
-                .putBoolean(GEOLOCATION_SNACKBAR_SHOWN_PREF, true).apply();
-        sGeolocationSnackbarShown = Boolean.TRUE;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
index 3ca17f8..69ed503 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
@@ -145,7 +145,7 @@
     @Override
     public void getInstruments(Map<String, PaymentMethodData> methodDataMap, String origin,
             String iframeOrigin, @Nullable byte[][] certificateChain,
-            InstrumentsCallback callback) {
+            Map<String, PaymentDetailsModifier> modifiers, InstrumentsCallback callback) {
         assert mMethodNames.containsAll(methodDataMap.keySet());
         assert mInstrumentsCallback
                 == null : "Have not responded to previous request for instruments yet";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java
index 436e8f5..9d2ffc6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java
@@ -15,6 +15,7 @@
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.BasicCardNetwork;
 import org.chromium.payments.mojom.BasicCardType;
+import org.chromium.payments.mojom.PaymentDetailsModifier;
 import org.chromium.payments.mojom.PaymentMethodData;
 
 import java.util.ArrayList;
@@ -49,7 +50,7 @@
     @Override
     public void getInstruments(Map<String, PaymentMethodData> methodDataMap, String unusedOrigin,
             String unusedIFRameOrigin, byte[][] unusedCertificateChain,
-            final InstrumentsCallback callback) {
+            Map<String, PaymentDetailsModifier> modifiers, final InstrumentsCallback callback) {
         PersonalDataManager pdm = PersonalDataManager.getInstance();
         List<CreditCard> cards = pdm.getCreditCardsToSuggest();
         final List<PaymentInstrument> instruments = new ArrayList<>(cards.size());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java
index d5d05bf..ad537539 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.payments;
 
+import org.chromium.payments.mojom.PaymentDetailsModifier;
 import org.chromium.payments.mojom.PaymentMethodData;
 
 import java.net.URI;
@@ -44,10 +45,12 @@
      *                         if PaymentRequest was not invoked from inside an iframe.
      * @param certificateChain The site certificate chain of the merchant. Null for localhost and
      *                         file on disk, which are secure origins without SSL.
+     * @param modifiers        The relevant payment details modifiers.
      * @param callback         The object that will receive the list of instruments.
      */
     void getInstruments(Map<String, PaymentMethodData> methodDataMap, String origin,
-            String iframeOrigin, @Nullable byte[][] certificateChain, InstrumentsCallback callback);
+            String iframeOrigin, @Nullable byte[][] certificateChain,
+            Map<String, PaymentDetailsModifier> modifiers, InstrumentsCallback callback);
 
     /**
      * Returns a list of all payment method names that this app supports. For example, ["visa",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 38cf48d..8155c09a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -746,8 +746,9 @@
         if (disconnectIfNoPaymentMethodsSupported()) return;
 
         for (Map.Entry<PaymentApp, Map<String, PaymentMethodData>> q : queryApps.entrySet()) {
-            q.getKey().getInstruments(
-                    q.getValue(), mTopLevelOrigin, mPaymentRequestOrigin, mCertificateChain, this);
+            q.getKey().getInstruments(q.getValue(), mTopLevelOrigin, mPaymentRequestOrigin,
+                    mCertificateChain,
+                    mModifiers == null ? null : Collections.unmodifiableMap(mModifiers), this);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
index a13e09f..8b5417a65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
@@ -8,6 +8,8 @@
 import android.os.Handler;
 import android.text.TextUtils;
 
+import org.chromium.base.VisibleForTesting;
+import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
 import org.chromium.payments.mojom.PaymentItem;
@@ -38,6 +40,8 @@
     private final Set<String> mMethodNames;
     private final boolean mCanPreselect;
     private final Set<String> mPreferredRelatedApplicationIds;
+    private final boolean mIsIncognito;
+    private static boolean sCanMakePaymentForTesting;
 
     /**
      * Build a service worker payment app instance per origin.
@@ -75,17 +79,34 @@
 
         mPreferredRelatedApplicationIds = new HashSet<>();
         Collections.addAll(mPreferredRelatedApplicationIds, preferredRelatedApplicationIds);
+
+        ChromeActivity activity = ChromeActivity.fromWebContents(mWebContents);
+        mIsIncognito = activity != null && activity.getCurrentTabModel() != null
+                && activity.getCurrentTabModel().isIncognito();
     }
 
     @Override
-    public void getInstruments(Map<String, PaymentMethodData> unusedMethodDataMap,
-            String unusedOrigin, String unusedIFrameOrigin, byte[][] unusedCertificateChain,
-            final InstrumentsCallback callback) {
-        new Handler().post(() -> {
-            List<PaymentInstrument> instruments = new ArrayList();
-            instruments.add(ServiceWorkerPaymentApp.this);
-            callback.onInstrumentsReady(ServiceWorkerPaymentApp.this, instruments);
-        });
+    public void getInstruments(Map<String, PaymentMethodData> methodDataMap, String origin,
+            String iframeOrigin, byte[][] unusedCertificateChain,
+            Map<String, PaymentDetailsModifier> modifiers, final InstrumentsCallback callback) {
+        if (mIsIncognito || sCanMakePaymentForTesting) {
+            new Handler().post(() -> {
+                List<PaymentInstrument> instruments = new ArrayList();
+                instruments.add(ServiceWorkerPaymentApp.this);
+                callback.onInstrumentsReady(ServiceWorkerPaymentApp.this, instruments);
+            });
+            return;
+        }
+
+        ServiceWorkerPaymentAppBridge.canMakePayment(mWebContents, mRegistrationId, origin,
+                iframeOrigin, new HashSet<>(methodDataMap.values()),
+                new HashSet<>(modifiers.values()), (boolean canMakePayment) -> {
+                    List<PaymentInstrument> instruments = new ArrayList();
+                    if (canMakePayment) {
+                        instruments.add(ServiceWorkerPaymentApp.this);
+                    }
+                    callback.onInstrumentsReady(ServiceWorkerPaymentApp.this, instruments);
+                });
     }
 
     @Override
@@ -137,4 +158,14 @@
     public boolean canPreselect() {
         return mCanPreselect;
     }
+
+    /**
+     * Make canMakePayment() return true always for testing purpose.
+     *
+     * @param canMakePayment Indicates whether a SW payment app can make payment.
+     */
+    @VisibleForTesting
+    public static void setCanMakePaymentForTesting(boolean canMakePayment) {
+        sCanMakePaymentForTesting = canMakePayment;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentAppBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentAppBridge.java
index a2af253..9c854de 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentAppBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentAppBridge.java
@@ -33,6 +33,18 @@
 public class ServiceWorkerPaymentAppBridge implements PaymentAppFactory.PaymentAppFactoryAddition {
     private static final String TAG = "SWPaymentApp";
 
+    /**
+     * The interface for the requester to check whether a SW payment app can make payment.
+     */
+    static interface CanMakePaymentCallback {
+        /**
+         * Called by this app to provide an information whether can make payment asynchronously.
+         *
+         * @param canMakePayment Indicates whether a SW payment app can make payment.
+         */
+        public void onCanMakePaymentResponse(boolean canMakePayment);
+    }
+
     @Override
     public void create(WebContents webContents, Set<String> methodNames,
             PaymentAppFactory.PaymentAppCreatedCallback callback) {
@@ -40,6 +52,27 @@
     }
 
     /**
+     * Returns whether the app can make a payment.
+     *
+     * @param webContents      The web contents that invoked PaymentRequest.
+     * @param registrationId   The service worker registration ID of the Payment App.
+     * @param origin           The origin of this merchant.
+     * @param iframeOrigin     The origin of the iframe that invoked PaymentRequest. Same as origin
+     *                         if PaymentRequest was not invoked from inside an iframe.
+     * @param methodData       The PaymentMethodData objects that are relevant for this payment
+     *                         app.
+     * @param modifiers        Payment method specific modifiers to the payment items and the total.
+     * @param callback         Called after the payment app is finished running.
+     */
+    public static void canMakePayment(WebContents webContents, long registrationId, String origin,
+            String iframeOrigin, Set<PaymentMethodData> methodData,
+            Set<PaymentDetailsModifier> modifiers, CanMakePaymentCallback callback) {
+        nativeCanMakePayment(webContents, registrationId, origin, iframeOrigin,
+                methodData.toArray(new PaymentMethodData[0]),
+                modifiers.toArray(new PaymentDetailsModifier[0]), callback);
+    }
+
+    /**
      * Invoke a payment app with a given option and matching method data.
      *
      * @param webContents      The web contents that invoked PaymentRequest.
@@ -154,6 +187,12 @@
         ((PaymentInstrument.AbortCallback) callback).onInstrumentAbortResult(result);
     }
 
+    @CalledByNative
+    private static void onCanMakePayment(Object callback, boolean canMakePayment) {
+        assert callback instanceof CanMakePaymentCallback;
+        ((CanMakePaymentCallback) callback).onCanMakePaymentResponse(canMakePayment);
+    }
+
     /*
      * TODO(tommyt): crbug.com/505554. Change the |callback| parameter below to
      * be of type PaymentInstrument.InstrumentDetailsCallback, once this JNI bug
@@ -178,4 +217,13 @@
      */
     private static native void nativeAbortPaymentApp(
             WebContents webContents, long registrationId, Object callback);
+
+    /*
+     * TODO(zino): crbug.com/505554. Change the |callback| parameter below to
+     * be of type PaymentInstrument.InstrumentDetailsCallback, once this JNI bug
+     * has been resolved.
+     */
+    private static native void nativeCanMakePayment(WebContents webContents, long registrationId,
+            String topLevelOrigin, String paymentRequestOrigin, PaymentMethodData[] methodData,
+            PaymentDetailsModifier[] modifiers, Object callback);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
index 30e817bb..301ae64 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
@@ -104,15 +104,21 @@
 
     @Override
     public void onAndroidPermissionAccepted() {
-        mDialogDelegate.onAccept(mSwitchView.isChecked());
-        destroyDelegate();
+        // If the tab navigated or was closed behind the prompt, the delegate will be null.
+        if (mDialogDelegate != null) {
+            mDialogDelegate.onAccept(mSwitchView.isChecked());
+            destroyDelegate();
+        }
         scheduleDisplay();
     }
 
     @Override
     public void onAndroidPermissionCanceled() {
-        mDialogDelegate.onDismiss();
-        destroyDelegate();
+        // If the tab navigated or was closed behind the prompt, the delegate will be null.
+        if (mDialogDelegate != null) {
+            mDialogDelegate.onDismiss();
+            destroyDelegate();
+        }
         scheduleDisplay();
     }
 
@@ -259,7 +265,13 @@
             mDialogDelegate = null;
             AlertDialog dialog = mDialog;
             mDialog = null;
-            dialog.dismiss();
+            if (dialog != null) {
+                dialog.dismiss();
+            } else {
+                // The prompt was accepted but the tab navigated or was closed while the Android
+                // permission prompt was active.
+                assert mDecision == ACCEPTED;
+            }
         } else {
             assert mRequestQueue.contains(delegate);
             mRequestQueue.remove(delegate);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
index d57c055..03bb959 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
@@ -29,10 +29,8 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.UrlConstants;
 import org.chromium.chrome.browser.locale.LocaleManager;
-import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader;
 import org.chromium.chrome.browser.preferences.website.ContentSetting;
 import org.chromium.chrome.browser.preferences.website.GeolocationInfo;
 import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
@@ -464,11 +462,7 @@
         ContentSetting locationPermission = locationSettings.getContentSetting();
         if (locationPermission != ContentSetting.ASK) return true;
 
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION)) {
-            return WebsitePreferenceBridge.shouldUseDSEGeolocationSetting(url, false);
-        }
-
-        return GeolocationHeader.isGeoHeaderEnabledForUrl(url, false);
+        return WebsitePreferenceBridge.shouldUseDSEGeolocationSetting(url, false);
     }
 
     private boolean locationEnabled(TemplateUrl templateUrl) {
@@ -479,12 +473,8 @@
         ContentSetting locationPermission = locationSettings.getContentSetting();
         if (locationPermission == ContentSetting.ASK) {
             // Handle the case where the geoHeader being sent when no permission has been specified.
-            if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION)) {
-                if (WebsitePreferenceBridge.shouldUseDSEGeolocationSetting(url, false)) {
-                    return WebsitePreferenceBridge.getDSEGeolocationSetting();
-                }
-            } else if (GeolocationHeader.isGeoHeaderEnabledForUrl(url, false)) {
-                return true;
+            if (WebsitePreferenceBridge.shouldUseDSEGeolocationSetting(url, false)) {
+                return WebsitePreferenceBridge.getDSEGeolocationSetting();
             }
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
index 0a878789..ee3a626 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
@@ -28,10 +28,8 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
-import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.search_engines.TemplateUrlService;
 import org.chromium.components.url_formatter.UrlFormatter;
 import org.chromium.content_public.browser.WebContents;
 
@@ -584,18 +582,12 @@
 
     private void setUpLocationPreference(Preference preference) {
         ContentSetting permission = mSite.getGeolocationPermission();
-        Context context = preference.getContext();
         Object locationAllowed = getArguments().getSerializable(EXTRA_LOCATION);
         if (shouldUseDSEGeolocationSetting()) {
             String origin = mSite.getAddress().getOrigin();
             mSite.setGeolocationInfo(new GeolocationInfo(origin, origin, false));
             setUpListPreference(preference, ContentSetting.ALLOW);
             updateLocationPreferenceForDSESetting(preference);
-        } else if (permission == null && hasXGeoLocationPermission(context)) {
-            String origin = mSite.getAddress().getOrigin();
-            mSite.setGeolocationInfo(new GeolocationInfo(origin, origin, false));
-            setUpListPreference(preference, ContentSetting.ALLOW);
-            updateLocationPreferenceForXGeo(preference);
         } else if (permission == null && locationAllowed != null) {
             String origin = mSite.getAddress().getOrigin();
             mSite.setGeolocationInfo(new GeolocationInfo(origin, origin, false));
@@ -653,21 +645,6 @@
     }
 
     /**
-     * Returns true if the current host matches the default search engine host and location for the
-     * default search engine is being granted via x-geo.
-     * @param context The current context.
-     */
-    private boolean hasXGeoLocationPermission(Context context) {
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION)) {
-            return false;
-        }
-
-        String searchUrl = TemplateUrlService.getInstance().getUrlForSearchQuery("foo");
-        return mSite.getAddress().matches(searchUrl)
-                && GeolocationHeader.isGeoHeaderEnabledForUrl(searchUrl, false);
-    }
-
-    /**
      * Returns true if the DSE (default search engine) geolocation setting should be used for the
      * current host. This will be the case when the host is the CCTLD (Country Code Top Level
      * Domain) of the DSE, and the DSE supports the X-Geo header.
@@ -682,25 +659,6 @@
      * for searches that happen from the omnibox.
      * @param preference The Location preference to modify.
      */
-    private void updateLocationPreferenceForXGeo(Preference preference) {
-        ListPreference listPreference = (ListPreference) preference;
-        Resources res = getResources();
-        listPreference.setEntries(new String[] {
-                res.getString(R.string.website_settings_permissions_allow_dse_address_bar),
-                res.getString(ContentSettingsResources.getSiteSummary(ContentSetting.BLOCK)),
-        });
-        listPreference.setEntryValues(new String[] {
-                ContentSetting.DEFAULT.toString(),
-                ContentSetting.BLOCK.toString(),
-        });
-        listPreference.setValueIndex(0);
-    }
-
-    /**
-     * Updates the location preference to indicate that the site has access to location (via X-Geo)
-     * for searches that happen from the omnibox.
-     * @param preference The Location preference to modify.
-     */
     private void updateLocationPreferenceForDSESetting(Preference preference) {
         ListPreference listPreference = (ListPreference) preference;
         Resources res = getResources();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
index c02e2cb..f5b8559 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -46,11 +46,8 @@
 import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
 import org.chromium.chrome.browser.toolbar.ToolbarControlContainer;
 import org.chromium.chrome.browser.util.ColorUtils;
-import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content.browser.ScreenOrientationProvider;
 import org.chromium.content_public.browser.LoadUrlParams;
-import org.chromium.content_public.browser.WebContents;
-import org.chromium.content_public.browser.WebContentsObserver;
 import org.chromium.net.NetworkChangeNotifier;
 import org.chromium.ui.base.PageTransition;
 
@@ -82,9 +79,6 @@
     private final WebappActionsNotificationManager mNotificationManager;
     private final WebappDirectoryManager mDirectoryManager;
 
-    private WebContents mWebContents;
-    private WebContentsObserver mWebContentsObserver;
-
     protected WebappInfo mWebappInfo;
 
     private WebappSplashScreenController mSplashController;
@@ -500,13 +494,6 @@
         };
     }
 
-    @Override
-    protected Tab createTab() {
-        Tab tab = super.createTab();
-        handleTabContentChanged(tab);
-        return tab;
-    }
-
     protected TabObserver createTabObserver() {
         return new EmptyTabObserver() {
 
@@ -518,6 +505,11 @@
                 if (hasCommitted && isInMainFrame) {
                     // Updates the URL.
                     mNotificationManager.maybeShowNotification();
+
+                    // Notify the renderer to permanently hide the top controls since they do
+                    // not apply to fullscreen content views.
+                    tab.updateBrowserControlsState(tab.getBrowserControlsStateConstraints(), true);
+
                     RecordHistogram.recordBooleanHistogram(
                             HISTOGRAM_NAVIGATION_STATUS, !isErrorPage);
                 }
@@ -574,46 +566,6 @@
                     }
                 }, MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL);
             }
-
-            // TODO(piotrs): Remove this and clean up handleTabContentChanged() once pre-rendering
-            //               is disabled and WebContents swapping can no longer happen
-            //               (crbug.com/678332).
-            @Override
-            public void onContentChanged(Tab tab) {
-                assert tab == getActivityTab();
-                handleTabContentChanged(tab);
-            }
-        };
-    }
-
-    private void handleTabContentChanged(final Tab tab) {
-        assert tab != null;
-
-        WebContents webContents = tab.getWebContents();
-        if (mWebContents == webContents) return;
-
-        // Clean up any old references to the previous WebContents.
-        if (mWebContentsObserver != null) {
-            mWebContentsObserver.destroy();
-            mWebContentsObserver = null;
-        }
-
-        mWebContents = webContents;
-        if (mWebContents == null) return;
-
-        ContentViewCore.fromWebContents(webContents).setFullscreenRequiredForOrientationLock(false);
-        mWebContentsObserver = new WebContentsObserver(webContents) {
-            @Override
-            public void didFinishNavigation(String url, boolean isInMainFrame, boolean isErrorPage,
-                    boolean hasCommitted, boolean isSameDocument, boolean isFragmentNavigation,
-                    Integer pageTransition, int errorCode, String errorDescription,
-                    int httpStatusCode) {
-                if (hasCommitted && isInMainFrame) {
-                    // Notify the renderer to permanently hide the top controls since they do
-                    // not apply to fullscreen content views.
-                    tab.updateBrowserControlsState(tab.getBrowserControlsStateConstraints(), true);
-                }
-            }
         };
     }
 
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 93b64ee..360cd62 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -915,9 +915,6 @@
       <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_BLOCK" desc="Summary text explaining that Chrome will block a website from accessing some permission, e.g. JavaScript: block.">
         Block
       </message>
-      <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_ALLOW_DSE_ADDRESS_BAR" desc="Summary text explaining that Chrome will allow the default search engine to access the user's location, but only when the user searches directly from the address bar. e.g. Location access: Allow (for address bar searches)">
-        Allow (for address bar searches)
-      </message>
       <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_ALLOW_DSE" desc="Summary text explaining that Chrome will allow the default search engine to access the user's location, both when performed from the address bar and from search result pages. e.g. Location access: Allow for current search engine">
         Allow for current search engine
       </message>
@@ -1715,11 +1712,6 @@
         Chrome needs storage access to download files.
       </message>
 
-      <!-- Runtime permission geolocation disclosure strings -->
-      <message name="IDS_OMNIBOX_GEOLOCATION_DISCLOSURE" desc="Text shown when a user focuses the Chrome omnibox to inform them that their location will be shared with the search provider to get better local search results.">
-        <ph name="SEARCH_ENGINE_URL">%1$s<ex>www.google.com</ex></ph> uses your location to show local search results
-      </message>
-
       <!-- ContextMenu -->
       <message name="IDS_CONTEXTMENU_OPEN_IN_OTHER_WINDOW" desc="Context sensitive menu item to open the selected link in the other window. [CHAR-LIMIT=30]">
         Open in other window
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index e6341a2..8127dd0 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -748,7 +748,6 @@
   "java/src/org/chromium/chrome/browser/omnibox/UrlFocusChangeListener.java",
   "java/src/org/chromium/chrome/browser/omnibox/VoiceSuggestionProvider.java",
   "java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java",
-  "java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationSnackbarController.java",
   "java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationTracker.java",
   "java/src/org/chromium/chrome/browser/omnibox/geo/PlatformNetworksManager.java",
   "java/src/org/chromium/chrome/browser/omnibox/geo/VisibleNetworks.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
index 62b41d2..e7b68e48 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
@@ -34,10 +34,6 @@
         ChromeActivityTestRule.DISABLE_NETWORK_PREDICTION_FLAG})
 public class SearchGeolocationDisclosureInfoBarTest {
     private static final String SEARCH_PAGE = "/chrome/test/data/android/google.html";
-    private static final String ENABLE_NEW_DISCLOSURE_FEATURE =
-            "enable-features=ConsistentOmniboxGeolocation";
-    private static final String DISABLE_NEW_DISCLOSURE_FEATURE =
-            "disable-features=ConsistentOmniboxGeolocation";
 
     private EmbeddedTestServer mTestServer;
 
@@ -61,7 +57,6 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
-    @CommandLineFlags.Add(ENABLE_NEW_DISCLOSURE_FEATURE)
     public void testInfoBarAppears() throws InterruptedException, TimeoutException {
         SearchGeolocationDisclosureTabHelper.setIgnoreUrlChecksForTesting();
         Assert.assertEquals(
@@ -139,7 +134,6 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
-    @CommandLineFlags.Add(ENABLE_NEW_DISCLOSURE_FEATURE)
     public void testInfoBarDismiss() throws InterruptedException, TimeoutException {
         SearchGeolocationDisclosureTabHelper.setIgnoreUrlChecksForTesting();
         Assert.assertEquals(
@@ -174,7 +168,6 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
-    @CommandLineFlags.Add(ENABLE_NEW_DISCLOSURE_FEATURE)
     public void testNoInfoBarForRandomUrl() throws InterruptedException, TimeoutException {
         Assert.assertEquals(
                 "Wrong starting infobar count", 0, mActivityTestRule.getInfoBars().size());
@@ -187,7 +180,6 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
-    @CommandLineFlags.Add(ENABLE_NEW_DISCLOSURE_FEATURE)
     public void testNoInfoBarInIncognito() throws InterruptedException, TimeoutException {
         SearchGeolocationDisclosureTabHelper.setIgnoreUrlChecksForTesting();
         mActivityTestRule.newIncognitoTabFromMenu();
@@ -198,19 +190,4 @@
         Assert.assertEquals(
                 "Wrong infobar count after search", 0, mActivityTestRule.getInfoBars().size());
     }
-
-    @Test
-    @SmallTest
-    @Feature({"Browser", "Main"})
-    @CommandLineFlags.Add(DISABLE_NEW_DISCLOSURE_FEATURE)
-    public void testInfoBarAppearsDoesntAppearWithoutFeature()
-            throws InterruptedException, TimeoutException {
-        SearchGeolocationDisclosureTabHelper.setIgnoreUrlChecksForTesting();
-        Assert.assertEquals(
-                "Wrong starting infobar count", 0, mActivityTestRule.getInfoBars().size());
-
-        mActivityTestRule.loadUrl(mTestServer.getURL(SEARCH_PAGE));
-        Assert.assertEquals(
-                "Wrong infobar count after search", 0, mActivityTestRule.getInfoBars().size());
-    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
index f378d9f..d982db1b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
@@ -35,7 +35,6 @@
     private static final String DISABLE_FEATURES = "disable-features=";
     private static final String ENABLE_FEATURES = "enable-features=";
     private static final String FEATURE_SEPARATOR = ",";
-    private static final String CONSISTENT_GEOLOCATION_FEATURE = "ConsistentOmniboxGeolocation";
     private static final String XGEO_VISIBLE_NETWORKS_FEATURE = "XGEOVisibleNetworks";
     private static final String GOOGLE_BASE_URL_SWITCH = "google-base-url=https://www.google.com";
     private static final double LOCATION_LAT = 20.3;
@@ -50,33 +49,8 @@
 
     @SmallTest
     @Feature({"Location"})
-    @CommandLineFlags.Add({DISABLE_FEATURES + CONSISTENT_GEOLOCATION_FEATURE + FEATURE_SEPARATOR
-            + XGEO_VISIBLE_NETWORKS_FEATURE})
-    public void testGeolocationHeader() throws ProcessInitException {
-        long now = setMockLocationNow();
-
-        // X-Geo should be sent for Google search results page URLs.
-        assertNonNullHeader(SEARCH_URL_1, false, now, ENCODING_ASCII);
-        assertNonNullHeader(SEARCH_URL_2, false, now, ENCODING_ASCII);
-
-        // X-Geo shouldn't be sent in incognito mode.
-        assertNullHeader(SEARCH_URL_1, true);
-        assertNullHeader(SEARCH_URL_2, true);
-
-        // X-Geo shouldn't be sent with URLs that aren't the Google search results page.
-        assertNullHeader("invalid$url", false);
-        assertNullHeader("https://www.chrome.fr/", false);
-        assertNullHeader("https://www.google.com/", false);
-
-        // X-Geo shouldn't be sent over HTTP.
-        assertNullHeader("http://www.google.com/search?q=potatoes", false);
-        assertNullHeader("http://www.google.com/webhp?#q=dinosaurs", false);
-    }
-
-    @SmallTest
-    @Feature({"Location"})
-    @CommandLineFlags.Add({ENABLE_FEATURES + CONSISTENT_GEOLOCATION_FEATURE, GOOGLE_BASE_URL_SWITCH,
-            DISABLE_FEATURES + XGEO_VISIBLE_NETWORKS_FEATURE})
+    @CommandLineFlags
+            .Add({GOOGLE_BASE_URL_SWITCH, DISABLE_FEATURES + XGEO_VISIBLE_NETWORKS_FEATURE})
     public void testConsistentHeader() throws ProcessInitException {
         long now = setMockLocationNow();
 
@@ -102,21 +76,8 @@
 
     @SmallTest
     @Feature({"Location"})
-    @CommandLineFlags.Add(DISABLE_FEATURES + CONSISTENT_GEOLOCATION_FEATURE + FEATURE_SEPARATOR
-            + XGEO_VISIBLE_NETWORKS_FEATURE)
-    public void testPermissions() throws ProcessInitException {
-        long now = setMockLocationNow();
-
-        // X-Geo shouldn't be sent when location is disallowed for https origin.
-        checkHeaderWithPermissions(ContentSetting.ALLOW, now, false);
-        checkHeaderWithPermissions(ContentSetting.DEFAULT, now, false);
-        checkHeaderWithPermissions(ContentSetting.BLOCK, now, true);
-    }
-
-    @SmallTest
-    @Feature({"Location"})
-    @CommandLineFlags.Add({ENABLE_FEATURES + CONSISTENT_GEOLOCATION_FEATURE, GOOGLE_BASE_URL_SWITCH,
-            DISABLE_FEATURES + XGEO_VISIBLE_NETWORKS_FEATURE})
+    @CommandLineFlags
+            .Add({GOOGLE_BASE_URL_SWITCH, DISABLE_FEATURES + XGEO_VISIBLE_NETWORKS_FEATURE})
     public void testPermissionAndSetting() throws ProcessInitException {
         long now = setMockLocationNow();
 
@@ -130,24 +91,6 @@
 
     @SmallTest
     @Feature({"Location"})
-    @CommandLineFlags.Add({DISABLE_FEATURES + CONSISTENT_GEOLOCATION_FEATURE + FEATURE_SEPARATOR
-            + XGEO_VISIBLE_NETWORKS_FEATURE})
-    public void testOnlyNonStale() throws ProcessInitException {
-        // X-Geo should be sent only with non-stale locations.
-        long now = System.currentTimeMillis();
-        long oneHour = 60 * 60 * 1000;
-        long oneWeek = 7 * 24 * 60 * 60 * 1000;
-        setMockLocation(now);
-
-        checkHeaderWithLocation(now, false);
-        checkHeaderWithLocation(now - oneHour, false);
-        checkHeaderWithLocation(now - oneWeek, true);
-        GeolocationTracker.setLocationForTesting(null, null);
-        assertNullHeader(SEARCH_URL_1, false);
-    }
-
-    @SmallTest
-    @Feature({"Location"})
     @CommandLineFlags.Add({DISABLE_FEATURES + XGEO_VISIBLE_NETWORKS_FEATURE})
     public void testAsciiEncoding() throws ProcessInitException {
         long now = setMockLocationNow();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
index 22872a8..d91d97b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
@@ -40,6 +40,7 @@
     private void installMockServiceWorkerPaymentApp(final boolean hasSupportedMethods) {
         PaymentAppFactory.getInstance().addAdditionalFactory(
                 (webContents, methodNames, callback) -> {
+                    ServiceWorkerPaymentApp.setCanMakePaymentForTesting(true);
                     String[] supportedMethodNames = {"https://bobpay.com", "basic-card"};
                     callback.onPaymentAppCreated(
                             new ServiceWorkerPaymentApp(webContents, 0 /* registrationId */,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
index c412777..974f0f4e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
@@ -818,6 +818,7 @@
         @Override
         public void getInstruments(Map<String, PaymentMethodData> methodData, String origin,
                 String iframeOrigin, byte[][] certificateChain,
+                Map<String, PaymentDetailsModifier> modifiers,
                 InstrumentsCallback instrumentsCallback) {
             mCallback = instrumentsCallback;
             respond();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
index 4a9e13a0..ee88e0a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
@@ -219,9 +219,6 @@
 
         // DURATION and HIDES UMA should not have been recorded yet.
         Assert.assertFalse(hasHistogramEntry(WebappUma.HISTOGRAM_SPLASHSCREEN_DURATION, 3000));
-        Assert.assertEquals(0,
-                getHistogramTotalCountFor(WebappUma.HISTOGRAM_SPLASHSCREEN_HIDES,
-                        WebappUma.SPLASHSCREEN_HIDES_REASON_MAX));
     }
 
     @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
index b448d9d..ee19f69 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
@@ -182,8 +182,7 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION),
-            @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS)})
+    @Features({ @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS) })
     public void testGetGeoHeaderFreshLocation() throws ProcessInitException {
         VisibleNetworks visibleNetworks = VisibleNetworks.create(VISIBLE_WIFI1, VISIBLE_CELL1,
                 new HashSet(Arrays.asList(VISIBLE_WIFI3)),
@@ -198,8 +197,7 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION),
-            @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS)})
+    @Features({ @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS) })
     public void testGetGeoHeaderLocationMissing() throws ProcessInitException {
         VisibleNetworks visibleNetworks = VisibleNetworks.create(VISIBLE_WIFI1, VISIBLE_CELL1,
                 new HashSet(Arrays.asList(VISIBLE_WIFI3)),
@@ -211,8 +209,7 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION),
-            @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS)})
+    @Features({ @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS) })
     public void testGetGeoHeaderOldLocationHighAccuracy() throws ProcessInitException {
         GeolocationHeader.setLocationSourceForTesting(
                 GeolocationHeader.LOCATION_SOURCE_HIGH_ACCURACY);
@@ -222,8 +219,7 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION),
-            @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS)})
+    @Features({ @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS) })
     public void testGetGeoHeaderOldLocationBatterySaving() throws ProcessInitException {
         GeolocationHeader.setLocationSourceForTesting(
                 GeolocationHeader.LOCATION_SOURCE_BATTERY_SAVING);
@@ -232,8 +228,7 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION),
-            @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS)})
+    @Features({ @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS) })
     public void testGetGeoHeaderOldLocationGpsOnly() throws ProcessInitException {
         GeolocationHeader.setLocationSourceForTesting(GeolocationHeader.LOCATION_SOURCE_GPS_ONLY);
         // In GPS only mode, networks should never be included.
@@ -241,8 +236,7 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS),
-            @Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION)})
+    @Features({ @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS) })
     public void testGetGeoHeaderOldLocationLocationOff() throws ProcessInitException {
         GeolocationHeader.setLocationSourceForTesting(GeolocationHeader.LOCATION_SOURCE_MASTER_OFF);
         // If the master switch is off, networks should never be included (old location might).
@@ -250,8 +244,7 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION),
-            @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS)})
+    @Features({ @Features.Register(ChromeFeatureList.XGEO_VISIBLE_NETWORKS) })
     public void testGetGeoHeaderOldLocationAppPermissionDenied() throws ProcessInitException {
         GeolocationHeader.setLocationSourceForTesting(
                 GeolocationHeader.LOCATION_SOURCE_HIGH_ACCURACY);
@@ -261,8 +254,9 @@
     }
 
     @Test
-    @Features({@Features.Register(ChromeFeatureList.CONSISTENT_OMNIBOX_GEOLOCATION),
-            @Features.Register(value = ChromeFeatureList.XGEO_VISIBLE_NETWORKS, enabled = false)})
+    @Features({
+            @Features.Register(value = ChromeFeatureList.XGEO_VISIBLE_NETWORKS, enabled = false)
+    })
     public void testGetGeoHeaderOldLocationFeatureOff() throws ProcessInitException {
         long timestamp = LOCATION_TIME * 1000;
         int latitudeE7 = (int) (LOCATION_LAT * 10000000);
@@ -390,4 +384,4 @@
             sRefreshLastKnownLocation++;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 08f22b5..1b95832 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -4940,6 +4940,9 @@
   <message name="IDS_ARC_NOTIFICATION_TITLE" desc="Title of the first-run notification that enables Android apps.">
     Google Play on your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>
   </message>
+  <message name="IDS_ARC_NOTIFICATION_DISPLAY_SOURCE" desc="Context title of the first-run notification that enables Android apps.">
+    Google Play
+  </message>
   <message name="IDS_ARC_NOTIFICATION_MESSAGE" desc="Description message of the first-run notification that enables Android apps.">
     Install apps and games from Google Play
   </message>
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index 6d99632..ab4722f 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -62,6 +62,7 @@
     "navigate_home.icon",
     "navigate_stop.1x.icon",
     "navigate_stop.icon",
+    "notification_download.icon",
     "notification_end_of_support.icon",
     "notification_image.1x.icon",
     "notification_image.icon",
diff --git a/chrome/app/vector_icons/notification_download.icon b/chrome/app/vector_icons/notification_download.icon
new file mode 100644
index 0000000..2c58b36a
--- /dev/null
+++ b/chrome/app/vector_icons/notification_download.icon
@@ -0,0 +1,21 @@
+// 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.
+
+CANVAS_DIMENSIONS, 36,
+MOVE_TO, 28, 14,
+R_H_LINE_TO, -6,
+V_LINE_TO, 6,
+R_H_LINE_TO, -8,
+R_V_LINE_TO, 8,
+H_LINE_TO, 8,
+R_LINE_TO, 10, 10,
+R_LINE_TO, 10, -10,
+CLOSE,
+MOVE_TO, 8, 26,
+R_V_LINE_TO, 4,
+R_H_LINE_TO, 20,
+R_V_LINE_TO, -4,
+H_LINE_TO, 8,
+CLOSE,
+END
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 7750fc6c..502e591 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2624,6 +2624,8 @@
       "metrics/desktop_session_duration/desktop_session_duration_tracker.h",
       "net/disk_cache_dir_policy_handler.cc",
       "net/disk_cache_dir_policy_handler.h",
+      "notifications/fullscreen_notification_blocker.cc",
+      "notifications/fullscreen_notification_blocker.h",
       "notifications/screen_lock_notification_blocker.cc",
       "notifications/screen_lock_notification_blocker.h",
       "platform_util.cc",
@@ -3265,13 +3267,6 @@
       "importer/profile_writer.h",
       "lifetime/browser_close_manager.cc",
       "lifetime/browser_close_manager.h",
-      "lifetime/keep_alive_registry.cc",
-      "lifetime/keep_alive_registry.h",
-      "lifetime/keep_alive_state_observer.h",
-      "lifetime/keep_alive_types.cc",
-      "lifetime/keep_alive_types.h",
-      "lifetime/scoped_keep_alive.cc",
-      "lifetime/scoped_keep_alive.h",
       "lifetime/termination_notification.cc",
       "lifetime/termination_notification.h",
       "media/webrtc/tab_desktop_media_list.cc",
@@ -3371,8 +3366,6 @@
       "notifications/extension_welcome_notification.h",
       "notifications/extension_welcome_notification_factory.cc",
       "notifications/extension_welcome_notification_factory.h",
-      "notifications/fullscreen_notification_blocker.cc",
-      "notifications/fullscreen_notification_blocker.h",
       "notifications/message_center_notification_manager.cc",
       "notifications/message_center_notification_manager.h",
       "notifications/message_center_settings_controller.cc",
@@ -3583,6 +3576,7 @@
       "//components/cryptauth",
       "//components/cryptauth/proto",
       "//components/feedback",
+      "//components/keep_alive_registry",
       "//components/web_modal",
     ]
   }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index e4baad6..16aafe5 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2817,10 +2817,6 @@
      FEATURE_VALUE_TYPE(features::kPrintPdfAsImage)},
 #endif
 #if defined(OS_ANDROID)
-    {"enable-consistent-omnibox-geolocation",
-     flag_descriptions::kEnableConsistentOmniboxGeolocationName,
-     flag_descriptions::kEnableConsistentOmniboxGeolocationDescription,
-     kOsAndroid, FEATURE_VALUE_TYPE(features::kConsistentOmniboxGeolocation)},
     {"concurrent-background-loading-on-svelte",
      flag_descriptions::kOfflinePagesSvelteConcurrentLoadingName,
      flag_descriptions::kOfflinePagesSvelteConcurrentLoadingDescription,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index e3be4a9..909ed63 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -39,7 +39,6 @@
 // in other locations in the code base (e.g. chrome/, components/, etc).
 const base::Feature* kFeaturesExposedToJava[] = {
     &autofill::kAutofillScanCardholderName,
-    &features::kConsistentOmniboxGeolocation,
     &features::kCopylessPaste,
     &features::kImportantSitesInCbd,
     &features::kMaterialDesignIncognitoNTP,
diff --git a/chrome/browser/android/payments/service_worker_payment_app_bridge.cc b/chrome/browser/android/payments/service_worker_payment_app_bridge.cc
index d9ff094..bfbe651 100644
--- a/chrome/browser/android/payments/service_worker_payment_app_bridge.cc
+++ b/chrome/browser/android/payments/service_worker_payment_app_bridge.cc
@@ -25,14 +25,16 @@
 using ::base::android::ScopedJavaGlobalRef;
 using ::base::android::ScopedJavaLocalRef;
 using ::base::android::ToJavaArrayOfStrings;
-using ::payments::mojom::PaymentRequestEventData;
-using ::payments::mojom::PaymentRequestEventDataPtr;
+using ::payments::mojom::CanMakePaymentEventData;
+using ::payments::mojom::CanMakePaymentEventDataPtr;
 using ::payments::mojom::PaymentCurrencyAmount;
 using ::payments::mojom::PaymentDetailsModifier;
 using ::payments::mojom::PaymentDetailsModifierPtr;
 using ::payments::mojom::PaymentItem;
 using ::payments::mojom::PaymentMethodData;
 using ::payments::mojom::PaymentMethodDataPtr;
+using ::payments::mojom::PaymentRequestEventData;
+using ::payments::mojom::PaymentRequestEventDataPtr;
 
 void OnGotAllPaymentApps(const JavaRef<jobject>& jweb_contents,
                          const JavaRef<jobject>& jcallback,
@@ -73,6 +75,14 @@
   Java_ServiceWorkerPaymentAppBridge_onAllPaymentAppsCreated(env, jcallback);
 }
 
+void OnCanMakePayment(const JavaRef<jobject>& jweb_contents,
+                      const JavaRef<jobject>& jcallback,
+                      bool can_make_payment) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_ServiceWorkerPaymentAppBridge_onCanMakePayment(env, jcallback,
+                                                      can_make_payment);
+}
+
 void OnPaymentAppInvoked(
     const JavaRef<jobject>& jweb_contents,
     const JavaRef<jobject>& jcallback,
@@ -112,6 +122,90 @@
                  ScopedJavaGlobalRef<jobject>(env, jcallback)));
 }
 
+static void CanMakePayment(JNIEnv* env,
+                           const JavaParamRef<jclass>& jcaller,
+                           const JavaParamRef<jobject>& jweb_contents,
+                           jlong registration_id,
+                           const JavaParamRef<jstring>& jtop_level_origin,
+                           const JavaParamRef<jstring>& jpayment_request_origin,
+                           const JavaParamRef<jobjectArray>& jmethod_data,
+                           const JavaParamRef<jobjectArray>& jmodifiers,
+                           const JavaParamRef<jobject>& jcallback) {
+  content::WebContents* web_contents =
+      content::WebContents::FromJavaWebContents(jweb_contents);
+
+  CanMakePaymentEventDataPtr event_data = CanMakePaymentEventData::New();
+
+  event_data->top_level_origin =
+      GURL(ConvertJavaStringToUTF8(env, jtop_level_origin));
+  event_data->payment_request_origin =
+      GURL(ConvertJavaStringToUTF8(env, jpayment_request_origin));
+
+  for (jsize i = 0; i < env->GetArrayLength(jmethod_data); i++) {
+    ScopedJavaLocalRef<jobject> element(
+        env, env->GetObjectArrayElement(jmethod_data, i));
+    PaymentMethodDataPtr methodData = PaymentMethodData::New();
+    base::android::AppendJavaStringArrayToStringVector(
+        env,
+        Java_ServiceWorkerPaymentAppBridge_getSupportedMethodsFromMethodData(
+            env, element)
+            .obj(),
+        &methodData->supported_methods);
+    methodData->stringified_data = ConvertJavaStringToUTF8(
+        env,
+        Java_ServiceWorkerPaymentAppBridge_getStringifiedDataFromMethodData(
+            env, element));
+    event_data->method_data.push_back(std::move(methodData));
+  }
+
+  for (jsize i = 0; i < env->GetArrayLength(jmodifiers); i++) {
+    ScopedJavaLocalRef<jobject> jmodifier(
+        env, env->GetObjectArrayElement(jmodifiers, i));
+    PaymentDetailsModifierPtr modifier = PaymentDetailsModifier::New();
+
+    ScopedJavaLocalRef<jobject> jmodifier_total =
+        Java_ServiceWorkerPaymentAppBridge_getTotalFromModifier(env, jmodifier);
+    modifier->total = PaymentItem::New();
+    modifier->total->label = ConvertJavaStringToUTF8(
+        env, Java_ServiceWorkerPaymentAppBridge_getLabelFromPaymentItem(
+                 env, jmodifier_total));
+    modifier->total->amount = PaymentCurrencyAmount::New();
+    modifier->total->amount->currency = ConvertJavaStringToUTF8(
+        env, Java_ServiceWorkerPaymentAppBridge_getCurrencyFromPaymentItem(
+                 env, jmodifier_total));
+    modifier->total->amount->value = ConvertJavaStringToUTF8(
+        env, Java_ServiceWorkerPaymentAppBridge_getValueFromPaymentItem(
+                 env, jmodifier_total));
+    modifier->total->amount->currency_system = ConvertJavaStringToUTF8(
+        env,
+        Java_ServiceWorkerPaymentAppBridge_getCurrencySystemFromPaymentItem(
+            env, jmodifier_total));
+
+    ScopedJavaLocalRef<jobject> jmodifier_method_data =
+        Java_ServiceWorkerPaymentAppBridge_getMethodDataFromModifier(env,
+                                                                     jmodifier);
+    modifier->method_data = PaymentMethodData::New();
+    base::android::AppendJavaStringArrayToStringVector(
+        env,
+        Java_ServiceWorkerPaymentAppBridge_getSupportedMethodsFromMethodData(
+            env, jmodifier_method_data)
+            .obj(),
+        &modifier->method_data->supported_methods);
+    modifier->method_data->stringified_data = ConvertJavaStringToUTF8(
+        env,
+        Java_ServiceWorkerPaymentAppBridge_getStringifiedDataFromMethodData(
+            env, jmodifier_method_data));
+
+    event_data->modifiers.push_back(std::move(modifier));
+  }
+
+  content::PaymentAppProvider::GetInstance()->CanMakePayment(
+      web_contents->GetBrowserContext(), registration_id, std::move(event_data),
+      base::BindOnce(&OnCanMakePayment,
+                     ScopedJavaGlobalRef<jobject>(env, jweb_contents),
+                     ScopedJavaGlobalRef<jobject>(env, jcallback)));
+}
+
 static void InvokePaymentApp(
     JNIEnv* env,
     const JavaParamRef<jclass>& jcaller,
diff --git a/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.cc b/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.cc
index e8b17078..ba84488 100644
--- a/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.cc
+++ b/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.cc
@@ -7,7 +7,6 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/command_line.h"
-#include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
@@ -18,7 +17,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -37,34 +35,12 @@
 
 namespace {
 
-const int kDefaultMaxShowCount = 3;
-const int kDefaultDaysPerShow = 1;
-const char kMaxShowCountVariation[] = "MaxShowCount";
-const char kDaysPerShowVariation[] = "DaysPerShow";
+const int kMaxShowCount = 3;
+const int kDaysPerShow = 1;
 
 bool gIgnoreUrlChecksForTesting = false;
 int gDayOffsetForTesting = 0;
 
-int GetMaxShowCount() {
-  std::string variation = variations::GetVariationParamValueByFeature(
-      features::kConsistentOmniboxGeolocation, kMaxShowCountVariation);
-  int max_show;
-  if (!variation.empty() && base::StringToInt(variation, &max_show))
-    return max_show;
-
-  return kDefaultMaxShowCount;
-}
-
-int GetDaysPerShow() {
-  std::string variation = variations::GetVariationParamValueByFeature(
-      features::kConsistentOmniboxGeolocation, kDaysPerShowVariation);
-  int days_per_show;
-  if (!variation.empty() && base::StringToInt(variation, &days_per_show))
-    return days_per_show;
-
-  return kDefaultDaysPerShow;
-}
-
 base::Time GetTimeNow() {
   return base::Time::Now() + base::TimeDelta::FromDays(gDayOffsetForTesting);
 }
@@ -75,12 +51,7 @@
 
 SearchGeolocationDisclosureTabHelper::SearchGeolocationDisclosureTabHelper(
     content::WebContents* contents)
-    : content::WebContentsObserver(contents) {
-  consistent_geolocation_disclosure_enabled_ =
-      base::FeatureList::IsEnabled(features::kConsistentOmniboxGeolocation) &&
-      !base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kDisableSearchGeolocationDisclosure);
-}
+    : content::WebContentsObserver(contents) {}
 
 SearchGeolocationDisclosureTabHelper::~SearchGeolocationDisclosureTabHelper() {}
 
@@ -91,9 +62,6 @@
 
 void SearchGeolocationDisclosureTabHelper::MaybeShowDisclosureForAPIAccess(
     const GURL& gurl) {
-  if (!consistent_geolocation_disclosure_enabled_)
-    return;
-
   if (!ShouldShowDisclosureForAPIAccess(gurl))
     return;
 
@@ -139,9 +107,6 @@
 
 void SearchGeolocationDisclosureTabHelper::MaybeShowDisclosureForNavigation(
     const GURL& gurl) {
-  if (!consistent_geolocation_disclosure_enabled_)
-    return;
-
   if (!ShouldShowDisclosureForNavigation(gurl))
     return;
 
@@ -157,7 +122,7 @@
       prefs->GetBoolean(prefs::kSearchGeolocationDisclosureDismissed);
   int shown_count =
       prefs->GetInteger(prefs::kSearchGeolocationDisclosureShownCount);
-  if (dismissed_already || shown_count >= GetMaxShowCount()) {
+  if (dismissed_already || shown_count >= kMaxShowCount) {
     // Record metrics for the state of permissions after the disclosure has been
     // shown. This is not done immediately after showing the last disclosure
     // (i.e. at the end of this function), but on the next omnibox search, to
@@ -170,7 +135,7 @@
   // Or if it has been shown too recently.
   base::Time last_shown = base::Time::FromInternalValue(
       prefs->GetInt64(prefs::kSearchGeolocationDisclosureLastShowDate));
-  if (GetTimeNow() - last_shown < base::TimeDelta::FromDays(GetDaysPerShow())) {
+  if (GetTimeNow() - last_shown < base::TimeDelta::FromDays(kDaysPerShow)) {
     return;
   }
 
diff --git a/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.h b/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.h
index c316b99..7d77745 100644
--- a/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.h
+++ b/chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.h
@@ -62,8 +62,6 @@
   void RecordPostDisclosureMetrics(const GURL& gurl);
   Profile* GetProfile();
 
-  bool consistent_geolocation_disclosure_enabled_;
-
   DISALLOW_COPY_AND_ASSIGN(SearchGeolocationDisclosureTabHelper);
 };
 
diff --git a/chrome/browser/android/search_geolocation/search_geolocation_service.cc b/chrome/browser/android/search_geolocation/search_geolocation_service.cc
index 0ed5540c..c9916ccb 100644
--- a/chrome/browser/android/search_geolocation/search_geolocation_service.cc
+++ b/chrome/browser/android/search_geolocation/search_geolocation_service.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/android/search_geolocation/search_geolocation_service.h"
 
 #include "base/callback.h"
-#include "base/feature_list.h"
 #include "base/values.h"
 #include "chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -13,7 +12,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "components/content_settings/core/browser/content_settings_utils.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -149,9 +147,6 @@
   // This class should never be constructed in incognito.
   DCHECK(!profile_->IsOffTheRecord());
 
-  if (!UseConsistentSearchGeolocation())
-    return;
-
   delegate_.reset(new SearchEngineDelegateImpl(profile_));
   delegate_->SetDSEChangedCallback(base::Bind(
       &SearchGeolocationService::OnDSEChanged, base::Unretained(this)));
@@ -166,9 +161,6 @@
 
 bool SearchGeolocationService::UseDSEGeolocationSetting(
     const url::Origin& requesting_origin) {
-  if (!UseConsistentSearchGeolocation())
-    return false;
-
   if (requesting_origin.scheme() != url::kHttpsScheme)
     return false;
 
@@ -352,10 +344,6 @@
   return info.source == content_settings::SETTING_SOURCE_USER;
 }
 
-bool SearchGeolocationService::UseConsistentSearchGeolocation() {
-  return base::FeatureList::IsEnabled(features::kConsistentOmniboxGeolocation);
-}
-
 void SearchGeolocationService::SetSearchEngineDelegateForTest(
     std::unique_ptr<SearchEngineDelegate> delegate) {
   delegate_ = std::move(delegate);
diff --git a/chrome/browser/android/search_geolocation/search_geolocation_service.h b/chrome/browser/android/search_geolocation/search_geolocation_service.h
index 6bd1569d..53a7a63 100644
--- a/chrome/browser/android/search_geolocation/search_geolocation_service.h
+++ b/chrome/browser/android/search_geolocation/search_geolocation_service.h
@@ -144,10 +144,6 @@
   // current DSE CCTLD.
   bool IsContentSettingUserSettable();
 
-  // Whether the feature/experiment setup is enabling the consistent search
-  // geolocation system.
-  bool UseConsistentSearchGeolocation();
-
   void SetSearchEngineDelegateForTest(
       std::unique_ptr<SearchEngineDelegate> delegate);
 
diff --git a/chrome/browser/android/search_geolocation/search_geolocation_service_unittest.cc b/chrome/browser/android/search_geolocation/search_geolocation_service_unittest.cc
index f1a2005b..18698cbb 100644
--- a/chrome/browser/android/search_geolocation/search_geolocation_service_unittest.cc
+++ b/chrome/browser/android/search_geolocation/search_geolocation_service_unittest.cc
@@ -10,12 +10,10 @@
 #include "base/callback.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/permissions/permission_decision_auto_blocker.h"
 #include "chrome/browser/permissions/permission_result.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -72,9 +70,6 @@
 class SearchGeolocationServiceTest : public testing::Test {
  public:
   void SetUp() override {
-    scoped_feature_list_.InitAndEnableFeature(
-        features::kConsistentOmniboxGeolocation);
-
     profile_.reset(new TestingProfile);
 
     auto test_delegate = base::MakeUnique<TestSearchEngineDelegate>();
@@ -131,7 +126,6 @@
   }
 
  private:
-  base::test::ScopedFeatureList scoped_feature_list_;
   std::unique_ptr<TestingProfile> profile_;
   content::TestBrowserThreadBundle thread_bundle_;
 
@@ -244,16 +238,8 @@
   EXPECT_FALSE(
       GetService()->UseDSEGeolocationSetting(ToOrigin(kGoogleHTTPURL)));
 
-  // False if the feature is disabled.
-  test_delegate()->SetDSEOrigin(kGoogleURL);
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitAndDisableFeature(
-        features::kConsistentOmniboxGeolocation);
-    EXPECT_FALSE(GetService()->UseDSEGeolocationSetting(ToOrigin(kGoogleURL)));
-  }
-
   // False if the content setting is enterprise ask.
+  test_delegate()->SetDSEOrigin(kGoogleURL);
   profile()->GetTestingPrefService()->SetManagedPref(
       prefs::kManagedDefaultGeolocationSetting,
       base::MakeUnique<base::Value>(CONTENT_SETTING_ASK));
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index 74450f4..1f136e5 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -40,8 +40,6 @@
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/first_run/first_run.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/mac/mac_startup_profiler.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
@@ -93,6 +91,8 @@
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/handoff/handoff_manager.h"
 #include "components/handoff/handoff_utility.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "components/sessions/core/tab_restore_service.h"
 #include "components/signin/core/browser/signin_manager.h"
diff --git a/chrome/browser/apps/app_window_interactive_uitest.cc b/chrome/browser/apps/app_window_interactive_uitest.cc
index 684ed3f1..8d6ea86 100644
--- a/chrome/browser/apps/app_window_interactive_uitest.cc
+++ b/chrome/browser/apps/app_window_interactive_uitest.cc
@@ -6,11 +6,11 @@
 #include "build/build_config.h"
 #include "chrome/browser/apps/app_browsertest_util.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/test/base/interactive_test_utils.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 #include "extensions/browser/app_window/native_app_window.h"
 #include "extensions/test/extension_test_message_listener.h"
 #include "extensions/test/result_catcher.h"
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
index 052c2ff..81d3f70 100644
--- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -617,6 +617,17 @@
 
 // The tests below aren't needed in --use-cross-process-frames-for-guests.
 class WebViewContextMenuInteractiveTest : public WebViewInteractiveTestBase {};
+class WebViewBrowserPluginInteractiveTest : public WebViewInteractiveTestBase {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    WebViewInteractiveTestBase::SetUpCommandLine(command_line);
+    scoped_feature_list_.InitAndDisableFeature(
+        features::kGuestViewCrossProcessFrames);
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
 
 // The following class of tests do not work for OOPIF <webview>.
 // TODO(ekaramad): Make this tests work with OOPIF and replace the test classes
@@ -1195,6 +1206,46 @@
   }
 }
 
+//
+IN_PROC_BROWSER_TEST_F(WebViewBrowserPluginInteractiveTest, EnsureFocusSynced) {
+  LoadAndLaunchPlatformApp("web_view/focus_sync", "WebViewTest.LAUNCHED");
+
+  content::WebContents* embedder_web_contents = GetFirstAppWindowWebContents();
+  content::WebContents* guest_web_contents =
+      GetGuestViewManager()->WaitForSingleGuestCreated();
+
+  content::MainThreadFrameObserver embedder_observer(
+      embedder_web_contents->GetMainFrame()->GetView()->GetRenderWidgetHost());
+  content::MainThreadFrameObserver guest_observer(
+      guest_web_contents->GetMainFrame()->GetView()->GetRenderWidgetHost());
+  embedder_observer.Wait();
+  guest_observer.Wait();
+
+  // Guest should have been focused.
+  EXPECT_EQ(guest_web_contents,
+            content::GetFocusedWebContents(guest_web_contents));
+
+  // Check that the inner contents is correctly focused.
+  bool result;
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      guest_web_contents, "window.domAutomationController.send(checkValid());",
+      &result));
+  EXPECT_TRUE(result);
+  embedder_observer.Wait();
+  guest_observer.Wait();
+
+  EXPECT_TRUE(
+      content::ExecuteScript(embedder_web_contents, "reloadWebview();"));
+  embedder_observer.Wait();
+  guest_observer.Wait();
+
+  // Check that the inner contents is correctly focused after a reload.
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      guest_web_contents, "window.domAutomationController.send(checkValid());",
+      &result));
+  EXPECT_TRUE(result);
+}
+
 IN_PROC_BROWSER_TEST_P(WebViewInteractiveTest, ExecuteCode) {
   ASSERT_TRUE(RunPlatformAppTestWithArg(
       "platform_apps/web_view/common", "execute_code")) << message_;
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
index bf08813..6b66f9e 100644
--- a/chrome/browser/background/background_mode_manager.cc
+++ b/chrome/browser/background/background_mode_manager.cc
@@ -32,8 +32,6 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -55,6 +53,8 @@
 #include "chrome/grit/chrome_unscaled_resources.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/startup_metric_utils/browser/startup_metric_utils.h"
diff --git a/chrome/browser/background/background_mode_manager.h b/chrome/browser/background/background_mode_manager.h
index 732cd89b6..29337545 100644
--- a/chrome/browser/background/background_mode_manager.h
+++ b/chrome/browser/background/background_mode_manager.h
@@ -17,11 +17,11 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "chrome/browser/background/background_application_list_model.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/status_icons/status_icon.h"
 #include "chrome/browser/status_icons/status_icon_menu_model.h"
 #include "chrome/browser/ui/browser_list_observer.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "content/public/browser/notification_observer.h"
diff --git a/chrome/browser/background/background_mode_manager_unittest.cc b/chrome/browser/background/background_mode_manager_unittest.cc
index 89a9ea88..581f2a9 100644
--- a/chrome/browser/background/background_mode_manager_unittest.cc
+++ b/chrome/browser/background/background_mode_manager_unittest.cc
@@ -23,9 +23,6 @@
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/test_extension_system.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/status_icons/status_icon_menu_model.h"
@@ -34,6 +31,9 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "extensions/browser/api_test_utils.h"
 #include "extensions/browser/extension_prefs.h"
diff --git a/chrome/browser/background/background_mode_optimizer.cc b/chrome/browser/background/background_mode_optimizer.cc
index 77688f3..1f7b123 100644
--- a/chrome/browser/background/background_mode_optimizer.cc
+++ b/chrome/browser/background/background_mode_optimizer.cc
@@ -12,10 +12,10 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_shutdown.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
 
 BackgroundModeOptimizer::~BackgroundModeOptimizer() {
   KeepAliveRegistry::GetInstance()->RemoveObserver(this);
diff --git a/chrome/browser/background/background_mode_optimizer.h b/chrome/browser/background/background_mode_optimizer.h
index 966dc298..23241be 100644
--- a/chrome/browser/background/background_mode_optimizer.h
+++ b/chrome/browser/background/background_mode_optimizer.h
@@ -9,8 +9,8 @@
 
 #include "base/macros.h"
 #include "base/time/time.h"
-#include "chrome/browser/lifetime/keep_alive_state_observer.h"
 #include "chrome/browser/ui/browser_list_observer.h"
+#include "components/keep_alive_registry/keep_alive_state_observer.h"
 
 class Browser;
 
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 675e9220..b1801fc 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -143,10 +143,10 @@
 
 #if !defined(OS_ANDROID)
 #include "chrome/browser/gcm/gcm_product_util.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
 #include "chrome/browser/ui/user_manager.h"
 #include "components/gcm_driver/gcm_client_factory.h"
 #include "components/gcm_driver/gcm_desktop_utils.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
 #endif
 
 #if BUILDFLAG(ENABLE_BACKGROUND)
@@ -277,6 +277,7 @@
       ChromeUpdateQueryParamsDelegate::GetInstance());
 
 #if !defined(OS_ANDROID)
+  KeepAliveRegistry::GetInstance()->SetIsShuttingDown(false);
   KeepAliveRegistry::GetInstance()->AddObserver(this);
 #endif  // !defined(OS_ANDROID)
 }
@@ -304,6 +305,11 @@
   // |tearing_down_| necessary in IsShuttingDown().
   tearing_down_ = true;
   DCHECK(IsShuttingDown());
+
+#if !defined(OS_ANDROID)
+  KeepAliveRegistry::GetInstance()->SetIsShuttingDown();
+#endif  // !defined(OS_ANDROID)
+
   // We need to destroy the MetricsServicesManager, IntranetRedirectDetector,
   // NetworkTimeTracker, and SafeBrowsing ClientSideDetectionService
   // (owned by the SafeBrowsingService) before the io_thread_ gets destroyed,
diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h
index 4540801..adca3c0 100644
--- a/chrome/browser/browser_process_impl.h
+++ b/chrome/browser/browser_process_impl.h
@@ -22,8 +22,8 @@
 #include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_state_observer.h"
 #include "chrome/common/features.h"
+#include "components/keep_alive_registry/keep_alive_state_observer.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "extensions/features/features.h"
 #include "media/media_features.h"
diff --git a/chrome/browser/browser_process_platform_part_chromeos.cc b/chrome/browser/browser_process_platform_part_chromeos.cc
index 453302d..d470caa 100644
--- a/chrome/browser/browser_process_platform_part_chromeos.cc
+++ b/chrome/browser/browser_process_platform_part_chromeos.cc
@@ -26,13 +26,13 @@
 #include "chrome/browser/chromeos/system/timezone_resolver_manager.h"
 #include "chrome/browser/chromeos/system/timezone_util.h"
 #include "chrome/browser/embedded_ui_service_info_factory.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/ui/ash/ash_util.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chromeos/geolocation/simple_geolocation_provider.h"
 #include "chromeos/timezone/timezone_resolver.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/user_manager/user_manager.h"
 #include "services/preferences/public/interfaces/preferences.mojom.h"
diff --git a/chrome/browser/browsing_data/browsing_data_counter_factory.cc b/chrome/browser/browsing_data/browsing_data_counter_factory.cc
index 240f51d..532abf1 100644
--- a/chrome/browser/browsing_data/browsing_data_counter_factory.cc
+++ b/chrome/browser/browsing_data/browsing_data_counter_factory.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/memory/ptr_util.h"
+#include "build/build_config.h"
 #include "chrome/browser/browsing_data/browsing_data_counter_utils.h"
 #include "chrome/browser/browsing_data/cache_counter.h"
 #include "chrome/browser/browsing_data/downloads_counter.h"
@@ -20,11 +21,11 @@
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/web_data_service_factory.h"
 #include "components/browser_sync/profile_sync_service.h"
+#include "components/browsing_data/content/counters/site_settings_counter.h"
 #include "components/browsing_data/core/counters/autofill_counter.h"
 #include "components/browsing_data/core/counters/browsing_data_counter.h"
 #include "components/browsing_data/core/counters/history_counter.h"
 #include "components/browsing_data/core/counters/passwords_counter.h"
-#include "components/browsing_data/core/counters/site_settings_counter.h"
 #include "components/browsing_data/core/pref_names.h"
 #include "components/history/core/browser/web_history_service.h"
 #include "components/password_manager/core/browser/password_store.h"
@@ -34,6 +35,10 @@
 #include "chrome/browser/browsing_data/hosted_apps_counter.h"
 #endif
 
+#if !defined(OS_ANDROID)
+#include "content/public/browser/host_zoom_map.h"
+#endif
+
 namespace {
 
 history::WebHistoryService* GetUpdatedWebHistoryService(Profile* profile) {
@@ -98,7 +103,13 @@
 
   if (pref_name == browsing_data::prefs::kDeleteSiteSettings) {
     return base::MakeUnique<browsing_data::SiteSettingsCounter>(
-        HostContentSettingsMapFactory::GetForProfile(profile));
+        HostContentSettingsMapFactory::GetForProfile(profile),
+#if !defined(OS_ANDROID)
+        content::HostZoomMap::GetDefaultForBrowserContext(profile)
+#else
+        nullptr
+#endif
+            );
   }
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index ee63812..631cfdba 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -752,6 +752,11 @@
           info->website_settings_info()->type(), delete_begin_,
           HostContentSettingsMap::PatternSourcePredicate());
     }
+#if !defined(OS_ANDROID)
+    content::HostZoomMap* zoom_map =
+        content::HostZoomMap::GetDefaultForBrowserContext(profile_);
+    zoom_map->ClearZoomLevels(delete_begin_, delete_end_);
+#endif
   }
 
   //////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
index 114465ef..7b7339b 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
@@ -12,6 +12,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/synchronization/waitable_event_watcher.h"
 #include "base/task/cancelable_task_tracker.h"
+#include "build/build_config.h"
 #include "chrome/common/features.h"
 #include "components/browsing_data/core/browsing_data_utils.h"
 #include "components/keyed_service/core/keyed_service.h"
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
index 463c30a..0634caa 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -18,7 +18,9 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/simple_test_clock.h"
 #include "base/time/time.h"
+#include "build/build_config.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
@@ -86,6 +88,8 @@
 
 #if defined(OS_ANDROID)
 #include "chrome/browser/android/webapps/webapp_registry.h"
+#else
+#include "content/public/browser/host_zoom_map.h"
 #endif
 
 #if defined(OS_CHROMEOS)
@@ -1856,6 +1860,60 @@
   ASSERT_EQ(0u, host_settings.size());
 }
 
+#if !defined(OS_ANDROID)
+TEST_F(ChromeBrowsingDataRemoverDelegateTest, RemoveZoomLevel) {
+  content::HostZoomMap* zoom_map =
+      content::HostZoomMap::GetDefaultForBrowserContext(GetProfile());
+  zoom_map->SetStoreLastModified(true);
+
+  EXPECT_EQ(0u, zoom_map->GetAllZoomLevels().size());
+
+  auto test_clock = base::MakeUnique<base::SimpleTestClock>();
+  base::SimpleTestClock* clock = test_clock.get();
+  zoom_map->SetClockForTesting(std::move(test_clock));
+
+  base::Time now = base::Time::Now();
+  zoom_map->InitializeZoomLevelForHost(kTestRegisterableDomain1, 1.5,
+                                       now - base::TimeDelta::FromHours(5));
+  clock->SetNow(now - base::TimeDelta::FromHours(2));
+  zoom_map->SetZoomLevelForHost(kTestRegisterableDomain3, 2.0);
+  EXPECT_EQ(2u, zoom_map->GetAllZoomLevels().size());
+
+  // Remove everything created during the last hour.
+  BlockUntilBrowsingDataRemoved(
+      now - base::TimeDelta::FromHours(1), base::Time::Max(),
+      ChromeBrowsingDataRemoverDelegate::DATA_TYPE_CONTENT_SETTINGS, false);
+
+  // Nothing should be deleted as the zoomlevels were created earlier.
+  EXPECT_EQ(2u, zoom_map->GetAllZoomLevels().size());
+
+  clock->SetNow(now);
+  zoom_map->SetZoomLevelForHost(kTestRegisterableDomain3, 2.0);
+
+  // Remove everything changed during the last hour (domain3).
+  BlockUntilBrowsingDataRemoved(
+      now - base::TimeDelta::FromHours(1), base::Time::Max(),
+      ChromeBrowsingDataRemoverDelegate::DATA_TYPE_CONTENT_SETTINGS, false);
+
+  // Verify we still have the zoom_level for domain1.
+  auto levels = zoom_map->GetAllZoomLevels();
+  EXPECT_EQ(1u, levels.size());
+  EXPECT_EQ(kTestRegisterableDomain1, levels[0].host);
+
+  zoom_map->SetZoomLevelForHostAndScheme("chrome", "print", 4.0);
+  // Remove everything.
+  BlockUntilBrowsingDataRemoved(
+      base::Time(), base::Time::Max(),
+      ChromeBrowsingDataRemoverDelegate::DATA_TYPE_CONTENT_SETTINGS, false);
+
+  // Host and scheme zoomlevels should not be affected.
+  levels = zoom_map->GetAllZoomLevels();
+  EXPECT_EQ(1u, levels.size());
+  EXPECT_EQ("chrome", levels[0].scheme);
+  EXPECT_EQ("print", levels[0].host);
+}
+#endif
+
 TEST_F(ChromeBrowsingDataRemoverDelegateTest, RemoveDurablePermission) {
   // Add our settings.
   HostContentSettingsMap* host_content_settings_map =
diff --git a/chrome/browser/browsing_data/site_settings_counter_unittest.cc b/chrome/browser/browsing_data/site_settings_counter_unittest.cc
index ef9d6be..82dcec90e 100644
--- a/chrome/browser/browsing_data/site_settings_counter_unittest.cc
+++ b/chrome/browser/browsing_data/site_settings_counter_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 "components/browsing_data/core/counters/site_settings_counter.h"
+#include "components/browsing_data/content/counters/site_settings_counter.h"
 
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
+#include "build/build_config.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
@@ -15,6 +16,10 @@
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if !defined(OS_ANDROID)
+#include "content/public/browser/host_zoom_map.h"
+#endif
+
 namespace {
 
 class SiteSettingsCounterTest : public testing::Test {
@@ -25,12 +30,19 @@
     feature_list.InitAndEnableFeature(features::kTabsInCbd);
     profile_ = base::MakeUnique<TestingProfile>();
     map_ = HostContentSettingsMapFactory::GetForProfile(profile());
+#if !defined(OS_ANDROID)
+    zoom_map_ = content::HostZoomMap::GetDefaultForBrowserContext(profile());
+#else
+    zoom_map_ = nullptr;
+#endif
   }
 
   Profile* profile() { return profile_.get(); }
 
   HostContentSettingsMap* map() { return map_.get(); }
 
+  content::HostZoomMap* zoom_map() { return zoom_map_; }
+
   void SetSiteSettingsDeletionPref(bool value) {
     profile()->GetPrefs()->SetBoolean(browsing_data::prefs::kDeleteSiteSettings,
                                       value);
@@ -61,6 +73,7 @@
   std::unique_ptr<TestingProfile> profile_;
 
   scoped_refptr<HostContentSettingsMap> map_;
+  content::HostZoomMap* zoom_map_;
   bool finished_;
   browsing_data::BrowsingDataCounter::ResultInt result_;
 };
@@ -74,7 +87,7 @@
       GURL("http://maps.google.com"), GURL("http://maps.google.com"),
       CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), CONTENT_SETTING_ALLOW);
 
-  browsing_data::SiteSettingsCounter counter(map());
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
   counter.Init(
       profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
@@ -102,7 +115,7 @@
       CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), CONTENT_SETTING_ALLOW);
 
   clock->SetNow(base::Time::Now());
-  browsing_data::SiteSettingsCounter counter(map());
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
   counter.Init(
       profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
@@ -124,7 +137,7 @@
       CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(),
       base::MakeUnique<base::DictionaryValue>());
 
-  browsing_data::SiteSettingsCounter counter(map());
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
   counter.Init(
       profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
@@ -143,7 +156,7 @@
       GURL("http://www.google.com"), GURL("http://www.google.com"),
       CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), CONTENT_SETTING_ALLOW);
 
-  browsing_data::SiteSettingsCounter counter(map());
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
   counter.Init(
       profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
@@ -160,7 +173,7 @@
       GURL("http://www.google.com"), GURL("http://www.google.com"),
       CONTENT_SETTINGS_TYPE_POPUPS, std::string(), CONTENT_SETTING_ALLOW);
 
-  browsing_data::SiteSettingsCounter counter(map());
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
   counter.Init(
       profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
@@ -174,7 +187,7 @@
       GURL("http://www.google.com"), GURL("http://www.google.com"),
       CONTENT_SETTINGS_TYPE_POPUPS, std::string(), CONTENT_SETTING_ALLOW);
 
-  browsing_data::SiteSettingsCounter counter(map());
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
   counter.Init(
       profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
@@ -183,4 +196,38 @@
   EXPECT_EQ(1, GetResult());
 }
 
+#if !defined(OS_ANDROID)
+TEST_F(SiteSettingsCounterTest, ZoomLevel) {
+  zoom_map()->SetZoomLevelForHost("google.com", 1.5);
+  zoom_map()->SetZoomLevelForHost("www.google.com", 1.5);
+
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
+  counter.Init(
+      profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
+  counter.Restart();
+
+  EXPECT_EQ(2, GetResult());
+}
+
+TEST_F(SiteSettingsCounterTest, ZoomAndContentSettingCounting) {
+  zoom_map()->SetZoomLevelForHost("google.com", 1.5);
+  zoom_map()->SetZoomLevelForHost("www.google.com", 1.5);
+  map()->SetContentSettingDefaultScope(
+      GURL("https://www.google.com"), GURL("https://www.google.com"),
+      CONTENT_SETTINGS_TYPE_POPUPS, std::string(), CONTENT_SETTING_ALLOW);
+  map()->SetContentSettingDefaultScope(
+      GURL("https://maps.google.com"), GURL("https://maps.google.com"),
+      CONTENT_SETTINGS_TYPE_POPUPS, std::string(), CONTENT_SETTING_ALLOW);
+
+  browsing_data::SiteSettingsCounter counter(map(), zoom_map());
+  counter.Init(
+      profile()->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&SiteSettingsCounterTest::Callback, base::Unretained(this)));
+  counter.Restart();
+
+  EXPECT_EQ(3, GetResult());
+}
+#endif
+
 }  // namespace
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 83b496f..c977afc1 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -87,6 +87,7 @@
     "//components/guest_view/browser",
     "//components/image_fetcher/core",
     "//components/invalidation/impl",
+    "//components/keep_alive_registry",
     "//components/keyed_service/content",
     "//components/keyed_service/core",
     "//components/login",
diff --git a/chrome/browser/chromeos/arc/arc_auth_notification.cc b/chrome/browser/chromeos/arc/arc_auth_notification.cc
index 52646598..21cf0e9 100644
--- a/chrome/browser/chromeos/arc/arc_auth_notification.cc
+++ b/chrome/browser/chromeos/arc/arc_auth_notification.cc
@@ -34,7 +34,6 @@
 
 // Ids of the notification shown on first run.
 const char kNotifierId[] = "arc_auth";
-const char kDisplaySource[] = "arc_auth_source";
 const char kFirstRunNotificationId[] = "arc_auth/first_run";
 
 class ArcAuthNotificationDelegate
@@ -156,7 +155,8 @@
                                      ui::GetChromeOSDeviceName()),
           l10n_util::GetStringUTF16(IDS_ARC_NOTIFICATION_MESSAGE),
           resource_bundle.GetImageNamed(IDR_ARC_PLAY_STORE_NOTIFICATION),
-          base::UTF8ToUTF16(kDisplaySource), GURL(), notifier_id, data,
+          l10n_util::GetStringUTF16(IDS_ARC_NOTIFICATION_DISPLAY_SOURCE),
+          GURL(), notifier_id, data,
           new ArcAuthNotificationDelegate(profile_)));
   message_center::MessageCenter::Get()->AddNotification(
       std::move(notification));
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_impl.cc b/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
index 8bcb74d..22e335a 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
@@ -57,8 +57,6 @@
 #include "chrome/browser/chromeos/system/timezone_resolver_manager.h"
 #include "chrome/browser/chromeos/system/timezone_util.h"
 #include "chrome/browser/chromeos/ui/focus_ring_controller.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/ash_util.h"
 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
@@ -76,6 +74,8 @@
 #include "chromeos/settings/cros_settings_provider.h"
 #include "chromeos/settings/timezone_settings.h"
 #include "chromeos/timezone/timezone_resolver.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/signin/core/account_id/account_id.h"
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index 6b952c2..cd4355a 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -892,6 +892,56 @@
                     POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
                     base::MakeUnique<base::Value>(container.name()), nullptr);
   }
+
+  if (policy.has_native_device_printers()) {
+    const em::DeviceNativePrintersProto& container(
+        policy.native_device_printers());
+    if (container.has_external_policy()) {
+      std::unique_ptr<base::DictionaryValue> dict_val =
+          base::DictionaryValue::From(
+              base::JSONReader::Read(container.external_policy()));
+      policies->Set(key::kDeviceNativePrinters, POLICY_LEVEL_MANDATORY,
+                    POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+                    std::move(dict_val), nullptr);
+    }
+  }
+
+  if (policy.has_native_device_printers_access_mode()) {
+    const em::DeviceNativePrintersAccessModeProto& container(
+        policy.native_device_printers_access_mode());
+    if (container.has_access_mode()) {
+      policies->Set(key::kDeviceNativePrintersAccessMode,
+                    POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
+                    POLICY_SOURCE_CLOUD,
+                    DecodeIntegerValue(container.access_mode()), nullptr);
+    }
+  }
+
+  if (policy.has_native_device_printers_blacklist()) {
+    const em::DeviceNativePrintersBlacklistProto& container(
+        policy.native_device_printers_blacklist());
+    std::unique_ptr<base::ListValue> blacklist =
+        base::MakeUnique<base::ListValue>();
+    for (const auto& entry : container.blacklist())
+      blacklist->AppendString(entry);
+
+    policies->Set(key::kDeviceNativePrintersBlacklist, POLICY_LEVEL_MANDATORY,
+                  POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+                  std::move(blacklist), nullptr);
+  }
+
+  if (policy.has_native_device_printers_whitelist()) {
+    const em::DeviceNativePrintersWhitelistProto& container(
+        policy.native_device_printers_whitelist());
+    std::unique_ptr<base::ListValue> whitelist =
+        base::MakeUnique<base::ListValue>();
+    for (const auto& entry : container.whitelist())
+      whitelist->AppendString(entry);
+
+    policies->Set(key::kDeviceNativePrintersWhitelist, POLICY_LEVEL_MANDATORY,
+                  POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+                  std::move(whitelist), nullptr);
+  }
 }
 }  // namespace
 
diff --git a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc b/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
index fef9650..19d8bbd 100644
--- a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
+++ b/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
@@ -38,6 +38,7 @@
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
 #include "net/cert/x509_certificate.h"
+#include "net/cert/x509_util_nss.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -117,8 +118,8 @@
   ~FakeCertificateImporter() override {}
 
   void SetTrustedCertificatesResult(
-      net::CertificateList onc_trusted_certificates) {
-    onc_trusted_certificates_ = onc_trusted_certificates;
+      net::ScopedCERTCertificateList onc_trusted_certificates) {
+    onc_trusted_certificates_ = std::move(onc_trusted_certificates);
   }
 
   void SetExpectedONCCertificates(const base::ListValue& certificates) {
@@ -145,13 +146,14 @@
           expected_onc_certificates_.get(), &certificates));
     }
     ++call_count_;
-    done_callback.Run(true, onc_trusted_certificates_);
+    done_callback.Run(true, net::x509_util::DupCERTCertificateList(
+                                onc_trusted_certificates_));
   }
 
  private:
   ::onc::ONCSource expected_onc_source_;
   std::unique_ptr<base::ListValue> expected_onc_certificates_;
-  net::CertificateList onc_trusted_certificates_;
+  net::ScopedCERTCertificateList onc_trusted_certificates_;
   unsigned int call_count_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeCertificateImporter);
@@ -377,16 +379,15 @@
 
 TEST_F(NetworkConfigurationUpdaterTest,
        DoNotAllowTrustedCertificatesFromPolicy) {
-  net::CertificateList cert_list;
-  cert_list =
-      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
-                                         "ok_cert.pem",
-                                         net::X509Certificate::FORMAT_AUTO);
+  net::ScopedCERTCertificateList cert_list =
+      net::CreateCERTCertificateListFromFile(net::GetTestCertsDirectory(),
+                                             "ok_cert.pem",
+                                             net::X509Certificate::FORMAT_AUTO);
   ASSERT_EQ(1u, cert_list.size());
 
   EXPECT_CALL(network_config_handler_,
               SetPolicy(onc::ONC_SOURCE_USER_POLICY, _, _, _));
-  certificate_importer_->SetTrustedCertificatesResult(cert_list);
+  certificate_importer_->SetTrustedCertificatesResult(std::move(cert_list));
 
   UserNetworkConfigurationUpdater* updater =
       CreateNetworkConfigurationUpdaterForUserPolicy(
@@ -415,15 +416,14 @@
   EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _))
       .Times(AnyNumber());
 
-  net::CertificateList cert_list;
-  cert_list =
-      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
-                                         "ok_cert.pem",
-                                         net::X509Certificate::FORMAT_AUTO);
+  net::ScopedCERTCertificateList cert_list =
+      net::CreateCERTCertificateListFromFile(net::GetTestCertsDirectory(),
+                                             "ok_cert.pem",
+                                             net::X509Certificate::FORMAT_AUTO);
   ASSERT_EQ(1u, cert_list.size());
 
   certificate_importer_->SetExpectedONCSource(onc::ONC_SOURCE_USER_POLICY);
-  certificate_importer_->SetTrustedCertificatesResult(cert_list);
+  certificate_importer_->SetTrustedCertificatesResult(std::move(cert_list));
 
   UserNetworkConfigurationUpdater* updater =
       CreateNetworkConfigurationUpdaterForUserPolicy(
@@ -466,13 +466,12 @@
   EXPECT_TRUE(observer.trust_anchors_.empty());
 
   // Now use a non-empty certificate list to test the observer notification.
-  net::CertificateList cert_list;
-  cert_list =
-      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
-                                         "ok_cert.pem",
-                                         net::X509Certificate::FORMAT_AUTO);
+  net::ScopedCERTCertificateList cert_list =
+      net::CreateCERTCertificateListFromFile(net::GetTestCertsDirectory(),
+                                             "ok_cert.pem",
+                                             net::X509Certificate::FORMAT_AUTO);
   ASSERT_EQ(1u, cert_list.size());
-  certificate_importer_->SetTrustedCertificatesResult(cert_list);
+  certificate_importer_->SetTrustedCertificatesResult(std::move(cert_list));
 
   // Change to any non-empty policy, so that updates are triggered. The actual
   // content of the policy is irrelevant.
diff --git a/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc b/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc
index 13763da..2b22313c 100644
--- a/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc
+++ b/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc
@@ -22,6 +22,7 @@
 #include "net/cert/cert_verify_result.h"
 #include "net/cert/nss_cert_database_chromeos.h"
 #include "net/cert/x509_certificate.h"
+#include "net/cert/x509_util_nss.h"
 #include "net/log/net_log_with_source.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
@@ -54,10 +55,17 @@
         crypto::GetPublicSlotForChromeOSUser(test_nss_user_.username_hash())));
 
     test_ca_cert_ = LoadCertificate("root_ca_cert.pem", net::CA_CERT);
-    ASSERT_TRUE(test_ca_cert_.get());
-    test_server_cert_ = LoadCertificate("ok_cert.pem", net::SERVER_CERT);
-    ASSERT_TRUE(test_server_cert_.get());
-    test_ca_cert_list_.push_back(test_ca_cert_);
+    ASSERT_TRUE(test_ca_cert_);
+    test_ca_cert_list_.push_back(
+        net::x509_util::DupCERTCertificate(test_ca_cert_.get()));
+
+    net::ScopedCERTCertificate test_server_cert =
+        LoadCertificate("ok_cert.pem", net::SERVER_CERT);
+    ASSERT_TRUE(test_server_cert);
+    test_server_cert_ =
+        net::x509_util::CreateX509CertificateFromCERTCertificate(
+            test_server_cert.get());
+    ASSERT_TRUE(test_server_cert_);
   }
 
   void TearDown() override {
@@ -96,9 +104,9 @@
   }
 
   // |test_ca_cert_| is the issuer of |test_server_cert_|.
-  scoped_refptr<net::X509Certificate> test_ca_cert_;
+  net::ScopedCERTCertificate test_ca_cert_;
   scoped_refptr<net::X509Certificate> test_server_cert_;
-  net::CertificateList test_ca_cert_list_;
+  net::ScopedCERTCertificateList test_ca_cert_list_;
   std::unique_ptr<net::NSSCertDatabaseChromeOS> test_cert_db_;
   std::unique_ptr<PolicyCertVerifier> cert_verifier_;
 
@@ -107,10 +115,12 @@
     trust_anchor_used_ = true;
   }
 
-  scoped_refptr<net::X509Certificate> LoadCertificate(const std::string& name,
-                                                      net::CertType type) {
-    scoped_refptr<net::X509Certificate> cert =
-        net::ImportCertFromFile(net::GetTestCertsDirectory(), name);
+  net::ScopedCERTCertificate LoadCertificate(const std::string& name,
+                                             net::CertType type) {
+    net::ScopedCERTCertificate cert =
+        net::ImportCERTCertificateFromFile(net::GetTestCertsDirectory(), name);
+    if (!cert)
+      return cert;
 
     // No certificate is trusted right after it's loaded.
     net::NSSCertDatabase::TrustBits trust =
@@ -194,8 +204,13 @@
   }
   EXPECT_FALSE(WasTrustAnchorUsedAndReset());
 
+  net::CertificateList test_ca_x509cert_list =
+      net::x509_util::CreateX509CertificateListFromCERTCertificates(
+          test_ca_cert_list_);
+  ASSERT_FALSE(test_ca_x509cert_list.empty());
+
   // Verify() again with the additional trust anchors.
-  cert_verifier_->SetTrustAnchors(test_ca_cert_list_);
+  cert_verifier_->SetTrustAnchors(test_ca_x509cert_list);
   {
     net::CertVerifyResult verify_result;
     net::TestCompletionCallback callback;
@@ -209,7 +224,7 @@
   EXPECT_TRUE(WasTrustAnchorUsedAndReset());
 
   // Verify() again with the additional trust anchors will hit the cache.
-  cert_verifier_->SetTrustAnchors(test_ca_cert_list_);
+  cert_verifier_->SetTrustAnchors(test_ca_x509cert_list);
   {
     net::CertVerifyResult verify_result;
     net::TestCompletionCallback callback;
diff --git a/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto b/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto
index 11185ae..4a9d1bc5 100644
--- a/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto
+++ b/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto
@@ -860,6 +860,40 @@
   repeated string ignored_policies = 3;
 }
 
+// The url and hash that specified in JSON format that can be used to retrieve
+// the device-level printers configuration file.
+message DeviceNativePrintersProto {
+  // External policy blob encoded as JSON.
+  optional string external_policy = 1;
+}
+
+// The policy which determines the type of access restriction that is applied to
+// the devicel-level printers list.
+message DeviceNativePrintersAccessModeProto {
+  enum AccessMode {
+    ACCESS_MODE_BLACKLIST = 0;  // Use NatvePrintersBlacklistProto.
+    ACCESS_MODE_WHITELIST = 1;  // Use NaviePrintersWhitelistProto.
+    ACCESS_MODE_ALL = 2;        // Allow access to all specified printers.
+  }
+
+  // The type of access which is applied to the device-level printer list.
+  optional AccessMode access_mode = 1;
+}
+
+// A collection of ids defining the printers which are explicitly disallowed for
+// the device.
+message DeviceNativePrintersBlacklistProto {
+  // A collection of ids for which are explicitly disallowed.
+  repeated string blacklist = 1;
+}
+
+// A collection of ids defining the printers which are explicitly allowed for
+// the device.
+message DeviceNativePrintersWhitelistProto {
+  // A collection of ids for the list of printers which are accessible.
+  repeated string whitelist = 1;
+}
+
 message ChromeDeviceSettingsProto {
   optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1;
   optional UserWhitelistProto user_whitelist = 2;
@@ -924,4 +958,11 @@
       device_second_factor_authentication = 52;
   optional CastReceiverNameProto cast_receiver_name = 53;
   optional DeviceOffHoursProto device_off_hours = 54;
+  optional DeviceNativePrintersProto native_device_printers = 55;
+  optional DeviceNativePrintersAccessModeProto
+      native_device_printers_access_mode = 56;
+  optional DeviceNativePrintersBlacklistProto native_device_printers_blacklist =
+      57;
+  optional DeviceNativePrintersWhitelistProto native_device_printers_whitelist =
+      58;
 }
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater.cc b/chrome/browser/chromeos/policy/user_network_configuration_updater.cc
index e6e66a0..8d41d47 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater.cc
+++ b/chrome/browser/chromeos/policy/user_network_configuration_updater.cc
@@ -21,6 +21,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_source.h"
 #include "net/cert/x509_certificate.h"
+#include "net/cert/x509_util_nss.h"
 
 namespace policy {
 
@@ -87,10 +88,13 @@
 
 void UserNetworkConfigurationUpdater::OnCertificatesImported(
     bool /* unused success */,
-    const net::CertificateList& onc_trusted_certificates) {
+    net::ScopedCERTCertificateList onc_trusted_certificates) {
   web_trust_certs_.clear();
-  if (allow_trusted_certificates_from_policy_)
-    web_trust_certs_ = onc_trusted_certificates;
+  if (allow_trusted_certificates_from_policy_) {
+    web_trust_certs_ =
+        net::x509_util::CreateX509CertificateListFromCERTCertificates(
+            onc_trusted_certificates);
+  }
   NotifyTrustAnchorsChanged();
 }
 
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater.h b/chrome/browser/chromeos/policy/user_network_configuration_updater.h
index 6bb1b6e..b2f819d 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater.h
+++ b/chrome/browser/chromeos/policy/user_network_configuration_updater.h
@@ -17,6 +17,7 @@
 #include "components/keyed_service/core/keyed_service.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
+#include "net/cert/scoped_nss_types.h"
 
 class Profile;
 
@@ -98,7 +99,7 @@
   // Called by the CertificateImporter when an import finished.
   void OnCertificatesImported(
       bool success,
-      const net::CertificateList& onc_trusted_certificates);
+      net::ScopedCERTCertificateList onc_trusted_certificates);
 
   // NetworkConfigurationUpdater:
   void ImportCertificates(const base::ListValue& certificates_onc) override;
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index b30c243c..b0956b9 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -66,6 +66,10 @@
     kDeviceDisabledMessage,
     kDeviceLoginScreenAppInstallList,
     kDeviceOwner,
+    kDevicePrintersConfigurations,
+    kDevicePrintersAccessMode,
+    kDevicePrintersBlacklist,
+    kDevicePrintersWhitelist,
     kDeviceQuirksDownloadEnabled,
     kDeviceWallpaperImage,
     kDisplayRotationDefault,
diff --git a/chrome/browser/download/notification/download_item_notification.cc b/chrome/browser/download/notification/download_item_notification.cc
index 1d37a7d..57660da 100644
--- a/chrome/browser/download/notification/download_item_notification.cc
+++ b/chrome/browser/download/notification/download_item_notification.cc
@@ -50,6 +50,7 @@
 #endif  // defined(OS_CHROMEOS)
 
 using base::UserMetricsAction;
+using message_center::MessageCenter;
 
 namespace {
 
@@ -502,9 +503,19 @@
                             ? IDR_DOWNLOAD_NOTIFICATION_WARNING_BAD
                             : IDR_DOWNLOAD_NOTIFICATION_WARNING_UNWANTED);
 #else
-    SetNotificationVectorIcon(
-        vector_icons::kWarningIcon,
-        model.MightBeMalicious() ? gfx::kGoogleRed700 : gfx::kGoogleYellow700);
+    if (MessageCenter::IsNewStyleNotificationEnabled()) {
+      SetNotificationVectorIcon(
+          kNotificationDownloadIcon,
+          model.MightBeMalicious()
+              ? message_center::kSystemNotificationColorCriticalWarning
+              : message_center::kSystemNotificationColorWarning);
+
+    } else {
+      SetNotificationVectorIcon(vector_icons::kWarningIcon,
+                                model.MightBeMalicious()
+                                    ? gfx::kGoogleRed700
+                                    : gfx::kGoogleYellow700);
+    }
 #endif
     return;
   }
@@ -514,15 +525,21 @@
   switch (item_->GetState()) {
     case content::DownloadItem::IN_PROGRESS:
     case content::DownloadItem::COMPLETE:
-      if (is_off_the_record) {
-#if defined(OS_MACOSX)
-        SetNotificationIcon(IDR_DOWNLOAD_NOTIFICATION_INCOGNITO);
-#else
-        SetNotificationVectorIcon(kFileDownloadIncognitoIcon,
-                                  gfx::kChromeIconGrey);
-#endif
+      if (MessageCenter::IsNewStyleNotificationEnabled()) {
+        SetNotificationVectorIcon(
+            kNotificationDownloadIcon,
+            message_center::kSystemNotificationColorNormal);
       } else {
-        SetNotificationVectorIcon(kFileDownloadIcon, gfx::kGoogleBlue500);
+        if (is_off_the_record) {
+#if defined(OS_MACOSX)
+          SetNotificationIcon(IDR_DOWNLOAD_NOTIFICATION_INCOGNITO);
+#else
+          SetNotificationVectorIcon(kFileDownloadIncognitoIcon,
+                                    gfx::kChromeIconGrey);
+#endif
+        } else {
+          SetNotificationVectorIcon(kFileDownloadIcon, gfx::kGoogleBlue500);
+        }
       }
       break;
 
@@ -530,8 +547,14 @@
 #if defined(OS_MACOSX)
       SetNotificationIcon(IDR_DOWNLOAD_NOTIFICATION_ERROR);
 #else
-      SetNotificationVectorIcon(vector_icons::kErrorCircleIcon,
-                                gfx::kGoogleRed700);
+      if (MessageCenter::IsNewStyleNotificationEnabled()) {
+        SetNotificationVectorIcon(
+            kNotificationDownloadIcon,
+            message_center::kSystemNotificationColorCriticalWarning);
+      } else {
+        SetNotificationVectorIcon(vector_icons::kErrorCircleIcon,
+                                  gfx::kGoogleRed700);
+      }
 #endif
       break;
 
@@ -565,7 +588,14 @@
 void DownloadItemNotification::SetNotificationVectorIcon(
     const gfx::VectorIcon& icon,
     SkColor color) {
-  notification_->set_icon(gfx::Image(gfx::CreateVectorIcon(icon, 40, color)));
+  if (MessageCenter::IsNewStyleNotificationEnabled()) {
+    notification_->set_accent_color(color);
+    notification_->set_small_image(gfx::Image(
+        gfx::CreateVectorIcon(icon, message_center::kSmallImageSizeMD, color)));
+    notification_->set_vector_small_image(icon);
+  } else {
+    notification_->set_icon(gfx::Image(gfx::CreateVectorIcon(icon, 40, color)));
+  }
 }
 
 void DownloadItemNotification::DisablePopup() {
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
index 7bb3c57..b08ffac 100644
--- a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
+++ b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
@@ -15,13 +15,13 @@
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/extensions/api/content_settings/content_settings_api.h"
 #include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/plugin_service.h"
diff --git a/chrome/browser/extensions/api/preference/preference_apitest.cc b/chrome/browser/extensions/api/preference/preference_apitest.cc
index 69e7e5d..631a0bb 100644
--- a/chrome/browser/extensions/api/preference/preference_apitest.cc
+++ b/chrome/browser/extensions/api/preference/preference_apitest.cc
@@ -13,8 +13,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/net/prediction_options.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -23,6 +21,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/autofill/core/common/autofill_pref_names.h"
 #include "components/content_settings/core/common/pref_names.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 42fc3a2..2fc700a 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1581,12 +1581,6 @@
     "Enables use of the Android spellchecker.";
 const char kEnableAndroidSpellcheckerName[] = "Enable spell checking";
 
-const char kEnableConsistentOmniboxGeolocationName[] =
-    "Have consistent omnibox geolocation access.";
-const char kEnableConsistentOmniboxGeolocationDescription[] =
-    "Have consistent geolocation access between the omnibox and default search "
-    "engine.";
-
 const char kEnableContentSuggestionsNewFaviconServerName[] =
     "Get favicons for content suggestions from a new server.";
 const char kEnableContentSuggestionsNewFaviconServerDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index d6fcf7d..c1e7404 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -975,9 +975,6 @@
 extern const char kEnableAndroidSpellcheckerDescription[];
 extern const char kEnableAndroidSpellcheckerName[];
 
-extern const char kEnableConsistentOmniboxGeolocationName[];
-extern const char kEnableConsistentOmniboxGeolocationDescription[];
-
 extern const char kEnableContentSuggestionsNewFaviconServerName[];
 extern const char kEnableContentSuggestionsNewFaviconServerDescription[];
 
diff --git a/chrome/browser/geolocation/geolocation_permission_context_unittest.cc b/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
index 67508717..129efb8f 100644
--- a/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
+++ b/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
@@ -20,7 +20,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/clock.h"
 #include "chrome/browser/chrome_notification_types.h"
@@ -32,7 +31,6 @@
 #include "chrome/browser/permissions/permission_request_id.h"
 #include "chrome/browser/permissions/permission_request_manager.h"
 #include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
@@ -1076,10 +1074,6 @@
 
 #if defined(OS_ANDROID)
 TEST_F(GeolocationPermissionContextTests, SearchGeolocationInIncognito) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kConsistentOmniboxGeolocation);
-
   GURL requesting_frame(TestSearchEngineDelegate::kDSETestUrl);
   // The DSE Geolocation setting should be used in incognito if it is BLOCK,
   // but not if it is ALLOW.
diff --git a/chrome/browser/lifetime/application_lifetime.cc b/chrome/browser/lifetime/application_lifetime.cc
index 77cac0c..9764d5d 100644
--- a/chrome/browser/lifetime/application_lifetime.cc
+++ b/chrome/browser/lifetime/application_lifetime.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/download/download_core_service.h"
 #include "chrome/browser/lifetime/browser_close_manager.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
 #include "chrome/browser/metrics/thread_watcher.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -32,6 +31,7 @@
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/features.h"
 #include "chrome/common/pref_names.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
 #include "components/metrics/metrics_service.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/lifetime/browser_close_manager_browsertest.cc b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
index f303754..fd3b3e8 100644
--- a/chrome/browser/lifetime/browser_close_manager_browsertest.cc
+++ b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
@@ -23,8 +23,6 @@
 #include "chrome/browser/download/download_core_service_factory.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/net/url_request_mock_util.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/profiles/profile.h"
@@ -41,6 +39,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/app_modal/javascript_app_modal_dialog.h"
 #include "components/app_modal/native_app_modal_dialog.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/sessions/core/tab_restore_service.h"
 #include "components/sessions/core/tab_restore_service_observer.h"
 #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/notifications/fullscreen_notification_blocker.cc b/chrome/browser/notifications/fullscreen_notification_blocker.cc
index e12fb6e..37b2ba18 100644
--- a/chrome/browser/notifications/fullscreen_notification_blocker.cc
+++ b/chrome/browser/notifications/fullscreen_notification_blocker.cc
@@ -12,45 +12,8 @@
 #include "ui/display/types/display_constants.h"
 #include "ui/message_center/notifier_settings.h"
 
-#if defined(USE_ASH)
-#include "ash/root_window_controller.h"
-#include "ash/shell.h"
-#include "ash/system/system_notifier.h"
-#include "ash/wm/window_state.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
-#endif
-
 using message_center::NotifierId;
 
-namespace {
-
-bool DoesFullscreenModeBlockNotifications() {
-#if defined(USE_ASH)
-  if (ash::Shell::HasInstance()) {
-    ash::RootWindowController* controller =
-        ash::RootWindowController::ForTargetRootWindow();
-
-    // During shutdown |controller| can be NULL.
-    if (!controller)
-      return false;
-
-    // Block notifications if the shelf is hidden because of a fullscreen
-    // window.
-    const aura::Window* fullscreen_window =
-        controller->GetWindowForFullscreenMode();
-    if (!fullscreen_window)
-      return false;
-    return ash::wm::GetWindowState(fullscreen_window)
-        ->hide_shelf_when_fullscreen();
-  }
-#endif
-  // Fullscreen is global state on platforms other than chromeos.
-  return IsFullScreenMode(display::kInvalidDisplayId);
-}
-
-}  // namespace
-
 FullscreenNotificationBlocker::FullscreenNotificationBlocker(
     message_center::MessageCenter* message_center)
     : NotificationBlocker(message_center),
@@ -64,7 +27,7 @@
 
 void FullscreenNotificationBlocker::CheckState() {
   bool was_fullscreen_mode = is_fullscreen_mode_;
-  is_fullscreen_mode_ = DoesFullscreenModeBlockNotifications();
+  is_fullscreen_mode_ = IsFullScreenMode(display::kInvalidDisplayId);
   if (is_fullscreen_mode_ != was_fullscreen_mode)
     NotifyBlockingStateChanged();
 }
@@ -75,12 +38,6 @@
   if (is_fullscreen_mode_ && notification.delegate())
     enabled = notification.delegate()->ShouldDisplayOverFullscreen();
 
-#if defined(USE_ASH)
-  if (ash::Shell::HasInstance())
-    enabled = enabled || ash::system_notifier::ShouldAlwaysShowPopups(
-        notification.notifier_id());
-#endif
-
   if (enabled && !is_fullscreen_mode_) {
     UMA_HISTOGRAM_ENUMERATION("Notifications.Display_Windowed",
                               notification.notifier_id().type,
diff --git a/chrome/browser/notifications/fullscreen_notification_blocker.h b/chrome/browser/notifications/fullscreen_notification_blocker.h
index f8d6107f..5b30c42f 100644
--- a/chrome/browser/notifications/fullscreen_notification_blocker.h
+++ b/chrome/browser/notifications/fullscreen_notification_blocker.h
@@ -10,7 +10,8 @@
 #include "content/public/browser/notification_registrar.h"
 #include "ui/message_center/notification_blocker.h"
 
-// A notification blocker which checks the fullscreen state.
+// A notification blocker which checks the fullscreen state. This is not used on
+// ChromeOS as ash has its own fullscreen notification blocker.
 class FullscreenNotificationBlocker
     : public message_center::NotificationBlocker,
       public content::NotificationObserver {
diff --git a/chrome/browser/notifications/message_center_notification_manager.cc b/chrome/browser/notifications/message_center_notification_manager.cc
index 46c8dbd..fe5d373 100644
--- a/chrome/browser/notifications/message_center_notification_manager.cc
+++ b/chrome/browser/notifications/message_center_notification_manager.cc
@@ -12,7 +12,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/notifications/extension_welcome_notification.h"
 #include "chrome/browser/notifications/extension_welcome_notification_factory.h"
-#include "chrome/browser/notifications/fullscreen_notification_blocker.h"
 #include "chrome/browser/notifications/message_center_settings_controller.h"
 #include "chrome/browser/notifications/notification.h"
 #include "chrome/browser/notifications/profile_notification.h"
@@ -30,6 +29,7 @@
 #include "ui/message_center/notifier_settings.h"
 
 #if !defined(OS_CHROMEOS)
+#include "chrome/browser/notifications/fullscreen_notification_blocker.h"
 #include "chrome/browser/notifications/screen_lock_notification_blocker.h"
 #endif
 
@@ -48,9 +48,9 @@
 #if !defined(OS_CHROMEOS)
   blockers_.push_back(
       base::MakeUnique<ScreenLockNotificationBlocker>(message_center));
-#endif
   blockers_.push_back(
       base::MakeUnique<FullscreenNotificationBlocker>(message_center));
+#endif
 
 #if defined(OS_WIN) || defined(OS_MACOSX) \
   || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
diff --git a/chrome/browser/notifications/message_center_notifications_browsertest.cc b/chrome/browser/notifications/message_center_notifications_browsertest.cc
index fe5253b..47976104 100644
--- a/chrome/browser/notifications/message_center_notifications_browsertest.cc
+++ b/chrome/browser/notifications/message_center_notifications_browsertest.cc
@@ -15,14 +15,14 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
 #include "chrome/browser/notifications/message_center_notification_manager.h"
 #include "chrome/browser/notifications/notification.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/message_center_switches.h"
 #include "ui/message_center/message_center_types.h"
diff --git a/chrome/browser/notifications/platform_notification_service_impl.cc b/chrome/browser/notifications/platform_notification_service_impl.cc
index 8493638a..4d78b386 100644
--- a/chrome/browser/notifications/platform_notification_service_impl.cc
+++ b/chrome/browser/notifications/platform_notification_service_impl.cc
@@ -51,8 +51,8 @@
 #include "url/url_constants.h"
 
 #if BUILDFLAG(ENABLE_BACKGROUND)
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #endif
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
index 9b0206f..f723f8d 100644
--- a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
+++ b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
@@ -46,8 +46,8 @@
 #include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h"
 
 #if BUILDFLAG(ENABLE_BACKGROUND)
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 #endif
 
 namespace {
diff --git a/chrome/browser/notifications/profile_notification.cc b/chrome/browser/notifications/profile_notification.cc
index b981444..369e0e7 100644
--- a/chrome/browser/notifications/profile_notification.cc
+++ b/chrome/browser/notifications/profile_notification.cc
@@ -6,9 +6,9 @@
 
 #include "base/strings/stringprintf.h"
 #include "build/build_config.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/signin/core/account_id/account_id.h"
 
 // static
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index a8db1f1d..6e82eb2 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -20,8 +20,6 @@
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h"
@@ -49,6 +47,8 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "components/sessions/core/serialized_navigation_entry.h"
 #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
diff --git a/chrome/browser/previews/previews_infobar_delegate.cc b/chrome/browser/previews/previews_infobar_delegate.cc
index 9850672..b2accfd 100644
--- a/chrome/browser/previews/previews_infobar_delegate.cc
+++ b/chrome/browser/previews/previews_infobar_delegate.cc
@@ -73,6 +73,7 @@
   switch (previews_type) {
     case previews::PreviewsType::LITE_PAGE:
     case previews::PreviewsType::OFFLINE:
+    case previews::PreviewsType::AMP_REDIRECTION:
       // Prevent LoFi and lite page modes from showing after reload.
       // TODO(ryansturm): rename DISABLE_LOFI_MODE to DISABLE_PREVIEWS.
       // crbug.com/707272
diff --git a/chrome/browser/previews/previews_service.cc b/chrome/browser/previews/previews_service.cc
index 4f322b1..c2a4ee2 100644
--- a/chrome/browser/previews/previews_service.cc
+++ b/chrome/browser/previews/previews_service.cc
@@ -36,6 +36,8 @@
       return server_previews_enabled ||
              (data_reduction_proxy::params::IsLoFiOnViaFlags() &&
               data_reduction_proxy::params::AreLitePagesEnabledViaFlags());
+    case previews::PreviewsType::AMP_REDIRECTION:
+      return previews::params::IsAMPRedirectionPreviewEnabled();
     case previews::PreviewsType::NONE:
     case previews::PreviewsType::LAST:
       break;
@@ -54,6 +56,8 @@
       return previews::params::ClientLoFiVersion();
     case previews::PreviewsType::LITE_PAGE:
       return data_reduction_proxy::params::LitePageVersion();
+    case previews::PreviewsType::AMP_REDIRECTION:
+      return previews::params::AMPRedirectionPreviewsVersion();
     case previews::PreviewsType::NONE:
     case previews::PreviewsType::LAST:
       break;
diff --git a/chrome/browser/profiles/profile_attributes_storage.cc b/chrome/browser/profiles/profile_attributes_storage.cc
index adc10a8..79c0e10 100644
--- a/chrome/browser/profiles/profile_attributes_storage.cc
+++ b/chrome/browser/profiles/profile_attributes_storage.cc
@@ -117,6 +117,11 @@
 
 std::vector<ProfileAttributesEntry*>
 ProfileAttributesStorage::GetAllProfilesAttributesSortedByName() {
+  std::vector<ProfileAttributesEntry*> ret = GetAllProfilesAttributes();
+  // Do not allocate the collator and sort if it is not necessary.
+  if (ret.size() < 2)
+    return ret;
+
   UErrorCode error_code = U_ZERO_ERROR;
   // Use the default collator. The default locale should have been properly
   // set by the time this constructor is called.
@@ -124,7 +129,6 @@
       icu::Collator::createInstance(error_code));
   DCHECK(U_SUCCESS(error_code));
 
-  std::vector<ProfileAttributesEntry*> ret = GetAllProfilesAttributes();
   std::sort(ret.begin(), ret.end(),
             ProfileAttributesSortComparator(collator.get()));
   return ret;
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc
index b6a17e8..894162e 100644
--- a/chrome/browser/profiles/profile_impl_io_data.cc
+++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -511,6 +511,7 @@
       data_reduction_proxy_io_data()->CreateInterceptor());
   data_reduction_proxy_io_data()->SetDataUseAscriber(
       io_thread_globals->data_use_ascriber.get());
+  data_reduction_proxy_io_data()->SetPreviewsDecider(previews_io_data());
   SetUpJobFactoryDefaultsForBuilder(
       builder, std::move(request_interceptors),
       std::move(profile_params->protocol_handler_interceptor));
diff --git a/chrome/browser/profiles/profile_info_cache.cc b/chrome/browser/profiles/profile_info_cache.cc
index 550f0bf53..aed2447 100644
--- a/chrome/browser/profiles/profile_info_cache.cc
+++ b/chrome/browser/profiles/profile_info_cache.cc
@@ -220,12 +220,12 @@
 
 void ProfileInfoCache::DeleteProfileFromCache(
     const base::FilePath& profile_path) {
-  size_t profile_index = GetIndexOfProfileWithPath(profile_path);
-  if (profile_index == std::string::npos) {
+  ProfileAttributesEntry* entry;
+  if (!GetProfileAttributesWithPath(profile_path, &entry)) {
     NOTREACHED();
     return;
   }
-  base::string16 name = GetNameOfProfileAtIndex(profile_index);
+  base::string16 name = entry->GetName();
 
   for (auto& observer : observer_list_)
     observer.OnProfileWillBeRemoved(profile_path);
@@ -944,38 +944,24 @@
 void ProfileInfoCache::MigrateLegacyProfileNamesAndDownloadAvatars() {
   // Only do this on desktop platforms.
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
-  // Migrate any legacy profile names ("First user", "Default Profile") to
-  // new style default names ("Person 1"). The problem here is that every
-  // time you rename a profile, the ProfileInfoCache sorts itself, so
-  // whatever you were iterating through is no longer valid. We need to
-  // save a list of the profile paths (which thankfully do not change) that
-  // need to be renamed. We also can't pre-compute the new names, as they
-  // depend on the names of all the other profiles in the info cache, so they
-  // need to be re-computed after each rename.
-  std::vector<base::FilePath> profiles_to_rename;
-
+  // Migrate any legacy default profile names ("First user", "Default Profile")
+  // to new style default names ("Person 1").
   const base::string16 default_profile_name = base::i18n::ToLower(
       l10n_util::GetStringUTF16(IDS_DEFAULT_PROFILE_NAME));
   const base::string16 default_legacy_profile_name = base::i18n::ToLower(
       l10n_util::GetStringUTF16(IDS_LEGACY_DEFAULT_PROFILE_NAME));
 
-  for (size_t i = 0; i < GetNumberOfProfiles(); i++) {
-    DownloadHighResAvatarIfNeeded(GetAvatarIconIndexOfProfileAtIndex(i),
-                                  GetPathOfProfileAtIndex(i));
+  std::vector<ProfileAttributesEntry*> entries = GetAllProfilesAttributes();
+  for (ProfileAttributesEntry* entry : entries) {
+    DownloadHighResAvatarIfNeeded(entry->GetAvatarIconIndex(),
+                                  entry->GetPath());
 
-    base::string16 name = base::i18n::ToLower(GetNameOfProfileAtIndex(i));
-    if (name == default_profile_name || name == default_legacy_profile_name)
-      profiles_to_rename.push_back(GetPathOfProfileAtIndex(i));
-  }
-
-  // Rename the necessary profiles.
-  std::vector<base::FilePath>::const_iterator it;
-  for (it = profiles_to_rename.begin(); it != profiles_to_rename.end(); ++it) {
-    size_t profile_index = GetIndexOfProfileWithPath(*it);
-    SetProfileIsUsingDefaultNameAtIndex(profile_index, true);
-    // This will assign a new "Person %d" type name and re-sort the cache.
-    SetNameOfProfileAtIndex(profile_index, ChooseNameForNewProfile(
-        GetAvatarIconIndexOfProfileAtIndex(profile_index)));
+    // Rename the necessary profiles.
+    base::string16 name = base::i18n::ToLower(entry->GetName());
+    if (name == default_profile_name || name == default_legacy_profile_name) {
+      entry->SetIsUsingDefaultName(true);
+      entry->SetName(ChooseNameForNewProfile(entry->GetAvatarIconIndex()));
+    }
   }
 #endif
 }
diff --git a/chrome/browser/profiles/profile_info_cache_unittest.cc b/chrome/browser/profiles/profile_info_cache_unittest.cc
index 5554b5ee..873f4ad 100644
--- a/chrome/browser/profiles/profile_info_cache_unittest.cc
+++ b/chrome/browser/profiles/profile_info_cache_unittest.cc
@@ -744,11 +744,22 @@
   ResetCache();
 
   // Legacy profile names like "Default Profile" and "First user" should be
-  // migrated to "Person %n" type names.
-  EXPECT_EQ(ASCIIToUTF16("Person 1"), GetCache()->GetNameOfProfileAtIndex(
-      GetCache()->GetIndexOfProfileWithPath(path_1)));
-  EXPECT_EQ(ASCIIToUTF16("Person 3"), GetCache()->GetNameOfProfileAtIndex(
-      GetCache()->GetIndexOfProfileWithPath(path_2)));
+  // migrated to "Person %n" type names, i.e. any permutation of "Person 1" and
+  // "Person 3".
+  if (ASCIIToUTF16("Person 1") ==
+      GetCache()->GetNameOfProfileAtIndex(
+          GetCache()->GetIndexOfProfileWithPath(path_1))) {
+    EXPECT_EQ(ASCIIToUTF16("Person 3"),
+              GetCache()->GetNameOfProfileAtIndex(
+                  GetCache()->GetIndexOfProfileWithPath(path_2)));
+  } else {
+    EXPECT_EQ(ASCIIToUTF16("Person 3"),
+              GetCache()->GetNameOfProfileAtIndex(
+                  GetCache()->GetIndexOfProfileWithPath(path_1)));
+    EXPECT_EQ(ASCIIToUTF16("Person 1"),
+              GetCache()->GetNameOfProfileAtIndex(
+                  GetCache()->GetIndexOfProfileWithPath(path_2)));
+  }
 
   // Other profile names should not be migrated even if they're the old
   // default cartoon profile names.
diff --git a/chrome/browser/profiles/profile_manager_browsertest.cc b/chrome/browser/profiles/profile_manager_browsertest.cc
index 4e00ce1..59a368dc 100644
--- a/chrome/browser/profiles/profile_manager_browsertest.cc
+++ b/chrome/browser/profiles/profile_manager_browsertest.cc
@@ -14,8 +14,6 @@
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
@@ -29,6 +27,8 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "components/autofill/core/common/password_form.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/password_manager/core/browser/password_store.h"
 #include "components/password_manager/core/browser/password_store_consumer.h"
 #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/push_messaging/push_messaging_browsertest.cc b/chrome/browser/push_messaging/push_messaging_browsertest.cc
index f611799..e9dc2ee4 100644
--- a/chrome/browser/push_messaging/push_messaging_browsertest.cc
+++ b/chrome/browser/push_messaging/push_messaging_browsertest.cc
@@ -28,8 +28,6 @@
 #include "chrome/browser/gcm/gcm_profile_service_factory.h"
 #include "chrome/browser/gcm/instance_id/instance_id_profile_service.h"
 #include "chrome/browser/gcm/instance_id/instance_id_profile_service_factory.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
 #include "chrome/browser/notifications/notification.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/browser/permissions/permission_request_manager.h"
@@ -51,6 +49,8 @@
 #include "components/gcm_driver/gcm_client.h"
 #include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
 #include "components/gcm_driver/instance_id/instance_id_driver.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 #include "content/public/browser/browsing_data_remover.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc
index 82ef198..8c2d7f62 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.cc
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc
@@ -60,8 +60,8 @@
 
 #if BUILDFLAG(ENABLE_BACKGROUND)
 #include "chrome/browser/background/background_mode_manager.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #endif
 
 using instance_id::InstanceID;
diff --git a/chrome/browser/resources/chromeos/arc_support/images/error_image.png b/chrome/browser/resources/chromeos/arc_support/images/error_image.png
index 56a1cfd0..52350092 100644
--- a/chrome/browser/resources/chromeos/arc_support/images/error_image.png
+++ b/chrome/browser/resources/chromeos/arc_support/images/error_image.png
Binary files differ
diff --git a/chrome/browser/resources/chromeos/arc_support/main.css b/chrome/browser/resources/chromeos/arc_support/main.css
index 9185f6e..6bc1f9a 100644
--- a/chrome/browser/resources/chromeos/arc_support/main.css
+++ b/chrome/browser/resources/chromeos/arc_support/main.css
@@ -24,14 +24,12 @@
   font-size: 28px;
   font-weight: normal;
   margin: 36px 0 0 0; /* = 64 - font height*/
-  padding: 0 0 0 64px;
 }
 
 .subtitle {
   color: rgba(0, 0, 0, 0.87);
   font-size: 13px;
   margin: 23px 0 0 0; /* = 40 - 4 (adjustment) - line-height */
-  padding-left: 64px;
 }
 
 ::-webkit-scrollbar {
@@ -93,10 +91,10 @@
 }
 
 .content {
-  /* height plus padding equals 360px, which is app height (640px) minus icon
-   * header (96px), greeting header (64px), subtitle (40px) and bottom (80px).
+  /* height plus padding equals 464px, which is app height (640px) minus icon
+   * header (96px) and bottom (80px).
    */
-  height: 338px;
+  height: 452px;
   margin: 0;
   padding: 0 64px 12px 64px;
 }
@@ -128,6 +126,7 @@
 }
 
 .icon-header {
+  display: block;
   height: 32px;
   width: 32px;
 }
diff --git a/chrome/browser/resources/chromeos/arc_support/main.html b/chrome/browser/resources/chromeos/arc_support/main.html
index 2b5dd8b..3ba26dc 100644
--- a/chrome/browser/resources/chromeos/arc_support/main.html
+++ b/chrome/browser/resources/chromeos/arc_support/main.html
@@ -20,7 +20,7 @@
       font-size: 12px;
       font-weight: 500;
       height: 32px; /* = 28px + 2 * 2px border */
-      padding: 0 16px 0 16px;
+      padding: 0 16px;
       text-transform: none;
     }
     paper-button.blue {
@@ -63,11 +63,11 @@
       <img class="icon-header" src="icon/playstore.svg" aria-hidden="true">
     </div>
     <div class="scrollable" id="terms-of-service-loading">
-      <p class="title" id="greetingTitle" i18n-content="greetingHeader"
-          aria-hidden="true"></p>
-      <p class="subtitle" i18n-content="progressLsoLoading" aria-live="polite">
-      </p>
       <div class="content">
+        <p class="title" id="greetingTitle" i18n-content="greetingHeader"
+            aria-hidden="true"></p>
+        <p class="subtitle" i18n-content="progressLsoLoading"
+            aria-live="polite"></p>
         <div class="progress-container">
           <div class="progress-primary"></div>
           <div class="progress-secondary"></div>
@@ -75,11 +75,11 @@
       </div>
     </div>
     <div class="scrollable" id="terms-of-service-content" hidden>
-      <p class="title" id="greetingTitle" i18n-content="greetingHeader"
-          aria-live="polite"></p>
-      <p class="subtitle" i18n-content="greetingDescription">
-      </p>
       <div class="content section-flex">
+        <p class="title" id="greetingTitle" i18n-content="greetingHeader"
+            aria-live="polite"></p>
+        <p class="subtitle" i18n-content="greetingDescription">
+        </p>
         <div class="section-terms" id="terms-container">
           <webview id="terms-view" partition="persist:arc_support"></webview>
         </div>
@@ -170,11 +170,11 @@
       <img class="icon-header" src="icon/playstore.svg" aria-hidden="true">
     </div>
     <div class="scrollable">
-      <p class="title" id="greetingTitle" i18n-content="greetingHeader"></p>
-      <p class="subtitle" i18n-content="progressAndroidLoading"
-          aria-live="polite">
-      </p>
       <div class="content">
+        <p class="title" id="greetingTitle" i18n-content="greetingHeader"></p>
+        <p class="subtitle" i18n-content="progressAndroidLoading"
+            aria-live="polite">
+        </p>
         <div class="progress-container">
           <div class="progress-primary"></div>
           <div class="progress-secondary"></div>
@@ -187,9 +187,9 @@
       <img class="icon-header" src="icon/playstore.svg" aria-hidden="true">
     </div>
     <div class="scrollable">
-      <p class="title" i18n-content="greetingHeader"></p>
-      <p class="subtitle" id="error-message" aria-live="polite"></p>
-      <div class="content">
+      <div class="content section-flex">
+        <p class="title" i18n-content="greetingHeader"></p>
+        <p class="subtitle" id="error-message" aria-live="polite"></p>
         <img class="error-image" src="images/error_image.png"
           aria-hidden="true">
       </div>
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
index 6d95d3f1..faee97b 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
+++ b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
@@ -282,6 +282,7 @@
       gaiaParams.gaiaPath = 'embedded/setup/chromeos';
       gaiaParams.isNewGaiaFlow = true;
       gaiaParams.needPassword = false;
+      gaiaParams.hl = data.hl;
       if (data.management_domain) {
         gaiaParams.enterpriseDomain = data.management_domain;
         gaiaParams.emailDomain = data.management_domain;
diff --git a/chrome/browser/resources/md_bookmarks/api_listener.js b/chrome/browser/resources/md_bookmarks/api_listener.js
index 534e8902..05c72d9 100644
--- a/chrome/browser/resources/md_bookmarks/api_listener.js
+++ b/chrome/browser/resources/md_bookmarks/api_listener.js
@@ -22,13 +22,17 @@
    * can be called in a tight loop by UI actions.
    */
   function batchUIUpdates() {
-    if (!debouncer || debouncer.done()) {
-      bookmarks.Store.getInstance().beginBatchUpdate();
+    if (!debouncer) {
       debouncer = new bookmarks.Debouncer(
           () => bookmarks.Store.getInstance().endBatchUpdate());
     }
 
-    debouncer.resetTimeout();
+    if (debouncer.done()) {
+      bookmarks.Store.getInstance().beginBatchUpdate();
+      debouncer.reset();
+    }
+
+    debouncer.restartTimeout();
   }
 
   /**
diff --git a/chrome/browser/resources/md_bookmarks/dnd_manager.js b/chrome/browser/resources/md_bookmarks/dnd_manager.js
index 98a4d5a..c746cd06 100644
--- a/chrome/browser/resources/md_bookmarks/dnd_manager.js
+++ b/chrome/browser/resources/md_bookmarks/dnd_manager.js
@@ -166,14 +166,16 @@
     /** @const {number} */
     this.EXPAND_FOLDER_DELAY = 400;
 
-    /** @private {number} */
-    this.lastTimestamp_ = 0;
-
-    /** @private {BookmarkElement|null} */
+    /** @private {?BookmarkElement} */
     this.lastElement_ = null;
 
-    /** @private {number} */
-    this.testTimestamp_ = 0;
+    /** @type {!bookmarks.Debouncer} */
+    this.debouncer_ = new bookmarks.Debouncer(() => {
+      var store = bookmarks.Store.getInstance();
+      store.dispatch(
+          bookmarks.actions.changeFolderOpen(this.lastElement_.itemId, true));
+      this.reset();
+    });
   }
 
   AutoExpander.prototype = {
@@ -182,31 +184,30 @@
      * @param {?BookmarkElement} overElement
      */
     update: function(e, overElement) {
-      var eventTimestamp = this.testTimestamp_ || e.timeStamp;
       var itemId = overElement ? overElement.itemId : null;
       var store = bookmarks.Store.getInstance();
 
-      // If hovering over the same folder as last update, open the folder after
-      // the delay has passed.
-      if (overElement && overElement == this.lastElement_) {
-        if (eventTimestamp - this.lastTimestamp_ < this.EXPAND_FOLDER_DELAY)
-          return;
-
-        var action = bookmarks.actions.changeFolderOpen(itemId, true);
-        store.dispatch(action);
-      } else if (
-          overElement && isClosedBookmarkFolderNode(overElement) &&
+      // If dragging over a new closed folder node with children reset the
+      // expander. Falls through to reset the expander delay.
+      if (overElement && overElement != this.lastElement_ &&
+          isClosedBookmarkFolderNode(overElement) &&
           bookmarks.util.hasChildFolders(itemId, store.data.nodes)) {
-        // Since this is a closed folder node that has children, set the auto
-        // expander to this element.
-        this.lastTimestamp_ = eventTimestamp;
+        this.reset();
         this.lastElement_ = overElement;
+      }
+
+      // If dragging over the same node, reset the expander delay.
+      if (overElement && overElement == this.lastElement_) {
+        this.debouncer_.restartTimeout(this.EXPAND_FOLDER_DELAY);
         return;
       }
 
-      // If the folder has been expanded or we have moved to a different
-      // element, reset the auto expander.
-      this.lastTimestamp_ = 0;
+      // Otherwise, cancel the expander.
+      this.reset();
+    },
+
+    reset: function() {
+      this.debouncer_.reset();
       this.lastElement_ = null;
     },
   };
@@ -494,10 +495,12 @@
 
         var movePromises = this.dragInfo_.dragData.elements.map((item) => {
           return new Promise((resolve) => {
-            chrome.bookmarks.move(item.id, {
-              parentId: dropInfo.parentId,
-              index: dropInfo.index == -1 ? undefined : dropInfo.index
-            }, resolve);
+            chrome.bookmarks.move(
+                item.id, {
+                  parentId: dropInfo.parentId,
+                  index: dropInfo.index == -1 ? undefined : dropInfo.index
+                },
+                resolve);
           });
         });
 
@@ -625,6 +628,7 @@
       this.dndChip.hide();
       this.internalDragElement_ = null;
       this.mouseDownPos_ = null;
+      this.autoExpander_.reset();
 
       // Defer the clearing of the data so that the bookmark manager API's drop
       // event doesn't clear the drop data before the web drop event has a
diff --git a/chrome/browser/resources/md_bookmarks/timer_proxy.js b/chrome/browser/resources/md_bookmarks/timer_proxy.js
index 091023fe..688b3e1 100644
--- a/chrome/browser/resources/md_bookmarks/timer_proxy.js
+++ b/chrome/browser/resources/md_bookmarks/timer_proxy.js
@@ -28,9 +28,9 @@
   };
 
   /**
-   * A one-shot debouncer which fires the given callback after a delay. The
-   * delay can be refreshed by calling resetTimer. Resetting with no delay moves
-   * the callback to the end of the task queue.
+   * A debouncer which fires the given callback after a delay. The delay can be
+   * refreshed by calling restartTimeout. Resetting the timeout with no delay
+   * moves the callback to the end of the task queue.
    * @param {!function()} callback
    * @constructor
    */
@@ -51,11 +51,14 @@
 
   Debouncer.prototype = {
     /**
+     * Starts the timer for the callback, cancelling the old timer if there is
+     * one.
      * @param {number=} delay
      */
-    resetTimeout: function(delay) {
-      if (this.timer_)
-        this.timerProxy_.clearTimeout(this.timer_);
+    restartTimeout: function(delay) {
+      assert(!this.isDone_);
+
+      this.cancelTimeout_();
       this.timer_ =
           this.timerProxy_.setTimeout(this.boundTimerCallback_, delay);
     },
@@ -74,6 +77,25 @@
       return this.promiseResolver_.promise;
     },
 
+    /**
+     * Resets the debouncer as if it had been newly instantiated.
+     */
+    reset: function() {
+      this.isDone_ = false;
+      this.promiseResolver_ = new PromiseResolver();
+      this.cancelTimeout_();
+    },
+
+    /**
+     * Cancel the timer callback, which can be restarted by calling
+     * restartTimeout().
+     * @private
+     */
+    cancelTimeout_: function() {
+      if (this.timer_)
+        this.timerProxy_.clearTimeout(this.timer_);
+    },
+
     /** @private */
     timerCallback_: function() {
       this.isDone_ = true;
diff --git a/chrome/browser/resources/settings/compiled_resources2.gyp b/chrome/browser/resources/settings/compiled_resources2.gyp
index 6a81e20..bec907b 100644
--- a/chrome/browser/resources/settings/compiled_resources2.gyp
+++ b/chrome/browser/resources/settings/compiled_resources2.gyp
@@ -48,6 +48,7 @@
       'dependencies': [
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data',
+        '<(EXTERNS_GYP):metrics_private',
         'page_visibility'
       ],
       'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'],
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index 0892d59c..d4dee7d 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -431,6 +431,8 @@
      * @param {boolean} isPopstate
      */
     setCurrentRoute(route, queryParameters, isPopstate) {
+      this.recordMetrics(route.path);
+
       var oldRoute = this.currentRoute;
       this.currentRoute = route;
       this.currentQueryParameters_ = queryParameters;
@@ -528,6 +530,8 @@
      * Initialize the route and query params from the URL.
      */
     initializeRouteFromUrl() {
+      this.recordMetrics(window.location.pathname);
+
       assert(!this.initializeRouteFromUrlCalled_);
       this.initializeRouteFromUrlCalled_ = true;
 
@@ -542,6 +546,18 @@
       }
     }
 
+    /**
+     * Make a UMA note about visiting this URL path.
+     * @param {string} urlPath The url path (only).
+     */
+    recordMetrics(urlPath) {
+      assert(!urlPath.startsWith('chrome://'));
+      assert(!urlPath.startsWith('settings'));
+      assert(urlPath.startsWith('/'));
+      chrome.metricsPrivate.recordSparseHashable(
+          'WebUI.Settings.PathVisited', urlPath);
+    }
+
     resetRouteForTesting() {
       this.initializeRouteFromUrlCalled_ = false;
       this.wasLastRouteChangePopstate_ = false;
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn
index d684e4b..b825b91 100644
--- a/chrome/browser/safe_browsing/BUILD.gn
+++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -66,6 +66,7 @@
       "settings_reset_prompt/settings_reset_prompt_prefs_manager.cc",
       "settings_reset_prompt/settings_reset_prompt_prefs_manager.h",
     ]
+    deps += [ "//components/keep_alive_registry" ]
   }
 
   if (safe_browsing_mode != 0) {
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_dialog_controller_impl_browsertest_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_dialog_controller_impl_browsertest_win.cc
index 9aab983b..14d5301 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_dialog_controller_impl_browsertest_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_dialog_controller_impl_browsertest_win.cc
@@ -9,13 +9,13 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_browsertest_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_browsertest_win.cc
index e2f9d7f..c2dd6833 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_browsertest_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_browsertest_win.cc
@@ -28,8 +28,6 @@
 #include "base/time/time.h"
 #include "base/version.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_client_info_win.h"
 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h"
@@ -40,6 +38,8 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/chrome_cleaner/public/constants/constants.h"
 #include "components/component_updater/pref_names.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "components/variations/variations_params_manager.h"
diff --git a/chrome/browser/sessions/better_session_restore_browsertest.cc b/chrome/browser/sessions/better_session_restore_browsertest.cc
index b44c1cd..a54217631 100644
--- a/chrome/browser/sessions/better_session_restore_browsertest.cc
+++ b/chrome/browser/sessions/better_session_restore_browsertest.cc
@@ -19,8 +19,6 @@
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/infobars/infobar_service.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_impl.h"
@@ -42,6 +40,8 @@
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/infobars/core/confirm_infobar_delegate.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/url_constants.h"
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc
index 768e980..5295f44 100644
--- a/chrome/browser/sessions/session_restore.cc
+++ b/chrome/browser/sessions/session_restore.cc
@@ -29,8 +29,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/search.h"
@@ -50,6 +48,8 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/extensions/extension_metrics.h"
 #include "chrome/common/url_constants.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/sessions/core/session_types.h"
 #include "content/public/browser/child_process_security_policy.h"
 #include "content/public/browser/dom_storage_context.h"
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
index 00f938d..e0ac637 100644
--- a/chrome/browser/sessions/session_restore_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -22,8 +22,6 @@
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/first_run/first_run.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -44,6 +42,8 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/sessions/content/content_live_tab.h"
 #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
 #include "components/sessions/core/session_types.h"
diff --git a/chrome/browser/sessions/session_restore_observer_browsertest.cc b/chrome/browser/sessions/session_restore_observer_browsertest.cc
index e9af8fc3..a38036c5 100644
--- a/chrome/browser/sessions/session_restore_observer_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_observer_browsertest.cc
@@ -10,8 +10,6 @@
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/resource_coordinator/tab_manager.h"
@@ -24,6 +22,8 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc
index 072af3b8..4610e274 100644
--- a/chrome/browser/sessions/tab_restore_browsertest.cc
+++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -13,8 +13,6 @@
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/sessions/session_restore_test_helper.h"
 #include "chrome/browser/sessions/tab_restore_service_factory.h"
@@ -30,6 +28,8 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/sessions/core/tab_restore_service.h"
 #include "components/sessions/core/tab_restore_service_observer.h"
 #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index b4124b3c..4c21bd5 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1120,6 +1120,7 @@
       "//chrome/browser/profile_resetter:profile_reset_report_proto",
       "//chrome/common:features",
       "//components/feedback/proto",
+      "//components/keep_alive_registry",
       "//components/network_session_configurator/common",
       "//components/proximity_auth/webui",
       "//components/ui_metrics",
diff --git a/chrome/browser/ui/app_list/profile_loader.cc b/chrome/browser/ui/app_list/profile_loader.cc
index 21d6bf408..32cf8316 100644
--- a/chrome/browser/ui/app_list/profile_loader.cc
+++ b/chrome/browser/ui/app_list/profile_loader.cc
@@ -6,10 +6,10 @@
 
 #include "base/bind.h"
 #include "base/files/file_path.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/ui/app_list/profile_store.h"
 #include "chrome/browser/ui/user_manager.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 
 ProfileLoader::ProfileLoader(ProfileStore* profile_store)
     : profile_store_(profile_store),
diff --git a/chrome/browser/ui/apps/chrome_app_delegate.cc b/chrome/browser/ui/apps/chrome_app_delegate.cc
index fd93814f..fda16394 100644
--- a/chrome/browser/ui/apps/chrome_app_delegate.cc
+++ b/chrome/browser/ui/apps/chrome_app_delegate.cc
@@ -15,8 +15,6 @@
 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
 #include "chrome/browser/favicon/favicon_utils.h"
 #include "chrome/browser/file_select_helper.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
@@ -29,6 +27,8 @@
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
 #include "chrome/browser/ui/web_contents_sizer.h"
 #include "chrome/common/extensions/chrome_extension_messages.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/zoom/zoom_controller.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index 7e1dacac..5546ffa 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -48,7 +48,6 @@
 #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/test_extension_system.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
@@ -88,6 +87,7 @@
 #include "components/arc/common/app.mojom.h"
 #include "components/arc/test/fake_app_instance.h"
 #include "components/exo/shell_surface.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_notifier_impl.h"
 #include "components/signin/core/account_id/account_id.h"
 #include "components/sync/model/attachments/attachment_service_proxy_for_test.h"
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 1f23049..dcc7851 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -61,9 +61,6 @@
 #include "chrome/browser/first_run/first_run.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #include "chrome/browser/pepper_broker_infobar_delegate.h"
@@ -163,6 +160,9 @@
 #include "components/bubble/bubble_controller.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/favicon/content/content_favicon_driver.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "components/search/search.h"
 #include "components/security_state/content/content_utils.h"
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
index c96dd6a4..17289a4 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -23,8 +23,6 @@
 #include "chrome/browser/extensions/launch_util.h"
 #include "chrome/browser/first_run/first_run.h"
 #include "chrome/browser/infobars/infobar_service.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_impl.h"
@@ -48,6 +46,8 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc
index 04dfb6d..2da167c 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc
@@ -13,8 +13,6 @@
 #include "base/threading/thread_restrictions.h"
 #include "base/win/windows_version.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profile_resetter/triggered_profile_resetter.h"
 #include "chrome/browser/profile_resetter/triggered_profile_resetter_factory.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -31,6 +29,8 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/prefs/pref_service.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/chrome/browser/ui/views/BUILD.gn b/chrome/browser/ui/views/BUILD.gn
index def9d4c..2164837 100644
--- a/chrome/browser/ui/views/BUILD.gn
+++ b/chrome/browser/ui/views/BUILD.gn
@@ -27,6 +27,7 @@
   deps = [
     "//base",
     "//chrome/app:command_ids",
+    "//components/keep_alive_registry",
     "//components/vector_icons",
     "//content/public/browser",
     "//printing/features",
diff --git a/chrome/browser/ui/views/chrome_views_delegate.cc b/chrome/browser/ui/views/chrome_views_delegate.cc
index 241e512..2fd19255 100644
--- a/chrome/browser/ui/views/chrome_views_delegate.cc
+++ b/chrome/browser/ui/views/chrome_views_delegate.cc
@@ -9,10 +9,10 @@
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_window_state.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/version_info/version_info.h"
diff --git a/chrome/browser/ui/views/chrome_views_delegate_win.cc b/chrome/browser/ui/views/chrome_views_delegate_win.cc
index ee75e512..ba43156 100644
--- a/chrome/browser/ui/views/chrome_views_delegate_win.cc
+++ b/chrome/browser/ui/views/chrome_views_delegate_win.cc
@@ -10,9 +10,9 @@
 #include "base/profiler/scoped_tracker.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/win/windows_version.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/ui/views/native_widget_factory.h"
 #include "chrome/browser/win/app_icon.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "ui/base/win/shell.h"
 
 namespace {
diff --git a/chrome/browser/ui/views/harmony/chrome_typography.cc b/chrome/browser/ui/views/harmony/chrome_typography.cc
index 82ad88c..0db1d7d 100644
--- a/chrome/browser/ui/views/harmony/chrome_typography.cc
+++ b/chrome/browser/ui/views/harmony/chrome_typography.cc
@@ -17,7 +17,6 @@
   if (context == CONTEXT_WINDOWS10_NATIVE) {
     // Adjusts default font size up to match Win10 modern UI.
     *size_delta = 15 - gfx::PlatformFont::kDefaultBaseFontSize;
-    *weight = views::TypographyProvider::MediumWeightForUI();
   }
 #endif
 }
diff --git a/chrome/browser/ui/views/profiles/user_manager_view.cc b/chrome/browser/ui/views/profiles/user_manager_view.cc
index 1b55dfb8..71c0d33 100644
--- a/chrome/browser/ui/views/profiles/user_manager_view.cc
+++ b/chrome/browser/ui/views/profiles/user_manager_view.cc
@@ -9,8 +9,6 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/profile_metrics.h"
@@ -26,6 +24,8 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/guest_view/browser/guest_view_manager.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "content/public/browser/navigation_details.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/views/uninstall_view.cc b/chrome/browser/ui/views/uninstall_view.cc
index ad6b948..2401f9e 100644
--- a/chrome/browser/ui/views/uninstall_view.cc
+++ b/chrome/browser/ui/views/uninstall_view.cc
@@ -7,14 +7,14 @@
 #include "base/message_loop/message_loop.h"
 #include "base/process/launch.h"
 #include "base/run_loop.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/shell_integration.h"
 #include "chrome/browser/ui/uninstall_browser_prompt.h"
 #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h"
 #include "chrome/common/chrome_result_codes.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/installer/util/shell_util.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/views/controls/button/checkbox.h"
 #include "ui/views/controls/combobox/combobox.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
index 6abc19d..4cd8b08e0 100644
--- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -678,6 +678,10 @@
   screen_data.SetBoolean("attestationBased", config_.is_mode_attestation());
   screen_data.SetString("management_domain", config_.management_domain);
 
+  const std::string app_locale = g_browser_process->GetApplicationLocale();
+  if (!app_locale.empty())
+    screen_data.SetString("hl", app_locale);
+
   policy::DeviceCloudPolicyManagerChromeOS* policy_manager =
       g_browser_process->platform_part()
           ->browser_policy_connector_chromeos()
diff --git a/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc b/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
index 848cd75..8cd40740 100644
--- a/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
+++ b/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
@@ -69,7 +69,8 @@
   AddLocalizedString(source, "menuEdit", IDS_EDIT);
   AddLocalizedString(source, "menuExport", IDS_MD_BOOKMARK_MANAGER_MENU_EXPORT);
   AddLocalizedString(source, "menuImport", IDS_MD_BOOKMARK_MANAGER_MENU_IMPORT);
-  AddLocalizedString(source, "menuOpenAllNewTab", IDS_BOOKMARK_BAR_OPEN_ALL);
+  AddLocalizedString(source, "menuOpenAllNewTab",
+                     IDS_MD_BOOKMARK_MANAGER_MENU_OPEN_ALL);
   AddLocalizedString(source, "menuOpenAllNewWindow",
                      IDS_MD_BOOKMARK_MANAGER_MENU_OPEN_ALL_NEW_WINDOW);
   AddLocalizedString(source, "menuOpenAllIncognito",
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index 1c3b9187..291f153 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -213,7 +213,7 @@
   void OnCertificatesImported(
       const std::string& previous_error,
       bool success,
-      const net::CertificateList& onc_trusted_certificates);
+      net::ScopedCERTCertificateList onc_trusted_certificates);
 #endif
 
  private:
@@ -955,7 +955,7 @@
 void NetInternalsMessageHandler::OnCertificatesImported(
     const std::string& previous_error,
     bool success,
-    const net::CertificateList& /* unused onc_trusted_certificates */) {
+    net::ScopedCERTCertificateList /* unused onc_trusted_certificates */) {
   std::string error = previous_error;
   if (!success)
     error += "Some certificates couldn't be imported. ";
diff --git a/chrome/browser/ui/webui/profile_helper.cc b/chrome/browser/ui/webui/profile_helper.cc
index 33cf95a..e7e6a1e 100644
--- a/chrome/browser/ui/webui/profile_helper.cc
+++ b/chrome/browser/ui/webui/profile_helper.cc
@@ -8,8 +8,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/profile_metrics.h"
 #include "chrome/browser/profiles/profile_window.h"
@@ -18,6 +16,8 @@
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/user_manager.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "extensions/browser/app_window/app_window.h"
diff --git a/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc b/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc
index ff194a9..4850564 100644
--- a/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc
@@ -13,12 +13,12 @@
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/test/ui_controls.h"
 #include "ui/display/display.h"
diff --git a/chrome/browser/ui/zoom/chrome_zoom_level_prefs.cc b/chrome/browser/ui/zoom/chrome_zoom_level_prefs.cc
index 4fe77ae..d14d496 100644
--- a/chrome/browser/ui/zoom/chrome_zoom_level_prefs.cc
+++ b/chrome/browser/ui/zoom/chrome_zoom_level_prefs.cc
@@ -9,11 +9,13 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/common/chrome_constants.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/json_pref_store.h"
 #include "components/prefs/pref_filter.h"
@@ -81,6 +83,20 @@
 }
 #endif
 
+const char kZoomLevelPath[] = "zoom_level";
+const char kLastModifiedPath[] = "last_modified";
+
+// Extract a timestamp from |dictionary[kLastModifiedPath]|.
+// Will return base::Time() if no timestamp exists.
+base::Time GetTimeStamp(const base::DictionaryValue* dictionary) {
+  std::string timestamp_str;
+  dictionary->GetStringWithoutPathExpansion(kLastModifiedPath, &timestamp_str);
+  int64_t timestamp = 0;
+  base::StringToInt64(timestamp_str, &timestamp);
+  base::Time last_modified = base::Time::FromInternalValue(timestamp);
+  return last_modified;
+}
+
 }  // namespace
 
 ChromeZoomLevelPrefs::ChromeZoomLevelPrefs(
@@ -171,7 +187,11 @@
   if (modification_is_removal) {
     host_zoom_dictionary_weak->RemoveWithoutPathExpansion(change.host, nullptr);
   } else {
-    host_zoom_dictionary_weak->SetKey(change.host, base::Value(level));
+    base::DictionaryValue dict;
+    dict.SetDouble(kZoomLevelPath, level);
+    dict.SetString(kLastModifiedPath,
+                   base::Int64ToString(change.last_modified.ToInternalValue()));
+    host_zoom_dictionary_weak->SetKey(change.host, std::move(dict));
   }
 }
 
@@ -267,8 +287,18 @@
        i.Advance()) {
     const std::string& host(i.key());
     double zoom_level = 0;
+    base::Time last_modified;
 
-    bool has_valid_zoom_level = i.value().GetAsDouble(&zoom_level);
+    bool has_valid_zoom_level;
+    if (i.value().is_dict()) {
+      const base::DictionaryValue* dict;
+      i.value().GetAsDictionary(&dict);
+      has_valid_zoom_level = dict->GetDouble(kZoomLevelPath, &zoom_level);
+      last_modified = GetTimeStamp(dict);
+    } else {
+      // Old zoom level that is stored directly as a double.
+      has_valid_zoom_level = i.value().GetAsDouble(&zoom_level);
+    }
 
     // Filter out A) the empty host, B) zoom levels equal to the default; and
     // remember them, so that we can later erase them from Prefs.
@@ -284,7 +314,7 @@
       continue;
     }
 
-    host_zoom_map_->SetZoomLevelForHost(host, zoom_level);
+    host_zoom_map_->InitializeZoomLevelForHost(host, zoom_level, last_modified);
   }
 
   // We don't bother sanitizing non-partition dictionaries as they will be
@@ -318,6 +348,9 @@
 
   // Initialize the default zoom level.
   host_zoom_map_->SetDefaultZoomLevel(GetDefaultZoomLevelPref());
+  // Record timestamps if zoomlevels can be deleted in ClearBrowsingData.
+  bool store_last_modified = base::FeatureList::IsEnabled(features::kTabsInCbd);
+  host_zoom_map->SetStoreLastModified(store_last_modified);
 
   // Initialize the HostZoomMap with per-host zoom levels from the persisted
   // zoom-level preference values.
diff --git a/chrome/common/OWNERS b/chrome/common/OWNERS
index e02099c..1505cef 100644
--- a/chrome/common/OWNERS
+++ b/chrome/common/OWNERS
@@ -17,6 +17,9 @@
 
 per-file *_messages*.h=set noparent
 per-file *_messages*.h=file://ipc/SECURITY_OWNERS
+

+per-file *_messages.cc=set noparent

+per-file *_messages.cc=file://ipc/SECURITY_OWNERS
 
 per-file *_param_traits*.*=set noparent
 per-file *_param_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/chrome/common/cast_messages.cc b/chrome/common/cast_messages.cc
index 5b388624..d1629f8 100644
--- a/chrome/common/cast_messages.cc
+++ b/chrome/common/cast_messages.cc
@@ -6,11 +6,6 @@
 
 namespace IPC {
 
-void ParamTraits<media::cast::RtpTimeTicks>::GetSize(base::PickleSizer* s,
-                                                     const param_type& p) {
-  ParamTraits<uint64_t>::GetSize(s, p.SerializeForIPC());
-}
-
 void ParamTraits<media::cast::RtpTimeTicks>::Write(base::Pickle* m,
                                                    const param_type& p) {
   ParamTraits<uint64_t>::Write(m, p.SerializeForIPC());
@@ -34,11 +29,6 @@
   l->append(oss.str());
 }
 
-void ParamTraits<media::cast::FrameId>::GetSize(base::PickleSizer* s,
-                                                const param_type& p) {
-  ParamTraits<uint64_t>::GetSize(s, p.SerializeForIPC());
-}
-
 void ParamTraits<media::cast::FrameId>::Write(base::Pickle* m,
                                               const param_type& p) {
   ParamTraits<uint64_t>::Write(m, p.SerializeForIPC());
diff --git a/chrome/common/cast_messages.h b/chrome/common/cast_messages.h
index d169908..5e9d904 100644
--- a/chrome/common/cast_messages.h
+++ b/chrome/common/cast_messages.h
@@ -21,7 +21,6 @@
 template<>
 struct ParamTraits<media::cast::RtpTimeTicks> {
   using param_type = media::cast::RtpTimeTicks;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -32,7 +31,6 @@
 template<>
 struct ParamTraits<media::cast::FrameId> {
   using param_type = media::cast::FrameId;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 818baed..76ad565 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -141,13 +141,6 @@
 const base::Feature kClickToOpenPDFPlaceholder{
     "ClickToOpenPDFPlaceholder", base::FEATURE_DISABLED_BY_DEFAULT};
 
-#if defined(OS_ANDROID)
-// Experiment to make Geolocation permissions in the omnibox and the default
-// search engine's search page consistent.
-const base::Feature kConsistentOmniboxGeolocation{
-    "ConsistentOmniboxGeolocation", base::FEATURE_ENABLED_BY_DEFAULT};
-#endif
-
 #if defined(OS_MACOSX)
 const base::Feature kContentFullscreen{"ContentFullscreen",
                                        base::FEATURE_DISABLED_BY_DEFAULT};
@@ -330,7 +323,7 @@
 // corresponding language+region code is present in the user preferences.
 // For example: "en-US, fr-FR" --> "en-US, en, fr-FR, fr".
 const base::Feature kUseNewAcceptLanguageHeader{
-    "UseNewAcceptLanguageHeader", base::FEATURE_DISABLED_BY_DEFAULT};
+    "UseNewAcceptLanguageHeader", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enables Permissions Blacklisting via Safe Browsing.
 const base::Feature kPermissionsBlacklist{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 30d7a3f..7835026b 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -73,10 +73,6 @@
 
 extern const base::Feature kClickToOpenPDFPlaceholder;
 
-#if defined(OS_ANDROID)
-extern const base::Feature kConsistentOmniboxGeolocation;
-#endif
-
 #if defined(OS_MACOSX)
 extern const base::Feature kContentFullscreen;
 #endif
diff --git a/chrome/common/common_message_generator.cc b/chrome/common/common_message_generator.cc
index 1eeb253e..eb1dda2 100644
--- a/chrome/common/common_message_generator.cc
+++ b/chrome/common/common_message_generator.cc
@@ -16,13 +16,6 @@
 #include "chrome/common/safe_browsing/ipc_protobuf_message_null_macros.h"
 #include "chrome/common/common_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-#include "chrome/common/safe_browsing/protobuf_message_size_macros.h"
-namespace IPC {
-#include "chrome/common/common_message_generator.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 #include "chrome/common/safe_browsing/protobuf_message_write_macros.h"
diff --git a/chrome/common/common_param_traits.cc b/chrome/common/common_param_traits.cc
index 5a73c52..466cfde6 100644
--- a/chrome/common/common_param_traits.cc
+++ b/chrome/common/common_param_traits.cc
@@ -5,13 +5,6 @@
 // Get basic type definitions.
 #include "chrome/common/common_param_traits.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef CHROME_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
-#include "chrome/common/common_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/chrome/common/importer/profile_import_process_param_traits.cc b/chrome/common/importer/profile_import_process_param_traits.cc
index cf68e7b1..afb3963f 100644
--- a/chrome/common/importer/profile_import_process_param_traits.cc
+++ b/chrome/common/importer/profile_import_process_param_traits.cc
@@ -16,13 +16,6 @@
 #undef CHROME_COMMON_IMPORTER_PROFILE_IMPORT_PROCESS_PARAM_TRAITS_MACROS_H_
 #include "chrome/common/importer/profile_import_process_param_traits_macros.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef CHROME_COMMON_IMPORTER_PROFILE_IMPORT_PROCESS_PARAM_TRAITS_MACROS_H_
-#include "chrome/common/importer/profile_import_process_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/chrome/common/safe_browsing/BUILD.gn b/chrome/common/safe_browsing/BUILD.gn
index 6c375d5..b8c180b 100644
--- a/chrome/common/safe_browsing/BUILD.gn
+++ b/chrome/common/safe_browsing/BUILD.gn
@@ -39,7 +39,6 @@
       "pe_image_reader_win.h",
       "protobuf_message_log_macros.h",
       "protobuf_message_read_macros.h",
-      "protobuf_message_size_macros.h",
       "protobuf_message_write_macros.h",
       "safe_archive_analyzer_param_traits.h",
       "zip_analyzer.cc",
diff --git a/chrome/common/safe_browsing/ipc_protobuf_message_macros.h b/chrome/common/safe_browsing/ipc_protobuf_message_macros.h
index b40fe6e0..db17241 100644
--- a/chrome/common/safe_browsing/ipc_protobuf_message_macros.h
+++ b/chrome/common/safe_browsing/ipc_protobuf_message_macros.h
@@ -36,7 +36,6 @@
   template <>                                                       \
   struct IPC_MESSAGE_EXPORT ParamTraits<message_name> {             \
     typedef message_name param_type;                                \
-    static void GetSize(base::PickleSizer* s, const param_type& p); \
     static void Write(base::Pickle* m, const param_type& p);        \
     static bool Read(const base::Pickle* m,                         \
                      base::PickleIterator* iter,                    \
diff --git a/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc b/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc
index 4aa1ea1..d2fda1f4 100644
--- a/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc
+++ b/chrome/common/safe_browsing/ipc_protobuf_message_unittest.cc
@@ -9,11 +9,6 @@
 #define IPC_MESSAGE_IMPL
 #include "chrome/common/safe_browsing/ipc_protobuf_message_test_messages.h"
 
-// Generate ipc protobuf traits size methods.
-#include "chrome/common/safe_browsing/protobuf_message_size_macros.h"
-namespace IPC {
-#include "chrome/common/safe_browsing/ipc_protobuf_message_test_messages.h"
-}  // namespace IPC
 // Generate ipc protobuf traits write methods.
 #include "chrome/common/safe_browsing/protobuf_message_write_macros.h"
 namespace IPC {
diff --git a/chrome/common/safe_browsing/protobuf_message_size_macros.h b/chrome/common/safe_browsing/protobuf_message_size_macros.h
deleted file mode 100644
index 98be728..0000000
--- a/chrome/common/safe_browsing/protobuf_message_size_macros.h
+++ /dev/null
@@ -1,31 +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.
-
-#ifndef CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_SIZE_MACROS_H_
-#define CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_SIZE_MACROS_H_
-
-// Null out all the macros that need nulling.
-#include "chrome/common/safe_browsing/ipc_protobuf_message_null_macros.h"
-
-// Set up so next include will generate size methods.
-#undef IPC_PROTOBUF_MESSAGE_TRAITS_BEGIN
-#undef IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER
-#undef IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_COMPLEX_MEMBER
-#undef IPC_PROTOBUF_MESSAGE_TRAITS_REPEATED_COMPLEX_MEMBER
-#undef IPC_PROTOBUF_MESSAGE_TRAITS_END
-
-#define IPC_PROTOBUF_MESSAGE_TRAITS_BEGIN(message_name) \
-  void ParamTraits<message_name>::GetSize(base::PickleSizer* s, \
-                                          const param_type& p) {
-#define IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_COMPLEX_MEMBER \
-  IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER
-#define IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER(name) \
-  s->AddBool();                                                       \
-  if (p.has_##name())                                                 \
-    GetParamSize(s, p.name());
-#define IPC_PROTOBUF_MESSAGE_TRAITS_REPEATED_COMPLEX_MEMBER(name) \
-  GetParamSize(s, p.name());
-#define IPC_PROTOBUF_MESSAGE_TRAITS_END() }
-
-#endif  // CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_SIZE_MACROS_H_
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn
index c45ccde..a41ff974e 100644
--- a/chrome/installer/linux/BUILD.gn
+++ b/chrome/installer/linux/BUILD.gn
@@ -74,6 +74,29 @@
   ]
 }
 
+action("strip_chrome_binary") {
+  prog_name = "$root_out_dir/chrome"
+  debug_file = prog_name + ".debug"
+  stripped_file = prog_name + ".stripped"
+  deps = [
+    "//chrome",
+  ]
+  script = "strip-chrome-binary.py"
+  sources = [
+    prog_name,
+  ]
+  outputs = [
+    debug_file,
+    stripped_file,
+  ]
+  args = [
+    rebase_path("//third_party/eu-strip/bin/eu-strip", root_build_dir),
+    rebase_path(prog_name, root_build_dir),
+    rebase_path(debug_file, root_build_dir),
+    rebase_path(stripped_file, root_build_dir),
+  ]
+}
+
 # This target builds all "normal" Linux installers.
 #
 # The bot setup is to build stable, unstable, and beta packages for the current
@@ -221,6 +244,7 @@
     ":common_packaging_files",
     ":deb_packaging_files",
     ":save_build_info",
+    ":strip_chrome_binary",
     ":theme_files",
     "//chrome",
     "//chrome:packed_resources",
diff --git a/chrome/installer/linux/common/installer.include b/chrome/installer/linux/common/installer.include
index 8dcd464..5c64c7d4 100644
--- a/chrome/installer/linux/common/installer.include
+++ b/chrome/installer/linux/common/installer.include
@@ -112,12 +112,8 @@
   # http://code.google.com/p/chromium/issues/detail?id=4451
   #
   # app
-  # We need to add the debug link so gdb knows to look for the symbols.
-  DEBUGFILE="${BUILDDIR}/${PROGNAME}.debug"
   STRIPPEDFILE="${BUILDDIR}/${PROGNAME}.stripped"
-  "${BUILDDIR}/installer/common/eu-strip" -o "${STRIPPEDFILE}" -f "${DEBUGFILE}" "${BUILDDIR}/${PROGNAME}"
   install -m 755 "${STRIPPEDFILE}" "${STAGEDIR}/${INSTALLDIR}/${PROGNAME}"
-  rm "${DEBUGFILE}" "${STRIPPEDFILE}"
 
   # resources
   install -m 644 "${BUILDDIR}/resources.pak" "${STAGEDIR}/${INSTALLDIR}/"
diff --git a/chrome/installer/linux/strip-chrome-binary.py b/chrome/installer/linux/strip-chrome-binary.py
new file mode 100755
index 0000000..5dba8ee9
--- /dev/null
+++ b/chrome/installer/linux/strip-chrome-binary.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+# 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.
+
+import subprocess
+import sys
+
+if len(sys.argv) != 5:
+  print ("Usage: strip-chrome-binary.py /path/to/eu-strip /path/to/chrome"
+         "/path/to/chrome.debug /path/to/chrome.stripped")
+  sys.exit(1)
+eu_strip = sys.argv[1]
+chrome = sys.argv[2]
+chrome_debug = sys.argv[3]
+chrome_stripped = sys.argv[4]
+sys.exit(subprocess.call([eu_strip, '-o', chrome_stripped, '-f', chrome_debug,
+                          chrome]))
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index e68c16c..1cfe472d 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -554,6 +554,7 @@
       "//chrome/browser",
       "//chrome/browser/devtools",
       "//chrome/renderer",
+      "//components/keep_alive_registry",
       "//components/resources",
       "//components/sync",
       "//components/sync:test_support_model",
@@ -1660,7 +1661,6 @@
       "//crypto:test_support",
       "//device/base:mocks",
       "//device/bluetooth:mocks",
-      "//device/serial:test_support",
       "//device/usb:test_support",
       "//google_apis:test_support",
       "//media:test_support",
@@ -2024,6 +2024,7 @@
       deps += [
         "//chrome/common/extensions/api",
         "//components/guest_view/browser:test_support",
+        "//components/keep_alive_registry",
 
         # TODO(rockot) bug 505926: The chrome_extensions_browsertests target
         # should be deleted and this line removed. See the
@@ -3838,7 +3839,6 @@
       "../browser/devtools/devtools_ui_bindings_unittest.cc",
       "../browser/devtools/serialize_host_descriptions_unittest.cc",
       "../browser/download/download_dir_policy_handler_unittest.cc",
-      "../browser/lifetime/keep_alive_registry_unittest.cc",
       "../browser/media/router/discovery/dial/device_description_fetcher_unittest.cc",
       "../browser/media/router/discovery/dial/device_description_service_unittest.cc",
       "../browser/media/router/discovery/dial/dial_device_data_unittest.cc",
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc
index f2852ba..5eef7c4 100644
--- a/chrome/test/base/testing_browser_process.cc
+++ b/chrome/test/base/testing_browser_process.cc
@@ -50,6 +50,10 @@
 #include "chrome/browser/printing/print_preview_dialog_controller.h"
 #endif
 
+#if !defined(OS_ANDROID)
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#endif
+
 // static
 TestingBrowserProcess* TestingBrowserProcess::GetGlobal() {
   return static_cast<TestingBrowserProcess*>(g_browser_process);
@@ -85,6 +89,10 @@
   extensions::AppWindowClient::Set(ChromeAppWindowClient::GetInstance());
   extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
 #endif
+
+#if !defined(OS_ANDROID)
+  KeepAliveRegistry::GetInstance()->SetIsShuttingDown(false);
+#endif
 }
 
 TestingBrowserProcess::~TestingBrowserProcess() {
diff --git a/chrome/test/data/extensions/platform_apps/web_view/focus_sync/focus_test.html b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/focus_test.html
new file mode 100644
index 0000000..727d01e6
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/focus_test.html
@@ -0,0 +1,51 @@
+<!--
+ * 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.
+-->
+
+<html>
+<style type="text/css">
+input {
+  background-color: rgb(200, 200, 200);
+}
+form :focus {
+  background-color: rgb(100, 100, 100);
+}
+</style>
+
+<script>
+
+function $(id) {
+  return document.getElementById(id);
+}
+
+/**
+  * checkValid returns true if the test should pass. It asserts that #text is
+  * the focused element and that #pass is not focused. It does so by matching
+  * the style properties to ensure they match with the :focus selector defined
+  * above.
+  */
+window.checkValid = function() {
+  var textColor = window.getComputedStyle($('text'),
+      null).getPropertyValue('background-color');
+  var passColor = window.getComputedStyle($('pass'),
+      null).getPropertyValue('background-color');
+  return textColor == 'rgb(100, 100, 100)' && passColor== 'rgb(200, 200, 200)';
+};
+
+window.addEventListener('DOMContentLoaded', function() {
+  $('text').focus();
+});
+
+
+</script>
+
+<body>
+  <form id="form">
+    <input id="text" type="text" placeholder="text input">
+    <input id="pass" type="password" placeholder="password">
+  </form>
+</body>
+</html>
+
diff --git a/chrome/test/data/extensions/platform_apps/web_view/focus_sync/main.html b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/main.html
new file mode 100644
index 0000000..79afbc8
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/main.html
@@ -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.
+-->
+
+<html>
+  <head>
+    <script src="main.js"></script>
+    <style>
+      .full-overlay {
+        width: 100%;
+        height: 200px;
+      }
+    </style>
+  </head>
+  <body>
+    <webview id="webview" tabIndex="0" class='full-overlay'></webview>
+  </body>
+</html>
diff --git a/chrome/test/data/extensions/platform_apps/web_view/focus_sync/main.js b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/main.js
new file mode 100644
index 0000000..8d4a83f
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/main.js
@@ -0,0 +1,21 @@
+// 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.
+
+function $(id) {
+  return document.getElementById(id);
+}
+
+window.reloadWebview = function() {
+    $('webview').reload();
+    $('webview').focus();
+};
+
+window.addEventListener('DOMContentLoaded', function() {
+  var webview = document.querySelector('#webview');
+  webview.addEventListener('loadstop', function() {
+      chrome.test.sendMessage('WebViewTest.LAUNCHED');
+  });
+  webview.focus();
+  webview.src = 'focus_test.html';
+});
diff --git a/chrome/test/data/extensions/platform_apps/web_view/focus_sync/manifest.json b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/manifest.json
new file mode 100644
index 0000000..836e6111
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/manifest.json
@@ -0,0 +1,18 @@
+{
+  "name": "Packaged App Test: <webview> Focus Sync",
+  "description": "Loads and focuses a guest which will focus one of its elements",
+  "version": "1",
+  "permissions": [
+    "webview"
+  ],
+  "app": {
+    "background": {
+      "scripts": ["test.js"]
+    }
+  },
+  "webview" : {
+    "partitions": [
+      {"name": "*", "accessible_resources": ["*"]}
+    ]
+  }
+}
diff --git a/chrome/test/data/extensions/platform_apps/web_view/focus_sync/test.js b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/test.js
new file mode 100644
index 0000000..40a8908
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/focus_sync/test.js
@@ -0,0 +1,7 @@
+// 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.
+
+chrome.app.runtime.onLaunched.addListener(function() {
+  chrome.app.window.create('main.html', {}, function () {});
+});
diff --git a/chrome/test/data/image_decoding/droids.loss-less.webp b/chrome/test/data/image_decoding/droids.loss-less.webp
new file mode 100644
index 0000000..34a2ff7e
--- /dev/null
+++ b/chrome/test/data/image_decoding/droids.loss-less.webp
Binary files differ
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index a4bc300..3627a09 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -3206,6 +3206,50 @@
     ]
   },
 
+  "DeviceNativePrinters": {
+    "os": ["chromeos"],
+    "test_policy": {
+      "DeviceNativePrinters": {
+        "url": "https://example.com/policyfile",
+        "hash": "deadbeefdeadbeefdeadbeef"
+      }
+    },
+    "pref_mappings": [{
+      "pref": "cros.device.printer_configurations",
+      "local_state": true
+    }]
+  },
+
+  "DeviceNativePrintersAccessMode": {
+    "os": ["chromeos"],
+    "test_policy": {
+      "DeviceNativePrintersAccessMode": 1
+    },
+    "pref_mappings": [
+      { "pref": "cros.device.printers_access_mode" }
+    ]
+  },
+
+  "DeviceNativePrintersBlacklist": {
+    "os": ["chromeos"],
+    "test_policy": {
+      "DeviceNativePrintersBlacklist": ["id4", "id7", "id10"]
+    },
+    "pref_mappings": [
+      { "pref": "cros.device.printers_blacklist" }
+    ]
+  },
+  "DeviceNativePrintersWhitelist": {
+    "os": ["chromeos"],
+    "test_policy": {
+      "DeviceNativePrintersWhitelist":  ["id4", "id7", "id10"]
+    },
+    "pref_mappings": [
+      { "pref": "cros.device.printers_whitelist" }
+    ]
+  },
+
+
   "----- Chrome Frame policies -------------------------------------------": {},
 
   "ChromeFrameRendererSettings": {
diff --git a/chrome/test/data/webui/md_bookmarks/dnd_manager_test.js b/chrome/test/data/webui/md_bookmarks/dnd_manager_test.js
index b111660..6ee1649 100644
--- a/chrome/test/data/webui/md_bookmarks/dnd_manager_test.js
+++ b/chrome/test/data/webui/md_bookmarks/dnd_manager_test.js
@@ -431,14 +431,18 @@
   });
 
   test('auto expander', function() {
+    var timerProxy = new bookmarks.TestTimerProxy();
+    timerProxy.immediatelyResolveTimeouts = false;
+
     var autoExpander = dndManager.autoExpander_;
+    autoExpander.debouncer_.timerProxy_ = timerProxy;
+
     store.data.folderOpenState.set('11', false);
     store.notifyObservers();
     Polymer.dom.flush();
 
     var dragElement = getFolderNode('14');
     var dragTarget = getFolderNode('15');
-    autoExpander.testTimestamp_ = 500;
 
     startInternalDrag(dragElement);
 
@@ -454,11 +458,9 @@
     // Dragging onto a closed folder with children updates the auto expander.
     dragTarget = getFolderNode('11');
     move(dragTarget);
-    assertEquals(500, autoExpander.lastTimestamp_);
     assertEquals(dragTarget, autoExpander.lastElement_);
 
     // Dragging onto another item resets the auto expander.
-    autoExpander.testTimestamp_ = 700;
     dragTarget = getFolderNode('1');
     move(dragTarget);
     assertEquals(null, autoExpander.lastElement_);
@@ -466,23 +468,25 @@
     // Dragging onto the list resets the auto expander.
     dragTarget = getFolderNode('11');
     move(dragTarget);
-    assertEquals(700, autoExpander.lastTimestamp_);
     assertEquals(dragTarget, autoExpander.lastElement_);
 
     dragTarget = list;
     move(dragTarget);
     assertEquals(null, autoExpander.lastElement_);
 
-    // Auto expands after expand delay.
+    // Moving the mouse resets the delay.
     dragTarget = getFolderNode('11');
     move(dragTarget);
-    assertEquals(700, autoExpander.lastTimestamp_);
+    assertEquals(dragTarget, autoExpander.lastElement_);
+    var oldTimer = autoExpander.debouncer_.timer_;
 
-    autoExpander.testTimestamp_ += autoExpander.EXPAND_FOLDER_DELAY;
     move(dragTarget);
+    assertNotEquals(oldTimer, autoExpander.debouncer_.timer_);
+
+    // Auto expands after expand delay.
+    timerProxy.runTimeoutFn(autoExpander.debouncer_.timer_);
     assertDeepEquals(
         bookmarks.actions.changeFolderOpen('11', true), store.lastAction);
-    assertEquals(0, autoExpander.lastTimestamp_);
     assertEquals(null, autoExpander.lastElement_);
   });
 
diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc
index a840b93..26299d7 100644
--- a/chromeos/audio/cras_audio_handler.cc
+++ b/chromeos/audio/cras_audio_handler.cc
@@ -141,6 +141,34 @@
 }
 
 void CrasAudioHandler::OnVideoCaptureStarted(media::VideoFacingMode facing) {
+  DCHECK(main_task_runner_);
+  if (!main_task_runner_->BelongsToCurrentThread()) {
+    main_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&CrasAudioHandler::OnVideoCaptureStartedOnMainThread,
+                       weak_ptr_factory_.GetWeakPtr(), facing));
+    return;
+  }
+  // Unittest may call this from the main thread.
+  OnVideoCaptureStartedOnMainThread(facing);
+}
+
+void CrasAudioHandler::OnVideoCaptureStopped(media::VideoFacingMode facing) {
+  DCHECK(main_task_runner_);
+  if (!main_task_runner_->BelongsToCurrentThread()) {
+    main_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&CrasAudioHandler::OnVideoCaptureStoppedOnMainThread,
+                       weak_ptr_factory_.GetWeakPtr(), facing));
+    return;
+  }
+  // Unittest may call this from the main thread.
+  OnVideoCaptureStoppedOnMainThread(facing);
+}
+
+void CrasAudioHandler::OnVideoCaptureStartedOnMainThread(
+    media::VideoFacingMode facing) {
+  DCHECK(main_task_runner_->BelongsToCurrentThread());
   // Do nothing if the device doesn't have both front and rear microphones.
   if (!HasDualInternalMic())
     return;
@@ -178,7 +206,9 @@
   ActivateMicForCamera(facing);
 }
 
-void CrasAudioHandler::OnVideoCaptureStopped(media::VideoFacingMode facing) {
+void CrasAudioHandler::OnVideoCaptureStoppedOnMainThread(
+    media::VideoFacingMode facing) {
+  DCHECK(main_task_runner_->BelongsToCurrentThread());
   // Do nothing if the device doesn't have both front and rear microphones.
   if (!HasDualInternalMic())
     return;
@@ -321,7 +351,6 @@
 }
 
 void CrasAudioHandler::GetDefaultOutputBufferSize(int32_t* buffer_size) const {
-  base::AutoLock auto_lock(default_output_buffer_size_lock_);
   *buffer_size = default_output_buffer_size_;
 }
 
@@ -669,6 +698,9 @@
   if (DBusThreadManager::Get()->GetSessionManagerClient())
     DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this);
   InitializeAudioState();
+  // Unittest may not have the task runner for the current thread.
+  if (base::ThreadTaskRunnerHandle::IsSet())
+    main_task_runner_ = base::ThreadTaskRunnerHandle::Get();
 }
 
 CrasAudioHandler::~CrasAudioHandler() {
@@ -1598,7 +1630,6 @@
     return;
   }
 
-  base::AutoLock auto_lock(default_output_buffer_size_lock_);
   default_output_buffer_size_ = buffer_size;
 }
 
diff --git a/chromeos/audio/cras_audio_handler.h b/chromeos/audio/cras_audio_handler.h
index 13e078e0..87c4cdc 100644
--- a/chromeos/audio/cras_audio_handler.h
+++ b/chromeos/audio/cras_audio_handler.h
@@ -27,6 +27,8 @@
 
 class AudioDevicesPrefHandler;
 
+// This class is not thread safe. The public functions should be called on
+// browser main thread.
 class CHROMEOS_EXPORT CrasAudioHandler : public CrasAudioClient::Observer,
                                          public AudioPrefObserver,
                                          public SessionManagerClient::Observer,
@@ -158,8 +160,6 @@
   uint64_t GetPrimaryActiveInputNode() const;
 
   // Gets the audio devices back in |device_list|.
-  // This call can be invoked from I/O thread or UI thread because
-  // it does not need to access CrasAudioClient on DBus.
   void GetAudioDevices(AudioDeviceList* device_list) const;
 
   bool GetPrimaryActiveOutputDevice(AudioDevice* device) const;
@@ -480,6 +480,9 @@
   // Handle dbus callback for GetDefaultOutputBufferSize.
   void HandleGetDefaultOutputBufferSize(int buffer_size, bool success);
 
+  void OnVideoCaptureStartedOnMainThread(media::VideoFacingMode facing);
+  void OnVideoCaptureStoppedOnMainThread(media::VideoFacingMode facing);
+
   scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler_;
   base::ObserverList<AudioObserver> observers_;
 
@@ -527,11 +530,13 @@
   bool front_camera_on_ = false;
   bool rear_camera_on_ = false;
 
-  mutable base::Lock default_output_buffer_size_lock_;
-
   // Default output buffer size in frames.
   int32_t default_output_buffer_size_;
 
+  // Task runner of browser main thread. All member variables should be accessed
+  // on this thread.
+  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
+
   base::WeakPtrFactory<CrasAudioHandler> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(CrasAudioHandler);
diff --git a/chromeos/components/tether/BUILD.gn b/chromeos/components/tether/BUILD.gn
index c463b6d9..0678031 100644
--- a/chromeos/components/tether/BUILD.gn
+++ b/chromeos/components/tether/BUILD.gn
@@ -32,6 +32,8 @@
     "disconnect_tethering_operation.h",
     "disconnect_tethering_request_sender.cc",
     "disconnect_tethering_request_sender.h",
+    "disconnect_tethering_request_sender_impl.cc",
+    "disconnect_tethering_request_sender_impl.h",
     "host_connection_metrics_logger.cc",
     "host_connection_metrics_logger.h",
     "host_scan_cache.cc",
@@ -179,6 +181,7 @@
     "crash_recovery_manager_unittest.cc",
     "device_status_util_unittest.cc",
     "disconnect_tethering_operation_unittest.cc",
+    "disconnect_tethering_request_sender_impl_unittest.cc",
     "host_connection_metrics_logger_unittest.cc",
     "host_scan_cache_unittest.cc",
     "host_scan_device_prioritizer_impl_unittest.cc",
diff --git a/chromeos/components/tether/disconnect_tethering_request_sender_impl.cc b/chromeos/components/tether/disconnect_tethering_request_sender_impl.cc
new file mode 100644
index 0000000..2c087b1
--- /dev/null
+++ b/chromeos/components/tether/disconnect_tethering_request_sender_impl.cc
@@ -0,0 +1,108 @@
+// 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 "chromeos/components/tether/disconnect_tethering_request_sender_impl.h"
+
+#include "chromeos/components/tether/ble_connection_manager.h"
+#include "chromeos/components/tether/tether_host_fetcher.h"
+#include "components/proximity_auth/logging/logging.h"
+
+namespace chromeos {
+
+namespace tether {
+
+DisconnectTetheringRequestSenderImpl::DisconnectTetheringRequestSenderImpl(
+    BleConnectionManager* ble_connection_manager,
+    TetherHostFetcher* tether_host_fetcher)
+    : ble_connection_manager_(ble_connection_manager),
+      tether_host_fetcher_(tether_host_fetcher),
+      weak_ptr_factory_(this) {}
+
+DisconnectTetheringRequestSenderImpl::~DisconnectTetheringRequestSenderImpl() {
+  for (auto const& entry : device_id_to_operation_map_)
+    entry.second->RemoveObserver(this);
+}
+
+void DisconnectTetheringRequestSenderImpl::SendDisconnectRequestToDevice(
+    const std::string& device_id) {
+  if (base::ContainsKey(device_id_to_operation_map_, device_id))
+    return;
+
+  num_pending_host_fetches_++;
+  tether_host_fetcher_->FetchTetherHost(
+      device_id,
+      base::Bind(&DisconnectTetheringRequestSenderImpl::OnTetherHostFetched,
+                 weak_ptr_factory_.GetWeakPtr(), device_id));
+}
+
+bool DisconnectTetheringRequestSenderImpl::HasPendingRequests() {
+  return !device_id_to_operation_map_.empty() || num_pending_host_fetches_ > 0;
+}
+
+void DisconnectTetheringRequestSenderImpl::OnTetherHostFetched(
+    const std::string& device_id,
+    std::unique_ptr<cryptauth::RemoteDevice> tether_host) {
+  num_pending_host_fetches_--;
+  DCHECK(num_pending_host_fetches_ >= 0);
+
+  if (!tether_host) {
+    PA_LOG(ERROR) << "Could not fetch device with ID "
+                  << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
+                  << ". Unable to send DisconnectTetheringRequest.";
+    return;
+  }
+
+  PA_LOG(INFO) << "Attempting to send DisconnectTetheringRequest to device "
+               << "with ID "
+               << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id);
+
+  std::unique_ptr<DisconnectTetheringOperation> disconnect_tethering_operation =
+      DisconnectTetheringOperation::Factory::NewInstance(
+          *tether_host, ble_connection_manager_);
+
+  // Add to the map.
+  device_id_to_operation_map_.emplace(
+      device_id, std::move(disconnect_tethering_operation));
+
+  // Start the operation; OnOperationFinished() will be called when finished.
+  device_id_to_operation_map_.at(device_id)->AddObserver(this);
+  device_id_to_operation_map_.at(device_id)->Initialize();
+}
+
+void DisconnectTetheringRequestSenderImpl::OnOperationFinished(
+    const std::string& device_id,
+    bool success) {
+  if (success) {
+    PA_LOG(INFO) << "Successfully sent DisconnectTetheringRequest to device "
+                 << "with ID "
+                 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id);
+  } else {
+    PA_LOG(ERROR) << "Failed to send DisconnectTetheringRequest to device "
+                  << "with ID "
+                  << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(
+                         device_id);
+  }
+
+  bool had_pending_requests = HasPendingRequests();
+
+  if (base::ContainsKey(device_id_to_operation_map_, device_id)) {
+    // Regardless of success/failure, unregister as a listener and delete the
+    // operation.
+    device_id_to_operation_map_.at(device_id)->RemoveObserver(this);
+    device_id_to_operation_map_.erase(device_id);
+  } else {
+    PA_LOG(ERROR)
+        << "Operation finished, but device with ID "
+        << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
+        << " was not being tracked by DisconnectTetheringRequestSender.";
+  }
+
+  // If there were pending reqests but now there are none, notify the Observers.
+  if (had_pending_requests && !HasPendingRequests())
+    NotifyPendingDisconnectRequestsComplete();
+}
+
+}  // namespace tether
+
+}  // namespace chromeos
diff --git a/chromeos/components/tether/disconnect_tethering_request_sender_impl.h b/chromeos/components/tether/disconnect_tethering_request_sender_impl.h
new file mode 100644
index 0000000..e2215c6
--- /dev/null
+++ b/chromeos/components/tether/disconnect_tethering_request_sender_impl.h
@@ -0,0 +1,57 @@
+// 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 CHROMEOS_COMPONENTS_TETHER_DISCONNECT_TETHERING_REQUEST_SENDER_IMPL_H_
+#define CHROMEOS_COMPONENTS_TETHER_DISCONNECT_TETHERING_REQUEST_SENDER_IMPL_H_
+
+#include <map>
+
+#include "chromeos/components/tether/disconnect_tethering_operation.h"
+#include "chromeos/components/tether/disconnect_tethering_request_sender.h"
+
+namespace chromeos {
+
+namespace tether {
+
+class BleConnectionManager;
+class TetherHostFetcher;
+
+class DisconnectTetheringRequestSenderImpl
+    : public DisconnectTetheringRequestSender,
+      public DisconnectTetheringOperation::Observer {
+ public:
+  DisconnectTetheringRequestSenderImpl(
+      BleConnectionManager* ble_connection_manager,
+      TetherHostFetcher* tether_host_fetcher);
+  ~DisconnectTetheringRequestSenderImpl() override;
+
+  // DisconnectTetheringRequestSender:
+  void SendDisconnectRequestToDevice(const std::string& device_id) override;
+  bool HasPendingRequests() override;
+
+  // DisconnectTetheringOperation::Observer:
+  void OnOperationFinished(const std::string& device_id, bool success) override;
+
+ private:
+  void OnTetherHostFetched(
+      const std::string& device_id,
+      std::unique_ptr<cryptauth::RemoteDevice> tether_host);
+
+  BleConnectionManager* ble_connection_manager_;
+  TetherHostFetcher* tether_host_fetcher_;
+
+  int num_pending_host_fetches_ = 0;
+  std::map<std::string, std::unique_ptr<DisconnectTetheringOperation>>
+      device_id_to_operation_map_;
+
+  base::WeakPtrFactory<DisconnectTetheringRequestSenderImpl> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(DisconnectTetheringRequestSenderImpl);
+};
+
+}  // namespace tether
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_COMPONENTS_TETHER_DISCONNECT_TETHERING_REQUEST_SENDER_IMPL_H_
diff --git a/chromeos/components/tether/disconnect_tethering_request_sender_impl_unittest.cc b/chromeos/components/tether/disconnect_tethering_request_sender_impl_unittest.cc
new file mode 100644
index 0000000..d20070e
--- /dev/null
+++ b/chromeos/components/tether/disconnect_tethering_request_sender_impl_unittest.cc
@@ -0,0 +1,322 @@
+// 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 "chromeos/components/tether/disconnect_tethering_request_sender_impl.h"
+
+#include "chromeos/components/tether/disconnect_tethering_operation.h"
+#include "chromeos/components/tether/disconnect_tethering_request_sender.h"
+#include "chromeos/components/tether/fake_ble_connection_manager.h"
+#include "chromeos/components/tether/fake_tether_host_fetcher.h"
+#include "components/cryptauth/remote_device.h"
+#include "components/cryptauth/remote_device_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+
+namespace tether {
+
+namespace {
+
+class FakeDisconnectTetheringOperation : public DisconnectTetheringOperation {
+ public:
+  FakeDisconnectTetheringOperation(
+      const cryptauth::RemoteDevice& device_to_connect,
+      BleConnectionManager* connection_manager)
+      : DisconnectTetheringOperation(device_to_connect, connection_manager) {}
+
+  ~FakeDisconnectTetheringOperation() override {}
+
+  void NotifyFinished(bool success) {
+    NotifyObserversOperationFinished(success);
+  }
+
+  const cryptauth::RemoteDevice& GetRemoteDevice() {
+    EXPECT_EQ(1u, remote_devices().size());
+    return remote_devices()[0];
+  }
+};
+
+class FakeDisconnectTetheringOperationFactory
+    : public DisconnectTetheringOperation::Factory {
+ public:
+  FakeDisconnectTetheringOperationFactory() {}
+  virtual ~FakeDisconnectTetheringOperationFactory() {}
+
+  std::vector<FakeDisconnectTetheringOperation*>& created_operations() {
+    return created_operations_;
+  }
+
+ protected:
+  // DisconnectTetheringOperation::Factory:
+  std::unique_ptr<DisconnectTetheringOperation> BuildInstance(
+      const cryptauth::RemoteDevice& device_to_connect,
+      BleConnectionManager* connection_manager) override {
+    FakeDisconnectTetheringOperation* operation =
+        new FakeDisconnectTetheringOperation(device_to_connect,
+                                             connection_manager);
+    created_operations_.push_back(operation);
+    return base::WrapUnique(operation);
+  }
+
+ private:
+  std::vector<FakeDisconnectTetheringOperation*> created_operations_;
+};
+
+class FakeDisconnectTetheringRequestSenderObserver
+    : public DisconnectTetheringRequestSender::Observer {
+ public:
+  FakeDisconnectTetheringRequestSenderObserver()
+      : num_no_more_pending_requests_events_(0) {}
+
+  ~FakeDisconnectTetheringRequestSenderObserver() override {}
+
+  void OnPendingDisconnectRequestsComplete() override {
+    num_no_more_pending_requests_events_++;
+  }
+
+  uint32_t num_no_more_pending_requests_events() {
+    return num_no_more_pending_requests_events_;
+  }
+
+ private:
+  uint32_t num_no_more_pending_requests_events_;
+};
+
+}  // namespace
+
+class DisconnectTetheringRequestSenderTest : public testing::Test {
+ public:
+  DisconnectTetheringRequestSenderTest()
+      : test_devices_(cryptauth::GenerateTestRemoteDevices(2u)) {}
+  ~DisconnectTetheringRequestSenderTest() override {}
+
+  void SetUp() override {
+    fake_ble_connection_manager_ = base::MakeUnique<FakeBleConnectionManager>();
+    fake_tether_host_fetcher_ = base::MakeUnique<FakeTetherHostFetcher>(
+        test_devices_, true /* synchronously_reply_with_results */);
+
+    fake_operation_factory_ =
+        base::MakeUnique<FakeDisconnectTetheringOperationFactory>();
+    DisconnectTetheringOperation::Factory::SetInstanceForTesting(
+        fake_operation_factory_.get());
+
+    disconnect_tethering_request_sender_ =
+        base::MakeUnique<DisconnectTetheringRequestSenderImpl>(
+            fake_ble_connection_manager_.get(),
+            fake_tether_host_fetcher_.get());
+
+    fake_disconnect_tethering_request_sender_observer_ =
+        base::MakeUnique<FakeDisconnectTetheringRequestSenderObserver>();
+    disconnect_tethering_request_sender_->AddObserver(
+        fake_disconnect_tethering_request_sender_observer_.get());
+  }
+
+  void TearDown() override {
+    disconnect_tethering_request_sender_->RemoveObserver(
+        fake_disconnect_tethering_request_sender_observer_.get());
+  }
+
+  void SendConcurrentRequestsToTwoDevices(bool first_operation_successful,
+                                          bool second_operation_successful) {
+    // Send requests to two devices concurrently.
+    disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+        test_devices_[0].GetDeviceId());
+    disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+        test_devices_[1].GetDeviceId());
+    EXPECT_TRUE(disconnect_tethering_request_sender_->HasPendingRequests());
+    EXPECT_EQ(0u, fake_disconnect_tethering_request_sender_observer_
+                      ->num_no_more_pending_requests_events());
+
+    ASSERT_EQ(2u, fake_operation_factory_->created_operations().size());
+    EXPECT_EQ(
+        test_devices_[0],
+        fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
+    EXPECT_EQ(
+        test_devices_[1],
+        fake_operation_factory_->created_operations()[1]->GetRemoteDevice());
+    fake_operation_factory_->created_operations()[0]->NotifyFinished(
+        first_operation_successful);
+    EXPECT_TRUE(disconnect_tethering_request_sender_->HasPendingRequests());
+    EXPECT_EQ(0u, fake_disconnect_tethering_request_sender_observer_
+                      ->num_no_more_pending_requests_events());
+
+    fake_operation_factory_->created_operations()[1]->NotifyFinished(
+        second_operation_successful);
+    EXPECT_FALSE(disconnect_tethering_request_sender_->HasPendingRequests());
+    EXPECT_EQ(1u, fake_disconnect_tethering_request_sender_observer_
+                      ->num_no_more_pending_requests_events());
+  }
+
+  void CallSendRequestTwiceWithOneDevice(bool operation_successful) {
+    disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+        test_devices_[0].GetDeviceId());
+    disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+        test_devices_[0].GetDeviceId());
+    EXPECT_TRUE(disconnect_tethering_request_sender_->HasPendingRequests());
+    EXPECT_EQ(0u, fake_disconnect_tethering_request_sender_observer_
+                      ->num_no_more_pending_requests_events());
+
+    // When multiple concurrent attempts are made to send a request to the same
+    // device, only one DisconnectTetheringOperation is created.
+    ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
+    EXPECT_EQ(
+        test_devices_[0],
+        fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
+    fake_operation_factory_->created_operations()[0]->NotifyFinished(
+        operation_successful);
+    EXPECT_FALSE(disconnect_tethering_request_sender_->HasPendingRequests());
+    EXPECT_EQ(1u, fake_disconnect_tethering_request_sender_observer_
+                      ->num_no_more_pending_requests_events());
+  }
+
+  const std::vector<cryptauth::RemoteDevice> test_devices_;
+
+  std::unique_ptr<FakeBleConnectionManager> fake_ble_connection_manager_;
+  std::unique_ptr<FakeTetherHostFetcher> fake_tether_host_fetcher_;
+
+  std::unique_ptr<FakeDisconnectTetheringOperationFactory>
+      fake_operation_factory_;
+
+  std::unique_ptr<DisconnectTetheringRequestSenderImpl>
+      disconnect_tethering_request_sender_;
+  std::unique_ptr<FakeDisconnectTetheringRequestSenderObserver>
+      fake_disconnect_tethering_request_sender_observer_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DisconnectTetheringRequestSenderTest);
+};
+
+TEST_F(DisconnectTetheringRequestSenderTest, SendRequest_Success) {
+  disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+      test_devices_[0].GetDeviceId());
+  EXPECT_TRUE(disconnect_tethering_request_sender_->HasPendingRequests());
+
+  ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
+  EXPECT_EQ(
+      test_devices_[0],
+      fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
+  fake_operation_factory_->created_operations()[0]->NotifyFinished(
+      true /* success */);
+  EXPECT_FALSE(disconnect_tethering_request_sender_->HasPendingRequests());
+  EXPECT_EQ(1u, fake_disconnect_tethering_request_sender_observer_
+                    ->num_no_more_pending_requests_events());
+}
+
+TEST_F(DisconnectTetheringRequestSenderTest, SendRequest_CannotFetchHost) {
+  // Remove hosts from |fake_tether_host_fetcher_|; this will cause the fetcher
+  // to return a null RemoteDevice.
+  fake_tether_host_fetcher_->SetTetherHosts(
+      std::vector<cryptauth::RemoteDevice>());
+
+  disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+      test_devices_[0].GetDeviceId());
+
+  EXPECT_TRUE(fake_operation_factory_->created_operations().empty());
+  EXPECT_EQ(0u, fake_disconnect_tethering_request_sender_observer_
+                    ->num_no_more_pending_requests_events());
+}
+
+TEST_F(
+    DisconnectTetheringRequestSenderTest,
+    MultipleRequestAttempts_Concurrent_DifferentDeviceId_BothOperationsSuccessful) {
+  SendConcurrentRequestsToTwoDevices(true /* first_operation_successful */,
+                                     true /* second_operation_successful */);
+}
+
+TEST_F(
+    DisconnectTetheringRequestSenderTest,
+    MultipleRequestAttempts_Concurrent_DifferentDeviceId_BothOperationsFailed) {
+  SendConcurrentRequestsToTwoDevices(false /* first_operation_successful */,
+                                     false /* second_operation_successful */);
+}
+
+TEST_F(
+    DisconnectTetheringRequestSenderTest,
+    MultipleRequestAttempts_Concurrent_DifferentDeviceId_FirstOperationSuccessful) {
+  SendConcurrentRequestsToTwoDevices(true /* first_operation_successful */,
+                                     false /* second_operation_successful */);
+}
+
+TEST_F(
+    DisconnectTetheringRequestSenderTest,
+    MultipleRequestAttempts_Concurrent_DifferentDeviceId_SecondOperationSuccessful) {
+  SendConcurrentRequestsToTwoDevices(false /* first_operation_successful */,
+                                     true /* second_operation_successful */);
+}
+
+TEST_F(DisconnectTetheringRequestSenderTest,
+       MultipleRequestAttempts_Concurrent_SameDeviceId_OperationSuccessful) {
+  CallSendRequestTwiceWithOneDevice(true /* operation_successful */);
+}
+
+TEST_F(DisconnectTetheringRequestSenderTest,
+       MultipleRequestAttempts_Concurrent_SameDeviceId_OperationFailed) {
+  CallSendRequestTwiceWithOneDevice(false /* operation_successful */);
+}
+
+TEST_F(DisconnectTetheringRequestSenderTest,
+       SendMultipleRequests_NotifyFinished) {
+  // When multiple requests are sent, a new DisconnectTetheringOperation will be
+  // created if the previous one has finished. This is true regardless of the
+  // success of the previous operation.
+  disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+      test_devices_[0].GetDeviceId());
+  EXPECT_TRUE(disconnect_tethering_request_sender_->HasPendingRequests());
+  EXPECT_EQ(0u, fake_disconnect_tethering_request_sender_observer_
+                    ->num_no_more_pending_requests_events());
+  ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
+  EXPECT_EQ(
+      test_devices_[0],
+      fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
+  fake_operation_factory_->created_operations()[0]->NotifyFinished(
+      true /* success */);
+  EXPECT_FALSE(disconnect_tethering_request_sender_->HasPendingRequests());
+  EXPECT_EQ(1u, fake_disconnect_tethering_request_sender_observer_
+                    ->num_no_more_pending_requests_events());
+
+  disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+      test_devices_[0].GetDeviceId());
+  ASSERT_EQ(2u, fake_operation_factory_->created_operations().size());
+  EXPECT_EQ(
+      test_devices_[0],
+      fake_operation_factory_->created_operations()[1]->GetRemoteDevice());
+  fake_operation_factory_->created_operations()[1]->NotifyFinished(
+      false /* success */);
+  EXPECT_FALSE(disconnect_tethering_request_sender_->HasPendingRequests());
+  EXPECT_EQ(2u, fake_disconnect_tethering_request_sender_observer_
+                    ->num_no_more_pending_requests_events());
+
+  disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+      test_devices_[0].GetDeviceId());
+  ASSERT_EQ(3u, fake_operation_factory_->created_operations().size());
+  EXPECT_EQ(
+      test_devices_[0],
+      fake_operation_factory_->created_operations()[2]->GetRemoteDevice());
+  fake_operation_factory_->created_operations()[2]->NotifyFinished(
+      true /* success */);
+  EXPECT_FALSE(disconnect_tethering_request_sender_->HasPendingRequests());
+  EXPECT_EQ(3u, fake_disconnect_tethering_request_sender_observer_
+                    ->num_no_more_pending_requests_events());
+}
+
+TEST_F(DisconnectTetheringRequestSenderTest,
+       HasPendingRequests_FetchTetherHost) {
+  fake_tether_host_fetcher_->set_synchronously_reply_with_results(false);
+  disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+      test_devices_[0].GetDeviceId());
+  EXPECT_TRUE(fake_operation_factory_->created_operations().empty());
+  EXPECT_TRUE(disconnect_tethering_request_sender_->HasPendingRequests());
+
+  fake_tether_host_fetcher_->InvokePendingCallbacks();
+  EXPECT_TRUE(disconnect_tethering_request_sender_->HasPendingRequests());
+
+  ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
+  fake_operation_factory_->created_operations()[0]->NotifyFinished(
+      true /* success */);
+  EXPECT_FALSE(disconnect_tethering_request_sender_->HasPendingRequests());
+}
+
+}  // namespace tether
+
+}  // namespace chromeos
diff --git a/chromeos/components/tether/fake_disconnect_tethering_request_sender.cc b/chromeos/components/tether/fake_disconnect_tethering_request_sender.cc
index b4234e4..1857e4e 100644
--- a/chromeos/components/tether/fake_disconnect_tethering_request_sender.cc
+++ b/chromeos/components/tether/fake_disconnect_tethering_request_sender.cc
@@ -14,12 +14,11 @@
 
 void FakeDisconnectTetheringRequestSender::SendDisconnectRequestToDevice(
     const std::string& device_id) {
-  // TODO(lesliewatkins): Flesh out.
+  device_ids_sent_requests_.push_back(device_id);
 }
 
 bool FakeDisconnectTetheringRequestSender::HasPendingRequests() {
-  // TODO(lesliewatkins): Flesh out.
-  return false;
+  return has_pending_requests_;
 }
 
 void FakeDisconnectTetheringRequestSender::
diff --git a/chromeos/components/tether/fake_disconnect_tethering_request_sender.h b/chromeos/components/tether/fake_disconnect_tethering_request_sender.h
index 025414b..b27f8d9 100644
--- a/chromeos/components/tether/fake_disconnect_tethering_request_sender.h
+++ b/chromeos/components/tether/fake_disconnect_tethering_request_sender.h
@@ -5,6 +5,9 @@
 #ifndef CHROMEOS_COMPONENTS_TETHER_FAKE_DISCONNECT_TETHERING_REQUEST_SENDER_H_
 #define CHROMEOS_COMPONENTS_TETHER_FAKE_DISCONNECT_TETHERING_REQUEST_SENDER_H_
 
+#include <string>
+#include <vector>
+
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "chromeos/components/tether/disconnect_tethering_request_sender.h"
@@ -20,13 +23,24 @@
   FakeDisconnectTetheringRequestSender();
   ~FakeDisconnectTetheringRequestSender() override;
 
+  void NotifyPendingDisconnectRequestsComplete();
+
+  void set_has_pending_requests(bool has_pending_requests) {
+    has_pending_requests_ = has_pending_requests;
+  }
+
+  const std::vector<std::string>& device_ids_sent_requests() {
+    return device_ids_sent_requests_;
+  }
+
   // DisconnectTetheringRequestSender:
   void SendDisconnectRequestToDevice(const std::string& device_id) override;
   bool HasPendingRequests() override;
 
-  void NotifyPendingDisconnectRequestsComplete();
-
  private:
+  bool has_pending_requests_ = false;
+  std::vector<std::string> device_ids_sent_requests_;
+
   DISALLOW_COPY_AND_ASSIGN(FakeDisconnectTetheringRequestSender);
 };
 
diff --git a/chromeos/components/tether/initializer_impl.cc b/chromeos/components/tether/initializer_impl.cc
index a9382c5..9b9feeb 100644
--- a/chromeos/components/tether/initializer_impl.cc
+++ b/chromeos/components/tether/initializer_impl.cc
@@ -11,6 +11,7 @@
 #include "chromeos/components/tether/crash_recovery_manager.h"
 #include "chromeos/components/tether/device_id_tether_network_guid_map.h"
 #include "chromeos/components/tether/disconnect_tethering_request_sender.h"
+#include "chromeos/components/tether/disconnect_tethering_request_sender_impl.h"
 #include "chromeos/components/tether/host_connection_metrics_logger.h"
 #include "chromeos/components/tether/host_scan_device_prioritizer_impl.h"
 #include "chromeos/components/tether/host_scan_scheduler.h"
@@ -45,23 +46,6 @@
 
 namespace tether {
 
-namespace {
-
-// TODO(lesliewatkins): Remove this and use the actual
-// DisconnectTetheringRequestSender.
-class DummyDisconnectTetheringRequestSender
-    : public DisconnectTetheringRequestSender {
- public:
-  DummyDisconnectTetheringRequestSender() {}
-  ~DummyDisconnectTetheringRequestSender() override {}
-
-  // DisconnectTetheringRequestSender:
-  void SendDisconnectRequestToDevice(const std::string& device_id) override {}
-  bool HasPendingRequests() override { return false; }
-};
-
-}  // namespace
-
 // static
 InitializerImpl::Factory* InitializerImpl::Factory::factory_instance_ = nullptr;
 
@@ -158,6 +142,9 @@
 void InitializerImpl::RequestShutdown() {
   DCHECK(status() == Initializer::Status::ACTIVE);
 
+  // Trigger a disconnect on any active Tether connections.
+  tether_disconnector_.reset();
+
   if (!disconnect_tethering_request_sender_ ||
       !disconnect_tethering_request_sender_->HasPendingRequests()) {
     TransitionToStatus(Initializer::Status::SHUT_DOWN);
@@ -213,9 +200,9 @@
   ble_connection_manager_ = base::MakeUnique<BleConnectionManager>(
       cryptauth_service_, adapter_, local_device_data_provider_.get(),
       remote_beacon_seed_fetcher_.get());
-  // TODO(lesliewatkins): Use actual DisconnectTetheringRequestSender.
   disconnect_tethering_request_sender_ =
-      base::MakeUnique<DummyDisconnectTetheringRequestSender>();
+      base::MakeUnique<DisconnectTetheringRequestSenderImpl>(
+          ble_connection_manager_.get(), tether_host_fetcher_.get());
   tether_host_response_recorder_ =
       base::MakeUnique<TetherHostResponseRecorder>(pref_service_);
   device_id_tether_network_guid_map_ =
@@ -266,13 +253,14 @@
           network_state_handler_, managed_network_configuration_handler_);
   tether_disconnector_ = base::MakeUnique<TetherDisconnectorImpl>(
       network_connection_handler_, network_state_handler_, active_host_.get(),
-      ble_connection_manager_.get(), network_configuration_remover_.get(),
-      tether_connector_.get(), device_id_tether_network_guid_map_.get(),
-      tether_host_fetcher_.get(), pref_service_);
+      disconnect_tethering_request_sender_.get(),
+      network_configuration_remover_.get(), tether_connector_.get(),
+      device_id_tether_network_guid_map_.get(), pref_service_);
   tether_network_disconnection_handler_ =
       base::MakeUnique<TetherNetworkDisconnectionHandler>(
           active_host_.get(), network_state_handler_,
-          network_configuration_remover_.get());
+          network_configuration_remover_.get(),
+          disconnect_tethering_request_sender_.get());
   network_connection_handler_tether_delegate_ =
       base::MakeUnique<NetworkConnectionHandlerTetherDelegate>(
           network_connection_handler_, active_host_.get(),
@@ -309,7 +297,6 @@
   crash_recovery_manager_.reset();
   network_connection_handler_tether_delegate_.reset();
   tether_network_disconnection_handler_.reset();
-  tether_disconnector_.reset();
   network_configuration_remover_.reset();
   tether_connector_.reset();
   host_connection_metrics_logger_.reset();
diff --git a/chromeos/components/tether/tether_disconnector_impl.cc b/chromeos/components/tether/tether_disconnector_impl.cc
index 0814144..3ab6096 100644
--- a/chromeos/components/tether/tether_disconnector_impl.cc
+++ b/chromeos/components/tether/tether_disconnector_impl.cc
@@ -7,10 +7,10 @@
 #include "base/values.h"
 #include "chromeos/components/tether/active_host.h"
 #include "chromeos/components/tether/device_id_tether_network_guid_map.h"
+#include "chromeos/components/tether/disconnect_tethering_request_sender.h"
 #include "chromeos/components/tether/network_configuration_remover.h"
 #include "chromeos/components/tether/pref_names.h"
 #include "chromeos/components/tether/tether_connector.h"
-#include "chromeos/components/tether/tether_host_fetcher.h"
 #include "chromeos/network/network_connection_handler.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
@@ -40,20 +40,18 @@
     NetworkConnectionHandler* network_connection_handler,
     NetworkStateHandler* network_state_handler,
     ActiveHost* active_host,
-    BleConnectionManager* ble_connection_manager,
+    DisconnectTetheringRequestSender* disconnect_tethering_request_sender,
     NetworkConfigurationRemover* network_configuration_remover,
     TetherConnector* tether_connector,
     DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map,
-    TetherHostFetcher* tether_host_fetcher,
     PrefService* pref_service)
     : network_connection_handler_(network_connection_handler),
       network_state_handler_(network_state_handler),
       active_host_(active_host),
-      ble_connection_manager_(ble_connection_manager),
+      disconnect_tethering_request_sender_(disconnect_tethering_request_sender),
       network_configuration_remover_(network_configuration_remover),
       tether_connector_(tether_connector),
       device_id_tether_network_guid_map_(device_id_tether_network_guid_map),
-      tether_host_fetcher_(tether_host_fetcher),
       pref_service_(pref_service),
       weak_ptr_factory_(this) {
   std::string disconnecting_wifi_guid_from_previous_session =
@@ -68,9 +66,6 @@
 }
 
 TetherDisconnectorImpl::~TetherDisconnectorImpl() {
-  if (disconnect_tethering_operation_)
-    disconnect_tethering_operation_->RemoveObserver(this);
-
   std::string active_tether_guid = active_host_->GetTetherNetworkGuid();
   if (!active_tether_guid.empty()) {
     PA_LOG(INFO) << "There was an active Tether connection during Tether "
@@ -125,7 +120,6 @@
   }
 
   DCHECK(!active_wifi_network_guid.empty());
-  DCHECK(!disconnect_tethering_operation_);
   DisconnectActiveWifiConnection(tether_network_guid, active_wifi_network_guid,
                                  success_callback, error_callback);
 }
@@ -176,28 +170,8 @@
   const std::string device_id =
       device_id_tether_network_guid_map_->GetDeviceIdForTetherNetworkGuid(
           tether_network_guid);
-  tether_host_fetcher_->FetchTetherHost(
-      device_id, base::Bind(&TetherDisconnectorImpl::OnTetherHostFetched,
-                            weak_ptr_factory_.GetWeakPtr(), device_id));
-}
-
-void TetherDisconnectorImpl::OnOperationFinished(const std::string& device_id,
-                                                 bool success) {
-  if (success) {
-    PA_LOG(INFO) << "Successfully sent DisconnectTetheringRequest to device "
-                 << "with ID "
-                 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id);
-  } else {
-    PA_LOG(ERROR) << "Failed to send DisconnectTetheringRequest to device "
-                  << "with ID "
-                  << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(
-                         device_id);
-  }
-
-  // Regardless of success/failure, unregister as a listener and delete the
-  // operation.
-  disconnect_tethering_operation_->RemoveObserver(this);
-  disconnect_tethering_operation_.reset();
+  disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+      device_id);
 }
 
 void TetherDisconnectorImpl::OnSuccessfulWifiDisconnect(
@@ -236,25 +210,6 @@
     error_callback.Run(NetworkConnectionHandler::kErrorDisconnectFailed);
 }
 
-void TetherDisconnectorImpl::OnTetherHostFetched(
-    const std::string& device_id,
-    std::unique_ptr<cryptauth::RemoteDevice> tether_host) {
-  if (!tether_host) {
-    PA_LOG(ERROR) << "Could not fetch device with ID "
-                  << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
-                  << ". Unable to send DisconnectTetheringRequest.";
-    return;
-  }
-
-  disconnect_tethering_operation_ =
-      DisconnectTetheringOperation::Factory::NewInstance(
-          *tether_host, ble_connection_manager_);
-
-  // Start the operation; OnOperationFinished() will be called when finished.
-  disconnect_tethering_operation_->AddObserver(this);
-  disconnect_tethering_operation_->Initialize();
-}
-
 }  // namespace tether
 
 }  // namespace chromeos
diff --git a/chromeos/components/tether/tether_disconnector_impl.h b/chromeos/components/tether/tether_disconnector_impl.h
index 886e5336..ec40c20 100644
--- a/chromeos/components/tether/tether_disconnector_impl.h
+++ b/chromeos/components/tether/tether_disconnector_impl.h
@@ -12,7 +12,6 @@
 #include "base/callback_forward.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "chromeos/components/tether/disconnect_tethering_operation.h"
 #include "chromeos/components/tether/tether_disconnector.h"
 #include "chromeos/network/network_handler_callbacks.h"
 
@@ -31,14 +30,12 @@
 namespace tether {
 
 class ActiveHost;
-class BleConnectionManager;
 class DeviceIdTetherNetworkGuidMap;
+class DisconnectTetheringRequestSender;
 class NetworkConfigurationRemover;
 class TetherConnector;
-class TetherHostFetcher;
 
-class TetherDisconnectorImpl : public TetherDisconnector,
-                               public DisconnectTetheringOperation::Observer {
+class TetherDisconnectorImpl : public TetherDisconnector {
  public:
   // Registers the prefs used by this class to the given |registry|.
   static void RegisterPrefs(PrefRegistrySimple* registry);
@@ -47,11 +44,10 @@
       NetworkConnectionHandler* network_connection_handler,
       NetworkStateHandler* network_state_handler,
       ActiveHost* active_host,
-      BleConnectionManager* ble_connection_manager,
+      DisconnectTetheringRequestSender* disconnect_tethering_request_sender,
       NetworkConfigurationRemover* network_configuration_remover,
       TetherConnector* tether_connector,
       DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map,
-      TetherHostFetcher* tether_host_fetcher,
       PrefService* pref_service);
   ~TetherDisconnectorImpl() override;
 
@@ -60,9 +56,6 @@
       const base::Closure& success_callback,
       const network_handler::StringResultCallback& error_callback) override;
 
-  // DisconnectTetheringOperation::Observer:
-  void OnOperationFinished(const std::string& device_id, bool success) override;
-
  private:
   friend class TetherDisconnectorImplTest;
 
@@ -86,21 +79,16 @@
       const std::string& wifi_network_guid,
       const base::Closure& success_callback,
       const network_handler::StringResultCallback& error_callback);
-  void OnTetherHostFetched(
-      const std::string& device_id,
-      std::unique_ptr<cryptauth::RemoteDevice> tether_host);
 
   NetworkConnectionHandler* network_connection_handler_;
   NetworkStateHandler* network_state_handler_;
   ActiveHost* active_host_;
-  BleConnectionManager* ble_connection_manager_;
+  DisconnectTetheringRequestSender* disconnect_tethering_request_sender_;
   NetworkConfigurationRemover* network_configuration_remover_;
   TetherConnector* tether_connector_;
   DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map_;
-  TetherHostFetcher* tether_host_fetcher_;
   PrefService* pref_service_;
 
-  std::unique_ptr<DisconnectTetheringOperation> disconnect_tethering_operation_;
   base::WeakPtrFactory<TetherDisconnectorImpl> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(TetherDisconnectorImpl);
diff --git a/chromeos/components/tether/tether_disconnector_impl_unittest.cc b/chromeos/components/tether/tether_disconnector_impl_unittest.cc
index 4607fbe0..67ed106e 100644
--- a/chromeos/components/tether/tether_disconnector_impl_unittest.cc
+++ b/chromeos/components/tether/tether_disconnector_impl_unittest.cc
@@ -9,7 +9,7 @@
 #include "chromeos/components/tether/connect_tethering_operation.h"
 #include "chromeos/components/tether/device_id_tether_network_guid_map.h"
 #include "chromeos/components/tether/fake_active_host.h"
-#include "chromeos/components/tether/fake_ble_connection_manager.h"
+#include "chromeos/components/tether/fake_disconnect_tethering_request_sender.h"
 #include "chromeos/components/tether/fake_network_configuration_remover.h"
 #include "chromeos/components/tether/fake_tether_connector.h"
 #include "chromeos/components/tether/fake_tether_host_fetcher.h"
@@ -100,51 +100,6 @@
   network_handler::ErrorCallback last_disconnect_error_callback_;
 };
 
-class FakeDisconnectTetheringOperation : public DisconnectTetheringOperation {
- public:
-  FakeDisconnectTetheringOperation(
-      const cryptauth::RemoteDevice& device_to_connect,
-      BleConnectionManager* connection_manager)
-      : DisconnectTetheringOperation(device_to_connect, connection_manager) {}
-
-  ~FakeDisconnectTetheringOperation() override {}
-
-  void NotifyFinished(bool success) {
-    NotifyObserversOperationFinished(success);
-  }
-
-  cryptauth::RemoteDevice GetRemoteDevice() {
-    EXPECT_EQ(1u, remote_devices().size());
-    return remote_devices()[0];
-  }
-};
-
-class FakeDisconnectTetheringOperationFactory
-    : public DisconnectTetheringOperation::Factory {
- public:
-  FakeDisconnectTetheringOperationFactory() {}
-  virtual ~FakeDisconnectTetheringOperationFactory() {}
-
-  std::vector<FakeDisconnectTetheringOperation*>& created_operations() {
-    return created_operations_;
-  }
-
- protected:
-  // DisconnectTetheringOperation::Factory:
-  std::unique_ptr<DisconnectTetheringOperation> BuildInstance(
-      const cryptauth::RemoteDevice& device_to_connect,
-      BleConnectionManager* connection_manager) override {
-    FakeDisconnectTetheringOperation* operation =
-        new FakeDisconnectTetheringOperation(device_to_connect,
-                                             connection_manager);
-    created_operations_.push_back(operation);
-    return base::WrapUnique(operation);
-  }
-
- private:
-  std::vector<FakeDisconnectTetheringOperation*> created_operations_;
-};
-
 }  // namespace
 
 class TetherDisconnectorImplTest : public NetworkStateTest {
@@ -165,30 +120,25 @@
             &TetherDisconnectorImplTest::OnNetworkConnectionManagerDisconnect,
             base::Unretained(this))));
     fake_active_host_ = base::MakeUnique<FakeActiveHost>();
-    fake_ble_connection_manager_ = base::MakeUnique<FakeBleConnectionManager>();
     fake_network_configuration_remover_ =
         base::MakeUnique<FakeNetworkConfigurationRemover>();
     fake_tether_connector_ = base::MakeUnique<FakeTetherConnector>();
     device_id_tether_network_guid_map_ =
         base::MakeUnique<DeviceIdTetherNetworkGuidMap>();
-    fake_tether_host_fetcher_ = base::MakeUnique<FakeTetherHostFetcher>(
-        test_devices_, true /* synchronously_reply_with_results */);
     test_pref_service_ = base::MakeUnique<TestingPrefServiceSimple>();
 
-    fake_operation_factory_ =
-        base::WrapUnique(new FakeDisconnectTetheringOperationFactory());
-    DisconnectTetheringOperation::Factory::SetInstanceForTesting(
-        fake_operation_factory_.get());
+    fake_disconnect_tethering_request_sender_ =
+        base::MakeUnique<FakeDisconnectTetheringRequestSender>();
 
     SetUpTetherNetworks();
 
     TetherDisconnectorImpl::RegisterPrefs(test_pref_service_->registry());
     tether_disconnector_ = base::MakeUnique<TetherDisconnectorImpl>(
         test_network_connection_handler_.get(), network_state_handler(),
-        fake_active_host_.get(), fake_ble_connection_manager_.get(),
+        fake_active_host_.get(),
+        fake_disconnect_tethering_request_sender_.get(),
         fake_network_configuration_remover_.get(), fake_tether_connector_.get(),
-        device_id_tether_network_guid_map_.get(),
-        fake_tether_host_fetcher_.get(), test_pref_service_.get());
+        device_id_tether_network_guid_map_.get(), test_pref_service_.get());
   }
 
   void TearDown() override {
@@ -299,24 +249,28 @@
     return test_pref_service_->GetString(prefs::kDisconnectingWifiNetworkGuid);
   }
 
+  void VerifyNoDisconnectTetheringRequestSent() {
+    EXPECT_TRUE(
+        fake_disconnect_tethering_request_sender_->device_ids_sent_requests()
+            .empty());
+  }
+
   const std::vector<cryptauth::RemoteDevice> test_devices_;
   const base::MessageLoop message_loop_;
 
   std::unique_ptr<TestNetworkConnectionHandler>
       test_network_connection_handler_;
   std::unique_ptr<FakeActiveHost> fake_active_host_;
-  std::unique_ptr<FakeBleConnectionManager> fake_ble_connection_manager_;
   std::unique_ptr<FakeNetworkConfigurationRemover>
       fake_network_configuration_remover_;
   std::unique_ptr<FakeTetherConnector> fake_tether_connector_;
   // TODO(hansberry): Use a fake for this when a real mapping scheme is created.
   std::unique_ptr<DeviceIdTetherNetworkGuidMap>
       device_id_tether_network_guid_map_;
-  std::unique_ptr<FakeTetherHostFetcher> fake_tether_host_fetcher_;
   std::unique_ptr<TestingPrefServiceSimple> test_pref_service_;
 
-  std::unique_ptr<FakeDisconnectTetheringOperationFactory>
-      fake_operation_factory_;
+  std::unique_ptr<FakeDisconnectTetheringRequestSender>
+      fake_disconnect_tethering_request_sender_;
 
   std::string wifi_service_path_;
   std::string disconnection_result_;
@@ -333,6 +287,9 @@
   CallDisconnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
   EXPECT_EQ(NetworkConnectionHandler::kErrorNotConnected, GetResultAndReset());
 
+  // No DisconnectTetheringRequest should be sent.
+  VerifyNoDisconnectTetheringRequestSent();
+
   // Should still be disconnected.
   EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
             fake_active_host_->GetActiveHostStatus());
@@ -349,6 +306,9 @@
   CallDisconnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
   EXPECT_EQ(NetworkConnectionHandler::kErrorNotConnected, GetResultAndReset());
 
+  // No DisconnectTetheringRequest should be sent.
+  VerifyNoDisconnectTetheringRequestSent();
+
   // Should still be connected to the other host.
   EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTED,
             fake_active_host_->GetActiveHostStatus());
@@ -383,6 +343,9 @@
   EXPECT_EQ(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()),
             fake_tether_connector_->last_canceled_tether_network_guid());
 
+  // No DisconnectTetheringRequest should be sent.
+  VerifyNoDisconnectTetheringRequestSent();
+
   // Note: This test does not check the active host's status because it will be
   // changed by TetherConnector.
 }
@@ -398,36 +361,9 @@
   EXPECT_EQ(NetworkConnectionHandler::kErrorDisconnectFailed,
             GetResultAndReset());
 
-  // Should be disconnected.
-  EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
-            fake_active_host_->GetActiveHostStatus());
-}
-
-TEST_F(TetherDisconnectorImplTest,
-       DisconnectWhenConnected_WifiDisconnectionFails_CannotFetchHost) {
-  fake_active_host_->SetActiveHostConnected(
-      test_devices_[0].GetDeviceId(),
-      GetTetherNetworkGuid(test_devices_[0].GetDeviceId()), kWifiNetworkGuid);
-  SimulateConnectionToWifiNetwork();
-
-  // Remove hosts from |fake_tether_host_fetcher_|; this will cause the fetcher
-  // to return a null RemoteDevice.
-  fake_tether_host_fetcher_->SetTetherHosts(
-      std::vector<cryptauth::RemoteDevice>());
-
-  should_disconnect_successfully_ = false;
-
-  CallDisconnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
-  EXPECT_EQ(NetworkConnectionHandler::kErrorDisconnectFailed,
-            GetResultAndReset());
-
-  // The Wi-Fi network should still be connected since disconnection failed.
   EXPECT_EQ(
-      shill::kStateOnline,
-      GetServiceStringProperty(wifi_service_path_, shill::kStateProperty));
-
-  // Should not have created any operations since the fetch failed.
-  EXPECT_TRUE(fake_operation_factory_->created_operations().empty());
+      std::vector<std::string>{test_devices_[0].GetDeviceId()},
+      fake_disconnect_tethering_request_sender_->device_ids_sent_requests());
 
   // Should be disconnected.
   EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
@@ -435,34 +371,7 @@
 }
 
 TEST_F(TetherDisconnectorImplTest,
-       DisconnectWhenConnected_WifiDisconnectionSucceeds_CannotFetchHost) {
-  fake_active_host_->SetActiveHostConnected(
-      test_devices_[0].GetDeviceId(),
-      GetTetherNetworkGuid(test_devices_[0].GetDeviceId()), kWifiNetworkGuid);
-  SimulateConnectionToWifiNetwork();
-
-  // Remove hosts from |fake_tether_host_fetcher_|; this will cause the fetcher
-  // to return a null RemoteDevice.
-  fake_tether_host_fetcher_->SetTetherHosts(
-      std::vector<cryptauth::RemoteDevice>());
-
-  CallDisconnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
-  EXPECT_EQ(kSuccessResult, GetResultAndReset());
-
-  // The Wi-Fi network should be disconnected.
-  EXPECT_EQ(shill::kStateIdle, GetServiceStringProperty(wifi_service_path_,
-                                                        shill::kStateProperty));
-
-  // Should not have created any operations since the fetch failed.
-  EXPECT_TRUE(fake_operation_factory_->created_operations().empty());
-
-  // Should be disconnected.
-  EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
-            fake_active_host_->GetActiveHostStatus());
-}
-
-TEST_F(TetherDisconnectorImplTest,
-       DisconnectWhenConnected_WifiDisconnectionFails_OperationFails) {
+       DisconnectWhenConnected_WifiDisconnectionFails) {
   fake_active_host_->SetActiveHostConnected(
       test_devices_[0].GetDeviceId(),
       GetTetherNetworkGuid(test_devices_[0].GetDeviceId()), kWifiNetworkGuid);
@@ -479,13 +388,9 @@
       shill::kStateOnline,
       GetServiceStringProperty(wifi_service_path_, shill::kStateProperty));
 
-  // Fail the operation.
-  ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
   EXPECT_EQ(
-      test_devices_[0],
-      fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
-  fake_operation_factory_->created_operations()[0]->NotifyFinished(
-      false /* success */);
+      std::vector<std::string>{test_devices_[0].GetDeviceId()},
+      fake_disconnect_tethering_request_sender_->device_ids_sent_requests());
 
   // Should be disconnected.
   EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
@@ -493,7 +398,7 @@
 }
 
 TEST_F(TetherDisconnectorImplTest,
-       DisconnectWhenConnected_WifiDisconnectionSucceeds_OperationFails) {
+       DisconnectWhenConnected_WifiDisconnectionSucceeds) {
   fake_active_host_->SetActiveHostConnected(
       test_devices_[0].GetDeviceId(),
       GetTetherNetworkGuid(test_devices_[0].GetDeviceId()), kWifiNetworkGuid);
@@ -506,69 +411,9 @@
   EXPECT_EQ(shill::kStateIdle, GetServiceStringProperty(wifi_service_path_,
                                                         shill::kStateProperty));
 
-  ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
   EXPECT_EQ(
-      test_devices_[0],
-      fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
-  fake_operation_factory_->created_operations()[0]->NotifyFinished(
-      false /* success */);
-
-  // Should be disconnected.
-  EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
-            fake_active_host_->GetActiveHostStatus());
-}
-
-TEST_F(TetherDisconnectorImplTest,
-       DisconnectWhenConnected_WifiDisconnectionFails_OperationSucceeds) {
-  fake_active_host_->SetActiveHostConnected(
-      test_devices_[0].GetDeviceId(),
-      GetTetherNetworkGuid(test_devices_[0].GetDeviceId()), kWifiNetworkGuid);
-  SimulateConnectionToWifiNetwork();
-
-  should_disconnect_successfully_ = false;
-
-  CallDisconnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
-  EXPECT_EQ(NetworkConnectionHandler::kErrorDisconnectFailed,
-            GetResultAndReset());
-
-  // The Wi-Fi network should still be connected since disconnection failed.
-  EXPECT_EQ(
-      shill::kStateOnline,
-      GetServiceStringProperty(wifi_service_path_, shill::kStateProperty));
-
-  // Fail the operation.
-  ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
-  EXPECT_EQ(
-      test_devices_[0],
-      fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
-  fake_operation_factory_->created_operations()[0]->NotifyFinished(
-      true /* success */);
-
-  // Should be disconnected.
-  EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
-            fake_active_host_->GetActiveHostStatus());
-}
-
-TEST_F(TetherDisconnectorImplTest,
-       DisconnectWhenConnected_WifiDisconnectionSucceeds_OperationSucceeds) {
-  fake_active_host_->SetActiveHostConnected(
-      test_devices_[0].GetDeviceId(),
-      GetTetherNetworkGuid(test_devices_[0].GetDeviceId()), kWifiNetworkGuid);
-  SimulateConnectionToWifiNetwork();
-
-  CallDisconnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
-  EXPECT_EQ(kSuccessResult, GetResultAndReset());
-
-  // The Wi-Fi network should be disconnected.
-  EXPECT_EQ(shill::kStateIdle, GetServiceStringProperty(wifi_service_path_,
-                                                        shill::kStateProperty));
-
-  ASSERT_EQ(1u, fake_operation_factory_->created_operations().size());
-  EXPECT_EQ(
-      test_devices_[0],
-      fake_operation_factory_->created_operations()[0]->GetRemoteDevice());
-  fake_operation_factory_->created_operations()[0]->NotifyFinished(
-      true /* success */);
+      std::vector<std::string>{test_devices_[0].GetDeviceId()},
+      fake_disconnect_tethering_request_sender_->device_ids_sent_requests());
 
   // Should be disconnected.
   EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
@@ -585,6 +430,10 @@
   CallDisconnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
   EXPECT_EQ(kSuccessResult, GetResultAndReset());
 
+  EXPECT_EQ(
+      std::vector<std::string>{test_devices_[0].GetDeviceId()},
+      fake_disconnect_tethering_request_sender_->device_ids_sent_requests());
+
   // Stop the test here, before the operation responds in any way. This test
   // ensures that TetherDisconnectorImpl properly removes existing listeners
   // if it is destroyed while there are still active operations.
@@ -594,7 +443,6 @@
   // For this test, do not synchronously reply with results. This echos what
   // actually happens when a TetherDisconnectorImpl is deleted.
   should_run_disconnect_callbacks_synchronously_ = false;
-  fake_tether_host_fetcher_->set_synchronously_reply_with_results(false);
 
   fake_active_host_->SetActiveHostConnected(
       test_devices_[0].GetDeviceId(),
@@ -612,10 +460,9 @@
   EXPECT_EQ(shill::kStateIdle, GetServiceStringProperty(wifi_service_path_,
                                                         shill::kStateProperty));
 
-  // Because the fetcher does not synchronously reply with results,
-  // |tether_disconnector_| should be deleted before any operations can be
-  // created.
-  EXPECT_TRUE(fake_operation_factory_->created_operations().empty());
+  EXPECT_EQ(
+      std::vector<std::string>{test_devices_[0].GetDeviceId()},
+      fake_disconnect_tethering_request_sender_->device_ids_sent_requests());
 
   // Should be disconnected.
   EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
@@ -633,10 +480,9 @@
   // the previous disconnection attempt.
   tether_disconnector_ = base::MakeUnique<TetherDisconnectorImpl>(
       test_network_connection_handler_.get(), network_state_handler(),
-      fake_active_host_.get(), fake_ble_connection_manager_.get(),
+      fake_active_host_.get(), fake_disconnect_tethering_request_sender_.get(),
       fake_network_configuration_remover_.get(), fake_tether_connector_.get(),
-      device_id_tether_network_guid_map_.get(), fake_tether_host_fetcher_.get(),
-      test_pref_service_.get());
+      device_id_tether_network_guid_map_.get(), test_pref_service_.get());
   EXPECT_EQ(
       kWifiNetworkGuid,
       fake_network_configuration_remover_->last_removed_wifi_network_guid());
diff --git a/chromeos/components/tether/tether_network_disconnection_handler.cc b/chromeos/components/tether/tether_network_disconnection_handler.cc
index 6c2cb35..78073072 100644
--- a/chromeos/components/tether/tether_network_disconnection_handler.cc
+++ b/chromeos/components/tether/tether_network_disconnection_handler.cc
@@ -8,7 +8,9 @@
 #include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "chromeos/components/tether/disconnect_tethering_request_sender.h"
 #include "chromeos/components/tether/network_configuration_remover.h"
+#include "chromeos/components/tether/tether_host_fetcher.h"
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
@@ -21,10 +23,13 @@
 TetherNetworkDisconnectionHandler::TetherNetworkDisconnectionHandler(
     ActiveHost* active_host,
     NetworkStateHandler* network_state_handler,
-    NetworkConfigurationRemover* network_configuration_remover)
+    NetworkConfigurationRemover* network_configuration_remover,
+    DisconnectTetheringRequestSender* disconnect_tethering_request_sender)
     : active_host_(active_host),
       network_state_handler_(network_state_handler),
-      network_configuration_remover_(network_configuration_remover) {
+      network_configuration_remover_(network_configuration_remover),
+      disconnect_tethering_request_sender_(
+          disconnect_tethering_request_sender) {
   network_state_handler_->AddObserver(this, FROM_HERE);
 }
 
@@ -44,6 +49,11 @@
     network_configuration_remover_->RemoveNetworkConfiguration(
         active_host_->GetWifiNetworkGuid());
 
+    // Send a DisconnectTetheringRequest to the tether host so that it can shut
+    // down its Wi-Fi hotspot if it is no longer in use.
+    disconnect_tethering_request_sender_->SendDisconnectRequestToDevice(
+        active_host_->GetActiveHostDeviceId());
+
     active_host_->SetActiveHostDisconnected();
   }
 }
diff --git a/chromeos/components/tether/tether_network_disconnection_handler.h b/chromeos/components/tether/tether_network_disconnection_handler.h
index 04656045..459a2ec 100644
--- a/chromeos/components/tether/tether_network_disconnection_handler.h
+++ b/chromeos/components/tether/tether_network_disconnection_handler.h
@@ -15,21 +15,23 @@
 
 namespace tether {
 
+class DisconnectTetheringRequestSender;
 class NetworkConfigurationRemover;
 
 class ActiveHost;
 
 // Handles lost Wi-Fi connections for ongoing tether sessions. When a tether
 // connection is in progress, the device is connected to an underlying Wi-Fi
-// network. If the Wi-Fi connection is disrupted (e.g., by the tether host going
-// out of Wi-Fi range), tether metadata must be updated accordingly. This class
-// tracks ongoing connections and updates this metadata when necessary.
+// network. If the tether network is disconnected, tether metadata is
+// updated accordingly, and a message is sent to the host to disable its
+// Wi-Fi hotspot.
 class TetherNetworkDisconnectionHandler : public NetworkStateHandlerObserver {
  public:
   TetherNetworkDisconnectionHandler(
       ActiveHost* active_host,
       NetworkStateHandler* network_state_handler,
-      NetworkConfigurationRemover* network_configuration_remover);
+      NetworkConfigurationRemover* network_configuration_remover,
+      DisconnectTetheringRequestSender* disconnect_tethering_request_sender);
   ~TetherNetworkDisconnectionHandler() override;
 
   // NetworkStateHandlerObserver:
@@ -41,6 +43,7 @@
   ActiveHost* active_host_;
   NetworkStateHandler* network_state_handler_;
   NetworkConfigurationRemover* network_configuration_remover_;
+  DisconnectTetheringRequestSender* disconnect_tethering_request_sender_;
 
   DISALLOW_COPY_AND_ASSIGN(TetherNetworkDisconnectionHandler);
 };
diff --git a/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc b/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc
index e465134..bfb8fc47 100644
--- a/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc
+++ b/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "chromeos/components/tether/fake_active_host.h"
+#include "chromeos/components/tether/fake_disconnect_tethering_request_sender.h"
 #include "chromeos/components/tether/network_configuration_remover.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/network/network_state.h"
@@ -64,12 +65,15 @@
         ConfigureService(CreateConnectedWifiConfigurationJsonString());
 
     fake_active_host_ = base::MakeUnique<FakeActiveHost>();
+    fake_disconnect_tethering_request_sender_ =
+        base::MakeUnique<FakeDisconnectTetheringRequestSender>();
     mock_network_configuration_remover_ =
         base::WrapUnique(new NiceMock<MockNetworkConfigurationRemover>);
 
     handler_ = base::WrapUnique(new TetherNetworkDisconnectionHandler(
         fake_active_host_.get(), network_state_handler(),
-        mock_network_configuration_remover_.get()));
+        mock_network_configuration_remover_.get(),
+        fake_disconnect_tethering_request_sender_.get()));
   }
 
   void TearDown() override {
@@ -89,6 +93,8 @@
   std::string wifi_service_path_;
 
   std::unique_ptr<FakeActiveHost> fake_active_host_;
+  std::unique_ptr<FakeDisconnectTetheringRequestSender>
+      fake_disconnect_tethering_request_sender_;
   std::unique_ptr<MockNetworkConfigurationRemover>
       mock_network_configuration_remover_;
 
@@ -100,8 +106,7 @@
 
 TEST_F(TetherNetworkDisconnectionHandlerTest, TestConnectAndDisconnect) {
   EXPECT_CALL(*mock_network_configuration_remover_,
-              RemoveNetworkConfiguration(kWifiNetworkGuid))
-      .Times(1);
+              RemoveNetworkConfiguration(kWifiNetworkGuid));
 
   // Connect to the network. |handler_| should start tracking the connection.
   fake_active_host_->SetActiveHostConnecting(kDeviceId, kTetherNetworkGuid);
@@ -111,6 +116,11 @@
   // Now, disconnect the Wi-Fi network. This should result in
   // |fake_active_host_| becoming disconnected.
   NotifyDisconnected();
+
+  EXPECT_EQ(
+      std::vector<std::string>{kDeviceId},
+      fake_disconnect_tethering_request_sender_->device_ids_sent_requests());
+
   EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
             fake_active_host_->GetActiveHostStatus());
 }
diff --git a/chromeos/network/onc/onc_certificate_importer.h b/chromeos/network/onc/onc_certificate_importer.h
index ff934c1..c83d82d 100644
--- a/chromeos/network/onc/onc_certificate_importer.h
+++ b/chromeos/network/onc/onc_certificate_importer.h
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "chromeos/chromeos_export.h"
 #include "components/onc/onc_constants.h"
-#include "net/cert/x509_certificate.h"
+#include "net/cert/scoped_nss_types.h"
 
 namespace base {
 class ListValue;
@@ -20,8 +20,9 @@
 
 class CHROMEOS_EXPORT CertificateImporter {
  public:
-  typedef base::Callback<
-      void(bool success, const net::CertificateList& onc_trusted_certificates)>
+  typedef base::Callback<void(
+      bool success,
+      net::ScopedCERTCertificateList onc_trusted_certificates)>
       DoneCallback;
 
   CertificateImporter() {}
diff --git a/chromeos/network/onc/onc_certificate_importer_impl.cc b/chromeos/network/onc/onc_certificate_importer_impl.cc
index de86f09..a0e593f 100644
--- a/chromeos/network/onc/onc_certificate_importer_impl.cc
+++ b/chromeos/network/onc/onc_certificate_importer_impl.cc
@@ -24,7 +24,7 @@
 #include "crypto/scoped_nss_types.h"
 #include "net/base/net_errors.h"
 #include "net/cert/nss_cert_database.h"
-#include "net/cert/x509_certificate.h"
+#include "net/cert/x509_util_nss.h"
 
 namespace chromeos {
 namespace onc {
@@ -35,9 +35,10 @@
     const scoped_refptr<base::SingleThreadTaskRunner>& origin_loop,
     const CertificateImporter::DoneCallback& callback,
     bool success,
-    const net::CertificateList& onc_trusted_certificates) {
+    net::ScopedCERTCertificateList onc_trusted_certificates) {
   origin_loop->PostTask(
-      FROM_HERE, base::Bind(callback, success, onc_trusted_certificates));
+      FROM_HERE,
+      base::BindOnce(callback, success, std::move(onc_trusted_certificates)));
 }
 
 }  // namespace
@@ -93,7 +94,7 @@
     net::NSSCertDatabase* nssdb) {
   // Web trust is only granted to certificates imported by the user.
   bool allow_trust_imports = source == ::onc::ONC_SOURCE_USER_IMPORT;
-  net::CertificateList onc_trusted_certificates;
+  net::ScopedCERTCertificateList onc_trusted_certificates;
   bool success = true;
   for (size_t i = 0; i < certificates->GetSize(); ++i) {
     const base::DictionaryValue* certificate = NULL;
@@ -111,16 +112,16 @@
     }
   }
 
-  done_callback.Run(success, onc_trusted_certificates);
+  done_callback.Run(success, std::move(onc_trusted_certificates));
 }
 
 void CertificateImporterImpl::RunDoneCallback(
     const CertificateImporter::DoneCallback& callback,
     bool success,
-    const net::CertificateList& onc_trusted_certificates) {
+    net::ScopedCERTCertificateList onc_trusted_certificates) {
   if (!success)
     NET_LOG_ERROR("ONC Certificate Import Error", "");
-  callback.Run(success, onc_trusted_certificates);
+  callback.Run(success, std::move(onc_trusted_certificates));
 }
 
 bool CertificateImporterImpl::ParseAndStoreCertificate(
@@ -128,7 +129,7 @@
     bool allow_trust_imports,
     const base::DictionaryValue& certificate,
     net::NSSCertDatabase* nssdb,
-    net::CertificateList* onc_trusted_certificates) {
+    net::ScopedCERTCertificateList* onc_trusted_certificates) {
   std::string guid;
   certificate.GetStringWithoutPathExpansion(::onc::certificate::kGUID, &guid);
   DCHECK(!guid.empty());
@@ -156,7 +157,7 @@
     const std::string& guid,
     const base::DictionaryValue& certificate,
     net::NSSCertDatabase* nssdb,
-    net::CertificateList* onc_trusted_certificates) {
+    net::ScopedCERTCertificateList* onc_trusted_certificates) {
   // Device policy can't import certificates.
   if (source == ::onc::ONC_SOURCE_DEVICE_POLICY) {
     // This isn't a parsing error.
@@ -205,8 +206,7 @@
     return false;
   }
 
-  scoped_refptr<net::X509Certificate> x509_cert =
-      DecodePEMCertificate(x509_data);
+  net::ScopedCERTCertificate x509_cert = DecodePEMCertificate(x509_data);
   if (!x509_cert.get()) {
     LOG(ERROR) << "Unable to create certificate from PEM encoding, type: "
                << cert_type;
@@ -217,7 +217,7 @@
                                            net::NSSCertDatabase::TRUSTED_SSL :
                                            net::NSSCertDatabase::TRUST_DEFAULT);
 
-  if (x509_cert->os_cert_handle()->isperm) {
+  if (x509_cert.get()->isperm) {
     net::CertType net_cert_type =
         cert_type == ::onc::certificate::kServer ? net::SERVER_CERT
                                                  : net::CA_CERT;
@@ -239,8 +239,8 @@
       }
     }
   } else {
-    net::CertificateList cert_list;
-    cert_list.push_back(x509_cert);
+    net::ScopedCERTCertificateList cert_list;
+    cert_list.push_back(net::x509_util::DupCERTCertificate(x509_cert.get()));
     net::NSSCertDatabase::ImportCertFailureList failures;
     bool success = false;
     if (cert_type == ::onc::certificate::kServer)
@@ -262,7 +262,7 @@
   }
 
   if (web_trust_flag && onc_trusted_certificates)
-    onc_trusted_certificates->push_back(x509_cert);
+    onc_trusted_certificates->push_back(std::move(x509_cert));
 
   return true;
 }
@@ -291,7 +291,7 @@
   if (!private_slot)
     return false;
 
-  net::CertificateList imported_certs;
+  net::ScopedCERTCertificateList imported_certs;
 
   int import_result =
       nssdb->ImportFromPKCS12(private_slot.get(), decoded_pkcs12,
@@ -313,14 +313,12 @@
                     "Only the first one will be imported.";
   }
 
-  scoped_refptr<net::X509Certificate> cert_result = imported_certs[0];
+  CERTCertificate* cert_result = imported_certs[0].get();
 
   // Find the private key associated with this certificate, and set the
   // nickname on it.
   SECKEYPrivateKey* private_key = PK11_FindPrivateKeyFromCert(
-      cert_result->os_cert_handle()->slot,
-      cert_result->os_cert_handle(),
-      NULL);  // wincx
+      cert_result->slot, cert_result, nullptr /* wincx */);
   if (private_key) {
     PK11_SetPrivateKeyNickname(private_key, const_cast<char*>(guid.c_str()));
     SECKEY_DestroyPrivateKey(private_key);
diff --git a/chromeos/network/onc/onc_certificate_importer_impl.h b/chromeos/network/onc/onc_certificate_importer_impl.h
index 497e875..ee311e9 100644
--- a/chromeos/network/onc/onc_certificate_importer_impl.h
+++ b/chromeos/network/onc/onc_certificate_importer_impl.h
@@ -25,8 +25,6 @@
 
 namespace net {
 class NSSCertDatabase;
-class X509Certificate;
-typedef std::vector<scoped_refptr<X509Certificate> > CertificateList;
 }
 
 namespace chromeos {
@@ -54,7 +52,7 @@
  private:
   void RunDoneCallback(const CertificateImporter::DoneCallback& callback,
                        bool success,
-                       const net::CertificateList& onc_trusted_certificates);
+                       net::ScopedCERTCertificateList onc_trusted_certificates);
 
   // This is the synchronous implementation of ImportCertificates. It is
   // executed on the given |io_task_runner_|.
@@ -70,7 +68,7 @@
       bool allow_trust_imports,
       const base::DictionaryValue& certificate,
       net::NSSCertDatabase* nssdb,
-      net::CertificateList* onc_trusted_certificates);
+      net::ScopedCERTCertificateList* onc_trusted_certificates);
 
   // Imports the Server or CA certificate |certificate|. Web trust is only
   // applied if the certificate requests the TrustBits attribute "Web" and if
@@ -83,7 +81,7 @@
       const std::string& guid,
       const base::DictionaryValue& certificate,
       net::NSSCertDatabase* nssdb,
-      net::CertificateList* onc_trusted_certificates);
+      net::ScopedCERTCertificateList* onc_trusted_certificates);
 
   static bool ParseClientCertificate(const std::string& guid,
                                      const base::DictionaryValue& certificate,
diff --git a/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc b/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc
index 17cf9fa..3e02a128 100644
--- a/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc
+++ b/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc
@@ -20,7 +20,7 @@
 #include "net/base/hash_value.h"
 #include "net/cert/cert_type.h"
 #include "net/cert/nss_cert_database_chromeos.h"
-#include "net/cert/x509_certificate.h"
+#include "net/cert/x509_util_nss.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
@@ -54,11 +54,12 @@
   }
 
  protected:
-  void OnImportCompleted(bool expected_success,
-                         bool success,
-                         const net::CertificateList& onc_trusted_certificates) {
+  void OnImportCompleted(
+      bool expected_success,
+      bool success,
+      net::ScopedCERTCertificateList onc_trusted_certificates) {
     EXPECT_EQ(expected_success, success);
-    web_trust_certificates_ = onc_trusted_certificates;
+    web_trust_certificates_ = std::move(onc_trusted_certificates);
   }
 
   void AddCertificatesFromFile(const std::string& filename,
@@ -98,14 +99,13 @@
 
     if (expected_type == net::SERVER_CERT || expected_type == net::CA_CERT) {
       ASSERT_EQ(1u, public_list_.size());
-      EXPECT_EQ(expected_type,
-                certificate::GetCertType(public_list_[0]->os_cert_handle()));
+      EXPECT_EQ(expected_type, certificate::GetCertType(public_list_[0].get()));
       EXPECT_TRUE(private_list_.empty());
     } else {  // net::USER_CERT
       EXPECT_TRUE(public_list_.empty());
       ASSERT_EQ(1u, private_list_.size());
       EXPECT_EQ(expected_type,
-                certificate::GetCertType(private_list_[0]->os_cert_handle()));
+                certificate::GetCertType(private_list_[0].get()));
     }
 
     base::DictionaryValue* certificate = NULL;
@@ -123,45 +123,36 @@
   std::unique_ptr<net::NSSCertDatabaseChromeOS> test_nssdb_;
   std::unique_ptr<base::ListValue> onc_certificates_;
   // List of certs in the nssdb's public slot.
-  net::CertificateList public_list_;
+  net::ScopedCERTCertificateList public_list_;
   // List of certs in the nssdb's "private" slot.
-  net::CertificateList private_list_;
-  net::CertificateList web_trust_certificates_;
+  net::ScopedCERTCertificateList private_list_;
+  net::ScopedCERTCertificateList web_trust_certificates_;
 
  private:
-  net::CertificateList ListCertsInPublicSlot() {
+  net::ScopedCERTCertificateList ListCertsInPublicSlot() {
     return ListCertsInSlot(public_nssdb_.slot());
   }
 
-  net::CertificateList ListCertsInPrivateSlot() {
+  net::ScopedCERTCertificateList ListCertsInPrivateSlot() {
     return ListCertsInSlot(private_nssdb_.slot());
   }
 
-  net::CertificateList ListCertsInSlot(PK11SlotInfo* slot) {
-    net::CertificateList result;
+  net::ScopedCERTCertificateList ListCertsInSlot(PK11SlotInfo* slot) {
+    net::ScopedCERTCertificateList result;
     CERTCertList* cert_list = PK11_ListCertsInSlot(slot);
     for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list);
          !CERT_LIST_END(node, cert_list);
          node = CERT_LIST_NEXT(node)) {
-      scoped_refptr<net::X509Certificate> cert =
-          net::X509Certificate::CreateFromHandle(
-              node->cert, net::X509Certificate::OSCertHandles());
-      if (!cert) {
-        ADD_FAILURE() << "X509Certificate::CreateFromHandle failed";
-        continue;
-      }
-      result.push_back(cert);
+      result.push_back(net::x509_util::DupCERTCertificate(node->cert));
     }
     CERT_DestroyCertList(cert_list);
 
     std::sort(result.begin(), result.end(),
-              [](const scoped_refptr<net::X509Certificate>& lhs,
-                 const scoped_refptr<net::X509Certificate>& rhs) {
+              [](const net::ScopedCERTCertificate& lhs,
+                 const net::ScopedCERTCertificate& rhs) {
                 return net::SHA256HashValueLessThan()(
-                    net::X509Certificate::CalculateFingerprint256(
-                        lhs->os_cert_handle()),
-                    net::X509Certificate::CalculateFingerprint256(
-                        rhs->os_cert_handle()));
+                    net::x509_util::CalculateFingerprint256(lhs.get()),
+                    net::x509_util::CalculateFingerprint256(rhs.get()));
               });
     return result;
   }
@@ -234,8 +225,8 @@
   ASSERT_EQ(1u, web_trust_certificates_.size());
   ASSERT_EQ(1u, public_list_.size());
   EXPECT_TRUE(private_list_.empty());
-  EXPECT_TRUE(CERT_CompareCerts(public_list_[0]->os_cert_handle(),
-                                web_trust_certificates_[0]->os_cert_handle()));
+  EXPECT_TRUE(CERT_CompareCerts(public_list_[0].get(),
+                                web_trust_certificates_[0].get()));
 }
 
 TEST_F(ONCCertificateImporterImplTest, AddWebAuthorityCertificateWithWebTrust) {
@@ -252,8 +243,8 @@
   ASSERT_EQ(1u, web_trust_certificates_.size());
   ASSERT_EQ(1u, public_list_.size());
   EXPECT_TRUE(private_list_.empty());
-  EXPECT_TRUE(CERT_CompareCerts(public_list_[0]->os_cert_handle(),
-                                web_trust_certificates_[0]->os_cert_handle()));
+  EXPECT_TRUE(CERT_CompareCerts(public_list_[0].get(),
+                                web_trust_certificates_[0].get()));
 }
 
 TEST_F(ONCCertificateImporterImplTest, AddAuthorityCertificateWithoutWebTrust) {
diff --git a/chromeos/network/onc/onc_utils.cc b/chromeos/network/onc/onc_utils.cc
index ca91ea19..e2be595 100644
--- a/chromeos/network/onc/onc_utils.cc
+++ b/chromeos/network/onc/onc_utils.cc
@@ -48,6 +48,7 @@
 #include "net/base/host_port_pair.h"
 #include "net/cert/pem_tokenizer.h"
 #include "net/cert/x509_certificate.h"
+#include "net/cert/x509_util_nss.h"
 #include "net/proxy/proxy_bypass_rules.h"
 #include "net/proxy/proxy_config.h"
 #include "net/proxy/proxy_server.h"
@@ -548,11 +549,12 @@
   return success;
 }
 
-scoped_refptr<net::X509Certificate> DecodePEMCertificate(
+net::ScopedCERTCertificate DecodePEMCertificate(
     const std::string& pem_encoded) {
   std::string decoded = DecodePEM(pem_encoded);
-  scoped_refptr<net::X509Certificate> cert =
-      net::X509Certificate::CreateFromBytes(decoded.data(), decoded.size());
+  net::ScopedCERTCertificate cert =
+      net::x509_util::CreateCERTCertificateFromBytes(
+          reinterpret_cast<const uint8_t*>(decoded.data()), decoded.size());
   LOG_IF(ERROR, !cert.get()) << "Couldn't create certificate from X509 data: "
                              << decoded;
   return cert;
diff --git a/chromeos/network/onc/onc_utils.h b/chromeos/network/onc/onc_utils.h
index 2655c366..808d5b6 100644
--- a/chromeos/network/onc/onc_utils.h
+++ b/chromeos/network/onc/onc_utils.h
@@ -15,6 +15,7 @@
 #include "chromeos/chromeos_export.h"
 #include "chromeos/network/network_type_pattern.h"
 #include "components/onc/onc_constants.h"
+#include "net/cert/scoped_nss_types.h"
 
 class PrefService;
 
@@ -23,10 +24,6 @@
 class ListValue;
 }
 
-namespace net {
-class X509Certificate;
-}
-
 namespace user_manager {
 class User;
 }
@@ -126,8 +123,8 @@
     base::ListValue* certificates);
 
 // Parse the given PEM encoded certificate |pem_encoded| and create a
-// X509Certificate from it.
-CHROMEOS_EXPORT scoped_refptr<net::X509Certificate> DecodePEMCertificate(
+// CERTCertificate from it.
+CHROMEOS_EXPORT net::ScopedCERTCertificate DecodePEMCertificate(
     const std::string& pem_encoded);
 
 // Replaces all references by GUID to Server or CA certs by their PEM
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index e9dd30a..2113692 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -264,4 +264,15 @@
 // }
 const char kDeviceOffHours[] = "cros.device_off_hours";
 
+// An external data pref for the printer configurations download.
+const char kDevicePrintersConfigurations[] =
+    "cros.device.printer_configurations";
+// An enum specifying the access policy device printers should observe.
+const char kDevicePrintersAccessMode[] = "cros.device.printers_access_mode";
+// A list of strings representing device printer ids for which access is
+// restricted.
+const char kDevicePrintersBlacklist[] = "cros.device.printers_blacklist";
+// A list of strings representing the list of device printer ids which are
+// accessible.
+const char kDevicePrintersWhitelist[] = "cros.device.printers_whitelist";
 }  // namespace chromeos
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index f7f0b01..7250a91 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -123,6 +123,11 @@
 
 CHROMEOS_EXPORT extern const char kDeviceOffHours[];
 
+CHROMEOS_EXPORT extern const char kDevicePrintersConfigurations[];
+CHROMEOS_EXPORT extern const char kDevicePrintersAccessMode[];
+CHROMEOS_EXPORT extern const char kDevicePrintersBlacklist[];
+CHROMEOS_EXPORT extern const char kDevicePrintersWhitelist[];
+
 }  // namespace chromeos
 
 #endif  // CHROMEOS_SETTINGS_CROS_SETTINGS_NAMES_H_
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 3592db0..882f61b 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -267,6 +267,8 @@
       "//ui/gfx",
       "//v8:v8_external_startup_data_assets",
     ]
+  } else {  # !is_android
+    deps += [ "//components/keep_alive_registry:unit_tests" ]
   }
 
   # Desktop-only deps.
diff --git a/components/autofill/content/common/autofill_message_generator.cc b/components/autofill/content/common/autofill_message_generator.cc
index 10fe932..3f84a59 100644
--- a/components/autofill/content/common/autofill_message_generator.cc
+++ b/components/autofill/content/common/autofill_message_generator.cc
@@ -14,13 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/autofill/content/common/autofill_param_traits_macros.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef COMPONENTS_AUTOFILL_CONTENT_COMMON_AUTOFILL_PARAM_TRAITS_MACROS_H_
-#include "components/autofill/content/common/autofill_param_traits_macros.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/browser_sync/profile_sync_service_bookmark_unittest.cc b/components/browser_sync/profile_sync_service_bookmark_unittest.cc
index 1554454..821b526 100644
--- a/components/browser_sync/profile_sync_service_bookmark_unittest.cc
+++ b/components/browser_sync/profile_sync_service_bookmark_unittest.cc
@@ -11,12 +11,12 @@
 
 #include <map>
 #include <memory>
-#include <queue>
 #include <stack>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/containers/queue.h"
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/macros.h"
@@ -2410,7 +2410,7 @@
     const BookmarkNode* root,
     BookmarkNodeVersionMap* node_versions) {
   node_versions->clear();
-  std::queue<const BookmarkNode*> nodes;
+  base::queue<const BookmarkNode*> nodes;
   nodes.push(root);
   while (!nodes.empty()) {
     const BookmarkNode* n = nodes.front();
diff --git a/components/browsing_data/content/BUILD.gn b/components/browsing_data/content/BUILD.gn
index dc5b1bd5..63c1b92f 100644
--- a/components/browsing_data/content/BUILD.gn
+++ b/components/browsing_data/content/BUILD.gn
@@ -6,12 +6,17 @@
   sources = [
     "conditional_cache_counting_helper.cc",
     "conditional_cache_counting_helper.h",
+    "counters/site_settings_counter.cc",
+    "counters/site_settings_counter.h",
   ]
 
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 
   deps = [
     "//base",
+    "//components/browsing_data/core",
+    "//components/content_settings/core/browser",
+    "//components/content_settings/core/common",
     "//content/public/browser",
     "//net",
   ]
diff --git a/components/browsing_data/content/DEPS b/components/browsing_data/content/DEPS
index 8c57389..13343d7 100644
--- a/components/browsing_data/content/DEPS
+++ b/components/browsing_data/content/DEPS
@@ -1,4 +1,6 @@
 include_rules = [
+  "+components/content_settings/core/browser",
+  "+components/content_settings/core/common",
   "+content/public/browser",
-  "+net",
+  "+net"
 ]
diff --git a/components/browsing_data/core/counters/site_settings_counter.cc b/components/browsing_data/content/counters/site_settings_counter.cc
similarity index 60%
rename from components/browsing_data/core/counters/site_settings_counter.cc
rename to components/browsing_data/content/counters/site_settings_counter.cc
index fc6ecd6..2e8e6c4c 100644
--- a/components/browsing_data/core/counters/site_settings_counter.cc
+++ b/components/browsing_data/content/counters/site_settings_counter.cc
@@ -2,18 +2,29 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/browsing_data/core/counters/site_settings_counter.h"
+#include "components/browsing_data/content/counters/site_settings_counter.h"
 
 #include <set>
+#include "build/build_config.h"
 #include "components/browsing_data/core/pref_names.h"
 #include "components/content_settings/core/browser/content_settings_registry.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 
+#if !defined(OS_ANDROID)
+#include "content/public/browser/host_zoom_map.h"
+#endif
+
 namespace browsing_data {
 
-SiteSettingsCounter::SiteSettingsCounter(HostContentSettingsMap* map)
-    : map_(map) {
+SiteSettingsCounter::SiteSettingsCounter(HostContentSettingsMap* map,
+                                         content::HostZoomMap* zoom_map)
+    : map_(map), zoom_map_(zoom_map) {
   DCHECK(map_);
+#if !defined(OS_ANDROID)
+  DCHECK(zoom_map_);
+#else
+  DCHECK(!zoom_map_);
+#endif
 }
 
 SiteSettingsCounter::~SiteSettingsCounter() {}
@@ -25,7 +36,8 @@
 }
 
 void SiteSettingsCounter::Count() {
-  std::set<ContentSettingsPattern> patterns;
+  std::set<std::string> hosts;
+  int empty_host_pattern = 0;
   base::Time period_start = GetPeriodStart();
   auto* registry = content_settings::ContentSettingsRegistry::GetInstance();
   for (const content_settings::ContentSettingsInfo* info : *registry) {
@@ -39,12 +51,26 @@
             content_setting.primary_pattern, content_setting.secondary_pattern,
             type);
         if (last_modified >= period_start) {
-          patterns.insert(content_setting.primary_pattern);
+          if (content_setting.primary_pattern.GetHost().empty())
+            empty_host_pattern++;
+          else
+            hosts.insert(content_setting.primary_pattern.GetHost());
         }
       }
     }
   }
-  ReportResult(patterns.size());
+
+#if !defined(OS_ANDROID)
+  for (const auto& zoom_level : zoom_map_->GetAllZoomLevels()) {
+    // zoom_level with non-empty scheme are only used for some internal
+    // features and not stored in preferences. They are not counted.
+    if (zoom_level.last_modified >= period_start && zoom_level.scheme.empty()) {
+      hosts.insert(zoom_level.host);
+    }
+  }
+#endif
+
+  ReportResult(hosts.size() + empty_host_pattern);
 }
 
 }  // namespace browsing_data
diff --git a/components/browsing_data/core/counters/site_settings_counter.h b/components/browsing_data/content/counters/site_settings_counter.h
similarity index 61%
rename from components/browsing_data/core/counters/site_settings_counter.h
rename to components/browsing_data/content/counters/site_settings_counter.h
index bab835b..602e807 100644
--- a/components/browsing_data/core/counters/site_settings_counter.h
+++ b/components/browsing_data/content/counters/site_settings_counter.h
@@ -2,17 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_BROWSING_DATA_CORE_COUNTERS_SITE_SETTINGS_COUNTER_H_
-#define COMPONENTS_BROWSING_DATA_CORE_COUNTERS_SITE_SETTINGS_COUNTER_H_
+#ifndef COMPONENTS_BROWSING_DATA_CONTENT_COUNTERS_SITE_SETTINGS_COUNTER_H_
+#define COMPONENTS_BROWSING_DATA_CONTENT_COUNTERS_SITE_SETTINGS_COUNTER_H_
 
 #include "components/browsing_data/core/counters/browsing_data_counter.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 
+namespace content {
+class HostZoomMap;
+}
+
 namespace browsing_data {
 
 class SiteSettingsCounter : public browsing_data::BrowsingDataCounter {
  public:
-  explicit SiteSettingsCounter(HostContentSettingsMap* hcsm);
+  explicit SiteSettingsCounter(HostContentSettingsMap* map,
+                               content::HostZoomMap* zoom_map);
   ~SiteSettingsCounter() override;
 
   const char* GetPrefName() const override;
@@ -23,8 +28,9 @@
   void Count() override;
 
   scoped_refptr<HostContentSettingsMap> map_;
+  content::HostZoomMap* zoom_map_;
 };
 
 }  // namespace browsing_data
 
-#endif  // COMPONENTS_BROWSING_DATA_CORE_COUNTERS_SITE_SETTINGS_COUNTER_H_
+#endif  // COMPONENTS_BROWSING_DATA_CONTENT_COUNTERS_SITE_SETTINGS_COUNTER_H_
diff --git a/components/browsing_data/core/BUILD.gn b/components/browsing_data/core/BUILD.gn
index 4f0e479..c54f351d1 100644
--- a/components/browsing_data/core/BUILD.gn
+++ b/components/browsing_data/core/BUILD.gn
@@ -21,8 +21,6 @@
     "counters/history_counter.h",
     "counters/passwords_counter.cc",
     "counters/passwords_counter.h",
-    "counters/site_settings_counter.cc",
-    "counters/site_settings_counter.h",
     "counters/sync_tracker.cc",
     "counters/sync_tracker.h",
     "history_notice_utils.cc",
@@ -35,8 +33,6 @@
     "//base",
     "//components/autofill/core/browser",
     "//components/bookmarks/browser",
-    "//components/content_settings/core/browser",
-    "//components/content_settings/core/common",
     "//components/history/core/browser",
     "//components/password_manager/core/browser",
     "//components/pref_registry",
diff --git a/components/browsing_data/core/DEPS b/components/browsing_data/core/DEPS
index 17612bf..d88a839 100644
--- a/components/browsing_data/core/DEPS
+++ b/components/browsing_data/core/DEPS
@@ -2,7 +2,6 @@
   "+components/autofill/core/browser",
   "+components/bookmarks/browser",
   "+components/browser_sync",
-  "+components/content_settings",
   "+components/history/core/browser",
   "+components/history/core/test",
   "+components/password_manager/core/browser",
diff --git a/components/cast_channel/cast_transport.h b/components/cast_channel/cast_transport.h
index efb12ad9..3c5d1bc4 100644
--- a/components/cast_channel/cast_transport.h
+++ b/components/cast_channel/cast_transport.h
@@ -5,9 +5,9 @@
 #ifndef COMPONENTS_CAST_CHANNEL_CAST_TRANSPORT_H_
 #define COMPONENTS_CAST_CHANNEL_CAST_TRANSPORT_H_
 
-#include <queue>
 #include <string>
 
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequence_checker.h"
@@ -149,7 +149,7 @@
 
   // Queue of pending writes. The message at the front of the queue is the one
   // being written.
-  std::queue<WriteRequest> write_queue_;
+  base::queue<WriteRequest> write_queue_;
 
   // Buffer used for read operations. Reused for every read.
   scoped_refptr<net::GrowableIOBuffer> read_buffer_;
diff --git a/components/cast_channel/cast_transport_unittest.cc b/components/cast_channel/cast_transport_unittest.cc
index 8f72615e..9744323c 100644
--- a/components/cast_channel/cast_transport_unittest.cc
+++ b/components/cast_channel/cast_transport_unittest.cc
@@ -7,8 +7,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <queue>
-
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
@@ -79,7 +78,7 @@
   }
 
  private:
-  std::queue<net::CompletionCallback> cb_queue_;
+  base::queue<net::CompletionCallback> cb_queue_;
   DISALLOW_COPY_AND_ASSIGN(CompletionQueue);
 };
 
diff --git a/components/cdm/common/cdm_message_generator.cc b/components/cdm/common/cdm_message_generator.cc
index 3c3e260..2aabce7 100644
--- a/components/cdm/common/cdm_message_generator.cc
+++ b/components/cdm/common/cdm_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/cdm/common/cdm_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/cdm/common/cdm_message_generator.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/content_settings/core/common/content_settings_pattern.cc b/components/content_settings/core/common/content_settings_pattern.cc
index fed851c..40e5d630 100644
--- a/components/content_settings/core/common/content_settings_pattern.cc
+++ b/components/content_settings/core/common/content_settings_pattern.cc
@@ -575,6 +575,10 @@
   return SCHEME_OTHER;
 }
 
+const std::string& ContentSettingsPattern::GetHost() const {
+  return parts_.host;
+}
+
 bool ContentSettingsPattern::HasPath() const {
   DCHECK_EQ(GetScheme(), SCHEME_FILE);
   return !parts_.is_path_wildcard && !parts_.path.empty();
diff --git a/components/content_settings/core/common/content_settings_pattern.h b/components/content_settings/core/common/content_settings_pattern.h
index 6a55d3b..269d2c4 100644
--- a/components/content_settings/core/common/content_settings_pattern.h
+++ b/components/content_settings/core/common/content_settings_pattern.h
@@ -208,6 +208,9 @@
   // Returns scheme type of pattern.
   ContentSettingsPattern::SchemeType GetScheme() const;
 
+  // Returns the host of a pattern.
+  const std::string& GetHost() const;
+
   // True if this pattern has a non-empty path.  Can only be used for patterns
   // with file: schemes.
   bool HasPath() const;
diff --git a/components/cronet/android/cronet_url_request_context_adapter.h b/components/cronet/android/cronet_url_request_context_adapter.h
index 23c95f9..7759470 100644
--- a/components/cronet/android/cronet_url_request_context_adapter.h
+++ b/components/cronet/android/cronet_url_request_context_adapter.h
@@ -9,11 +9,11 @@
 #include <stdint.h>
 
 #include <memory>
-#include <queue>
 #include <string>
 
 #include "base/android/scoped_java_ref.h"
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread.h"
@@ -250,7 +250,7 @@
   std::unique_ptr<base::DictionaryValue> effective_experimental_options_;
 
   // A queue of tasks that need to be run after context has been initialized.
-  std::queue<base::Closure> tasks_waiting_for_context_;
+  base::queue<base::Closure> tasks_waiting_for_context_;
   bool is_context_initialized_;
   int default_load_flags_;
 
diff --git a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.h b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.h
index 605efb5d..7eb0f4bf 100644
--- a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.h
+++ b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.h
@@ -9,9 +9,9 @@
 
 #include <map>
 #include <memory>
-#include <queue>
 #include <string>
 
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
@@ -247,12 +247,12 @@
   // The WriteRequest that is currently being sent as well as those queued to be
   // sent. Each WriteRequest corresponds to one uWeave packet to be sent.
   std::unique_ptr<WriteRequest> pending_write_request_;
-  std::queue<std::unique_ptr<WriteRequest>> queued_write_requests_;
+  base::queue<std::unique_ptr<WriteRequest>> queued_write_requests_;
 
   // WireMessages queued to be sent. Each WireMessage correponds to one or more
   // WriteRequests. WireMessages remain in this queue until the last
   // corresponding WriteRequest has been sent.
-  std::queue<std::unique_ptr<WireMessage>> queued_wire_messages_;
+  base::queue<std::unique_ptr<WireMessage>> queued_wire_messages_;
 
   base::WeakPtrFactory<BluetoothLowEnergyWeaveClientConnection>
       weak_ptr_factory_;
diff --git a/components/cryptauth/device_capability_manager.h b/components/cryptauth/device_capability_manager.h
index 4a40037..71b0bc17 100644
--- a/components/cryptauth/device_capability_manager.h
+++ b/components/cryptauth/device_capability_manager.h
@@ -5,10 +5,9 @@
 #ifndef COMPONENTS_CRYPTAUTH_DEVICE_CAPABILITY_MANAGER_H_
 #define COMPONENTS_CRYPTAUTH_DEVICE_CAPABILITY_MANAGER_H_
 
-#include <queue>
-
 #include "base/bind.h"
 #include "base/callback_forward.h"
+#include "base/containers/queue.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "components/cryptauth/cryptauth_client.h"
@@ -134,7 +133,7 @@
 
   std::unique_ptr<CryptAuthClient> current_cryptauth_client_;
   std::unique_ptr<Request> current_request_;
-  std::queue<std::unique_ptr<Request>> pending_requests_;
+  base::queue<std::unique_ptr<Request>> pending_requests_;
   CryptAuthClientFactory* crypt_auth_client_factory_;
   base::WeakPtrFactory<DeviceCapabilityManager> weak_ptr_factory_;
 };
diff --git a/components/cryptauth/secure_channel.h b/components/cryptauth/secure_channel.h
index 289500bd..b91d0b0 100644
--- a/components/cryptauth/secure_channel.h
+++ b/components/cryptauth/secure_channel.h
@@ -5,8 +5,7 @@
 #ifndef COMPONENTS_CRYPTAUTH_SECURE_CHANNEL_H_
 #define COMPONENTS_CRYPTAUTH_SECURE_CHANNEL_H_
 
-#include <queue>
-
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "components/cryptauth/authenticator.h"
@@ -151,7 +150,7 @@
   CryptAuthService* cryptauth_service_;  // Outlives this instance.
   std::unique_ptr<Authenticator> authenticator_;
   std::unique_ptr<SecureContext> secure_context_;
-  std::queue<std::unique_ptr<PendingMessage>> queued_messages_;
+  base::queue<std::unique_ptr<PendingMessage>> queued_messages_;
   std::unique_ptr<PendingMessage> pending_message_;
   int next_sequence_number_ = 0;
   base::ObserverList<Observer> observer_list_;
diff --git a/components/data_reduction_proxy/content/browser/BUILD.gn b/components/data_reduction_proxy/content/browser/BUILD.gn
index e6de8f9..3e45f3e 100644
--- a/components/data_reduction_proxy/content/browser/BUILD.gn
+++ b/components/data_reduction_proxy/content/browser/BUILD.gn
@@ -16,6 +16,7 @@
     "//base",
     "//components/data_reduction_proxy/core/browser",
     "//components/data_reduction_proxy/core/common",
+    "//components/previews/core:core",
     "//content/public/browser",
     "//content/public/common",
     "//net",
diff --git a/components/data_reduction_proxy/content/browser/DEPS b/components/data_reduction_proxy/content/browser/DEPS
index b2f6f8e..ad73853 100644
--- a/components/data_reduction_proxy/content/browser/DEPS
+++ b/components/data_reduction_proxy/content/browser/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
   "+net",
+  "+components/previews/core:core",
 ]
\ No newline at end of file
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
index e8351437..cee17dc 100644
--- a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
+++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
@@ -13,12 +13,14 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
+#include "components/previews/core/previews_decider.h"
 #include "content/public/browser/resource_request_info.h"
 #include "content/public/common/previews_state.h"
 #include "content/public/common/resource_type.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_request_headers.h"
 #include "net/url_request/url_request.h"
+#include "url/gurl.h"
 
 namespace data_reduction_proxy {
 
@@ -168,4 +170,24 @@
   return request_info &&
          (request_info->GetPreviewsState() & content::CLIENT_LOFI_AUTO_RELOAD);
 }
+
+void ContentLoFiDecider::MaybeApplyAMPPreview(
+    net::URLRequest* request,
+    GURL* new_url,
+    previews::PreviewsDecider* previews_decider) const {
+  const content::ResourceRequestInfo* request_info =
+      content::ResourceRequestInfo::ForRequest(request);
+  if (!request_info ||
+      request_info->GetResourceType() != content::RESOURCE_TYPE_MAIN_FRAME ||
+      !previews::params::IsAMPRedirectionPreviewEnabled() ||
+      !request->url().has_host() ||
+      !previews_decider->ShouldAllowPreview(
+          *request, previews::PreviewsType::AMP_REDIRECTION)) {
+    return;
+  }
+
+  // TODO(rajendrant): Apply the matching logic for |request| and update
+  // |new_url| to its AMP version.
+}
+
 }  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.h b/components/data_reduction_proxy/content/browser/content_lofi_decider.h
index f508a64b..41a1cfe 100644
--- a/components/data_reduction_proxy/content/browser/content_lofi_decider.h
+++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.h
@@ -8,11 +8,17 @@
 #include "components/data_reduction_proxy/core/common/lofi_decider.h"
 #include "base/macros.h"
 
+class GURL;
+
 namespace net {
 class HttpRequestHeaders;
 class URLRequest;
 }
 
+namespace previews {
+class PreviewsDecider;
+}
+
 namespace data_reduction_proxy {
 
 // Class responsible for deciding whether a request should be requested with low
@@ -42,6 +48,11 @@
   bool IsClientLoFiAutoReloadRequest(
       const net::URLRequest& request) const override;
 
+  void MaybeApplyAMPPreview(
+      net::URLRequest* request,
+      GURL* new_url,
+      previews::PreviewsDecider* previews_decider) const override;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(ContentLoFiDecider);
 };
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
index 24fb1506d..e0acd45 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.cc
@@ -29,6 +29,7 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
+#include "components/previews/core/previews_decider.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/http_user_agent_settings.h"
 #include "net/url_request/static_http_user_agent_settings.h"
@@ -421,4 +422,11 @@
       new DataReductionProxyDataUseObserver(this, data_use_ascriber));
 }
 
+void DataReductionProxyIOData::SetPreviewsDecider(
+    previews::PreviewsDecider* previews_decider) {
+  DCHECK(io_task_runner_->BelongsToCurrentThread());
+  DCHECK(previews_decider);
+  previews_decider_ = previews_decider;
+}
+
 }  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
index ed8d971..3334222 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h
@@ -77,6 +77,8 @@
   virtual void SetDataReductionProxyService(
       base::WeakPtr<DataReductionProxyService> data_reduction_proxy_service);
 
+  void SetPreviewsDecider(previews::PreviewsDecider* previews_decider);
+
   // Creates an interceptor suitable for following the Data Reduction Proxy
   // bypass protocol.
   std::unique_ptr<net::URLRequestInterceptor> CreateInterceptor();
@@ -208,6 +210,10 @@
     resource_type_provider_ = std::move(resource_type_provider);
   }
 
+  previews::PreviewsDecider* previews_decider() const {
+    return previews_decider_;
+  }
+
   // The production channel of this build.
   std::string channel() const { return channel_; }
 
@@ -288,6 +294,10 @@
   // Observes pageload events and records per host data use.
   std::unique_ptr<DataReductionProxyDataUseObserver> data_use_observer_;
 
+  // Previews IO data that is owned by Profile IO data. Deleted at the same time
+  // as |this|.
+  previews::PreviewsDecider* previews_decider_;
+
   // Whether the Data Reduction Proxy has been enabled or not by the user. In
   // practice, this can be overridden by the command line.
   bool enabled_;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
index 2a6445a..5b270e8 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
@@ -323,6 +323,13 @@
       (request->load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED)) {
     data_reduction_proxy_io_data_->SetLoFiModeActiveOnMainFrame(false);
   }
+
+  if (data_reduction_proxy_io_data_ &&
+      data_reduction_proxy_io_data_->lofi_decider() &&
+      data_reduction_proxy_io_data_->IsEnabled()) {
+    data_reduction_proxy_io_data_->lofi_decider()->MaybeApplyAMPPreview(
+        request, new_url, data_reduction_proxy_io_data_->previews_decider());
+  }
 }
 
 void DataReductionProxyNetworkDelegate::OnBeforeStartTransactionInternal(
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc
index 3151e620..c89ac20 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate_unittest.cc
@@ -259,6 +259,13 @@
     return false;
   }
 
+  void MaybeApplyAMPPreview(
+      net::URLRequest* request,
+      GURL* new_url,
+      previews::PreviewsDecider* previews_decider) const override {
+    return;
+  }
+
   void RemoveAcceptTransformHeader(
       net::HttpRequestHeaders* headers) const override {
     if (ignore_is_using_data_reduction_proxy_check_)
diff --git a/components/data_reduction_proxy/core/common/lofi_decider.h b/components/data_reduction_proxy/core/common/lofi_decider.h
index bb30d06e..57f90a8 100644
--- a/components/data_reduction_proxy/core/common/lofi_decider.h
+++ b/components/data_reduction_proxy/core/common/lofi_decider.h
@@ -7,11 +7,17 @@
 
 #include "base/macros.h"
 
+class GURL;
+
 namespace net {
 class HttpRequestHeaders;
 class URLRequest;
 }
 
+namespace previews {
+class PreviewsDecider;
+}
+
 namespace data_reduction_proxy {
 
 // Interface to determine if a request should be made for a low fidelity version
@@ -59,6 +65,12 @@
   // automatically reloaded because of a decoding error.
   virtual bool IsClientLoFiAutoReloadRequest(
       const net::URLRequest& request) const = 0;
+
+  // Applies the AMP redirection preview by changing the |new_url|.
+  virtual void MaybeApplyAMPPreview(
+      net::URLRequest* request,
+      GURL* new_url,
+      previews::PreviewsDecider* previews_decider) const = 0;
 };
 
 }  // namespace data_reduction_proxy
diff --git a/components/guest_view/common/guest_view_message_generator.cc b/components/guest_view/common/guest_view_message_generator.cc
index a55a976a..6a0bca1 100644
--- a/components/guest_view/common/guest_view_message_generator.cc
+++ b/components/guest_view/common/guest_view_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/guest_view/common/guest_view_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/guest_view/common/guest_view_message_generator.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/history/core/browser/expire_history_backend.h b/components/history/core/browser/expire_history_backend.h
index f47666e4..824e822 100644
--- a/components/history/core/browser/expire_history_backend.h
+++ b/components/history/core/browser/expire_history_backend.h
@@ -6,10 +6,10 @@
 #define COMPONENTS_HISTORY_CORE_BROWSER_EXPIRE_HISTORY_BACKEND_H_
 
 #include <memory>
-#include <queue>
 #include <set>
 #include <vector>
 
+#include "base/containers/queue.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
@@ -269,7 +269,7 @@
   // Work queue for periodic expiration tasks, used by DoExpireIteration() to
   // determine what to do at an iteration, as well as populate it for future
   // iterations.
-  std::queue<const ExpiringVisitsReader*> work_queue_;
+  base::queue<const ExpiringVisitsReader*> work_queue_;
 
   // Readers for various types of visits.
   // TODO(dglazkov): If you are adding another one, please consider reorganizing
diff --git a/components/keep_alive_registry/BUILD.gn b/components/keep_alive_registry/BUILD.gn
new file mode 100644
index 0000000..a2d8813
--- /dev/null
+++ b/components/keep_alive_registry/BUILD.gn
@@ -0,0 +1,36 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+assert(!is_android)
+
+source_set("keep_alive_registry") {
+  sources = [
+    "keep_alive_registry.cc",
+    "keep_alive_registry.h",
+    "keep_alive_state_observer.h",
+    "keep_alive_types.cc",
+    "keep_alive_types.h",
+    "scoped_keep_alive.cc",
+    "scoped_keep_alive.h",
+  ]
+
+  deps = [
+    "//base",
+  ]
+
+  if (is_win) {
+    deps += [ "//components/browser_watcher:stability_client" ]
+  }
+}
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [
+    "keep_alive_registry_unittest.cc",
+  ]
+  deps = [
+    ":keep_alive_registry",
+    "//testing/gtest",
+  ]
+}
diff --git a/components/keep_alive_registry/DEPS b/components/keep_alive_registry/DEPS
new file mode 100644
index 0000000..5cb0221
--- /dev/null
+++ b/components/keep_alive_registry/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+components/browser_watcher",
+]
diff --git a/chrome/browser/lifetime/keep_alive_registry.cc b/components/keep_alive_registry/keep_alive_registry.cc
similarity index 93%
rename from chrome/browser/lifetime/keep_alive_registry.cc
rename to components/keep_alive_registry/keep_alive_registry.cc
index bebc5c1..e29e94c0 100644
--- a/chrome/browser/lifetime/keep_alive_registry.cc
+++ b/components/keep_alive_registry/keep_alive_registry.cc
@@ -2,13 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/lifetime/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
 
+#include "base/logging.h"
 #include "build/build_config.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_state_observer.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
+#include "components/keep_alive_registry/keep_alive_state_observer.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 
 #if defined(OS_WIN)
 #include "components/browser_watcher/stability_data_names.h"
@@ -73,6 +72,12 @@
   return registered_count == restart_allowed_count;
 }
 
+void KeepAliveRegistry::SetIsShuttingDown(bool value) {
+#if DCHECK_IS_ON()
+  is_shutting_down_ = value;
+#endif
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Private methods
 
@@ -86,7 +91,9 @@
 
 void KeepAliveRegistry::Register(KeepAliveOrigin origin,
                                  KeepAliveRestartOption restart) {
-  DCHECK(!g_browser_process->IsShuttingDown());
+#if DCHECK_IS_ON()
+  DCHECK(!is_shutting_down_);
+#endif
 
   bool old_keeping_alive = IsKeepingAlive();
   bool old_restart_allowed = IsRestartAllowed();
diff --git a/chrome/browser/lifetime/keep_alive_registry.h b/components/keep_alive_registry/keep_alive_registry.h
similarity index 87%
rename from chrome/browser/lifetime/keep_alive_registry.h
rename to components/keep_alive_registry/keep_alive_registry.h
index 383e0be..156b3292 100644
--- a/chrome/browser/lifetime/keep_alive_registry.h
+++ b/components/keep_alive_registry/keep_alive_registry.h
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_LIFETIME_KEEP_ALIVE_REGISTRY_H_
-#define CHROME_BROWSER_LIFETIME_KEEP_ALIVE_REGISTRY_H_
+#ifndef COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_REGISTRY_H_
+#define COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_REGISTRY_H_
 
 #include <unordered_map>
 #include <vector>
 
+#include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/singleton.h"
 #include "base/observer_list.h"
@@ -41,6 +42,9 @@
   // provided |origins| were not registered.
   bool WouldRestartWithout(const std::vector<KeepAliveOrigin>& origins) const;
 
+  // Call when shutting down to ensure registering a new KeepAlive DCHECKs.
+  void SetIsShuttingDown(bool value = true);
+
  private:
   friend struct base::DefaultSingletonTraits<KeepAliveRegistry>;
   // Friend to be able to use Register/Unregister
@@ -87,10 +91,14 @@
   // Number of registered keep alives that have KeepAliveRestartOption::ENABLED.
   int restart_allowed_count_;
 
+#if DCHECK_IS_ON()
+  // Used to guard against registering during shutdown.
+  bool is_shutting_down_ = false;
+#endif
+
   base::ObserverList<KeepAliveStateObserver> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(KeepAliveRegistry);
 };
 
-
-#endif  // CHROME_BROWSER_LIFETIME_KEEP_ALIVE_REGISTRY_H_
+#endif  // COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_REGISTRY_H_
diff --git a/chrome/browser/lifetime/keep_alive_registry_unittest.cc b/components/keep_alive_registry/keep_alive_registry_unittest.cc
similarity index 95%
rename from chrome/browser/lifetime/keep_alive_registry_unittest.cc
rename to components/keep_alive_registry/keep_alive_registry_unittest.cc
index 768c3d7..532e4a5 100644
--- a/chrome/browser/lifetime/keep_alive_registry_unittest.cc
+++ b/components/keep_alive_registry/keep_alive_registry_unittest.cc
@@ -2,14 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/lifetime/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
 
 #include <memory>
 
-#include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/lifetime/keep_alive_state_observer.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
+#include "components/keep_alive_registry/keep_alive_state_observer.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 class KeepAliveRegistryTest : public testing::Test,
diff --git a/chrome/browser/lifetime/keep_alive_state_observer.h b/components/keep_alive_registry/keep_alive_state_observer.h
similarity index 65%
rename from chrome/browser/lifetime/keep_alive_state_observer.h
rename to components/keep_alive_registry/keep_alive_state_observer.h
index 9cc5af1c..4ae0a9a 100644
--- a/chrome/browser/lifetime/keep_alive_state_observer.h
+++ b/components/keep_alive_registry/keep_alive_state_observer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_LIFETIME_KEEP_ALIVE_STATE_OBSERVER_H_
-#define CHROME_BROWSER_LIFETIME_KEEP_ALIVE_STATE_OBSERVER_H_
+#ifndef COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_STATE_OBSERVER_H_
+#define COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_STATE_OBSERVER_H_
 
 class KeepAliveStateObserver {
  public:
@@ -14,4 +14,4 @@
   virtual ~KeepAliveStateObserver() {}
 };
 
-#endif  // CHROME_BROWSER_LIFETIME_KEEP_ALIVE_STATE_OBSERVER_H_
+#endif  // COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_STATE_OBSERVER_H_
diff --git a/chrome/browser/lifetime/keep_alive_types.cc b/components/keep_alive_registry/keep_alive_types.cc
similarity index 97%
rename from chrome/browser/lifetime/keep_alive_types.cc
rename to components/keep_alive_registry/keep_alive_types.cc
index 73fd104..c25d567 100644
--- a/chrome/browser/lifetime/keep_alive_types.cc
+++ b/components/keep_alive_registry/keep_alive_types.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/lifetime/keep_alive_types.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 #include "base/logging.h"
 
 std::ostream& operator<<(std::ostream& out, const KeepAliveOrigin& origin) {
diff --git a/chrome/browser/lifetime/keep_alive_types.h b/components/keep_alive_registry/keep_alive_types.h
similarity index 88%
rename from chrome/browser/lifetime/keep_alive_types.h
rename to components/keep_alive_registry/keep_alive_types.h
index 5e81cf0..fbef5ec 100644
--- a/chrome/browser/lifetime/keep_alive_types.h
+++ b/components/keep_alive_registry/keep_alive_types.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_LIFETIME_KEEP_ALIVE_TYPES_H_
-#define CHROME_BROWSER_LIFETIME_KEEP_ALIVE_TYPES_H_
+#ifndef COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_TYPES_H_
+#define COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_TYPES_H_
 
 #include <ostream>
 
@@ -55,4 +55,4 @@
 std::ostream& operator<<(std::ostream& out,
                          const KeepAliveRestartOption& restart);
 
-#endif  // CHROME_BROWSER_LIFETIME_KEEP_ALIVE_TYPES_H_
+#endif  // COMPONENTS_KEEP_ALIVE_REGISTRY_KEEP_ALIVE_TYPES_H_
diff --git a/chrome/browser/lifetime/scoped_keep_alive.cc b/components/keep_alive_registry/scoped_keep_alive.cc
similarity index 72%
rename from chrome/browser/lifetime/scoped_keep_alive.cc
rename to components/keep_alive_registry/scoped_keep_alive.cc
index 42c2b9d..325a4ca3 100644
--- a/chrome/browser/lifetime/scoped_keep_alive.cc
+++ b/components/keep_alive_registry/scoped_keep_alive.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/lifetime/scoped_keep_alive.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 
-#include "chrome/browser/lifetime/keep_alive_registry.h"
-#include "chrome/browser/lifetime/keep_alive_types.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 
 ScopedKeepAlive::ScopedKeepAlive(KeepAliveOrigin origin,
                                  KeepAliveRestartOption restart)
diff --git a/chrome/browser/lifetime/scoped_keep_alive.h b/components/keep_alive_registry/scoped_keep_alive.h
similarity index 81%
rename from chrome/browser/lifetime/scoped_keep_alive.h
rename to components/keep_alive_registry/scoped_keep_alive.h
index 48c32680..8260c80 100644
--- a/chrome/browser/lifetime/scoped_keep_alive.h
+++ b/components/keep_alive_registry/scoped_keep_alive.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_LIFETIME_SCOPED_KEEP_ALIVE_H_
-#define CHROME_BROWSER_LIFETIME_SCOPED_KEEP_ALIVE_H_
+#ifndef COMPONENTS_KEEP_ALIVE_REGISTRY_SCOPED_KEEP_ALIVE_H_
+#define COMPONENTS_KEEP_ALIVE_REGISTRY_SCOPED_KEEP_ALIVE_H_
 
 #include "base/macros.h"
 
@@ -26,4 +26,4 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedKeepAlive);
 };
 
-#endif  // CHROME_BROWSER_LIFETIME_SCOPED_KEEP_ALIVE_H_
+#endif  // COMPONENTS_KEEP_ALIVE_REGISTRY_SCOPED_KEEP_ALIVE_H_
diff --git a/components/nacl/common/OWNERS b/components/nacl/common/OWNERS
index 269d32a..e02997a 100644
--- a/components/nacl/common/OWNERS
+++ b/components/nacl/common/OWNERS
@@ -4,3 +4,5 @@
 per-file *.mojom=file://ipc/SECURITY_OWNERS
 per-file *_param_traits*.*=set noparent
 per-file *_param_traits*.*=file://ipc/SECURITY_OWNERS
+per-file *_messages.cc=set noparent

+per-file *_messages.cc=file://ipc/SECURITY_OWNERS

diff --git a/components/nacl/common/nacl_host_messages.cc b/components/nacl/common/nacl_host_messages.cc
index 37d6db6..1b47272 100644
--- a/components/nacl/common/nacl_host_messages.cc
+++ b/components/nacl/common/nacl_host_messages.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/nacl/common/nacl_host_messages.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/nacl/common/nacl_host_messages.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/nacl/common/nacl_messages.cc b/components/nacl/common/nacl_messages.cc
index e1a5720e..21407368 100644
--- a/components/nacl/common/nacl_messages.cc
+++ b/components/nacl/common/nacl_messages.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/nacl/common/nacl_messages.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/nacl/common/nacl_messages.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/nacl/common/nacl_types_param_traits.cc b/components/nacl/common/nacl_types_param_traits.cc
index 900975b..a295163 100644
--- a/components/nacl/common/nacl_types_param_traits.cc
+++ b/components/nacl/common/nacl_types_param_traits.cc
@@ -16,13 +16,6 @@
 #undef COMPONENTS_NACL_COMMON_NACL_TYPES_PARAM_TRAITS_H_
 #include "components/nacl/common/nacl_types_param_traits.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef COMPONENTS_NACL_COMMON_NACL_TYPES_PARAM_TRAITS_H_
-#include "components/nacl/common/nacl_types_param_traits.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/nacl/loader/nacl_ipc_adapter.h b/components/nacl/loader/nacl_ipc_adapter.h
index f48ff32..647cd102 100644
--- a/components/nacl/loader/nacl_ipc_adapter.h
+++ b/components/nacl/loader/nacl_ipc_adapter.h
@@ -9,11 +9,11 @@
 
 #include <map>
 #include <memory>
-#include <queue>
 #include <string>
 #include <vector>
 
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/files/scoped_file.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
@@ -153,7 +153,7 @@
 
     // Messages that we have read off of the Chrome IPC channel that are waiting
     // to be received by the plugin.
-    std::queue<std::unique_ptr<RewrittenMessage>> to_be_received_;
+    base::queue<std::unique_ptr<RewrittenMessage>> to_be_received_;
 
     ppapi::proxy::NaClMessageScanner nacl_msg_scanner_;
 
diff --git a/components/network_hints/common/network_hints_message_generator.cc b/components/network_hints/common/network_hints_message_generator.cc
index 594871a..f315e98 100644
--- a/components/network_hints/common/network_hints_message_generator.cc
+++ b/components/network_hints/common/network_hints_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/network_hints/common/network_hints_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/network_hints/common/network_hints_message_generator.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
index d0c9f1d9..4f7098b 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
@@ -6,11 +6,11 @@
 #define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
 
 #include <memory>
-#include <queue>
 #include <string>
 #include <vector>
 
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/optional.h"
 #include "base/time/clock.h"
 #include "components/ntp_snippets/category.h"
@@ -83,8 +83,8 @@
   scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
 
   // Stores requests that wait for an access token.
-  std::queue<std::pair<internal::ContextualJsonRequest::Builder,
-                       SuggestionsAvailableCallback>>
+  base::queue<std::pair<internal::ContextualJsonRequest::Builder,
+                        SuggestionsAvailableCallback>>
       pending_requests_;
 
   const ParseJSONCallback parse_json_callback_;
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h b/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h
index 770ea50..cfcfce2 100644
--- a/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h
+++ b/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h
@@ -6,12 +6,12 @@
 #define COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_IMPL_H_
 
 #include <memory>
-#include <queue>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/optional.h"
 #include "base/time/clock.h"
 #include "components/ntp_snippets/remote/json_request.h"
@@ -114,7 +114,7 @@
   scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
 
   // Stores requests that wait for an access token.
-  std::queue<
+  base::queue<
       std::pair<internal::JsonRequest::Builder, SnippetsAvailableCallback>>
       pending_requests_;
 
diff --git a/components/offline_pages/core/offline_page_metadata_store.h b/components/offline_pages/core/offline_page_metadata_store.h
index fdc1f4e8..acf43c84 100644
--- a/components/offline_pages/core/offline_page_metadata_store.h
+++ b/components/offline_pages/core/offline_page_metadata_store.h
@@ -38,8 +38,7 @@
 
   typedef base::Callback<void(bool /* success */)> InitializeCallback;
   typedef base::Callback<void(bool /* success */)> ResetCallback;
-  typedef base::Callback<void(const std::vector<OfflinePageItem>&)>
-      LoadCallback;
+  typedef base::Callback<void(std::vector<OfflinePageItem>)> LoadCallback;
   typedef base::Callback<void(ItemActionStatus)> AddCallback;
   typedef base::Callback<void(std::unique_ptr<OfflinePagesUpdateResult>)>
       UpdateCallback;
diff --git a/components/offline_pages/core/offline_page_metadata_store_sql.cc b/components/offline_pages/core/offline_page_metadata_store_sql.cc
index 8daeeaf..24285ac 100644
--- a/components/offline_pages/core/offline_page_metadata_store_sql.cc
+++ b/components/offline_pages/core/offline_page_metadata_store_sql.cc
@@ -263,7 +263,11 @@
   return item;
 }
 
-ItemActionStatus Insert(sql::Connection* db, const OfflinePageItem& item) {
+ItemActionStatus AddOfflinePageSync(const OfflinePageItem& item,
+                                    sql::Connection* db) {
+  if (!db)
+    return ItemActionStatus::STORE_ERROR;
+
   // Using 'INSERT OR FAIL' or 'INSERT OR ABORT' in the query below causes debug
   // builds to DLOG.
   const char kSql[] =
@@ -330,14 +334,8 @@
   return statement.Run() && db->GetLastChangeCount() > 0;
 }
 
-bool InitDatabase(sql::Connection* db, base::FilePath path) {
-  db->set_page_size(4096);
-  db->set_cache_size(500);
-  db->set_histogram_tag("OfflinePageMetadata");
-  db->set_exclusive_locking();
-
+bool PrepareDirectory(const base::FilePath& path) {
   base::File::Error error = base::File::FILE_OK;
-
   if (!base::DirectoryExists(path.DirName())) {
     if (!base::CreateDirectoryAndGetError(path.DirName(), &error)) {
       LOG(ERROR) << "Failed to create offline pages db directory: "
@@ -349,6 +347,18 @@
   UMA_HISTOGRAM_ENUMERATION("OfflinePages.SQLStorage.CreateDirectoryResult",
                             -error, -base::File::FILE_ERROR_MAX);
 
+  return true;
+}
+
+bool InitDatabase(sql::Connection* db, const base::FilePath& path) {
+  db->set_page_size(4096);
+  db->set_cache_size(500);
+  db->set_histogram_tag("OfflinePageMetadata");
+  db->set_exclusive_locking();
+
+  if (!PrepareDirectory(path))
+    return false;
+
   if (!db->Open(path)) {
     LOG(ERROR) << "Failed to open database";
     return false;
@@ -369,19 +379,10 @@
   }
 }
 
-void OpenConnectionSync(
-    sql::Connection* db,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    const base::FilePath& path,
-    const base::Callback<void(StoreState)>& set_state_callback,
-    const OfflinePageMetadataStore::InitializeCallback& callback) {
-  bool success = InitDatabase(db, path);
-  // First set the state of the DB, then report to the caller.
-  // Sequence of these callbacks is important.
-  runner->PostTask(FROM_HERE, base::Bind(set_state_callback,
-                                         success ? StoreState::LOADED
-                                                 : StoreState::FAILED_LOADING));
-  runner->PostTask(FROM_HERE, base::Bind(callback, success));
+// This method does a simple check whether DB was initialized properly.
+// It is only relevant for direct call to Initialize.
+bool CheckDBLoadedSync(sql::Connection* db) {
+  return db != nullptr;
 }
 
 bool GetPageByOfflineIdSync(sql::Connection* db,
@@ -400,16 +401,15 @@
   return false;
 }
 
-void GetOfflinePagesSync(
-    sql::Connection* db,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    const base::Callback<void(StoreState)>& set_state_callback,
-    const OfflinePageMetadataStore::LoadCallback& callback) {
-  const char kSql[] = "SELECT * FROM " OFFLINE_PAGES_TABLE_NAME;
+std::vector<OfflinePageItem> GetOfflinePagesSync(sql::Connection* db) {
+  std::vector<OfflinePageItem> result;
 
+  if (!db)
+    return result;
+
+  const char kSql[] = "SELECT * FROM " OFFLINE_PAGES_TABLE_NAME;
   sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
 
-  std::vector<OfflinePageItem> result;
   while (statement.Step())
     result.push_back(MakeOfflinePageItem(&statement));
 
@@ -417,73 +417,58 @@
     RecordLoadResult(OfflinePageMetadataStore::LOAD_SUCCEEDED, result.size());
   } else {
     result.clear();
-    // Zombify store. If we were unable to read from it, avoid consistency
-    // check and other potentially destructive operations.
-    // Note this callback should be posted back to the original thread before
-    // the main callback got the GetOfflinePages caller. Sequence of these
-    // callbacks is important.
-    runner->PostTask(
-        FROM_HERE, base::Bind(set_state_callback, StoreState::FAILED_LOADING));
-
     RecordLoadResult(OfflinePageMetadataStore::STORE_LOAD_FAILED, 0);
   }
-  runner->PostTask(FROM_HERE, base::Bind(callback, result));
+
+  return result;
 }
 
-void AddOfflinePageSync(sql::Connection* db,
-                        scoped_refptr<base::SingleThreadTaskRunner> runner,
-                        const OfflinePageItem& offline_page,
-                        const OfflinePageMetadataStore::AddCallback& callback) {
-  ItemActionStatus status = Insert(db, offline_page);
-  runner->PostTask(FROM_HERE, base::Bind(callback, status));
+void GetOfflinePagesResultWrapper(
+    const OfflinePageMetadataStore::LoadCallback& load_callback,
+    std::vector<OfflinePageItem> result) {
+  load_callback.Run(result);
 }
 
-void PostStoreUpdateResultForIds(
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
+std::unique_ptr<OfflinePagesUpdateResult> BuildUpdateResultForIds(
     StoreState store_state,
     const std::vector<int64_t>& offline_ids,
-    ItemActionStatus action_status,
-    const OfflinePageMetadataStore::UpdateCallback& callback) {
+    ItemActionStatus action_status) {
   std::unique_ptr<OfflinePagesUpdateResult> result(
       new OfflinePagesUpdateResult(store_state));
   for (const auto& offline_id : offline_ids)
     result->item_statuses.push_back(std::make_pair(offline_id, action_status));
-  runner->PostTask(FROM_HERE, base::Bind(callback, base::Passed(&result)));
+  return result;
 }
 
-void PostStoreErrorForAllPages(
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
+std::unique_ptr<OfflinePagesUpdateResult> BuildUpdateResultForPages(
+    StoreState store_state,
     const std::vector<OfflinePageItem>& pages,
-    const OfflinePageMetadataStore::UpdateCallback& callback) {
-  std::vector<int64_t> offline_ids;
-  for (const auto& page : pages)
-    offline_ids.push_back(page.offline_id);
-  PostStoreUpdateResultForIds(runner, StoreState::LOADED, offline_ids,
-                              ItemActionStatus::STORE_ERROR, callback);
-}
-
-void PostStoreErrorForAllIds(
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    const std::vector<int64_t>& offline_ids,
-    const OfflinePageMetadataStore::UpdateCallback& callback) {
-  PostStoreUpdateResultForIds(runner, StoreState::LOADED, offline_ids,
-                              ItemActionStatus::STORE_ERROR, callback);
-}
-
-void UpdateOfflinePagesSync(
-    sql::Connection* db,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    const std::vector<OfflinePageItem>& pages,
-    const OfflinePageMetadataStore::UpdateCallback& callback) {
+    ItemActionStatus action_status) {
   std::unique_ptr<OfflinePagesUpdateResult> result(
-      new OfflinePagesUpdateResult(StoreState::LOADED));
+      new OfflinePagesUpdateResult(store_state));
+  for (const auto& page : pages)
+    result->item_statuses.push_back(
+        std::make_pair(page.offline_id, action_status));
+  return result;
+}
+
+std::unique_ptr<OfflinePagesUpdateResult> UpdateOfflinePagesSync(
+    const std::vector<OfflinePageItem>& pages,
+    sql::Connection* db) {
+  if (!db) {
+    return BuildUpdateResultForPages(StoreState::NOT_LOADED, pages,
+                                     ItemActionStatus::STORE_ERROR);
+  }
 
   sql::Transaction transaction(db);
   if (!transaction.Begin()) {
-    PostStoreErrorForAllPages(runner, pages, callback);
-    return;
+    return BuildUpdateResultForPages(StoreState::LOADED, pages,
+                                     ItemActionStatus::STORE_ERROR);
   }
 
+  std::unique_ptr<OfflinePagesUpdateResult> result(
+      new OfflinePagesUpdateResult(StoreState::LOADED));
+
   for (const auto& page : pages) {
     if (Update(db, page)) {
       result->updated_items.push_back(page);
@@ -496,28 +481,36 @@
   }
 
   if (!transaction.Commit()) {
-    PostStoreErrorForAllPages(runner, pages, callback);
-    return;
+    return BuildUpdateResultForPages(StoreState::LOADED, pages,
+                                     ItemActionStatus::STORE_ERROR);
   }
-  runner->PostTask(FROM_HERE, base::Bind(callback, base::Passed(&result)));
+
+  return result;
 }
 
-void RemoveOfflinePagesSync(
+std::unique_ptr<OfflinePagesUpdateResult> RemoveOfflinePagesSync(
     const std::vector<int64_t>& offline_ids,
-    sql::Connection* db,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    const OfflinePageMetadataStore::UpdateCallback& callback) {
-  std::unique_ptr<OfflinePagesUpdateResult> result(
-      new OfflinePagesUpdateResult(StoreState::LOADED));
+    sql::Connection* db) {
+  if (!db) {
+    return BuildUpdateResultForIds(StoreState::NOT_LOADED, offline_ids,
+                                   ItemActionStatus::STORE_ERROR);
+  }
+
+  if (offline_ids.empty()) {
+    return BuildUpdateResultForIds(StoreState::LOADED, offline_ids,
+                                   ItemActionStatus::NOT_FOUND);
+  }
 
   // If you create a transaction but don't Commit() it is automatically
   // rolled back by its destructor when it falls out of scope.
   sql::Transaction transaction(db);
   if (!transaction.Begin()) {
-    PostStoreErrorForAllIds(runner, offline_ids, callback);
-    return;
+    return BuildUpdateResultForIds(StoreState::LOADED, offline_ids,
+                                   ItemActionStatus::STORE_ERROR);
   }
 
+  std::unique_ptr<OfflinePagesUpdateResult> result(
+      new OfflinePagesUpdateResult(StoreState::LOADED));
   for (int64_t offline_id : offline_ids) {
     OfflinePageItem page;
     ItemActionStatus status;
@@ -534,11 +527,11 @@
   }
 
   if (!transaction.Commit()) {
-    PostStoreErrorForAllIds(runner, offline_ids, callback);
-    return;
+    return BuildUpdateResultForIds(StoreState::LOADED, offline_ids,
+                                   ItemActionStatus::STORE_ERROR);
   }
 
-  runner->PostTask(FROM_HERE, base::Bind(callback, base::Passed(&result)));
+  return result;
 }
 
 }  // anonymous namespace
@@ -559,85 +552,40 @@
   }
 }
 
+// TODO(fgorski): Remove this method once model is split into tasks.
+// This method is only kept until the whole OfflinePageModelImpl is running
+// implemented using TaskQueue. A separate initialize step will not be necessary
+// after that.
 void OfflinePageMetadataStoreSQL::Initialize(
     const InitializeCallback& callback) {
-  DCHECK(!db_);
-  db_.reset(new sql::Connection());
-  background_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&OpenConnectionSync, db_.get(),
-                            base::ThreadTaskRunnerHandle::Get(), db_file_path_,
-                            base::Bind(&OfflinePageMetadataStoreSQL::SetState,
-                                       weak_ptr_factory_.GetWeakPtr()),
-                            callback));
+  Execute(base::BindOnce(&CheckDBLoadedSync), base::BindOnce(callback));
 }
 
 void OfflinePageMetadataStoreSQL::GetOfflinePages(
     const LoadCallback& callback) {
-  if (!CheckDb()) {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, std::vector<OfflinePageItem>()));
-    return;
-  }
-
-  background_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&GetOfflinePagesSync, db_.get(),
-                            base::ThreadTaskRunnerHandle::Get(),
-                            base::Bind(&OfflinePageMetadataStoreSQL::SetState,
-                                       weak_ptr_factory_.GetWeakPtr()),
-                            callback));
+  Execute(base::BindOnce(&GetOfflinePagesSync),
+          base::BindOnce(&GetOfflinePagesResultWrapper, callback));
 }
 
 void OfflinePageMetadataStoreSQL::AddOfflinePage(
     const OfflinePageItem& offline_page,
     const AddCallback& callback) {
-  if (!CheckDb()) {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, ItemActionStatus::STORE_ERROR));
-    return;
-  }
-
-  background_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&AddOfflinePageSync, db_.get(),
-                 base::ThreadTaskRunnerHandle::Get(), offline_page, callback));
+  Execute(base::BindOnce(&AddOfflinePageSync, offline_page),
+          base::BindOnce(callback));
 }
 
 void OfflinePageMetadataStoreSQL::UpdateOfflinePages(
     const std::vector<OfflinePageItem>& pages,
     const UpdateCallback& callback) {
-  if (!CheckDb()) {
-    PostStoreErrorForAllPages(base::ThreadTaskRunnerHandle::Get(), pages,
-                              callback);
-    return;
-  }
-
-  background_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&UpdateOfflinePagesSync, db_.get(),
-                 base::ThreadTaskRunnerHandle::Get(), pages, callback));
+  Execute(base::BindOnce(&UpdateOfflinePagesSync, pages),
+          base::BindOnce(callback));
 }
 
 void OfflinePageMetadataStoreSQL::RemoveOfflinePages(
     const std::vector<int64_t>& offline_ids,
     const UpdateCallback& callback) {
-  if (!CheckDb()) {
-    PostStoreErrorForAllIds(base::ThreadTaskRunnerHandle::Get(), offline_ids,
-                            callback);
-    return;
-  }
-
-  if (offline_ids.empty()) {
-    // Nothing to do, but post a callback instead of calling directly
-    // to preserve the async style behavior to prevent bugs.
-    PostStoreUpdateResultForIds(
-        base::ThreadTaskRunnerHandle::Get(), state(), offline_ids,
-        ItemActionStatus::NOT_FOUND /* will be ignored */, callback);
-    return;
-  }
-
-  background_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&RemoveOfflinePagesSync, offline_ids, db_.get(),
-                            base::ThreadTaskRunnerHandle::Get(), callback));
+  Execute(base::BindOnce(&RemoveOfflinePagesSync, offline_ids),
+          base::BindOnce(callback));
 }
 
 // No-op implementation. This database does not reset.
@@ -661,14 +609,32 @@
     db_.reset(nullptr);
 }
 
-void OfflinePageMetadataStoreSQL::SetState(StoreState state) {
-  DCHECK(db_.get());
-  DCHECK(state == StoreState::LOADED || state == StoreState::FAILED_LOADING);
-  state_ = state;
+void OfflinePageMetadataStoreSQL::InitializeInternal(
+    base::OnceClosure pending_command) {
+  // TODO(fgorski): Set state to initializing/loading.
+  DCHECK_EQ(state_, StoreState::NOT_LOADED);
+
+  db_.reset(new sql::Connection());
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&InitDatabase, db_.get(), db_file_path_),
+      base::BindOnce(&OfflinePageMetadataStoreSQL::OnInitializeInternalDone,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     std::move(pending_command)));
 }
 
-bool OfflinePageMetadataStoreSQL::CheckDb() const {
-  return db_ && state_ == StoreState::LOADED;
+void OfflinePageMetadataStoreSQL::OnInitializeInternalDone(
+    base::OnceClosure pending_command,
+    bool success) {
+  // TODO(fgorski): DCHECK initialization is in progress, once we have a
+  // relevant value for the store state.
+  state_ = success ? StoreState::LOADED : StoreState::FAILED_LOADING;
+
+  CHECK(!pending_command.is_null());
+  std::move(pending_command).Run();
+
+  if (state_ == StoreState::FAILED_LOADING)
+    state_ = StoreState::NOT_LOADED;
 }
 
 }  // namespace offline_pages
diff --git a/components/offline_pages/core/offline_page_metadata_store_sql.h b/components/offline_pages/core/offline_page_metadata_store_sql.h
index 0d4e165..a9222088 100644
--- a/components/offline_pages/core/offline_page_metadata_store_sql.h
+++ b/components/offline_pages/core/offline_page_metadata_store_sql.h
@@ -10,8 +10,11 @@
 #include <memory>
 #include <vector>
 
+#include "base/bind.h"
 #include "base/files/file_path.h"
+#include "base/location.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task_runner_util.h"
 #include "components/offline_pages/core/offline_page_metadata_store.h"
 
 namespace base {
@@ -59,6 +62,16 @@
 //   move data from old table (prefixed by temp_) to the new one.
 class OfflinePageMetadataStoreSQL : public OfflinePageMetadataStore {
  public:
+  // Definition of the callback that is going to run the core of the command in
+  // the |Execute| method.
+  template <typename T>
+  using RunCallback = base::OnceCallback<T(sql::Connection*)>;
+
+  // Definition of the callback used to pass the result back to the caller of
+  // |Execute| method.
+  template <typename T>
+  using ResultCallback = base::OnceCallback<void(T)>;
+
   OfflinePageMetadataStoreSQL(
       scoped_refptr<base::SequencedTaskRunner> background_task_runner,
       const base::FilePath& database_dir);
@@ -76,15 +89,44 @@
   void Reset(const ResetCallback& callback) override;
   StoreState state() const override;
 
+  // Executes a |run_callback| on SQL store on the blocking thread, and posts
+  // its result back to calling thread through |result_callback|.
+  // Calling |Execute| when store is NOT_LOADED will cause the store
+  // initialization to start.
+  // Store state needs to be LOADED for test task to run, or FAILURE, in which
+  // case the |db| pointer passed to |run_callback| will be null and such case
+  // should be gracefully handled.
+  template <typename T>
+  void Execute(RunCallback<T> run_callback, ResultCallback<T> result_callback) {
+    // TODO(fgorski): Add a proper state indicating in progress initialization
+    // and CHECK that state.
+
+    if (state_ == StoreState::NOT_LOADED) {
+      InitializeInternal(
+          base::BindOnce(&OfflinePageMetadataStoreSQL::Execute<T>,
+                         weak_ptr_factory_.GetWeakPtr(),
+                         std::move(run_callback), std::move(result_callback)));
+      return;
+    }
+
+    sql::Connection* db = state_ == StoreState::LOADED ? db_.get() : nullptr;
+
+    base::PostTaskAndReplyWithResult(
+        background_task_runner_.get(), FROM_HERE,
+        base::BindOnce(std::move(run_callback), db),
+        std::move(result_callback));
+  }
+
   // Helper function used to force incorrect state for testing purposes.
   void SetStateForTesting(StoreState state, bool reset_db);
 
  private:
-  // Used as callback to set state from open / initial read operations.
-  void SetState(StoreState state);
+  // Initializes database and calls callback.
+  void InitializeInternal(base::OnceClosure pending_command);
 
-  // Checks whether a valid DB connection is present and store state is LOADED.
-  bool CheckDb() const;
+  // Used to conclude opening/resetting DB connection.
+  void OnInitializeInternalDone(base::OnceClosure pending_command,
+                                bool success);
 
   // Background thread where all SQL access should be run.
   scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
diff --git a/components/offline_pages/core/offline_page_metadata_store_unittest.cc b/components/offline_pages/core/offline_page_metadata_store_unittest.cc
index 44f415c..da27efd 100644
--- a/components/offline_pages/core/offline_page_metadata_store_unittest.cc
+++ b/components/offline_pages/core/offline_page_metadata_store_unittest.cc
@@ -443,8 +443,7 @@
   void PumpLoop();
 
   void InitializeCallback(bool success);
-  void GetOfflinePagesCallback(
-      const std::vector<OfflinePageItem>& offline_pages);
+  void GetOfflinePagesCallback(std::vector<OfflinePageItem> offline_pages);
   void AddCallback(ItemActionStatus status);
   void UpdateCallback(CalledCallback called_callback,
                       std::unique_ptr<OfflinePagesUpdateResult> result);
@@ -491,9 +490,9 @@
 }
 
 void OfflinePageMetadataStoreTest::GetOfflinePagesCallback(
-    const std::vector<OfflinePageItem>& offline_pages) {
+    std::vector<OfflinePageItem> offline_pages) {
   last_called_callback_ = LOAD;
-  offline_pages_.swap(const_cast<std::vector<OfflinePageItem>&>(offline_pages));
+  offline_pages_.swap(offline_pages);
 }
 
 void OfflinePageMetadataStoreTest::AddCallback(ItemActionStatus status) {
@@ -705,6 +704,8 @@
   OfflinePageMetadataStoreSQL* sql_store =
       static_cast<OfflinePageMetadataStoreSQL*>(store.get());
 
+  // Because execute method is self-healing this part of the test expects a
+  // positive results now.
   sql_store->SetStateForTesting(StoreState::NOT_LOADED, false);
   store->GetOfflinePages(
       base::Bind(&OfflinePageMetadataStoreTest::GetOfflinePagesCallback,
@@ -712,7 +713,7 @@
   PumpLoop();
   EXPECT_EQ(LOAD, last_called_callback_);
   EXPECT_EQ(0UL, offline_pages_.size());
-  EXPECT_EQ(StoreState::NOT_LOADED, store->state());
+  EXPECT_EQ(StoreState::LOADED, store->state());
 
   ClearResults();
   sql_store->SetStateForTesting(StoreState::FAILED_LOADING, false);
diff --git a/components/offline_pages/core/offline_page_model_impl.cc b/components/offline_pages/core/offline_page_model_impl.cc
index 14525a2..b3923bbd 100644
--- a/components/offline_pages/core/offline_page_model_impl.cc
+++ b/components/offline_pages/core/offline_page_model_impl.cc
@@ -864,7 +864,7 @@
 
 void OfflinePageModelImpl::OnInitialGetOfflinePagesDone(
     const base::TimeTicks& start_time,
-    const std::vector<OfflinePageItem>& offline_pages) {
+    std::vector<OfflinePageItem> offline_pages) {
   DCHECK(!is_loaded_);
 
   UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime",
diff --git a/components/offline_pages/core/offline_page_model_impl.h b/components/offline_pages/core/offline_page_model_impl.h
index 11a3882..2f23ea8d 100644
--- a/components/offline_pages/core/offline_page_model_impl.h
+++ b/components/offline_pages/core/offline_page_model_impl.h
@@ -160,9 +160,8 @@
                           bool success);
   void RetryDbInitialization(const base::TimeTicks& start_time,
                              int init_attempts_spent);
-  void OnInitialGetOfflinePagesDone(
-      const base::TimeTicks& start_time,
-      const std::vector<OfflinePageItem>& offline_pages);
+  void OnInitialGetOfflinePagesDone(const base::TimeTicks& start_time,
+                                    std::vector<OfflinePageItem> offline_pages);
   void FinalizeModelLoad();
 
   // Steps for saving a page offline.
diff --git a/components/offline_pages/core/task_queue.h b/components/offline_pages/core/task_queue.h
index 6488f9a7..20ae12df 100644
--- a/components/offline_pages/core/task_queue.h
+++ b/components/offline_pages/core/task_queue.h
@@ -6,9 +6,9 @@
 #define COMPONENTS_OFFLINE_PAGES_CORE_TASK_QUEUE_H_
 
 #include <memory>
-#include <queue>
 
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
@@ -65,7 +65,7 @@
   std::unique_ptr<Task> current_task_;
 
   // A FIFO queue of tasks that will be run using this task queue.
-  std::queue<std::unique_ptr<Task>> tasks_;
+  base::queue<std::unique_ptr<Task>> tasks_;
 
   base::WeakPtrFactory<TaskQueue> weak_ptr_factory_;
 
diff --git a/components/password_manager/core/browser/android_affiliation/fake_affiliation_fetcher.h b/components/password_manager/core/browser/android_affiliation/fake_affiliation_fetcher.h
index bf38b0c..c6acf44d 100644
--- a/components/password_manager/core/browser/android_affiliation/fake_affiliation_fetcher.h
+++ b/components/password_manager/core/browser/android_affiliation/fake_affiliation_fetcher.h
@@ -6,8 +6,8 @@
 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_ANDROID_AFFILIATION_FAKE_AFFILIATION_FETCHER_H_
 
 #include <memory>
-#include <queue>
 
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliation_fetcher.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliation_fetcher_delegate.h"
@@ -73,7 +73,7 @@
  private:
   // Fakes created by this factory. The elements are owned by the production
   // code that normally owns the result of AffiliationFetcher::Create().
-  std::queue<FakeAffiliationFetcher*> pending_fetchers_;
+  base::queue<FakeAffiliationFetcher*> pending_fetchers_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedFakeAffiliationFetcherFactory);
 };
diff --git a/components/policy/core/common/cloud/external_policy_data_updater.h b/components/policy/core/common/cloud/external_policy_data_updater.h
index 9be6bf8..be72a71 100644
--- a/components/policy/core/common/cloud/external_policy_data_updater.h
+++ b/components/policy/core/common/cloud/external_policy_data_updater.h
@@ -10,10 +10,10 @@
 
 #include <map>
 #include <memory>
-#include <queue>
 #include <string>
 
 #include "base/callback_forward.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
@@ -113,7 +113,7 @@
 
   // Queue of jobs waiting to be run. Jobs are taken off the queue and started
   // by StartNextJobs().
-  std::queue<base::WeakPtr<FetchJob>> job_queue_;
+  base::queue<base::WeakPtr<FetchJob>> job_queue_;
 
   // Map that owns all existing jobs, regardless of whether they are currently
   // queued, running or waiting for a retry.
diff --git a/components/policy/core/common/remote_commands/remote_commands_queue.h b/components/policy/core/common/remote_commands/remote_commands_queue.h
index 955d6a2..ace60b3 100644
--- a/components/policy/core/common/remote_commands/remote_commands_queue.h
+++ b/components/policy/core/common/remote_commands/remote_commands_queue.h
@@ -6,8 +6,8 @@
 #define COMPONENTS_POLICY_CORE_COMMON_REMOTE_COMMANDS_REMOTE_COMMANDS_QUEUE_H_
 
 #include <memory>
-#include <queue>
 
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/linked_ptr.h"
 #include "base/observer_list.h"
@@ -72,7 +72,7 @@
   // Attempts to start a new command.
   void ScheduleNextJob();
 
-  std::queue<linked_ptr<RemoteCommandJob>> incoming_commands_;
+  base::queue<linked_ptr<RemoteCommandJob>> incoming_commands_;
 
   std::unique_ptr<RemoteCommandJob> running_command_;
 
diff --git a/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc b/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc
index 107d96a..bb1ddcd 100644
--- a/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc
+++ b/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc
@@ -6,12 +6,12 @@
 
 #include <stddef.h>
 
-#include <queue>
 #include <string>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
@@ -167,7 +167,7 @@
             kTestClientServerCommunicationDelayInSeconds));
   }
 
-  std::queue<FetchCallExpectation> expected_fetch_commands_calls_;
+  base::queue<FetchCallExpectation> expected_fetch_commands_calls_;
   TestingRemoteCommandsServer* server_;
 
   DISALLOW_COPY_AND_ASSIGN(TestingCloudPolicyClientForRemoteCommands);
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 9597f847..c1044fa8 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -143,7 +143,7 @@
 #   persistent IDs for all fields (but not for groups!) are needed. These are
 #   specified by the 'id' keys of each policy. NEVER CHANGE EXISTING IDs,
 #   because doing so would break the deployed wire format!
-#   For your editing convenience: highest ID currently used: 385
+#   For your editing convenience: highest ID currently used: 389
 #   And don't forget to also update the EnterprisePolicies enum of
 #   histograms.xml (run 'python tools/metrics/histograms/update_policies.py').
 #
@@ -9536,6 +9536,156 @@
       the entries in the file specified in NativePrintersBulkConfiguration.''',
     },
     {
+      'name': 'DeviceNativePrinters',
+      'id': 386,
+      'device_only': True,
+      'type': 'external',
+      'schema': {
+        'type': 'object',
+        'properties': {
+          'url': { 'type': 'string' },
+          'hash': { 'type': 'string' }
+        },
+      },
+      'supported_on': ['chrome_os:63-'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value': {
+        "url": "https://example.com/printerpolicy",
+        "hash": "deadbeefdeadbeefdeadbeefdeadbeefdeafdeadbeefdeadbeef"
+      },
+      'max_size': 5242880,
+      'caption': '''Enterprise printer configuration file for devices''',
+      'tags': [],
+      'desc': '''Provides configurations for enterprise printers bound to devices.
+
+      This policy allows you to provide printer configurations to
+      <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> devices.
+      The size of the file must not exceed 5MB and must be encoded in JSON.
+      The format is the same as the NativePrinters dictionary.  It is estimated
+      that a file containing approximately 21,000 printers will encode as a 5MB
+      file.  The cryptographic hash is used to verify the integrity of the
+      download.
+
+      The file is downloaded and cached. It will be re-downloaded whenever
+      the URL or the hash changes.
+
+      If this policy is set,
+      <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> will download
+      the file for printer configurations and make printers available in
+      accordance with DeviceNativePrintersAccessMode, DeviceNativePrintersWhitelist,
+      and DeviceNativePrintersBlacklist.
+
+      This policy has no effect on whether users can configure printers on
+      individual devices.  It is intended to be supplementary to the
+      configuration of printers by individual users.
+
+      This policy is additive to the NativePrintersBulkConfiguration.
+
+      If this policy is unset, there will be no device printers and the other
+      NativeDevicePrinter* policies will be ignroed.''',
+    },
+    {
+      'name': 'DeviceNativePrintersAccessMode',
+      'id': 387,
+      'device_only': True,
+      'supported_on': ['chrome_os:63-'],
+      'type': 'int-enum',
+      'schema': {
+        'type': 'integer',
+        'enum': [ 0, 1, 2 ],
+      },
+      'items': [
+        {
+          'name': 'BlacklistRestriction',
+          'value': 0,
+          'caption': '''All printers are shown except those in the blacklist.''',
+        },
+        {
+          'name': 'WhitelistPrintersOnly',
+          'value': 1,
+          'caption': '''Only printers in the whitelist are shown to users''',
+        },
+        {
+          'name': 'AllowAll',
+          'value': 2,
+          'caption': '''Allow all printers from the configuration file.''',
+        },
+      ],
+      'features' : {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value': 1,
+      'caption': '''Device printers configuration access policy.''',
+      'tags': [],
+      'desc': '''Controls which printers from the
+      DeviceNativePrintersConfiguration are available to users.
+
+      Designates which access policy is used for bulk printer configuration.
+      If AllowAll is selected, all printers are shown. If BlacklistRestrction
+      is selected, DeviceNativePrintersBlacklist is used to restrict access to
+      the specified printers.  If WhitelistPrintersOnly is selected,
+      DeviceNativePrintersWhitelist designates only those printers which are
+      selectable.
+
+      If this policy is not set, BlacklistRestriction is assumed.
+      ''',
+    },
+    {
+      'name': 'DeviceNativePrintersBlacklist',
+      'supported_on': ['chrome_os:63-'],
+      'device_only': True,
+      'id': 388,
+      'type': 'list',
+      'schema': {
+        'type': 'array',
+        'items': { 'type': 'string' },
+      },
+      'features': {
+        'dynamic_refresh': True,
+      },
+      'example_value':  ["id1", "id2", "id3"],
+      'caption': '''Disabled enterprise device printers''',
+      'tags': [],
+      'desc': '''Specifies the printers which a user cannot use.
+
+      This policy is only used if BlacklistRestriction is chosen for
+      DeviceNativePrintersAccessMode.
+
+      If this policy is used, all printers are provided to the user except
+      for the ids listed in this policy.
+      ''',
+    },
+    {
+      'name': 'DeviceNativePrintersWhitelist',
+      'supported_on': ['chrome_os:63-'],
+      'device_only': True,
+      'id': 389,
+      'type': 'list',
+      'schema': {
+        'type': 'array',
+        'items': { 'type': 'string' },
+      },
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value':  ["id1", "id2", "id3"],
+      'caption': '''Enabled enterprise device printers''',
+      'tags': [],
+      'desc': '''Specifies the printers which a user can use.
+
+      This policy is only used if WhitelistPrintersOnly is chosen for
+      DeviceNativePrintersAccessMode.
+
+      If this policy is used, only the printers with ids matching the values
+      in this policy are available to the user. The ids must coorespond to
+      the entries in the file specified in DeviceNativePrinters.''',
+    },
+    {
       'name': 'QuickUnlock',
       'type': 'group',
       'caption': '''Quick unlock policies''',
diff --git a/components/prefs/overlay_user_pref_store.cc b/components/prefs/overlay_user_pref_store.cc
index 285b2063..76109c4 100644
--- a/components/prefs/overlay_user_pref_store.cc
+++ b/components/prefs/overlay_user_pref_store.cc
@@ -74,9 +74,7 @@
                                     const base::Value** result) const {
   // If the |key| shall NOT be stored in the overlay store, there must not
   // be an entry.
-  // TODO(crbug.com/761123): Put back this DCHECK. It should be fixed by:
-  // https://chromium-review.googlesource.com/c/chromium/src/+/624772
-  // DCHECK(ShallBeStoredInOverlay(key) || !overlay_->GetValue(key, NULL));
+  DCHECK(ShallBeStoredInOverlay(key) || !overlay_->GetValue(key, NULL));
 
   if (overlay_->GetValue(key, result))
     return true;
diff --git a/components/prefs/pref_value_store.h b/components/prefs/pref_value_store.h
index ea6962d..aa12eb3 100644
--- a/components/prefs/pref_value_store.h
+++ b/components/prefs/pref_value_store.h
@@ -49,8 +49,10 @@
                       PrefStore* default_prefs,
                       PrefNotifier* pref_notifier) = 0;
 
-    virtual void InitIncognitoUnderlay(
-        PersistentPrefStore* incognito_user_prefs_underlay) = 0;
+    virtual void InitIncognitoUserPrefs(
+        scoped_refptr<PersistentPrefStore> incognito_user_prefs_overlay,
+        scoped_refptr<PersistentPrefStore> incognito_user_prefs_underlay,
+        const std::vector<const char*>& overlay_pref_names) = 0;
 
     virtual void InitPrefRegistry(PrefRegistry* pref_registry) = 0;
 
diff --git a/components/previews/core/previews_black_list.h b/components/previews/core/previews_black_list.h
index 9d8c985..b552283 100644
--- a/components/previews/core/previews_black_list.h
+++ b/components/previews/core/previews_black_list.h
@@ -8,11 +8,11 @@
 #include <stdint.h>
 
 #include <memory>
-#include <queue>
 #include <string>
 #include <vector>
 
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
@@ -146,7 +146,7 @@
 
   // Callbacks to be run after loading information from the backing store has
   // completed.
-  std::queue<base::Closure> pending_callbacks_;
+  base::queue<base::Closure> pending_callbacks_;
 
   std::unique_ptr<base::Clock> clock_;
 
diff --git a/components/previews/core/previews_experiments.cc b/components/previews/core/previews_experiments.cc
index 352c405..66e299a0 100644
--- a/components/previews/core/previews_experiments.cc
+++ b/components/previews/core/previews_experiments.cc
@@ -120,10 +120,29 @@
                          "offline_preview_freshness_duration_in_days", 7));
 }
 
-net::EffectiveConnectionType DefaultEffectiveConnectionTypeThreshold() {
-  return GetParamValueAsECT(kClientSidePreviewsFieldTrial,
-                            kEffectiveConnectionTypeThreshold,
-                            net::EFFECTIVE_CONNECTION_TYPE_2G);
+net::EffectiveConnectionType GetECTThresholdForPreview(
+    previews::PreviewsType type) {
+  switch (type) {
+    case PreviewsType::OFFLINE:
+      return GetParamValueAsECT(kClientSidePreviewsFieldTrial,
+                                kEffectiveConnectionTypeThreshold,
+                                net::EFFECTIVE_CONNECTION_TYPE_2G);
+    case PreviewsType::LOFI:
+      return GetParamValueAsECT(kClientLoFiExperimentName,
+                                kEffectiveConnectionTypeThreshold,
+                                net::EFFECTIVE_CONNECTION_TYPE_2G);
+    case PreviewsType::LITE_PAGE:
+      NOTREACHED();
+      break;
+    case PreviewsType::AMP_REDIRECTION:
+      return net::EFFECTIVE_CONNECTION_TYPE_LAST;  // Trigger irrespective of
+                                                   // ECT.
+    case PreviewsType::NONE:
+    case PreviewsType::LAST:
+      break;
+  }
+  NOTREACHED();
+  return net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
 }
 
 bool IsOfflinePreviewsEnabled() {
@@ -158,9 +177,20 @@
       ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
 }
 
+bool IsAMPRedirectionPreviewEnabled() {
+  return base::FeatureList::IsEnabled(features::kAMPRedirection);
+}
+
+int AMPRedirectionPreviewsVersion() {
+  return GetFieldTrialParamByFeatureAsInt(features::kAMPRedirection, kVersion,
+                                          0);
+}
+
 }  // namespace params
 
 std::string GetStringNameForType(PreviewsType type) {
+  // The returned string is used to record histograms for the new preview type.
+  // Also add the string to Previews.Types histogram suffix in histograms.xml.
   switch (type) {
     case PreviewsType::OFFLINE:
       return "Offline";
@@ -168,6 +198,8 @@
       return "LoFi";
     case PreviewsType::LITE_PAGE:
       return "LitePage";
+    case PreviewsType::AMP_REDIRECTION:
+      return "AMPRedirection";
     case PreviewsType::NONE:
     case PreviewsType::LAST:
       break;
diff --git a/components/previews/core/previews_experiments.h b/components/previews/core/previews_experiments.h
index 509269c1..99b06506 100644
--- a/components/previews/core/previews_experiments.h
+++ b/components/previews/core/previews_experiments.h
@@ -14,6 +14,31 @@
 
 namespace previews {
 
+enum class PreviewsType {
+  NONE = 0,
+
+  // The user is shown an offline page as a preview.
+  OFFLINE = 1,
+
+  // Replace images with placeholders.
+  LOFI = 2,
+
+  // The user is shown a server lite page.
+  LITE_PAGE = 3,
+
+  // AMP version of the page is shown as a preview.
+  AMP_REDIRECTION = 4,
+
+  // Insert new enum values here. Keep values sequential to allow looping from
+  // NONE+1 to LAST-1. Also add the enum to Previews.Types histogram suffix.
+  LAST = 5,
+};
+
+typedef std::vector<std::pair<PreviewsType, int>> PreviewsTypeList;
+
+// Gets the string representation of |type|.
+std::string GetStringNameForType(PreviewsType type);
+
 namespace params {
 
 // The maximum number of recent previews navigations the black list looks at to
@@ -48,9 +73,10 @@
 // shown as a preview.
 base::TimeDelta OfflinePreviewFreshnessDuration();
 
-// The threshold of EffectiveConnectionType above which previews will trigger by
-// default.
-net::EffectiveConnectionType DefaultEffectiveConnectionTypeThreshold();
+// The threshold of EffectiveConnectionType above which preview |type| will be
+// triggered.
+net::EffectiveConnectionType GetECTThresholdForPreview(
+    previews::PreviewsType type);
 
 // Whether offline previews are enabled.
 bool IsOfflinePreviewsEnabled();
@@ -71,30 +97,12 @@
 // Returns the hosts that are blacklisted by the Client Lo-Fi field trial.
 std::vector<std::string> GetBlackListedHostsForClientLoFiFieldTrial();
 
+bool IsAMPRedirectionPreviewEnabled();
+
+int AMPRedirectionPreviewsVersion();
+
 }  // namespace params
 
-enum class PreviewsType {
-  NONE = 0,
-
-  // The user is shown an offline page as a preview.
-  OFFLINE = 1,
-
-  // Replace images with placeholders.
-  LOFI = 2,
-
-  // The user is shown a server lite page.
-  LITE_PAGE = 3,
-
-  // Insert new enum values here. Keep values sequential to allow looping
-  // from NONE+1 to LAST-1.
-  LAST = 4,
-};
-
-typedef std::vector<std::pair<PreviewsType, int>> PreviewsTypeList;
-
-// Gets the string representation of |type|.
-std::string GetStringNameForType(PreviewsType type);
-
 }  // namespace previews
 
 #endif  // COMPONENTS_PREVIEWS_CORE_PREVIEWS_EXPERIMENTS_H_
diff --git a/components/previews/core/previews_experiments_unittest.cc b/components/previews/core/previews_experiments_unittest.cc
index 932d345..4bf932a 100644
--- a/components/previews/core/previews_experiments_unittest.cc
+++ b/components/previews/core/previews_experiments_unittest.cc
@@ -57,7 +57,7 @@
   EXPECT_EQ(base::TimeDelta::FromDays(7),
             params::OfflinePreviewFreshnessDuration());
   EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G,
-            params::DefaultEffectiveConnectionTypeThreshold());
+            params::GetECTThresholdForPreview(PreviewsType::OFFLINE));
   EXPECT_EQ(0, params::OfflinePreviewsVersion());
 
   base::FieldTrialList field_trial_list(nullptr);
@@ -93,7 +93,7 @@
   EXPECT_EQ(base::TimeDelta::FromDays(12),
             params::OfflinePreviewFreshnessDuration());
   EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_4G,
-            params::DefaultEffectiveConnectionTypeThreshold());
+            params::GetECTThresholdForPreview(PreviewsType::OFFLINE));
   EXPECT_EQ(10, params::OfflinePreviewsVersion());
 
   variations::testing::ClearAllVariationParams();
diff --git a/components/previews/core/previews_features.cc b/components/previews/core/previews_features.cc
index 1a28bc1..19901cdb 100644
--- a/components/previews/core/previews_features.cc
+++ b/components/previews/core/previews_features.cc
@@ -19,5 +19,8 @@
 const base::Feature kStalePreviewsTimestamp{"StalePreviewsTimestamp",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kAMPRedirection{"AMPRedirectionPreviews",
+                                    base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace previews
diff --git a/components/previews/core/previews_features.h b/components/previews/core/previews_features.h
index e83f960..3f48046 100644
--- a/components/previews/core/previews_features.h
+++ b/components/previews/core/previews_features.h
@@ -13,6 +13,7 @@
 extern const base::Feature kOfflinePreviews;
 extern const base::Feature kClientLoFi;
 extern const base::Feature kStalePreviewsTimestamp;
+extern const base::Feature kAMPRedirection;
 
 }  // namespace features
 }  // namespace previews
diff --git a/components/previews/core/previews_io_data.cc b/components/previews/core/previews_io_data.cc
index 232f71c..725f71c 100644
--- a/components/previews/core/previews_io_data.cc
+++ b/components/previews/core/previews_io_data.cc
@@ -45,6 +45,7 @@
     // These types return new content on refresh.
     case PreviewsType::LITE_PAGE:
     case PreviewsType::LOFI:
+    case PreviewsType::AMP_REDIRECTION:
       return true;
     // Loading these types will always be stale when refreshed.
     case PreviewsType::OFFLINE:
@@ -109,9 +110,9 @@
 
 bool PreviewsIOData::ShouldAllowPreview(const net::URLRequest& request,
                                         PreviewsType type) const {
-  return ShouldAllowPreviewAtECT(
-      request, type, params::DefaultEffectiveConnectionTypeThreshold(),
-      std::vector<std::string>());
+  return ShouldAllowPreviewAtECT(request, type,
+                                 params::GetECTThresholdForPreview(type),
+                                 std::vector<std::string>());
 }
 
 bool PreviewsIOData::ShouldAllowPreviewAtECT(
@@ -136,22 +137,26 @@
     return false;
   }
 
-  net::NetworkQualityEstimator* network_quality_estimator =
-      request.context()->network_quality_estimator();
-  if (!network_quality_estimator ||
-      network_quality_estimator->GetEffectiveConnectionType() <
-          net::EFFECTIVE_CONNECTION_TYPE_OFFLINE) {
-    LogPreviewsEligibilityReason(
-        PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE, type);
-    return false;
+  if (effective_connection_type_threshold !=
+      net::EFFECTIVE_CONNECTION_TYPE_LAST) {
+    net::NetworkQualityEstimator* network_quality_estimator =
+        request.context()->network_quality_estimator();
+    if (!network_quality_estimator ||
+        network_quality_estimator->GetEffectiveConnectionType() <
+            net::EFFECTIVE_CONNECTION_TYPE_OFFLINE) {
+      LogPreviewsEligibilityReason(
+          PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE, type);
+      return false;
+    }
+
+    if (network_quality_estimator->GetEffectiveConnectionType() >
+        effective_connection_type_threshold) {
+      LogPreviewsEligibilityReason(PreviewsEligibilityReason::NETWORK_NOT_SLOW,
+                                   type);
+      return false;
+    }
   }
 
-  if (network_quality_estimator->GetEffectiveConnectionType() >
-      effective_connection_type_threshold) {
-    LogPreviewsEligibilityReason(PreviewsEligibilityReason::NETWORK_NOT_SLOW,
-                                 type);
-    return false;
-  }
   // LOAD_VALIDATE_CACHE or LOAD_BYPASS_CACHE mean the user reloaded the page.
   // If this is a query for offline previews, reloads should be disallowed.
   if (!AllowedOnReload(type) &&
diff --git a/components/previews/core/previews_io_data_unittest.cc b/components/previews/core/previews_io_data_unittest.cc
index a68e4d6..7b9f1ba 100644
--- a/components/previews/core/previews_io_data_unittest.cc
+++ b/components/previews/core/previews_io_data_unittest.cc
@@ -49,6 +49,7 @@
   switch (type) {
     case PreviewsType::OFFLINE:
     case PreviewsType::LITE_PAGE:
+    case PreviewsType::AMP_REDIRECTION:
       return params::IsOfflinePreviewsEnabled();
     case PreviewsType::LOFI:
       return params::IsClientLoFiEnabled();
diff --git a/components/printing/common/print_messages.cc b/components/printing/common/print_messages.cc
index 4a7c94d..6767c4af 100644
--- a/components/printing/common/print_messages.cc
+++ b/components/printing/common/print_messages.cc
@@ -17,12 +17,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/printing/common/print_messages.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/printing/common/print_messages.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/rappor/log_uploader.h b/components/rappor/log_uploader.h
index 55e53202..06a0fc0 100644
--- a/components/rappor/log_uploader.h
+++ b/components/rappor/log_uploader.h
@@ -6,10 +6,10 @@
 #define COMPONENTS_RAPPOR_LOG_UPLOADER_H_
 
 #include <memory>
-#include <queue>
 #include <string>
 
 #include "base/compiler_specific.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
@@ -93,7 +93,7 @@
   std::unique_ptr<net::URLFetcher> current_fetch_;
 
   // The logs that still need to be uploaded.
-  std::queue<std::string> queued_logs_;
+  base::queue<std::string> queued_logs_;
 
   // A timer used to delay before attempting another upload.
   base::OneShotTimer upload_timer_;
diff --git a/components/safe_browsing/browser/BUILD.gn b/components/safe_browsing/browser/BUILD.gn
index 6999f32..06540498 100644
--- a/components/safe_browsing/browser/BUILD.gn
+++ b/components/safe_browsing/browser/BUILD.gn
@@ -24,7 +24,6 @@
     "threat_details_history.h",
     "url_checker_delegate.h",
   ]
-
   deps = [
     "//components/data_use_measurement/core:core",
     "//components/history/core/browser:browser",
@@ -32,6 +31,7 @@
     "//components/safe_browsing:safe_browsing",
     "//components/safe_browsing/common:common",
     "//components/safe_browsing/web_ui:constants",
+    "//components/safe_browsing/web_ui:web_ui",
     "//components/safe_browsing_db:database_manager",
     "//components/security_interstitials/content:security_interstitial_page",
     "//content/public/browser:browser",
diff --git a/components/safe_browsing/browser/threat_details.cc b/components/safe_browsing/browser/threat_details.cc
index d7d5df56..7f12584 100644
--- a/components/safe_browsing/browser/threat_details.cc
+++ b/components/safe_browsing/browser/threat_details.cc
@@ -20,6 +20,7 @@
 #include "components/safe_browsing/browser/threat_details_cache.h"
 #include "components/safe_browsing/browser/threat_details_history.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
+#include "components/safe_browsing/web_ui/safe_browsing_ui.h"
 #include "components/safe_browsing_db/hit_report.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_controller.h"
@@ -742,6 +743,12 @@
     DLOG(ERROR) << "Unable to serialize the threat report.";
     return;
   }
+
+  BrowserThread::PostTask(
+      content::BrowserThread::UI, FROM_HERE,
+      base::Bind(&WebUIInfoSingleton::AddToReportsSent,
+                 base::Unretained(WebUIInfoSingleton::GetInstance()),
+                 base::Passed(&report_)));
   ui_manager_->SendSerializedThreatDetails(serialized);
 }
 
diff --git a/components/safe_browsing/common/safebrowsing_message_generator.cc b/components/safe_browsing/common/safebrowsing_message_generator.cc
index 8629de28..0ed1b08 100644
--- a/components/safe_browsing/common/safebrowsing_message_generator.cc
+++ b/components/safe_browsing/common/safebrowsing_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/safe_browsing/common/safebrowsing_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/safe_browsing/password_protection/password_protection_request.cc b/components/safe_browsing/password_protection/password_protection_request.cc
index 96f96198..7e42c11 100644
--- a/components/safe_browsing/password_protection/password_protection_request.cc
+++ b/components/safe_browsing/password_protection/password_protection_request.cc
@@ -31,6 +31,15 @@
 
 }  // namespace
 
+const char kPasswordOnFocusVerdictHistogram[] =
+    "PasswordProtection.Verdict.PasswordFieldOnFocus";
+const char kAnyPasswordEntryVerdictHistogram[] =
+    "PasswordProtection.Verdict.AnyPasswordEntry";
+const char kSyncPasswordEntryVerdictHistogram[] =
+    "PasswordProtection.Verdict.SyncPasswordEntry";
+const char kProtectedPasswordEntryVerdictHistogram[] =
+    "PasswordProtection.Verdict.ProtectedPasswordEntry";
+
 PasswordProtectionRequest::PasswordProtectionRequest(
     WebContents* web_contents,
     const GURL& main_frame_url,
@@ -55,10 +64,6 @@
       request_proto_(base::MakeUnique<LoginReputationClientRequest>()),
       weakptr_factory_(this) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  // TODO(nparker): Add support for setting matching_domains &&
-  // matches_sync_password at the same time, then remove the following check.
-  // Need to change how the UMA metrics are logged first.
-  DCHECK(!matches_sync_password_ || matching_domains_.size() == 0);
 
   DCHECK(trigger_type_ == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE ||
          trigger_type_ == LoginReputationClientRequest::PASSWORD_REUSE_EVENT);
@@ -297,36 +302,35 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   tracker_.TryCancelAll();
   if (trigger_type_ == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE) {
-    UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogramName,
-                              outcome, PasswordProtectionService::MAX_OUTCOME);
-  } else if (matches_sync_password_) {
-    UMA_HISTOGRAM_ENUMERATION(kSyncPasswordEntryRequestOutcomeHistogramName,
-                              outcome, PasswordProtectionService::MAX_OUTCOME);
-    password_protection_service_->MaybeLogPasswordReuseLookupEvent(
-        web_contents_, outcome, response.get());
+    UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogram, outcome,
+                              PasswordProtectionService::MAX_OUTCOME);
   } else {
-    UMA_HISTOGRAM_ENUMERATION(kPasswordEntryRequestOutcomeHistogramName,
-                              outcome, PasswordProtectionService::MAX_OUTCOME);
+    PasswordProtectionService::LogPasswordEntryRequestOutcome(
+        outcome, matches_sync_password_);
+    if (matches_sync_password_) {
+      password_protection_service_->MaybeLogPasswordReuseLookupEvent(
+          web_contents_, outcome, response.get());
+    }
   }
 
   if (outcome == PasswordProtectionService::SUCCEEDED && response) {
     switch (trigger_type_) {
       case LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE:
         UMA_HISTOGRAM_ENUMERATION(
-            "PasswordProtection.Verdict.PasswordFieldOnFocus",
-            response->verdict_type(),
+            kPasswordOnFocusVerdictHistogram, response->verdict_type(),
             LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
         break;
       case LoginReputationClientRequest::PASSWORD_REUSE_EVENT:
+        UMA_HISTOGRAM_ENUMERATION(
+            kAnyPasswordEntryVerdictHistogram, response->verdict_type(),
+            LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
         if (matches_sync_password_) {
           UMA_HISTOGRAM_ENUMERATION(
-              "PasswordProtection.Verdict.SyncProtectedPasswordEntry",
-              response->verdict_type(),
+              kSyncPasswordEntryVerdictHistogram, response->verdict_type(),
               LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
         } else {
           UMA_HISTOGRAM_ENUMERATION(
-              "PasswordProtection.Verdict.ProtectedPasswordEntry",
-              response->verdict_type(),
+              kProtectedPasswordEntryVerdictHistogram, response->verdict_type(),
               LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
         }
         break;
diff --git a/components/safe_browsing/password_protection/password_protection_request.h b/components/safe_browsing/password_protection/password_protection_request.h
index 9d26dd7..267fa30 100644
--- a/components/safe_browsing/password_protection/password_protection_request.h
+++ b/components/safe_browsing/password_protection/password_protection_request.h
@@ -20,6 +20,12 @@
 
 namespace safe_browsing {
 
+// UMA metrics
+extern const char kPasswordOnFocusVerdictHistogram[];
+extern const char kAnyPasswordEntryVerdictHistogram[];
+extern const char kSyncPasswordEntryVerdictHistogram[];
+extern const char kProtectedPasswordEntryVerdictHistogram[];
+
 // A request for checking if an unfamiliar login form or a password reuse event
 // is safe. PasswordProtectionRequest objects are owned by
 // PasswordProtectionService indicated by |password_protection_service_|.
@@ -132,7 +138,8 @@
   const bool matches_sync_password_;
 
   // Domains from the Password Manager that match this password.
-  // Can be empty iff |matches_sync_password_| == true
+  // Should be non-empty if |matches_sync_password_| == false. Otherwise,
+  // may or may not be empty.
   const std::vector<std::string> matching_domains_;
 
   // If this request is for unfamiliar login page or for a password reuse event.
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index 1a1d482..91b10551 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -76,17 +76,22 @@
 
 }  // namespace
 
-const char kPasswordOnFocusRequestOutcomeHistogramName[] =
+const char kPasswordOnFocusRequestOutcomeHistogram[] =
     "PasswordProtection.RequestOutcome.PasswordFieldOnFocus";
-const char kPasswordEntryRequestOutcomeHistogramName[] =
-    "PasswordProtection.RequestOutcome.ProtectedPasswordEntry";
-const char kSyncPasswordEntryRequestOutcomeHistogramName[] =
+// Matches sync and/or saved password
+const char kAnyPasswordEntryRequestOutcomeHistogram[] =
+    "PasswordProtection.RequestOutcome.AnyPasswordEntry";
+// Matches sync and maybe also saved password
+const char kSyncPasswordEntryRequestOutcomeHistogram[] =
     "PasswordProtection.RequestOutcome.SyncPasswordEntry";
-const char kSyncPasswordWarningDialogHistogramName[] =
+// Matches saved but NOT sync password
+const char kProtectedPasswordEntryRequestOutcomeHistogram[] =
+    "PasswordProtection.RequestOutcome.ProtectedPasswordEntry";
+const char kSyncPasswordWarningDialogHistogram[] =
     "PasswordProtection.ModalWarningDialogAction.SyncPasswordEntry";
-const char kSyncPasswordPageInfoHistogramName[] =
+const char kSyncPasswordPageInfoHistogram[] =
     "PasswordProtection.PageInfoAction.SyncPasswordEntry";
-const char kSyncPasswordChromeSettingsHistogramName[] =
+const char kSyncPasswordChromeSettingsHistogram[] =
     "PasswordProtection.ChromeSettingsAction.SyncPasswordEntry";
 
 PasswordProtectionService::PasswordProtectionService(
@@ -126,16 +131,16 @@
                                                     WarningAction action) {
   switch (ui_type) {
     case PAGE_INFO:
-      UMA_HISTOGRAM_ENUMERATION(kSyncPasswordPageInfoHistogramName, action,
+      UMA_HISTOGRAM_ENUMERATION(kSyncPasswordPageInfoHistogram, action,
                                 MAX_ACTION);
       break;
     case MODAL_DIALOG:
-      UMA_HISTOGRAM_ENUMERATION(kSyncPasswordWarningDialogHistogramName, action,
+      UMA_HISTOGRAM_ENUMERATION(kSyncPasswordWarningDialogHistogram, action,
                                 MAX_ACTION);
       break;
     case CHROME_SETTINGS:
-      UMA_HISTOGRAM_ENUMERATION(kSyncPasswordChromeSettingsHistogramName,
-                                action, MAX_ACTION);
+      UMA_HISTOGRAM_ENUMERATION(kSyncPasswordChromeSettingsHistogram, action,
+                                MAX_ACTION);
       break;
     case NOT_USED:
     case MAX_UI_TYPE:
@@ -412,13 +417,13 @@
 
 bool PasswordProtectionService::CanSendPing(const base::Feature& feature,
                                             const GURL& main_frame_url,
-                                            bool is_sync_password) {
+                                            bool matches_sync_password) {
   RequestOutcome request_outcome = URL_NOT_VALID_FOR_REPUTATION_COMPUTING;
   if (IsPingingEnabled(feature, &request_outcome) &&
       CanGetReputationOfURL(main_frame_url)) {
     return true;
   }
-  RecordNoPingingReason(feature, request_outcome, is_sync_password);
+  RecordNoPingingReason(feature, request_outcome, matches_sync_password);
   return false;
 }
 
@@ -776,23 +781,30 @@
 void PasswordProtectionService::RecordNoPingingReason(
     const base::Feature& feature,
     RequestOutcome reason,
-    bool is_sync_password) {
+    bool matches_sync_password) {
   DCHECK(feature.name == kProtectedPasswordEntryPinging.name ||
          feature.name == kPasswordFieldOnFocusPinging.name);
 
-  bool is_password_entry_ping =
-      feature.name == kProtectedPasswordEntryPinging.name;
+  if (feature.name == kPasswordFieldOnFocusPinging.name) {
+    UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogram, reason,
+                              MAX_OUTCOME);
+    return;
+  }
 
-  if (is_password_entry_ping) {
-    if (is_sync_password) {
-      UMA_HISTOGRAM_ENUMERATION(kSyncPasswordEntryRequestOutcomeHistogramName,
-                                reason, MAX_OUTCOME);
-    } else {
-      UMA_HISTOGRAM_ENUMERATION(kPasswordEntryRequestOutcomeHistogramName,
-                                reason, MAX_OUTCOME);
-    }
+  LogPasswordEntryRequestOutcome(reason, matches_sync_password);
+}
+
+// static
+void PasswordProtectionService::LogPasswordEntryRequestOutcome(
+    RequestOutcome reason,
+    bool matches_sync_password) {
+  UMA_HISTOGRAM_ENUMERATION(kAnyPasswordEntryRequestOutcomeHistogram, reason,
+                            MAX_OUTCOME);
+  if (matches_sync_password) {
+    UMA_HISTOGRAM_ENUMERATION(kSyncPasswordEntryRequestOutcomeHistogram, reason,
+                              MAX_OUTCOME);
   } else {
-    UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogramName,
+    UMA_HISTOGRAM_ENUMERATION(kProtectedPasswordEntryRequestOutcomeHistogram,
                               reason, MAX_OUTCOME);
   }
 }
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h
index cf8c450..2b99a48 100644
--- a/components/safe_browsing/password_protection/password_protection_service.h
+++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -39,12 +39,14 @@
 class SafeBrowsingDatabaseManager;
 class PasswordProtectionRequest;
 
-extern const char kPasswordOnFocusRequestOutcomeHistogramName[];
-extern const char kPasswordEntryRequestOutcomeHistogramName[];
-extern const char kSyncPasswordEntryRequestOutcomeHistogramName[];
-extern const char kSyncPasswordWarningDialogHistogramName[];
-extern const char kSyncPasswordPageInfoHistogramName[];
-extern const char kSyncPasswordChromeSettingsHistogramName[];
+// UMA metrics
+extern const char kPasswordOnFocusRequestOutcomeHistogram[];
+extern const char kAnyPasswordEntryRequestOutcomeHistogram[];
+extern const char kSyncPasswordEntryRequestOutcomeHistogram[];
+extern const char kProtectedPasswordEntryRequestOutcomeHistogram[];
+extern const char kSyncPasswordWarningDialogHistogram[];
+extern const char kSyncPasswordPageInfoHistogram[];
+extern const char kSyncPasswordChromeSettingsHistogram[];
 
 // Manage password protection pings and verdicts. There is one instance of this
 // class per profile. Therefore, every PasswordProtectionService instance is
@@ -206,6 +208,11 @@
   virtual void UpdateSecurityState(safe_browsing::SBThreatType threat_type,
                                    content::WebContents* web_contents) {}
 
+  // Log the |reason| to several UMA metrics, depending on the value
+  // of |matches_sync_password|.
+  static void LogPasswordEntryRequestOutcome(RequestOutcome reason,
+                                             bool matches_sync_password);
+
  protected:
   friend class PasswordProtectionRequest;
   FRIEND_TEST_ALL_PREFIXES(PasswordProtectionServiceTest, VerifyCanSendPing);
@@ -213,10 +220,10 @@
   // Chrome can send password protection ping if it is allowed by Finch config
   // and if Safe Browsing can compute reputation of |main_frame_url| (e.g.
   // Safe Browsing is not able to compute reputation of a private IP or
-  // a local host). |is_sync_password| is used for UMA metric recording.
+  // a local host). |matches_sync_password| is used for UMA metric recording.
   bool CanSendPing(const base::Feature& feature,
                    const GURL& main_frame_url,
-                   bool is_sync_password);
+                   bool matches_sync_password);
 
   // Called by a PasswordProtectionRequest instance when it finishes to remove
   // itself from |requests_|.
@@ -345,7 +352,7 @@
 
   static void RecordNoPingingReason(const base::Feature& feature,
                                     RequestOutcome reason,
-                                    bool is_sync_password);
+                                    bool matches_sync_password);
   // Number of verdict stored for this profile for password on focus pings.
   int stored_verdict_count_password_on_focus_;
 
diff --git a/components/safe_browsing/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
index ed2f830..c1e80ae0 100644
--- a/components/safe_browsing/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
@@ -603,18 +603,18 @@
 }
 
 TEST_P(PasswordProtectionServiceTest, TestNoRequestSentForWhitelistedURL) {
-  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 0);
   InitializeAndStartPasswordOnFocusRequest(true /* match whitelist */,
                                            10000 /* timeout in ms*/);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(nullptr, password_protection_service_->latest_response());
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogram),
       ElementsAre(base::Bucket(4 /* MATCHED_WHITELIST */, 1)));
 }
 
 TEST_P(PasswordProtectionServiceTest, TestNoRequestSentIfVerdictAlreadyCached) {
-  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 0);
   CacheVerdict(GURL(kTargetUrl),
                LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
                LoginReputationClientResponse::LOW_REPUTATION, 600,
@@ -623,14 +623,14 @@
                                            10000 /* timeout in ms*/);
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogram),
       ElementsAre(base::Bucket(5 /* RESPONSE_ALREADY_CACHED */, 1)));
   EXPECT_EQ(LoginReputationClientResponse::LOW_REPUTATION,
             password_protection_service_->latest_response()->verdict_type());
 }
 
 TEST_P(PasswordProtectionServiceTest, TestResponseFetchFailed) {
-  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 0);
   net::TestURLFetcher failed_fetcher(0, GURL("http://bar.com"), nullptr);
   // Set up failed response.
   failed_fetcher.set_status(
@@ -642,12 +642,12 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(nullptr, password_protection_service_->latest_response());
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogram),
       ElementsAre(base::Bucket(9 /* FETCH_FAILED */, 1)));
 }
 
 TEST_P(PasswordProtectionServiceTest, TestMalformedResponse) {
-  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 0);
   // Set up malformed response.
   net::TestURLFetcher fetcher(0, GURL("http://bar.com"), nullptr);
   fetcher.set_status(
@@ -661,24 +661,24 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(nullptr, password_protection_service_->latest_response());
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogram),
       ElementsAre(base::Bucket(10 /* RESPONSE_MALFORMED */, 1)));
 }
 
 TEST_P(PasswordProtectionServiceTest, TestRequestTimedout) {
-  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 0);
   InitializeAndStartPasswordOnFocusRequest(false /* match whitelist */,
                                            0 /* timeout immediately */);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(nullptr, password_protection_service_->latest_response());
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogram),
       ElementsAre(base::Bucket(3 /* TIMEDOUT */, 1)));
 }
 
 TEST_P(PasswordProtectionServiceTest,
        TestPasswordOnFocusRequestAndResponseSuccessfull) {
-  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 0);
   // Set up valid response.
   net::TestURLFetcher fetcher(0, GURL("http://bar.com"), nullptr);
   fetcher.set_status(
@@ -693,10 +693,9 @@
   request_->OnURLFetchComplete(&fetcher);
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogram),
       ElementsAre(base::Bucket(1 /* SUCCEEDED */, 1)));
-  EXPECT_THAT(histograms_.GetAllSamples(
-                  "PasswordProtection.Verdict.PasswordFieldOnFocus"),
+  EXPECT_THAT(histograms_.GetAllSamples(kPasswordOnFocusVerdictHistogram),
               ElementsAre(base::Bucket(3 /* PHISHING */, 1)));
   LoginReputationClientResponse* actual_response =
       password_protection_service_->latest_response();
@@ -708,9 +707,10 @@
 }
 
 TEST_P(PasswordProtectionServiceTest,
-       TestPasswordEntryRequestAndResponseSuccessfull) {
-  histograms_.ExpectTotalCount(kPasswordEntryRequestOutcomeHistogramName, 0);
-  histograms_.ExpectTotalCount(kSyncPasswordEntryRequestOutcomeHistogramName,
+       TestProtectedPasswordEntryRequestAndResponseSuccessfull) {
+  histograms_.ExpectTotalCount(kAnyPasswordEntryRequestOutcomeHistogram, 0);
+  histograms_.ExpectTotalCount(kSyncPasswordEntryRequestOutcomeHistogram, 0);
+  histograms_.ExpectTotalCount(kProtectedPasswordEntryRequestOutcomeHistogram,
                                0);
   // Set up valid response.
   net::TestURLFetcher fetcher(0, GURL("http://bar.com"), nullptr);
@@ -727,14 +727,42 @@
       false /* match whitelist */, 10000 /* timeout in ms*/);
   request_->OnURLFetchComplete(&fetcher);
   base::RunLoop().RunUntilIdle();
+
+  // UMA: request outcomes
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordEntryRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kAnyPasswordEntryRequestOutcomeHistogram),
       ElementsAre(base::Bucket(1 /* SUCCEEDED */, 1)));
-  EXPECT_THAT(histograms_.GetAllSamples(
-                  "PasswordProtection.Verdict.ProtectedPasswordEntry"),
+  histograms_.ExpectTotalCount(kSyncPasswordEntryRequestOutcomeHistogram, 0);
+  EXPECT_THAT(
+      histograms_.GetAllSamples(kProtectedPasswordEntryRequestOutcomeHistogram),
+      ElementsAre(base::Bucket(1 /* SUCCEEDED */, 1)));
+  EXPECT_THAT(
+      histograms_.GetAllSamples(kProtectedPasswordEntryVerdictHistogram),
+      ElementsAre(base::Bucket(3 /* PHISHING */, 1)));
+
+  // UMA: verdicts
+  EXPECT_THAT(histograms_.GetAllSamples(kAnyPasswordEntryVerdictHistogram),
               ElementsAre(base::Bucket(3 /* PHISHING */, 1)));
-  histograms_.ExpectTotalCount(kSyncPasswordEntryRequestOutcomeHistogramName,
+  histograms_.ExpectTotalCount(kSyncPasswordEntryVerdictHistogram, 0);
+  EXPECT_THAT(
+      histograms_.GetAllSamples(kProtectedPasswordEntryVerdictHistogram),
+      ElementsAre(base::Bucket(3 /* PHISHING */, 1)));
+}
+
+TEST_P(PasswordProtectionServiceTest,
+       TestSyncPasswordEntryRequestAndResponseSuccessfull) {
+  histograms_.ExpectTotalCount(kAnyPasswordEntryRequestOutcomeHistogram, 0);
+  histograms_.ExpectTotalCount(kSyncPasswordEntryRequestOutcomeHistogram, 0);
+  histograms_.ExpectTotalCount(kProtectedPasswordEntryRequestOutcomeHistogram,
                                0);
+  // Set up valid response.
+  net::TestURLFetcher fetcher(0, GURL("http://bar.com"), nullptr);
+  fetcher.set_status(
+      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK));
+  fetcher.set_response_code(200);
+  LoginReputationClientResponse expected_response = CreateVerdictProto(
+      LoginReputationClientResponse::PHISHING, 600, GURL(kTargetUrl).host());
+  fetcher.SetResponseString(expected_response.SerializeAsString());
 
   // Initiate a sync password entry request (w/ no saved password).
   InitializeAndStartPasswordEntryRequest(true /* matches_sync_password */, {},
@@ -742,22 +770,27 @@
                                          10000 /* timeout in ms*/);
   request_->OnURLFetchComplete(&fetcher);
   base::RunLoop().RunUntilIdle();
+
+  // UMA: request outcomes
   EXPECT_THAT(
-      histograms_.GetAllSamples(kSyncPasswordEntryRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kAnyPasswordEntryRequestOutcomeHistogram),
       ElementsAre(base::Bucket(1 /* SUCCEEDED */, 1)));
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordEntryRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kSyncPasswordEntryRequestOutcomeHistogram),
       ElementsAre(base::Bucket(1 /* SUCCEEDED */, 1)));
-  EXPECT_THAT(histograms_.GetAllSamples(
-                  "PasswordProtection.Verdict.SyncProtectedPasswordEntry"),
+  histograms_.ExpectTotalCount(kProtectedPasswordEntryRequestOutcomeHistogram,
+                               0);
+
+  // UMA: verdicts
+  EXPECT_THAT(histograms_.GetAllSamples(kAnyPasswordEntryVerdictHistogram),
               ElementsAre(base::Bucket(3 /* PHISHING */, 1)));
-  EXPECT_THAT(histograms_.GetAllSamples(
-                  "PasswordProtection.Verdict.ProtectedPasswordEntry"),
+  EXPECT_THAT(histograms_.GetAllSamples(kSyncPasswordEntryVerdictHistogram),
               ElementsAre(base::Bucket(3 /* PHISHING */, 1)));
+  histograms_.ExpectTotalCount(kProtectedPasswordEntryVerdictHistogram, 0);
 }
 
 TEST_P(PasswordProtectionServiceTest, TestTearDownWithPendingRequests) {
-  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogramName, 0);
+  histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 0);
   GURL target_url(kTargetUrl);
   EXPECT_CALL(*database_manager_.get(), CheckCsdWhitelistUrl(target_url, _))
       .WillRepeatedly(Return(AsyncMatch::NO_MATCH));
@@ -771,7 +804,7 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_THAT(
-      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogramName),
+      histograms_.GetAllSamples(kPasswordOnFocusRequestOutcomeHistogram),
       ElementsAre(base::Bucket(2 /* CANCELED */, 1)));
 }
 
diff --git a/components/safe_browsing/web_ui/BUILD.gn b/components/safe_browsing/web_ui/BUILD.gn
index 7bd2a139..49fabac3 100644
--- a/components/safe_browsing/web_ui/BUILD.gn
+++ b/components/safe_browsing/web_ui/BUILD.gn
@@ -15,6 +15,7 @@
     "//base",
     "//components/resources:components_resources_grit",
     "//components/resources:components_scaled_resources_grit",
+    "//components/safe_browsing:csd_proto",
     "//components/safe_browsing:features",
     "//components/safe_browsing:webui_proto",
     "//components/safe_browsing/common:safe_browsing_prefs",
diff --git a/components/safe_browsing/web_ui/DEPS b/components/safe_browsing/web_ui/DEPS
index 1403bfc..a1cf89e9 100644
--- a/components/safe_browsing/web_ui/DEPS
+++ b/components/safe_browsing/web_ui/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+components/grit/components_resources.h",
   "+components/user_prefs",
+   "+components/safe_browsing/proto/csd.pb.h",
   "+components/strings/grit/components_strings.h",
   "+components/grit/components_scaled_resources.h",
   "+components/safe_browsing_db",
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.html b/components/safe_browsing/web_ui/resources/safe_browsing.html
index fe60658..75f2f3ae 100644
--- a/components/safe_browsing/web_ui/resources/safe_browsing.html
+++ b/components/safe_browsing/web_ui/resources/safe_browsing.html
@@ -32,6 +32,10 @@
     <div class="content">
       <p id="full-hash-cache-info"></p>
     </div>
+    <h2>Threat Details</h2>
+    <div class="content">
+      <p id="threat-details-list"></p>
+    </div>
     <script src="chrome://resources/js/i18n_template.js"></script>
   </body>
 </html>
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.js b/components/safe_browsing/web_ui/resources/safe_browsing.js
index 8c203f7..091e084 100644
--- a/components/safe_browsing/web_ui/resources/safe_browsing.js
+++ b/components/safe_browsing/web_ui/resources/safe_browsing.js
@@ -19,8 +19,14 @@
         var fullHashCacheState = databaseState.splice(-1,1);
         addDatabaseManagerInfo(databaseState);
         addFullHashCacheInfo(fullHashCacheState);
-  });
-}
+    });
+    cr.sendWithPromise('getSentThreatDetails', []).then((threatDetails) =>
+        addThreatDetailsInfo(threatDetails));
+    cr.addWebUIListener('threat-details-update', function(result) {
+      addThreatDetailsInfo(result);
+    });
+  }
+
   function addExperiments(result) {
     var resLength = result.length;
     var experimentsListFormatted = "";
@@ -58,7 +64,17 @@
       $('full-hash-cache-info').innerHTML = result;
   }
 
+  function addThreatDetailsInfo(result) {
+      var logDiv = $('threat-details-list');
+      if (!logDiv)
+        return;
+      var textDiv = document.createElement('div');
+      textDiv.innerText = result;
+      logDiv.appendChild(textDiv);
+  }
+
   return {
+    addThreatDetailsInfo: addThreatDetailsInfo,
     initialize: initialize,
   };
 });
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.cc b/components/safe_browsing/web_ui/safe_browsing_ui.cc
index 2cc2964b..6d588ab 100644
--- a/components/safe_browsing/web_ui/safe_browsing_ui.cc
+++ b/components/safe_browsing/web_ui/safe_browsing_ui.cc
@@ -10,8 +10,11 @@
 #include <vector>
 
 #include "base/base64url.h"
+#include "base/callback.h"
 #include "base/i18n/time_formatting.h"
 #include "base/json/json_string_value_serializer.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/singleton.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "base/values.h"
@@ -31,6 +34,39 @@
 using base::Time;
 
 namespace safe_browsing {
+WebUIInfoSingleton::WebUIInfoSingleton() = default;
+
+WebUIInfoSingleton::~WebUIInfoSingleton() = default;
+
+// static
+WebUIInfoSingleton* WebUIInfoSingleton::GetInstance() {
+  return base::Singleton<WebUIInfoSingleton>::get();
+}
+
+void WebUIInfoSingleton::AddToReportsSent(
+    std::unique_ptr<ClientSafeBrowsingReportRequest> report_request) {
+  for (auto* webui_listener : webui_instances_)
+    webui_listener->NotifyThreatDetailsJsListener(report_request.get());
+  reports_sent_.push_back(std::move(report_request));
+}
+
+void WebUIInfoSingleton::ClearReportsSent() {
+  std::vector<std::unique_ptr<ClientSafeBrowsingReportRequest>>().swap(
+      reports_sent_);
+}
+
+void WebUIInfoSingleton::RegisterWebUIInstance(SafeBrowsingUIHandler* webui) {
+  webui_instances_.push_back(webui);
+}
+
+void WebUIInfoSingleton::UnregisterWebUIInstance(SafeBrowsingUIHandler* webui) {
+  webui_instances_.erase(
+      std::remove(webui_instances_.begin(), webui_instances_.end(), webui),
+      webui_instances_.end());
+  if (webui_instances_.empty())
+    ClearReportsSent();
+}
+
 namespace {
 #if SAFE_BROWSING_DB_LOCAL
 
@@ -196,6 +232,38 @@
 
 #endif
 
+std::string ParseThreatDetailsInfo(
+    ClientSafeBrowsingReportRequest* client_safe_browsing_report_request) {
+  std::string report_request_parsed;
+  base::DictionaryValue report_request;
+  if (client_safe_browsing_report_request->has_type()) {
+    report_request.SetInteger(
+        "type", static_cast<int>(client_safe_browsing_report_request->type()));
+  }
+  if (client_safe_browsing_report_request->has_page_url())
+    report_request.SetString("page_url",
+                             client_safe_browsing_report_request->page_url());
+  if (client_safe_browsing_report_request->has_client_country()) {
+    report_request.SetString(
+        "client_country",
+        client_safe_browsing_report_request->client_country());
+  }
+  if (client_safe_browsing_report_request->has_repeat_visit()) {
+    report_request.SetInteger(
+        "repeat_visit", client_safe_browsing_report_request->repeat_visit());
+  }
+  if (client_safe_browsing_report_request->has_did_proceed()) {
+    report_request.SetInteger(
+        "did_proceed", client_safe_browsing_report_request->did_proceed());
+  }
+
+  base::Value* report_request_tree = &report_request;
+  JSONStringValueSerializer serializer(&report_request_parsed);
+  serializer.set_pretty_print(true);
+  serializer.Serialize(*report_request_tree);
+  return report_request_parsed;
+}
+
 }  // namespace
 
 SafeBrowsingUI::SafeBrowsingUI(content::WebUI* web_ui)
@@ -228,9 +296,13 @@
 SafeBrowsingUI::~SafeBrowsingUI() {}
 
 SafeBrowsingUIHandler::SafeBrowsingUIHandler(content::BrowserContext* context)
-    : browser_context_(context) {}
+    : browser_context_(context) {
+  WebUIInfoSingleton::GetInstance()->RegisterWebUIInstance(this);
+}
 
-SafeBrowsingUIHandler::~SafeBrowsingUIHandler() = default;
+SafeBrowsingUIHandler::~SafeBrowsingUIHandler() {
+  WebUIInfoSingleton::GetInstance()->UnregisterWebUIInstance(this);
+}
 
 void SafeBrowsingUIHandler::GetExperiments(const base::ListValue* args) {
   AllowJavascript();
@@ -283,6 +355,30 @@
   ResolveJavascriptCallback(base::Value(callback_id), database_manager_info);
 }
 
+void SafeBrowsingUIHandler::GetSentThreatDetails(const base::ListValue* args) {
+  const std::vector<std::unique_ptr<ClientSafeBrowsingReportRequest>>& reports =
+      WebUIInfoSingleton::GetInstance()->reports_sent();
+
+  base::ListValue sent_reports;
+
+  for (const auto& report : reports) {
+    sent_reports.GetList().push_back(
+        base::Value(ParseThreatDetailsInfo(report.get())));
+
+    AllowJavascript();
+    std::string callback_id;
+    args->GetString(0, &callback_id);
+    ResolveJavascriptCallback(base::Value(callback_id), sent_reports);
+  }
+}
+
+void SafeBrowsingUIHandler::NotifyThreatDetailsJsListener(
+    ClientSafeBrowsingReportRequest* threat_detail) {
+  AllowJavascript();
+  FireWebUIListener("threat-details-update",
+                    base::Value(ParseThreatDetailsInfo(threat_detail)));
+}
+
 void SafeBrowsingUIHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
       "getExperiments", base::Bind(&SafeBrowsingUIHandler::GetExperiments,
@@ -294,6 +390,10 @@
       "getDatabaseManagerInfo",
       base::Bind(&SafeBrowsingUIHandler::GetDatabaseManagerInfo,
                  base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "getSentThreatDetails",
+      base::Bind(&SafeBrowsingUIHandler::GetSentThreatDetails,
+                 base::Unretained(this)));
 }
 
 }  // namespace safe_browsing
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.h b/components/safe_browsing/web_ui/safe_browsing_ui.h
index 54fef1e..6fb0124 100644
--- a/components/safe_browsing/web_ui/safe_browsing_ui.h
+++ b/components/safe_browsing/web_ui/safe_browsing_ui.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_
 
 #include "base/macros.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing/proto/webui.pb.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui_controller.h"
@@ -14,6 +15,8 @@
 
 namespace base {
 class ListValue;
+template <typename T>
+struct DefaultSingletonTraits;
 }
 
 namespace safe_browsing {
@@ -22,14 +25,32 @@
   SafeBrowsingUIHandler(content::BrowserContext*);
   ~SafeBrowsingUIHandler() override;
 
+  // Get the experiments that are currently enabled per Chrome instance.
   void GetExperiments(const base::ListValue* args);
+
+  // Get the Safe Browsing related preferences for the current user.
   void GetPrefs(const base::ListValue* args);
+
+  // Get the information related to the Safe Browsing database and full hash
+  // cache.
   void GetDatabaseManagerInfo(const base::ListValue* args);
 
+  // Get the ThreatDetails that have been collected since the oldest currently
+  // open chrome://safe-browsing tab was opened.
+  void GetSentThreatDetails(const base::ListValue* args);
+
+  // Get the new ThreatDetails messages sent from ThreatDetails when a ping is
+  // sent, while one or more WebUI tabs are opened.
+  void NotifyThreatDetailsJsListener(
+      ClientSafeBrowsingReportRequest* threat_detail);
+
+  // Register callbacks for WebUI messages.
   void RegisterMessages() override;
 
  private:
   content::BrowserContext* browser_context_;
+  // List that keeps all the WebUI listener objects.
+  static std::vector<SafeBrowsingUIHandler*> webui_list_;
   DISALLOW_COPY_AND_ASSIGN(SafeBrowsingUIHandler);
 };
 
@@ -42,6 +63,57 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(SafeBrowsingUI);
 };
+
+class WebUIInfoSingleton {
+ public:
+  static WebUIInfoSingleton* GetInstance();
+
+  // Delete the list of the sent ClientSafeBrowsingReportRequest messages.
+  void ClearReportsSent();
+
+  // Add the new message in reports_sent_ and send it to all the
+  // chrome://safe-browsing opened tabs.
+  void AddToReportsSent(
+      std::unique_ptr<ClientSafeBrowsingReportRequest> report_request);
+
+  // Register the new WebUI listener object.
+  void RegisterWebUIInstance(SafeBrowsingUIHandler* webui);
+
+  // Unregister the WebUI listener object, and clean the list of reports, if
+  // this is last listener.
+  void UnregisterWebUIInstance(SafeBrowsingUIHandler* webui);
+
+  // Get the list of the sent reports that have been collected since the oldest
+  // currently open chrome://safe-browsing tab was opened.
+  const std::vector<std::unique_ptr<ClientSafeBrowsingReportRequest>>&
+  reports_sent() const {
+    return reports_sent_;
+    ;
+  }
+  // Get the list of WebUI listener objects.
+  const std::vector<SafeBrowsingUIHandler*>& webui_instances() const {
+    return webui_instances_;
+  }
+
+ private:
+  WebUIInfoSingleton();
+  ~WebUIInfoSingleton();
+
+  friend struct base::DefaultSingletonTraits<WebUIInfoSingleton>;
+
+  // List of reports sent since since the oldest currently
+  // open chrome://safe-browsing tab was opened.
+  // "ClientSafeBrowsingReportRequest" cannot be const, due to being used by
+  // functions that call AllowJavascript(), which is not marked const.
+  std::vector<std::unique_ptr<ClientSafeBrowsingReportRequest>> reports_sent_;
+
+  // List of WebUI listener objects. "SafeBrowsingUIHandler*" cannot be const,
+  // due to being used by functions that call AllowJavascript(), which is not
+  // marked const.
+  std::vector<SafeBrowsingUIHandler*> webui_instances_;
+  DISALLOW_COPY_AND_ASSIGN(WebUIInfoSingleton);
+};
+
 }  // namespace safe_browsing
 
 #endif  // COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_
diff --git a/components/spellcheck/common/spellcheck_message_generator.cc b/components/spellcheck/common/spellcheck_message_generator.cc
index b11fe093b..f4096f6 100644
--- a/components/spellcheck/common/spellcheck_message_generator.cc
+++ b/components/spellcheck/common/spellcheck_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "components/spellcheck/common/spellcheck_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "components/spellcheck/common/spellcheck_message_generator.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/sync/driver/data_type_manager_impl.cc b/components/sync/driver/data_type_manager_impl.cc
index 1497640..f476afa2 100644
--- a/components/sync/driver/data_type_manager_impl.cc
+++ b/components/sync/driver/data_type_manager_impl.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/profiler/scoped_tracker.h"
@@ -292,7 +293,7 @@
     NotifyStart();
 
   download_types_queue_ = PrioritizeTypes(last_enabled_types_);
-  association_types_queue_ = std::queue<AssociationTypesInfo>();
+  association_types_queue_ = base::queue<AssociationTypesInfo>();
 
   // If we're performing a "catch up", first stop the model types to ensure the
   // call to Initialize triggers model association.
@@ -381,7 +382,7 @@
     return;
   }
 
-  association_types_queue_ = std::queue<AssociationTypesInfo>();
+  association_types_queue_ = base::queue<AssociationTypesInfo>();
 
   // An attempt was made to reconfigure while we were already configuring.
   // This can be because a passphrase was accepted or the user changed the
diff --git a/components/sync/driver/data_type_manager_impl.h b/components/sync/driver/data_type_manager_impl.h
index cdf969c4..7e0bca2f2 100644
--- a/components/sync/driver/data_type_manager_impl.h
+++ b/components/sync/driver/data_type_manager_impl.h
@@ -8,11 +8,11 @@
 #include "components/sync/driver/data_type_manager.h"
 
 #include <map>
-#include <queue>
 #include <vector>
 
 #include "base/callback_forward.h"
 #include "base/compiler_specific.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
@@ -31,7 +31,7 @@
 
 // List of data types grouped by priority and ordered from high priority to
 // low priority.
-using TypeSetPriorityList = std::queue<ModelTypeSet>;
+using TypeSetPriorityList = base::queue<ModelTypeSet>;
 
 class DataTypeManagerImpl : public DataTypeManager,
                             public ModelAssociationManagerDelegate {
@@ -254,7 +254,7 @@
     // The subset of |types| that were successfully configured.
     ModelTypeSet configured_types;
   };
-  std::queue<AssociationTypesInfo> association_types_queue_;
+  base::queue<AssociationTypesInfo> association_types_queue_;
 
   // The encryption handler lets the DataTypeManager know the state of sync
   // datatype encryption.
diff --git a/components/sync/engine_impl/sync_encryption_handler_impl.cc b/components/sync/engine_impl/sync_encryption_handler_impl.cc
index c047c75..ddc55938 100644
--- a/components/sync/engine_impl/sync_encryption_handler_impl.cc
+++ b/components/sync/engine_impl/sync_encryption_handler_impl.cc
@@ -8,10 +8,10 @@
 #include <stdint.h>
 
 #include <memory>
-#include <queue>
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/containers/queue.h"
 #include "base/json/json_string_value_serializer.h"
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
@@ -816,7 +816,7 @@
       continue;  // Don't try to reencrypt if the type's data is unavailable.
 
     // Iterate through all children of this datatype.
-    std::queue<int64_t> to_visit;
+    base::queue<int64_t> to_visit;
     int64_t child_id = type_root.GetFirstChildId();
     to_visit.push(child_id);
     while (!to_visit.empty()) {
diff --git a/components/sync/syncable/change_reorder_buffer.cc b/components/sync/syncable/change_reorder_buffer.cc
index f920d27..83631e34 100644
--- a/components/sync/syncable/change_reorder_buffer.cc
+++ b/components/sync/syncable/change_reorder_buffer.cc
@@ -5,10 +5,10 @@
 #include "components/sync/syncable/change_reorder_buffer.h"
 
 #include <limits>
-#include <queue>
 #include <set>
 #include <utility>  // for pair<>
 
+#include "base/containers/queue.h"
 #include "components/sync/syncable/base_node.h"
 #include "components/sync/syncable/base_transaction.h"
 #include "components/sync/syncable/entry.h"
@@ -16,7 +16,6 @@
 
 using std::numeric_limits;
 using std::pair;
-using std::queue;
 using std::set;
 
 namespace syncer {
@@ -186,7 +185,7 @@
   }
 
   // Step 2: Breadth-first expansion of the traversal.
-  queue<int64_t> to_visit;
+  base::queue<int64_t> to_visit;
   to_visit.push(traversal.top());
   while (!to_visit.empty()) {
     int64_t next = to_visit.front();
diff --git a/components/sync/syncable/nigori_util.cc b/components/sync/syncable/nigori_util.cc
index dab4b7d..a3aac7bd 100644
--- a/components/sync/syncable/nigori_util.cc
+++ b/components/sync/syncable/nigori_util.cc
@@ -8,10 +8,10 @@
 #include <stdint.h>
 
 #include <memory>
-#include <queue>
 #include <string>
 #include <vector>
 
+#include "base/containers/queue.h"
 #include "base/json/json_writer.h"
 #include "components/sync/base/cryptographer.h"
 #include "components/sync/base/passphrase_type.h"
@@ -107,7 +107,7 @@
     return false;
   }
 
-  std::queue<Id> to_visit;
+  base::queue<Id> to_visit;
   Id id_string = type_root.GetFirstChildId();
   to_visit.push(id_string);
   while (!to_visit.empty()) {
diff --git a/components/sync_preferences/pref_service_syncable.cc b/components/sync_preferences/pref_service_syncable.cc
index e86cb800..90c8bc13 100644
--- a/components/sync_preferences/pref_service_syncable.cc
+++ b/components/sync_preferences/pref_service_syncable.cc
@@ -11,6 +11,7 @@
 #include "base/value_conversions.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/default_pref_store.h"
+#include "components/prefs/in_memory_pref_store.h"
 #include "components/prefs/overlay_user_pref_store.h"
 #include "components/prefs/pref_notifier_impl.h"
 #include "components/prefs/pref_registry.h"
@@ -83,12 +84,14 @@
       static_cast<user_prefs::PrefRegistrySyncable*>(pref_registry_.get())
           ->ForkForIncognito();
 
+  auto overlay = base::MakeRefCounted<InMemoryPrefStore>();
   if (delegate) {
-    delegate->InitIncognitoUnderlay(user_pref_store_.get());
+    delegate->InitIncognitoUserPrefs(overlay, user_pref_store_,
+                                     overlay_pref_names);
     delegate->InitPrefRegistry(forked_registry.get());
   }
-  auto incognito_pref_store =
-      base::MakeRefCounted<OverlayUserPrefStore>(user_pref_store_.get());
+  auto incognito_pref_store = base::MakeRefCounted<OverlayUserPrefStore>(
+      overlay.get(), user_pref_store_.get());
 
   for (const char* overlay_pref_name : overlay_pref_names)
     incognito_pref_store->RegisterOverlayPref(overlay_pref_name);
diff --git a/components/tracing/common/tracing_messages.cc b/components/tracing/common/tracing_messages.cc
index 798e1a8..f4e4105 100644
--- a/components/tracing/common/tracing_messages.cc
+++ b/components/tracing/common/tracing_messages.cc
@@ -26,16 +26,6 @@
 #error "Failed to include components/tracing/common/tracing_messages.h"
 #endif
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef COMPONENTS_TRACING_COMMON_TRACING_MESSAGES_H_
-#include "components/tracing/common/tracing_messages.h"
-#ifndef COMPONENTS_TRACING_COMMON_TRACING_MESSAGES_H_
-#error "Failed to include components/tracing/common/tracing_messages.h"
-#endif
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/components/update_client/update_client_internal.h b/components/update_client/update_client_internal.h
index 99a7f56..cceb535 100644
--- a/components/update_client/update_client_internal.h
+++ b/components/update_client/update_client_internal.h
@@ -6,11 +6,11 @@
 #define COMPONENTS_UPDATE_CLIENT_UPDATE_CLIENT_INTERNAL_H_
 
 #include <memory>
-#include <queue>
 #include <set>
 #include <string>
 #include <vector>
 
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
@@ -71,7 +71,7 @@
   // only update tasks (background tasks) are queued up. These tasks are
   // pending while they are in this queue. They have not been picked up yet
   // by the update engine.
-  std::queue<Task*> task_queue_;
+  base::queue<Task*> task_queue_;
 
   // Contains all tasks in progress. These are the tasks that the update engine
   // is executing at one moment. Install tasks are run concurrently, update
diff --git a/components/update_client/update_engine.h b/components/update_client/update_engine.h
index 9f3b57f..64d220e 100644
--- a/components/update_client/update_engine.h
+++ b/components/update_client/update_engine.h
@@ -9,12 +9,12 @@
 #include <list>
 #include <map>
 #include <memory>
-#include <queue>
 #include <set>
 #include <string>
 #include <vector>
 
 #include "base/callback.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
@@ -165,7 +165,7 @@
 
   IdToComponentPtrMap components;
 
-  std::queue<std::string> component_queue;
+  base::queue<std::string> component_queue;
 
   // The time to wait before handling the update for a component.
   // The wait time is proportional with the cost incurred by updating
diff --git a/components/update_client/url_request_post_interceptor.h b/components/update_client/url_request_post_interceptor.h
index bead17c..8763193 100644
--- a/components/update_client/url_request_post_interceptor.h
+++ b/components/update_client/url_request_post_interceptor.h
@@ -7,11 +7,11 @@
 
 #include <stdint.h>
 #include <map>
-#include <queue>
 #include <string>
 #include <utility>
 #include <vector>
 
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
@@ -97,7 +97,7 @@
   mutable base::Lock interceptor_lock_;
   mutable int hit_count_;
   mutable std::vector<std::string> requests_;
-  mutable std::queue<Expectation> expectations_;
+  mutable base::queue<Expectation> expectations_;
 
   DISALLOW_COPY_AND_ASSIGN(URLRequestPostInterceptor);
 };
diff --git a/components/url_matcher/substring_set_matcher.cc b/components/url_matcher/substring_set_matcher.cc
index dff9aa73..902c5dd3 100644
--- a/components/url_matcher/substring_set_matcher.cc
+++ b/components/url_matcher/substring_set_matcher.cc
@@ -9,6 +9,7 @@
 #include <algorithm>
 #include <queue>
 
+#include "base/containers/queue.h"
 #include "base/logging.h"
 #include "base/stl_util.h"
 
@@ -192,7 +193,7 @@
 void SubstringSetMatcher::CreateFailureEdges() {
   typedef AhoCorasickNode::Edges Edges;
 
-  std::queue<uint32_t> queue;
+  base::queue<uint32_t> queue;
 
   AhoCorasickNode& root = tree_[0];
   root.set_failure(0);
diff --git a/components/viz/common/gl_helper.cc b/components/viz/common/gl_helper.cc
index 003db7b..d478ccc 100644
--- a/components/viz/common/gl_helper.cc
+++ b/components/viz/common/gl_helper.cc
@@ -7,10 +7,10 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <queue>
 #include <string>
 
 #include "base/bind.h"
+#include "base/containers/queue.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/macros.h"
@@ -249,7 +249,7 @@
     void Add(Request* r) { requests_.push(r); }
 
    private:
-    std::queue<Request*> requests_;
+    base::queue<Request*> requests_;
     DISALLOW_COPY_AND_ASSIGN(FinishRequestHelper);
   };
 
@@ -391,7 +391,7 @@
   // this object is destroyed. Must be declared before other Scoped* fields.
   ScopedFlush flush_;
 
-  std::queue<Request*> request_queue_;
+  base::queue<Request*> request_queue_;
   GLint max_draw_buffers_;
 };
 
diff --git a/components/viz/service/display/shader.cc b/components/viz/service/display/shader.cc
index 108b444..03fe4c65 100644
--- a/components/viz/service/display/shader.cc
+++ b/components/viz/service/display/shader.cc
@@ -31,13 +31,13 @@
 // handling them correctly. StipLambda removes this.
 #define SHADER0(Src) StripLambda(#Src)
 
-#define HDR(x)                       \
-  do {                               \
-    header += x + std::string("\n"); \
+#define HDR(x)        \
+  do {                \
+    header += x "\n"; \
   } while (0)
-#define SRC(x)                                           \
-  do {                                                   \
-    source += std::string("  ") + x + std::string("\n"); \
+#define SRC(x)             \
+  do {                     \
+    source += "  " x "\n"; \
   } while (0)
 
 using gpu::gles2::GLES2Interface;
diff --git a/components/viz/service/surfaces/surface_manager.cc b/components/viz/service/surfaces/surface_manager.cc
index 5cd9715..2ef9a41 100644
--- a/components/viz/service/surfaces/surface_manager.cc
+++ b/components/viz/service/surfaces/surface_manager.cc
@@ -8,9 +8,9 @@
 #include <stdint.h>
 
 #include <algorithm>
-#include <queue>
 #include <utility>
 
+#include "base/containers/queue.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
@@ -272,7 +272,7 @@
 
   // Walk down from the root and mark each SurfaceId we encounter as
   // reachable.
-  std::queue<SurfaceId> surface_queue;
+  base::queue<SurfaceId> surface_queue;
   surface_queue.push(root_surface_id_);
 
   // All surfaces not marked for destruction are reachable.
diff --git a/content/browser/blob_storage/blob_dispatcher_host.cc b/content/browser/blob_storage/blob_dispatcher_host.cc
index 3030bf95..da775662 100644
--- a/content/browser/blob_storage/blob_dispatcher_host.cc
+++ b/content/browser/blob_storage/blob_dispatcher_host.cc
@@ -378,7 +378,7 @@
   // using blobs by sending an IncrementRefCount IPC. Furthermore with mojo
   // blobs it doesn't make sense anymore to try to decide if a blob is in use in
   // a process, so just always return true in that case.
-  return base::FeatureList::IsEnabled(features::kMojoBlobs) ||
+  return features::IsMojoBlobsEnabled() ||
          base::ContainsKey(blobs_inuse_map_, uuid);
 }
 
diff --git a/content/browser/blob_storage/blob_registry_wrapper.cc b/content/browser/blob_storage/blob_registry_wrapper.cc
index a339b24..9f769e2 100644
--- a/content/browser/blob_storage/blob_registry_wrapper.cc
+++ b/content/browser/blob_storage/blob_registry_wrapper.cc
@@ -55,7 +55,7 @@
 }
 
 BlobRegistryWrapper::BlobRegistryWrapper() {
-  DCHECK(base::FeatureList::IsEnabled(features::kMojoBlobs));
+  DCHECK(features::IsMojoBlobsEnabled());
 }
 
 void BlobRegistryWrapper::Bind(
diff --git a/content/browser/cache_storage/cache_storage_cache.cc b/content/browser/cache_storage/cache_storage_cache.cc
index 2f1e020..083d6e1 100644
--- a/content/browser/cache_storage/cache_storage_cache.cc
+++ b/content/browser/cache_storage/cache_storage_cache.cc
@@ -1063,8 +1063,7 @@
   std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
 
   if (!response->blob_uuid.empty()) {
-    DCHECK_EQ(response->blob != nullptr,
-              base::FeatureList::IsEnabled(features::kMojoBlobs));
+    DCHECK_EQ(response->blob != nullptr, features::IsMojoBlobsEnabled());
     if (!blob_storage_context_) {
       std::move(callback).Run(CACHE_STORAGE_ERROR_STORAGE);
       return;
@@ -1552,7 +1551,7 @@
       temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA);
   auto result = blob_storage_context_->AddFinishedBlob(&blob_data);
 
-  if (base::FeatureList::IsEnabled(features::kMojoBlobs)) {
+  if (features::IsMojoBlobsEnabled()) {
     storage::mojom::BlobPtr blob_ptr;
     storage::BlobImpl::Create(
         base::MakeUnique<storage::BlobDataHandle>(*result),
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 8313f13..98ac1d2 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -91,7 +91,6 @@
 #include "components/viz/service/display_embedder/compositor_overlay_candidate_validator_mac.h"
 #include "content/browser/compositor/gpu_output_surface_mac.h"
 #include "content/browser/compositor/software_output_device_mac.h"
-#include "gpu/config/gpu_driver_bug_workaround_type.h"
 #include "ui/base/cocoa/remote_layer_api.h"
 #include "ui/base/ui_base_switches.h"
 #elif defined(OS_ANDROID)
@@ -303,7 +302,13 @@
 }
 
 std::unique_ptr<viz::CompositorOverlayCandidateValidator>
-CreateOverlayCandidateValidator(gfx::AcceleratedWidget widget) {
+CreateOverlayCandidateValidator(
+#if defined(OS_MACOSX)
+    gfx::AcceleratedWidget widget,
+    bool disable_overlay_ca_layers) {
+#else
+    gfx::AcceleratedWidget widget) {
+#endif
   std::unique_ptr<viz::CompositorOverlayCandidateValidator> validator;
 #if defined(USE_OZONE)
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
@@ -323,9 +328,7 @@
     static bool overlays_disabled_at_command_line =
         IsCALayersDisabledFromCommandLine();
     const bool ca_layers_disabled =
-        overlays_disabled_at_command_line ||
-        GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive(
-            gpu::DISABLE_OVERLAY_CA_LAYERS);
+        overlays_disabled_at_command_line || disable_overlay_ca_layers;
     validator.reset(
         new viz::CompositorOverlayCandidateValidatorMac(ca_layers_disabled));
   }
@@ -555,7 +558,8 @@
         display_output_surface = base::MakeUnique<GpuOutputSurfaceMac>(
             compositor->widget(), context_provider, data->surface_handle,
             vsync_callback,
-            CreateOverlayCandidateValidator(compositor->widget()),
+            CreateOverlayCandidateValidator(
+                compositor->widget(), capabilities.disable_overlay_ca_layers),
             GetGpuMemoryBufferManager());
 #else
         auto gpu_output_surface =
diff --git a/content/browser/gpu/gpu_data_manager_impl.cc b/content/browser/gpu/gpu_data_manager_impl.cc
index e28f0518..22b684d 100644
--- a/content/browser/gpu/gpu_data_manager_impl.cc
+++ b/content/browser/gpu/gpu_data_manager_impl.cc
@@ -81,11 +81,6 @@
   return private_->IsWebGLEnabled();
 }
 
-bool GpuDataManagerImpl::IsDriverBugWorkaroundActive(int feature) const {
-  base::AutoLock auto_lock(lock_);
-  return private_->IsDriverBugWorkaroundActive(feature);
-}
-
 gpu::GPUInfo GpuDataManagerImpl::GetGPUInfo() const {
   base::AutoLock auto_lock(lock_);
   return private_->GetGPUInfo();
diff --git a/content/browser/gpu/gpu_data_manager_impl.h b/content/browser/gpu/gpu_data_manager_impl.h
index e278e140..e64ee34 100644
--- a/content/browser/gpu/gpu_data_manager_impl.h
+++ b/content/browser/gpu/gpu_data_manager_impl.h
@@ -186,8 +186,6 @@
   // Called when GPU process initialization failed.
   void OnGpuProcessInitFailure();
 
-  bool IsDriverBugWorkaroundActive(int feature) const;
-
  private:
   friend class GpuDataManagerImplPrivate;
   friend class GpuDataManagerImplPrivateTest;
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc
index 4388cef..4eea5f02 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.cc
+++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -355,19 +355,6 @@
          !blacklisted_features_.count(gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL);
 }
 
-bool GpuDataManagerImplPrivate::IsDriverBugWorkaroundActive(int feature) const {
-  switch (feature) {
-    // TODO(zmo): Remove these use cases and obsolete this function.
-    case gpu::DISABLE_OVERLAY_CA_LAYERS:
-    case gpu::DONT_DISABLE_WEBGL_WHEN_COMPOSITOR_CONTEXT_LOST:
-    case gpu::WAKE_UP_GPU_BEFORE_DRAWING:
-      return gpu_feature_info_.IsWorkaroundEnabled(feature);
-    default:
-      NOTREACHED();
-      return false;
-  }
-}
-
 size_t GpuDataManagerImplPrivate::GetBlacklistedFeatureCount() const {
   // SwiftShader blacklists all features
   return use_swiftshader_ ? gpu::NUMBER_OF_GPU_FEATURE_TYPES
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.h b/content/browser/gpu/gpu_data_manager_impl_private.h
index 333a74d6..5d1766c 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.h
+++ b/content/browser/gpu/gpu_data_manager_impl_private.h
@@ -45,7 +45,6 @@
   bool IsFeatureBlacklisted(int feature) const;
   bool IsFeatureEnabled(int feature) const;
   bool IsWebGLEnabled() const;
-  bool IsDriverBugWorkaroundActive(int feature) const;
   gpu::GPUInfo GetGPUInfo() const;
   bool GpuAccessAllowed(std::string* reason) const;
   void RequestCompleteGpuInfoIfNeeded();
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index e1879c6..4e3a4db 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -842,6 +842,16 @@
     const gpu::GpuFeatureInfo& gpu_feature_info) {
   UMA_HISTOGRAM_BOOLEAN("GPU.GPUProcessInitialized", true);
   status_ = SUCCESS;
+
+  // Set GPU driver bug workaround flags that are checked on the browser side.
+  if (gpu_feature_info.IsWorkaroundEnabled(gpu::WAKE_UP_GPU_BEFORE_DRAWING)) {
+    wake_up_gpu_before_drawing_ = true;
+  }
+  if (gpu_feature_info.IsWorkaroundEnabled(
+          gpu::DONT_DISABLE_WEBGL_WHEN_COMPOSITOR_CONTEXT_LOST)) {
+    dont_disable_webgl_when_compositor_context_lost_ = true;
+  }
+
   GpuDataManagerImpl* gpu_data_manager = GpuDataManagerImpl::GetInstance();
   if (!gpu_data_manager->ShouldUseSwiftShader()) {
     gpu_data_manager->UpdateGpuInfo(gpu_info);
@@ -886,8 +896,7 @@
     // offscreen context. However, situations have been seen where the
     // compositor's context can be lost due to driver bugs (as of this
     // writing, on Android), so allow that possibility.
-    if (!GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive(
-            gpu::DONT_DISABLE_WEBGL_WHEN_COMPOSITOR_CONTEXT_LOST)) {
+    if (!dont_disable_webgl_when_compositor_context_lost_) {
       BlockLiveOffscreenContexts();
     }
     return;
diff --git a/content/browser/gpu/gpu_process_host.h b/content/browser/gpu/gpu_process_host.h
index c9d096fd..3f040d8 100644
--- a/content/browser/gpu/gpu_process_host.h
+++ b/content/browser/gpu/gpu_process_host.h
@@ -165,6 +165,10 @@
 
   CONTENT_EXPORT viz::mojom::GpuService* gpu_service();
 
+  bool wake_up_gpu_before_drawing() const {
+    return wake_up_gpu_before_drawing_;
+  }
+
  private:
   class ConnectionFilterImpl;
 
@@ -294,6 +298,12 @@
 
   std::string shader_prefix_key_;
 
+  // The following are a list of driver bug workarounds that will only be
+  // set to true in DidInitialize(), where GPU process has started and GPU
+  // driver bug workarounds have been computed and sent back.
+  bool wake_up_gpu_before_drawing_ = false;
+  bool dont_disable_webgl_when_compositor_context_lost_ = false;
+
   ui::mojom::GpuMainAssociatedPtr gpu_main_ptr_;
   viz::mojom::GpuServicePtr gpu_service_ptr_;
   mojo::Binding<ui::mojom::GpuHost> gpu_host_binding_;
diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc
index 9c7d78f..788cef3 100644
--- a/content/browser/host_zoom_map_impl.cc
+++ b/content/browser/host_zoom_map_impl.cc
@@ -9,6 +9,7 @@
 
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/time/default_clock.h"
 #include "base/values.h"
 #include "content/browser/frame_host/navigation_entry_impl.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
@@ -114,8 +115,9 @@
 }
 
 HostZoomMapImpl::HostZoomMapImpl()
-    : default_zoom_level_(0.0) {
-}
+    : default_zoom_level_(0.0),
+      store_last_modified_(false),
+      clock_(new base::DefaultClock) {}
 
 void HostZoomMapImpl::CopyFrom(HostZoomMap* copy_interface) {
   // This can only be called on the UI thread to avoid deadlocks, otherwise
@@ -146,7 +148,7 @@
 double HostZoomMapImpl::GetZoomLevelForHostInternal(
     const std::string& host) const {
   HostZoomLevels::const_iterator i(host_zoom_levels_.find(host));
-  return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second;
+  return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second.level;
 }
 
 bool HostZoomMapImpl::HasZoomLevel(const std::string& scheme,
@@ -173,7 +175,7 @@
   if (scheme_iterator != scheme_host_zoom_levels_.end()) {
     HostZoomLevels::const_iterator i(scheme_iterator->second.find(host));
     if (i != scheme_iterator->second.end())
-      return i->second;
+      return i->second.level;
   }
 
   return GetZoomLevelForHostInternal(host);
@@ -191,29 +193,26 @@
   {
     base::AutoLock auto_lock(lock_);
     result.reserve(host_zoom_levels_.size() + scheme_host_zoom_levels_.size());
-    for (HostZoomLevels::const_iterator i = host_zoom_levels_.begin();
-         i != host_zoom_levels_.end();
-         ++i) {
-      ZoomLevelChange change = {HostZoomMap::ZOOM_CHANGED_FOR_HOST,
-                                i->first,       // host
-                                std::string(),  // scheme
-                                i->second       // zoom level
+    for (const auto& entry : host_zoom_levels_) {
+      ZoomLevelChange change = {
+          HostZoomMap::ZOOM_CHANGED_FOR_HOST,
+          entry.first,                // host
+          std::string(),              // scheme
+          entry.second.level,         // zoom level
+          entry.second.last_modified  // last modified
       };
       result.push_back(change);
     }
-    for (SchemeHostZoomLevels::const_iterator i =
-             scheme_host_zoom_levels_.begin();
-         i != scheme_host_zoom_levels_.end();
-         ++i) {
-      const std::string& scheme = i->first;
-      const HostZoomLevels& host_zoom_levels = i->second;
-      for (HostZoomLevels::const_iterator j = host_zoom_levels.begin();
-           j != host_zoom_levels.end();
-           ++j) {
-        ZoomLevelChange change = {HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST,
-                                  j->first,  // host
-                                  scheme,    // scheme
-                                  j->second  // zoom level
+    for (const auto& scheme_entry : scheme_host_zoom_levels_) {
+      const std::string& scheme = scheme_entry.first;
+      const HostZoomLevels& host_zoom_levels = scheme_entry.second;
+      for (const auto& entry : host_zoom_levels) {
+        ZoomLevelChange change = {
+            HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST,
+            entry.first,                // host
+            scheme,                     // scheme
+            entry.second.level,         // zoom level
+            entry.second.last_modified  // last modified
         };
         result.push_back(change);
       }
@@ -224,15 +223,32 @@
 
 void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host,
                                           double level) {
+  base::Time last_modified =
+      store_last_modified_ ? clock_->Now() : base::Time();
+  SetZoomLevelForHostInternal(host, level, last_modified);
+}
+
+void HostZoomMapImpl::InitializeZoomLevelForHost(const std::string& host,
+                                                 double level,
+                                                 base::Time last_modified) {
+  SetZoomLevelForHostInternal(host, level, last_modified);
+}
+
+void HostZoomMapImpl::SetZoomLevelForHostInternal(const std::string& host,
+                                                  double level,
+                                                  base::Time last_modified) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   {
     base::AutoLock auto_lock(lock_);
 
-    if (ZoomValuesEqual(level, default_zoom_level_))
+    if (ZoomValuesEqual(level, default_zoom_level_)) {
       host_zoom_levels_.erase(host);
-    else
-      host_zoom_levels_[host] = level;
+    } else {
+      ZoomLevel& zoomLevel = host_zoom_levels_[host];
+      zoomLevel.level = level;
+      zoomLevel.last_modified = last_modified;
+    }
   }
 
   // TODO(wjmaclean) Should we use a GURL here? crbug.com/384486
@@ -242,6 +258,7 @@
   change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST;
   change.host = host;
   change.zoom_level = level;
+  change.last_modified = last_modified;
 
   zoom_level_changed_callbacks_.Notify(change);
 }
@@ -252,7 +269,9 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   {
     base::AutoLock auto_lock(lock_);
-    scheme_host_zoom_levels_[scheme][host] = level;
+    // No last_modified timestamp for scheme and host because they are
+    // not persistet and are used for special cases only.
+    scheme_host_zoom_levels_[scheme][host].level = level;
   }
 
   SendZoomLevelChange(scheme, host, level);
@@ -262,6 +281,7 @@
   change.host = host;
   change.scheme = scheme;
   change.zoom_level = level;
+  change.last_modified = base::Time();
 
   zoom_level_changed_callbacks_.Notify(change);
 }
@@ -283,7 +303,7 @@
   {
     base::AutoLock auto_lock(lock_);
     for (auto it = host_zoom_levels_.begin(); it != host_zoom_levels_.end(); ) {
-      if (ZoomValuesEqual(it->second, default_zoom_level_))
+      if (ZoomValuesEqual(it->second.level, default_zoom_level_))
         it = host_zoom_levels_.erase(it);
       else
         it++;
@@ -485,6 +505,21 @@
                                               net::GetHostOrSpecFromURL(url));
 }
 
+void HostZoomMapImpl::ClearZoomLevels(base::Time delete_begin,
+                                      base::Time delete_end) {
+  double default_zoom_level = GetDefaultZoomLevel();
+  for (auto& zoom_level : GetAllZoomLevels()) {
+    if (zoom_level.scheme.empty() && delete_begin <= zoom_level.last_modified &&
+        (delete_end.is_null() || zoom_level.last_modified < delete_end)) {
+      SetZoomLevelForHost(zoom_level.host, default_zoom_level);
+    }
+  }
+}
+
+void HostZoomMapImpl::SetStoreLastModified(bool store_last_modified) {
+  store_last_modified_ = store_last_modified;
+}
+
 void HostZoomMapImpl::ClearTemporaryZoomLevel(int render_process_id,
                                               int render_view_id) {
   {
@@ -541,4 +576,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
+void HostZoomMapImpl::SetClockForTesting(std::unique_ptr<base::Clock> clock) {
+  clock_ = std::move(clock);
+}
+
 }  // namespace content
diff --git a/content/browser/host_zoom_map_impl.h b/content/browser/host_zoom_map_impl.h
index 0ba3bc9..418acedf 100644
--- a/content/browser/host_zoom_map_impl.h
+++ b/content/browser/host_zoom_map_impl.h
@@ -40,6 +40,9 @@
                     const std::string& host) const override;
   ZoomLevelVector GetAllZoomLevels() const override;
   void SetZoomLevelForHost(const std::string& host, double level) override;
+  void InitializeZoomLevelForHost(const std::string& host,
+                                  double level,
+                                  base::Time last_modified) override;
   void SetZoomLevelForHostAndScheme(const std::string& scheme,
                                     const std::string& host,
                                     double level) override;
@@ -48,7 +51,8 @@
   void SetTemporaryZoomLevel(int render_process_id,
                              int render_view_id,
                              double level) override;
-
+  void ClearZoomLevels(base::Time delete_begin, base::Time delete_end) override;
+  void SetStoreLastModified(bool store_last_modified) override;
   void ClearTemporaryZoomLevel(int render_process_id,
                                int render_view_id) override;
   double GetDefaultZoomLevel() const override;
@@ -97,8 +101,14 @@
 
   void WillCloseRenderView(int render_process_id, int render_view_id);
 
+  void SetClockForTesting(std::unique_ptr<base::Clock> clock) override;
+
  private:
-  typedef std::map<std::string, double> HostZoomLevels;
+  struct ZoomLevel {
+    double level;
+    base::Time last_modified;
+  };
+  typedef std::map<std::string, ZoomLevel> HostZoomLevels;
   typedef std::map<std::string, HostZoomLevels> SchemeHostZoomLevels;
 
   struct RenderViewKey {
@@ -124,6 +134,12 @@
   double GetZoomLevelForHostAndSchemeInternal(const std::string& scheme,
                                               const std::string& host) const;
 
+  // Set a zoom level for |host| and store the |last_modified| timestamp.
+  // Use only to explicitly set a timestamp.
+  void SetZoomLevelForHostInternal(const std::string& host,
+                                   double level,
+                                   base::Time last_modified);
+
   // Notifies the renderers from this browser context to change the zoom level
   // for the specified host and scheme.
   // TODO(wjmaclean) Should we use a GURL here? crbug.com/384486
@@ -150,6 +166,10 @@
   // guarantee thread safety.
   mutable base::Lock lock_;
 
+  bool store_last_modified_;
+
+  std::unique_ptr<base::Clock> clock_;
+
   DISALLOW_COPY_AND_ASSIGN(HostZoomMapImpl);
 };
 
diff --git a/content/browser/host_zoom_map_impl_unittest.cc b/content/browser/host_zoom_map_impl_unittest.cc
index 2901e16d7..a7df2ef 100644
--- a/content/browser/host_zoom_map_impl_unittest.cc
+++ b/content/browser/host_zoom_map_impl_unittest.cc
@@ -7,8 +7,10 @@
 #include <stddef.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/test/simple_test_clock.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -82,7 +84,76 @@
     EXPECT_EQ(expected[i].scheme, levels[i].scheme);
     EXPECT_EQ(expected[i].host, levels[i].host);
     EXPECT_EQ(expected[i].zoom_level, levels[i].zoom_level);
+    EXPECT_EQ(expected[i].last_modified, base::Time());
   }
 }
 
+TEST_F(HostZoomMapTest, LastModifiedTimestamp) {
+  HostZoomMapImpl host_zoom_map;
+  host_zoom_map.SetStoreLastModified(true);
+
+  base::Time now = base::Time::Now();
+  auto test_clock = base::MakeUnique<base::SimpleTestClock>();
+  base::SimpleTestClock* clock = test_clock.get();
+  host_zoom_map.SetClockForTesting(std::move(test_clock));
+
+  clock->SetNow(now);
+  host_zoom_map.SetZoomLevelForHost("zoomed.com", 1.5);
+  host_zoom_map.SetZoomLevelForHost("zoomed2.com", 2.0);
+
+  base::Time later = now + base::TimeDelta::FromSeconds(1);
+  clock->SetNow(later);
+  host_zoom_map.SetZoomLevelForHost("zoomed2.com", 2.5);
+  host_zoom_map.SetZoomLevelForHost("zoomzoom.com", 3);
+  host_zoom_map.SetZoomLevelForHostAndScheme("chrome", "login", 3);
+
+  HostZoomMap::ZoomLevelVector levels = host_zoom_map.GetAllZoomLevels();
+  std::string scheme;
+  HostZoomMap::ZoomLevelChange expected[] = {
+      {HostZoomMap::ZOOM_CHANGED_FOR_HOST, "zoomed.com", scheme, 1.5, now},
+      {HostZoomMap::ZOOM_CHANGED_FOR_HOST, "zoomed2.com", scheme, 2.5, later},
+      {HostZoomMap::ZOOM_CHANGED_FOR_HOST, "zoomzoom.com", scheme, 3.0, later},
+      {HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST, "login", "chrome", 3.0,
+       base::Time()},
+  };
+  ASSERT_EQ(arraysize(expected), levels.size());
+  for (size_t i = 0; i < arraysize(expected); ++i) {
+    SCOPED_TRACE(testing::Message() << "levels[" << i << "]");
+    EXPECT_EQ(expected[i].mode, levels[i].mode);
+    EXPECT_EQ(expected[i].scheme, levels[i].scheme);
+    EXPECT_EQ(expected[i].host, levels[i].host);
+    EXPECT_EQ(expected[i].zoom_level, levels[i].zoom_level);
+    EXPECT_EQ(expected[i].last_modified, levels[i].last_modified);
+  }
+}
+
+TEST_F(HostZoomMapTest, ClearZoomLevels) {
+  HostZoomMapImpl host_zoom_map;
+  host_zoom_map.SetStoreLastModified(true);
+
+  auto test_clock = base::MakeUnique<base::SimpleTestClock>();
+  base::SimpleTestClock* clock = test_clock.get();
+  host_zoom_map.SetClockForTesting(std::move(test_clock));
+
+  base::Time now = base::Time::Now();
+  clock->SetNow(now - base::TimeDelta::FromHours(3));
+  host_zoom_map.SetZoomLevelForHost("zoomzoom.com", 3.5);
+  clock->SetNow(now - base::TimeDelta::FromHours(1));
+  host_zoom_map.SetZoomLevelForHost("zoom.com", 1.5);
+  EXPECT_EQ(2u, host_zoom_map.GetAllZoomLevels().size());
+
+  host_zoom_map.ClearZoomLevels(now - base::TimeDelta::FromHours(2),
+                                base::Time::Max());
+  EXPECT_EQ(1u, host_zoom_map.GetAllZoomLevels().size());
+  EXPECT_EQ("zoomzoom.com", host_zoom_map.GetAllZoomLevels()[0].host);
+
+  host_zoom_map.ClearZoomLevels(base::Time(), base::Time::Max());
+  EXPECT_EQ(0u, host_zoom_map.GetAllZoomLevels().size());
+
+  // Host and scheme settings should not be affected.
+  host_zoom_map.SetZoomLevelForHostAndScheme("chrome", "login", 3);
+  host_zoom_map.ClearZoomLevels(base::Time(), base::Time::Max());
+  EXPECT_EQ(1u, host_zoom_map.GetAllZoomLevels().size());
+}
+
 }  // namespace content
diff --git a/content/browser/media/capture/aura_window_capture_machine.cc b/content/browser/media/capture/aura_window_capture_machine.cc
index f62dab27..eaa46f90 100644
--- a/content/browser/media/capture/aura_window_capture_machine.cc
+++ b/content/browser/media/capture/aura_window_capture_machine.cc
@@ -81,6 +81,9 @@
   // Update capture size.
   UpdateCaptureSize();
 
+  // Start observing for GL context losses.
+  ImageTransportFactory::GetInstance()->GetContextFactory()->AddObserver(this);
+
   // Start observing compositor updates.
   aura::WindowTreeHost* const host = desktop_window_->GetHost();
   ui::Compositor* const compositor = host ? host->compositor() : nullptr;
@@ -165,6 +168,11 @@
     cursor_renderer_.reset();
   }
 
+  // Stop observing for GL context losses.
+  ImageTransportFactory::GetInstance()->GetContextFactory()->RemoveObserver(
+      this);
+  OnLostResources();
+
   callback.Run();
 }
 
@@ -462,4 +470,9 @@
   compositor->RemoveAnimationObserver(this);
 }
 
+void AuraWindowCaptureMachine::OnLostResources() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  yuv_readback_pipeline_.reset();
+}
+
 }  // namespace content
diff --git a/content/browser/media/capture/aura_window_capture_machine.h b/content/browser/media/capture/aura_window_capture_machine.h
index 5062a692..e8de893 100644
--- a/content/browser/media/capture/aura_window_capture_machine.h
+++ b/content/browser/media/capture/aura_window_capture_machine.h
@@ -25,10 +25,10 @@
 
 namespace content {
 
-class AuraWindowCaptureMachine
-    : public media::VideoCaptureMachine,
-      public aura::WindowObserver,
-      public ui::CompositorAnimationObserver {
+class AuraWindowCaptureMachine : public media::VideoCaptureMachine,
+                                 public aura::WindowObserver,
+                                 public ui::ContextFactoryObserver,
+                                 public ui::CompositorAnimationObserver {
  public:
   AuraWindowCaptureMachine();
   ~AuraWindowCaptureMachine() override;
@@ -92,6 +92,9 @@
                                  const CaptureFrameCallback& capture_frame_cb,
                                  std::unique_ptr<viz::CopyOutputResult> result);
 
+  // ui::ContextFactoryObserver implementation.
+  void OnLostResources() override;
+
   // Renders the cursor if needed and then delivers the captured frame.
   static void CopyOutputFinishedForVideo(
       base::WeakPtr<AuraWindowCaptureMachine> machine,
diff --git a/content/browser/media/capture/desktop_capture_device_aura_unittest.cc b/content/browser/media/capture/desktop_capture_device_aura_unittest.cc
index 97bd085..09f962f 100644
--- a/content/browser/media/capture/desktop_capture_device_aura_unittest.cc
+++ b/content/browser/media/capture/desktop_capture_device_aura_unittest.cc
@@ -10,7 +10,9 @@
 
 #include "base/location.h"
 #include "base/macros.h"
+#include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
+#include "content/browser/compositor/test/no_transport_image_transport_factory.h"
 #include "content/public/browser/desktop_media_id.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "media/capture/video_capture_types.h"
@@ -20,7 +22,6 @@
 #include "ui/aura/test/aura_test_helper.h"
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/window.h"
-#include "ui/compositor/test/context_factories_for_test.h"
 #include "ui/wm/core/default_activation_client.h"
 
 using ::testing::_;
@@ -105,14 +106,12 @@
  protected:
   void SetUp() override {
     // The ContextFactory must exist before any Compositors are created.
-
-    bool enable_pixel_output = false;
-    ui::ContextFactory* context_factory = nullptr;
-    ui::ContextFactoryPrivate* context_factory_private = nullptr;
-    ui::InitializeContextFactoryForTests(enable_pixel_output, &context_factory,
-                                         &context_factory_private);
+    ImageTransportFactory::InitializeForUnitTests(
+        std::make_unique<NoTransportImageTransportFactory>());
     helper_.reset(new aura::test::AuraTestHelper());
-    helper_->SetUp(context_factory, context_factory_private);
+    helper_->SetUp(
+        ImageTransportFactory::GetInstance()->GetContextFactory(),
+        ImageTransportFactory::GetInstance()->GetContextFactoryPrivate());
     new wm::DefaultActivationClient(helper_->root_window());
     // We need a window to cover desktop area so that DesktopCaptureDeviceAura
     // can use gfx::NativeWindow::GetWindowAtScreenPoint() to locate the
@@ -133,7 +132,8 @@
     desktop_window_.reset();
     window_delegate_.reset();
     helper_->TearDown();
-    ui::TerminateContextFactoryForTests();
+    base::RunLoop().RunUntilIdle();
+    ImageTransportFactory::Terminate();
   }
 
   aura::Window* root_window() { return helper_->root_window(); }
diff --git a/content/browser/payments/payment_app_database.cc b/content/browser/payments/payment_app_database.cc
index 5c919b4..b84f3ae 100644
--- a/content/browser/payments/payment_app_database.cc
+++ b/content/browser/payments/payment_app_database.cc
@@ -193,14 +193,15 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   if (instrument->icons.size() > 0) {
-    instrument_icon_fetcher_ =
-        base::MakeRefCounted<PaymentInstrumentIconFetcher>();
-    instrument_icon_fetcher_->Start(
+    std::unique_ptr<PaymentInstrumentIconFetcher> icon_fetcher =
+        base::MakeUnique<PaymentInstrumentIconFetcher>();
+    icon_fetcher->Start(
         instrument->icons, service_worker_context_,
         base::BindOnce(&PaymentAppDatabase::DidFetchedPaymentInstrumentIcon,
                        weak_ptr_factory_.GetWeakPtr(), scope, instrument_key,
                        base::Passed(std::move(instrument)),
-                       base::Passed(std::move(callback))));
+                       base::Passed(std::move(callback)),
+                       base::Passed(std::move(icon_fetcher))));
   } else {
     service_worker_context_->FindReadyRegistrationForPattern(
         scope,
@@ -217,10 +218,11 @@
     const std::string& instrument_key,
     payments::mojom::PaymentInstrumentPtr instrument,
     WritePaymentInstrumentCallback callback,
+    std::unique_ptr<PaymentInstrumentIconFetcher> icon_fetcher,
     const std::string& icon) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
-  instrument_icon_fetcher_ = nullptr;
+  icon_fetcher.reset();
   if (icon.empty()) {
     std::move(callback).Run(PaymentHandlerStatus::FETCH_INSTRUMENT_ICON_FAILED);
     return;
diff --git a/content/browser/payments/payment_app_database.h b/content/browser/payments/payment_app_database.h
index 164aedb..acf226d3 100644
--- a/content/browser/payments/payment_app_database.h
+++ b/content/browser/payments/payment_app_database.h
@@ -161,6 +161,7 @@
       const std::string& instrument_key,
       payments::mojom::PaymentInstrumentPtr instrument,
       WritePaymentInstrumentCallback callback,
+      std::unique_ptr<PaymentInstrumentIconFetcher> fetcher,
       const std::string& icon);
 
   // ClearPaymentInstruments callbacks
@@ -178,7 +179,6 @@
                                   ServiceWorkerStatusCode status);
 
   scoped_refptr<PaymentAppInfoFetcher> payment_app_info_fetcher_;
-  scoped_refptr<PaymentInstrumentIconFetcher> instrument_icon_fetcher_;
   scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
   base::WeakPtrFactory<PaymentAppDatabase> weak_ptr_factory_;
 
diff --git a/content/browser/payments/payment_instrument_icon_fetcher.cc b/content/browser/payments/payment_instrument_icon_fetcher.cc
index 338b7cf..842563ad 100644
--- a/content/browser/payments/payment_instrument_icon_fetcher.cc
+++ b/content/browser/payments/payment_instrument_icon_fetcher.cc
@@ -45,7 +45,7 @@
 }  // namespace
 
 PaymentInstrumentIconFetcher::PaymentInstrumentIconFetcher()
-    : checking_image_object_index_(0) {}
+    : checking_image_object_index_(0), weak_ptr_factory_(this) {}
 PaymentInstrumentIconFetcher::~PaymentInstrumentIconFetcher() {}
 
 void PaymentInstrumentIconFetcher::Start(
@@ -63,7 +63,8 @@
 
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::BindOnce(&PaymentInstrumentIconFetcher::StartFromUIThread, this,
+      base::BindOnce(&PaymentInstrumentIconFetcher::StartFromUIThread,
+                     weak_ptr_factory_.GetWeakPtr(),
                      std::move(service_worker_context)));
 }
 
@@ -132,7 +133,8 @@
   data_decoder::DecodeImage(
       connector.get(), image_data, data_decoder::mojom::ImageCodec::DEFAULT,
       false, data_decoder::kDefaultMaxSizeInBytes, gfx::Size(),
-      base::BindOnce(&PaymentInstrumentIconFetcher::DecodeImageCallback, this));
+      base::BindOnce(&PaymentInstrumentIconFetcher::DecodeImageCallback,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void PaymentInstrumentIconFetcher::DecodeImageCallback(const SkBitmap& bitmap) {
diff --git a/content/browser/payments/payment_instrument_icon_fetcher.h b/content/browser/payments/payment_instrument_icon_fetcher.h
index 38416ba..c6f5876 100644
--- a/content/browser/payments/payment_instrument_icon_fetcher.h
+++ b/content/browser/payments/payment_instrument_icon_fetcher.h
@@ -19,14 +19,13 @@
 
 namespace content {
 
-class PaymentInstrumentIconFetcher
-    : public base::RefCountedThreadSafe<PaymentInstrumentIconFetcher>,
-      private net::URLFetcherDelegate {
+class PaymentInstrumentIconFetcher final : private net::URLFetcherDelegate {
  public:
   using PaymentInstrumentIconFetcherCallback =
       base::OnceCallback<void(const std::string&)>;
 
   PaymentInstrumentIconFetcher();
+  ~PaymentInstrumentIconFetcher() override;
 
   // Starts fetching and decoding payment instrument icon from online. The
   // result will be send back through |callback|.
@@ -38,9 +37,6 @@
              PaymentInstrumentIconFetcherCallback callback);
 
  private:
-  friend class base::RefCountedThreadSafe<PaymentInstrumentIconFetcher>;
-  ~PaymentInstrumentIconFetcher() override;
-
   void StartFromUIThread(
       scoped_refptr<ServiceWorkerContextWrapper> service_worker_context);
   void PostCallbackToIOThread(const std::string& decoded_data);
@@ -68,9 +64,11 @@
   // The url fetcher to fetch raw icon from online.
   std::unique_ptr<net::URLFetcher> fetcher_;
 
+  base::WeakPtrFactory<PaymentInstrumentIconFetcher> weak_ptr_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(PaymentInstrumentIconFetcher);
 };
 
 }  // namespace content
 
-#endif  // CONTENT_BROWSER_PAYMENTS_PAYMENT_INSTRUMENT_ICON_FETCHER_H_
\ No newline at end of file
+#endif  // CONTENT_BROWSER_PAYMENTS_PAYMENT_INSTRUMENT_ICON_FETCHER_H_
diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc
index 873e82f..449c070b 100644
--- a/content/browser/renderer_host/input/input_router_impl_unittest.cc
+++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc
@@ -41,6 +41,7 @@
 #include "content/public/test/test_browser_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/events/blink/blink_features.h"
 #include "ui/events/blink/web_input_event_traits.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 
@@ -193,6 +194,9 @@
   int in_flight_event_count() const {
     return input_router_client_.in_flight_event_count();
   }
+  int last_in_flight_event_type() const {
+    return input_router_client_.last_in_flight_event_type();
+  }
   void set_allow_send_event(bool allow) {
     input_router_client_.set_allow_send_event(allow);
   }
@@ -246,6 +250,9 @@
                                       features::kTouchpadAndWheelScrollLatching,
                                       features::kAsyncWheelEvents});
     }
+
+    vsync_feature_list_.InitAndEnableFeature(
+        features::kVsyncAlignedInputEvents);
   }
 
   ~InputRouterImplTest() override {}
@@ -463,6 +470,7 @@
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   SyntheticWebTouchEvent touch_event_;
 
+  base::test::ScopedFeatureList vsync_feature_list_;
   base::test::ScopedFeatureList feature_list_;
 };
 
@@ -762,13 +770,16 @@
 
   dispatched_events = GetAndResetDispatchedEvents();
 
-  // There should be a ScrollBegin, MouseWheel sent.
-  EXPECT_EQ(2U, dispatched_events.size());
+  // GestureEventQueue allows multiple in-flight events, so there should be a
+  // ScrollBegin, ScrollUpdate, and MouseWheel sent.
+  EXPECT_EQ(3U, dispatched_events.size());
 
   ASSERT_EQ(WebInputEvent::kGestureScrollBegin,
             dispatched_events.at(0).event_->web_event->GetType());
-  ASSERT_EQ(WebInputEvent::kMouseWheel,
+  ASSERT_EQ(WebInputEvent::kGestureScrollUpdate,
             dispatched_events.at(1).event_->web_event->GetType());
+  ASSERT_EQ(WebInputEvent::kMouseWheel,
+            dispatched_events.at(2).event_->web_event->GetType());
   CallCallback(std::move(dispatched_events.at(0).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
 
@@ -777,14 +788,13 @@
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(disposition_handler_->acked_wheel_event().delta_y, -5);
 
-  DispatchedEvents gesture_scroll_update = GetAndResetDispatchedEvents();
-  EXPECT_EQ(1U, gesture_scroll_update.size());
-  CallCallback(std::move(gesture_scroll_update.at(0).callback_),
+  // Ack the gesture scroll update event.
+  CallCallback(std::move(dispatched_events.at(1).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
 
   // Ack the mouse wheel event.
-  CallCallback(std::move(dispatched_events.at(1).callback_),
+  CallCallback(std::move(dispatched_events.at(2).callback_),
                INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
 
@@ -823,45 +833,48 @@
 
   dispatched_events = GetAndResetDispatchedEvents();
 
-  // Check that the ack for MouseWheel and GestureScrollBegin
-  // was processed.
+  // Check that the ack for MouseWheel and GestureScrollBegin was processed.
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(disposition_handler_->acked_wheel_event().delta_y, -5);
 
-  // There should be a ScrollBegin, ScrollUpdate and MouseWheel sent.
-  EXPECT_EQ(3U, dispatched_events.size());
+  // There should be a ScrollBegin, ScrollUpdate, ScrollEnd and MouseWheel sent.
+  EXPECT_EQ(4U, dispatched_events.size());
 
   ASSERT_EQ(WebInputEvent::kGestureScrollBegin,
             dispatched_events.at(0).event_->web_event->GetType());
   ASSERT_EQ(WebInputEvent::kGestureScrollUpdate,
             dispatched_events.at(1).event_->web_event->GetType());
-  ASSERT_EQ(WebInputEvent::kMouseWheel,
+  ASSERT_EQ(WebInputEvent::kGestureScrollEnd,
             dispatched_events.at(2).event_->web_event->GetType());
+  ASSERT_EQ(WebInputEvent::kMouseWheel,
+            dispatched_events.at(3).event_->web_event->GetType());
 
   // Ack the ScrollUpdate
   CallCallback(std::move(dispatched_events.at(1).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
 
-  // Check that the ack for ScrollBegin, ScrollUpdate were
-  // processed.
+  // Check that the ack for ScrollUpdate and ScrollEnd was processed.
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
 
-  // The GestureScrollUpdate ACK releases the GestureScrollEnd.
-  EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
+  // The GestureScrollEnd should have already been processed.
+  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
 
   // Ack the MouseWheel.
-  CallCallback(std::move(dispatched_events.at(2).callback_),
+  CallCallback(std::move(dispatched_events.at(3).callback_),
                INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 
+  // Check that the ack for MouseWheel and GestureScrollBegin was processed.
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
 
-  // There should be a ScrollBegin and ScrollUpdate sent.
+  // There should be a ScrollBegin, ScrollUpdate and ScrollEnd sent.
   dispatched_events = GetAndResetDispatchedEvents();
-  EXPECT_EQ(2U, dispatched_events.size());
+  EXPECT_EQ(3U, dispatched_events.size());
   ASSERT_EQ(WebInputEvent::kGestureScrollBegin,
             dispatched_events.at(0).event_->web_event->GetType());
   ASSERT_EQ(WebInputEvent::kGestureScrollUpdate,
             dispatched_events.at(1).event_->web_event->GetType());
+  ASSERT_EQ(WebInputEvent::kGestureScrollEnd,
+            dispatched_events.at(2).event_->web_event->GetType());
 
   // Check that the correct unhandled wheel event was received.
   EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED,
@@ -870,11 +883,10 @@
 
   CallCallback(std::move(dispatched_events.at(1).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
-  // The GestureScrollUpdate ACK releases the GestureScrollEnd.
-  EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
+  // The GestureScrollEnd should have already been processed.
+  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
 
-  // Check that the ack for the ScrollUpdate and ScrollEnd
-  // were processed.
+  // Check that the ack for the ScrollUpdate and ScrollEnd were processed.
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
 }
 
@@ -893,13 +905,18 @@
   CallCallback(std::move(dispatched_events.at(0).callback_),
                INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 
-  // There should be a ScrollBegin and second MouseWheel sent.
+  // There should be a ScrollBegin, ScrollUpdate, second MouseWheel, and second
+  // ScrollUpdate sent.
   dispatched_events = GetAndResetDispatchedEvents();
-  EXPECT_EQ(2U, dispatched_events.size());
+  EXPECT_EQ(4U, dispatched_events.size());
   ASSERT_EQ(WebInputEvent::kGestureScrollBegin,
             dispatched_events.at(0).event_->web_event->GetType());
-  ASSERT_EQ(WebInputEvent::kMouseWheel,
+  ASSERT_EQ(WebInputEvent::kGestureScrollUpdate,
             dispatched_events.at(1).event_->web_event->GetType());
+  ASSERT_EQ(WebInputEvent::kMouseWheel,
+            dispatched_events.at(2).event_->web_event->GetType());
+  ASSERT_EQ(WebInputEvent::kGestureScrollUpdate,
+            dispatched_events.at(3).event_->web_event->GetType());
 
   // Indicate that the GestureScrollBegin event was consumed.
   CallCallback(std::move(dispatched_events.at(0).callback_),
@@ -909,23 +926,29 @@
   // MouseWheel were processed.
   EXPECT_EQ(3U, disposition_handler_->GetAndResetAckCount());
 
-  // There should be a ScrollUpdate sent.
-  dispatched_events = GetAndResetDispatchedEvents();
-  EXPECT_EQ(1U, dispatched_events.size());
-
   // The last acked wheel event should be the second one since the input router
   // has already sent the immediate ack for the second wheel event.
   EXPECT_EQ(disposition_handler_->acked_wheel_event().delta_y, -10);
   EXPECT_EQ(INPUT_EVENT_ACK_STATE_IGNORED,
             disposition_handler_->acked_wheel_event_state());
 
-  // Ack the gesture scroll update.
-  CallCallback(std::move(dispatched_events.at(0).callback_),
+  // Ack the first gesture scroll update.
+  CallCallback(std::move(dispatched_events.at(1).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
 
-  // Check that the ack for the coalesced ScrollUpdate were processed.
+  // Check that the ack for the first ScrollUpdate were processed.
   EXPECT_EQ(
-      -15,
+      -5,
+      disposition_handler_->acked_gesture_event().data.scroll_update.delta_y);
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+
+  // Ack the second gesture scroll update.
+  CallCallback(std::move(dispatched_events.at(3).callback_),
+               INPUT_EVENT_ACK_STATE_CONSUMED);
+
+  // Check that the ack for the second ScrollUpdate were processed.
+  EXPECT_EQ(
+      -10,
       disposition_handler_->acked_gesture_event().data.scroll_update.delta_y);
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
 }
@@ -1065,12 +1088,11 @@
     ASSERT_TRUE(ShouldBlockEventStream(GetEventWithType(required_ack_type)));
   }
 }
-// Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't
-// wait for ACKs.
+
 TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) {
-  // Interleave a few events that do and do not ignore acks, ensuring that
-  // ack-ignoring events aren't dispatched until all prior events which observe
-  // their ack disposition have been dispatched.
+  // Interleave a few events that do and do not ignore acks. All gesture events
+  // should be dispatched immediately, but the acks will be blocked on blocking
+  // events.
 
   SimulateGestureEvent(WebInputEvent::kGestureScrollBegin,
                        blink::kWebGestureDeviceTouchscreen);
@@ -1084,59 +1106,72 @@
   SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
                        blink::kWebGestureDeviceTouchscreen);
   dispatched_events = GetAndResetDispatchedEvents();
+  // Should have sent |kTouchScrollStarted| and |kGestureScrollUpdate|.
   EXPECT_EQ(2U, dispatched_events.size());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(1, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            client_->last_in_flight_event_type());
 
   SimulateGestureEvent(WebInputEvent::kGestureTapDown,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
+  EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(1, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            client_->last_in_flight_event_type());
 
   SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
+  DispatchedEvents temp_dispatched_events = GetAndResetDispatchedEvents();
+  EXPECT_EQ(1U, temp_dispatched_events.size());
+  dispatched_events.emplace_back(std::move(temp_dispatched_events.at(0)));
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
 
   SimulateGestureEvent(WebInputEvent::kGestureShowPress,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
+  EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            client_->last_in_flight_event_type());
 
   SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
+  temp_dispatched_events = GetAndResetDispatchedEvents();
+  EXPECT_EQ(1U, temp_dispatched_events.size());
+  dispatched_events.emplace_back(std::move(temp_dispatched_events.at(0)));
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(3, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            client_->last_in_flight_event_type());
 
   SimulateGestureEvent(WebInputEvent::kGestureTapCancel,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
-  EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
-
-  // Now ack each ack-respecting event. Ack-ignoring events should not be
-  // dispatched until all prior events which observe ack disposition have been
-  // fired, at which point they should be sent immediately.  They should also
-  // have no effect on the in-flight event count.
-  CallCallback(std::move(dispatched_events.at(1).callback_),
-               INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  dispatched_events = GetAndResetDispatchedEvents();
-  EXPECT_EQ(2U, dispatched_events.size());
-  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  // Ack the GestureScrollUpdate
-  CallCallback(std::move(dispatched_events.at(1).callback_),
-               INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  dispatched_events = GetAndResetDispatchedEvents();
-  EXPECT_EQ(2U, dispatched_events.size());
-  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  // Ack the GestureScrollUpdate
-  CallCallback(std::move(dispatched_events.at(1).callback_),
-               INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
+  EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(3, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            client_->last_in_flight_event_type());
+
+  // Now ack each ack-respecting event. Should see in-flight event count
+  // decreasing and additional acks coming back.
+  // Ack the first GestureScrollUpdate, note that |at(0)| is TouchScrollStarted.
+  EXPECT_EQ(4U, dispatched_events.size());
+  CallCallback(std::move(dispatched_events.at(1).callback_),
+               INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
+
+  // Ack the second GestureScrollUpdate
+  CallCallback(std::move(dispatched_events.at(2).callback_),
+               INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(1, client_->in_flight_event_count());
+
+  // Ack the last GestureScrollUpdate
+  CallCallback(std::move(dispatched_events.at(3).callback_),
+               INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(0, client_->in_flight_event_count());
 }
@@ -1155,8 +1190,7 @@
   // GesturePinchBegin ignores its ack.
   SimulateGestureEvent(WebInputEvent::kGesturePinchBegin,
                        blink::kWebGestureDeviceTouchscreen);
-  dispatched_events = GetAndResetDispatchedEvents();
-  EXPECT_EQ(1U, dispatched_events.size());
+  EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
 
   // GesturePinchUpdate waits for an ack.
@@ -1167,26 +1201,35 @@
   dispatched_events = GetAndResetDispatchedEvents();
   EXPECT_EQ(1U, dispatched_events.size());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(1, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGesturePinchUpdate,
+            client_->last_in_flight_event_type());
+
+  // GestureShowPress will be sent immediately since GestureEventQueue allows
+  // multiple in-flight events. However the acks will be blocked on outstanding
+  // in-flight events.
+  SimulateGestureEvent(WebInputEvent::kGestureShowPress,
+                       blink::kWebGestureDeviceTouchscreen);
+  EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
+  EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(1, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGesturePinchUpdate,
+            client_->last_in_flight_event_type());
 
   SimulateGestureEvent(WebInputEvent::kGestureShowPress,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
-  // The ShowPress, though it ignores ack, is still stuck in the queue
-  // behind the PinchUpdate which requires an ack.
+  EXPECT_EQ(1U, GetAndResetDispatchedEvents().size());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(1, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGesturePinchUpdate,
+            client_->last_in_flight_event_type());
 
-  SimulateGestureEvent(WebInputEvent::kGestureShowPress,
-                       blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
-  // ShowPress has entered the queue.
-  EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
-
+  // Ack the GesturePinchUpdate to release two GestureShowPress ack.
   CallCallback(std::move(dispatched_events.at(0).callback_),
                INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  // Now that the Tap has been ACKed, the ShowPress events should receive
-  // synthetic acks, and fire immediately.
-  EXPECT_EQ(2U, GetAndResetDispatchedEvents().size());
+  EXPECT_EQ(0U, GetAndResetDispatchedEvents().size());
   EXPECT_EQ(3U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(0, client_->in_flight_event_count());
 }
 
 // Test that touch ack timeout behavior is properly configured for
@@ -1755,57 +1798,77 @@
 
 // Test proper handling of touchpad Gesture{Pinch,Scroll}Update sequences.
 TEST_F(InputRouterImplTest, TouchpadPinchAndScrollUpdate) {
-  // The first scroll should be sent immediately.
+  // All gesture events should be sent immediately.
   SimulateGestureScrollUpdateEvent(1.5f, 0.f, 0,
                                    blink::kWebGestureDeviceTouchpad);
   SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
                        blink::kWebGestureDeviceTouchpad);
   DispatchedEvents dispatched_events = GetAndResetDispatchedEvents();
-  EXPECT_EQ(1U, dispatched_events.size());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  // Subsequent scroll and pinch events should remain queued, coalescing as
-  // more trackpad events arrive.
-  SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0,
-                                  blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetAndResetDispatchedEvents().size());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  SimulateGestureScrollUpdateEvent(1.5f, 1.5f, 0,
-                                   blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetAndResetDispatchedEvents().size());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0,
-                                  blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetAndResetDispatchedEvents().size());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  SimulateGestureScrollUpdateEvent(0.f, 1.5f, 0,
-                                   blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetAndResetDispatchedEvents().size());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  // Ack'ing the first scroll should trigger both the coalesced scroll and the
-  // coalesced pinch events (which is sent to the renderer as a wheel event).
-  CallCallback(std::move(dispatched_events.at(0).callback_),
-               INPUT_EVENT_ACK_STATE_CONSUMED);
-  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-  dispatched_events = GetAndResetDispatchedEvents();
   EXPECT_EQ(2U, dispatched_events.size());
   EXPECT_EQ(2, client_->in_flight_event_count());
 
-  // Ack the second scroll.
+  // Subsequent scroll and pinch events will also be sent immediately.
+  SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0,
+                                  blink::kWebGestureDeviceTouchpad);
+  DispatchedEvents temp_dispatched_events = GetAndResetDispatchedEvents();
+  ASSERT_EQ(1U, temp_dispatched_events.size());
+  dispatched_events.emplace_back(std::move(temp_dispatched_events.at(0)));
+  EXPECT_EQ(3, client_->in_flight_event_count());
+
+  SimulateGestureScrollUpdateEvent(1.5f, 1.5f, 0,
+                                   blink::kWebGestureDeviceTouchpad);
+  temp_dispatched_events = GetAndResetDispatchedEvents();
+  ASSERT_EQ(1U, temp_dispatched_events.size());
+  dispatched_events.emplace_back(std::move(temp_dispatched_events.at(0)));
+  EXPECT_EQ(4, client_->in_flight_event_count());
+
+  SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0,
+                                  blink::kWebGestureDeviceTouchpad);
+  temp_dispatched_events = GetAndResetDispatchedEvents();
+  ASSERT_EQ(1U, temp_dispatched_events.size());
+  dispatched_events.emplace_back(std::move(temp_dispatched_events.at(0)));
+  EXPECT_EQ(5, client_->in_flight_event_count());
+
+  SimulateGestureScrollUpdateEvent(0.f, 1.5f, 0,
+                                   blink::kWebGestureDeviceTouchpad);
+  temp_dispatched_events = GetAndResetDispatchedEvents();
+  ASSERT_EQ(1U, temp_dispatched_events.size());
+  dispatched_events.emplace_back(std::move(temp_dispatched_events.at(0)));
+  EXPECT_EQ(6, client_->in_flight_event_count());
+
+  // Ack'ing events should decrease in-flight event count.
   CallCallback(std::move(dispatched_events.at(0).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
-  ASSERT_EQ(0U, GetAndResetDispatchedEvents().size());
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(5, client_->in_flight_event_count());
+
+  // Ack the second scroll.
+  CallCallback(std::move(dispatched_events.at(1).callback_),
+               INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(4, client_->in_flight_event_count());
+
+  // Ack the pinch event.
+  CallCallback(std::move(dispatched_events.at(2).callback_),
+               INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(3, client_->in_flight_event_count());
+
+  // Ack the scroll event.
+  CallCallback(std::move(dispatched_events.at(3).callback_),
+               INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
+
+  // Ack the pinch event.
+  CallCallback(std::move(dispatched_events.at(4).callback_),
+               INPUT_EVENT_ACK_STATE_CONSUMED);
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(1, client_->in_flight_event_count());
 
-  // Ack the wheel event.
-  CallCallback(std::move(dispatched_events.at(1).callback_),
+  // Ack the scroll event.
+  CallCallback(std::move(dispatched_events.at(5).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
-  ASSERT_EQ(0U, GetAndResetDispatchedEvents().size());
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(0, client_->in_flight_event_count());
 }
diff --git a/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc b/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc
index 19129b2..80b6f6d 100644
--- a/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc
+++ b/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc
@@ -40,6 +40,7 @@
 #include "content/public/test/test_browser_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/events/blink/blink_features.h"
 #include "ui/events/blink/web_input_event_traits.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 
@@ -200,6 +201,9 @@
                                       features::kTouchpadAndWheelScrollLatching,
                                       features::kAsyncWheelEvents});
     }
+
+    vsync_feature_list_.InitAndEnableFeature(
+        features::kVsyncAlignedInputEvents);
   }
 
   ~LegacyInputRouterImplTest() override {}
@@ -448,7 +452,9 @@
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   SyntheticWebTouchEvent touch_event_;
 
+  base::test::ScopedFeatureList vsync_feature_list_;
   base::test::ScopedFeatureList feature_list_;
+
   std::unique_ptr<TestBrowserContext> browser_context_;
 };
 
@@ -1098,12 +1104,20 @@
                     INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED);
 
-  // Check that the ack for the MouseWheel and ScrollBegin
-  // were processed.
+  // Check that the ack for the MouseWheel, ScrollBegin were processed.
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
 
-  // There should be a ScrollBegin and ScrollUpdate, MouseWheel sent.
-  EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
+  if (wheel_scroll_latching_enabled_) {
+    // There should be a ScrollBegin, ScrollUpdate, and MouseWheel sent.
+    EXPECT_EQ("GestureScrollBegin GestureScrollUpdate MouseWheel",
+              GetInputMessageTypes(process_.get()));
+  } else {
+    // There should be a ScrollBegin, ScrollUpdate, ScrollEnd, and MouseWheel
+    // sent.
+    EXPECT_EQ(
+        "GestureScrollBegin GestureScrollUpdate GestureScrollEnd MouseWheel",
+        GetInputMessageTypes(process_.get()));
+  }
 
   EXPECT_EQ(disposition_handler_->acked_wheel_event().delta_y, -5);
   SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
@@ -1113,11 +1127,10 @@
     // Check that the ack for ScrollUpdate were processed.
     EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
   } else {
-    // The GestureScrollUpdate ACK releases the GestureScrollEnd.
-    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+    // GestureScrollEnd should have already been sent.
+    EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
 
-    // Check that the ack for the ScrollUpdate and ScrollEnd
-    // were processed.
+    // Check that the ack for the ScrollUpdate and ScrollEnd were processed.
     EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   }
 
@@ -1126,11 +1139,12 @@
 
   if (wheel_scroll_latching_enabled_) {
     // There should be a ScrollUpdate sent.
-    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+    EXPECT_EQ("GestureScrollUpdate", GetInputMessageTypes(process_.get()));
     EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
   } else {
     // There should be a ScrollBegin and ScrollUpdate sent.
-    EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
+    EXPECT_EQ("GestureScrollBegin GestureScrollUpdate GestureScrollEnd",
+              GetInputMessageTypes(process_.get()));
     EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   }
 
@@ -1146,11 +1160,10 @@
     // Check that the ack for ScrollUpdate were processed.
     EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
   } else {
-    // The GestureScrollUpdate ACK releases the GestureScrollEnd.
-    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+    // GestureScrollEnd should have already been sent.
+    EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
 
-    // Check that the ack for the ScrollUpdate and ScrollEnd
-    // were processed.
+    // Check that the ack for the ScrollUpdate and ScrollEnd were processed.
     EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   }
 }
@@ -1184,8 +1197,8 @@
   // MouseWheel were processed.
   EXPECT_EQ(3U, disposition_handler_->GetAndResetAckCount());
 
-  // There should be a ScrollBegin, MouseWheel, and coalesced ScrollUpdate sent.
-  EXPECT_EQ(3U, GetSentMessageCountAndResetSink());
+  // There should be a ScrollBegin, MouseWheel, and two ScrollUpdate sent.
+  EXPECT_EQ(4U, GetSentMessageCountAndResetSink());
 
   // The last acked wheel event should be the second one since the input router
   // has already sent the immediate ack for the second wheel event.
@@ -1193,12 +1206,19 @@
   EXPECT_EQ(INPUT_EVENT_ACK_STATE_IGNORED,
             disposition_handler_->acked_wheel_event_state());
 
+  // Ack the first ScrollUpdate.
   SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
                     INPUT_EVENT_ACK_STATE_CONSUMED);
-
-  // Check that the ack for the coalesced ScrollUpdate were processed.
   EXPECT_EQ(
-      -15,
+      -5,
+      disposition_handler_->acked_gesture_event().data.scroll_update.delta_y);
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+
+  // Ack the second ScrollUpdate.
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_EQ(
+      -10,
       disposition_handler_->acked_gesture_event().data.scroll_update.delta_y);
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
 }
@@ -1330,12 +1350,10 @@
   }
 }
 
-// Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't
-// wait for ACKs.
 TEST_F(LegacyInputRouterImplTest, GestureTypesIgnoringAckInterleaved) {
-  // Interleave a few events that do and do not ignore acks, ensuring that
-  // ack-ignoring events aren't dispatched until all prior events which observe
-  // their ack disposition have been dispatched.
+  // Interleave a few events that do and do not ignore acks. All gesture events
+  // should be dispatched immediately, but the acks will be blocked on blocking
+  // events.
 
   SimulateGestureEvent(WebInputEvent::kGestureScrollBegin,
                        blink::kWebGestureDeviceTouchscreen);
@@ -1352,49 +1370,51 @@
 
   SimulateGestureEvent(WebInputEvent::kGestureTapDown,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(1, client_->in_flight_event_count());
 
   SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
 
   SimulateGestureEvent(WebInputEvent::kGestureShowPress,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
 
   SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(3, client_->in_flight_event_count());
 
   SimulateGestureEvent(WebInputEvent::kGestureTapCancel,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
-
-  // Now ack each ack-respecting event. Ack-ignoring events should not be
-  // dispatched until all prior events which observe ack disposition have been
-  // fired, at which point they should be sent immediately.  They should also
-  // have no effect on the in-flight event count.
-  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(1, client_->in_flight_event_count());
-
-  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(3, client_->in_flight_event_count());
+
+  // Now ack each ack-respecting event. Should see in-flight event count
+  // decreasing and additional acks coming back.
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
+
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(1, client_->in_flight_event_count());
+
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(0, client_->in_flight_event_count());
 }
@@ -1422,24 +1442,23 @@
   EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
 
+  // GestureShowPress will be sent immediately since GestureEventQueue allows
+  // multiple in-flight events. However the acks will be blocked on outstanding
+  // in-flight events.
   SimulateGestureEvent(WebInputEvent::kGestureShowPress,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
-  // The ShowPress, though it ignores ack, is still stuck in the queue
-  // behind the PinchUpdate which requires an ack.
+  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
 
   SimulateGestureEvent(WebInputEvent::kGestureShowPress,
                        blink::kWebGestureDeviceTouchscreen);
-  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
-  // ShowPress has entered the queue.
+  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
 
+  // Ack the GesturePinchUpdate to release two GestureShowPress ack.
   SendInputEventACK(WebInputEvent::kGesturePinchUpdate,
                     INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  // Now that the Tap has been ACKed, the ShowPress events should receive
-  // synthetic acks, and fire immediately.
-  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(3U, disposition_handler_->GetAndResetAckCount());
 }
 
@@ -1955,53 +1974,72 @@
 
 // Test proper handling of touchpad Gesture{Pinch,Scroll}Update sequences.
 TEST_F(LegacyInputRouterImplTest, TouchpadPinchAndScrollUpdate) {
-  // The first scroll should be sent immediately.
+  // All gesture events should be sent immediately.
   SimulateGestureScrollUpdateEvent(1.5f, 0.f, 0,
                                    blink::kWebGestureDeviceTouchpad);
   SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
                        blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(1, client_->in_flight_event_count());
+  ASSERT_EQ(2U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(2, client_->in_flight_event_count());
 
-  // Subsequent scroll and pinch events should remain queued, coalescing as
-  // more trackpad events arrive.
+  // Subsequent scroll and pinch events will also be sent immediately.
   SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0,
                                   blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(1, client_->in_flight_event_count());
+  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(3, client_->in_flight_event_count());
 
   SimulateGestureScrollUpdateEvent(1.5f, 1.5f, 0,
                                    blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(1, client_->in_flight_event_count());
+  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(4, client_->in_flight_event_count());
 
   SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0,
                                   blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(1, client_->in_flight_event_count());
+  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(5, client_->in_flight_event_count());
 
   SimulateGestureScrollUpdateEvent(0.f, 1.5f, 0,
                                    blink::kWebGestureDeviceTouchpad);
-  ASSERT_EQ(0U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(1, client_->in_flight_event_count());
+  ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(6, client_->in_flight_event_count());
 
-  // Ack'ing the first scroll should trigger both the coalesced scroll and the
-  // coalesced pinch events (which is sent to the renderer as a wheel event).
+  // Ack'ing events should decrease in-flight event count.
   SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
                     INPUT_EVENT_ACK_STATE_CONSUMED);
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
-  EXPECT_EQ(2, client_->in_flight_event_count());
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(5, client_->in_flight_event_count());
 
   // Ack the second scroll.
   SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
                     INPUT_EVENT_ACK_STATE_CONSUMED);
   EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(4, client_->in_flight_event_count());
+
+  // Ack the pinch event.
+  SendInputEventACK(WebInputEvent::kGesturePinchUpdate,
+                    INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(3, client_->in_flight_event_count());
+
+  // Ack the scroll event.
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
+
+  // Ack the pinch event.
+  SendInputEventACK(WebInputEvent::kGesturePinchUpdate,
+                    INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(1, client_->in_flight_event_count());
 
-  // Ack the wheel event.
-  SendInputEventACK(WebInputEvent::kGesturePinchUpdate,
+  // Ack the scroll event.
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
                     INPUT_EVENT_ACK_STATE_CONSUMED);
   EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
diff --git a/content/browser/renderer_host/input/mock_input_router_client.cc b/content/browser/renderer_host/input/mock_input_router_client.cc
index 9df4633..95f5cdb2 100644
--- a/content/browser/renderer_host/input/mock_input_router_client.cc
+++ b/content/browser/renderer_host/input/mock_input_router_client.cc
@@ -38,6 +38,7 @@
 
 void MockInputRouterClient::IncrementInFlightEventCount(
     blink::WebInputEvent::Type event_type) {
+  last_in_flight_event_type_ = event_type;
   ++in_flight_event_count_;
 }
 
diff --git a/content/browser/renderer_host/input/mock_input_router_client.h b/content/browser/renderer_host/input/mock_input_router_client.h
index b65e04e..9626250 100644
--- a/content/browser/renderer_host/input/mock_input_router_client.h
+++ b/content/browser/renderer_host/input/mock_input_router_client.h
@@ -52,6 +52,9 @@
   int in_flight_event_count() const {
     return in_flight_event_count_;
   }
+  blink::WebInputEvent::Type last_in_flight_event_type() const {
+    return last_in_flight_event_type_;
+  }
   void set_allow_send_event(bool allow) {
     filter_state_ = INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS;
   }
@@ -62,6 +65,8 @@
  private:
   InputRouter* input_router_;
   int in_flight_event_count_;
+  blink::WebInputEvent::Type last_in_flight_event_type_ =
+      blink::WebInputEvent::kUndefined;
   bool has_touch_handler_;
 
   InputEventAckState filter_state_;
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc
index 72c6257d..bee6fab 100644
--- a/content/browser/renderer_host/media/video_capture_controller.cc
+++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -376,7 +376,7 @@
          buffer_contexts_.end());
   buffer_contexts_.emplace_back(
       next_buffer_context_id_++, buffer_id, launched_device_.get(),
-      handle_provider->GetHandleForInterProcessTransit());
+      handle_provider->GetHandleForInterProcessTransit(true /* read only */));
 }
 
 void VideoCaptureController::OnFrameReadyInBuffer(
diff --git a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
index 22fbcb8..34afec23 100644
--- a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
+++ b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
@@ -153,6 +153,11 @@
     LOG(ERROR) << "DecodeCapturedData: WrapExternalSharedMemory failed";
     return;
   }
+  // Hold onto the buffer access handle for the lifetime of the VideoFrame, to
+  // ensure the data pointers remain valid.
+  out_frame->AddDestructionObserver(base::BindOnce(
+      [](std::unique_ptr<media::VideoCaptureBufferHandle> handle) {},
+      base::Passed(&out_buffer_access)));
   out_frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE,
                                    frame_format.frame_rate);
 
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 35cb294..272d0542 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1927,7 +1927,7 @@
                    base::Unretained(this)));
   }
 
-  if (base::FeatureList::IsEnabled(features::kMojoBlobs)) {
+  if (features::IsMojoBlobsEnabled()) {
     registry->AddInterface(
         base::Bind(&BlobRegistryWrapper::Bind,
                    storage_partition_impl_->GetBlobRegistry(), GetID()));
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index 077cf8e..7c4664f7 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -44,6 +44,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/screen.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/events/blink/blink_features.h"
 #include "ui/events/blink/web_input_event_traits.h"
 #include "ui/events/gesture_detection/gesture_provider_config_helper.h"
 #include "ui/events/keycodes/keyboard_codes.h"
@@ -77,22 +78,6 @@
 
 namespace content {
 
-std::string GetInputMessageTypes(MockRenderProcessHost* process) {
-  std::string result;
-  for (size_t i = 0; i < process->sink().message_count(); ++i) {
-    const IPC::Message* message = process->sink().GetMessageAt(i);
-    EXPECT_EQ(InputMsg_HandleInputEvent::ID, message->type());
-    InputMsg_HandleInputEvent::Param params;
-    EXPECT_TRUE(InputMsg_HandleInputEvent::Read(message, &params));
-    const WebInputEvent* event = std::get<0>(params);
-    if (i != 0)
-      result += " ";
-    result += WebInputEvent::GetName(event->GetType());
-  }
-  process->sink().ClearMessages();
-  return result;
-}
-
 // MockInputRouter -------------------------------------------------------------
 
 class MockInputRouter : public InputRouter {
@@ -580,6 +565,9 @@
         features.push_back(features::kAsyncWheelEvents.name);
         break;
     }
+
+    features.push_back(features::kVsyncAlignedInputEvents.name);
+
     feature_list_.InitFromCommandLine(base::JoinString(features, ","),
                                       base::JoinString(disabled_features, ","));
 
@@ -2011,24 +1999,24 @@
   SimulateMouseEvent(WebInputEvent::kMouseMove, 10, 30, 0, true);
   dispatched_events =
       host_->mock_widget_input_handler_.GetAndResetDispatchedEvents();
-  EXPECT_EQ(3u, dispatched_events.size());
+  EXPECT_EQ(4u, dispatched_events.size());
   EXPECT_EQ(WebInputEvent::kGestureTapCancel,
             dispatched_events.at(0).event_->web_event->GetType());
   EXPECT_EQ(WebInputEvent::kGestureScrollBegin,
             dispatched_events.at(1).event_->web_event->GetType());
   EXPECT_EQ(WebInputEvent::kTouchScrollStarted,
             dispatched_events.at(2).event_->web_event->GetType());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            dispatched_events.at(3).event_->web_event->GetType());
   if (dispatched_events.at(1).callback_) {
     CallCallback(std::move(dispatched_events.at(1).callback_),
                  INPUT_EVENT_ACK_STATE_CONSUMED);
   }
   EXPECT_EQ(WebInputEvent::kTouchMove, host_->acked_touch_event_type());
-  dispatched_events =
-      host_->mock_widget_input_handler_.GetAndResetDispatchedEvents();
-  EXPECT_EQ(1u, dispatched_events.size());
-  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
-            dispatched_events.at(0).event_->web_event->GetType());
-  CallCallback(std::move(dispatched_events.at(0).callback_),
+  EXPECT_EQ(
+      0u,
+      host_->mock_widget_input_handler_.GetAndResetDispatchedEvents().size());
+  CallCallback(std::move(dispatched_events.at(3).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
   // Mouse drag with shift becomes pinch.
   SimulateMouseEvent(WebInputEvent::kMouseMove, 10, 40,
@@ -2104,23 +2092,23 @@
   EXPECT_EQ(WebInputEvent::kTouchMove, host_->acked_touch_event_type());
   dispatched_events =
       host_->mock_widget_input_handler_.GetAndResetDispatchedEvents();
-  EXPECT_EQ(3u, dispatched_events.size());
+  EXPECT_EQ(4u, dispatched_events.size());
   EXPECT_EQ(WebInputEvent::kGestureTapCancel,
             dispatched_events.at(0).event_->web_event->GetType());
   EXPECT_EQ(WebInputEvent::kGestureScrollBegin,
             dispatched_events.at(1).event_->web_event->GetType());
   EXPECT_EQ(WebInputEvent::kTouchScrollStarted,
             dispatched_events.at(2).event_->web_event->GetType());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            dispatched_events.at(3).event_->web_event->GetType());
   if (dispatched_events.at(1).callback_) {
     CallCallback(std::move(dispatched_events.at(1).callback_),
                  INPUT_EVENT_ACK_STATE_CONSUMED);
   }
-  dispatched_events =
-      host_->mock_widget_input_handler_.GetAndResetDispatchedEvents();
-  EXPECT_EQ(1u, dispatched_events.size());
-  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
-            dispatched_events.at(0).event_->web_event->GetType());
-  CallCallback(std::move(dispatched_events.at(0).callback_),
+  EXPECT_EQ(
+      0u,
+      host_->mock_widget_input_handler_.GetAndResetDispatchedEvents().size());
+  CallCallback(std::move(dispatched_events.at(3).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
   // Another pinch.
   SimulateMouseEvent(WebInputEvent::kMouseMove, 10, 110,
@@ -2183,23 +2171,23 @@
   EXPECT_EQ(WebInputEvent::kTouchMove, host_->acked_touch_event_type());
   dispatched_events =
       host_->mock_widget_input_handler_.GetAndResetDispatchedEvents();
-  EXPECT_EQ(3u, dispatched_events.size());
+  EXPECT_EQ(4u, dispatched_events.size());
   EXPECT_EQ(WebInputEvent::kGestureTapCancel,
             dispatched_events.at(0).event_->web_event->GetType());
   EXPECT_EQ(WebInputEvent::kGestureScrollBegin,
             dispatched_events.at(1).event_->web_event->GetType());
   EXPECT_EQ(WebInputEvent::kTouchScrollStarted,
             dispatched_events.at(2).event_->web_event->GetType());
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
+            dispatched_events.at(3).event_->web_event->GetType());
   if (dispatched_events.at(1).callback_) {
     CallCallback(std::move(dispatched_events.at(1).callback_),
                  INPUT_EVENT_ACK_STATE_CONSUMED);
   }
-  dispatched_events =
-      host_->mock_widget_input_handler_.GetAndResetDispatchedEvents();
-  EXPECT_EQ(1u, dispatched_events.size());
-  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
-            dispatched_events.at(0).event_->web_event->GetType());
-  CallCallback(std::move(dispatched_events.at(0).callback_),
+  EXPECT_EQ(
+      0u,
+      host_->mock_widget_input_handler_.GetAndResetDispatchedEvents().size());
+  CallCallback(std::move(dispatched_events.at(3).callback_),
                INPUT_EVENT_ACK_STATE_CONSUMED);
 
   // Turn off emulation during a scroll.
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index f4f522d..2b7274f 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -49,7 +49,6 @@
 #include "content/browser/devtools/render_frame_devtools_agent_host.h"
 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
 #include "content/browser/gpu/compositor_util.h"
-#include "content/browser/gpu/gpu_data_manager_impl.h"
 #include "content/browser/gpu/gpu_process_host.h"
 #include "content/browser/media/android/media_web_contents_observer_android.h"
 #include "content/browser/renderer_host/compositor_impl_android.h"
@@ -79,7 +78,6 @@
 #include "content/public/common/content_switches.h"
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/config/gpu_driver_bug_workaround_type.h"
 #include "ipc/ipc_message_macros.h"
 #include "ipc/ipc_message_start.h"
 #include "skia/ext/image_operations.h"
@@ -424,12 +422,9 @@
 }
 
 void WakeUpGpu(GpuProcessHost* host) {
-  if (!host)
-    return;
-  GpuDataManagerImpl* gpu_data = GpuDataManagerImpl::GetInstance();
-  if (gpu_data &&
-      gpu_data->IsDriverBugWorkaroundActive(gpu::WAKE_UP_GPU_BEFORE_DRAWING))
+  if (host && host->wake_up_gpu_before_drawing()) {
     host->gpu_service()->WakeUpGpu();
+  }
 }
 
 }  // namespace
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index 122f0ac..7d67e5f 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -95,6 +95,7 @@
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/events/blink/blink_event_util.h"
+#include "ui/events/blink/blink_features.h"
 #include "ui/events/blink/web_input_event_traits.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
@@ -833,6 +834,9 @@
                                       features::kTouchpadAndWheelScrollLatching,
                                       features::kAsyncWheelEvents});
     }
+
+    vsync_feature_list_.InitAndEnableFeature(
+        features::kVsyncAlignedInputEvents);
   }
 
  protected:
@@ -894,6 +898,7 @@
   FakeRenderWidgetHostViewAura* view_;
 
   IPC::TestSink* sink_;
+  base::test::ScopedFeatureList vsync_feature_list_;
   base::test::ScopedFeatureList feature_list_;
 
   viz::LocalSurfaceIdAllocator local_surface_id_allocator_;
@@ -1192,117 +1197,65 @@
   }
 
   void ExpectGestureScrollEndForWheelScrolling(bool is_last) {
-    if (wheel_scroll_latching_enabled_) {
-      if (!is_last) {
-        EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
-        return;
-      }
+    if (!wheel_scroll_latching_enabled_) {
+      // Already handled in |ExpectGestureScrollEventsAfterMouseWheelACK()|.
+      EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
+      return;
     }
-
-    EXPECT_EQ(1U, sink_->message_count());
-    InputMsg_HandleInputEvent::Param params;
-    if (InputMsg_HandleInputEvent::Read(sink_->GetMessageAt(0), &params)) {
-      const blink::WebInputEvent* event = std::get<0>(params);
-      EXPECT_EQ(WebInputEvent::kGestureScrollEnd, event->GetType());
+    if (is_last) {
+      // Scroll latching will have one GestureScrollEnd at the end.
+      EXPECT_EQ("GestureScrollEnd", GetInputMessageTypes(process_host_));
     }
-    EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+    // No GestureScrollEnd during the scroll.
+    EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
   }
 
   void ExpectGestureScrollEventsAfterMouseWheelACK(
       bool is_first_ack,
       size_t enqueued_wheel_event_count) {
-    InputMsg_HandleInputEvent::Param params;
-    const blink::WebInputEvent* event;
-    size_t expected_message_count;
-    if (is_first_ack) {
-      if (wheel_scrolling_mode_ == kAsyncWheelEvents) {
-        // If the ack for the first sent event is not consumed,
-        // MouseWheelEventQueue(MWEQ) sends the rest of the wheel events in the
-        // current scrolling sequence as non-blocking events. Since MWEQ
-        // receives the ack for non-blocking events asynchronously, it sends the
-        // next queued wheel event immediately and this continues till the queue
-        // is empty.
-        expected_message_count = enqueued_wheel_event_count + 2;
-      } else {
-        // Since the MWEQ must wait for ack of the sent event before sending the
-        // next queued event, when wheel events are blocking only one queued
-        // event will be sent regardless of the number of the queued wheel
-        // events.
-        expected_message_count = enqueued_wheel_event_count ? 3 : 2;
-      }
-
-      EXPECT_EQ(expected_message_count, sink_->message_count());
-
-      // The first message is GestureScrollBegin.
-      if (InputMsg_HandleInputEvent::Read(sink_->GetMessageAt(0), &params)) {
-        event = std::get<0>(params);
-        EXPECT_EQ(WebInputEvent::kGestureScrollBegin, event->GetType());
-      }
-
-      size_t gesture_scroll_update_index, first_sent_wheel_index,
-          last_sent_wheel_index;
-      if (wheel_scroll_latching_enabled_) {
-        // Blocking GSB event is sent, GSU will be generated but not sent
-        // waiting for GSB's ack. Enqueued wheel events will be sent. Finally
-        // GSU will be sent after GSB's ack.
-        gesture_scroll_update_index = expected_message_count - 1;
-        first_sent_wheel_index = 1;
-        last_sent_wheel_index = expected_message_count - 2;
-      } else {
-        // Non-blocking GSB event is sent, GSU event will be sent after GSB's
-        // immediate ack, then enqueued wheel events will be sent.
-        gesture_scroll_update_index = 1;
-        first_sent_wheel_index = 2;
-        last_sent_wheel_index = expected_message_count - 1;
-      }
-
-      // Check GestureScrollUpdate.
-      if (InputMsg_HandleInputEvent::Read(
-              sink_->GetMessageAt(gesture_scroll_update_index), &params)) {
-        event = std::get<0>(params);
-        EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, event->GetType());
-      }
-
-      // Check wheel events.
-      for (size_t i = first_sent_wheel_index; i <= last_sent_wheel_index; i++) {
-        if (InputMsg_HandleInputEvent::Read(sink_->GetMessageAt(i), &params)) {
-          event = std::get<0>(params);
-          EXPECT_EQ(WebInputEvent::kMouseWheel, event->GetType());
-        }
-      }
-
-    } else {  // !is_first_ack
-      expected_message_count = enqueued_wheel_event_count ? 2 : 1;
-      size_t scroll_update_index = 0;
-
-      if (!wheel_scroll_latching_enabled_) {
-        // The first message is GestureScrollBegin even in the middle of
-        // scrolling.
-        if (InputMsg_HandleInputEvent::Read(sink_->GetMessageAt(0), &params)) {
-          event = std::get<0>(params);
-          EXPECT_EQ(WebInputEvent::kGestureScrollBegin, event->GetType());
-        }
-        expected_message_count++;
-        scroll_update_index++;
-      }
-
-      // Check the GestureScrollUpdate message.
-      if (InputMsg_HandleInputEvent::Read(
-              sink_->GetMessageAt(scroll_update_index), &params)) {
-        event = std::get<0>(params);
-        EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, event->GetType());
-      }
-
-      if (enqueued_wheel_event_count) {
-        // The last message is the queued MouseWheel.
-        if (InputMsg_HandleInputEvent::Read(
-                sink_->GetMessageAt(expected_message_count - 1), &params)) {
-          event = std::get<0>(params);
-          EXPECT_EQ(WebInputEvent::kMouseWheel, event->GetType());
-        }
-      }
+    std::string expected_events;
+    if (wheel_scrolling_mode_ == kAsyncWheelEvents) {
+      ASSERT_TRUE(wheel_scroll_latching_enabled_);
+      // If the ack for the first sent event is not consumed,
+      // MouseWheelEventQueue(MWEQ) sends the rest of the wheel events in the
+      // current scrolling sequence as non-blocking events. Since MWEQ
+      // receives the ack for non-blocking events asynchronously, it sends the
+      // next queued wheel event immediately and this continues till the queue
+      // is empty.
+      // Expecting a GSB+GSU for ACKing the first MouseWheel, plus an additional
+      // MouseWheel+GSU per enqueued wheel event. Note that GestureEventQueue
+      // allows multiple in-flight events.
+      if (is_first_ack)
+        expected_events += "GestureScrollBegin GestureScrollUpdate ";
+      for (size_t i = 0; i < enqueued_wheel_event_count; ++i)
+        expected_events += "MouseWheel GestureScrollUpdate ";
+    } else if (wheel_scrolling_mode_ == kWheelScrollLatching) {
+      ASSERT_TRUE(wheel_scroll_latching_enabled_);
+      // Since the MWEQ must wait for ack of the sent event before sending the
+      // next queued event, when wheel events are blocking only one queued
+      // event will be sent regardless of the number of the queued wheel
+      // events.
+      // Expecting a GSU or GSB+GSU for ACKing the previous MouseWheel, plus an
+      // additional MouseWheel if the queue is not empty. GSE will be delayed by
+      // scroll latching.
+      if (is_first_ack)
+        expected_events += "GestureScrollBegin ";
+      expected_events += "GestureScrollUpdate ";
+      if (enqueued_wheel_event_count != 0)
+        expected_events += "MouseWheel";
+    } else {
+      // The MWEQ must wait for ack of the sent event before sending the
+      // next queued event.
+      // Expecting a GSB+GSU+GSE for ACKing the previous MouseWheel, plus an
+      // additional MouseWheel if the queue is not empty.
+      expected_events +=
+          "GestureScrollBegin GestureScrollUpdate GestureScrollEnd ";
+      if (enqueued_wheel_event_count != 0)
+        expected_events += "MouseWheel";
     }
-    EXPECT_EQ(expected_message_count, GetSentMessageCountAndResetSink());
+
+    EXPECT_EQ(base::TrimWhitespaceASCII(expected_events, base::TRIM_TRAILING),
+              GetInputMessageTypes(process_host_));
   }
 
   void ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(
@@ -3829,13 +3782,9 @@
   SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED);
   ExpectGestureScrollEventsAfterMouseWheelACK(true, 1);
 
-  if (wheel_scrolling_mode_ != kAsyncWheelEvents) {
-    SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  } else {
-    // Don't send an ack for the first event since the two GSUs are coalesced
-    // while waiting for the blocking ack of GSB to get sent.
-  }
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
   EXPECT_EQ(OverscrollSource::NONE, overscroll_source());
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode());
@@ -3908,13 +3857,8 @@
   SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED);
   ExpectGestureScrollEventsAfterMouseWheelACK(true, 2);
 
-  if (wheel_scrolling_mode_ != kAsyncWheelEvents) {
-    SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  } else {
-    // Don't send an ack for the first event since the two GSUs are coalesced
-    // while waiting for the blocking ack of GSB to get sent.
-  }
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
   EXPECT_EQ(OverscrollSource::NONE, overscroll_source());
@@ -3938,6 +3882,8 @@
 
   SendInputEventACK(WebInputEvent::kMouseWheel,
                     INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   if (wheel_scroll_latching_enabled_) {
     EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
   } else {
@@ -4612,7 +4558,8 @@
 
   // Send update events.
   SimulateGestureScrollUpdateEvent(25, 0, 0);
-  EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ("TouchScrollStarted GestureScrollUpdate",
+            GetInputMessageTypes(process_host_));
 
   // Quickly end and restart the scroll gesture. These two events should get
   // discarded.
@@ -4626,27 +4573,39 @@
 
   // Send another update event. This should be sent right away.
   SimulateGestureScrollUpdateEvent(30, 0, 0);
-  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+  EXPECT_EQ("TouchScrollStarted GestureScrollUpdate",
+            GetInputMessageTypes(process_host_));
 
   // Receive an ACK for the first scroll-update event as not being processed.
   // This will contribute to the overscroll gesture, but not enough for the
-  // overscroll controller to start consuming gesture events. This also cause
-  // the queued gesture event to be forwarded to the renderer.
+  // overscroll controller to start consuming gesture events.
   SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
                     INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
   EXPECT_EQ(OverscrollSource::NONE, overscroll_source());
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode());
-  EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+  // The second GSU was already sent.
+  EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
 
-  // Send another update event. This should get into the queue.
+  // Send another update event. This should be forwarded immediately since
+  // GestureEventQueue allows multiple in-flight events.
   SimulateGestureScrollUpdateEvent(10, 0, 0);
-  EXPECT_EQ(0U, sink_->message_count());
+  EXPECT_EQ("GestureScrollUpdate", GetInputMessageTypes(process_host_));
 
   // Receive an ACK for the second scroll-update event as not being processed.
-  // This will now initiate an overscroll. This will also cause the queued
-  // gesture event to be released. But instead of going to the renderer, it will
-  // be consumed by the overscroll controller.
+  // This will now initiate an overscroll.
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+  EXPECT_EQ(OVERSCROLL_EAST, overscroll_mode());
+  EXPECT_EQ(OverscrollSource::TOUCHSCREEN, overscroll_source());
+  EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode());
+  EXPECT_EQ(55.f, overscroll_delta_x());
+  EXPECT_EQ(5.f, overscroll_delegate()->delta_x());
+  EXPECT_EQ(0.f, overscroll_delegate()->delta_y());
+  EXPECT_EQ(0U, sink_->message_count());
+
+  // Receive an ACK for the last scroll-update event as not being processed.
+  // This will be consumed by the overscroll controller.
   SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
                     INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   EXPECT_EQ(OVERSCROLL_EAST, overscroll_mode());
@@ -4936,14 +4895,14 @@
   // controller will not consume the event, because it is not triggering
   // gesture-nav.
   SimulateGestureScrollUpdateEvent(-260, 0, 0);
-  EXPECT_EQ(1U, sink_->message_count());
+  EXPECT_EQ("GestureScrollUpdate", GetInputMessageTypes(process_host_));
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
   EXPECT_EQ(OverscrollSource::NONE, overscroll_source());
 
   // Since the overscroll mode has been reset, the next scroll update events
   // should reach the renderer.
   SimulateGestureScrollUpdateEvent(-20, 0, 0);
-  EXPECT_EQ(1U, sink_->message_count());
+  EXPECT_EQ("GestureScrollUpdate", GetInputMessageTypes(process_host_));
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
   EXPECT_EQ(OverscrollSource::NONE, overscroll_source());
 }
@@ -5070,11 +5029,10 @@
     // Wheel event ack generates gesture scroll update; which is not consumed by
     // the overscroll controller.
     if (wheel_scroll_latching_enabled_) {
-      // ScrollUpdate will be queued event.
-      EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
+      EXPECT_EQ("GestureScrollUpdate", GetInputMessageTypes(process_host_));
     } else {
-      // ScrollBegin and ScrollUpdate will be queued events.
-      EXPECT_EQ(2U, GetSentMessageCountAndResetSink());
+      EXPECT_EQ("GestureScrollBegin GestureScrollUpdate GestureScrollEnd",
+                GetInputMessageTypes(process_host_));
     }
   }
 
@@ -5122,13 +5080,9 @@
   SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   ExpectGestureScrollEventsAfterMouseWheelACK(true, 1);
 
-  if (wheel_scrolling_mode_ != kAsyncWheelEvents) {
-    SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  } else {
-    // Don't send an ack for the first event since the two GSUs are coalesced
-    // while waiting for the blocking ack of GSB to get sent.
-  }
+  // Ack the first GSU, shouldn't be able to trigger overscroll.
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 
   EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
   EXPECT_EQ(OverscrollSource::NONE, overscroll_source());
@@ -5244,15 +5198,9 @@
   SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED);
   ExpectGestureScrollEventsAfterMouseWheelACK(true, 1);
 
-  if (wheel_scrolling_mode_ != kAsyncWheelEvents) {
-    SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                      INPUT_EVENT_ACK_STATE_CONSUMED);
-    EXPECT_TRUE(ScrollStateIsContentScrolling());
-  } else {
-    // Don't send an ack for the first event since the two GSUs are coalesced
-    // while waiting for the blocking ack of GSB to get sent.
-    EXPECT_TRUE(ScrollStateIsUnknown());
-  }
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_CONSUMED);
+  EXPECT_TRUE(ScrollStateIsContentScrolling());
 
   if (wheel_scrolling_mode_ != kAsyncWheelEvents) {
     ExpectGestureScrollEndForWheelScrolling(false);
@@ -5316,13 +5264,8 @@
   SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED);
   ExpectGestureScrollEventsAfterMouseWheelACK(true, 1);
 
-  if (wheel_scrolling_mode_ != kAsyncWheelEvents) {
-    SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
-                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-  } else {
-    // Don't send an ack for the first event since the two GSUs are coalesced
-    // while waiting for the blocking ack of GSB to get sent.
-  }
+  SendInputEventACK(WebInputEvent::kGestureScrollUpdate,
+                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 
   EXPECT_TRUE(ScrollStateIsUnknown());
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
index 0e01de7..640c1ba 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -47,6 +47,7 @@
 #import "third_party/ocmock/ocmock_extensions.h"
 #import "ui/base/test/scoped_fake_nswindow_focus.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/events/blink/blink_features.h"
 #include "ui/events/blink/web_input_event_traits.h"
 #include "ui/events/test/cocoa_test_event_utils.h"
 #import "ui/gfx/test/ui_cocoa_test_helper.h"
@@ -119,22 +120,6 @@
 
 namespace {
 
-std::string GetInputMessageTypes(MockRenderProcessHost* process) {
-  std::string result;
-  for (size_t i = 0; i < process->sink().message_count(); ++i) {
-    const IPC::Message* message = process->sink().GetMessageAt(i);
-    EXPECT_EQ(InputMsg_HandleInputEvent::ID, message->type());
-    InputMsg_HandleInputEvent::Param params;
-    EXPECT_TRUE(InputMsg_HandleInputEvent::Read(message, &params));
-    const blink::WebInputEvent* event = std::get<0>(params);
-    if (i != 0)
-      result += " ";
-    result += blink::WebInputEvent::GetName(event->GetType());
-  }
-  process->sink().ClearMessages();
-  return result;
-}
-
 blink::WebPointerProperties::PointerType GetInputMessagePointerTypes(
     MockRenderProcessHost* process) {
   blink::WebPointerProperties::PointerType pointer_type;
@@ -374,6 +359,9 @@
       EnableWheelScrollLatching();
     else
       DisableWheelScrollLatching();
+
+    vsync_feature_list_.InitAndEnableFeature(
+        features::kVsyncAlignedInputEvents);
   }
 
   void SetUp() override {
@@ -450,6 +438,7 @@
 
   RenderWidgetHostView* old_rwhv_;
 
+  base::test::ScopedFeatureList vsync_feature_list_;
   base::test::ScopedFeatureList feature_list_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewMacTest);
@@ -1284,8 +1273,9 @@
   host->OnMessageReceived(*response1);
 
   if (scroll_latching_) {
-    // Only wheel event ack exists since GSB event is blocking.
-    ASSERT_EQ(1U, process_host->sink().message_count());
+    // GestureEventQueue allows multiple in-flight events.
+    ASSERT_EQ("GestureScrollBegin GestureScrollUpdate",
+              GetInputMessageTypes(process_host));
     // Send GSB ack.
     InputEventAck unhandled_scroll_ack(
         InputEventAckSource::COMPOSITOR_THREAD,
@@ -1295,7 +1285,9 @@
         new InputHostMsg_HandleInputEvent_ACK(0, unhandled_scroll_ack));
     host->OnMessageReceived(*scroll_response1);
   } else {
-    ASSERT_EQ(2U, process_host->sink().message_count());
+    // GestureEventQueue allows multiple in-flight events.
+    ASSERT_EQ("GestureScrollBegin GestureScrollUpdate GestureScrollEnd",
+              GetInputMessageTypes(process_host));
   }
   process_host->sink().ClearMessages();
 
@@ -1313,12 +1305,7 @@
   // Send another wheel event, this time for scrolling by 0 lines (empty event).
   NSEvent* event2 = MockScrollWheelEventWithPhase(@selector(phaseChanged), 0);
   [view->cocoa_view() scrollWheel:event2];
-  if (scroll_latching_) {
-    ASSERT_EQ(1U, process_host->sink().message_count());
-  } else {
-    // The second message will be nonblocking GSB's ack.
-    ASSERT_EQ(2U, process_host->sink().message_count());
-  }
+  ASSERT_EQ("MouseWheel", GetInputMessageTypes(process_host));
 
   // Indicate that the wheel event was also unhandled.
   std::unique_ptr<IPC::Message> response2(
@@ -1490,9 +1477,10 @@
   std::unique_ptr<IPC::Message> response1(
       new InputHostMsg_HandleInputEvent_ACK(0, unhandled_ack));
   host->OnMessageReceived(*response1);
-  // Only wheel event ack exists since GSB event is blocking.
-  ASSERT_EQ(1U, process_host->sink().message_count());
-  process_host->sink().ClearMessages();
+  // Both GSB and GSU will be sent since GestureEventQueue allows multiple
+  // in-flight events.
+  ASSERT_EQ("GestureScrollBegin GestureScrollUpdate",
+            GetInputMessageTypes(process_host));
 
   // Send a wheel event with phaseEnded. When wheel scroll latching is enabled
   // the event will be dropped and the mouse_wheel_end_dispatch_timer_ will
@@ -1537,9 +1525,10 @@
   std::unique_ptr<IPC::Message> response1(
       new InputHostMsg_HandleInputEvent_ACK(0, unhandled_ack));
   host->OnMessageReceived(*response1);
-  // Only wheel event ack exists since GSB event is blocking.
-  ASSERT_EQ(1U, process_host->sink().message_count());
-  process_host->sink().ClearMessages();
+  // Both GSB and GSU will be sent since GestureEventQueue allows multiple
+  // in-flight events.
+  ASSERT_EQ("GestureScrollBegin GestureScrollUpdate",
+            GetInputMessageTypes(process_host));
 
   // Send a wheel event with phaseEnded. When wheel scroll latching is enabled
   // the event will be dropped and the mouse_wheel_end_dispatch_timer_ will
@@ -1594,9 +1583,10 @@
   std::unique_ptr<IPC::Message> response1(
       new InputHostMsg_HandleInputEvent_ACK(0, unhandled_ack));
   host->OnMessageReceived(*response1);
-  // Only wheel event ack exists since GSB event is blocking.
-  ASSERT_EQ(1U, process_host->sink().message_count());
-  process_host->sink().ClearMessages();
+  // Both GSB and GSU will be sent since GestureEventQueue allows multiple
+  // in-flight events.
+  ASSERT_EQ("GestureScrollBegin GestureScrollUpdate",
+            GetInputMessageTypes(process_host));
 
   // Send a wheel event with phaseEnded. When wheel scroll latching is enabled
   // the event will be dropped and the mouse_wheel_end_dispatch_timer_ will
@@ -1615,7 +1605,8 @@
       MockScrollWheelEventWithPhase(@selector(phaseBegan), 3);
   ASSERT_TRUE(wheelEvent3);
   [view->cocoa_view() scrollWheel:wheelEvent3];
-  ASSERT_EQ(2U, process_host->sink().message_count());
+  ASSERT_EQ("MouseWheel GestureScrollEnd MouseWheel",
+            GetInputMessageTypes(process_host));
   DCHECK(!view->HasPendingWheelEndEventForTesting());
   process_host->sink().ClearMessages();
 
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index f7989d1..e6c6b70 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -38,7 +38,6 @@
 #include "ipc/ipc_message.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
-#include "storage/browser/blob/blob_storage_context.h"
 #include "storage/browser/quota/quota_manager_proxy.h"
 #include "url/gurl.h"
 
@@ -239,7 +238,6 @@
     scoped_refptr<base::SequencedTaskRunner> database_task_runner,
     storage::QuotaManagerProxy* quota_manager_proxy,
     storage::SpecialStoragePolicy* special_storage_policy,
-    base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
     URLLoaderFactoryGetter* url_loader_factory_getter,
     base::ObserverListThreadSafe<ServiceWorkerContextCoreObserver>*
         observer_list,
@@ -247,7 +245,6 @@
     : wrapper_(wrapper),
       providers_(base::MakeUnique<ProcessToProviderMap>()),
       provider_by_uuid_(base::MakeUnique<ProviderByClientUUIDMap>()),
-      blob_storage_context_(std::move(blob_storage_context)),
       loader_factory_getter_(url_loader_factory_getter),
       force_update_on_page_load_(false),
       next_handle_id_(0),
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 13b74143..d7d76e4 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -33,7 +33,6 @@
 }
 
 namespace storage {
-class BlobStorageContext;
 class QuotaManagerProxy;
 class SpecialStoragePolicy;
 }
@@ -110,14 +109,13 @@
   // ServiceWorkerContextWrapper. When Notify() of |observer_list| is called in
   // ServiceWorkerContextCore, the methods of ServiceWorkerContextCoreObserver
   // will be called on the thread which called AddObserver() of |observer_list|.
-  // |blob_context| and |url_loader_factory_getter| are used only
-  // when IsServicificationEnabled is true.
+  // |url_loader_factory_getter| is used only when IsServicificationEnabled is
+  // true.
   ServiceWorkerContextCore(
       const base::FilePath& user_data_directory,
       scoped_refptr<base::SequencedTaskRunner> database_task_runner,
       storage::QuotaManagerProxy* quota_manager_proxy,
       storage::SpecialStoragePolicy* special_storage_policy,
-      base::WeakPtr<storage::BlobStorageContext> blob_context,
       URLLoaderFactoryGetter* url_loader_factory_getter,
       base::ObserverListThreadSafe<ServiceWorkerContextCoreObserver>*
           observer_list,
@@ -298,10 +296,6 @@
   // version. The count resets to zero when the worker successfully starts.
   int GetVersionFailureCount(int64_t version_id);
 
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context() {
-    return blob_storage_context_;
-  }
-
   URLLoaderFactoryGetter* loader_factory_getter() {
     return loader_factory_getter_.get();
   }
@@ -378,7 +372,6 @@
       navigation_handle_cores_map_;
 
   // IsServicificationEnabled
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context_;
   scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_;
 
   bool force_update_on_page_load_;
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index d477baa..f1019c5 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -32,7 +32,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/service_worker_context_observer.h"
 #include "net/base/url_util.h"
-#include "storage/browser/blob/blob_storage_context.h"
 #include "storage/browser/quota/quota_manager_proxy.h"
 #include "storage/browser/quota/special_storage_policy.h"
 
@@ -866,14 +865,10 @@
     quota_manager_proxy->RegisterClient(new ServiceWorkerQuotaClient(this));
   }
 
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context =
-      (blob_context && blob_context->context())
-          ? blob_context->context()->AsWeakPtr()
-          : nullptr;
   context_core_.reset(new ServiceWorkerContextCore(
       user_data_directory, std::move(database_task_runner), quota_manager_proxy,
-      special_storage_policy, blob_storage_context, loader_factory_getter,
-      core_observer_list_.get(), this));
+      special_storage_policy, loader_factory_getter, core_observer_list_.get(),
+      this));
 }
 
 void ServiceWorkerContextWrapper::ShutdownOnIO() {
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
index fc29d68..f8025ec 100644
--- a/content/browser/service_worker/service_worker_provider_host.cc
+++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -691,8 +691,7 @@
   if (ServiceWorkerUtils::IsServicificationEnabled()) {
     mojo::MakeStrongAssociatedBinding(
         base::MakeUnique<ServiceWorkerScriptURLLoaderFactory>(
-            context_, AsWeakPtr(), context_->blob_storage_context(),
-            context_->loader_factory_getter()),
+            context_, AsWeakPtr(), context_->loader_factory_getter()),
         mojo::MakeRequest(&script_loader_factory_ptr_info));
     provider_info->script_loader_factory_ptr_info =
         std::move(script_loader_factory_ptr_info);
diff --git a/content/browser/service_worker/service_worker_script_url_loader.cc b/content/browser/service_worker/service_worker_script_url_loader.cc
index 3e802a2..19506191 100644
--- a/content/browser/service_worker/service_worker_script_url_loader.cc
+++ b/content/browser/service_worker/service_worker_script_url_loader.cc
@@ -10,7 +10,6 @@
 #include "content/browser/service_worker/service_worker_version.h"
 #include "content/browser/url_loader_factory_getter.h"
 #include "content/public/common/resource_response.h"
-#include "storage/browser/blob/blob_storage_context.h"
 
 namespace content {
 
@@ -22,7 +21,6 @@
     mojom::URLLoaderClientPtr client,
     base::WeakPtr<ServiceWorkerContextCore> context,
     base::WeakPtr<ServiceWorkerProviderHost> provider_host,
-    base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
     scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
     : network_client_binding_(this),
diff --git a/content/browser/service_worker/service_worker_script_url_loader.h b/content/browser/service_worker/service_worker_script_url_loader.h
index 3847128..7f7c2b1 100644
--- a/content/browser/service_worker/service_worker_script_url_loader.h
+++ b/content/browser/service_worker/service_worker_script_url_loader.h
@@ -12,10 +12,6 @@
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
-namespace storage {
-class BlobStorageContext;
-}  // namespace storage
-
 namespace content {
 
 class ServiceWorkerContextCore;
@@ -39,7 +35,6 @@
       mojom::URLLoaderClientPtr client,
       base::WeakPtr<ServiceWorkerContextCore> context,
       base::WeakPtr<ServiceWorkerProviderHost> provider_host,
-      base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
       scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter,
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation);
   ~ServiceWorkerScriptURLLoader() override;
diff --git a/content/browser/service_worker/service_worker_script_url_loader_factory.cc b/content/browser/service_worker/service_worker_script_url_loader_factory.cc
index 271c3b9..139b5f4 100644
--- a/content/browser/service_worker/service_worker_script_url_loader_factory.cc
+++ b/content/browser/service_worker/service_worker_script_url_loader_factory.cc
@@ -13,18 +13,15 @@
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/common/resource_response.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
-#include "storage/browser/blob/blob_storage_context.h"
 
 namespace content {
 
 ServiceWorkerScriptURLLoaderFactory::ServiceWorkerScriptURLLoaderFactory(
     base::WeakPtr<ServiceWorkerContextCore> context,
     base::WeakPtr<ServiceWorkerProviderHost> provider_host,
-    base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
     scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter)
     : context_(context),
       provider_host_(provider_host),
-      blob_storage_context_(blob_storage_context),
       loader_factory_getter_(loader_factory_getter) {}
 
 ServiceWorkerScriptURLLoaderFactory::~ServiceWorkerScriptURLLoaderFactory() =
@@ -53,8 +50,7 @@
   mojo::MakeStrongBinding(
       base::MakeUnique<ServiceWorkerScriptURLLoader>(
           routing_id, request_id, options, resource_request, std::move(client),
-          context_, provider_host_, blob_storage_context_,
-          loader_factory_getter_, traffic_annotation),
+          context_, provider_host_, loader_factory_getter_, traffic_annotation),
       std::move(request));
 }
 
diff --git a/content/browser/service_worker/service_worker_script_url_loader_factory.h b/content/browser/service_worker/service_worker_script_url_loader_factory.h
index 9b0f768e..b35cf293 100644
--- a/content/browser/service_worker/service_worker_script_url_loader_factory.h
+++ b/content/browser/service_worker/service_worker_script_url_loader_factory.h
@@ -8,10 +8,6 @@
 #include "base/macros.h"
 #include "content/public/common/url_loader_factory.mojom.h"
 
-namespace storage {
-class BlobStorageContext;
-}  // namespace storage
-
 namespace content {
 
 class ServiceWorkerContextCore;
@@ -28,7 +24,6 @@
   ServiceWorkerScriptURLLoaderFactory(
       base::WeakPtr<ServiceWorkerContextCore> context,
       base::WeakPtr<ServiceWorkerProviderHost> provider_host,
-      base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
       scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter);
   ~ServiceWorkerScriptURLLoaderFactory() override;
 
@@ -48,7 +43,6 @@
 
   base::WeakPtr<ServiceWorkerContextCore> context_;
   base::WeakPtr<ServiceWorkerProviderHost> provider_host_;
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context_;
   scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerScriptURLLoaderFactory);
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc
index 777604a..b3e7694 100644
--- a/content/browser/service_worker/service_worker_url_request_job.cc
+++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -612,7 +612,7 @@
   *blob_uuid = blob_builder.uuid();
   *blob_size = request_body_blob_data_handle_->size();
 
-  if (base::FeatureList::IsEnabled(features::kMojoBlobs)) {
+  if (features::IsMojoBlobsEnabled()) {
     storage::mojom::BlobPtr blob_ptr;
     storage::BlobImpl::Create(base::MakeUnique<storage::BlobDataHandle>(
                                   *request_body_blob_data_handle_),
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index a65c893..fbd83c4 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -562,7 +562,7 @@
       path, quota_manager_proxy.get(), context->GetSpecialStoragePolicy(),
       blob_context.get(), partition->url_loader_factory_getter_.get());
 
-  if (base::FeatureList::IsEnabled(features::kMojoBlobs)) {
+  if (features::IsMojoBlobsEnabled()) {
     partition->blob_registry_ = BlobRegistryWrapper::Create(
         blob_context, partition->filesystem_context_);
   }
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 5b54c76..9921921 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -5240,8 +5240,13 @@
 
   GetOutermostWebContents()->node_.SetFocusedWebContents(this);
 
-  if (!GuestMode::IsCrossProcessFrameGuest(this) && browser_plugin_guest_)
+  if (!GuestMode::IsCrossProcessFrameGuest(this) && browser_plugin_guest_) {
+    // A BrowserPlugin based-guest needs to focus its embedder to be told about
+    // focus state.
+    GetOuterWebContents()->GetMainFrame()->GetRenderWidgetHost()->SetPageFocus(
+        true);
     return;
+  }
 
   // Send a page level blur to the old contents so that it displays inactive UI
   // and focus this contents to activate it.
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc
index 5dd3689..988fcca2 100644
--- a/content/child/resource_dispatcher.cc
+++ b/content/child/resource_dispatcher.cc
@@ -12,14 +12,12 @@
 #include "base/bind.h"
 #include "base/compiler_specific.h"
 #include "base/debug/alias.h"
-#include "base/debug/dump_without_crashing.h"
 #include "base/debug/stack_trace.h"
 #include "base/files/file_path.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/shared_memory.h"
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/rand_util.h"
 #include "base/strings/string_util.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task_scheduler/post_task.h"
@@ -426,31 +424,9 @@
     return;
   }
 
-  // |completion_time.is_null()| is a proxy for OnRequestComplete never being
-  // called.
-  // TODO(csharrison): Remove this code when crbug.com/557430 is resolved.
-  // Sample this enough that this won't dump much more than a hundred times a
-  // day even without the static guard. The guard ensures this dumps much less
-  // frequently, because these aborts frequently come in quick succession.
-  const PendingRequestInfo& info = *it->second;
-  int64_t request_time =
-      (base::TimeTicks::Now() - info.request_start).InMilliseconds();
-  if (info.resource_type == ResourceType::RESOURCE_TYPE_MAIN_FRAME &&
-      info.completion_time.is_null() && request_time < 100 &&
-      base::RandDouble() < .000001) {
-    static bool should_dump = true;
-    if (should_dump) {
-      char url_copy[256] = {0};
-      strncpy(url_copy, info.response_url.spec().c_str(),
-              sizeof(url_copy));
-      base::debug::Alias(&url_copy);
-      base::debug::Alias(&request_time);
-      base::debug::DumpWithoutCrashing();
-      should_dump = false;
-    }
-  }
   // Cancel the request if it didn't complete, and clean it up so the bridge
   // will receive no more messages.
+  const PendingRequestInfo& info = *it->second;
   if (info.completion_time.is_null() && !info.url_loader)
     message_sender_->Send(new ResourceHostMsg_CancelRequest(request_id));
   RemovePendingRequest(request_id);
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 904b755f..165764f 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -323,8 +323,7 @@
   WebRuntimeFeatures::EnableOffMainThreadFetch(
       base::FeatureList::IsEnabled(features::kOffMainThreadFetch));
 
-  WebRuntimeFeatures::EnableMojoBlobs(
-      base::FeatureList::IsEnabled(features::kMojoBlobs));
+  WebRuntimeFeatures::EnableMojoBlobs(features::IsMojoBlobsEnabled());
 
   WebRuntimeFeatures::EnableNetworkService(
       base::FeatureList::IsEnabled(features::kNetworkService));
diff --git a/content/common/content_message_generator.cc b/content/common/content_message_generator.cc
index 621b832..2e2b5a6 100644
--- a/content/common/content_message_generator.cc
+++ b/content/common/content_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "content/common/content_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "content/common/content_message_generator.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/content/common/content_param_traits.cc b/content/common/content_param_traits.cc
index 89fdec94..a80e904 100644
--- a/content/common/content_param_traits.cc
+++ b/content/common/content_param_traits.cc
@@ -16,11 +16,6 @@
 
 namespace IPC {
 
-void ParamTraits<WebInputEventPointer>::GetSize(base::PickleSizer* s,
-                                                const param_type& p) {
-  s->AddData(p->size());
-}
-
 void ParamTraits<WebInputEventPointer>::Write(base::Pickle* m,
                                               const param_type& p) {
   m->WriteData(reinterpret_cast<const char*>(p), p->size());
@@ -66,11 +61,6 @@
   l->append(")");
 }
 
-void ParamTraits<content::MessagePort>::GetSize(base::PickleSizer* s,
-                                                const param_type& p) {
-  ParamTraits<mojo::MessagePipeHandle>::GetSize(s, p.GetHandle().get());
-}
-
 void ParamTraits<content::MessagePort>::Write(base::Pickle* m,
                                               const param_type& p) {
   ParamTraits<mojo::MessagePipeHandle>::Write(m, p.ReleaseHandle().release());
@@ -91,11 +81,6 @@
                                             std::string* l) {
 }
 
-void ParamTraits<ui::AXMode>::GetSize(base::PickleSizer* s,
-                                      const param_type& p) {
-  IPC::GetParamSize(s, p.mode());
-}
-
 void ParamTraits<ui::AXMode>::Write(base::Pickle* m, const param_type& p) {
   IPC::WriteParam(m, p.mode());
 }
@@ -112,16 +97,6 @@
 
 void ParamTraits<ui::AXMode>::Log(const param_type& p, std::string* l) {}
 
-void ParamTraits<scoped_refptr<storage::BlobHandle>>::GetSize(
-    base::PickleSizer* s,
-    const param_type& p) {
-  s->AddBool();
-  if (p) {
-    s->AddUInt32();
-    s->AddAttachment();
-  }
-}
-
 void ParamTraits<scoped_refptr<storage::BlobHandle>>::Write(
     base::Pickle* m,
     const param_type& p) {
@@ -163,13 +138,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef CONTENT_COMMON_CONTENT_PARAM_TRAITS_MACROS_H_
-#include "content/common/content_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/content/common/content_param_traits.h b/content/common/content_param_traits.h
index c16267e..d8303f87 100644
--- a/content/common/content_param_traits.h
+++ b/content/common/content_param_traits.h
@@ -45,7 +45,6 @@
 template <>
 struct ParamTraits<WebInputEventPointer> {
   typedef WebInputEventPointer param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   // Note: upon read, the event has the lifetime of the message.
   static bool Read(const base::Pickle* m,
@@ -57,7 +56,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<content::MessagePort> {
   typedef content::MessagePort param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m, base::PickleIterator* iter,
                    param_type* r);
@@ -67,7 +65,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<ui::AXMode> {
   typedef ui::AXMode param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -78,7 +75,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<scoped_refptr<storage::BlobHandle>> {
   typedef scoped_refptr<storage::BlobHandle> param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/content/common/input/input_param_traits.cc b/content/common/input/input_param_traits.cc
index 0fe6100..66418e3f 100644
--- a/content/common/input/input_param_traits.cc
+++ b/content/common/input/input_param_traits.cc
@@ -16,14 +16,6 @@
 
 namespace IPC {
 
-void ParamTraits<ui::WebScopedInputEvent>::GetSize(base::PickleSizer* s,
-                                                   const param_type& p) {
-  bool valid_web_event = !!p;
-  GetParamSize(s, valid_web_event);
-  if (valid_web_event)
-    GetParamSize(s, static_cast<WebInputEventPointer>(p.get()));
-}
-
 void ParamTraits<ui::WebScopedInputEvent>::Write(base::Pickle* m,
                                                  const param_type& p) {
   bool valid_web_event = !!p;
diff --git a/content/common/input/input_param_traits.h b/content/common/input/input_param_traits.h
index 5c36652..ec027c5 100644
--- a/content/common/input/input_param_traits.h
+++ b/content/common/input/input_param_traits.h
@@ -17,7 +17,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<ui::WebScopedInputEvent> {
   typedef ui::WebScopedInputEvent param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/content/common/media/media_devices_param_traits.cc b/content/common/media/media_devices_param_traits.cc
index d130d42b..74874406 100644
--- a/content/common/media/media_devices_param_traits.cc
+++ b/content/common/media/media_devices_param_traits.cc
@@ -4,12 +4,6 @@
 
 #include "content/common/media/media_devices_param_traits.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "content/common/media/media_devices_param_traits.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/content/common/media/media_stream_param_traits.cc b/content/common/media/media_stream_param_traits.cc
index e752355..f515d96 100644
--- a/content/common/media/media_stream_param_traits.cc
+++ b/content/common/media/media_stream_param_traits.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "content/common/media/media_stream_param_traits.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "content/common/media/media_stream_param_traits.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/content/common/resource_messages.cc b/content/common/resource_messages.cc
index a6a4391..8d2fadbd 100644
--- a/content/common/resource_messages.cc
+++ b/content/common/resource_messages.cc
@@ -9,16 +9,6 @@
 
 namespace IPC {
 
-void ParamTraits<scoped_refptr<net::HttpResponseHeaders>>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
-  GetParamSize(s, p.get() != NULL);
-  if (p.get()) {
-    base::Pickle temp;
-    p->Persist(&temp, net::HttpResponseHeaders::PERSIST_SANS_COOKIES);
-    s->AddBytes(temp.payload_size());
-  }
-}
-
 void ParamTraits<scoped_refptr<net::HttpResponseHeaders>>::Write(
     base::Pickle* m,
     const param_type& p) {
@@ -48,15 +38,6 @@
 
 namespace {
 
-void GetCertSize(base::PickleSizer* s, net::X509Certificate* cert) {
-  GetParamSize(s, !!cert);
-  if (cert) {
-    base::Pickle temp;
-    cert->Persist(&temp);
-    s->AddBytes(temp.payload_size());
-  }
-}
-
 void WriteCert(base::Pickle* m, net::X509Certificate* cert) {
   WriteParam(m, !!cert);
   if (cert)
@@ -79,33 +60,6 @@
 
 }  // namespace
 
-void ParamTraits<net::SSLInfo>::GetSize(base::PickleSizer* s,
-                                        const param_type& p) {
-  GetParamSize(s, p.is_valid());
-  if (!p.is_valid())
-    return;
-  GetCertSize(s, p.cert.get());
-  GetCertSize(s, p.unverified_cert.get());
-  GetParamSize(s, p.cert_status);
-  GetParamSize(s, p.security_bits);
-  GetParamSize(s, p.key_exchange_group);
-  GetParamSize(s, p.connection_status);
-  GetParamSize(s, p.is_issued_by_known_root);
-  GetParamSize(s, p.pkp_bypassed);
-  GetParamSize(s, p.client_cert_sent);
-  GetParamSize(s, p.channel_id_sent);
-  GetParamSize(s, p.token_binding_negotiated);
-  GetParamSize(s, p.token_binding_key_param);
-  GetParamSize(s, p.handshake_type);
-  GetParamSize(s, p.public_key_hashes);
-  GetParamSize(s, p.pinning_failure_log);
-  GetParamSize(s, p.signed_certificate_timestamps);
-  GetParamSize(s, p.ct_compliance_details_available);
-  GetParamSize(s, p.ct_cert_policy_compliance);
-  GetParamSize(s, p.ocsp_result.response_status);
-  GetParamSize(s, p.ocsp_result.revocation_status);
-}
-
 void ParamTraits<net::SSLInfo>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.is_valid());
   if (!p.is_valid())
@@ -166,11 +120,6 @@
   l->append("<SSLInfo>");
 }
 
-void ParamTraits<net::HashValue>::GetSize(base::PickleSizer* s,
-                                          const param_type& p) {
-  GetParamSize(s, p.ToString());
-}
-
 void ParamTraits<net::HashValue>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.ToString());
 }
@@ -186,49 +135,6 @@
   l->append("<HashValue>");
 }
 
-void ParamTraits<storage::DataElement>::GetSize(base::PickleSizer* s,
-                                                const param_type& p) {
-  GetParamSize(s, static_cast<int>(p.type()));
-  switch (p.type()) {
-    case storage::DataElement::TYPE_BYTES: {
-      s->AddData(static_cast<int>(p.length()));
-      break;
-    }
-    case storage::DataElement::TYPE_BYTES_DESCRIPTION: {
-      GetParamSize(s, p.length());
-      break;
-    }
-    case storage::DataElement::TYPE_FILE: {
-      GetParamSize(s, p.path());
-      GetParamSize(s, p.offset());
-      GetParamSize(s, p.length());
-      GetParamSize(s, p.expected_modification_time());
-      break;
-    }
-    case storage::DataElement::TYPE_FILE_FILESYSTEM: {
-      GetParamSize(s, p.filesystem_url());
-      GetParamSize(s, p.offset());
-      GetParamSize(s, p.length());
-      GetParamSize(s, p.expected_modification_time());
-      break;
-    }
-    case storage::DataElement::TYPE_BLOB: {
-      GetParamSize(s, p.blob_uuid());
-      GetParamSize(s, p.offset());
-      GetParamSize(s, p.length());
-      break;
-    }
-    case storage::DataElement::TYPE_DISK_CACHE_ENTRY: {
-      NOTREACHED() << "Can't be sent by IPC.";
-      break;
-    }
-    case storage::DataElement::TYPE_UNKNOWN: {
-      NOTREACHED();
-      break;
-    }
-  }
-}
-
 void ParamTraits<storage::DataElement>::Write(base::Pickle* m,
                                               const param_type& p) {
   WriteParam(m, static_cast<int>(p.type()));
@@ -355,19 +261,6 @@
   l->append("<storage::DataElement>");
 }
 
-void ParamTraits<scoped_refptr<content::ResourceDevToolsInfo>>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
-  GetParamSize(s, p.get() != NULL);
-  if (p.get()) {
-    GetParamSize(s, p->http_status_code);
-    GetParamSize(s, p->http_status_text);
-    GetParamSize(s, p->request_headers);
-    GetParamSize(s, p->response_headers);
-    GetParamSize(s, p->request_headers_text);
-    GetParamSize(s, p->response_headers_text);
-  }
-}
-
 void ParamTraits<scoped_refptr<content::ResourceDevToolsInfo>>::Write(
     base::Pickle* m,
     const param_type& p) {
@@ -412,30 +305,6 @@
   l->append(")");
 }
 
-void ParamTraits<net::LoadTimingInfo>::GetSize(base::PickleSizer* s,
-                                               const param_type& p) {
-  GetParamSize(s, p.socket_log_id);
-  GetParamSize(s, p.socket_reused);
-  GetParamSize(s, p.request_start_time.is_null());
-  if (p.request_start_time.is_null())
-    return;
-  GetParamSize(s, p.request_start_time);
-  GetParamSize(s, p.request_start);
-  GetParamSize(s, p.proxy_resolve_start);
-  GetParamSize(s, p.proxy_resolve_end);
-  GetParamSize(s, p.connect_timing.dns_start);
-  GetParamSize(s, p.connect_timing.dns_end);
-  GetParamSize(s, p.connect_timing.connect_start);
-  GetParamSize(s, p.connect_timing.connect_end);
-  GetParamSize(s, p.connect_timing.ssl_start);
-  GetParamSize(s, p.connect_timing.ssl_end);
-  GetParamSize(s, p.send_start);
-  GetParamSize(s, p.send_end);
-  GetParamSize(s, p.receive_headers_end);
-  GetParamSize(s, p.push_start);
-  GetParamSize(s, p.push_end);
-}
-
 void ParamTraits<net::LoadTimingInfo>::Write(base::Pickle* m,
                                              const param_type& p) {
   WriteParam(m, p.socket_log_id);
@@ -529,17 +398,6 @@
   l->append(")");
 }
 
-void ParamTraits<scoped_refptr<content::ResourceRequestBody>>::GetSize(
-    base::PickleSizer* s,
-    const param_type& p) {
-  GetParamSize(s, p.get() != NULL);
-  if (p.get()) {
-    GetParamSize(s, *p->elements());
-    GetParamSize(s, p->identifier());
-    GetParamSize(s, p->contains_sensitive_info());
-  }
-}
-
 void ParamTraits<scoped_refptr<content::ResourceRequestBody>>::Write(
     base::Pickle* m,
     const param_type& p) {
@@ -582,24 +440,6 @@
   l->append("<ResourceRequestBody>");
 }
 
-void ParamTraits<scoped_refptr<net::ct::SignedCertificateTimestamp>>::GetSize(
-    base::PickleSizer* s,
-    const param_type& p) {
-  GetParamSize(s, p.get() != NULL);
-  if (p.get()) {
-    GetParamSize(s, static_cast<unsigned int>(p->version));
-    GetParamSize(s, p->log_id);
-    GetParamSize(s, p->timestamp);
-    GetParamSize(s, p->extensions);
-    GetParamSize(s, static_cast<unsigned int>(p->signature.hash_algorithm));
-    GetParamSize(s,
-                 static_cast<unsigned int>(p->signature.signature_algorithm));
-    GetParamSize(s, p->signature.signature_data);
-    GetParamSize(s, static_cast<unsigned int>(p->origin));
-    GetParamSize(s, p->log_description);
-  }
-}
-
 void ParamTraits<scoped_refptr<net::ct::SignedCertificateTimestamp>>::Write(
     base::Pickle* m,
     const param_type& p) {
diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h
index d65d1fa..5c282d62 100644
--- a/content/common/resource_messages.h
+++ b/content/common/resource_messages.h
@@ -48,7 +48,6 @@
 template <>
 struct ParamTraits<scoped_refptr<net::HttpResponseHeaders> > {
   typedef scoped_refptr<net::HttpResponseHeaders> param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -59,7 +58,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<net::SSLInfo> {
   typedef net::SSLInfo param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -70,7 +68,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<net::HashValue> {
   typedef net::HashValue param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -81,7 +78,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<storage::DataElement> {
   typedef storage::DataElement param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -92,7 +88,6 @@
 template <>
 struct ParamTraits<scoped_refptr<content::ResourceDevToolsInfo> > {
   typedef scoped_refptr<content::ResourceDevToolsInfo> param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -103,7 +98,6 @@
 template <>
 struct ParamTraits<net::LoadTimingInfo> {
   typedef net::LoadTimingInfo param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -114,7 +108,6 @@
 template <>
 struct ParamTraits<scoped_refptr<content::ResourceRequestBody>> {
   typedef scoped_refptr<content::ResourceRequestBody> param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -125,7 +118,6 @@
 template <>
 struct ParamTraits<scoped_refptr<net::ct::SignedCertificateTimestamp>> {
   typedef scoped_refptr<net::ct::SignedCertificateTimestamp> param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/content/public/browser/host_zoom_map.h b/content/public/browser/host_zoom_map.h
index 61514db8..14c960d 100644
--- a/content/public/browser/host_zoom_map.h
+++ b/content/public/browser/host_zoom_map.h
@@ -12,9 +12,14 @@
 
 #include "base/callback.h"
 #include "base/callback_list.h"
+#include "base/time/time.h"
 #include "content/common/content_export.h"
 #include "url/gurl.h"
 
+namespace base {
+class Clock;
+}
+
 namespace content {
 
 class NavigationEntry;
@@ -52,6 +57,7 @@
     std::string host;
     std::string scheme;
     double zoom_level;
+    base::Time last_modified;
   };
 
   typedef std::vector<ZoomLevelChange> ZoomLevelVector;
@@ -132,6 +138,12 @@
   // This should only be called on the UI thread.
   virtual void SetZoomLevelForHost(const std::string& host, double level) = 0;
 
+  // Sets the zoom level for the |host| to |level| with a given |last_modified|
+  // timestamp. Should only be used for initialization.
+  virtual void InitializeZoomLevelForHost(const std::string& host,
+                                          double level,
+                                          base::Time last_modified) = 0;
+
   // Here |host| is the host portion of URL, or (in the absence of a host)
   // the complete spec of the URL.
   // Sets the zoom level for the |scheme|/|host| pair to |level|. No values
@@ -156,6 +168,15 @@
                                      int render_view_id,
                                      double level) = 0;
 
+  // Clear zoom levels with a modification date greater than or equal
+  // to |delete_begin| and less than |delete_end|. If |delete_end| is null,
+  // all entries after |delete_begin| will be deleted.
+  virtual void ClearZoomLevels(base::Time delete_begin,
+                               base::Time delete_end) = 0;
+
+  // Set whether the map should keep track of modification timestamps.
+  virtual void SetStoreLastModified(bool store_last_modified) = 0;
+
   // Clears the temporary zoom level stored for this WebContents.
   //
   // This should only be called on the UI thread.
@@ -173,6 +194,8 @@
   virtual std::unique_ptr<Subscription> AddZoomLevelChangedCallback(
       const ZoomLevelChangedCallback& callback) = 0;
 
+  virtual void SetClockForTesting(std::unique_ptr<base::Clock> clock) = 0;
+
  protected:
   virtual ~HostZoomMap() {}
 };
diff --git a/content/public/common/common_param_traits.cc b/content/public/common/common_param_traits.cc
index 281c1c2..624156e 100644
--- a/content/public/common/common_param_traits.cc
+++ b/content/public/common/common_param_traits.cc
@@ -18,15 +18,6 @@
 
 namespace IPC {
 
-void ParamTraits<url::Origin>::GetSize(base::PickleSizer* s,
-                                       const param_type& p) {
-  GetParamSize(s, p.unique());
-  GetParamSize(s, p.scheme());
-  GetParamSize(s, p.host());
-  GetParamSize(s, p.port());
-  GetParamSize(s, p.suborigin());
-}
-
 void ParamTraits<url::Origin>::Write(base::Pickle* m, const url::Origin& p) {
   WriteParam(m, p.unique());
   WriteParam(m, p.scheme());
@@ -67,12 +58,6 @@
   l->append(p.Serialize());
 }
 
-void ParamTraits<net::HostPortPair>::GetSize(base::PickleSizer* s,
-                                             const param_type& p) {
-  GetParamSize(s, p.host());
-  GetParamSize(s, p.port());
-}
-
 void ParamTraits<net::HostPortPair>::Write(base::Pickle* m,
                                            const param_type& p) {
   WriteParam(m, p.host());
@@ -96,13 +81,6 @@
   l->append(p.ToString());
 }
 
-void ParamTraits<net::HttpRequestHeaders>::GetSize(base::PickleSizer* s,
-                                                   const param_type& p) {
-  GetParamSize(s, static_cast<int>(p.GetHeaderVector().size()));
-  for (size_t i = 0; i < p.GetHeaderVector().size(); ++i)
-    GetParamSize(s, p.GetHeaderVector()[i]);
-}
-
 void ParamTraits<net::HttpRequestHeaders>::Write(base::Pickle* m,
                                                  const param_type& p) {
   WriteParam(m, static_cast<int>(p.GetHeaderVector().size()));
@@ -133,12 +111,6 @@
   l->append(p.ToString());
 }
 
-void ParamTraits<net::IPEndPoint>::GetSize(base::PickleSizer* s,
-                                           const param_type& p) {
-  GetParamSize(s, p.address());
-  GetParamSize(s, p.port());
-}
-
 void ParamTraits<net::IPEndPoint>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.address());
   WriteParam(m, p.port());
@@ -162,14 +134,6 @@
   LogParam("IPEndPoint:" + p.ToString(), l);
 }
 
-void ParamTraits<net::IPAddress>::GetSize(base::PickleSizer* s,
-                                          const param_type& p) {
-  base::StackVector<uint8_t, 16> bytes;
-  for (uint8_t byte : p.bytes())
-    bytes->push_back(byte);
-  GetParamSize(s, bytes);
-}
-
 void ParamTraits<net::IPAddress>::Write(base::Pickle* m, const param_type& p) {
   base::StackVector<uint8_t, 16> bytes;
   for (uint8_t byte : p.bytes())
@@ -195,11 +159,6 @@
     LogParam("IPAddress:" + (p.empty() ? "(empty)" : p.ToString()), l);
 }
 
-void ParamTraits<content::PageState>::GetSize(base::PickleSizer* s,
-                                              const param_type& p) {
-  GetParamSize(s, p.ToEncodedData());
-}
-
 void ParamTraits<content::PageState>::Write(base::Pickle* m,
                                             const param_type& p) {
   WriteParam(m, p.ToEncodedData());
@@ -224,13 +183,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef CONTENT_PUBLIC_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
-#include "content/public/common/common_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/content/public/common/common_param_traits.h b/content/public/common/common_param_traits.h
index 3dcbcea7..03fca0b 100644
--- a/content/public/common/common_param_traits.h
+++ b/content/public/common/common_param_traits.h
@@ -48,7 +48,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<url::Origin> {
   typedef url::Origin param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -59,7 +58,6 @@
 template<>
 struct CONTENT_EXPORT ParamTraits<net::HostPortPair> {
   typedef net::HostPortPair param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -70,7 +68,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<net::HttpRequestHeaders> {
   typedef net::HttpRequestHeaders param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -81,7 +78,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<net::IPEndPoint> {
   typedef net::IPEndPoint param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -92,7 +88,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<net::IPAddress> {
   typedef net::IPAddress param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -103,7 +98,6 @@
 template <>
 struct CONTENT_EXPORT ParamTraits<content::PageState> {
   typedef content::PageState param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index f7cdb1af..335945fc 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -446,4 +446,9 @@
                                   base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // defined(OS_MACOSX)
 
+bool IsMojoBlobsEnabled() {
+  return base::FeatureList::IsEnabled(features::kMojoBlobs) ||
+         base::FeatureList::IsEnabled(features::kNetworkService);
+}
+
 }  // namespace features
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index aae96213..69507e4e 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -118,6 +118,8 @@
 CONTENT_EXPORT extern const base::Feature kMacV2Sandbox;
 #endif  // defined(OS_MACOSX)
 
+CONTENT_EXPORT bool IsMojoBlobsEnabled();
+
 // DON'T ADD RANDOM STUFF HERE. Put it in the main section above in
 // alphabetical order, or in one of the ifdefs (also in order in each section).
 
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc
index 0a15edc..07ad47fd 100644
--- a/content/public/test/mock_render_process_host.cc
+++ b/content/public/test/mock_render_process_host.cc
@@ -22,6 +22,7 @@
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/common/child_process_host_impl.h"
 #include "content/common/frame_messages.h"
+#include "content/common/input_messages.h"
 #include "content/common/renderer.mojom.h"
 #include "content/public/browser/android/child_process_importance.h"
 #include "content/public/browser/browser_context.h"
@@ -476,4 +477,21 @@
   return &shared_bitmap_allocation_notifier_impl_;
 }
 
+std::string GetInputMessageTypes(MockRenderProcessHost* process) {
+  std::vector<std::string> result;
+  for (size_t i = 0; i < process->sink().message_count(); ++i) {
+    const IPC::Message* message = process->sink().GetMessageAt(i);
+    InputMsg_HandleInputEvent::Param params;
+    if (message->type() != InputMsg_HandleInputEvent::ID ||
+        !InputMsg_HandleInputEvent::Read(message, &params)) {
+      result.push_back("*");
+      break;
+    }
+    const blink::WebInputEvent* event = std::get<0>(params);
+    result.push_back(blink::WebInputEvent::GetName(event->GetType()));
+  }
+  process->sink().ClearMessages();
+  return base::JoinString(result, " ");
+}
+
 }  // namespace content
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h
index 643b389..b06e6b7 100644
--- a/content/public/test/mock_render_process_host.h
+++ b/content/public/test/mock_render_process_host.h
@@ -232,6 +232,12 @@
   DISALLOW_COPY_AND_ASSIGN(MockRenderProcessHostFactory);
 };
 
+// Convenient method to retrieve |InputMsg_HandleInputEvent|s from process sink
+// and returns a string of WebInputEvent types. Will append a trailing '*' if
+// other types of messages were found.
+// This method clears the sink.
+std::string GetInputMessageTypes(MockRenderProcessHost*);
+
 }  // namespace content
 
 #endif  // CONTENT_PUBLIC_TEST_MOCK_RENDER_PROCESS_HOST_H_
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 02ccb1a3..aed4c7d 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -518,13 +518,13 @@
 
   switch (data.action) {
     case ui::AX_ACTION_BLUR:
-      target.SetFocused(false);
+      root.Focus();
       break;
     case ui::AX_ACTION_DECREMENT:
       target.Decrement();
       break;
     case ui::AX_ACTION_DO_DEFAULT:
-      target.PerformDefaultAction();
+      target.Click();
       break;
     case ui::AX_ACTION_GET_IMAGE_DATA:
       OnGetImageData(target, data.target_rect.size());
@@ -549,12 +549,7 @@
       OnLoadInlineTextBoxes(target);
       break;
     case ui::AX_ACTION_FOCUS:
-      // By convention, calling SetFocus on the root of the tree should
-      // clear the current focus. Otherwise set the focus to the new node.
-      if (data.target_node_id == root.AxID())
-        render_frame_->GetRenderView()->GetWebView()->ClearFocusedElement();
-      else
-        target.SetFocused(true);
+      target.Focus();
       break;
     case ui::AX_ACTION_SET_SCROLL_OFFSET:
       target.SetScrollOffset(
diff --git a/content/renderer/cache_storage/cache_storage_dispatcher.cc b/content/renderer/cache_storage/cache_storage_dispatcher.cc
index 60920e6..01966e5f8 100644
--- a/content/renderer/cache_storage/cache_storage_dispatcher.cc
+++ b/content/renderer/cache_storage/cache_storage_dispatcher.cc
@@ -650,8 +650,7 @@
   }
 
   if (!response.blob_uuid.empty()) {
-    DCHECK_EQ(response.blob != nullptr,
-              base::FeatureList::IsEnabled(features::kMojoBlobs));
+    DCHECK_EQ(response.blob != nullptr, features::IsMojoBlobsEnabled());
     mojo::ScopedMessagePipeHandle blob_pipe;
     if (response.blob)
       blob_pipe = response.blob->Clone().PassInterface().PassHandle();
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index c50381dfc..d05356c6 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -222,8 +222,7 @@
                            blink::WebString::FromUTF8(pair.second));
   }
   if (!request.blob_uuid.empty()) {
-    DCHECK_EQ(request.blob != nullptr,
-              base::FeatureList::IsEnabled(features::kMojoBlobs));
+    DCHECK_EQ(request.blob != nullptr, features::IsMojoBlobsEnabled());
     mojo::ScopedMessagePipeHandle blob_pipe;
     if (request.blob)
       blob_pipe = request.blob->Clone().PassInterface().PassHandle();
@@ -266,8 +265,7 @@
                             blink::WebString::FromUTF8(pair.second));
   }
   if (!response.blob_uuid.empty()) {
-    DCHECK_EQ(response.blob != nullptr,
-              base::FeatureList::IsEnabled(features::kMojoBlobs));
+    DCHECK_EQ(response.blob != nullptr, features::IsMojoBlobsEnabled());
     mojo::ScopedMessagePipeHandle blob_pipe;
     if (response.blob)
       blob_pipe = response.blob->Clone().PassInterface().PassHandle();
diff --git a/content/shell/test_runner/web_ax_object_proxy.cc b/content/shell/test_runner/web_ax_object_proxy.cc
index 60c86bd..92da2d0 100644
--- a/content/shell/test_runner/web_ax_object_proxy.cc
+++ b/content/shell/test_runner/web_ax_object_proxy.cc
@@ -656,10 +656,6 @@
       .SetMethod("isAttributeSettable", &WebAXObjectProxy::IsAttributeSettable)
       .SetMethod("isPressActionSupported",
                  &WebAXObjectProxy::IsPressActionSupported)
-      .SetMethod("isIncrementActionSupported",
-                 &WebAXObjectProxy::IsIncrementActionSupported)
-      .SetMethod("isDecrementActionSupported",
-                 &WebAXObjectProxy::IsDecrementActionSupported)
       .SetMethod("parentElement", &WebAXObjectProxy::ParentElement)
       .SetMethod("increment", &WebAXObjectProxy::Increment)
       .SetMethod("decrement", &WebAXObjectProxy::Decrement)
@@ -1464,8 +1460,9 @@
 
 void WebAXObjectProxy::SetSelectedTextRange(int selection_start, int length) {
   accessibility_object_.UpdateLayoutAndCheckValidity();
-  accessibility_object_.SetSelectedTextRange(selection_start,
-                                             selection_start + length);
+  accessibility_object_.SetSelection(accessibility_object_, selection_start,
+                                     accessibility_object_,
+                                     selection_start + length);
 }
 
 void WebAXObjectProxy::SetSelection(v8::Local<v8::Value> anchor_object,
@@ -1511,16 +1508,6 @@
   return accessibility_object_.CanPress();
 }
 
-bool WebAXObjectProxy::IsIncrementActionSupported() {
-  accessibility_object_.UpdateLayoutAndCheckValidity();
-  return accessibility_object_.CanIncrement();
-}
-
-bool WebAXObjectProxy::IsDecrementActionSupported() {
-  accessibility_object_.UpdateLayoutAndCheckValidity();
-  return accessibility_object_.CanDecrement();
-}
-
 v8::Local<v8::Object> WebAXObjectProxy::ParentElement() {
   accessibility_object_.UpdateLayoutAndCheckValidity();
   blink::WebAXObject parent_object = accessibility_object_.ParentObject();
@@ -1545,7 +1532,7 @@
 
 void WebAXObjectProxy::Press() {
   accessibility_object_.UpdateLayoutAndCheckValidity();
-  accessibility_object_.Press();
+  accessibility_object_.Click();
 }
 
 bool WebAXObjectProxy::SetValue(const std::string& value) {
@@ -1577,7 +1564,7 @@
 
 void WebAXObjectProxy::TakeFocus() {
   accessibility_object_.UpdateLayoutAndCheckValidity();
-  accessibility_object_.SetFocused(true);
+  accessibility_object_.Focus();
 }
 
 void WebAXObjectProxy::ScrollToMakeVisible() {
diff --git a/device/BUILD.gn b/device/BUILD.gn
index eb4f649..a2cfa21 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -125,7 +125,6 @@
       "//device/hid",
       "//device/hid:mocks",
       "//device/serial",
-      "//device/serial:test_support",
       "//device/u2f",
       "//device/u2f:mocks",
     ]
diff --git a/device/serial/BUILD.gn b/device/serial/BUILD.gn
index b467ac6..55f808c 100644
--- a/device/serial/BUILD.gn
+++ b/device/serial/BUILD.gn
@@ -16,6 +16,13 @@
   }
 
   static_library("serial") {
+    visibility = [
+      ":test_support",
+      "//device:device_unittests",
+      "//services/device/serial",
+      "//tools/battor_agent:battor_agent_lib",
+    ]
+
     output_name = "device_serial"
 
     sources = [
@@ -69,6 +76,10 @@
   }
 
   static_library("test_support") {
+    # TODO(leonhsl): Merge necessary parts of TestSerialIoHandler into
+    # battor_connection_impl_unittest.cc to hide serial impl completely.
+    visibility = [ "//tools/battor_agent:battor_agent_unittests" ]
+
     sources = [
       "test_serial_io_handler.cc",
       "test_serial_io_handler.h",
diff --git a/extensions/BUILD.gn b/extensions/BUILD.gn
index d1e1fc2..34a0faf 100644
--- a/extensions/BUILD.gn
+++ b/extensions/BUILD.gn
@@ -287,7 +287,6 @@
     "//crypto:platform",
     "//crypto:test_support",
     "//device/bluetooth:mocks",
-    "//device/serial:test_support",
     "//extensions/common/api",
     "//google_apis:test_support",
     "//media:test_support",
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn
index 93d88434..c115a71 100644
--- a/extensions/browser/api/BUILD.gn
+++ b/extensions/browser/api/BUILD.gn
@@ -106,7 +106,6 @@
     "//device/base",
     "//device/bluetooth",
     "//device/hid",
-    "//device/serial",
   ]
 
   if (is_chromeos) {
@@ -152,7 +151,6 @@
 
   deps = [
     ":api",
-    "//device/serial",
     "//extensions/common/api",
     "//skia",
   ]
diff --git a/extensions/browser/api/metrics_private/metrics_private_api.cc b/extensions/browser/api/metrics_private/metrics_private_api.cc
index 8a20f40..a075be9 100644
--- a/extensions/browser/api/metrics_private/metrics_private_api.cc
+++ b/extensions/browser/api/metrics_private/metrics_private_api.cc
@@ -7,7 +7,10 @@
 #include <limits.h>
 
 #include <algorithm>
+#include <memory>
+#include <utility>
 
+#include "base/hash.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_macros.h"
@@ -23,6 +26,7 @@
 namespace GetVariationParams = api::metrics_private::GetVariationParams;
 namespace RecordUserAction = api::metrics_private::RecordUserAction;
 namespace RecordValue = api::metrics_private::RecordValue;
+namespace RecordSparseHashable = api::metrics_private::RecordSparseHashable;
 namespace RecordSparseValue = api::metrics_private::RecordSparseValue;
 namespace RecordPercentage = api::metrics_private::RecordPercentage;
 namespace RecordCount = api::metrics_private::RecordCount;
@@ -133,6 +137,15 @@
 }
 
 ExtensionFunction::ResponseAction
+MetricsPrivateRecordSparseHashableFunction::Run() {
+  auto params = RecordSparseHashable::Params::Create(*args_);
+  EXTENSION_FUNCTION_VALIDATE(params);
+  // This UMA_HISTOGRAM_ macro is okay for non-runtime-constant strings.
+  UMA_HISTOGRAM_SPARSE_SLOWLY(params->metric_name, base::Hash(params->value));
+  return RespondNow(NoArguments());
+}
+
+ExtensionFunction::ResponseAction
 MetricsPrivateRecordSparseValueFunction::Run() {
   std::unique_ptr<RecordSparseValue::Params> params(
       RecordSparseValue::Params::Create(*args_));
diff --git a/extensions/browser/api/metrics_private/metrics_private_api.h b/extensions/browser/api/metrics_private/metrics_private_api.h
index 2e38cf2..e63d910 100644
--- a/extensions/browser/api/metrics_private/metrics_private_api.h
+++ b/extensions/browser/api/metrics_private/metrics_private_api.h
@@ -89,6 +89,19 @@
   ResponseAction Run() override;
 };
 
+class MetricsPrivateRecordSparseHashableFunction
+    : public MetricsHistogramHelperFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION("metricsPrivate.recordSparseHashable",
+                             METRICSPRIVATE_RECORDSPARSEHASHABLE)
+
+ protected:
+  ~MetricsPrivateRecordSparseHashableFunction() override {}
+
+  // ExtensionFunction:
+  ResponseAction Run() override;
+};
+
 class MetricsPrivateRecordSparseValueFunction
     : public MetricsHistogramHelperFunction {
  public:
diff --git a/extensions/browser/api/serial/DEPS b/extensions/browser/api/serial/DEPS
deleted file mode 100644
index e273c39..0000000
--- a/extensions/browser/api/serial/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+device/serial",
-]
diff --git a/extensions/browser/api/serial/serial_apitest.cc b/extensions/browser/api/serial/serial_apitest.cc
index de6f923..92dab3c 100644
--- a/extensions/browser/api/serial/serial_apitest.cc
+++ b/extensions/browser/api/serial/serial_apitest.cc
@@ -10,8 +10,6 @@
 #include "base/memory/ref_counted.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "content/public/browser/browser_thread.h"
-#include "device/serial/buffer.h"
-#include "device/serial/test_serial_io_handler.h"
 #include "extensions/browser/api/serial/serial_api.h"
 #include "extensions/browser/api/serial/serial_connection.h"
 #include "extensions/browser/extension_function.h"
@@ -55,11 +53,13 @@
 
 class FakeSerialIoHandler : public device::mojom::SerialIoHandler {
  public:
-  FakeSerialIoHandler() : test_io_handler_(new device::TestSerialIoHandler()) {
-    test_io_handler_->device_control_signals()->dcd = true;
-    test_io_handler_->device_control_signals()->cts = true;
-    test_io_handler_->device_control_signals()->ri = true;
-    test_io_handler_->device_control_signals()->dsr = true;
+  FakeSerialIoHandler() {
+    options_.bitrate = 9600;
+    options_.data_bits = device::mojom::SerialDataBits::EIGHT;
+    options_.parity_bit = device::mojom::SerialParityBit::NO_PARITY;
+    options_.stop_bits = device::mojom::SerialStopBits::ONE;
+    options_.cts_flow_control = false;
+    options_.has_cts_flow_control = true;
   }
   ~FakeSerialIoHandler() override = default;
 
@@ -68,65 +68,103 @@
   void Open(const std::string& port,
             device::mojom::SerialConnectionOptionsPtr options,
             OpenCallback callback) override {
-    test_io_handler_->Open(port, *options, std::move(callback));
+    DoConfigurePort(*options);
+    std::move(callback).Run(true);
   }
   void Read(uint32_t bytes, ReadCallback callback) override {
-    auto buffer =
-        base::MakeRefCounted<net::IOBuffer>(static_cast<size_t>(bytes));
-    test_io_handler_->Read(std::make_unique<device::ReceiveBuffer>(
-        buffer, bytes,
-        base::BindOnce(
-            [](ReadCallback callback, scoped_refptr<net::IOBuffer> buffer,
-               int bytes_read, device::mojom::SerialReceiveError error) {
-              std::move(callback).Run(
-                  std::vector<uint8_t>(buffer->data(),
-                                       buffer->data() + bytes_read),
-                  error);
-            },
-            std::move(callback), buffer)));
+    DCHECK(!pending_read_callback_);
+    pending_read_callback_ = std::move(callback);
+    pending_read_bytes_ = bytes;
+    if (buffer_.empty())
+      return;
+
+    DoRead();
   }
   void Write(const std::vector<uint8_t>& data,
              WriteCallback callback) override {
-    test_io_handler_->Write(std::make_unique<device::SendBuffer>(
-        data, base::BindOnce(
-                  [](WriteCallback callback, int bytes_sent,
-                     device::mojom::SerialSendError error) {
-                    std::move(callback).Run(bytes_sent, error);
-                  },
-                  std::move(callback))));
+    buffer_.insert(buffer_.end(), data.cbegin(), data.cend());
+    std::move(callback).Run(data.size(), device::mojom::SerialSendError::NONE);
+    DoRead();
   }
   void CancelRead(device::mojom::SerialReceiveError reason) override {
-    test_io_handler_->CancelRead(reason);
+    if (pending_read_callback_) {
+      std::move(pending_read_callback_).Run(std::vector<uint8_t>(), reason);
+    }
   }
   void CancelWrite(device::mojom::SerialSendError reason) override {
-    test_io_handler_->CancelWrite(reason);
   }
-  void Flush(FlushCallback callback) override {
-    std::move(callback).Run(test_io_handler_->Flush());
-  }
+  void Flush(FlushCallback callback) override { std::move(callback).Run(true); }
   void GetControlSignals(GetControlSignalsCallback callback) override {
-    std::move(callback).Run(test_io_handler_->GetControlSignals());
+    auto signals = device::mojom::SerialDeviceControlSignals::New();
+    signals->dcd = true;
+    signals->cts = true;
+    signals->ri = true;
+    signals->dsr = true;
+    std::move(callback).Run(std::move(signals));
   }
   void SetControlSignals(device::mojom::SerialHostControlSignalsPtr signals,
                          SetControlSignalsCallback callback) override {
-    std::move(callback).Run(test_io_handler_->SetControlSignals(*signals));
+    std::move(callback).Run(true);
   }
   void ConfigurePort(device::mojom::SerialConnectionOptionsPtr options,
                      ConfigurePortCallback callback) override {
-    std::move(callback).Run(test_io_handler_->ConfigurePort(*options));
+    DoConfigurePort(*options);
+    std::move(callback).Run(true);
   }
   void GetPortInfo(GetPortInfoCallback callback) override {
-    std::move(callback).Run(test_io_handler_->GetPortInfo());
+    auto info = device::mojom::SerialConnectionInfo::New();
+    info->bitrate = options_.bitrate;
+    info->data_bits = options_.data_bits;
+    info->parity_bit = options_.parity_bit;
+    info->stop_bits = options_.stop_bits;
+    info->cts_flow_control = options_.cts_flow_control;
+    std::move(callback).Run(std::move(info));
   }
   void SetBreak(SetBreakCallback callback) override {
-    std::move(callback).Run(test_io_handler_->SetBreak());
+    std::move(callback).Run(true);
   }
   void ClearBreak(ClearBreakCallback callback) override {
-    std::move(callback).Run(test_io_handler_->ClearBreak());
+    std::move(callback).Run(true);
   }
 
-  // TODO(leonhsl): Eliminate this dependency on device/serial.
-  scoped_refptr<device::TestSerialIoHandler> test_io_handler_;
+  void DoRead() {
+    if (!pending_read_callback_) {
+      return;
+    }
+    size_t num_bytes =
+        std::min(buffer_.size(), static_cast<size_t>(pending_read_bytes_));
+    std::move(pending_read_callback_)
+        .Run(std::vector<uint8_t>(buffer_.data(), buffer_.data() + num_bytes),
+             device::mojom::SerialReceiveError::NONE);
+    buffer_.erase(buffer_.begin(), buffer_.begin() + num_bytes);
+    pending_read_bytes_ = 0;
+  }
+
+  void DoConfigurePort(const device::mojom::SerialConnectionOptions& options) {
+    // Merge options.
+    if (options.bitrate) {
+      options_.bitrate = options.bitrate;
+    }
+    if (options.data_bits != device::mojom::SerialDataBits::NONE) {
+      options_.data_bits = options.data_bits;
+    }
+    if (options.parity_bit != device::mojom::SerialParityBit::NONE) {
+      options_.parity_bit = options.parity_bit;
+    }
+    if (options.stop_bits != device::mojom::SerialStopBits::NONE) {
+      options_.stop_bits = options.stop_bits;
+    }
+    if (options.has_cts_flow_control) {
+      DCHECK(options_.has_cts_flow_control);
+      options_.cts_flow_control = options.cts_flow_control;
+    }
+  }
+
+  // Currently applied connection options.
+  device::mojom::SerialConnectionOptions options_;
+  std::vector<uint8_t> buffer_;
+  FakeSerialIoHandler::ReadCallback pending_read_callback_;
+  uint32_t pending_read_bytes_ = 0;
 
   DISALLOW_COPY_AND_ASSIGN(FakeSerialIoHandler);
 };
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 929df21..cbdda27 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1252,6 +1252,7 @@
   FILEMANAGERPRIVATE_GETRECENTFILES,
   FILEMANAGERPRIVATE_RENAMEVOLUME,
   AUTOTESTPRIVATE_SETMOUSEREVERSESCROLL,
+  METRICSPRIVATE_RECORDSPARSEHASHABLE,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/common/api/metrics_private.json b/extensions/common/api/metrics_private.json
index ba8cc90..59bbc1c 100644
--- a/extensions/common/api/metrics_private.json
+++ b/extensions/common/api/metrics_private.json
@@ -153,6 +153,15 @@
         ]
       },
       {
+        "name": "recordSparseHashable",
+        "type": "function",
+        "description": "Increments the count associated with the hash of |value| in the sparse histogram defined by the |metricName|.",
+        "parameters": [
+          {"name": "metricName", "type": "string"},
+          {"name": "value", "type": "string"}
+        ]
+      },
+      {
         "name": "recordSparseValue",
         "type": "function",
         "description": "Increments the count associated with |value| in the sparse histogram defined by the |metricName|.",
diff --git a/extensions/common/extension_message_generator.cc b/extensions/common/extension_message_generator.cc
index 0ed6784..b066c4f 100644
--- a/extensions/common/extension_message_generator.cc
+++ b/extensions/common/extension_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "extensions/common/extension_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "extensions/common/extension_message_generator.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/extensions/common/extension_messages.cc b/extensions/common/extension_messages.cc
index 87bdc45..3e0367c4 100644
--- a/extensions/common/extension_messages.cc
+++ b/extensions/common/extension_messages.cc
@@ -113,12 +113,6 @@
 
 namespace IPC {
 
-void ParamTraits<URLPattern>::GetSize(base::PickleSizer* s,
-                                      const param_type& p) {
-  GetParamSize(s, p.valid_schemes());
-  GetParamSize(s, p.GetAsString());
-}
-
 void ParamTraits<URLPattern>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.valid_schemes());
   WriteParam(m, p.GetAsString());
@@ -151,11 +145,6 @@
   LogParam(p.GetAsString(), l);
 }
 
-void ParamTraits<URLPatternSet>::GetSize(base::PickleSizer* s,
-                                         const param_type& p) {
-  GetParamSize(s, p.patterns());
-}
-
 void ParamTraits<URLPatternSet>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.patterns());
 }
@@ -177,11 +166,6 @@
   LogParam(p.patterns(), l);
 }
 
-void ParamTraits<APIPermission::ID>::GetSize(base::PickleSizer* s,
-                                             const param_type& p) {
-  GetParamSize(s, static_cast<int>(p));
-}
-
 void ParamTraits<APIPermission::ID>::Write(base::Pickle* m,
                                            const param_type& p) {
   WriteParam(m, static_cast<int>(p));
@@ -203,17 +187,6 @@
   LogParam(static_cast<int>(p), l);
 }
 
-void ParamTraits<APIPermissionSet>::GetSize(base::PickleSizer* s,
-                                            const param_type& p) {
-  APIPermissionSet::const_iterator it = p.begin();
-  const APIPermissionSet::const_iterator end = p.end();
-  GetParamSize(s, static_cast<uint32_t>(p.size()));
-  for (; it != end; ++it) {
-    GetParamSize(s, it->id());
-    it->GetSize(s);
-  }
-}
-
 void ParamTraits<APIPermissionSet>::Write(base::Pickle* m,
                                           const param_type& p) {
   APIPermissionSet::const_iterator it = p.begin();
@@ -252,17 +225,6 @@
   LogParam(p.map(), l);
 }
 
-void ParamTraits<ManifestPermissionSet>::GetSize(base::PickleSizer* s,
-                                                 const param_type& p) {
-  ManifestPermissionSet::const_iterator it = p.begin();
-  const ManifestPermissionSet::const_iterator end = p.end();
-  GetParamSize(s, static_cast<uint32_t>(p.size()));
-  for (; it != end; ++it) {
-    GetParamSize(s, it->name());
-    it->GetSize(s);
-  }
-}
-
 void ParamTraits<ManifestPermissionSet>::Write(base::Pickle* m,
                                                const param_type& p) {
   ManifestPermissionSet::const_iterator it = p.begin();
@@ -300,11 +262,6 @@
   LogParam(p.map(), l);
 }
 
-void ParamTraits<HostID>::GetSize(base::PickleSizer* s, const param_type& p) {
-  GetParamSize(s, p.type());
-  GetParamSize(s, p.id());
-}
-
 void ParamTraits<HostID>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.type());
   WriteParam(m, p.id());
@@ -329,14 +286,6 @@
   LogParam(p.id(), l);
 }
 
-void ParamTraits<ExtensionMsg_PermissionSetStruct>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
-  GetParamSize(s, p.apis);
-  GetParamSize(s, p.manifest_permissions);
-  GetParamSize(s, p.explicit_hosts);
-  GetParamSize(s, p.scriptable_hosts);
-}
-
 void ParamTraits<ExtensionMsg_PermissionSetStruct>::Write(base::Pickle* m,
                                                           const param_type& p) {
   WriteParam(m, p.apis);
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h
index bcbd18ac..450b5c9 100644
--- a/extensions/common/extension_messages.h
+++ b/extensions/common/extension_messages.h
@@ -358,7 +358,6 @@
 template <>
 struct ParamTraits<URLPattern> {
   typedef URLPattern param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -369,7 +368,6 @@
 template <>
 struct ParamTraits<extensions::URLPatternSet> {
   typedef extensions::URLPatternSet param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -380,7 +378,6 @@
 template <>
 struct ParamTraits<extensions::APIPermission::ID> {
   typedef extensions::APIPermission::ID param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -391,7 +388,6 @@
 template <>
 struct ParamTraits<extensions::APIPermissionSet> {
   typedef extensions::APIPermissionSet param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -402,7 +398,6 @@
 template <>
 struct ParamTraits<extensions::ManifestPermissionSet> {
   typedef extensions::ManifestPermissionSet param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -413,7 +408,6 @@
 template <>
 struct ParamTraits<HostID> {
   typedef HostID param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -424,7 +418,6 @@
 template <>
 struct ParamTraits<ExtensionMsg_PermissionSetStruct> {
   typedef ExtensionMsg_PermissionSetStruct param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/extensions/common/permissions/api_permission.cc b/extensions/common/permissions/api_permission.cc
index 148fc8e..db84d8a 100644
--- a/extensions/common/permissions/api_permission.cc
+++ b/extensions/common/permissions/api_permission.cc
@@ -69,8 +69,6 @@
     return new SimpleAPIPermission(info());
   }
 
-  void GetSize(base::PickleSizer* s) const override {}
-
   void Write(base::Pickle* m) const override {}
 
   bool Read(const base::Pickle* m, base::PickleIterator* iter) override {
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h
index 912f87a..4ced5fd 100644
--- a/extensions/common/permissions/api_permission.h
+++ b/extensions/common/permissions/api_permission.h
@@ -327,9 +327,6 @@
   virtual APIPermission* Intersect(const APIPermission* rhs) const = 0;
 
   // IPC functions
-  // Gets the size of the data to be written.
-  virtual void GetSize(base::PickleSizer* s) const = 0;
-
   // Writes this into the given IPC message |m|.
   virtual void Write(base::Pickle* m) const = 0;
 
diff --git a/extensions/common/permissions/manifest_permission.cc b/extensions/common/permissions/manifest_permission.cc
index beb8fe3..ac59a0a 100644
--- a/extensions/common/permissions/manifest_permission.cc
+++ b/extensions/common/permissions/manifest_permission.cc
@@ -27,12 +27,6 @@
   return ToValue()->Equals(rhs->ToValue().get());
 }
 
-void ManifestPermission::GetSize(base::PickleSizer* s) const {
-  base::ListValue singleton;
-  singleton.Append(ToValue());
-  IPC::GetParamSize(s, singleton);
-}
-
 void ManifestPermission::Write(base::Pickle* m) const {
   base::ListValue singleton;
   singleton.Append(ToValue());
diff --git a/extensions/common/permissions/manifest_permission.h b/extensions/common/permissions/manifest_permission.h
index d8c1696..5c6f225 100644
--- a/extensions/common/permissions/manifest_permission.h
+++ b/extensions/common/permissions/manifest_permission.h
@@ -64,9 +64,6 @@
   bool Equal(const ManifestPermission* rhs) const;
 
   // IPC functions
-  // Gets the size of the data to be written.
-  void GetSize(base::PickleSizer* s) const;
-
   // Writes this into the given IPC message |m|.
   void Write(base::Pickle* m) const;
 
diff --git a/extensions/common/permissions/set_disjunction_permission.h b/extensions/common/permissions/set_disjunction_permission.h
index eaf614d..8db673ed 100644
--- a/extensions/common/permissions/set_disjunction_permission.h
+++ b/extensions/common/permissions/set_disjunction_permission.h
@@ -153,10 +153,6 @@
     return std::unique_ptr<base::Value>(list);
   }
 
-  void GetSize(base::PickleSizer* s) const override {
-    IPC::GetParamSize(s, data_set_);
-  }
-
   void Write(base::Pickle* m) const override { IPC::WriteParam(m, data_set_); }
 
   bool Read(const base::Pickle* m, base::PickleIterator* iter) override {
diff --git a/extensions/common/permissions/settings_override_permission.cc b/extensions/common/permissions/settings_override_permission.cc
index bc1aaad..811b7c1c 100644
--- a/extensions/common/permissions/settings_override_permission.cc
+++ b/extensions/common/permissions/settings_override_permission.cc
@@ -87,8 +87,6 @@
   return new SettingsOverrideAPIPermission(info(), setting_value_);
 }
 
-void SettingsOverrideAPIPermission::GetSize(base::PickleSizer* s) const {}
-
 void SettingsOverrideAPIPermission::Write(base::Pickle* m) const {}
 
 bool SettingsOverrideAPIPermission::Read(const base::Pickle* m,
diff --git a/extensions/common/permissions/settings_override_permission.h b/extensions/common/permissions/settings_override_permission.h
index 66e92d6..e5bb9a0 100644
--- a/extensions/common/permissions/settings_override_permission.h
+++ b/extensions/common/permissions/settings_override_permission.h
@@ -33,7 +33,6 @@
   APIPermission* Diff(const APIPermission* rhs) const override;
   APIPermission* Union(const APIPermission* rhs) const override;
   APIPermission* Intersect(const APIPermission* rhs) const override;
-  void GetSize(base::PickleSizer* s) const override;
   void Write(base::Pickle* m) const override;
   bool Read(const base::Pickle* m, base::PickleIterator* iter) override;
   void Log(std::string* log) const override;
diff --git a/gpu/command_buffer/common/capabilities.h b/gpu/command_buffer/common/capabilities.h
index e49f300..548f92e 100644
--- a/gpu/command_buffer/common/capabilities.h
+++ b/gpu/command_buffer/common/capabilities.h
@@ -180,6 +180,7 @@
   bool disable_non_empty_post_sub_buffers = false;
 
   bool disable_2d_canvas_copy_on_write = false;
+  bool disable_overlay_ca_layers = false;
 
   int major_version = 2;
   int minor_version = 0;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 02d5e69..7f6f6c5 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -3942,6 +3942,9 @@
       group_->gpu_preferences().enable_threaded_texture_mailboxes) {
     caps.disable_2d_canvas_copy_on_write = true;
   }
+  if (workarounds().disable_overlay_ca_layers) {
+    caps.disable_overlay_ca_layers = true;
+  }
 
   return caps;
 }
diff --git a/gpu/ipc/common/gpu_command_buffer_traits.cc b/gpu/ipc/common/gpu_command_buffer_traits.cc
index 5d3003a0..f6f3686 100644
--- a/gpu/ipc/common/gpu_command_buffer_traits.cc
+++ b/gpu/ipc/common/gpu_command_buffer_traits.cc
@@ -12,12 +12,6 @@
 #include "gpu/command_buffer/common/sync_token.h"
 #include "gpu/command_buffer/common/texture_in_use_response.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "gpu/ipc/common/gpu_command_buffer_traits_multi.h"
-}  // namespace IPC
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
@@ -38,15 +32,6 @@
 
 namespace IPC {
 
-void ParamTraits<gpu::SyncToken>::GetSize(base::PickleSizer* s,
-                                          const param_type& p) {
-  DCHECK(!p.HasData() || p.verified_flush());
-  GetParamSize(s, p.verified_flush());
-  GetParamSize(s, p.namespace_id());
-  GetParamSize(s, p.command_buffer_id());
-  GetParamSize(s, p.release_count());
-}
-
 void ParamTraits<gpu::SyncToken>::Write(base::Pickle* m, const param_type& p) {
   DCHECK(!p.HasData() || p.verified_flush());
 
@@ -88,12 +73,6 @@
       p.command_buffer_id().GetUnsafeValue(), p.release_count());
 }
 
-void ParamTraits<gpu::TextureInUseResponse>::GetSize(base::PickleSizer* s,
-                                                     const param_type& p) {
-  GetParamSize(s, p.texture);
-  GetParamSize(s, p.in_use);
-}
-
 void ParamTraits<gpu::TextureInUseResponse>::Write(base::Pickle* m,
                                                    const param_type& p) {
   WriteParam(m, p.texture);
@@ -120,11 +99,6 @@
   *l += base::StringPrintf("[%u: %d]", p.texture, static_cast<int>(p.in_use));
 }
 
-void ParamTraits<gpu::Mailbox>::GetSize(base::PickleSizer* s,
-                                        const param_type& p) {
-  s->AddBytes(sizeof(p.name));
-}
-
 void ParamTraits<gpu::Mailbox>::Write(base::Pickle* m, const param_type& p) {
   m->WriteBytes(p.name, sizeof(p.name));
 }
@@ -145,13 +119,6 @@
     *l += base::StringPrintf("%02x", p.name[i]);
 }
 
-void ParamTraits<gpu::MailboxHolder>::GetSize(base::PickleSizer* s,
-                                              const param_type& p) {
-  GetParamSize(s, p.mailbox);
-  GetParamSize(s, p.sync_token);
-  GetParamSize(s, p.texture_target);
-}
-
 void ParamTraits<gpu::MailboxHolder>::Write(base::Pickle* m,
                                             const param_type& p) {
   WriteParam(m, p.mailbox);
diff --git a/gpu/ipc/common/gpu_command_buffer_traits.h b/gpu/ipc/common/gpu_command_buffer_traits.h
index 8c437dba..1dc4008 100644
--- a/gpu/ipc/common/gpu_command_buffer_traits.h
+++ b/gpu/ipc/common/gpu_command_buffer_traits.h
@@ -23,7 +23,6 @@
 template <>
 struct GPU_EXPORT ParamTraits<gpu::SyncToken> {
   using param_type = gpu::SyncToken;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -34,7 +33,6 @@
 template <>
 struct GPU_EXPORT ParamTraits<gpu::TextureInUseResponse> {
   using param_type = gpu::TextureInUseResponse;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -45,7 +43,6 @@
 template<>
 struct GPU_EXPORT ParamTraits<gpu::Mailbox> {
   using param_type = gpu::Mailbox;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -56,7 +53,6 @@
 template <>
 struct GPU_EXPORT ParamTraits<gpu::MailboxHolder> {
   using param_type = gpu::MailboxHolder;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -67,9 +63,6 @@
 template <typename TypeMarker, typename WrappedType, WrappedType kInvalidValue>
 struct ParamTraits<gpu::IdType<TypeMarker, WrappedType, kInvalidValue>> {
   using param_type = gpu::IdType<TypeMarker, WrappedType, kInvalidValue>;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.GetUnsafeValue());
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, p.GetUnsafeValue());
   }
diff --git a/gpu/ipc/common/gpu_command_buffer_traits_multi.h b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
index a7145c0..e8ef3115 100644
--- a/gpu/ipc/common/gpu_command_buffer_traits_multi.h
+++ b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
@@ -138,6 +138,7 @@
   IPC_STRUCT_TRAITS_MEMBER(disable_non_empty_post_sub_buffers)
   IPC_STRUCT_TRAITS_MEMBER(avoid_stencil_buffers)
   IPC_STRUCT_TRAITS_MEMBER(disable_2d_canvas_copy_on_write)
+  IPC_STRUCT_TRAITS_MEMBER(disable_overlay_ca_layers)
 
   IPC_STRUCT_TRAITS_MEMBER(major_version)
   IPC_STRUCT_TRAITS_MEMBER(minor_version)
diff --git a/gpu/ipc/common/gpu_message_generator.cc b/gpu/ipc/common/gpu_message_generator.cc
index 46a9d7f..ab8f4890 100644
--- a/gpu/ipc/common/gpu_message_generator.cc
+++ b/gpu/ipc/common/gpu_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "gpu/ipc/common/gpu_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "gpu/ipc/common/gpu_message_generator.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/gpu/ipc/common/gpu_param_traits.cc b/gpu/ipc/common/gpu_param_traits.cc
index b5f35b2..efc2987 100644
--- a/gpu/ipc/common/gpu_param_traits.cc
+++ b/gpu/ipc/common/gpu_param_traits.cc
@@ -5,13 +5,6 @@
 // Get basic type definitions.
 #include "gpu/ipc/common/gpu_param_traits.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef GPU_IPC_COMMON_GPU_PARAM_TRAITS_MACROS_H_
-#include "gpu/ipc/common/gpu_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/headless/lib/virtual_time_browsertest.cc b/headless/lib/virtual_time_browsertest.cc
index b856a72..3da3d0f 100644
--- a/headless/lib/virtual_time_browsertest.cc
+++ b/headless/lib/virtual_time_browsertest.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include <memory>
-#include "base/strings/stringprintf.h"
 #include "content/public/test/browser_test.h"
 #include "headless/public/devtools/domains/emulation.h"
 #include "headless/public/devtools/domains/page.h"
@@ -52,26 +51,20 @@
     std::string message;
     if (args.size() == 1u && args[0]->HasValue() &&
         args[0]->GetValue()->GetAsString(&message)) {
-      log_.push_back(message);
+      console_logs_.push_back(message);
     }
   }
 
   // emulation::Observer implementation:
   void OnVirtualTimeBudgetExpired(
       const emulation::VirtualTimeBudgetExpiredParams& params) override {
-    EXPECT_THAT(log_,
-                ElementsAre("Paused @ 0ms", "step1", "step2", "Paused @ 100ms",
-                            "step3", "Paused @ 200ms", "step4", "pass"));
+    EXPECT_THAT(console_logs_,
+                ElementsAre("step1", "step2", "step3", "step4", "pass"));
+
     FinishAsynchronousTest();
   }
 
-  void OnVirtualTimePaused(
-      const emulation::VirtualTimePausedParams& params) override {
-    log_.push_back(
-        base::StringPrintf("Paused @ %dms", params.GetVirtualTimeElapsed()));
-  }
-
-  std::vector<std::string> log_;
+  std::vector<std::string> console_logs_;
 };
 
 HEADLESS_ASYNC_DEVTOOLED_TEST_F(VirtualTimeBrowserTest);
diff --git a/ios/build/bots/scripts/run.py b/ios/build/bots/scripts/run.py
index 780a8a5..25b5e78e 100755
--- a/ios/build/bots/scripts/run.py
+++ b/ios/build/bots/scripts/run.py
@@ -52,6 +52,7 @@
         args.xcode_version,
         args.out_dir,
         env_vars=args.env_var,
+        restart=args.restart,
         retries=args.retries,
         test_args=test_args,
         xctest=args.xctest,
@@ -122,6 +123,11 @@
     metavar='sim',
   )
   parser.add_argument(
+    '--restart',
+    action='store_true',
+    help=argparse.SUPPRESS,
+  )
+  parser.add_argument(
     '-r',
     '--retries',
     help='Number of times to retry failed test cases.',
@@ -158,6 +164,7 @@
   args_json = json.loads(args.args_json)
   args.env_var = args.env_var or []
   args.env_var.extend(args_json.get('env_var', []))
+  args.restart = args_json.get('restart', args.restart)
   args.xctest = args_json.get('xctest', args.xctest)
   test_args.extend(args_json.get('test_args', []))
 
diff --git a/ios/build/bots/scripts/test_runner.py b/ios/build/bots/scripts/test_runner.py
index 539ac72f..269f765 100644
--- a/ios/build/bots/scripts/test_runner.py
+++ b/ios/build/bots/scripts/test_runner.py
@@ -51,6 +51,10 @@
     super(DeviceDetectionError, self).__init__(
       'Expected one device, found %s:\n%s' % (len(udids), '\n'.join(udids)))
 
+class DeviceRestartError(TestRunnerError):
+  """Error restarting a device."""
+  def __init__(self):
+    super(DeviceRestartError, self).__init__('Error restarting a device')
 
 class PlugInsNotFoundError(TestRunnerError):
   """The PlugIns directory was not found."""
@@ -220,6 +224,10 @@
     """
     return os.environ.copy()
 
+  def restart(self):
+    """Restart a device or relaunch a simulator."""
+    pass
+
   def set_up(self):
     """Performs setup actions which must occur prior to every test launch."""
     raise NotImplementedError
@@ -319,6 +327,7 @@
       if result.crashed and not result.crashed_test:
         # If the app crashed but not during any particular test case, assume
         # it crashed on startup. Try one more time.
+        self.restart()
         print 'Crashed on startup, retrying...'
         print
         result = self._run(cmd)
@@ -621,6 +630,7 @@
     xcode_version,
     out_dir,
     env_vars=None,
+    restart=False,
     retries=None,
     test_args=None,
     xctest=False,
@@ -632,6 +642,7 @@
       xcode_version: Version of Xcode to use when running the test.
       out_dir: Directory to emit test data into.
       env_vars: List of environment variables to pass to the test itself.
+      restart: Whether or not restart device when test app crashes on startup.
       retries: Number of times to retry failed test cases.
       test_args: List of strings to pass as arguments to the test when
         launching.
@@ -676,6 +687,8 @@
         }
       }
 
+    self.restart = restart
+
   def uninstall_apps(self):
     """Uninstalls all apps found on the device."""
     for app in subprocess.check_output(
@@ -707,6 +720,20 @@
     except subprocess.CalledProcessError:
       raise TestDataExtractionError()
 
+  def restart(self):
+    """Restart the device, wait for two minutes."""
+    # TODO(crbug.com/760399): swarming bot ios 11 devices turn to be unavailable
+    # in a few hours unexpectedly, which is assumed as an ios beta issue. Should
+    # remove this method once the bug is fixed.
+    if self.restart:
+      print 'Restarting device, wait for two minutes.'
+      try:
+        subprocess.check_call(
+          ['idevicediagnostics', 'restart', '--udid', self.udid])
+      except subprocess.CalledProcessError:
+        raise DeviceRestartError()
+      time.sleep(120)
+
   def retrieve_crash_reports(self):
     """Retrieves crash reports produced by the test."""
     logs_dir = os.path.join(self.out_dir, 'Logs')
diff --git a/ios/chrome/app/application_delegate/BUILD.gn b/ios/chrome/app/application_delegate/BUILD.gn
index 6f346ea..9cded35 100644
--- a/ios/chrome/app/application_delegate/BUILD.gn
+++ b/ios/chrome/app/application_delegate/BUILD.gn
@@ -51,6 +51,7 @@
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/u2f",
     "//ios/chrome/browser/ui:ui_internal",
+    "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/main",
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/test:test_support",
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm
index 2072d63..c21492a 100644
--- a/ios/chrome/app/application_delegate/app_state.mm
+++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -39,6 +39,7 @@
 #import "ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.h"
 #include "ios/chrome/browser/ui/background_generator.h"
 #import "ios/chrome/browser/ui/browser_view_controller.h"
+#import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/ui/main/browser_view_information.h"
 #include "ios/net/cookies/cookie_store_ios.h"
diff --git a/ios/chrome/app/application_delegate/app_state_unittest.mm b/ios/chrome/app/application_delegate/app_state_unittest.mm
index 8f33b78..7095a48 100644
--- a/ios/chrome/app/application_delegate/app_state_unittest.mm
+++ b/ios/chrome/app/application_delegate/app_state_unittest.mm
@@ -30,6 +30,7 @@
 #import "ios/chrome/browser/geolocation/omnibox_geolocation_config.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
 #import "ios/chrome/browser/ui/browser_view_controller.h"
+#import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/main/browser_view_information.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
 #import "ios/chrome/test/base/scoped_block_swizzler.h"
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 441cb89..4a4c9cbb 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -1119,7 +1119,7 @@
   // Deferred tasks.
   [self schedulePrefObserverInitialization];
   [self scheduleMemoryDebuggingTools];
-  [_startupTasks scheduleDeferredBrowserStateInitialization:_mainBrowserState];
+  [StartupTasks scheduleDeferredBrowserStateInitialization:_mainBrowserState];
   [self scheduleAuthenticationServiceNotification];
   [self sendQueuedFeedback];
   [self scheduleSpotlightResync];
diff --git a/ios/chrome/app/startup_tasks.h b/ios/chrome/app/startup_tasks.h
index d9cc177..8c2bd641 100644
--- a/ios/chrome/app/startup_tasks.h
+++ b/ios/chrome/app/startup_tasks.h
@@ -14,9 +14,9 @@
 // Class handling all startup tasks.
 @interface StartupTasks : NSObject
 
-// Asynchronously finishes the browser state initialization by scheduling
-// |performDeferredInitializationForBrowserState:|.
-- (void)scheduleDeferredBrowserStateInitialization:
+// Asynchronously finishes the browser state initialization by starting the
+// deferred task runners.
++ (void)scheduleDeferredBrowserStateInitialization:
     (ios::ChromeBrowserState*)browserState;
 // Starts Omaha and, if first run, sets install time.  For official builds only.
 - (void)initializeOmaha;
diff --git a/ios/chrome/app/startup_tasks.mm b/ios/chrome/app/startup_tasks.mm
index 8b8b6da..d540549 100644
--- a/ios/chrome/app/startup_tasks.mm
+++ b/ios/chrome/app/startup_tasks.mm
@@ -34,7 +34,7 @@
 
 // Performs browser state initialization tasks that don't need to happen
 // synchronously at startup.
-- (void)performDeferredInitializationForBrowserState:
++ (void)performDeferredInitializationForBrowserState:
     (ios::ChromeBrowserState*)browserState;
 // Called when UIApplicationWillResignActiveNotification is received.
 - (void)applicationWillResignActiveNotification:(NSNotification*)notification;
@@ -45,7 +45,7 @@
 
 #pragma mark - Public methods.
 
-- (void)scheduleDeferredBrowserStateInitialization:
++ (void)scheduleDeferredBrowserStateInitialization:
     (ios::ChromeBrowserState*)browserState {
   DCHECK(browserState);
   // Schedule the start of the profile deferred task runners.
@@ -82,7 +82,7 @@
 
 #pragma mark - Private methods.
 
-- (void)performDeferredInitializationForBrowserState:
++ (void)performDeferredInitializationForBrowserState:
     (ios::ChromeBrowserState*)browserState {
   ios::StartupTaskRunnerServiceFactory::GetForBrowserState(browserState)
       ->StartDeferredTaskRunners();
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index b6f0679..c6b5c54 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1585,6 +1585,21 @@
       <message name="IDS_IOS_CHOOSE_EMAIL_ASK_TOGGLE" desc="Title for toggle switch to set whether to ask user which Mail client app to use every time a mailto:// URL is tapped. [Length: 50]">
         Ask me which app to use every time
       </message>
-    </messages>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_NEW_FOLDER" desc="Text on the bookmarks context bar to create new folder">
+        New Folder
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_DELETE" desc="Text on the bookmarks context bar for delete action">
+       Delete
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_SELECT" desc="Text on the bookmarks context bar for select action">
+        Select
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_EDIT" desc="Text on the bookmarks context bar for edit action">
+        Edit
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_MORE" desc="Text on the bookmarks context bar to show more context menu">
+        More...
+      </message>
+   </messages>
   </release>
 </grit>
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn
index 7a6b169..e3f0742b 100644
--- a/ios/chrome/browser/passwords/BUILD.gn
+++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -29,6 +29,7 @@
     "js_password_manager.mm",
     "password_controller.h",
     "password_controller.mm",
+    "password_form_filler.h",
     "password_generation_agent.h",
     "password_generation_agent.mm",
     "password_generation_edit_view.h",
@@ -36,6 +37,8 @@
     "password_generation_offer_view.h",
     "password_generation_offer_view.mm",
     "password_generation_prompt_delegate.h",
+    "password_tab_helper.h",
+    "password_tab_helper.mm",
     "passwords_ui_delegate.h",
     "update_password_infobar_controller.h",
     "update_password_infobar_controller.mm",
diff --git a/ios/chrome/browser/passwords/password_controller.h b/ios/chrome/browser/passwords/password_controller.h
index 65d1087c..53e046b 100644
--- a/ios/chrome/browser/passwords/password_controller.h
+++ b/ios/chrome/browser/passwords/password_controller.h
@@ -15,8 +15,9 @@
 
 @protocol ApplicationCommands;
 @protocol FormInputAccessoryViewProvider;
-@protocol PasswordsUiDelegate;
+@protocol PasswordFormFiller;
 @class PasswordGenerationAgent;
+@protocol PasswordsUiDelegate;
 
 namespace password_manager {
 class PasswordGenerationManager;
@@ -49,6 +50,9 @@
 @property(nonatomic, readonly)
     password_manager::PasswordManagerDriver* passwordManagerDriver;
 
+// The PasswordFormFiller owned by this PasswordController.
+@property(nonatomic, readonly) id<PasswordFormFiller> passwordFormFiller;
+
 // The dispatcher used for the PasswordController. This property can return nil
 // even after being set to a non-nil object.
 @property(nonatomic, weak) id<ApplicationCommands> dispatcher;
@@ -70,13 +74,6 @@
 // otherwise invalid memory might be accessed during destruction.
 - (void)detach;
 
-// Uses JavaScript to find password forms using the |webState_| and fills
-// them with the |username| and |password|. |completionHandler|, if not nil,
-// is called once per form filled.
-- (void)findAndFillPasswordForms:(NSString*)username
-                        password:(NSString*)password
-               completionHandler:(void (^)(BOOL))completionHandler;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_CONTROLLER_H_
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index 81a9b56..49ac664 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -36,6 +36,7 @@
 #import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h"
 #import "ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.h"
 #import "ios/chrome/browser/passwords/js_password_manager.h"
+#import "ios/chrome/browser/passwords/password_form_filler.h"
 #import "ios/chrome/browser/passwords/password_generation_agent.h"
 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
@@ -70,7 +71,7 @@
 
 @end
 
-@interface PasswordController ()<FormSuggestionProvider>
+@interface PasswordController ()<FormSuggestionProvider, PasswordFormFiller>
 
 // Parses the |jsonString| which contatins the password forms found on a web
 // page to populate the |forms| vector.
@@ -355,6 +356,24 @@
   passwordManagerClient_.reset();
 }
 
+#pragma mark -
+#pragma mark Properties
+
+- (id<PasswordFormFiller>)passwordFormFiller {
+  return self;
+}
+
+- (id<ApplicationCommands>)dispatcher {
+  return passwordGenerationAgent_.dispatcher;
+}
+
+- (void)setDispatcher:(id<ApplicationCommands>)dispatcher {
+  passwordGenerationAgent_.dispatcher = dispatcher;
+}
+
+#pragma mark -
+#pragma mark PasswordFormFiller
+
 - (void)findAndFillPasswordForms:(NSString*)username
                         password:(NSString*)password
                completionHandler:(void (^)(BOOL))completionHandler {
@@ -377,14 +396,6 @@
   }];
 }
 
-- (id<ApplicationCommands>)dispatcher {
-  return passwordGenerationAgent_.dispatcher;
-}
-
-- (void)setDispatcher:(id<ApplicationCommands>)dispatcher {
-  passwordGenerationAgent_.dispatcher = dispatcher;
-}
-
 #pragma mark -
 #pragma mark CRWWebStateObserver
 
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm
index 06bb90a17..3675c0f 100644
--- a/ios/chrome/browser/passwords/password_controller_unittest.mm
+++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -29,6 +29,7 @@
 #import "ios/chrome/browser/autofill/form_suggestion_controller.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/passwords/js_password_manager.h"
+#import "ios/chrome/browser/passwords/password_form_filler.h"
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/navigation_manager.h"
 #include "ios/web/public/ssl_status.h"
@@ -923,13 +924,14 @@
             "<input id='pw' type='password' name='p'></form>");
   __block int call_counter = 0;
   __block int success_counter = 0;
-  [passwordController_ findAndFillPasswordForms:@"john.doe@gmail.com"
-                                       password:@"super!secret"
-                              completionHandler:^(BOOL complete) {
-                                ++call_counter;
-                                if (complete)
-                                  ++success_counter;
-                              }];
+  [passwordController_.passwordFormFiller
+      findAndFillPasswordForms:@"john.doe@gmail.com"
+                      password:@"super!secret"
+             completionHandler:^(BOOL complete) {
+               ++call_counter;
+               if (complete)
+                 ++success_counter;
+             }];
   base::test::ios::WaitUntilCondition(^{
     return call_counter == 1;
   });
@@ -952,15 +954,16 @@
             "<input id='p3' type='password' name='pw3'></form>");
   __block int call_counter = 0;
   __block int success_counter = 0;
-  [passwordController_ findAndFillPasswordForms:@"john.doe@gmail.com"
-                                       password:@"super!secret"
-                              completionHandler:^(BOOL complete) {
-                                ++call_counter;
-                                if (complete)
-                                  ++success_counter;
-                                LOG(INFO) << "HANDLER call " << call_counter
-                                          << " success " << success_counter;
-                              }];
+  [passwordController_.passwordFormFiller
+      findAndFillPasswordForms:@"john.doe@gmail.com"
+                      password:@"super!secret"
+             completionHandler:^(BOOL complete) {
+               ++call_counter;
+               if (complete)
+                 ++success_counter;
+               LOG(INFO) << "HANDLER call " << call_counter << " success "
+                         << success_counter;
+             }];
   // There should be 3 password forms and only 2 successfully filled forms.
   base::test::ios::WaitUntilCondition(^{
     return call_counter == 3;
diff --git a/ios/chrome/browser/passwords/password_form_filler.h b/ios/chrome/browser/passwords/password_form_filler.h
new file mode 100644
index 0000000..e2bd542b
--- /dev/null
+++ b/ios/chrome/browser/passwords/password_form_filler.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 IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_FORM_FILLER_H_
+#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_FORM_FILLER_H_
+
+#import <Foundation/Foundation.h>
+
+@protocol PasswordFormFiller<NSObject>
+
+// Finds password forms in the page and fills them with the |username| and
+// |password|. If not nil, |completionHandler| is called once per form filled.
+- (void)findAndFillPasswordForms:(NSString*)username
+                        password:(NSString*)password
+               completionHandler:(void (^)(BOOL))completionHandler;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_FORM_FILLER_H_
diff --git a/ios/chrome/browser/passwords/password_tab_helper.h b/ios/chrome/browser/passwords/password_tab_helper.h
new file mode 100644
index 0000000..9e927a5
--- /dev/null
+++ b/ios/chrome/browser/passwords/password_tab_helper.h
@@ -0,0 +1,64 @@
+// 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 IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_TAB_HELPER_H_
+#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_TAB_HELPER_H_
+
+#include "base/macros.h"
+#import "ios/web/public/web_state/web_state_observer.h"
+#import "ios/web/public/web_state/web_state_user_data.h"
+
+@protocol ApplicationCommands;
+@protocol FormInputAccessoryViewProvider;
+@protocol FormSuggestionProvider;
+@class PasswordController;
+@protocol PasswordFormFiller;
+@protocol PasswordsUiDelegate;
+
+namespace password_manager {
+class PasswordGenerationManager;
+}
+
+// Class binding a PasswordController to a WebState.
+class PasswordTabHelper : public web::WebStateObserver,
+                          public web::WebStateUserData<PasswordTabHelper> {
+ public:
+  ~PasswordTabHelper() override;
+
+  // Creates a PasswordTabHelper and attaches it to the given |web_state|.
+  // |password_ui_delegate| may be nil.
+  static void CreateForWebState(web::WebState* web_state,
+                                id<PasswordsUiDelegate> passwords_ui_delegate);
+
+  // Sets the PasswordController dispatcher.
+  void SetDispatcher(id<ApplicationCommands> dispatcher);
+
+  // Returns an object that can provide suggestions from the PasswordController.
+  // May return nil.
+  id<FormSuggestionProvider> GetSuggestionProvider();
+
+  // Returns an object that can provide an input accessory view from the
+  // PasswordController.
+  id<FormInputAccessoryViewProvider> GetAccessoryViewProvider();
+
+  // Returns the PasswordFormFiller from the PasswordController.
+  id<PasswordFormFiller> GetPasswordFormFiller();
+
+  // Returns the PasswordGenerationManager owned by the PasswordController.
+  password_manager::PasswordGenerationManager* GetPasswordGenerationManager();
+
+ private:
+  PasswordTabHelper(web::WebState* web_state,
+                    id<PasswordsUiDelegate> passwords_ui_delegate);
+
+  // web::WebStateObserver implementation.
+  void WebStateDestroyed() override;
+
+  // The Objective-C password controller instance.
+  __strong PasswordController* controller_;
+
+  DISALLOW_COPY_AND_ASSIGN(PasswordTabHelper);
+};
+
+#endif  // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_TAB_HELPER_H_
diff --git a/ios/chrome/browser/passwords/password_tab_helper.mm b/ios/chrome/browser/passwords/password_tab_helper.mm
new file mode 100644
index 0000000..8ff60ef5
--- /dev/null
+++ b/ios/chrome/browser/passwords/password_tab_helper.mm
@@ -0,0 +1,64 @@
+// 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.
+
+#import "ios/chrome/browser/passwords/password_tab_helper.h"
+
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#import "ios/chrome/browser/passwords/password_controller.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+DEFINE_WEB_STATE_USER_DATA_KEY(PasswordTabHelper);
+
+PasswordTabHelper::~PasswordTabHelper() = default;
+
+// static
+void PasswordTabHelper::CreateForWebState(
+    web::WebState* web_state,
+    id<PasswordsUiDelegate> passwords_ui_delegate) {
+  DCHECK(web_state);
+  DCHECK(!FromWebState(web_state));
+  web_state->SetUserData(UserDataKey(), base::WrapUnique(new PasswordTabHelper(
+                                            web_state, passwords_ui_delegate)));
+}
+
+void PasswordTabHelper::SetDispatcher(id<ApplicationCommands> dispatcher) {
+  controller_.dispatcher = dispatcher;
+}
+
+id<FormSuggestionProvider> PasswordTabHelper::GetSuggestionProvider() {
+  return controller_.suggestionProvider;
+}
+
+id<FormInputAccessoryViewProvider>
+PasswordTabHelper::GetAccessoryViewProvider() {
+  return controller_.accessoryViewProvider;
+}
+
+id<PasswordFormFiller> PasswordTabHelper::GetPasswordFormFiller() {
+  return controller_.passwordFormFiller;
+}
+
+password_manager::PasswordGenerationManager*
+PasswordTabHelper::GetPasswordGenerationManager() {
+  return controller_.passwordGenerationManager;
+}
+
+PasswordTabHelper::PasswordTabHelper(
+    web::WebState* web_state,
+    id<PasswordsUiDelegate> passwords_ui_delegate)
+    : web::WebStateObserver(web_state),
+      controller_([[PasswordController alloc]
+             initWithWebState:web_state
+          passwordsUiDelegate:passwords_ui_delegate]) {
+  DCHECK(web::WebStateObserver::web_state());
+}
+
+void PasswordTabHelper::WebStateDestroyed() {
+  [controller_ detach];
+  controller_ = nil;
+}
diff --git a/ios/chrome/browser/tabs/tab.h b/ios/chrome/browser/tabs/tab.h
index 3f14b7a6..a391ffb 100644
--- a/ios/chrome/browser/tabs/tab.h
+++ b/ios/chrome/browser/tabs/tab.h
@@ -119,8 +119,6 @@
 // The Webstate associated with this Tab.
 @property(nonatomic, readonly) web::WebState* webState;
 
-// Handles saving and autofill of passwords.
-@property(nonatomic, readonly) PasswordController* passwordController;
 @property(nonatomic, readonly) BOOL canGoBack;
 @property(nonatomic, readonly) BOOL canGoForward;
 @property(nonatomic, weak) id<TabDelegate> delegate;
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
index 538dd3f..cdcebef 100644
--- a/ios/chrome/browser/tabs/tab.mm
+++ b/ios/chrome/browser/tabs/tab.mm
@@ -58,8 +58,7 @@
 #include "ios/chrome/browser/history/top_sites_factory.h"
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/metrics/tab_usage_recorder.h"
-#import "ios/chrome/browser/passwords/password_controller.h"
-#import "ios/chrome/browser/passwords/passwords_ui_delegate_impl.h"
+#import "ios/chrome/browser/passwords/password_tab_helper.h"
 #include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/reading_list/reading_list_model_factory.h"
 #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
@@ -396,7 +395,6 @@
 @synthesize isPrerenderTab = _isPrerenderTab;
 @synthesize isLinkLoadingPrerenderTab = isLinkLoadingPrerenderTab_;
 @synthesize isVoiceSearchResultsTab = _isVoiceSearchResultsTab;
-@synthesize passwordController = passwordController_;
 @synthesize overscrollActionsController = _overscrollActionsController;
 @synthesize overscrollActionsControllerDelegate =
     overscrollActionsControllerDelegate_;
@@ -441,17 +439,11 @@
   if (experimental_flags::IsAutoReloadEnabled())
     _autoReloadBridge = [[AutoReloadBridge alloc] initWithTab:self];
 
-  id<PasswordsUiDelegate> passwordsUIDelegate =
-      [[PasswordsUiDelegateImpl alloc] init];
-  passwordController_ =
-      [[PasswordController alloc] initWithWebState:self.webState
-                               passwordsUiDelegate:passwordsUIDelegate];
-  password_manager::PasswordGenerationManager* passwordGenerationManager =
-      [passwordController_ passwordGenerationManager];
-  _autofillController =
-      [[AutofillController alloc] initWithBrowserState:_browserState
-                             passwordGenerationManager:passwordGenerationManager
-                                              webState:self.webState];
+  _autofillController = [[AutofillController alloc]
+           initWithBrowserState:_browserState
+      passwordGenerationManager:PasswordTabHelper::FromWebState(self.webState)
+                                    ->GetPasswordGenerationManager()
+                       webState:self.webState];
   _suggestionController = [[FormSuggestionController alloc]
       initWithWebState:self.webState
              providers:[self suggestionProviders]];
@@ -471,8 +463,10 @@
 
 - (NSArray*)accessoryViewProviders {
   NSMutableArray* providers = [NSMutableArray array];
+
   id<FormInputAccessoryViewProvider> provider =
-      [passwordController_ accessoryViewProvider];
+      PasswordTabHelper::FromWebState(self.webState)
+          ->GetAccessoryViewProvider();
   if (provider)
     [providers addObject:provider];
   [providers addObject:[_suggestionController accessoryViewProvider]];
@@ -481,7 +475,8 @@
 
 - (NSArray*)suggestionProviders {
   NSMutableArray* providers = [NSMutableArray array];
-  [providers addObject:[passwordController_ suggestionProvider]];
+  [providers addObject:PasswordTabHelper::FromWebState(self.webState)
+                           ->GetSuggestionProvider()];
   [providers addObject:[_autofillController suggestionProvider]];
   return providers;
 }
@@ -715,7 +710,9 @@
   // should be nil, or the new value should be nil.
   DCHECK(!_dispatcher || !dispatcher);
   _dispatcher = dispatcher;
-  self.passwordController.dispatcher = dispatcher;
+  // Forward the new dispatcher to tab helpers.
+  PasswordTabHelper::FromWebState(self.webState)
+      ->SetDispatcher(self.dispatcher);
   // If the new dispatcher is nonnull, add tab helpers.
   if (self.dispatcher)
     [self attachDispatcherDependentTabHelpers];
@@ -867,8 +864,6 @@
   self.passKitDialogProvider = nil;
   self.snapshotOverlayProvider = nil;
 
-  [passwordController_ detach];
-  passwordController_ = nil;
   _tabInfoBarObserver.reset();
 
   _faviconDriverObserverBridge.reset();
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm
index 2c45ebdf..1b97912c 100644
--- a/ios/chrome/browser/tabs/tab_helper_util.mm
+++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -20,6 +20,8 @@
 #include "ios/chrome/browser/history/history_service_factory.h"
 #include "ios/chrome/browser/history/top_sites_factory.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/passwords/password_tab_helper.h"
+#import "ios/chrome/browser/passwords/passwords_ui_delegate_impl.h"
 #include "ios/chrome/browser/reading_list/reading_list_model_factory.h"
 #import "ios/chrome/browser/reading_list/reading_list_web_state_observer.h"
 #import "ios/chrome/browser/sessions/ios_chrome_session_tab_helper.h"
@@ -92,6 +94,9 @@
       web_state,
       ios::TopSitesFactory::GetForBrowserState(original_browser_state).get());
 
+  PasswordTabHelper::CreateForWebState(web_state,
+                                       [[PasswordsUiDelegateImpl alloc] init]);
+
   // Allow the embedder to attach tab helpers.
   ios::GetChromeBrowserProvider()->AttachTabHelpers(web_state, tab);
 
diff --git a/ios/chrome/browser/ui/activity_services/BUILD.gn b/ios/chrome/browser/ui/activity_services/BUILD.gn
index 17f15d9..3891b31 100644
--- a/ios/chrome/browser/ui/activity_services/BUILD.gn
+++ b/ios/chrome/browser/ui/activity_services/BUILD.gn
@@ -57,6 +57,7 @@
     ":activity_services",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/passwords",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui/activity_services/requirements",
     "//ios/chrome/browser/ui/commands",
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller.mm
index 34a3bee..498ef6a 100644
--- a/ios/chrome/browser/ui/activity_services/activity_service_controller.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_service_controller.mm
@@ -8,7 +8,7 @@
 
 #include "base/logging.h"
 #include "base/mac/foundation_util.h"
-#import "ios/chrome/browser/passwords/password_controller.h"
+#import "ios/chrome/browser/passwords/password_form_filler.h"
 #import "ios/chrome/browser/ui/activity_services/activity_type_util.h"
 #import "ios/chrome/browser/ui/activity_services/appex_constants.h"
 #import "ios/chrome/browser/ui/activity_services/chrome_activity_item_source.h"
@@ -326,14 +326,14 @@
              completionMessage:(NSString*)message {
   switch (shareStatus) {
     case ShareTo::SHARE_SUCCESS: {
-      PasswordController* passwordController =
-          [passwordProvider_ currentPasswordController];
       // Captures this provider for use in the asynchronously executed
       // completion block.
       __weak id<ActivityServiceSnackbar> snackbarProvider = snackbarProvider_;
       // Flag to limit user feedback after form filled to just once.
       __block BOOL shown = NO;
-      [passwordController findAndFillPasswordForms:username
+      id<PasswordFormFiller> passwordFormFiller =
+          [passwordProvider_ currentPasswordFormFiller];
+      [passwordFormFiller findAndFillPasswordForms:username
                                           password:password
                                  completionHandler:^(BOOL completed) {
                                    if (shown || !completed || ![message length])
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
index a1c3b6e..7be8fd0 100644
--- a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
@@ -7,7 +7,7 @@
 #import <MobileCoreServices/MobileCoreServices.h>
 
 #import "base/test/ios/wait_util.h"
-#import "ios/chrome/browser/passwords/password_controller.h"
+#import "ios/chrome/browser/passwords/password_form_filler.h"
 #import "ios/chrome/browser/ui/activity_services/activity_type_util.h"
 #import "ios/chrome/browser/ui/activity_services/appex_constants.h"
 #import "ios/chrome/browser/ui/activity_services/chrome_activity_item_source.h"
@@ -30,6 +30,37 @@
 #error "This file requires ARC support."
 #endif
 
+@interface FakePasswordFormFiller : NSObject<PasswordFormFiller>
+
+// Stores the latest value passed to the invocation of the method
+// -findAndFillPasswordForms:password:completionHandler:.
+@property(nonatomic, readonly, copy) NSString* username;
+@property(nonatomic, readonly, copy) NSString* password;
+
+// YES if the method -findAndFillPasswordForms:password:completionHandler:
+// was called on this object, NO otherwise.
+@property(nonatomic, readonly, assign) BOOL methodCalled;
+
+@end
+
+@implementation FakePasswordFormFiller
+
+@synthesize username = _username;
+@synthesize password = _password;
+@synthesize methodCalled = _methodCalled;
+
+- (void)findAndFillPasswordForms:(NSString*)username
+                        password:(NSString*)password
+               completionHandler:(void (^)(BOOL))completionHandler {
+  _methodCalled = YES;
+  _username = [username copy];
+  _password = [password copy];
+  if (completionHandler)
+    completionHandler(YES);
+}
+
+@end
+
 @interface ActivityServiceController (CrVisibleForTesting)
 - (NSArray*)activityItemsForData:(ShareToData*)data;
 - (NSArray*)applicationActivitiesForData:(ShareToData*)data
@@ -54,7 +85,8 @@
                ActivityServiceSnackbar>
 
 @property(nonatomic, readonly, strong) UIViewController* parentViewController;
-@property(nonatomic, readonly, strong) OCMockObject* passwordControllerMock;
+@property(nonatomic, readonly, strong)
+    FakePasswordFormFiller* fakePasswordFormFiller;
 
 // Tracks whether or not the associated provider methods were called.
 @property(nonatomic, readonly, assign)
@@ -84,18 +116,18 @@
 @synthesize latestErrorAlertMessage = _latestErrorAlertMessage;
 @synthesize latestSnackbarMessage = _latestSnackbarMessage;
 @synthesize parentViewController = _parentViewController;
-@synthesize passwordControllerMock = _passwordControllerMock;
+@synthesize fakePasswordFormFiller = _fakePasswordFormFiller;
 
 - (instancetype)initWithParentViewController:(UIViewController*)controller {
   if ((self = [super init])) {
     _parentViewController = controller;
-    _passwordControllerMock = OCMClassMock([PasswordController class]);
+    _fakePasswordFormFiller = [[FakePasswordFormFiller alloc] init];
   }
   return self;
 }
 
-- (PasswordController*)currentPasswordController {
-  return static_cast<PasswordController*>(self.passwordControllerMock);
+- (id<PasswordFormFiller>)currentPasswordFormFiller {
+  return _fakePasswordFormFiller;
 }
 
 - (void)presentActivityServiceViewController:(UIViewController*)controller {
@@ -243,16 +275,9 @@
     [activityController setProvidersForTesting:provider];
 
     // The following call to |processItemsReturnedFromActivity| should not
-    // trigger any calls to the mock PasswordController.  Use |rejectBlock| to
-    // trigger gtest failures because strict mocks throw exceptions when they
-    // receive unexpected methods, and crashing the whole test suite is bad.
-    void (^rejectBlock)(NSInvocation*) = ^(NSInvocation* invocation) {
-      FAIL() << "Methods were called unexpectedly on PasswordController";
-    };
-    [[[provider.passwordControllerMock stub] andDo:rejectBlock]
-        findAndFillPasswordForms:OCMOCK_ANY
-                        password:OCMOCK_ANY
-               completionHandler:OCMOCK_ANY];
+    // trigger any calls to the PasswordFormFiller.
+    EXPECT_TRUE(provider.fakePasswordFormFiller);
+    EXPECT_FALSE(provider.fakePasswordFormFiller.methodCalled);
 
     // Sets up the returned item from a Password Management App Extension.
     NSString* activityType = @"com.lastpass.ilastpass.LastPassExt";
@@ -263,8 +288,8 @@
                                                        items:extensionItems];
     ASSERT_EQ(expectedResetUI, resetUI);
 
-    ASSERT_TRUE([provider currentPasswordController]);
-    EXPECT_OCMOCK_VERIFY(provider.passwordControllerMock);
+    EXPECT_TRUE(provider.fakePasswordFormFiller);
+    EXPECT_FALSE(provider.fakePasswordFormFiller.methodCalled);
   }
 
   web::TestWebThreadBundle thread_bundle_;
@@ -422,28 +447,16 @@
   FakeActivityServiceControllerTestProvider* provider =
       [[FakeActivityServiceControllerTestProvider alloc]
           initWithParentViewController:nil];
-  ASSERT_TRUE([provider currentPasswordController]);
+  ASSERT_TRUE([provider currentPasswordFormFiller]);
   [activityController setProvidersForTesting:provider];
 
+  EXPECT_TRUE(provider.fakePasswordFormFiller);
+  EXPECT_FALSE(provider.fakePasswordFormFiller.methodCalled);
+
   // Sets up expectations on the mock PasswordController to check that the
   // callback function is called with the correct username and password.
   NSString* const kSecretUsername = @"john.doe";
   NSString* const kSecretPassword = @"super!secret";
-  __block bool blockCalled = false;
-  void (^validationBlock)(NSInvocation*) = ^(NSInvocation* invocation) {
-    __unsafe_unretained NSString* username;
-    __unsafe_unretained NSString* password;
-    // Skips 0 and 1 index because they are |self| and |cmd|.
-    [invocation getArgument:&username atIndex:2];
-    [invocation getArgument:&password atIndex:3];
-    EXPECT_NSEQ(kSecretUsername, username);
-    EXPECT_NSEQ(kSecretPassword, password);
-    blockCalled = true;
-  };
-  [[[provider.passwordControllerMock stub] andDo:validationBlock]
-      findAndFillPasswordForms:OCMOCK_ANY
-                      password:OCMOCK_ANY
-             completionHandler:OCMOCK_ANY];
 
   // Sets up the returned item from a Password Management App Extension.
   NSString* activityType = @"com.software.find-login-action.extension";
@@ -462,11 +475,15 @@
                                                     status:result
                                                      items:@[ extensionItem ]];
   ASSERT_FALSE(resetUI);
-  // Wait for the PasswordController mock to be called.
-  base::test::ios::WaitUntilCondition(^{
-    return blockCalled;
+
+  // Wait for the -findAndFillPasswordForms:password:completionHandler: method
+  // to be called on the FakePasswordFormFiller.
+  base::test::ios::WaitUntilCondition(^bool() {
+    return provider.fakePasswordFormFiller.methodCalled;
   });
-  EXPECT_OCMOCK_VERIFY(provider.passwordControllerMock);
+
+  EXPECT_NSEQ(kSecretUsername, provider.fakePasswordFormFiller.username);
+  EXPECT_NSEQ(kSecretPassword, provider.fakePasswordFormFiller.password);
 }
 
 // Verifies that -processItemsReturnedFromActivity:status:item: fails when
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_legacy_coordinator.mm b/ios/chrome/browser/ui/activity_services/activity_service_legacy_coordinator.mm
index 16547597c..afe6ed7 100644
--- a/ios/chrome/browser/ui/activity_services/activity_service_legacy_coordinator.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_service_legacy_coordinator.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/ui/activity_services/activity_service_legacy_coordinator.h"
 
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/passwords/password_tab_helper.h"
 #import "ios/chrome/browser/tabs/tab.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
 #import "ios/chrome/browser/ui/activity_services/activity_service_controller.h"
@@ -85,8 +86,11 @@
 
 #pragma mark - Providers
 
-- (PasswordController*)currentPasswordController {
-  return [self.tabModel.currentTab passwordController];
+- (id<PasswordFormFiller>)currentPasswordFormFiller {
+  web::WebState* webState = self.tabModel.currentTab.webState;
+  return webState ? PasswordTabHelper::FromWebState(webState)
+                        ->GetPasswordFormFiller()
+                  : nil;
 }
 
 @end
diff --git a/ios/chrome/browser/ui/activity_services/requirements/activity_service_password.h b/ios/chrome/browser/ui/activity_services/requirements/activity_service_password.h
index 45e90ffc..323f2ff 100644
--- a/ios/chrome/browser/ui/activity_services/requirements/activity_service_password.h
+++ b/ios/chrome/browser/ui/activity_services/requirements/activity_service_password.h
@@ -5,13 +5,13 @@
 #ifndef IOS_CHROME_BROWSER_UI_ACTIVITY_SERVICES_REQUIREMENTS_ACTIVITY_SERVICE_PASSWORD_H_
 #define IOS_CHROME_BROWSER_UI_ACTIVITY_SERVICES_REQUIREMENTS_ACTIVITY_SERVICE_PASSWORD_H_
 
-@class PasswordController;
+@protocol PasswordFormFiller;
 
 // ActivityServicePassword contains methods related to password autofill.
 @protocol ActivityServicePassword
 
-// Returns the PasswordController for the current active WebState.
-- (PasswordController*)currentPasswordController;
+// Returns the PasswordFormFiller for the current active WebState.
+- (id<PasswordFormFiller>)currentPasswordFormFiller;
 
 @end
 
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn
index 37034c1..99017aaa 100644
--- a/ios/chrome/browser/ui/authentication/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -156,6 +156,7 @@
     "signin_interaction_controller_egtest.mm",
   ]
   deps = [
+    ":eg_test_support",
     "//base",
     "//base/test:test_support",
     "//components/signin/core/browser",
@@ -184,12 +185,18 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
-    "signin_promo_view_earlgrey_utils.h",
-    "signin_promo_view_earlgrey_utils.mm",
+    "signin_earlgrey_utils.h",
+    "signin_earlgrey_utils.mm",
   ]
   deps = [
     ":authentication_ui",
+    "//components/signin/core/browser:browser",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/signin",
+    "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
+    "//ios/public/provider/chrome/browser/signin",
+    "//ios/public/provider/chrome/browser/signin:test_support",
     "//ios/third_party/earl_grey",
   ]
 }
diff --git a/ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h b/ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h
new file mode 100644
index 0000000..2a4ec84
--- /dev/null
+++ b/ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h
@@ -0,0 +1,38 @@
+// 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 IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_EARLGREY_UTILS_H_
+#define IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_EARLGREY_UTILS_H_
+
+#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
+
+@class ChromeIdentity;
+
+// Methods used for the EarlGrey tests.
+@interface SigninEarlGreyUtils : NSObject
+
+// Checks that the sign-in promo view is visible using the right mode.
++ (void)checkSigninPromoVisibleWithMode:(SigninPromoViewMode)mode;
+
+// Checks that the sign-in promo view is not visible.
++ (void)checkSigninPromoNotVisible;
+
+// Returns a fake identity.
++ (ChromeIdentity*)fakeIdentity1;
+
+// Returns a second fake identity.
++ (ChromeIdentity*)fakeIdentity2;
+
+// Returns a fake managed identity.
++ (ChromeIdentity*)fakeManagedIdentity;
+
+// Asserts that |identity| is actually signed in to the active profile.
++ (void)assertSignedInWithIdentity:(ChromeIdentity*)identity;
+
+// Asserts that no identity is signed in.
++ (void)assertSignedOut;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_EARLGREY_UTILS_H_
diff --git a/ios/chrome/browser/ui/authentication/signin_earlgrey_utils.mm b/ios/chrome/browser/ui/authentication/signin_earlgrey_utils.mm
new file mode 100644
index 0000000..7238290
--- /dev/null
+++ b/ios/chrome/browser/ui/authentication/signin_earlgrey_utils.mm
@@ -0,0 +1,119 @@
+// 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.
+
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
+
+#import <EarlGrey/EarlGrey.h>
+
+#include "base/strings/sys_string_conversions.h"
+#include "components/signin/core/browser/signin_manager.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/signin/signin_manager_factory.h"
+#import "ios/chrome/test/app/chrome_test_util.h"
+#import "ios/chrome/test/earl_grey/chrome_matchers.h"
+#import "ios/public/provider/chrome/browser/signin/chrome_identity.h"
+#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using chrome_test_util::PrimarySignInButton;
+using chrome_test_util::SecondarySignInButton;
+
+@implementation SigninEarlGreyUtils
+
++ (void)checkSigninPromoVisibleWithMode:(SigninPromoViewMode)mode {
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   grey_accessibilityID(kSigninPromoViewId),
+                                   grey_sufficientlyVisible(), nil)]
+      assertWithMatcher:grey_notNil()];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(PrimarySignInButton(),
+                                          grey_sufficientlyVisible(), nil)]
+      assertWithMatcher:grey_notNil()];
+  switch (mode) {
+    case SigninPromoViewModeColdState:
+      [[EarlGrey
+          selectElementWithMatcher:grey_allOf(SecondarySignInButton(),
+                                              grey_sufficientlyVisible(), nil)]
+          assertWithMatcher:grey_nil()];
+      break;
+    case SigninPromoViewModeWarmState:
+      [[EarlGrey
+          selectElementWithMatcher:grey_allOf(SecondarySignInButton(),
+                                              grey_sufficientlyVisible(), nil)]
+          assertWithMatcher:grey_notNil()];
+      break;
+  }
+}
+
++ (void)checkSigninPromoNotVisible {
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   grey_accessibilityID(kSigninPromoViewId),
+                                   grey_sufficientlyVisible(), nil)]
+      assertWithMatcher:grey_nil()];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(PrimarySignInButton(),
+                                          grey_sufficientlyVisible(), nil)]
+      assertWithMatcher:grey_nil()];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(SecondarySignInButton(),
+                                          grey_sufficientlyVisible(), nil)]
+      assertWithMatcher:grey_nil()];
+}
+
++ (ChromeIdentity*)fakeIdentity1 {
+  return [FakeChromeIdentity identityWithEmail:@"foo1@gmail.com"
+                                        gaiaID:@"foo1ID"
+                                          name:@"Fake Foo 1"];
+}
+
++ (ChromeIdentity*)fakeIdentity2 {
+  return [FakeChromeIdentity identityWithEmail:@"foo2@gmail.com"
+                                        gaiaID:@"foo2ID"
+                                          name:@"Fake Foo 2"];
+}
+
++ (ChromeIdentity*)fakeManagedIdentity {
+  return [FakeChromeIdentity identityWithEmail:@"foo@managed.com"
+                                        gaiaID:@"fooManagedID"
+                                          name:@"Fake Managed"];
+}
+
++ (void)assertSignedInWithIdentity:(ChromeIdentity*)identity {
+  GREYAssertNotNil(identity, @"Need to give an identity");
+  // Required to avoid any problem since the following test is not dependant to
+  // UI, and the previous action has to be totally finished before going through
+  // the assert.
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
+  ios::ChromeBrowserState* browser_state =
+      chrome_test_util::GetOriginalBrowserState();
+  AccountInfo info =
+      ios::SigninManagerFactory::GetForBrowserState(browser_state)
+          ->GetAuthenticatedAccountInfo();
+
+  GREYAssertEqual(base::SysNSStringToUTF8(identity.gaiaID), info.gaia,
+                  @"Unexpected Gaia ID of the signed in user [expected = "
+                  @"\"%@\", actual = \"%s\"]",
+                  identity.gaiaID, info.gaia.c_str());
+}
+
++ (void)assertSignedOut {
+  // Required to avoid any problem since the following test is not dependant to
+  // UI, and the previous action has to be totally finished before going through
+  // the assert.
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
+  ios::ChromeBrowserState* browser_state =
+      chrome_test_util::GetOriginalBrowserState();
+  GREYAssertFalse(ios::SigninManagerFactory::GetForBrowserState(browser_state)
+                      ->IsAuthenticated(),
+                  @"Unexpected signed in user");
+}
+
+@end
diff --git a/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm b/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm
index bd991ab..7e128cd6 100644
--- a/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm
+++ b/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm
@@ -12,6 +12,7 @@
 #include "ios/chrome/browser/bookmarks/bookmark_new_generation_features.h"
 #include "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/signin/signin_manager_factory.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/open_url_command.h"
@@ -37,26 +38,6 @@
 
 namespace {
 
-// Returns a fake identity.
-ChromeIdentity* GetFakeIdentity1() {
-  return [FakeChromeIdentity identityWithEmail:@"foo@gmail.com"
-                                        gaiaID:@"fooID"
-                                          name:@"Fake Foo"];
-}
-
-// Returns a second fake identity.
-ChromeIdentity* GetFakeIdentity2() {
-  return [FakeChromeIdentity identityWithEmail:@"bar@gmail.com"
-                                        gaiaID:@"barID"
-                                          name:@"Fake Bar"];
-}
-
-ChromeIdentity* GetFakeManagedIdentity() {
-  return [FakeChromeIdentity identityWithEmail:@"managed@foo.com"
-                                        gaiaID:@"managedID"
-                                          name:@"Fake Managed"];
-}
-
 // Changes the EarlGrey synchronization status to |enabled|.
 void SetEarlGreySynchronizationEnabled(BOOL enabled) {
   [[GREYConfiguration sharedInstance]
@@ -91,21 +72,6 @@
              @"Waiting for matcher %@ failed.", matcher);
 }
 
-// Asserts that |identity| is actually signed in to the active profile.
-void AssertAuthenticatedIdentityInActiveProfile(ChromeIdentity* identity) {
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-
-  ios::ChromeBrowserState* browser_state =
-      chrome_test_util::GetOriginalBrowserState();
-  AccountInfo info =
-      ios::SigninManagerFactory::GetForBrowserState(browser_state)
-          ->GetAuthenticatedAccountInfo();
-
-  GREYAssertEqual(base::SysNSStringToUTF8(identity.gaiaID), info.gaia,
-                  @"Gaia ID of signed in user isn't %@ but %s", identity.gaiaID,
-                  info.gaia.c_str());
-}
-
 }  // namespace
 
 @interface SigninInteractionControllerTestCase : ChromeTestCase
@@ -117,7 +83,7 @@
 // correctly when there is already an identity on the device.
 - (void)testSignInOneUser {
   // Set up a fake identity.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -129,7 +95,7 @@
       performAction:grey_tap()];
 
   // Check |identity| is signed-in.
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 }
 
 // Tests signing in with one account, switching sync account to a second and
@@ -138,8 +104,8 @@
   // Set up the fake identities.
   ios::FakeChromeIdentityService* identity_service =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
-  ChromeIdentity* identity1 = GetFakeIdentity1();
-  ChromeIdentity* identity2 = GetFakeIdentity2();
+  ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1];
+  ChromeIdentity* identity2 = [SigninEarlGreyUtils fakeIdentity2];
   identity_service->AddIdentity(identity1);
   identity_service->AddIdentity(identity2);
 
@@ -147,7 +113,7 @@
   [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()];
   [ChromeEarlGreyUI signInToIdentityByEmail:identity1.userEmail];
   [ChromeEarlGreyUI confirmSigninConfirmationDialog];
-  AssertAuthenticatedIdentityInActiveProfile(identity1);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity1];
 
   // Open accounts settings, then sync settings.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
@@ -163,7 +129,7 @@
   TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON);
 
   // Check the signed-in user did change.
-  AssertAuthenticatedIdentityInActiveProfile(identity2);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity2];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -175,8 +141,8 @@
   // Set up the fake identities.
   ios::FakeChromeIdentityService* identity_service =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
-  ChromeIdentity* identity1 = GetFakeIdentity1();
-  ChromeIdentity* identity2 = GetFakeIdentity2();
+  ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1];
+  ChromeIdentity* identity2 = [SigninEarlGreyUtils fakeIdentity2];
   identity_service->AddIdentity(identity1);
   identity_service->AddIdentity(identity2);
 
@@ -185,7 +151,7 @@
   [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()];
   [ChromeEarlGreyUI signInToIdentityByEmail:identity1.userEmail];
   [ChromeEarlGreyUI confirmSigninConfirmationDialog];
-  AssertAuthenticatedIdentityInActiveProfile(identity1);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity1];
 
   // Open accounts settings, then sync settings.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
@@ -201,7 +167,7 @@
   TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON);
 
   // Check the signed-in user did change.
-  AssertAuthenticatedIdentityInActiveProfile(identity2);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity2];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -213,8 +179,8 @@
   // Set up the fake identities.
   ios::FakeChromeIdentityService* identity_service =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
-  ChromeIdentity* managed_identity = GetFakeManagedIdentity();
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* managed_identity = [SigninEarlGreyUtils fakeManagedIdentity];
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   identity_service->AddIdentity(managed_identity);
   identity_service->AddIdentity(identity);
 
@@ -231,7 +197,7 @@
   SetEarlGreySynchronizationEnabled(YES);
 
   [ChromeEarlGreyUI confirmSigninConfirmationDialog];
-  AssertAuthenticatedIdentityInActiveProfile(managed_identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:managed_identity];
 
   // Switch Sync account to |identity|.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
@@ -247,7 +213,7 @@
   TapButtonWithLabelId(IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON);
   SetEarlGreySynchronizationEnabled(YES);
 
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -255,7 +221,7 @@
 
 // Tests that signing out from the Settings works correctly.
 - (void)testSignInDisconnectFromChrome {
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -264,7 +230,7 @@
   [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()];
   [ChromeEarlGreyUI signInToIdentityByEmail:identity.userEmail];
   [ChromeEarlGreyUI confirmSigninConfirmationDialog];
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 
   // Go to Accounts Settings and tap the sign out button.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
@@ -284,13 +250,13 @@
       performAction:grey_tap()];
 
   // Check that there is no signed in user.
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
 }
 
 // Tests that signing out of a managed account from the Settings works
 // correctly.
 - (void)testSignInDisconnectFromChromeManaged {
-  ChromeIdentity* identity = GetFakeManagedIdentity();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeManagedIdentity];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -306,7 +272,7 @@
   SetEarlGreySynchronizationEnabled(YES);
 
   [ChromeEarlGreyUI confirmSigninConfirmationDialog];
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 
   // Go to Accounts Settings and tap the sign out button.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
@@ -326,14 +292,14 @@
       performAction:grey_tap()];
 
   // Check that there is no signed in user.
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
 }
 
 // Tests that signing in, tapping the Settings link on the confirmation screen
 // and closing the Settings correctly leaves the user signed in without any
 // Settings shown.
 - (void)testSignInOpenSettings {
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -356,7 +322,7 @@
           IDS_IOS_SETTINGS_TITLE);
   [[EarlGrey selectElementWithMatcher:settings_matcher]
       assertWithMatcher:grey_notVisible()];
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 }
 
 // Opens the sign in screen and then cancel it by opening a new tab. Ensures
@@ -364,7 +330,7 @@
 - (void)testSignInCancelIdentityPicker {
   // Add an identity to avoid arriving on the Add Account screen when opening
   // sign-in.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -397,7 +363,7 @@
 - (void)testSignInCancelAddAccount {
   // Add an identity to avoid arriving on the Add Account screen when opening
   // sign-in.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -440,8 +406,8 @@
   // Set up the fake identities.
   ios::FakeChromeIdentityService* identity_service =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
-  ChromeIdentity* identity1 = GetFakeIdentity1();
-  ChromeIdentity* identity2 = GetFakeIdentity2();
+  ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1];
+  ChromeIdentity* identity2 = [SigninEarlGreyUtils fakeIdentity2];
   identity_service->AddIdentity(identity1);
   identity_service->AddIdentity(identity2);
 
@@ -453,7 +419,7 @@
   [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()];
   [ChromeEarlGreyUI signInToIdentityByEmail:identity2.userEmail];
   [ChromeEarlGreyUI confirmSigninConfirmationDialog];
-  AssertAuthenticatedIdentityInActiveProfile(identity2);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity2];
 
   // Go to Accounts Settings and tap the sign out button.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
@@ -469,7 +435,7 @@
       onElementWithMatcher:chrome_test_util::SettingsAccountsCollectionView()]
       performAction:grey_tap()];
   TapButtonWithLabelId(IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE);
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
   [[EarlGrey selectElementWithMatcher:SecondarySignInButton()]
       performAction:grey_tap()];
   [ChromeEarlGreyUI signInToIdentityByEmail:identity1.userEmail];
@@ -493,7 +459,7 @@
   TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON);
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
 }
 
 // Opens the sign in screen from the bookmarks and then cancel it by opening a
@@ -505,7 +471,7 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndDisableFeature(kBookmarkNewGeneration);
 
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.h b/ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.h
deleted file mode 100644
index da7f9a7..0000000
--- a/ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGN_PROMO_VIEW_EARLGREY_UTILS_H_
-#define IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGN_PROMO_VIEW_EARLGREY_UTILS_H_
-
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
-
-@interface SignPromoViewEarlgreyUtils : NSObject
-
-// Checks that the sign-in promo view is visible using the right mode.
-+ (void)checkSigninPromoVisibleWithMode:(SigninPromoViewMode)mode;
-
-// Checks that the sign-in promo view is not visible.
-+ (void)checkSigninPromoNotVisible;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGN_PROMO_VIEW_EARLGREY_UTILS_H_
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.mm
deleted file mode 100644
index a19fb1ca..0000000
--- a/ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.mm
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.h"
-
-#import <EarlGrey/EarlGrey.h>
-
-#import "ios/chrome/test/earl_grey/chrome_matchers.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-using chrome_test_util::PrimarySignInButton;
-using chrome_test_util::SecondarySignInButton;
-
-@implementation SignPromoViewEarlgreyUtils
-
-+ (void)checkSigninPromoVisibleWithMode:(SigninPromoViewMode)mode {
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(
-                                   grey_accessibilityID(kSigninPromoViewId),
-                                   grey_sufficientlyVisible(), nil)]
-      assertWithMatcher:grey_notNil()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(PrimarySignInButton(),
-                                          grey_sufficientlyVisible(), nil)]
-      assertWithMatcher:grey_notNil()];
-  switch (mode) {
-    case SigninPromoViewModeColdState:
-      [[EarlGrey
-          selectElementWithMatcher:grey_allOf(SecondarySignInButton(),
-                                              grey_sufficientlyVisible(), nil)]
-          assertWithMatcher:grey_nil()];
-      break;
-    case SigninPromoViewModeWarmState:
-      [[EarlGrey
-          selectElementWithMatcher:grey_allOf(SecondarySignInButton(),
-                                              grey_sufficientlyVisible(), nil)]
-          assertWithMatcher:grey_notNil()];
-      break;
-  }
-}
-
-+ (void)checkSigninPromoNotVisible {
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(
-                                   grey_accessibilityID(kSigninPromoViewId),
-                                   grey_sufficientlyVisible(), nil)]
-      assertWithMatcher:grey_nil()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(PrimarySignInButton(),
-                                          grey_sufficientlyVisible(), nil)]
-      assertWithMatcher:grey_nil()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(SecondarySignInButton(),
-                                          grey_sufficientlyVisible(), nil)]
-      assertWithMatcher:grey_nil()];
-}
-
-@end
diff --git a/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.h b/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.h
index 70e4aebf..ac91a4f 100644
--- a/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.h
+++ b/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.h
@@ -25,7 +25,7 @@
 
 typedef NS_ENUM(NSInteger, ContextBarButtonStyle) {
   ContextBarButtonStyleDefault,
-  ContextBarButtonStyleDelete
+  ContextBarButtonStyleDelete,
 };
 
 // View with 3 customizable buttons in a row.
@@ -38,6 +38,7 @@
 - (void)setButtonStyle:(ContextBarButtonStyle)style
              forButton:(ContextBarButton)button;
 - (void)setButtonVisibility:(BOOL)visible forButton:(ContextBarButton)button;
+- (void)setButtonEnabled:(BOOL)enabled forButton:(ContextBarButton)button;
 
 @end
 #endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BARS_BOOKMARK_CONTEXT_BAR_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.mm b/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.mm
index 13f64c7..3d86fc41 100644
--- a/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.mm
+++ b/ios/chrome/browser/ui/bookmarks/bars/bookmark_context_bar.mm
@@ -66,7 +66,11 @@
   UIColor* textColor = style == ContextBarButtonStyleDelete
                            ? [[MDCPalette redPalette] tint500]
                            : [[MDCPalette bluePalette] tint500];
+  UIColor* disabledColor = style == ContextBarButtonStyleDelete
+                               ? [[MDCPalette redPalette] tint200]
+                               : [[MDCPalette bluePalette] tint200];
   [button setTitleColor:textColor forState:UIControlStateNormal];
+  [button setTitleColor:disabledColor forState:UIControlStateDisabled];
 }
 
 - (void)initStyleForButton:(UIButton*)button {
@@ -85,7 +89,7 @@
 - (instancetype)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
   if (self) {
-    self.accessibilityIdentifier = @"Context Bar";
+    self.accessibilityIdentifier = @"context_bar";
     _leadingButton = [UIButton buttonWithType:UIButtonTypeCustom];
     [self initStyleForButton:_leadingButton];
     _leadingButton.contentHorizontalAlignment =
@@ -94,7 +98,7 @@
     [_leadingButton addTarget:self
                        action:@selector(leadingButtonClicked:)
              forControlEvents:UIControlEventTouchUpInside];
-    _leadingButton.accessibilityIdentifier = @"Context Bar Leading Button";
+    _leadingButton.accessibilityIdentifier = @"context_bar_leading_button";
 
     _centerButton = [UIButton buttonWithType:UIButtonTypeCustom];
     [self initStyleForButton:_centerButton];
@@ -103,7 +107,7 @@
     [_centerButton addTarget:self
                       action:@selector(centerButtonClicked:)
             forControlEvents:UIControlEventTouchUpInside];
-    _centerButton.accessibilityIdentifier = @"Context Bar Center Button";
+    _centerButton.accessibilityIdentifier = @"context_bar_center_button";
 
     _trailingButton = [UIButton buttonWithType:UIButtonTypeCustom];
     [self initStyleForButton:_trailingButton];
@@ -113,7 +117,7 @@
     [_trailingButton addTarget:self
                         action:@selector(trailingButtonClicked:)
               forControlEvents:UIControlEventTouchUpInside];
-    _trailingButton.accessibilityIdentifier = @"Context Bar Trailing Button";
+    _trailingButton.accessibilityIdentifier = @"context_bar_trailing_button";
 
     _stackView = [[UIStackView alloc] initWithArrangedSubviews:@[
       _leadingButton, _centerButton, _trailingButton
@@ -144,7 +148,6 @@
 
 - (void)setButtonTitle:(NSString*)title forButton:(ContextBarButton)button {
   [[self getButton:button] setTitle:title forState:UIControlStateNormal];
-  [[self getButton:button] setTitle:title forState:UIControlStateNormal];
 }
 
 - (void)setButtonStyle:(ContextBarButtonStyle)style
@@ -156,6 +159,9 @@
   [self getButton:button].hidden = !visible;
 }
 
+- (void)setButtonEnabled:(BOOL)enabled forButton:(ContextBarButton)button {
+  [[self getButton:button] setEnabled:enabled];
+}
 - (void)leadingButtonClicked:(UIButton*)button {
   if (!self.delegate) {
     NOTREACHED();
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
index 69baefa..19fab6bf 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -89,6 +89,7 @@
 @synthesize homeDelegate = _homeDelegate;
 @synthesize bookmarksTableView = _bookmarksTableView;
 @synthesize contextBar = _contextBar;
+@synthesize contextBarState = _contextBarState;
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -409,6 +410,28 @@
   [self.bookmarkPromoController hidePromoCell];
 }
 
+- (void)bookmarkTableView:(BookmarkTableView*)view
+        selectedEditNodes:
+            (const std::set<const bookmarks::BookmarkNode*>&)nodes {
+  if (nodes.size() == 0) {
+    [self setContextBarState:BookmarksContextBarBeginSelection];
+    return;
+  }
+  if (nodes.size() == 1) {
+    const bookmarks::BookmarkNode* node = *nodes.begin();
+    if (node->is_url()) {
+      [self setContextBarState:BookmarksContextBarSingleSelection];
+    } else if (node->is_folder()) {
+      [self setContextBarState:BookmarksContextBarSingleFolderSelection];
+    }
+    return;
+  }
+  if (nodes.size() > 1) {
+    [self setContextBarState:BookmarksContextBarMultipleSelection];
+    return;
+  }
+}
+
 #pragma mark - BookmarkFolderViewControllerDelegate
 
 - (void)folderPicker:(BookmarkFolderViewController*)folderPicker
@@ -863,18 +886,15 @@
   self.contextBar.delegate = self;
   [self.contextBar setTranslatesAutoresizingMaskIntoConstraints:NO];
 
-  // TODO(crbug.com/695749): Check if we need to create new strings for the
-  // context bar buttons.
   [self.contextBar setButtonVisibility:YES forButton:ContextBarLeadingButton];
-  [self.contextBar
-      setButtonTitle:l10n_util::GetNSStringWithFixup(
-                         IDS_IOS_BOOKMARK_NEW_GROUP_EDITOR_CREATE_TITLE)
-           forButton:ContextBarLeadingButton];
+  [self.contextBar setButtonTitle:l10n_util::GetNSString(
+                                      IDS_IOS_BOOKMARK_CONTEXT_BAR_NEW_FOLDER)
+                        forButton:ContextBarLeadingButton];
 
   [self.contextBar setButtonVisibility:YES forButton:ContextBarTrailingButton];
-  [self.contextBar setButtonTitle:l10n_util::GetNSStringWithFixup(
-                                      IDS_IOS_BOOKMARK_ACTION_SELECT)
-                        forButton:ContextBarTrailingButton];
+  [self.contextBar
+      setButtonTitle:l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_SELECT)
+           forButton:ContextBarTrailingButton];
 
   [_containerView addSubview:self.contextBar];
 }
@@ -931,7 +951,7 @@
 - (UIBarButtonItem*)customizedDoneButton {
   UIBarButtonItem* doneButton = [[UIBarButtonItem alloc]
       initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON)
-                        .uppercaseString
+                        .localizedUppercaseString
               style:UIBarButtonItemStylePlain
              target:self
              action:@selector(navigationBarCancel:)];
@@ -941,8 +961,8 @@
     NSFontAttributeName : [MDCTypography buttonFont]
   };
   [doneButton setTitleTextAttributes:attributes forState:UIControlStateNormal];
-  doneButton.accessibilityLabel = doneButton.title;
-  doneButton.accessibilityIdentifier = @"bookmark_done_button";
+  doneButton.accessibilityLabel =
+      l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON);
   return doneButton;
 }
 
@@ -1027,15 +1047,121 @@
 
 // Called when the leading button is clicked.
 - (void)leadingButtonClicked {
-  // TODO(crbug.com/695749): Implement the button action here.
+  const std::set<const bookmarks::BookmarkNode*> nodes =
+      [self.bookmarksTableView editNodes];
+  switch (self.contextBarState) {
+    case BookmarksContextBarDefault:
+      // New Folder clicked.
+      // TODO(crbug.com/695749): Implement the button action here.
+      break;
+    case BookmarksContextBarBeginSelection:
+      // This must never happen, as the leading button is disabled at this
+      // point.
+      NOTREACHED();
+      break;
+    case BookmarksContextBarSingleSelection:
+    case BookmarksContextBarMultipleSelection:
+    case BookmarksContextBarSingleFolderSelection:
+      // Delete clicked.
+      [self deleteNodes:nodes];
+      break;
+    case BookmarksContextBarNone:
+    default:
+      NOTREACHED();
+  }
 }
 // Called when the center button is clicked.
 - (void)centerButtonClicked {
   // TODO(crbug.com/695749): Implement the button action here.
 }
-// Called when the trailing button is clicked.
+// Called when the trailing button, "Select" or "Cancel" is clicked.
 - (void)trailingButtonClicked {
-  // TODO(crbug.com/695749): Implement the button action here.
+  // Toggle edit mode.
+  [self.bookmarksTableView setEditing:!self.bookmarksTableView.editing];
+  [self setContextBarState:BookmarksContextBarBeginSelection];
+}
+
+#pragma mark - ContextBarStates
+
+// Customizes the context bar buttons based the |state| passed in.
+- (void)setContextBarState:(BookmarksContextBarState)state {
+  _contextBarState = state;
+  switch (state) {
+    case BookmarksContextBarDefault:
+      [self setBookmarksContextBarButtonsDefaultState];
+      break;
+    case BookmarksContextBarBeginSelection:
+      if (self.bookmarksTableView.editing) {
+        [self setBookmarksContextBarSelectionStartState];
+      } else {
+        [self setBookmarksContextBarButtonsDefaultState];
+      }
+      break;
+    case BookmarksContextBarSingleSelection:
+    case BookmarksContextBarMultipleSelection:
+      // Reset to start state, and then override with customizations that apply.
+      [self setBookmarksContextBarSelectionStartState];
+      [self.contextBar setButtonEnabled:YES forButton:ContextBarCenterButton];
+      [self.contextBar setButtonEnabled:YES forButton:ContextBarLeadingButton];
+      break;
+    case BookmarksContextBarSingleFolderSelection:
+      // Reset to start state, and then override with customizations that apply.
+      [self setBookmarksContextBarSelectionStartState];
+      [self.contextBar setButtonTitle:l10n_util::GetNSString(
+                                          IDS_IOS_BOOKMARK_CONTEXT_BAR_EDIT)
+                            forButton:ContextBarCenterButton];
+      [self.contextBar setButtonEnabled:YES forButton:ContextBarCenterButton];
+      [self.contextBar setButtonEnabled:YES forButton:ContextBarLeadingButton];
+      break;
+    case BookmarksContextBarNone:
+    default:
+      break;
+  }
+}
+
+- (void)setBookmarksContextBarButtonsDefaultState {
+  // Set New Folder button
+  [self.contextBar setButtonTitle:l10n_util::GetNSString(
+                                      IDS_IOS_BOOKMARK_CONTEXT_BAR_NEW_FOLDER)
+                        forButton:ContextBarLeadingButton];
+  [self.contextBar setButtonVisibility:YES forButton:ContextBarLeadingButton];
+  [self.contextBar setButtonEnabled:YES forButton:ContextBarLeadingButton];
+  [self.contextBar setButtonStyle:ContextBarButtonStyleDefault
+                        forButton:ContextBarLeadingButton];
+
+  // Set Center button to invisible.
+  [self.contextBar setButtonVisibility:NO forButton:ContextBarCenterButton];
+
+  // Set Select button.
+  [self.contextBar
+      setButtonTitle:l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_SELECT)
+           forButton:ContextBarTrailingButton];
+  [self.contextBar setButtonVisibility:YES forButton:ContextBarTrailingButton];
+  [self.contextBar setButtonEnabled:YES forButton:ContextBarTrailingButton];
+}
+
+- (void)setBookmarksContextBarSelectionStartState {
+  // Disabled Delete button.
+  [self.contextBar
+      setButtonTitle:l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_DELETE)
+           forButton:ContextBarLeadingButton];
+  [self.contextBar setButtonVisibility:YES forButton:ContextBarLeadingButton];
+  [self.contextBar setButtonEnabled:NO forButton:ContextBarLeadingButton];
+  [self.contextBar setButtonStyle:ContextBarButtonStyleDelete
+                        forButton:ContextBarLeadingButton];
+
+  // Disabled More button.
+  [self.contextBar
+      setButtonTitle:l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_MORE)
+           forButton:ContextBarCenterButton];
+  [self.contextBar setButtonVisibility:YES forButton:ContextBarCenterButton];
+  [self.contextBar setButtonEnabled:NO forButton:ContextBarCenterButton];
+
+  // Enabled Cancel button.
+  [self.contextBar setButtonTitle:l10n_util::GetNSString(IDS_CANCEL)
+                        forButton:ContextBarTrailingButton];
+  [self.contextBar setButtonVisibility:YES forButton:ContextBarTrailingButton];
+  [self.contextBar setButtonEnabled:YES forButton:ContextBarTrailingButton];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_protected.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_protected.h
index bb39511..cc0ae89 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_protected.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_protected.h
@@ -27,6 +27,17 @@
 @class BookmarkPromoController;
 @class BookmarkTableView;
 
+typedef NS_ENUM(NSInteger, BookmarksContextBarState) {
+  BookmarksContextBarNone,            // No state.
+  BookmarksContextBarDefault,         // No selection is possible in this state.
+  BookmarksContextBarBeginSelection,  // This is the clean start state,
+                                      // selection is possible, but nothing is
+                                      // selected yet.
+  BookmarksContextBarSingleSelection,        // Single URL selected state.
+  BookmarksContextBarMultipleSelection,      // Multiple URL /Folders selected.
+  BookmarksContextBarSingleFolderSelection,  // Single folder selected.
+};
+
 // BookmarkHomeViewController class extension for protected read/write
 // properties and methods for subclasses.
 @interface BookmarkHomeViewController ()
@@ -102,6 +113,9 @@
 // The action sheet coordinator used when trying to edit a single bookmark.
 @property(nonatomic, strong) ActionSheetCoordinator* actionSheetCoordinator;
 
+// The current state of the context bar UI.
+@property(nonatomic, assign) BookmarksContextBarState contextBarState;
+
 // This method should be called at most once in the life-cycle of the class.
 // It should be called at the soonest possible time after the view has been
 // loaded, and the bookmark model is loaded.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.h b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.h
index 84c5c4c..0dde1df 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.h
@@ -48,6 +48,10 @@
 // Dismisses the promo.
 - (void)bookmarkTableViewDismissPromo:(BookmarkTableView*)view;
 
+// Tells the delegate that nodes were selected in edit mode.
+- (void)bookmarkTableView:(BookmarkTableView*)view
+        selectedEditNodes:
+            (const std::set<const bookmarks::BookmarkNode*>&)nodes;
 @end
 
 @interface BookmarkTableView : UIView
@@ -74,6 +78,14 @@
 // Called when something outside the view causes the promo state to change.
 - (void)promoStateChangedAnimated:(BOOL)animated;
 
+// Sets if the table view is in edit mode.
+- (void)setEditing:(BOOL)editing;
+
+// Returns if the table is in edit mode.
+- (BOOL)editing;
+
+// Returns the currently selected edit nodes.
+- (const std::set<const bookmarks::BookmarkNode*>&)editNodes;
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_TABLE_VIEW_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm
index 6d5f8563..8ba2ed9 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm
@@ -80,6 +80,9 @@
 
   // True if the promo is visible.
   BOOL _promoVisible;
+
+  // Set of nodes being editing currently.
+  std::set<const bookmarks::BookmarkNode*> _editNodes;
 }
 
 // The UITableView to show bookmarks.
@@ -150,17 +153,16 @@
         [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
     self.tableView.dataSource = self;
     self.tableView.delegate = self;
-
     // Use iOS8's self sizing feature to compute row height. However,
     // this reduces the row height of bookmarks section from 56 to 45
     // TODO(crbug.com/695749): Fix the bookmark section row height to 56.
     self.tableView.estimatedRowHeight = kCellHeightPt;
     self.tableView.rowHeight = UITableViewAutomaticDimension;
-
     // Remove extra rows.
     self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
     self.tableView.autoresizingMask =
         UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+    self.tableView.allowsMultipleSelectionDuringEditing = YES;
     [self addSubview:self.tableView];
     [self bringSubviewToFront:self.tableView];
 
@@ -211,6 +213,19 @@
   [self.tableView reloadData];
 }
 
+- (void)setEditing:(BOOL)editing {
+  [self resetEditNodes];
+  [self.tableView setEditing:editing animated:YES];
+}
+
+- (BOOL)editing {
+  return self.tableView.editing;
+}
+
+- (const std::set<const bookmarks::BookmarkNode*>&)editNodes {
+  return _editNodes;
+}
+
 #pragma mark - UITableViewDataSource
 
 - (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
@@ -314,6 +329,12 @@
   if (indexPath.section == self.bookmarksSection) {
     const BookmarkNode* node = [self nodeAtIndexPath:indexPath];
     DCHECK(node);
+    // If table is in edit mode, record all the nodes added to edit set.
+    if (self.tableView.editing) {
+      _editNodes.insert(node);
+      [self.delegate bookmarkTableView:self selectedEditNodes:_editNodes];
+      return;
+    }
     if (node->is_folder()) {
       [self.delegate bookmarkTableView:self selectedFolderForNavigation:node];
     } else {
@@ -326,6 +347,16 @@
   [tableView deselectRowAtIndexPath:indexPath animated:YES];
 }
 
+- (void)tableView:(UITableView*)tableView
+    didDeselectRowAtIndexPath:(NSIndexPath*)indexPath {
+  if (indexPath.section == self.bookmarksSection && self.tableView.editing) {
+    const BookmarkNode* node = [self nodeAtIndexPath:indexPath];
+    DCHECK(node);
+    _editNodes.erase(node);
+    [self.delegate bookmarkTableView:self selectedEditNodes:_editNodes];
+  }
+}
+
 #pragma mark - BookmarkTablePromoCellDelegate
 
 - (void)bookmarkTablePromoCellDidTapSignIn:
@@ -459,6 +490,10 @@
 
 #pragma mark - Private
 
+- (void)resetEditNodes {
+  _editNodes.clear();
+}
+
 // Removes the sign-in promo view.
 - (void)signinPromoCloseButtonAction {
   [_signinPromoViewMediator signinPromoViewClosed];
@@ -473,6 +508,7 @@
   [self computeBookmarkTableViewData];
   [self showEmptyOrLoadingSpinnerBackgroundIfNeeded];
   [self cancelAllFaviconLoads];
+  [self resetEditNodes];
   [self.tableView reloadData];
 }
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
index 0922794d..85c909f 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -19,8 +19,8 @@
 #include "ios/chrome/browser/bookmarks/bookmarks_utils.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/pref_names.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
 #include "ios/chrome/browser/ui/commands/ios_command_ids.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h"
@@ -1054,7 +1054,7 @@
   }];
   // Check that sign-in promo view is visible.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 
   // Tap the dismiss button.
@@ -1063,7 +1063,7 @@
       performAction:grey_tap()];
 
   // Wait until promo is gone.
-  [SignPromoViewEarlgreyUtils checkSigninPromoNotVisible];
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
 
   // Check that the promo already seen state is updated.
   [BookmarksTestCase verifyPromoAlreadySeen:YES];
@@ -1077,7 +1077,7 @@
 
   // Check that sign-in promo view are visible.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 
   // Tap the primary button.
@@ -1090,7 +1090,7 @@
 
   // Check that the bookmarks UI reappeared and the cell is still here.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 }
 
@@ -1102,16 +1102,13 @@
   [BookmarksTestCase openTopLevelBookmarksFolder];
 
   // Set up a fake identity.
-  ChromeIdentity* identity =
-      [FakeChromeIdentity identityWithEmail:@"fakefoo@gmail.com"
-                                     gaiaID:@"fakefoopassword"
-                                       name:@"Fake Foo"];
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
   // Check that sign-in promo view are visible.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
 
   // Tap the secondary button.
@@ -1126,7 +1123,7 @@
 
   // Check that the bookmarks UI reappeared and the cell is still here.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
 }
 
@@ -1137,16 +1134,13 @@
   [BookmarksTestCase setupStandardBookmarks];
   [BookmarksTestCase openTopLevelBookmarksFolder];
   // Set up a fake identity.
-  ChromeIdentity* identity =
-      [FakeChromeIdentity identityWithEmail:@"fakefoo@egmail.com"
-                                     gaiaID:@"fakefoopassword"
-                                       name:@"Fake Foo"];
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
   // Check that sign-in promo view are visible.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
 
   // Tap the secondary button.
@@ -1163,7 +1157,7 @@
 
   // Check that the bookmarks UI reappeared and the cell is still here.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
 }
 
@@ -1175,7 +1169,7 @@
   prefs->SetInteger(prefs::kIosBookmarkSigninPromoDisplayedCount, 19);
   [BookmarksTestCase openBookmarks];
   // Check the sign-in promo view is visible.
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
   // Check the sign-in promo will not be shown anymore.
   [BookmarksTestCase verifyPromoAlreadySeen:YES];
@@ -1193,7 +1187,7 @@
   }
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
   // Check that the sign-in promo is not visible anymore.
-  [SignPromoViewEarlgreyUtils checkSigninPromoNotVisible];
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
 }
 
 // Tests that all elements on the bookmarks landing page are accessible.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_new_generation_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_new_generation_egtest.mm
index 7796161..7919473 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_new_generation_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_new_generation_egtest.mm
@@ -16,8 +16,8 @@
 #include "ios/chrome/browser/bookmarks/bookmark_new_generation_features.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/pref_names.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view_earlgrey_utils.h"
 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -44,21 +44,50 @@
 using chrome_test_util::PrimarySignInButton;
 using chrome_test_util::SecondarySignInButton;
 
+namespace {
 // Matcher for the Delete button on the bookmarks UI.
 id<GREYMatcher> BookmarksDeleteSwipeButton() {
-  return ButtonWithAccessibilityLabel(@"Delete");
+  return ButtonWithAccessibilityLabelId(IDS_IOS_BOOKMARK_ACTION_DELETE);
 }
 
 // Matcher for the Back button on the bookmarks UI.
 id<GREYMatcher> BookmarksBackButton() {
-  return grey_accessibilityLabel(@"Back");
+  return grey_accessibilityLabel(
+      l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_BACK_LABEL));
 }
 
 // Matcher for the DONE button on the bookmarks UI.
 id<GREYMatcher> BookmarksDoneButton() {
-  return grey_accessibilityID(@"bookmark_done_button");
+  return grey_allOf(
+      ButtonWithAccessibilityLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON),
+      grey_not(grey_accessibilityTrait(UIAccessibilityTraitKeyboardKey)), nil);
 }
 
+// Matcher for context bar leading button.
+id<GREYMatcher> ContextBarLeadingButtonWithLabel(NSString* label) {
+  return grey_allOf(grey_accessibilityID(@"context_bar_leading_button"),
+                    grey_accessibilityLabel(label),
+                    grey_accessibilityTrait(UIAccessibilityTraitButton),
+                    grey_sufficientlyVisible(), nil);
+}
+
+// Matcher for context bar center button.
+id<GREYMatcher> ContextBarCenterButtonWithLabel(NSString* label) {
+  return grey_allOf(grey_accessibilityID(@"context_bar_center_button"),
+                    grey_accessibilityLabel(label),
+                    grey_accessibilityTrait(UIAccessibilityTraitButton),
+                    grey_sufficientlyVisible(), nil);
+}
+
+// Matcher for context bar trailing button.
+id<GREYMatcher> ContextBarTrailingButtonWithLabel(NSString* label) {
+  return grey_allOf(grey_accessibilityID(@"context_bar_trailing_button"),
+                    grey_accessibilityLabel(label),
+                    grey_accessibilityTrait(UIAccessibilityTraitButton),
+                    grey_sufficientlyVisible(), nil);
+}
+}  // namespace
+
 // Bookmark integration tests for Chrome.
 @interface BookmarksNewGenTestCase : ChromeTestCase
 @end
@@ -132,18 +161,388 @@
   [BookmarksNewGenTestCase openMobileBookmarks];
 
   // Verify the context bar is shown.
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Context Bar")]
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"context_bar")]
       assertWithMatcher:grey_notNil()];
 
   // Verify the context bar's leading and trailing buttons are shown.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                          @"Context Bar Leading Button")]
+                                          @"context_bar_leading_button")]
       assertWithMatcher:grey_notNil()];
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                          @"Context Bar Trailing Button")]
+                                          @"context_bar_trailing_button")]
       assertWithMatcher:grey_notNil()];
 }
 
+- (void)testBookmarkContextBarInVariousSelectionModes {
+  if (IsIPadIdiom()) {
+    EARL_GREY_TEST_DISABLED(@"Test disabled on iPad.");
+  }
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(kBookmarkNewGeneration);
+
+  [BookmarksNewGenTestCase setupStandardBookmarks];
+  [BookmarksNewGenTestCase openBookmarks];
+  [BookmarksNewGenTestCase openMobileBookmarks];
+
+  // Verify the context bar is shown.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"context_bar")]
+      assertWithMatcher:grey_notNil()];
+
+  // Change to edit mode
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
+                                          @"context_bar_trailing_button")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows disabled "Delete" disabled "More" enabled
+  // "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Select single URL.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Second URL")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows enabled "Delete" enabled "More" enabled "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Unselect all.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Second URL")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows disabled "Delete" disabled "More" enabled
+  // "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Select single Folder.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows enabled "Delete" enabled "Edit" enabled "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarEditString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Unselect all.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows disabled "Delete" disabled "More" enabled
+  // "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Multi select URL and folders.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Second URL")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows enabled "Delete" enabled "More" enabled "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Unselect Folder 1, so that Second URL is selected.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows enabled "Delete" enabled "More" enabled
+  // "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Unselect all, but one Folder - Folder 1 is selected.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+  // Unselect URL.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Second URL")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows enabled "Delete" enabled "Edit" enabled "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarEditString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Unselect all.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+
+  // Verify context bar shows disabled "Delete" disabled "More" enabled
+  // "Cancel".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_allOf(grey_notNil(),
+                                   grey_accessibilityTrait(
+                                       UIAccessibilityTraitNotEnabled),
+                                   nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+
+  // Cancel edit mode
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      performAction:grey_tap()];
+
+  // Verify context bar shows enabled "New Folder" and enabled "Select".
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarNewFolderString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+  [[EarlGrey selectElementWithMatcher:ContextBarCenterButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarMoreString])]
+      assertWithMatcher:grey_nil()];
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarSelectString])]
+      assertWithMatcher:grey_allOf(grey_notNil(), grey_enabled(), nil)];
+}
+
+- (void)testDeleteSingleURLNode {
+  if (IsIPadIdiom()) {
+    EARL_GREY_TEST_DISABLED(@"Test disabled on iPad.");
+  }
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(kBookmarkNewGeneration);
+
+  [BookmarksNewGenTestCase setupStandardBookmarks];
+  [BookmarksNewGenTestCase openBookmarks];
+  [BookmarksNewGenTestCase openMobileBookmarks];
+
+  // Change to edit mode
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
+                                          @"context_bar_trailing_button")]
+      performAction:grey_tap()];
+
+  // Select single URL.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Second URL")]
+      performAction:grey_tap()];
+
+  // Delete it.
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      performAction:grey_tap()];
+
+  // Wait until it's gone.
+  [BookmarksNewGenTestCase waitForDeletionOfBookmarkWithTitle:@"Second URL"];
+
+  // Press undo
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Undo")]
+      performAction:grey_tap()];
+
+  // Verify it's back.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Second URL")]
+      assertWithMatcher:grey_notNil()];
+
+  // Cancel edit mode.
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      performAction:grey_tap()];
+}
+
+- (void)testDeleteSingleFolderNode {
+  if (IsIPadIdiom()) {
+    EARL_GREY_TEST_DISABLED(@"Test disabled on iPad.");
+  }
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(kBookmarkNewGeneration);
+
+  [BookmarksNewGenTestCase setupStandardBookmarks];
+  [BookmarksNewGenTestCase openBookmarks];
+  [BookmarksNewGenTestCase openMobileBookmarks];
+
+  // Change to edit mode
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
+                                          @"context_bar_trailing_button")]
+      performAction:grey_tap()];
+
+  // Select single URL.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+
+  // Delete it.
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      performAction:grey_tap()];
+
+  // Wait until it's gone.
+  [BookmarksNewGenTestCase waitForDeletionOfBookmarkWithTitle:@"Folder 1"];
+
+  // Press undo
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Undo")]
+      performAction:grey_tap()];
+
+  // Verify it's back.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Folder 1")]
+      assertWithMatcher:grey_notNil()];
+
+  // Cancel edit mode.
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      performAction:grey_tap()];
+}
+
+- (void)testDeleteMultipleNodes {
+  if (IsIPadIdiom()) {
+    EARL_GREY_TEST_DISABLED(@"Test disabled on iPad.");
+  }
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(kBookmarkNewGeneration);
+
+  [BookmarksNewGenTestCase setupStandardBookmarks];
+  [BookmarksNewGenTestCase openBookmarks];
+  [BookmarksNewGenTestCase openMobileBookmarks];
+
+  // Change to edit mode
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
+                                          @"context_bar_trailing_button")]
+      performAction:grey_tap()];
+
+  // Select Folder and URL.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Second URL")]
+      performAction:grey_tap()];
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Folder 1")]
+      performAction:grey_tap()];
+
+  // Delete it.
+  [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarDeleteString])]
+      performAction:grey_tap()];
+
+  // Wait until it's gone.
+  [BookmarksNewGenTestCase waitForDeletionOfBookmarkWithTitle:@"Second URL"];
+  [BookmarksNewGenTestCase waitForDeletionOfBookmarkWithTitle:@"Folder 1"];
+
+  // Press undo
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Undo")]
+      performAction:grey_tap()];
+
+  // Verify it's back.
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Second URL")]
+      assertWithMatcher:grey_notNil()];
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Folder 1")]
+      assertWithMatcher:grey_notNil()];
+
+  // Cancel edit mode.
+  [[EarlGrey selectElementWithMatcher:ContextBarTrailingButtonWithLabel(
+                                          [BookmarksNewGenTestCase
+                                              contextBarCancelString])]
+      performAction:grey_tap()];
+}
+
 // Tests that the promo view is only seen at root level and not in any of the
 // child nodes.
 - (void)testPromoViewIsSeenOnlyInRootNode {
@@ -163,14 +562,14 @@
   }];
   // Check that sign-in promo view is visible.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 
   // Go to child node.
   [BookmarksNewGenTestCase openMobileBookmarks];
 
   // Wait until promo is gone.
-  [SignPromoViewEarlgreyUtils checkSigninPromoNotVisible];
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
 
   // Check that the promo already seen state is not updated.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:NO];
@@ -202,7 +601,7 @@
   }];
   // Check that sign-in promo view is visible.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 
   // Tap the dismiss button.
@@ -211,7 +610,7 @@
       performAction:grey_tap()];
 
   // Wait until promo is gone.
-  [SignPromoViewEarlgreyUtils checkSigninPromoNotVisible];
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
 
   // Check that the promo already seen state is updated.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:YES];
@@ -231,7 +630,7 @@
 
   // Check that sign-in promo view are visible.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 
   // Tap the primary button.
@@ -244,7 +643,7 @@
 
   // Check that the bookmarks UI reappeared and the cell is still here.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 }
 
@@ -262,10 +661,7 @@
   [BookmarksNewGenTestCase openBookmarks];
 
   // Set up a fake identity.
-  ChromeIdentity* identity =
-      [FakeChromeIdentity identityWithEmail:@"fakefoo@gmail.com"
-                                     gaiaID:@"fakefoopassword"
-                                       name:@"Fake Foo"];
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -311,16 +707,13 @@
   [BookmarksNewGenTestCase setupStandardBookmarks];
   [BookmarksNewGenTestCase openBookmarks];
   // Set up a fake identity.
-  ChromeIdentity* identity =
-      [FakeChromeIdentity identityWithEmail:@"fakefoo@egmail.com"
-                                     gaiaID:@"fakefoopassword"
-                                       name:@"Fake Foo"];
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
   // Check that sign-in promo view are visible.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
 
   // Tap the secondary button.
@@ -337,7 +730,7 @@
 
   // Check that the bookmarks UI reappeared and the cell is still here.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:NO];
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
 }
 
@@ -345,9 +738,6 @@
 - (void)testAutomaticSigninPromoDismiss {
   if (IsIPadIdiom()) {
     EARL_GREY_TEST_DISABLED(@"Test disabled on iPad.");
-  } else {
-    // TODO(crbug.com/761349): Fix test.
-    EARL_GREY_TEST_DISABLED(@"Test temporarily disabled on iPhone.");
   }
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(kBookmarkNewGeneration);
@@ -358,7 +748,7 @@
   prefs->SetInteger(prefs::kIosBookmarkSigninPromoDisplayedCount, 19);
   [BookmarksNewGenTestCase openBookmarks];
   // Check the sign-in promo view is visible.
-  [SignPromoViewEarlgreyUtils
+  [SigninEarlGreyUtils
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
   // Check the sign-in promo will not be shown anymore.
   [BookmarksNewGenTestCase verifyPromoAlreadySeen:YES];
@@ -371,7 +761,7 @@
   [BookmarksNewGenTestCase openBookmarks];
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
   // Check that the sign-in promo is not visible anymore.
-  [SignPromoViewEarlgreyUtils checkSigninPromoNotVisible];
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
 }
 
 #pragma mark - Helpers
@@ -493,6 +883,31 @@
                  }),
              @"Bookmark model was not loaded");
 }
+
+// Context bar strings.
++ (NSString*)contextBarNewFolderString {
+  return l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_NEW_FOLDER);
+}
+
++ (NSString*)contextBarDeleteString {
+  return l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_DELETE);
+}
+
++ (NSString*)contextBarCancelString {
+  return l10n_util::GetNSString(IDS_CANCEL);
+}
+
++ (NSString*)contextBarSelectString {
+  return l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_SELECT);
+}
+
++ (NSString*)contextBarEditString {
+  return l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_EDIT);
+}
+
++ (NSString*)contextBarMoreString {
+  return l10n_util::GetNSString(IDS_IOS_BOOKMARK_CONTEXT_BAR_MORE);
+}
 // TODO(crbug.com/695749): Add egtest for spinner and empty background
 
 @end
diff --git a/ios/chrome/browser/ui/browser_view_controller.h b/ios/chrome/browser/ui/browser_view_controller.h
index 4619343..cf8b3f5f 100644
--- a/ios/chrome/browser/ui/browser_view_controller.h
+++ b/ios/chrome/browser/ui/browser_view_controller.h
@@ -10,30 +10,20 @@
 #import <UIKit/UIKit.h>
 
 #import "base/ios/block_types.h"
-#import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
 #import "ios/chrome/browser/ui/toolbar/web_toolbar_controller.h"
 #import "ios/chrome/browser/ui/url_loader.h"
 #import "ios/public/provider/chrome/browser/voice/voice_search_presenter.h"
 
+@protocol ApplicationCommands;
+@protocol BrowserCommands;
 @class BrowserContainerView;
 @class BrowserViewControllerDependencyFactory;
-@class ContextualSearchController;
-@class ContextualSearchPanelView;
-@class FindBarControllerIOS;
+@protocol ChromeExecuteCommand;
 class GURL;
-@class NoTabsController;
-@class PageInfoViewController;
-@class PreloadController;
-@class PrintController;
-@class SideSwipeController;
 @class Tab;
 @class TabModel;
-@class TabStripController;
-@class ThumbnailHelper;
-@class VoiceSearchBarView;
 
 namespace ios {
 class ChromeBrowserState;
@@ -72,7 +62,12 @@
 
 - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
 
-@property(nonatomic, readonly) id<ApplicationCommands, BrowserCommands>
+@property(nonatomic, readonly) id<ApplicationCommands,
+                                  BrowserCommands,
+                                  ChromeExecuteCommand,
+                                  OmniboxFocuser,
+                                  UrlLoader,
+                                  WebToolbarDelegate>
     dispatcher;
 
 // The top-level browser container view.
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 0974a37..6da6db3 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -1030,8 +1030,15 @@
 
 #pragma mark - Properties
 
-- (id<ApplicationCommands, BrowserCommands>)dispatcher {
-  return static_cast<id<ApplicationCommands, BrowserCommands>>(_dispatcher);
+- (id<ApplicationCommands,
+      BrowserCommands,
+      ChromeExecuteCommand,
+      OmniboxFocuser,
+      UrlLoader,
+      WebToolbarDelegate>)dispatcher {
+  return static_cast<
+      id<ApplicationCommands, BrowserCommands, ChromeExecuteCommand,
+         OmniboxFocuser, UrlLoader, WebToolbarDelegate>>(_dispatcher);
 }
 
 - (void)setActive:(BOOL)active {
@@ -3262,7 +3269,7 @@
                                webToolbarDelegate:self
                                          tabModel:_model
                              parentViewController:self
-                                       dispatcher:_dispatcher];
+                                       dispatcher:self.dispatcher];
     pageController.swipeRecognizerProvider = self.sideSwipeController;
 
     // Panel is always NTP for iPhone.
@@ -4424,6 +4431,21 @@
   }
 }
 
+- (void)showRecentTabs {
+  if (IsIPadIdiom()) {
+    [self showNTPPanel:ntp_home::RECENT_TABS_PANEL];
+  } else {
+    if (!self.recentTabsCoordinator) {
+      self.recentTabsCoordinator = [[RecentTabsHandsetCoordinator alloc]
+          initWithBaseViewController:self];
+      self.recentTabsCoordinator.loader = self;
+      self.recentTabsCoordinator.dispatcher = self.dispatcher;
+      self.recentTabsCoordinator.browserState = _browserState;
+    }
+    [self.recentTabsCoordinator start];
+  }
+}
+
 #pragma mark - Command Handling
 
 - (IBAction)chromeExecuteCommand:(id)sender {
@@ -4442,21 +4464,6 @@
     case IDC_REQUEST_MOBILE_SITE:
       [[_model currentTab] reloadWithUserAgentType:web::UserAgentType::MOBILE];
       break;
-    case IDC_SHOW_OTHER_DEVICES: {
-      if (IsIPadIdiom()) {
-        [self showNTPPanel:ntp_home::RECENT_TABS_PANEL];
-      } else {
-        if (!self.recentTabsCoordinator) {
-          self.recentTabsCoordinator = [[RecentTabsHandsetCoordinator alloc]
-              initWithBaseViewController:self];
-          self.recentTabsCoordinator.loader = self;
-          self.recentTabsCoordinator.dispatcher = self.dispatcher;
-          self.recentTabsCoordinator.browserState = _browserState;
-        }
-        [self.recentTabsCoordinator start];
-      }
-      break;
-    }
     default:
       // Unknown commands get sent up the responder chain.
       [super chromeExecuteCommand:sender];
diff --git a/ios/chrome/browser/ui/commands/browser_commands.h b/ios/chrome/browser/ui/commands/browser_commands.h
index c857d57..b65a511 100644
--- a/ios/chrome/browser/ui/commands/browser_commands.h
+++ b/ios/chrome/browser/ui/commands/browser_commands.h
@@ -104,6 +104,9 @@
 // Shows the bookmarks manager.
 - (void)showBookmarksManager;
 
+// Shows recent tabs.
+- (void)showRecentTabs;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_COMMANDS_BROWSER_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/commands/ios_command_ids.h b/ios/chrome/browser/ui/commands/ios_command_ids.h
index 221dd16..1c0429f 100644
--- a/ios/chrome/browser/ui/commands/ios_command_ids.h
+++ b/ios/chrome/browser/ui/commands/ios_command_ids.h
@@ -16,7 +16,6 @@
 #define IDC_SHOW_SIGNIN_IOS                            40905
 #define IDC_SHOW_ADD_ACCOUNT                           40910
 #define IDC_SHOW_SYNC_SETTINGS                         40914
-#define IDC_SHOW_OTHER_DEVICES                         40917
 #define IDC_REQUEST_DESKTOP_SITE                       40921
 #define IDC_REQUEST_MOBILE_SITE                        40922
 #define IDC_CLEAR_BROWSING_DATA_IOS                    40924
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn
index e80e816..40039ebe 100644
--- a/ios/chrome/browser/ui/first_run/BUILD.gn
+++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -101,6 +101,7 @@
     "//ios/chrome/browser/geolocation:test_support",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/sync",
+    "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/public/provider/chrome/browser/signin:test_support",
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
index bb1c1571..99f620e 100644
--- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm
+++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -20,6 +20,7 @@
 #include "ios/chrome/browser/signin/signin_manager_factory.h"
 #include "ios/chrome/browser/sync/sync_setup_service.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.h"
 #include "ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
@@ -44,13 +45,6 @@
 
 namespace {
 
-// Returns a fake identity.
-ChromeIdentity* GetFakeIdentity() {
-  return [FakeChromeIdentity identityWithEmail:@"foo@gmail.com"
-                                        gaiaID:@"fooID"
-                                          name:@"Fake Foo"];
-}
-
 // Returns matcher for the opt in accept button.
 id<GREYMatcher> FirstRunOptInAcceptButton() {
   return ButtonWithAccessibilityLabel(
@@ -74,22 +68,6 @@
       IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_UNDO_BUTTON);
 }
 
-// Asserts that |identity| is actually signed in to the active profile.
-void AssertAuthenticatedIdentityInActiveProfile(ChromeIdentity* identity) {
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-
-  ios::ChromeBrowserState* browser_state =
-      chrome_test_util::GetOriginalBrowserState();
-  AccountInfo info =
-      ios::SigninManagerFactory::GetForBrowserState(browser_state)
-          ->GetAuthenticatedAccountInfo();
-
-  GREYAssertEqual(base::SysNSStringToUTF8(identity.gaiaID), info.gaia,
-                  @"Unexpected Gaia ID of the signed in user [expected = "
-                  @"\"%@\", actual = \"%s\"]",
-                  identity.gaiaID, info.gaia.c_str());
-}
-
 // Wait until |matcher| is accessible (not nil)
 void WaitForMatcher(id<GREYMatcher> matcher) {
   ConditionBlock condition = ^{
@@ -206,7 +184,7 @@
 
 // Signs in to an account and then taps the Undo button to sign out.
 - (void)testSignInAndUndo {
-  ChromeIdentity* identity = GetFakeIdentity();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -219,7 +197,7 @@
   [[EarlGrey selectElementWithMatcher:AccountConsistencySetupSigninButton()]
       performAction:grey_tap()];
 
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 
   // Undo the sign-in and dismiss the Sign In screen.
   [[EarlGrey selectElementWithMatcher:UndoAccountConsistencyButton()]
@@ -228,12 +206,12 @@
       performAction:grey_tap()];
 
   // |identity| shouldn't be signed in.
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
 }
 
 // Signs in to an account and then taps the Advanced link to go to settings.
 - (void)testSignInAndTapSettingsLink {
-  ChromeIdentity* identity = GetFakeIdentity();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -245,7 +223,7 @@
   // Sign In |identity|.
   [[EarlGrey selectElementWithMatcher:AccountConsistencySetupSigninButton()]
       performAction:grey_tap()];
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 
   // Tap Settings link.
   id<GREYMatcher> settings_link_matcher = grey_allOf(
@@ -263,7 +241,7 @@
   // Close Settings, user is still signed in and sync is now starting.
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
   GREYAssertTrue(sync_service->HasFinishedInitialSetup(),
                  @"Sync should have finished its original setup");
 }
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index 83decf6b..fbe872e8 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -161,6 +161,7 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/ui:ui",
     "//ios/chrome/browser/ui/authentication:authentication_ui",
+    "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm
index ecb7e48..eab9574 100644
--- a/ios/chrome/browser/ui/history/history_ui_egtest.mm
+++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -14,6 +14,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/history/history_entry_item.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h"
@@ -261,10 +262,7 @@
 
   // Mock sign in and assert that the page indicates what type of history
   // entries are shown.
-  ChromeIdentity* identity =
-      [FakeChromeIdentity identityWithEmail:@"foo@gmail.com"
-                                     gaiaID:@"fooID"
-                                       name:@"Fake Foo"];
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   [ChromeEarlGreyUI openSettingsMenu];
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_controller.h b/ios/chrome/browser/ui/ntp/new_tab_page_controller.h
index 5c2e39e..ed4adf9 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_controller.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_controller.h
@@ -28,7 +28,10 @@
 
 }  // namespace NewTabPage
 
+@protocol ApplicationCommands;
 @class BookmarkHomeTabletNTPController;
+@protocol BrowserCommands;
+@protocol ChromeExecuteCommand;
 @protocol CRWSwipeRecognizerProvider;
 @class GoogleLandingViewController;
 @protocol NewTabPagePanelProtocol;
@@ -84,7 +87,11 @@
       webToolbarDelegate:(id<WebToolbarDelegate>)webToolbarDelegate
                 tabModel:(TabModel*)tabModel
     parentViewController:(UIViewController*)parentViewController
-              dispatcher:(id)dispatcher;
+              dispatcher:(id<ApplicationCommands,
+                             BrowserCommands,
+                             ChromeExecuteCommand,
+                             OmniboxFocuser,
+                             UrlLoader>)dispatcher;
 
 // Select a panel based on the given |panelType|.
 - (void)selectPanel:(ntp_home::PanelIdentifier)panelType;
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 b11b6fd..e67eb0e 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
@@ -25,10 +25,7 @@
 #import "ios/chrome/browser/tabs/tab_model.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_controller_factory.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h"
-#import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
-#include "ios/chrome/browser/ui/commands/ios_command_ids.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #import "ios/chrome/browser/ui/ntp/google_landing_mediator.h"
 #import "ios/chrome/browser/ui/ntp/google_landing_view_controller.h"
@@ -180,10 +177,13 @@
 // is initiated, and when WebController calls -willBeDismissed.
 @property(nonatomic, weak) UIViewController* parentViewController;
 
-// TODO(crbug.com/761031) : Make dispatcher conform to necessary protocols.
-// To ease modernizing the NTP a non-descript CommandDispatcher is passed
-// through to be used by the reuabled NTP panels.
-@property(nonatomic, weak) id dispatcher;
+// The command dispatcher.
+@property(nonatomic, weak) id<ApplicationCommands,
+                              BrowserCommands,
+                              ChromeExecuteCommand,
+                              OmniboxFocuser,
+                              UrlLoader>
+    dispatcher;
 
 // Panel displaying the "Home" view, with the logo and the fake omnibox.
 @property(nonatomic, strong) id<NewTabPagePanelProtocol> homePanel;
@@ -217,7 +217,11 @@
       webToolbarDelegate:(id<WebToolbarDelegate>)webToolbarDelegate
                 tabModel:(TabModel*)tabModel
     parentViewController:(UIViewController*)parentViewController
-              dispatcher:(id)dispatcher {
+              dispatcher:(id<ApplicationCommands,
+                             BrowserCommands,
+                             ChromeExecuteCommand,
+                             OmniboxFocuser,
+                             UrlLoader>)dispatcher {
   self = [super initWithNibName:nil url:url];
   if (self) {
     DCHECK(browserState);
@@ -673,13 +677,9 @@
     [self.ntpView.scrollView setContentOffset:point animated:animate];
   } else {
     if (item.identifier == ntp_home::BOOKMARKS_PANEL) {
-      // TODO(crbug.com/761031) : Directly call method after dispatcher conforms
-      // to protocol.
-      [self.dispatcher performSelector:@selector(showBookmarksManager)];
+      [self.dispatcher showBookmarksManager];
     } else if (item.identifier == ntp_home::RECENT_TABS_PANEL) {
-      GenericChromeCommand* command =
-          [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_OTHER_DEVICES];
-      [self.ntpView chromeExecuteCommand:command];
+      [self.dispatcher showRecentTabs];
     }
   }
 
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
index 82428a6..9d02046 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
@@ -10,8 +10,6 @@
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/bookmarks/bookmark_new_generation_features.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
-#include "ios/chrome/browser/ui/commands/ios_command_ids.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
 #include "ios/chrome/browser/ui/ui_util.h"
@@ -71,9 +69,7 @@
     [chrome_test_util::BrowserCommandDispatcherForMainBVC()
         showBookmarksManager];
   } else if (panel_type == ntp_home::RECENT_TABS_PANEL) {
-    GenericChromeCommand* command =
-        [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_OTHER_DEVICES];
-    chrome_test_util::RunCommandWithActiveViewController(command);
+    [chrome_test_util::BrowserCommandDispatcherForMainBVC() showRecentTabs];
   }
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 }
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_perftest.mm b/ios/chrome/browser/ui/ntp/new_tab_page_perftest.mm
index 1e37daf..ffd3429 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_perftest.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_perftest.mm
@@ -8,6 +8,7 @@
 #include "ios/chrome/browser/test/perf_test_with_bvc_ios.h"
 #import "ios/chrome/browser/ui/browser_view_controller.h"
 #import "ios/chrome/browser/ui/browser_view_controller_dependency_factory.h"
+#import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn
index b042410..00079e0 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn
@@ -5,8 +5,8 @@
 source_set("recent_tabs") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "recent_tabs_bridges.h",
-    "recent_tabs_bridges.mm",
+    "closed_tabs_observer_bridge.h",
+    "closed_tabs_observer_bridge.mm",
     "recent_tabs_handset_coordinator.h",
     "recent_tabs_handset_coordinator.mm",
     "recent_tabs_handset_view_controller.h",
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.h b/ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.h
new file mode 100644
index 0000000..d417cdb
--- /dev/null
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.h
@@ -0,0 +1,44 @@
+// 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.
+
+#ifndef IOS_CHROME_BROWSER_UI_NTP_RECENT_TABS_CLOSED_TABS_OBSERVER_BRIDGE_H_
+#define IOS_CHROME_BROWSER_UI_NTP_RECENT_TABS_CLOSED_TABS_OBSERVER_BRIDGE_H_
+
+#import <UIKit/UIKit.h>
+
+#import "base/ios/weak_nsobject.h"
+#include "base/macros.h"
+#include "components/sessions/core/tab_restore_service_observer.h"
+
+// Objective-C protocol equivalent of the sessions::TabRestoreServiceObserver
+// C++ class. Those methods are called through the bridge. The method names are
+// the same as the C++ ones.
+@protocol ClosedTabsObserving<NSObject>
+- (void)tabRestoreServiceChanged:(sessions::TabRestoreService*)service;
+- (void)tabRestoreServiceDestroyed:(sessions::TabRestoreService*)service;
+@end
+
+namespace recent_tabs {
+
+// Bridge class to forward events from the sessions::TabRestoreService to
+// Objective-C protocol ClosedTabsObserving.
+class ClosedTabsObserverBridge : public sessions::TabRestoreServiceObserver {
+ public:
+  explicit ClosedTabsObserverBridge(id<ClosedTabsObserving> owner);
+  ~ClosedTabsObserverBridge() override;
+
+  // sessions::TabRestoreServiceObserver implementation.
+  void TabRestoreServiceChanged(sessions::TabRestoreService* service) override;
+  void TabRestoreServiceDestroyed(
+      sessions::TabRestoreService* service) override;
+
+ private:
+  __weak id<ClosedTabsObserving> owner_;
+
+  DISALLOW_COPY_AND_ASSIGN(ClosedTabsObserverBridge);
+};
+
+}  // namespace recent_tabs
+
+#endif  // IOS_CHROME_BROWSER_UI_NTP_RECENT_TABS_CLOSED_TABS_OBSERVER_BRIDGE_H_
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.mm b/ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.mm
similarity index 79%
rename from ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.mm
rename to ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.mm
index 066a8a5..35daa8e 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.h"
+#import "ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.h"
 
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h"
 
@@ -15,19 +15,19 @@
 #pragma mark - ClosedTabsObserverBridge
 
 ClosedTabsObserverBridge::ClosedTabsObserverBridge(
-    RecentTabsTableCoordinator* owner)
+    id<ClosedTabsObserving> owner)
     : owner_(owner) {}
 
 ClosedTabsObserverBridge::~ClosedTabsObserverBridge() {}
 
 void ClosedTabsObserverBridge::TabRestoreServiceChanged(
     sessions::TabRestoreService* service) {
-  [owner_ reloadClosedTabsList];
+  [owner_ tabRestoreServiceChanged:service];
 }
 
 void ClosedTabsObserverBridge::TabRestoreServiceDestroyed(
     sessions::TabRestoreService* service) {
-  [owner_ tabRestoreServiceDestroyed];
+  [owner_ tabRestoreServiceDestroyed:service];
 }
 
 }  // namespace recent_tabs
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.h b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.h
deleted file mode 100644
index 017a6e4..0000000
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.h
+++ /dev/null
@@ -1,38 +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.
-
-#ifndef IOS_CHROME_BROWSER_UI_NTP_RECENT_TABS_RECENT_TABS_BRIDGES_H_
-#define IOS_CHROME_BROWSER_UI_NTP_RECENT_TABS_RECENT_TABS_BRIDGES_H_
-
-#import <UIKit/UIKit.h>
-
-#import "base/ios/weak_nsobject.h"
-#include "base/macros.h"
-#include "components/sessions/core/tab_restore_service_observer.h"
-
-@class RecentTabsTableCoordinator;
-
-namespace recent_tabs {
-
-// Bridge class to forward events from the sessions::TabRestoreService to
-// Objective-C class RecentTabsTableCoordinator.
-class ClosedTabsObserverBridge : public sessions::TabRestoreServiceObserver {
- public:
-  explicit ClosedTabsObserverBridge(RecentTabsTableCoordinator* owner);
-  ~ClosedTabsObserverBridge() override;
-
-  // sessions::TabRestoreServiceObserver implementation.
-  void TabRestoreServiceChanged(sessions::TabRestoreService* service) override;
-  void TabRestoreServiceDestroyed(
-      sessions::TabRestoreService* service) override;
-
- private:
-  base::WeakNSObject<RecentTabsTableCoordinator> owner_;
-
-  DISALLOW_COPY_AND_ASSIGN(ClosedTabsObserverBridge);
-};
-
-}  // namespace recent_tabs
-
-#endif  // IOS_CHROME_BROWSER_UI_NTP_RECENT_TABS_RECENT_TABS_BRIDGES_H_
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 308bb82d..ea48d27 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
@@ -47,15 +47,6 @@
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
     NS_UNAVAILABLE;
 
-// Reloads the closed tab list and updates the content of the tableView.
-- (void)reloadClosedTabsList;
-
-// Reloads the session data and updates the content of the tableView.
-- (void)reloadSessions;
-
-// Sets the tab restore service to null.
-- (void)tabRestoreServiceDestroyed;
-
 // TODO(crbug.com/708319): Expose the view controller in preparation for a full
 // view controller conversion.
 - (UIViewController*)viewController;
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 668a0b20..0ba2ad9 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
@@ -15,7 +15,7 @@
 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
 #include "ios/chrome/browser/sync/sync_setup_service.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
-#import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_bridges.h"
+#import "ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h"
 #import "ios/chrome/browser/ui/sync/synced_sessions_bridge.h"
 
@@ -24,6 +24,7 @@
 #endif
 
 @interface RecentTabsTableCoordinator ()<
+    ClosedTabsObserving,
     SyncedSessionsObserver,
     RecentTabsTableViewControllerDelegate> {
   std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge>
@@ -103,16 +104,16 @@
   [self refreshSessionsView];
 }
 
-#pragma mark - Exposed to the ClosedTabsObserverBridge
+#pragma mark - Exposed to the ClosedTabsObserving
 
-- (void)reloadClosedTabsList {
+- (void)tabRestoreServiceChanged:(sessions::TabRestoreService*)service {
   sessions::TabRestoreService* restoreService =
       IOSChromeTabRestoreServiceFactory::GetForBrowserState(_browserState);
   restoreService->LoadTabsFromLastSession();
   [_tableViewController refreshRecentlyClosedTabs];
 }
 
-- (void)tabRestoreServiceDestroyed {
+- (void)tabRestoreServiceDestroyed:(sessions::TabRestoreService*)service {
   [_tableViewController setTabRestoreService:nullptr];
 }
 
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm
index c9e778f..eddd2da 100644
--- a/ios/chrome/browser/ui/payments/payment_request_manager.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -31,6 +31,7 @@
 #include "components/payments/core/journey_logger.h"
 #include "components/payments/core/payment_address.h"
 #include "components/payments/core/payment_details.h"
+#include "components/payments/core/payment_details_validation.h"
 #include "components/payments/core/payment_instrument.h"
 #include "components/payments/core/payment_prefs.h"
 #include "components/payments/core/payment_request_base_delegate.h"
@@ -427,7 +428,7 @@
 - (BOOL)handleScriptCommand:(const base::DictionaryValue&)JSONCommand {
   std::string command;
   if (!JSONCommand.GetString("command", &command)) {
-    DLOG(ERROR) << "RECEIVED BAD JSON - NO 'command' field";
+    LOG(ERROR) << "Received bad JSON: No 'command' field";
     return NO;
   }
 
@@ -457,20 +458,28 @@
 
 // Extracts a web::PaymentRequest from |message|. Creates and returns an
 // instance of payments::PaymentRequest which is initialized with the
-// web::PaymentRequest object. Returns nullptr if it cannot extract a
-// web::PaymentRequest from |message|.
-- (payments::PaymentRequest*)newPaymentRequestFromMessage:
-    (const base::DictionaryValue&)message {
+// web::PaymentRequest object. Returns nullptr and populates |errorMessage| with
+// the appropriate error message if it cannot extract a web::PaymentRequest from
+// |message| or the web::PaymentRequest instance is invalid.
+- (payments::PaymentRequest*)
+newPaymentRequestFromMessage:(const base::DictionaryValue&)message
+                errorMessage:(std::string*)errorMessage {
+  DCHECK(errorMessage);
   const base::DictionaryValue* paymentRequestData;
   web::PaymentRequest webPaymentRequest;
   if (!message.GetDictionary("payment_request", &paymentRequestData)) {
-    DLOG(ERROR) << "JS message parameter 'payment_request' is missing";
+    *errorMessage = "JS message parameter 'payment_request' is missing";
     return nullptr;
   }
   if (!webPaymentRequest.FromDictionaryValue(*paymentRequestData)) {
-    DLOG(ERROR) << "JS message parameter 'payment_request' is invalid";
+    *errorMessage = "Cannot create payment request";
     return nullptr;
   }
+  if (!payments::ValidatePaymentDetails(webPaymentRequest.details,
+                                        errorMessage)) {
+    return nullptr;
+  }
+
   return _paymentRequestCache->AddPaymentRequest(
       _activeWebState, base::MakeUnique<payments::PaymentRequest>(
                            webPaymentRequest, _browserState, _activeWebState,
@@ -481,18 +490,26 @@
 // payments::PaymentRequest that corresponds to the extracted
 // web::PaymentRequest object, if one exists. Otherwise, creates and returns a
 // new one which is initialized with the web::PaymentRequest object. Returns
-// nullptr if it cannot extract a web::PaymentRequest from |message| or cannot
-// find the payments::PaymentRequest instance.
-- (payments::PaymentRequest*)paymentRequestFromMessage:
-    (const base::DictionaryValue&)message {
+// nullptr and populates |errorMessage| with the appropriate error message if it
+// cannot extract a web::PaymentRequest from |message|, cannot find the
+// payments::PaymentRequest instance or the web::PaymentRequest instance is
+// invalid.
+- (payments::PaymentRequest*)
+paymentRequestFromMessage:(const base::DictionaryValue&)message
+             errorMessage:(std::string*)errorMessage {
+  DCHECK(errorMessage);
   const base::DictionaryValue* paymentRequestData;
   web::PaymentRequest webPaymentRequest;
   if (!message.GetDictionary("payment_request", &paymentRequestData)) {
-    DLOG(ERROR) << "JS message parameter 'payment_request' is missing";
+    *errorMessage = "JS message parameter 'payment_request' is missing";
     return nullptr;
   }
   if (!webPaymentRequest.FromDictionaryValue(*paymentRequestData)) {
-    DLOG(ERROR) << "JS message parameter 'payment_request' is invalid";
+    *errorMessage = "Cannot create payment request";
+    return nullptr;
+  }
+  if (!payments::ValidatePaymentDetails(webPaymentRequest.details,
+                                        errorMessage)) {
     return nullptr;
   }
 
@@ -500,28 +517,30 @@
 }
 
 - (BOOL)handleCreatePaymentRequest:(const base::DictionaryValue&)message {
+  std::string errorMessage;
   payments::PaymentRequest* paymentRequest =
-      [self newPaymentRequestFromMessage:message];
+      [self newPaymentRequestFromMessage:message errorMessage:&errorMessage];
   if (!paymentRequest) {
+    LOG(ERROR) << errorMessage;
     [_paymentRequestJsManager
         throwDOMExceptionWithErrorName:kInvalidStateError
-                          errorMessage:@"Cannot create payment request"
+                          errorMessage:base::SysUTF8ToNSString(errorMessage)
                      completionHandler:nil];
   }
   return YES;
 }
 
 - (BOOL)handleRequestShow:(const base::DictionaryValue&)message {
+  std::string errorMessage;
   payments::PaymentRequest* paymentRequest =
-      [self paymentRequestFromMessage:message];
+      [self paymentRequestFromMessage:message errorMessage:&errorMessage];
   if (!paymentRequest) {
     LOG(ERROR) << "Request promise rejected: "
-               << base::SysNSStringToUTF16(kInvalidStateError)
-               << "Cannot show the payment request";
+               << base::SysNSStringToUTF16(kInvalidStateError) << errorMessage;
     [self abortPaymentRequest:nil
                        reason:payments::JourneyLogger::ABORT_REASON_OTHER
                     errorName:kInvalidStateError
-                 errorMessage:@"Cannot show the payment request"
+                 errorMessage:base::SysUTF8ToNSString(errorMessage)
                      callback:nil];
     return YES;
   }
@@ -656,12 +675,15 @@
 }
 
 - (BOOL)handleCanMakePayment:(const base::DictionaryValue&)message {
+  std::string errorMessage;
   payments::PaymentRequest* paymentRequest =
-      [self paymentRequestFromMessage:message];
+      [self paymentRequestFromMessage:message errorMessage:&errorMessage];
   if (!paymentRequest) {
+    LOG(ERROR) << errorMessage;
     [_paymentRequestJsManager
         rejectCanMakePaymentPromiseWithErrorName:kInvalidStateError
-                                    errorMessage:@"Cannot query payment request"
+                                    errorMessage:base::SysUTF8ToNSString(
+                                                     errorMessage)
                                completionHandler:nil];
     return YES;
   }
@@ -758,7 +780,7 @@
 
   std::string result;
   if (!message.GetString("result", &result)) {
-    DLOG(ERROR) << "JS message parameter 'result' is missing";
+    LOG(ERROR) << "JS message parameter 'result' is missing";
     return NO;
   }
 
@@ -798,7 +820,7 @@
 
   bool updating;
   if (!message.GetBoolean("updating", &updating)) {
-    DLOG(ERROR) << "JS message parameter 'updating' is missing";
+    LOG(ERROR) << "JS message parameter 'updating' is missing";
     return NO;
   }
 
@@ -820,12 +842,17 @@
   const base::DictionaryValue* paymentDetailsData = nullptr;
   payments::PaymentDetails paymentDetails;
   if (!message.GetDictionary("payment_details", &paymentDetailsData)) {
-    DLOG(ERROR) << "JS message parameter 'payment_details' is missing";
+    LOG(ERROR) << "JS message parameter 'payment_details' is missing";
     return NO;
   }
   if (!paymentDetails.FromDictionaryValue(*paymentDetailsData,
                                           /*requires_total=*/false)) {
-    DLOG(ERROR) << "JS message parameter 'payment_details' is invalid";
+    LOG(ERROR) << "Cannot create payment details";
+    return NO;
+  }
+  std::string errorMessage;
+  if (!payments::ValidatePaymentDetails(paymentDetails, &errorMessage)) {
+    LOG(ERROR) << errorMessage;
     return NO;
   }
 
@@ -878,14 +905,14 @@
   }
 
   if (!_activeWebState->ContentIsHTML()) {
-    DLOG(ERROR) << "Not a web view with HTML.";
+    LOG(ERROR) << "Not a web view with HTML.";
     return NO;
   }
 
   const GURL lastCommittedURL = _activeWebState->GetLastCommittedURL();
 
   if (!payments::OriginSecurityChecker::IsContextSecure(lastCommittedURL)) {
-    DLOG(ERROR) << "Not in a secure context.";
+    LOG(ERROR) << "Not in a secure context.";
     return NO;
   }
 
@@ -893,7 +920,7 @@
           lastCommittedURL) &&
       !payments::OriginSecurityChecker::IsOriginLocalhostOrFile(
           lastCommittedURL)) {
-    DLOG(ERROR) << "Not localhost, or with file or cryptographic scheme.";
+    LOG(ERROR) << "Not localhost, or with file or cryptographic scheme.";
     return NO;
   }
 
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index aeca277e..2fac80bc 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -350,6 +350,7 @@
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ui:ui_internal",
     "//ios/chrome/browser/ui/authentication:authentication_ui",
+    "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/browser/ui/settings:test_support",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/browser/ui/util:util",
diff --git a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
index cec28eb..aef092b 100644
--- a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
+++ b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
@@ -9,6 +9,7 @@
 #include "components/signin/core/browser/signin_manager.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/signin/signin_manager_factory.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -35,36 +36,6 @@
 
 namespace {
 
-// Returns a fake identity.
-ChromeIdentity* GetFakeIdentity1() {
-  return [FakeChromeIdentity identityWithEmail:@"foo@gmail.com"
-                                        gaiaID:@"fooID"
-                                          name:@"Fake Foo"];
-}
-
-// Returns a second fake identity.
-ChromeIdentity* GetFakeIdentity2() {
-  return [FakeChromeIdentity identityWithEmail:@"bar@gmail.com"
-                                        gaiaID:@"barID"
-                                          name:@"Fake Bar"];
-}
-
-// Asserts that |identity| is actually signed in to the active profile.
-void AssertAuthenticatedIdentityInActiveProfile(ChromeIdentity* identity) {
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-
-  ios::ChromeBrowserState* browser_state =
-      chrome_test_util::GetOriginalBrowserState();
-  AccountInfo info =
-      ios::SigninManagerFactory::GetForBrowserState(browser_state)
-          ->GetAuthenticatedAccountInfo();
-
-  GREYAssertEqual(base::SysNSStringToUTF8(identity.gaiaID), info.gaia,
-                  @"Unexpected Gaia ID of the signed in user [expected = "
-                  @"\"%@\", actual = \"%s\"]",
-                  identity.gaiaID, info.gaia.c_str());
-}
-
 // Accepts account consistency popup prompts after signing in an account via the
 // UI. Should be called right after signing in an account.
 void AcceptAccountConsistencyPopup() {
@@ -102,7 +73,7 @@
 // Tests that the Sync and Account Settings screen are correctly popped if the
 // signed in account is removed.
 - (void)testSignInPopUpAccountOnSyncSettings {
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -112,7 +83,7 @@
   [[EarlGrey selectElementWithMatcher:ButtonWithIdentity(identity)]
       performAction:grey_tap()];
   AcceptAccountConsistencyPopup();
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
   [ChromeEarlGreyUI tapAccountsMenuButton:AccountsSyncButton()];
 
@@ -123,7 +94,7 @@
 
   [[EarlGrey selectElementWithMatcher:PrimarySignInButton()]
       assertWithMatcher:grey_sufficientlyVisible()];
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -132,7 +103,7 @@
 // Tests that the Account Settings screen is correctly popped if the signed in
 // account is removed while the "Disconnect Account" dialog is up.
 - (void)testSignInPopUpAccountOnDisconnectAccount {
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -142,7 +113,7 @@
   [[EarlGrey selectElementWithMatcher:ButtonWithIdentity(identity)]
       performAction:grey_tap()];
   AcceptAccountConsistencyPopup();
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
   [ChromeEarlGreyUI tapAccountsMenuButton:SignOutAccountsButton()];
 
@@ -153,7 +124,7 @@
 
   [[EarlGrey selectElementWithMatcher:PrimarySignInButton()]
       assertWithMatcher:grey_sufficientlyVisible()];
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -164,8 +135,8 @@
 - (void)testSignInReloadOnRemoveAccount {
   ios::FakeChromeIdentityService* identity_service =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
-  ChromeIdentity* identity1 = GetFakeIdentity1();
-  ChromeIdentity* identity2 = GetFakeIdentity2();
+  ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1];
+  ChromeIdentity* identity2 = [SigninEarlGreyUtils fakeIdentity2];
   identity_service->AddIdentity(identity1);
   identity_service->AddIdentity(identity2);
 
@@ -175,7 +146,7 @@
   [[EarlGrey selectElementWithMatcher:ButtonWithIdentity(identity1)]
       performAction:grey_tap()];
   AcceptAccountConsistencyPopup();
-  AssertAuthenticatedIdentityInActiveProfile(identity1);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity1];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
 
   // Remove |identity2| from the device.
@@ -191,7 +162,7 @@
                                    grey_accessibilityLabel(identity2.userEmail),
                                    grey_sufficientlyVisible(), nil)]
       assertWithMatcher:grey_nil()];
-  AssertAuthenticatedIdentityInActiveProfile(identity1);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity1];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -202,8 +173,8 @@
 - (void)testSignInReloadSyncOnForgetIdentity {
   ios::FakeChromeIdentityService* identity_service =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
-  ChromeIdentity* identity1 = GetFakeIdentity1();
-  ChromeIdentity* identity2 = GetFakeIdentity2();
+  ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1];
+  ChromeIdentity* identity2 = [SigninEarlGreyUtils fakeIdentity2];
   identity_service->AddIdentity(identity1);
   identity_service->AddIdentity(identity2);
 
@@ -213,7 +184,7 @@
   [[EarlGrey selectElementWithMatcher:ButtonWithIdentity(identity1)]
       performAction:grey_tap()];
   AcceptAccountConsistencyPopup();
-  AssertAuthenticatedIdentityInActiveProfile(identity1);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity1];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
   [ChromeEarlGreyUI tapAccountsMenuButton:AccountsSyncButton()];
 
@@ -235,7 +206,7 @@
                                    grey_accessibilityLabel(identity2.userEmail),
                                    grey_sufficientlyVisible(), nil)]
       assertWithMatcher:grey_nil()];
-  AssertAuthenticatedIdentityInActiveProfile(identity1);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity1];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -244,7 +215,7 @@
 // Tests that the Account Settings screen is popped and the user signed out
 // when the account is removed.
 - (void)testSignOutOnRemoveAccount {
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -254,7 +225,7 @@
   [[EarlGrey selectElementWithMatcher:ButtonWithIdentity(identity)]
       performAction:grey_tap()];
   AcceptAccountConsistencyPopup();
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
 
   // Remove |identity| from the device.
@@ -267,7 +238,7 @@
   // Check that the user is signed out and the Main Settings screen is shown.
   [[EarlGrey selectElementWithMatcher:PrimarySignInButton()]
       assertWithMatcher:grey_sufficientlyVisible()];
-  AssertAuthenticatedIdentityInActiveProfile(nil);
+  [SigninEarlGreyUtils assertSignedOut];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
@@ -280,7 +251,7 @@
 #if !TARGET_IPHONE_SIMULATOR
   EARL_GREY_TEST_DISABLED(@"Test disabled on device.");
 #endif
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
 
@@ -290,7 +261,7 @@
   [[EarlGrey selectElementWithMatcher:ButtonWithIdentity(identity)]
       performAction:grey_tap()];
   AcceptAccountConsistencyPopup();
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
 
   // Open the "Disconnect Account" dialog, then tap "Cancel".
@@ -302,7 +273,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::
                                           SettingsAccountsCollectionView()]
       assertWithMatcher:grey_sufficientlyVisible()];
-  AssertAuthenticatedIdentityInActiveProfile(identity);
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
 
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
diff --git a/ios/chrome/browser/ui/settings/signin_settings_egtest.mm b/ios/chrome/browser/ui/settings/signin_settings_egtest.mm
new file mode 100644
index 0000000..82ed0fe4
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/signin_settings_egtest.mm
@@ -0,0 +1,128 @@
+// 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.
+
+#import <EarlGrey/EarlGrey.h>
+
+#include "base/strings/sys_string_conversions.h"
+#include "components/prefs/pref_service.h"
+#include "components/signin/core/browser/account_info.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/pref_names.h"
+#include "ios/chrome/browser/signin/signin_manager_factory.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
+#import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
+#include "ios/chrome/grit/ios_strings.h"
+#import "ios/chrome/test/app/chrome_test_util.h"
+#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_matchers.h"
+#import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
+#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h"
+
+#include "components/signin/core/browser/signin_manager.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using chrome_test_util::PrimarySignInButton;
+using chrome_test_util::SecondarySignInButton;
+using chrome_test_util::SettingsAccountButton;
+using chrome_test_util::ButtonWithAccessibilityLabelId;
+
+namespace {
+
+id<GREYMatcher> NavigationBarDoneButton() {
+  return ButtonWithAccessibilityLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON);
+}
+}
+
+@interface SigninSettingsTestCase : ChromeTestCase
+@end
+
+@implementation SigninSettingsTestCase
+
+// Tests the primary button with a cold state.
+- (void)testSignInPromoWithColdStateUsingPrimaryButton {
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGreyUtils
+      checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
+  [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()];
+
+  [[EarlGrey selectElementWithMatcher:grey_buttonTitle(@"Cancel")]
+      performAction:grey_tap()];
+  [SigninEarlGreyUtils
+      checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
+}
+
+// Tests signing in, using the primary button with a warm state.
+- (void)testSignInPromoWithWarmStateUsingPrimaryButton {
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
+  ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
+      identity);
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGreyUtils
+      checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
+  [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()];
+  [ChromeEarlGreyUI confirmSigninConfirmationDialog];
+
+  // User signed in.
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
+  [[EarlGrey selectElementWithMatcher:SettingsAccountButton()]
+      assertWithMatcher:grey_interactable()];
+}
+
+// Tests signing in, using the secondary button with a warm state.
+- (void)testSignInPromoWithWarmStateUsingSecondaryButton {
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
+  ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
+      identity);
+
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGreyUtils
+      checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
+  [ChromeEarlGreyUI tapSettingsMenuButton:SecondarySignInButton()];
+  [ChromeEarlGreyUI signInToIdentityByEmail:identity.userEmail];
+  [ChromeEarlGreyUI confirmSigninConfirmationDialog];
+
+  // User signed in.
+  [SigninEarlGreyUtils assertSignedInWithIdentity:identity];
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
+  [[EarlGrey selectElementWithMatcher:SettingsAccountButton()]
+      assertWithMatcher:grey_interactable()];
+}
+
+// Tests that the sign-in promo should not be shown after been shown 5 times.
+- (void)testAutomaticSigninPromoDismiss {
+  const int displayedCount = 4;
+  ios::ChromeBrowserState* browser_state =
+      chrome_test_util::GetOriginalBrowserState();
+  PrefService* prefs = browser_state->GetPrefs();
+  prefs->SetInteger(prefs::kIosSettingsSigninPromoDisplayedCount,
+                    displayedCount);
+  [ChromeEarlGreyUI openSettingsMenu];
+  // Check the sign-in promo view is visible.
+  [SigninEarlGreyUtils
+      checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
+  // Check the sign-in promo will not be shown anymore.
+  GREYAssertEqual(
+      displayedCount + 1,
+      prefs->GetInteger(prefs::kIosSettingsSigninPromoDisplayedCount),
+      @"Should have incremented the display count");
+  // Close the bookmark view and open it again.
+  [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
+      performAction:grey_tap()];
+  [ChromeEarlGreyUI openSettingsMenu];
+  // Check that the sign-in promo is not visible anymore.
+  [SigninEarlGreyUtils checkSigninPromoNotVisible];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   grey_accessibilityID(kSettingsSignInCellId),
+                                   grey_sufficientlyVisible(), nil)]
+      assertWithMatcher:grey_notNil()];
+}
+
+@end
diff --git a/ios/chrome/browser/ui/sync/BUILD.gn b/ios/chrome/browser/ui/sync/BUILD.gn
index de187ce..c7cc369 100644
--- a/ios/chrome/browser/ui/sync/BUILD.gn
+++ b/ios/chrome/browser/ui/sync/BUILD.gn
@@ -53,6 +53,7 @@
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/sync",
     "//ios/chrome/browser/ui/authentication:authentication_ui",
+    "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm
index 74e9a01..ec03de3e 100644
--- a/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm
+++ b/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm
@@ -16,6 +16,7 @@
 #include "ios/chrome/browser/signin/authentication_service.h"
 #include "ios/chrome/browser/signin/authentication_service_factory.h"
 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
+#import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h"
@@ -50,13 +51,6 @@
 // Constant for timeout while waiting for asynchronous sync operations.
 const NSTimeInterval kSyncOperationTimeout = 10.0;
 
-// Returns a fake identity.
-ChromeIdentity* GetFakeIdentity1() {
-  return [FakeChromeIdentity identityWithEmail:@"foo@gmail.com"
-                                        gaiaID:@"fooID"
-                                          name:@"Fake Foo"];
-}
-
 // Signs in the identity for the specific |userEmail|. This is performed via the
 // UI and must be called from the NTP.
 void SignInIdentity(NSString* userEmail) {
@@ -146,7 +140,7 @@
   [self addBookmark:GURL("https://www.foo.com") withTitle:@"foo"];
 
   // Sign in to sync, after a bookmark has been added.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -158,7 +152,7 @@
 
 // Tests that a bookmark added on the client is uploaded to the Sync server.
 - (void)testSyncUploadBookmark {
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -176,7 +170,7 @@
   chrome_test_util::InjectBookmarkOnFakeSyncServer("http://www.hoo.com", "hoo");
 
   // Sign in to sync, after a bookmark has been injected in the sync server.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -188,7 +182,7 @@
 // Tests that the local cache guid does not change when sync is restarted.
 - (void)testSyncCheckSameCacheGuid_SyncRestarted {
   // Sign in the fake identity.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -210,7 +204,7 @@
 // signs back in with the same account.
 - (void)testSyncCheckDifferentCacheGuid_SignOutAndSignIn {
   // Sign in a fake identity, and store the initial sync guid.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -240,7 +234,7 @@
 // Test for http://crbug.com/413611 .
 - (void)testSyncCheckSameCacheGuid_SyncRestartedAfterSignOutAndSignIn {
   // Sign in a fake idenitty.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -285,7 +279,7 @@
   }];
 
   // Sign in to sync.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -311,7 +305,7 @@
   }];
 
   // Sign in to sync.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -353,7 +347,7 @@
   }];
 
   // Sign in to sync.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -391,7 +385,7 @@
   [ChromeEarlGrey loadURL:URL2];
 
   // Sign in to sync, after opening two tabs.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -421,7 +415,7 @@
   chrome_test_util::AddTypedURLOnClient(mockURL);
 
   // Sign in to sync.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -459,7 +453,7 @@
   chrome_test_util::InjectTypedURLOnFakeSyncServer(mockURL.spec());
 
   // Sign in to sync.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -495,7 +489,7 @@
   chrome_test_util::InjectTypedURLOnFakeSyncServer(mockURL.spec());
 
   // Sign in to sync.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
@@ -539,7 +533,7 @@
   chrome_test_util::AddTypedURLOnClient(mockURL);
 
   // Sign in to sync.
-  ChromeIdentity* identity = GetFakeIdentity1();
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
   SignInIdentity(identity.userEmail);
diff --git a/ios/chrome/browser/ui/sync/synced_sessions_bridge.h b/ios/chrome/browser/ui/sync/synced_sessions_bridge.h
index 59a2190..6d1888e2 100644
--- a/ios/chrome/browser/ui/sync/synced_sessions_bridge.h
+++ b/ios/chrome/browser/ui/sync/synced_sessions_bridge.h
@@ -19,6 +19,7 @@
 class SigninManager;
 
 @protocol SyncedSessionsObserver<SyncObserverModelBridge>
+// Reloads the session data.
 - (void)reloadSessions;
 @end
 
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
index bd2f84f..1526db5 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -8,8 +8,6 @@
 #include "base/ios/ios_util.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
-#include "ios/chrome/browser/ui/commands/ios_command_ids.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.h"
@@ -51,9 +49,7 @@
     [chrome_test_util::BrowserCommandDispatcherForMainBVC()
         showBookmarksManager];
   } else if (panel_type == ntp_home::RECENT_TABS_PANEL) {
-    GenericChromeCommand* command =
-        [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_OTHER_DEVICES];
-    chrome_test_util::RunCommandWithActiveViewController(command);
+    [chrome_test_util::BrowserCommandDispatcherForMainBVC() showRecentTabs];
   }
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 }
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h b/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h
index 4bdde12..dca87ad8 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h
@@ -58,6 +58,7 @@
   TOOLS_SHOW_FIND_IN_PAGE = -17,
   TOOLS_SHOW_HELP_PAGE = -18,
   TOOLS_SHOW_BOOKMARKS = -19,
+  TOOLS_SHOW_RECENT_TABS = -20,
 };
 
 #endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm
index 6baedbb..8c1ab19a 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm
@@ -61,7 +61,8 @@
     @selector(showReadingList),           ToolbarTypeWebAll,
     0,                                    [ReadingListMenuViewItem class] },
   { IDS_IOS_TOOLS_MENU_RECENT_TABS,       kToolsMenuOtherDevicesId,
-    IDC_SHOW_OTHER_DEVICES, nullptr,      ToolbarTypeWebAll,
+    TOOLS_SHOW_RECENT_TABS,
+    @selector(showRecentTabs),            ToolbarTypeWebAll,
     kVisibleNotIncognitoOnly,             nil },
   { IDS_HISTORY_SHOW_HISTORY,             kToolsMenuHistoryId,
     TOOLS_SHOW_HISTORY,
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
index b8d45fab..fff70340 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
@@ -205,7 +205,7 @@
     case TOOLS_SHOW_HISTORY:
       base::RecordAction(UserMetricsAction("MobileMenuHistory"));
       break;
-    case IDC_SHOW_OTHER_DEVICES:
+    case TOOLS_SHOW_RECENT_TABS:
       base::RecordAction(UserMetricsAction("MobileMenuRecentTabs"));
       break;
     case TOOLS_STOP_ITEM:
diff --git a/ios/clean/chrome/app/steps/BUILD.gn b/ios/clean/chrome/app/steps/BUILD.gn
index b056e81..a2ccb0c 100644
--- a/ios/clean/chrome/app/steps/BUILD.gn
+++ b/ios/clean/chrome/app/steps/BUILD.gn
@@ -33,6 +33,8 @@
     "provider_initializer.mm",
     "root_coordinator_initializer.h",
     "root_coordinator_initializer.mm",
+    "scheduled_tasks.h",
+    "scheduled_tasks.mm",
     "simple_application_step.h",
     "simple_application_step.mm",
     "step_collections.h",
diff --git a/ios/clean/chrome/app/steps/scheduled_tasks.h b/ios/clean/chrome/app/steps/scheduled_tasks.h
new file mode 100644
index 0000000..0a64403
--- /dev/null
+++ b/ios/clean/chrome/app/steps/scheduled_tasks.h
@@ -0,0 +1,17 @@
+// 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 IOS_CLEAN_CHROME_APP_STEPS_SCHEDULED_TASKS_H_
+#define IOS_CLEAN_CHROME_APP_STEPS_SCHEDULED_TASKS_H_
+
+#import <Foundation/Foundation.h>
+
+#import "ios/clean/chrome/app/steps/application_step.h"
+#import "ios/clean/chrome/app/steps/simple_application_step.h"
+
+// Schedule the start of the deferred runners.
+@interface ScheduledTasks : SimpleApplicationStep<ApplicationStep>
+@end
+
+#endif  // IOS_CLEAN_CHROME_APP_STEPS_SCHEDULED_TASKS_H_
diff --git a/ios/clean/chrome/app/steps/scheduled_tasks.mm b/ios/clean/chrome/app/steps/scheduled_tasks.mm
new file mode 100644
index 0000000..6178641b
--- /dev/null
+++ b/ios/clean/chrome/app/steps/scheduled_tasks.mm
@@ -0,0 +1,30 @@
+// 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.
+
+#import "ios/clean/chrome/app/steps/scheduled_tasks.h"
+
+#import "ios/chrome/app/startup_tasks.h"
+#import "ios/clean/chrome/app/steps/step_context.h"
+#import "ios/clean/chrome/app/steps/step_features.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation ScheduledTasks
+
+- (instancetype)init {
+  if ((self = [super init])) {
+    self.providedFeature = step_features::kScheduledTasks;
+    self.requiredFeatures = @[ step_features::kForeground ];
+  }
+  return self;
+}
+
+- (void)runFeature:(NSString*)feature withContext:(id<StepContext>)context {
+  [StartupTasks
+      scheduleDeferredBrowserStateInitialization:context.browserState];
+}
+
+@end
diff --git a/ios/clean/chrome/app/steps/step_collections.mm b/ios/clean/chrome/app/steps/step_collections.mm
index b60747c..de86d00 100644
--- a/ios/clean/chrome/app/steps/step_collections.mm
+++ b/ios/clean/chrome/app/steps/step_collections.mm
@@ -11,6 +11,7 @@
 #import "ios/clean/chrome/app/steps/foregrounder.h"
 #import "ios/clean/chrome/app/steps/provider_initializer.h"
 #import "ios/clean/chrome/app/steps/root_coordinator_initializer.h"
+#import "ios/clean/chrome/app/steps/scheduled_tasks.h"
 #import "ios/clean/chrome/app/steps/ui_initializer.h"
 
 @implementation StepCollections
@@ -20,7 +21,8 @@
     [[BrowserStateSetter alloc] init],
     [[BundleAndDefaultsConfigurator alloc] init], [[ChromeMain alloc] init],
     [[Foregrounder alloc] init], [[ProviderInitializer alloc] init],
-    [[UIInitializer alloc] init], [[RootCoordinatorInitializer alloc] init],
+    [[UIInitializer alloc] init], [[ScheduledTasks alloc] init],
+    [[RootCoordinatorInitializer alloc] init],
     [[BreakpadInitializer alloc] init]
   ];
 }
diff --git a/ios/clean/chrome/app/steps/step_features.h b/ios/clean/chrome/app/steps/step_features.h
index 134e0a8..9abb9892 100644
--- a/ios/clean/chrome/app/steps/step_features.h
+++ b/ios/clean/chrome/app/steps/step_features.h
@@ -17,6 +17,7 @@
 extern NSString* const kBrowserState;
 extern NSString* const kBrowserStateInitialized;
 extern NSString* const kMainWindow;
+extern NSString* const kScheduledTasks;
 extern NSString* const kRootCoordinatorStarted;
 extern NSString* const kBreakpad;
 
diff --git a/ios/clean/chrome/app/steps/step_features.mm b/ios/clean/chrome/app/steps/step_features.mm
index 7d07ab98..6f967840 100644
--- a/ios/clean/chrome/app/steps/step_features.mm
+++ b/ios/clean/chrome/app/steps/step_features.mm
@@ -14,6 +14,7 @@
 NSString* const kBrowserState = @"browserState";
 NSString* const kBrowserStateInitialized = @"browserStateInit";
 NSString* const kMainWindow = @"mainWindow";
+NSString* const kScheduledTasks = @"scheduledTasks";
 NSString* const kRootCoordinatorStarted = @"rootCoordinatorStarted";
 NSString* const kBreakpad = @"breakpad";
 
diff --git a/ios/clean/chrome/app/steps/ui_initializer.mm b/ios/clean/chrome/app/steps/ui_initializer.mm
index 0affe06d..6de5b7c 100644
--- a/ios/clean/chrome/app/steps/ui_initializer.mm
+++ b/ios/clean/chrome/app/steps/ui_initializer.mm
@@ -17,7 +17,8 @@
 - (instancetype)init {
   if ((self = [super init])) {
     self.providedFeature = step_features::kMainWindow;
-    self.requiredFeatures = @[ step_features::kForeground ];
+    self.requiredFeatures =
+        @[ step_features::kForeground, step_features::kScheduledTasks ];
   }
   return self;
 }
diff --git a/ios/clean/chrome/browser/DEPS b/ios/clean/chrome/browser/DEPS
index d3f9333..284a02e 100644
--- a/ios/clean/chrome/browser/DEPS
+++ b/ios/clean/chrome/browser/DEPS
@@ -1,6 +1,10 @@
 include_rules = [
+  "+components/bookmarks",
+  "+components/browser_sync",
   "+components/ntp_snippets",
   "+components/ntp_tiles",
   "+components/reading_list",
+  "+components/sessions",
+  "+components/sync_sessions",
   "+ios/public/provider/chrome",
 ]
diff --git a/ios/clean/chrome/browser/ui/BUILD.gn b/ios/clean/chrome/browser/ui/BUILD.gn
index 0b82fd2..fd4947d 100644
--- a/ios/clean/chrome/browser/ui/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/BUILD.gn
@@ -5,6 +5,12 @@
 source_set("ui") {
   sources = [
     "ui_types.h",
+    "url_loader_adaptor.h",
+    "url_loader_adaptor.mm",
+  ]
+  deps = [
+    "//ios/chrome/browser/ui",
+    "//ios/web",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn b/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn
index 6fa9e645..cd5dd7455 100644
--- a/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn
@@ -11,10 +11,18 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 
   deps = [
+    "//components/bookmarks/browser",
+    "//ios/chrome/browser",
+    "//ios/chrome/browser/bookmarks",
+    "//ios/chrome/browser/bookmarks:features",
+    "//ios/chrome/browser/metrics:metrics_internal",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/bookmarks",
     "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/coordinators",
+    "//ios/clean/chrome/browser/ui",
+    "//ios/clean/chrome/browser/ui/commands",
+    "//ios/web",
   ]
 }
 
diff --git a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.h b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.h
index 4db8223..70e90da 100644
--- a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.h
+++ b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.h
@@ -12,6 +12,10 @@
 // A coordinator for the bookmarks UI, which can be presented modally on its
 // own or inside the NTP.
 @interface BookmarksCoordinator : BrowserCoordinator
+
+// Whether the ViewController created by this coordinator will be contained.
+@property(nonatomic, assign) BOOL contained;
+
 @end
 
 #endif  // IOS_CLEAN_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_COORDINATOR_H_
diff --git a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
index deee9b79..e80ed57 100644
--- a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
@@ -4,39 +4,116 @@
 
 #import "ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.h"
 
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
+#include "base/strings/sys_string_conversions.h"
+#include "components/bookmarks/browser/bookmark_model.h"
+#include "components/bookmarks/browser/bookmark_utils.h"
+#include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "ios/chrome/browser/bookmarks/bookmark_new_generation_features.h"
+#import "ios/chrome/browser/metrics/new_tab_page_uma.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_controller_factory.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h"
 #import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #include "ios/chrome/browser/ui/ui_util.h"
+#import "ios/clean/chrome/browser/ui/url_loader_adaptor.h"
+#include "ios/web/public/referrer.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-@interface BookmarksCoordinator ()
+@interface BookmarksCoordinator ()<BookmarkHomeViewControllerDelegate>
 @property(nonatomic, strong) UIViewController* viewController;
+// A reference to the bookmark browser presented when the device is not an iPad.
+@property(nonatomic, strong) BookmarkHomeViewController* bookmarkBrowser;
+// Adaptor for old architecture URL loaders.
+@property(nonatomic, strong) URLLoaderAdaptor* loader;
 @end
 
 @implementation BookmarksCoordinator
+@synthesize contained = _contained;
 @synthesize viewController = _viewController;
+@synthesize bookmarkBrowser = _bookmarkBrowser;
+@synthesize loader = _loader;
 
 - (void)start {
-  // HACK: Re-using old view controllers for now.
-  if (!IsIPadIdiom()) {
-    self.viewController = [[BookmarkHomeHandsetViewController alloc]
-        initWithLoader:nil
-          browserState:self.browser->browser_state()];
-    self.viewController.modalPresentationStyle = UIModalPresentationFormSheet;
-  } else {
-    BookmarkControllerFactory* factory =
+  if (self.started)
+    return;
+
+  self.loader = [[URLLoaderAdaptor alloc] init];
+  if (!self.contained) {
+    BookmarkControllerFactory* bookmarkControllerFactory =
         [[BookmarkControllerFactory alloc] init];
-    self.viewController = [factory
-        bookmarkPanelControllerForBrowserState:self.browser->browser_state()
-                                        loader:nil];
+    self.bookmarkBrowser = [bookmarkControllerFactory
+        bookmarkControllerWithBrowserState:self.browser->browser_state()
+                                    loader:self.loader];
+    self.bookmarkBrowser.homeDelegate = self;
+
+    if (base::FeatureList::IsEnabled(kBookmarkNewGeneration)) {
+      UINavigationController* navController = [[UINavigationController alloc]
+          initWithRootViewController:self.bookmarkBrowser];
+
+      bookmarks::BookmarkModel* bookmarkModel =
+          ios::BookmarkModelFactory::GetForBrowserState(
+              self.browser->browser_state());
+      [self.bookmarkBrowser setRootNode:bookmarkModel->root_node()];
+      self.viewController = navController;
+    } else {
+      self.viewController = self.bookmarkBrowser;
+    }
+  } else {
+    self.viewController = [[BookmarkHomeTabletNTPController alloc]
+        initWithLoader:self.loader
+          browserState:self.browser->browser_state()];
   }
+  self.loader.viewControllerForAlert = self.viewController;
   [super start];
 }
 
+- (void)stop {
+  self.bookmarkBrowser.homeDelegate = nil;
+  self.bookmarkBrowser = nil;
+  [super stop];
+}
+
+#pragma mark - BookmarkHomeViewControllerDelegate
+
+- (void)bookmarkHomeViewControllerWantsDismissal:
+            (BookmarkHomeViewController*)controller
+                                 navigationToUrl:(const GURL&)url {
+  [self dismissBookmarkBrowser];
+
+  if (url != GURL()) {
+    new_tab_page_uma::RecordAction(self.browser->browser_state(),
+                                   new_tab_page_uma::ACTION_OPENED_BOOKMARK);
+    base::RecordAction(
+        base::UserMetricsAction("MobileBookmarkManagerEntryOpened"));
+
+    if (url.SchemeIs(url::kJavaScriptScheme)) {  // bookmarklet
+      NSString* jsToEval = [base::SysUTF8ToNSString(url.GetContent())
+          stringByRemovingPercentEncoding];
+      [self.loader loadJavaScriptFromLocationBar:jsToEval];
+    } else {
+      [self.loader loadURL:url
+                   referrer:web::Referrer()
+                 transition:ui::PAGE_TRANSITION_AUTO_BOOKMARK
+          rendererInitiated:NO];
+    }
+  }
+}
+
+#pragma mark - Private
+
+// Dismisses the bookmark browser when it is present on iPhones.
+- (void)dismissBookmarkBrowser {
+  if (!self.bookmarkBrowser)
+    return;
+
+  [self.bookmarkBrowser dismissModals];
+  [self stop];
+}
+
 @end
diff --git a/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm b/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm
index 4cbdc1e..779ffd6 100644
--- a/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm
@@ -26,12 +26,16 @@
 @property(nonatomic, strong) NTPMediator* mediator;
 @property(nonatomic, strong) NTPViewController* viewController;
 @property(nonatomic, strong) NTPHomeCoordinator* homeCoordinator;
+@property(nonatomic, strong) BookmarksCoordinator* bookmarksCoordinator;
+@property(nonatomic, strong) RecentTabsCoordinator* recentTabsCoordinator;
 @end
 
 @implementation NTPCoordinator
 @synthesize mediator = _mediator;
 @synthesize viewController = _viewController;
 @synthesize homeCoordinator = _homeCoordinator;
+@synthesize bookmarksCoordinator = _bookmarksCoordinator;
+@synthesize recentTabsCoordinator = _recentTabsCoordinator;
 
 - (void)start {
   if (self.started)
@@ -66,6 +70,8 @@
     if (IsIPadIdiom()) {
       self.viewController.bookmarksViewController = coordinator.viewController;
     } else {
+      coordinator.viewController.modalPresentationStyle =
+          UIModalPresentationFormSheet;
       [self.viewController presentViewController:coordinator.viewController
                                         animated:YES
                                       completion:nil];
@@ -75,6 +81,10 @@
     if (IsIPadIdiom()) {
       self.viewController.recentTabsViewController = coordinator.viewController;
     } else {
+      coordinator.viewController.modalPresentationStyle =
+          UIModalPresentationFormSheet;
+      coordinator.viewController.modalPresentationCapturesStatusBarAppearance =
+          YES;
       [self.viewController presentViewController:coordinator.viewController
                                         animated:YES
                                       completion:nil];
@@ -82,6 +92,20 @@
   }
 }
 
+- (void)childCoordinatorWillStop:(BrowserCoordinator*)childCoordinator {
+  if ([childCoordinator isKindOfClass:[BookmarksCoordinator class]] &&
+      !IsIPadIdiom()) {
+    [childCoordinator.viewController.presentingViewController
+        dismissViewControllerAnimated:YES
+                           completion:nil];
+  } else if ([childCoordinator isKindOfClass:[RecentTabsCoordinator class]] &&
+             !IsIPadIdiom()) {
+    [childCoordinator.viewController.presentingViewController
+        dismissViewControllerAnimated:YES
+                           completion:nil];
+  }
+}
+
 #pragma mark - NTPCommands
 
 - (void)showNTPHomePanel {
@@ -91,35 +115,20 @@
 }
 
 - (void)showNTPBookmarksPanel {
-  // TODO(crbug.com/740793): Remove alert once this feature is implemented.
-  UIAlertController* alertController =
-      [UIAlertController alertControllerWithTitle:@"Bookmarks"
-                                          message:nil
-                                   preferredStyle:UIAlertControllerStyleAlert];
-  UIAlertAction* action =
-      [UIAlertAction actionWithTitle:@"Done"
-                               style:UIAlertActionStyleCancel
-                             handler:nil];
-  [alertController addAction:action];
-  [self.viewController presentViewController:alertController
-                                    animated:YES
-                                  completion:nil];
+  if (!self.bookmarksCoordinator) {
+    self.bookmarksCoordinator = [[BookmarksCoordinator alloc] init];
+    self.bookmarksCoordinator.contained = IsIPadIdiom();
+    [self addChildCoordinator:self.bookmarksCoordinator];
+  }
+  [self.bookmarksCoordinator start];
 }
 
 - (void)showNTPRecentTabsPanel {
-  // TODO(crbug.com/740793): Remove alert once this feature is implemented.
-  UIAlertController* alertController =
-      [UIAlertController alertControllerWithTitle:@"Recent Sites"
-                                          message:nil
-                                   preferredStyle:UIAlertControllerStyleAlert];
-  UIAlertAction* action =
-      [UIAlertAction actionWithTitle:@"Done"
-                               style:UIAlertActionStyleCancel
-                             handler:nil];
-  [alertController addAction:action];
-  [self.viewController presentViewController:alertController
-                                    animated:YES
-                                  completion:nil];
+  if (!self.recentTabsCoordinator) {
+    self.recentTabsCoordinator = [[RecentTabsCoordinator alloc] init];
+    [self addChildCoordinator:self.recentTabsCoordinator];
+  }
+  [self.recentTabsCoordinator start];
 }
 
 @end
diff --git a/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn
index 9b2148f..6cf22eb 100644
--- a/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -11,10 +11,18 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 
   deps = [
+    "//components/browser_sync",
+    "//components/sessions",
+    "//components/sync_sessions",
+    "//ios/chrome/browser/sessions",
+    "//ios/chrome/browser/sync",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/coordinators",
     "//ios/chrome/browser/ui/ntp/recent_tabs",
+    "//ios/chrome/browser/ui/sync",
+    "//ios/clean/chrome/browser/ui",
+    "//ios/clean/chrome/browser/ui/commands",
   ]
 }
 
diff --git a/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm b/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
index a66d38e..8e3e8fb 100644
--- a/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
@@ -4,48 +4,202 @@
 
 #import "ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h"
 
+#include <memory>
+
+#include "components/browser_sync/profile_sync_service.h"
+#include "components/sessions/core/tab_restore_service.h"
+#include "components/sync_sessions/open_tabs_ui_delegate.h"
+#include "components/sync_sessions/synced_session.h"
+#include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h"
+#include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
+#include "ios/chrome/browser/sync/sync_setup_service.h"
+#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
 #import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
+#import "ios/chrome/browser/ui/ntp/recent_tabs/closed_tabs_observer_bridge.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.h"
+#import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h"
+#import "ios/chrome/browser/ui/sync/synced_sessions_bridge.h"
 #include "ios/chrome/browser/ui/ui_util.h"
+#import "ios/clean/chrome/browser/ui/url_loader_adaptor.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-@interface RecentTabsCoordinator ()
+@interface RecentTabsCoordinator ()<ClosedTabsObserving,
+                                    SyncedSessionsObserver,
+                                    RecentTabsHandsetViewControllerCommand,
+                                    RecentTabsTableViewControllerDelegate> {
+  std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge>
+      _syncedSessionsObserver;
+  std::unique_ptr<recent_tabs::ClosedTabsObserverBridge> _closedTabsObserver;
+}
+
 @property(nonatomic, strong) UIViewController* viewController;
-@property(nonatomic, strong) RecentTabsTableCoordinator* wrapperCoordinator;
+@property(nonatomic, strong) RecentTabsTableViewController* tableViewController;
+@property(nonatomic, strong) URLLoaderAdaptor* loader;
 @end
 
 @implementation RecentTabsCoordinator
 @synthesize viewController = _viewController;
-@synthesize wrapperCoordinator = _wrapperCoordinator;
+@synthesize tableViewController = _tableViewController;
+@synthesize loader = _loader;
 
 - (void)start {
+  self.loader = [[URLLoaderAdaptor alloc] init];
   // HACK: Re-using old view controllers for now.
-  self.wrapperCoordinator = [[RecentTabsTableCoordinator alloc]
-      initWithLoader:nil
-        browserState:self.browser->browser_state()
-          dispatcher:nil];
-  [self.wrapperCoordinator start];
+  self.tableViewController = [[RecentTabsTableViewController alloc]
+      initWithBrowserState:self.browser->browser_state()
+                    loader:self.loader
+                dispatcher:nil];
+  self.tableViewController.delegate = self;
+
   if (!IsIPadIdiom()) {
-    self.viewController = [[RecentTabsHandsetViewController alloc]
-        initWithViewController:[self.wrapperCoordinator viewController]];
-    self.viewController.modalPresentationStyle = UIModalPresentationFormSheet;
-    self.viewController.modalPresentationCapturesStatusBarAppearance = YES;
+    RecentTabsHandsetViewController* handsetViewController =
+        [[RecentTabsHandsetViewController alloc]
+            initWithViewController:self.tableViewController];
+    handsetViewController.commandHandler = self;
+    self.viewController = handsetViewController;
   } else {
-    self.viewController = [self.wrapperCoordinator viewController];
+    self.viewController = self.tableViewController;
   }
+  [self startObservers];
+  self.loader.viewControllerForAlert = self.viewController;
+
   [super start];
 }
 
 - (void)stop {
   [super stop];
-  [self.wrapperCoordinator stop];
-  self.wrapperCoordinator = nil;
+  [self stopObservers];
+  self.tableViewController = nil;
   self.viewController = nil;
 }
 
+#pragma mark - ClosedTabsObserving
+
+- (void)tabRestoreServiceChanged:(sessions::TabRestoreService*)service {
+  sessions::TabRestoreService* restoreService =
+      IOSChromeTabRestoreServiceFactory::GetForBrowserState(
+          self.browser->browser_state());
+  restoreService->LoadTabsFromLastSession();
+  [self.tableViewController refreshRecentlyClosedTabs];
+}
+
+- (void)tabRestoreServiceDestroyed:(sessions::TabRestoreService*)service {
+  [self.tableViewController setTabRestoreService:nullptr];
+}
+
+#pragma mark - SyncedSessionsObserver
+
+- (void)reloadSessions {
+  [self reloadSessionsData];
+  [self refreshSessionsView];
+}
+
+- (void)onSyncStateChanged {
+  [self refreshSessionsView];
+}
+
+#pragma mark - RecentTabsTableViewControllerDelegate
+
+- (void)recentTabsTableViewContentMoved:(UITableView*)tableView {
+  // TODO: update the shadow.
+}
+
+#pragma mark - RecentTabsHandsetViewControllerCommand
+
+- (void)dismissRecentTabs {
+  [self stop];
+}
+
+#pragma mark - Private
+
+- (void)startObservers {
+  if (!_syncedSessionsObserver) {
+    _syncedSessionsObserver.reset(
+        new synced_sessions::SyncedSessionsObserverBridge(
+            self, self.browser->browser_state()));
+  }
+  if (!_closedTabsObserver) {
+    _closedTabsObserver.reset(new recent_tabs::ClosedTabsObserverBridge(self));
+    sessions::TabRestoreService* restoreService =
+        IOSChromeTabRestoreServiceFactory::GetForBrowserState(
+            self.browser->browser_state());
+    if (restoreService)
+      restoreService->AddObserver(_closedTabsObserver.get());
+    [self.tableViewController setTabRestoreService:restoreService];
+  }
+}
+
+- (void)stopObservers {
+  _syncedSessionsObserver.reset();
+
+  if (_closedTabsObserver) {
+    sessions::TabRestoreService* restoreService =
+        IOSChromeTabRestoreServiceFactory::GetForBrowserState(
+            self.browser->browser_state());
+    if (restoreService) {
+      restoreService->RemoveObserver(_closedTabsObserver.get());
+    }
+    _closedTabsObserver.reset();
+  }
+}
+
+- (BOOL)isSignedIn {
+  return _syncedSessionsObserver->IsSignedIn();
+}
+
+- (BOOL)isSyncTabsEnabled {
+  DCHECK([self isSignedIn]);
+  SyncSetupService* service = SyncSetupServiceFactory::GetForBrowserState(
+      self.browser->browser_state());
+  return !service->UserActionIsRequiredToHaveSyncWork();
+}
+
+// Returns whether this profile has any foreign sessions to sync.
+- (SessionsSyncUserState)userSignedInState {
+  if (![self isSignedIn])
+    return SessionsSyncUserState::USER_SIGNED_OUT;
+  if (![self isSyncTabsEnabled])
+    return SessionsSyncUserState::USER_SIGNED_IN_SYNC_OFF;
+  if ([self hasForeignSessions])
+    return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_WITH_SESSIONS;
+  if (![self isSyncCompleted])
+    return SessionsSyncUserState::USER_SIGNED_IN_SYNC_IN_PROGRESS;
+  return SessionsSyncUserState::USER_SIGNED_IN_SYNC_ON_NO_SESSIONS;
+}
+
+- (BOOL)hasForeignSessions {
+  browser_sync::ProfileSyncService* service =
+      IOSChromeProfileSyncServiceFactory::GetForBrowserState(
+          self.browser->browser_state());
+  DCHECK(service);
+  sync_sessions::OpenTabsUIDelegate* openTabs =
+      service->GetOpenTabsUIDelegate();
+  std::vector<const sync_sessions::SyncedSession*> sessions;
+  return openTabs ? openTabs->GetAllForeignSessions(&sessions) : NO;
+}
+
+- (BOOL)isSyncCompleted {
+  return _syncedSessionsObserver->IsFirstSyncCycleCompleted();
+}
+
+// Force a contact to the sync server to reload remote sessions.
+- (void)reloadSessionsData {
+  DVLOG(1) << "Triggering sync refresh for sessions datatype.";
+  const syncer::ModelTypeSet types(syncer::SESSIONS);
+  // Requests a sync refresh of the sessions for the current profile.
+  IOSChromeProfileSyncServiceFactory::GetForBrowserState(
+      self.browser->browser_state())
+      ->TriggerRefresh(types);
+}
+
+// Reload the panel.
+- (void)refreshSessionsView {
+  [self.tableViewController refreshUserState:[self userSignedInState]];
+}
+
 @end
diff --git a/ios/clean/chrome/browser/ui/tab/BUILD.gn b/ios/clean/chrome/browser/ui/tab/BUILD.gn
index 1a53096b..78c60e3 100644
--- a/ios/clean/chrome/browser/ui/tab/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tab/BUILD.gn
@@ -8,11 +8,14 @@
     "tab_coordinator.mm",
     "tab_navigation_controller.h",
     "tab_navigation_controller.mm",
+    "tab_strip_tab_coordinator.h",
+    "tab_strip_tab_coordinator.mm",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
 
   deps = [
+    ":features",
     ":tab_ui",
     "//base",
     "//ios/chrome/browser",
@@ -33,11 +36,30 @@
   ]
 }
 
+source_set("features") {
+  sources = [
+    "tab_features.cc",
+    "tab_features.h",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  deps = [
+    "//base",
+  ]
+}
+
 source_set("tab_ui") {
   sources = [
+    "tab_container_view_controller+internal.h",
     "tab_container_view_controller.h",
     "tab_container_view_controller.mm",
+    "tab_strip_tab_container_view_controller.h",
+    "tab_strip_tab_container_view_controller.mm",
   ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+
   deps = [
     "//base",
     "//ios/chrome/browser/ui",
@@ -47,8 +69,8 @@
     "//ios/clean/chrome/browser/ui/transitions/animators",
     "//ios/clean/chrome/browser/ui/transitions/presenters",
   ]
+
   libs = [ "UIKit.framework" ]
-  configs += [ "//build/config/compiler:enable_arc" ]
 }
 
 source_set("unit_tests") {
@@ -64,10 +86,12 @@
     ":tab",
     ":tab_ui",
     "//base",
+    "//base/test:test_support",
     "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/coordinators",
     "//ios/chrome/browser/ui/coordinators:test_support",
     "//ios/chrome/browser/ui/toolbar/test",
+    "//ios/clean/chrome/browser/ui/tab:features",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
     "//testing/gtest",
diff --git a/ios/clean/chrome/browser/ui/tab/tab_container_view_controller+internal.h b/ios/clean/chrome/browser/ui/tab/tab_container_view_controller+internal.h
new file mode 100644
index 0000000..18d110bd
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab/tab_container_view_controller+internal.h
@@ -0,0 +1,39 @@
+// 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 IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_CONTAINER_VIEW_CONTROLLER_INTERNAL_H_
+#define IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_CONTAINER_VIEW_CONTROLLER_INTERNAL_H_
+
+#import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h"
+
+#import <UIKit/UIKit.h>
+
+#import "ios/clean/chrome/browser/ui/ui_types.h"
+
+// Internal API for subclasses and categories of TabContainerViewController.
+@interface TabContainerViewController (Internal)
+
+// Container view that holds the toolbar, findbar, and content view.
+// Subclasses should arrange any additional views along with |containerView|.
+@property(nonatomic, readonly) UIView* containerView;
+
+// Helper method for attaching a child view controller.
+- (void)attachChildViewController:(UIViewController*)viewController
+                        toSubview:(UIView*)subview;
+
+// Helper method for detaching a child view controller.
+- (void)detachChildViewController:(UIViewController*)viewController;
+
+// Configures all the subviews. Subclasses may override this method to configure
+// additional subviews. Subclass overrides must first call the super method.
+- (void)configureSubviews;
+
+// Returns constraints for the placement of the container. Subclasses
+// may override this method to arrange additional subviews along with the
+// container.
+- (Constraints*)containerConstraints;
+
+@end
+
+#endif  // IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_CONTAINER_VIEW_CONTROLLER_INTERNAL_H_
diff --git a/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h b/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h
index 299c33ba..ddd3dbd 100644
--- a/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h
+++ b/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h
@@ -28,14 +28,6 @@
 // width of the tab.
 @property(nonatomic, strong) UIViewController* toolbarViewController;
 
-// View controller showing the tab strip. It will be of a fixed
-// height (determined internally by the tab container), but will span the
-// width of the tab.
-@property(nonatomic, strong) UIViewController* tabStripViewController;
-
-// YES if |tabStripViewController| is currently visible.
-@property(nonatomic, getter=isTabStripVisible) BOOL tabStripVisible;
-
 // View controller showing the find bar.  The location of this controller's view
 // is determined by size class and device type.  May be nil if the find bar is
 // currently closed.
@@ -46,14 +38,12 @@
 @property(nonatomic, weak) id<ContainmentTransitioningDelegate>
     containmentTransitioningDelegate;
 
-@end
+// By default, this view controller displays a toolbar at the top of the screen.
+// When |usesBottomToolbar| is set to YES, the toolbar is shown at the bottom
+// of the screen. This property cannot be changed after the view has been
+// loaded.
+@property(nonatomic, assign) BOOL usesBottomToolbar;
 
-// Tab container which positions the toolbar at the top.
-@interface TopToolbarTabViewController : TabContainerViewController
-@end
-
-// Tab container which positions the toolbar at the bottom.
-@interface BottomToolbarTabViewController : TabContainerViewController
 @end
 
 #endif  // IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_CONTAINER_VIEW_CONTROLLER_H_
diff --git a/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.mm b/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.mm
index bc5480f..6a98ed97b 100644
--- a/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.mm
+++ b/ios/clean/chrome/browser/ui/tab/tab_container_view_controller.mm
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h"
+#import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller+internal.h"
 
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -17,16 +18,17 @@
 #endif
 
 namespace {
-CGFloat kToolbarHeight = 56.0f;
-CGFloat kTabStripHeight = 120.0f;
-}
+const CGFloat kToolbarHeight = 56.0f;
+}  // namespace
 
 @interface TabContainerViewController ()<ContainmentTransitioningDelegate>
 
+// Container view enclosing all child view controllers.
+@property(nonatomic, strong) UIView* containerView;
+
 // Container views for child view controllers. The child view controller's
 // view is added as a subview that fills its container view via autoresizing.
 @property(nonatomic, strong) UIView* findBarView;
-@property(nonatomic, strong) UIView* tabStripView;
 @property(nonatomic, strong) UIView* toolbarView;
 @property(nonatomic, strong) UIView* contentView;
 
@@ -35,82 +37,36 @@
 // means that this view will not be displayed on landscape.
 @property(nonatomic, strong) UIView* statusBarBackgroundView;
 
-// Height constraints for tabStripView and toolbarView.
-@property(nonatomic, strong) NSLayoutConstraint* tabStripHeightConstraint;
-@property(nonatomic, strong) NSLayoutConstraint* toolbarHeightConstraint;
-
-// Abstract base method for subclasses to implement.
-// Returns constraints for tabStrip, toolbar, and content subviews.
-- (Constraints*)subviewConstraints;
-
 @end
 
 @implementation TabContainerViewController
-
 @synthesize contentViewController = _contentViewController;
-@synthesize findBarView = _findBarView;
 @synthesize findBarViewController = _findBarViewController;
 @synthesize toolbarViewController = _toolbarViewController;
-@synthesize tabStripViewController = _tabStripViewController;
-@synthesize tabStripVisible = _tabStripVisible;
-@synthesize tabStripView = _tabStripView;
+@synthesize containerView = _containerView;
+@synthesize findBarView = _findBarView;
 @synthesize toolbarView = _toolbarView;
 @synthesize contentView = _contentView;
 @synthesize statusBarBackgroundView = _statusBarBackgroundView;
-@synthesize tabStripHeightConstraint = _tabStripHeightConstraint;
-@synthesize toolbarHeightConstraint = _toolbarHeightConstraint;
 @synthesize containmentTransitioningDelegate =
     _containmentTransitioningDelegate;
+@synthesize usesBottomToolbar = _usesBottomToolbar;
 
 #pragma mark - UIViewController
 
 - (void)viewDidLoad {
   [super viewDidLoad];
-  self.containmentTransitioningDelegate = self;
-  self.findBarView = [[UIView alloc] init];
-  self.tabStripView = [[UIView alloc] init];
-  self.toolbarView = [[UIView alloc] init];
-  self.contentView = [[UIView alloc] init];
-  self.statusBarBackgroundView = [[UIView alloc] init];
-  self.findBarView.translatesAutoresizingMaskIntoConstraints = NO;
-  self.tabStripView.translatesAutoresizingMaskIntoConstraints = NO;
-  self.toolbarView.translatesAutoresizingMaskIntoConstraints = NO;
-  self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
-  self.statusBarBackgroundView.translatesAutoresizingMaskIntoConstraints = NO;
-  self.view.backgroundColor = [UIColor blackColor];
-  self.findBarView.backgroundColor = [UIColor clearColor];
-  self.tabStripView.backgroundColor = [UIColor blackColor];
-  self.toolbarView.backgroundColor = [UIColor blackColor];
-  self.contentView.backgroundColor = [UIColor blackColor];
-  self.statusBarBackgroundView.backgroundColor =
-      UIColorFromRGB(kToolbarBackgroundColor);
-  self.findBarView.clipsToBounds = YES;
+  [self configureSubviews];
 
-  // Views that are added last have the highest z-order.
-  [self.view addSubview:self.tabStripView];
-  [self.view addSubview:self.statusBarBackgroundView];
-  [self.view addSubview:self.toolbarView];
-  [self.view addSubview:self.contentView];
-  [self.view addSubview:self.findBarView];
-  self.findBarView.hidden = YES;
-
-  [self addChildViewController:self.tabStripViewController
-                     toSubview:self.tabStripView];
-  [self addChildViewController:self.toolbarViewController
-                     toSubview:self.toolbarView];
-  [self addChildViewController:self.contentViewController
-                     toSubview:self.contentView];
-
-  self.tabStripHeightConstraint =
-      [self.tabStripView.heightAnchor constraintEqualToConstant:0.0f];
-  self.toolbarHeightConstraint =
-      [self.toolbarView.heightAnchor constraintEqualToConstant:0.0f];
-  self.toolbarHeightConstraint.priority = UILayoutPriorityDefaultHigh;
-  if (self.toolbarViewController) {
-    self.toolbarHeightConstraint.constant = kToolbarHeight;
-  }
-
-  [NSLayoutConstraint activateConstraints:[self subviewConstraints]];
+  NSMutableArray* constraints = [NSMutableArray array];
+  [constraints addObjectsFromArray:[self statusBarBackgroundConstraints]];
+  [constraints addObjectsFromArray:[self commonToolbarConstraints]];
+  [constraints addObjectsFromArray:(self.usesBottomToolbar
+                                        ? [self bottomToolbarConstraints]
+                                        : [self topToolbarConstraints])];
+  [constraints addObjectsFromArray:[self findbarConstraints]];
+  [constraints addObjectsFromArray:[self containerConstraints]];
+  [NSLayoutConstraint activateConstraints:constraints];
 }
 
 #pragma mark - Public properties
@@ -120,8 +76,8 @@
     return;
   if ([self isViewLoaded]) {
     [self detachChildViewController:self.contentViewController];
-    [self addChildViewController:contentViewController
-                       toSubview:self.contentView];
+    [self attachChildViewController:contentViewController
+                          toSubview:self.contentView];
   }
   _contentViewController = contentViewController;
 }
@@ -162,54 +118,15 @@
     return;
   if ([self isViewLoaded]) {
     [self detachChildViewController:self.toolbarViewController];
-    [self addChildViewController:toolbarViewController
-                       toSubview:self.toolbarView];
+    [self attachChildViewController:toolbarViewController
+                          toSubview:self.toolbarView];
   }
   _toolbarViewController = toolbarViewController;
 }
 
-- (void)setTabStripVisible:(BOOL)tabStripVisible {
-  if (tabStripVisible) {
-    self.tabStripHeightConstraint.constant = kTabStripHeight;
-  } else {
-    self.tabStripHeightConstraint.constant = 0.0f;
-  }
-  _tabStripVisible = tabStripVisible;
-}
-
-- (void)setTabStripViewController:(UIViewController*)tabStripViewController {
-  if (self.tabStripViewController == tabStripViewController)
-    return;
-  if ([self isViewLoaded]) {
-    [self detachChildViewController:self.tabStripViewController];
-    [self addChildViewController:tabStripViewController
-                       toSubview:self.tabStripView];
-  }
-  _tabStripViewController = tabStripViewController;
-}
-
-#pragma mark - ChildViewController helper methods
-
-- (void)addChildViewController:(UIViewController*)viewController
-                     toSubview:(UIView*)subview {
-  if (!viewController || !subview) {
-    return;
-  }
-  [self addChildViewController:viewController];
-  viewController.view.translatesAutoresizingMaskIntoConstraints = YES;
-  viewController.view.autoresizingMask =
-      UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
-  viewController.view.frame = subview.bounds;
-  [subview addSubview:viewController.view];
-  [viewController didMoveToParentViewController:self];
-}
-
-- (void)detachChildViewController:(UIViewController*)viewController {
-  if (viewController.parentViewController != self)
-    return;
-  [viewController willMoveToParentViewController:nil];
-  [viewController.view removeFromSuperview];
-  [viewController removeFromParentViewController];
+- (void)setUsesBottomToolbar:(BOOL)usesBottomToolbar {
+  DCHECK(![self isViewLoaded]);
+  _usesBottomToolbar = usesBottomToolbar;
 }
 
 #pragma mark - MenuPresentationDelegate
@@ -233,17 +150,74 @@
   return CGRectNull;
 }
 
-#pragma mark - Tab Strip actions.
+#pragma mark - Methods in Internal category
 
-- (void)hideTabStrip:(id)sender {
-  self.tabStripVisible = NO;
+- (void)attachChildViewController:(UIViewController*)viewController
+                        toSubview:(UIView*)subview {
+  if (!viewController || !subview)
+    return;
+  [self addChildViewController:viewController];
+  viewController.view.translatesAutoresizingMaskIntoConstraints = YES;
+  viewController.view.autoresizingMask =
+      UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+  viewController.view.frame = subview.bounds;
+  [subview addSubview:viewController.view];
+  [viewController didMoveToParentViewController:self];
 }
 
-#pragma mark - Abstract methods to be overriden by subclass
+- (void)detachChildViewController:(UIViewController*)viewController {
+  if (viewController.parentViewController != self)
+    return;
+  [viewController willMoveToParentViewController:nil];
+  [viewController.view removeFromSuperview];
+  [viewController removeFromParentViewController];
+}
 
-- (Constraints*)subviewConstraints {
-  NOTREACHED() << "You must override -subviewConstraints in a subclass";
-  return nil;
+- (void)configureSubviews {
+  self.containmentTransitioningDelegate = self;
+  self.containerView = [[UIView alloc] init];
+  self.findBarView = [[UIView alloc] init];
+  self.toolbarView = [[UIView alloc] init];
+  self.contentView = [[UIView alloc] init];
+  self.statusBarBackgroundView = [[UIView alloc] init];
+  self.containerView.translatesAutoresizingMaskIntoConstraints = NO;
+  self.findBarView.translatesAutoresizingMaskIntoConstraints = NO;
+  self.toolbarView.translatesAutoresizingMaskIntoConstraints = NO;
+  self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
+  self.statusBarBackgroundView.translatesAutoresizingMaskIntoConstraints = NO;
+  self.view.backgroundColor = [UIColor blackColor];
+  self.findBarView.backgroundColor = [UIColor clearColor];
+  self.toolbarView.backgroundColor = [UIColor blackColor];
+  self.contentView.backgroundColor = [UIColor blackColor];
+  self.statusBarBackgroundView.backgroundColor =
+      UIColorFromRGB(kToolbarBackgroundColor);
+  self.findBarView.clipsToBounds = YES;
+
+  [self.view addSubview:self.containerView];
+  [self.view addSubview:self.statusBarBackgroundView];
+  [self.containerView addSubview:self.toolbarView];
+  [self.containerView addSubview:self.contentView];
+  // Findbar should have higher z-order than toolbar.
+  [self.containerView addSubview:self.findBarView];
+  self.findBarView.hidden = YES;
+
+  [self attachChildViewController:self.toolbarViewController
+                        toSubview:self.toolbarView];
+  [self attachChildViewController:self.contentViewController
+                        toSubview:self.contentView];
+}
+
+- (Constraints*)containerConstraints {
+  return @[
+    [self.containerView.topAnchor
+        constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor],
+    [self.containerView.bottomAnchor
+        constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor],
+    [self.containerView.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [self.containerView.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+  ];
 }
 
 #pragma mark - ContainmentTransitioningDelegate
@@ -255,12 +229,10 @@
   return [[SwapFromAboveAnimator alloc] init];
 }
 
-@end
+#pragma mark - Private methods
 
-@implementation TopToolbarTabViewController
-
-// Override with constraints that place the toolbar on top.
-- (Constraints*)subviewConstraints {
+// Constraints for the status bar background.
+- (Constraints*)statusBarBackgroundConstraints {
   return @[
     [self.statusBarBackgroundView.topAnchor
         constraintEqualToAnchor:self.topLayoutGuide.topAnchor],
@@ -270,30 +242,12 @@
         constraintEqualToAnchor:self.view.leadingAnchor],
     [self.statusBarBackgroundView.trailingAnchor
         constraintEqualToAnchor:self.view.trailingAnchor],
+  ];
+}
 
-    [self.tabStripView.topAnchor
-        constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor],
-    [self.tabStripView.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
-    [self.tabStripView.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
-    self.tabStripHeightConstraint,
-    [self.toolbarView.topAnchor
-        constraintEqualToAnchor:self.tabStripView.bottomAnchor],
-    [self.toolbarView.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
-    [self.toolbarView.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
-    self.toolbarHeightConstraint,
-    [self.contentView.topAnchor
-        constraintEqualToAnchor:self.toolbarView.bottomAnchor],
-    [self.contentView.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
-    [self.contentView.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
-    [self.contentView.bottomAnchor
-        constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor],
-
+// Constraints for the findbar.
+- (Constraints*)findbarConstraints {
+  return @[
     [self.findBarView.topAnchor
         constraintEqualToAnchor:self.toolbarView.topAnchor],
     [self.findBarView.bottomAnchor
@@ -305,44 +259,46 @@
   ];
 }
 
-@end
-
-@implementation BottomToolbarTabViewController
-
-// Override with constraints that place the toolbar on bottom.
-- (Constraints*)subviewConstraints {
+// Constraints that are shared between topToolbar and bottomToolbar
+// configurations.
+- (Constraints*)commonToolbarConstraints {
   return @[
-    [self.statusBarBackgroundView.topAnchor
-        constraintEqualToAnchor:self.topLayoutGuide.topAnchor],
-    [self.statusBarBackgroundView.bottomAnchor
-        constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor],
-    [self.statusBarBackgroundView.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
-    [self.statusBarBackgroundView.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
+    // Toolbar leading, trailing, and height constraints.
+    [self.toolbarView.leadingAnchor
+        constraintEqualToAnchor:self.containerView.leadingAnchor],
+    [self.toolbarView.trailingAnchor
+        constraintEqualToAnchor:self.containerView.trailingAnchor],
+    [self.toolbarView.heightAnchor constraintEqualToConstant:kToolbarHeight],
 
-    [self.tabStripView.topAnchor
-        constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor],
-    [self.tabStripView.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
-    [self.tabStripView.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
-    self.tabStripHeightConstraint,
-    [self.contentView.topAnchor
-        constraintEqualToAnchor:self.tabStripView.bottomAnchor],
+    // Content leading and trailing constraints.
     [self.contentView.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
+        constraintEqualToAnchor:self.containerView.leadingAnchor],
     [self.contentView.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
+        constraintEqualToAnchor:self.containerView.trailingAnchor],
+  ];
+}
+
+// Constraints that configure the toolbar at the top.
+- (Constraints*)topToolbarConstraints {
+  return @[
+    [self.toolbarView.topAnchor
+        constraintEqualToAnchor:self.containerView.topAnchor],
+    [self.contentView.topAnchor
+        constraintEqualToAnchor:self.toolbarView.bottomAnchor],
+    [self.contentView.bottomAnchor
+        constraintEqualToAnchor:self.containerView.bottomAnchor],
+  ];
+}
+
+// Constraints that configure the toolbar at the bottom.
+- (Constraints*)bottomToolbarConstraints {
+  return @[
+    [self.contentView.topAnchor
+        constraintEqualToAnchor:self.containerView.topAnchor],
     [self.toolbarView.topAnchor
         constraintEqualToAnchor:self.contentView.bottomAnchor],
-    [self.toolbarView.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
-    [self.toolbarView.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
-    self.toolbarHeightConstraint,
     [self.toolbarView.bottomAnchor
-        constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor],
+        constraintEqualToAnchor:self.containerView.bottomAnchor],
   ];
 }
 
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator.h b/ios/clean/chrome/browser/ui/tab/tab_coordinator.h
index 4f1ca4c..709ebd4 100644
--- a/ios/clean/chrome/browser/ui/tab/tab_coordinator.h
+++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator.h
@@ -5,7 +5,8 @@
 #ifndef IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_COORDINATOR_H_
 #define IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_COORDINATOR_H_
 
-#import <UIKit/UIKit.h>
+#import <Foundation/Foundation.h>
+
 #import "ios/chrome/browser/ui/coordinators/browser_coordinator.h"
 
 namespace web {
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
index f1ba996..d6c18f2 100644
--- a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "base/mac/foundation_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/scoped_observer.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
@@ -17,12 +16,11 @@
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #import "ios/clean/chrome/browser/ui/commands/tab_commands.h"
-#import "ios/clean/chrome/browser/ui/commands/tab_strip_commands.h"
 #import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.h"
 #import "ios/clean/chrome/browser/ui/ntp/ntp_coordinator.h"
 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h"
+#include "ios/clean/chrome/browser/ui/tab/tab_features.h"
 #import "ios/clean/chrome/browser/ui/tab/tab_navigation_controller.h"
-#import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.h"
 #import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h"
 #import "ios/clean/chrome/browser/ui/transitions/zoom_transition_controller.h"
 #import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h"
@@ -42,6 +40,11 @@
 @property(nonatomic, weak) WebCoordinator* webCoordinator;
 @property(nonatomic, weak) ToolbarCoordinator* toolbarCoordinator;
 @property(nonatomic, strong) TabNavigationController* navigationController;
+
+// Creates and returns a new view controller for use as a tab container.
+// Subclasses may override this method with a custom layout view controller.
+- (TabContainerViewController*)newTabContainer;
+
 @end
 
 @implementation TabCoordinator {
@@ -70,7 +73,8 @@
 #pragma mark - BrowserCoordinator
 
 - (void)start {
-  self.viewController = [self newTabContainer];
+  if (self.started)
+    return;
   self.transitionController = [[ZoomTransitionController alloc] init];
   self.transitionController.presentationKey = self.presentationKey;
   self.viewController.transitioningDelegate = self.transitionController;
@@ -84,16 +88,8 @@
       _webStateListObserver.get());
   _scopedWebStateListObserver->Add(&self.browser->web_state_list());
 
-  [self.browser->broadcaster()
-      broadcastValue:@"tabStripVisible"
-            ofObject:self.viewController
-            selector:@selector(broadcastTabStripVisible:)];
-
-  CommandDispatcher* dispatcher = self.browser->dispatcher();
-  // Register Commands
-  [dispatcher startDispatchingToTarget:self forSelector:@selector(loadURL:)];
-  [dispatcher startDispatchingToTarget:self
-                           forSelector:@selector(showTabStrip)];
+  [self.browser->dispatcher() startDispatchingToTarget:self
+                                           forSelector:@selector(loadURL:)];
 
   // NavigationController will handle all the dispatcher navigation calls.
   self.navigationController = [[TabNavigationController alloc]
@@ -107,10 +103,10 @@
   self.webCoordinator = webCoordinator;
 
   ToolbarCoordinator* toolbarCoordinator = [[ToolbarCoordinator alloc] init];
+  self.toolbarCoordinator = toolbarCoordinator;
   toolbarCoordinator.webState = self.webState;
   [self addChildCoordinator:toolbarCoordinator];
   [toolbarCoordinator start];
-  self.toolbarCoordinator = toolbarCoordinator;
 
   // Create the FindInPage coordinator but do not start it.  It will be started
   // when a find in page operation is invoked.
@@ -118,10 +114,6 @@
       [[FindInPageCoordinator alloc] init];
   [self addChildCoordinator:findInPageCoordinator];
 
-  TabStripCoordinator* tabStripCoordinator = [[TabStripCoordinator alloc] init];
-  [self addChildCoordinator:tabStripCoordinator];
-  [tabStripCoordinator start];
-
   // PLACEHOLDER: Fix the order of events here. The ntpCoordinator was already
   // created above when |webCoordinator.webState = self.webState;| triggers
   // a load event, but then the webCoordinator stomps on the
@@ -130,7 +122,6 @@
     self.viewController.contentViewController =
         self.ntpCoordinator.viewController;
   }
-
   [super start];
 }
 
@@ -139,8 +130,6 @@
   for (BrowserCoordinator* child in self.children) {
     [self removeChildCoordinator:child];
   }
-  [self.browser->broadcaster()
-      stopBroadcastingForSelector:@selector(broadcastTabStripVisible:)];
   _webStateObserver.reset();
   [self.browser->dispatcher() stopDispatchingToTarget:self];
   [self.navigationController stop];
@@ -152,9 +141,6 @@
   } else if ([childCoordinator isKindOfClass:[WebCoordinator class]] ||
              [childCoordinator isKindOfClass:[NTPCoordinator class]]) {
     self.viewController.contentViewController = childCoordinator.viewController;
-  } else if ([childCoordinator isKindOfClass:[TabStripCoordinator class]]) {
-    self.viewController.tabStripViewController =
-        childCoordinator.viewController;
   } else if ([childCoordinator isKindOfClass:[FindInPageCoordinator class]]) {
     self.viewController.findBarViewController = childCoordinator.viewController;
   }
@@ -174,23 +160,21 @@
   return YES;
 }
 
-#pragma mark - Experiment support
+#pragma mark - Private accessors
 
-- (BOOL)usesBottomToolbar {
-  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
-  NSString* bottomToolbarPreference =
-      [defaults stringForKey:@"EnableBottomToolbar"];
-  return [bottomToolbarPreference isEqualToString:@"Enabled"];
+- (TabContainerViewController*)viewController {
+  if (!_viewController) {
+    _viewController = [self newTabContainer];
+    _viewController.usesBottomToolbar =
+        base::FeatureList::IsEnabled(kTabFeaturesBottomToolbar);
+  }
+  return _viewController;
 }
 
-// Creates and returns a new view controller for use as a tab container;
-// experimental configurations determine which subclass of
-// TabContainerViewController to return.
+#pragma mark - Methods for subclasses to override
+
 - (TabContainerViewController*)newTabContainer {
-  if ([self usesBottomToolbar]) {
-    return [[BottomToolbarTabViewController alloc] init];
-  }
-  return [[TopToolbarTabViewController alloc] init];
+  return [[TabContainerViewController alloc] init];
 }
 
 #pragma mark - CRWWebStateObserver
@@ -259,10 +243,4 @@
   self.webState->GetNavigationManager()->LoadURLWithParams(params);
 }
 
-#pragma mark - TabStripCommands
-
-- (void)showTabStrip {
-  self.viewController.tabStripVisible = YES;
-}
-
 @end
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm b/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm
index 73274a1..84d4a26 100644
--- a/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm
+++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm
@@ -3,17 +3,18 @@
 // found in the LICENSE file.
 
 #import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h"
+#import "ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.h"
 
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
+#import "base/mac/foundation_util.h"
+#include "base/test/scoped_feature_list.h"
 #import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/chrome/browser/ui/coordinators/browser_coordinator_test.h"
 #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h"
 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h"
+#include "ios/clean/chrome/browser/ui/tab/tab_features.h"
+#import "ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.h"
 #import "ios/web/public/test/fakes/test_navigation_manager.h"
-#include "ios/web/public/test/test_web_thread.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -24,76 +25,71 @@
 
 class TabCoordinatorTest : public BrowserCoordinatorTest {
  protected:
-  TabCoordinatorTest()
-      : loop_(base::MessageLoop::TYPE_IO),
-        ui_thread_(web::WebThread::UI, &loop_) {
-    // Store the initial setting.
-    initial_setting_ = [[NSUserDefaults standardUserDefaults]
-        objectForKey:@"EnableBottomToolbar"];
-
+  TabCoordinatorTest() {
     // Initialize the web state.
     auto navigation_manager = base::MakeUnique<web::TestNavigationManager>();
     web_state_.SetNavigationManager(std::move(navigation_manager));
-
-    // Initialize the coordinator.
+  }
+  ~TabCoordinatorTest() override {
+    // Explicitly disconnect the mediator so there won't be any WebStateList
+    // observers when web_state_list_ gets dealloc.
+    [coordinator_ disconnect];
+    [coordinator_ stop];
+    coordinator_ = nil;
+  }
+  void SetUpDefaultCoordinator() {
     coordinator_ = [[TabCoordinator alloc] init];
     coordinator_.browser = GetBrowser();
     coordinator_.webState = &web_state_;
   }
-  ~TabCoordinatorTest() override {
-    // Restore the initial setting.
-    [[NSUserDefaults standardUserDefaults] setObject:initial_setting_
-                                              forKey:@"EnableBottomToolbar"];
-
-    // Explicitly disconnect the mediator so there won't be any WebStateList
-    // observers when web_state_list_ gets dealloc.
-    [coordinator_ disconnect];
+  void SetUpTabStripCoordinator() {
+    coordinator_ = [[TabStripTabCoordinator alloc] init];
+    coordinator_.browser = GetBrowser();
+    coordinator_.webState = &web_state_;
   }
-  void TearDown() override {
-    if (coordinator_.started) {
-      [coordinator_ stop];
-    }
-    coordinator_ = nil;
+  TabContainerViewController* TabViewController() {
+    return base::mac::ObjCCastStrict<TabContainerViewController>(
+        coordinator_.viewController);
+  }
+  void EnableBottomToolbar() {
+    scoped_feature_list_.InitAndEnableFeature(kTabFeaturesBottomToolbar);
   }
 
  protected:
   TabCoordinator* coordinator_;
-
- private:
-  id initial_setting_;
-  base::MessageLoop loop_;
-  web::TestWebThread ui_thread_;
   ToolbarTestWebState web_state_;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 }  // namespace
 
-// TODO(crbug.com/759761): Reenable this test when threading issues are fixed
-// for this test fixture.
-TEST_F(TabCoordinatorTest, DISABLED_DefaultToolbar) {
-  [[NSUserDefaults standardUserDefaults] setObject:@""
-                                            forKey:@"EnableBottomToolbar"];
+// TODO(crbug.com/759761): Disabled due to threading issues.
+TEST_F(TabCoordinatorTest, DISABLED_DefaultTabContainer) {
+  SetUpDefaultCoordinator();
   [coordinator_ start];
-  EXPECT_EQ([TopToolbarTabViewController class],
+  EXPECT_EQ([TabContainerViewController class],
             [coordinator_.viewController class]);
 }
 
-// TODO(crbug.com/759761): Reenable this test when threading issues are fixed
-// for this test fixture.
+// TODO(crbug.com/759761): Disabled due to threading issues.
+TEST_F(TabCoordinatorTest, DISABLED_TabStripTabContainer) {
+  SetUpTabStripCoordinator();
+  [coordinator_ start];
+  EXPECT_EQ([TabStripTabContainerViewController class],
+            [coordinator_.viewController class]);
+}
+
+// TODO(crbug.com/759761): Disabled due to threading issues.
 TEST_F(TabCoordinatorTest, DISABLED_TopToolbar) {
-  [[NSUserDefaults standardUserDefaults] setObject:@"Disabled"
-                                            forKey:@"EnableBottomToolbar"];
+  SetUpDefaultCoordinator();
   [coordinator_ start];
-  EXPECT_EQ([TopToolbarTabViewController class],
-            [coordinator_.viewController class]);
+  EXPECT_EQ(NO, TabViewController().usesBottomToolbar);
 }
 
-// TODO(crbug.com/759761): Reenable this test when threading issues are fixed
-// for this test fixture.
-TEST_F(TabCoordinatorTest, DISABLED_BottomToolbar) {
-  [[NSUserDefaults standardUserDefaults] setObject:@"Enabled"
-                                            forKey:@"EnableBottomToolbar"];
+// TODO(crbug.com/759761): Disabled due to threading issues.
+TEST_F(TabCoordinatorTest, DISABLED_EnableBottomToolbar) {
+  EnableBottomToolbar();
+  SetUpDefaultCoordinator();
   [coordinator_ start];
-  EXPECT_EQ([BottomToolbarTabViewController class],
-            [coordinator_.viewController class]);
+  EXPECT_EQ(YES, TabViewController().usesBottomToolbar);
 }
diff --git a/ios/clean/chrome/browser/ui/tab/tab_features.cc b/ios/clean/chrome/browser/ui/tab/tab_features.cc
new file mode 100644
index 0000000..afb34064
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab/tab_features.cc
@@ -0,0 +1,11 @@
+// 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 "ios/clean/chrome/browser/ui/tab/tab_features.h"
+
+const base::Feature kTabFeaturesTabStrip{"TabFeaturesTabStrip",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kTabFeaturesBottomToolbar{
+    "TabFeaturesBottomToolbar", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/clean/chrome/browser/ui/tab/tab_features.h b/ios/clean/chrome/browser/ui/tab/tab_features.h
new file mode 100644
index 0000000..8b428f3
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab/tab_features.h
@@ -0,0 +1,16 @@
+// 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 IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_FEATURES_H_
+#define IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_FEATURES_H_
+
+#include "base/feature_list.h"
+
+// Used to control whether the new tab strip is used.
+extern const base::Feature kTabFeaturesTabStrip;
+
+// Used to control whether the toolbar is placed at the bottom.
+extern const base::Feature kTabFeaturesBottomToolbar;
+
+#endif  // IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_FEATURES_H_
diff --git a/ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.h b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.h
new file mode 100644
index 0000000..3343f13
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.h
@@ -0,0 +1,26 @@
+// 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 IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_STRIP_TAB_CONTAINER_VIEW_CONTROLLER_H_
+#define IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_STRIP_TAB_CONTAINER_VIEW_CONTROLLER_H_
+
+#import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h"
+
+#import <UIKit/UIKit.h>
+
+// Tab container that has a tab strip in addition to all the surfaces in the
+// basic tab container.
+@interface TabStripTabContainerViewController : TabContainerViewController
+
+// View controller showing the tab strip. It will be of a fixed
+// height (determined internally by the tab container), but will span the
+// width of the tab.
+@property(nonatomic, strong) UIViewController* tabStripViewController;
+
+// YES if |tabStripViewController| is currently visible.
+@property(nonatomic, assign, getter=isTabStripVisible) BOOL tabStripVisible;
+
+@end
+
+#endif  // IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_STRIP_TAB_CONTAINER_VIEW_CONTROLLER_H_
diff --git a/ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.mm b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.mm
new file mode 100644
index 0000000..776d617a
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.mm
@@ -0,0 +1,98 @@
+// 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.
+
+#import "ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.h"
+
+#import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller+internal.h"
+#import "ios/clean/chrome/browser/ui/ui_types.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+// Height of tabStripView when visible.
+const CGFloat kTabStripOpenHeight = 120.0f;
+// Height of tabStripView when not visible.
+const CGFloat kTabStripClosedHeight = 0.0f;
+}  // namespace
+
+@interface TabStripTabContainerViewController ()
+// Containing view for a child view controller. The child view controller's view
+// will completely fill this view.
+@property(nonatomic, strong) UIView* tabStripView;
+// Height constraint for tabStripView.
+@property(nonatomic, strong) NSLayoutConstraint* tabStripHeightConstraint;
+@end
+
+@implementation TabStripTabContainerViewController
+@synthesize tabStripViewController = _tabStripViewController;
+@synthesize tabStripVisible = _tabStripVisible;
+@synthesize tabStripView = _tabStripView;
+@synthesize tabStripHeightConstraint = _tabStripHeightConstraint;
+
+#pragma mark - Public properties
+
+- (void)setTabStripViewController:(UIViewController*)tabStripViewController {
+  if (_tabStripViewController == tabStripViewController)
+    return;
+  if ([self isViewLoaded]) {
+    [self detachChildViewController:_tabStripViewController];
+    [self attachChildViewController:tabStripViewController
+                          toSubview:self.tabStripView];
+  }
+  _tabStripViewController = tabStripViewController;
+}
+
+- (void)setTabStripVisible:(BOOL)tabStripVisible {
+  self.tabStripHeightConstraint.constant =
+      tabStripVisible ? kTabStripOpenHeight : kTabStripClosedHeight;
+  _tabStripVisible = tabStripVisible;
+}
+
+#pragma mark - TabContainerViewController(Internal) overrides
+
+- (void)configureSubviews {
+  [super configureSubviews];
+  self.tabStripView = [[UIView alloc] init];
+  self.tabStripView.translatesAutoresizingMaskIntoConstraints = NO;
+  self.tabStripView.backgroundColor = [UIColor blackColor];
+  // Insert below other views inserted in the super class.
+  [self.view insertSubview:self.tabStripView atIndex:0];
+  [self attachChildViewController:self.tabStripViewController
+                        toSubview:self.tabStripView];
+}
+
+- (Constraints*)containerConstraints {
+  self.tabStripHeightConstraint = [self.tabStripView.heightAnchor
+      constraintEqualToConstant:kTabStripClosedHeight];
+  return @[
+    // TabStrip constraints.
+    [self.tabStripView.topAnchor
+        constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor],
+    [self.tabStripView.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [self.tabStripView.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    self.tabStripHeightConstraint,
+
+    // Container constraints.
+    [self.containerView.topAnchor
+        constraintEqualToAnchor:self.tabStripView.bottomAnchor],
+    [self.containerView.bottomAnchor
+        constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor],
+    [self.containerView.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [self.containerView.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+  ];
+}
+
+#pragma mark - Tab Strip actions.
+
+- (void)hideTabStrip:(id)sender {
+  self.tabStripVisible = NO;
+}
+
+@end
diff --git a/ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.h b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.h
new file mode 100644
index 0000000..fa9a087
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.h
@@ -0,0 +1,14 @@
+// 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 IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_STRIP_TAB_COORDINATOR_H_
+#define IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_STRIP_TAB_COORDINATOR_H_
+
+#import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h"
+
+// A tab coordinator that also has a tab strip.
+@interface TabStripTabCoordinator : TabCoordinator
+@end
+
+#endif  // IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_STRIP_TAB_COORDINATOR_H_
diff --git a/ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.mm b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.mm
new file mode 100644
index 0000000..90bb779
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.mm
@@ -0,0 +1,84 @@
+// 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.
+
+#import "ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.h"
+
+#import "ios/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
+#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
+#import "ios/clean/chrome/browser/ui/commands/tab_strip_commands.h"
+#import "ios/clean/chrome/browser/ui/tab/tab_strip_tab_container_view_controller.h"
+#import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.h"
+#import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface TabStripTabCoordinator ()
+// Redefine |viewController| with a subclass.
+@property(nonatomic, strong) TabStripTabContainerViewController* viewController;
+// Defined in super class private category.
+@property(nonatomic, weak) ToolbarCoordinator* toolbarCoordinator;
+@end
+
+@implementation TabStripTabCoordinator
+@dynamic viewController;
+@dynamic toolbarCoordinator;
+
+#pragma mark - TabCoordinator overrides
+
+// Return a tab container with a tab strip.
+- (TabContainerViewController*)newTabContainer {
+  return [[TabStripTabContainerViewController alloc] init];
+}
+
+#pragma mark - BrowserCoordinator
+
+- (void)start {
+  if (self.started)
+    return;
+  TabStripCoordinator* tabStripCoordinator = [[TabStripCoordinator alloc] init];
+  [self addChildCoordinator:tabStripCoordinator];
+  [tabStripCoordinator start];
+  [self.browser->dispatcher() startDispatchingToTarget:self
+                                           forSelector:@selector(showTabStrip)];
+
+  [super start];
+
+  [self.browser->broadcaster()
+      broadcastValue:@"tabStripVisible"
+            ofObject:self.viewController
+            selector:@selector(broadcastTabStripVisible:)];
+}
+
+- (void)stop {
+  [super stop];
+  [self.browser->broadcaster()
+      stopBroadcastingForSelector:@selector(broadcastTabStripVisible:)];
+}
+
+- (void)addChildCoordinator:(BrowserCoordinator*)childCoordinator {
+  [super addChildCoordinator:childCoordinator];
+  if ([childCoordinator isKindOfClass:[ToolbarCoordinator class]]) {
+    self.toolbarCoordinator.usesTabStrip = YES;
+  }
+}
+
+- (void)childCoordinatorDidStart:(BrowserCoordinator*)childCoordinator {
+  [super childCoordinatorDidStart:childCoordinator];
+  if ([childCoordinator isKindOfClass:[TabStripCoordinator class]]) {
+    self.viewController.tabStripViewController =
+        childCoordinator.viewController;
+  }
+}
+
+#pragma mark - TabStripCommands
+
+- (void)showTabStrip {
+  self.viewController.tabStripVisible = YES;
+}
+
+@end
diff --git a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
index 84d8953..eabd648 100644
--- a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
@@ -28,6 +28,7 @@
     "//ios/clean/chrome/browser/ui/overlays",
     "//ios/clean/chrome/browser/ui/settings",
     "//ios/clean/chrome/browser/ui/tab",
+    "//ios/clean/chrome/browser/ui/tab:features",
     "//ios/clean/chrome/browser/ui/tab_collection",
     "//ios/clean/chrome/browser/ui/tab_collection:tab_collection_ui",
     "//ios/clean/chrome/browser/ui/tools",
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
index d08e0f91..be7669f 100644
--- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -27,6 +27,8 @@
 #import "ios/clean/chrome/browser/ui/overlays/overlay_service_observer_bridge.h"
 #import "ios/clean/chrome/browser/ui/settings/settings_coordinator.h"
 #import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h"
+#include "ios/clean/chrome/browser/ui/tab/tab_features.h"
+#import "ios/clean/chrome/browser/ui/tab/tab_strip_tab_coordinator.h"
 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_mediator.h"
 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h"
 #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h"
@@ -87,6 +89,8 @@
 #pragma mark - BrowserCoordinator
 
 - (void)start {
+  if (self.started)
+    return;
   self.mediator = [[TabGridMediator alloc] init];
   self.mediator.webStateList = &self.webStateList;
 
@@ -199,7 +203,7 @@
   // on its own.
   [self.activeTabCoordinator stop];
   [self removeChildCoordinator:self.activeTabCoordinator];
-  TabCoordinator* tabCoordinator = [[TabCoordinator alloc] init];
+  TabCoordinator* tabCoordinator = [self newTabCoordinator];
   self.activeTabCoordinator = tabCoordinator;
   tabCoordinator.webState = self.webStateList.GetWebStateAt(index);
   tabCoordinator.presentationKey =
@@ -258,18 +262,16 @@
 #pragma mark - URLOpening
 
 - (void)openURL:(NSURL*)URL {
-  if (self.webStateList.active_index() == WebStateList::kInvalidIndex) {
+  if (self.webStateList.active_index() == WebStateList::kInvalidIndex)
     return;
-  }
   [self.overlayCoordinator stop];
   [self removeOverlayCoordinator];
   web::WebState* activeWebState = self.webStateList.GetActiveWebState();
   web::NavigationManager::WebLoadParams params(net::GURLWithNSURL(URL));
   params.transition_type = ui::PAGE_TRANSITION_LINK;
   activeWebState->GetNavigationManager()->LoadURLWithParams(params);
-  if (!self.children.count) {
+  if (!self.children.count)
     [self showTabGridTabAtIndex:self.webStateList.active_index()];
-  }
 }
 
 #pragma mark - PrivateMethods
@@ -322,4 +324,12 @@
       stopDispatchingForSelector:@selector(closeToolsMenu)];
 }
 
+// Creates and returns a tab coordinator based on whether the tap strip is
+// enabled.
+- (TabCoordinator*)newTabCoordinator {
+  return base::FeatureList::IsEnabled(kTabFeaturesTabStrip)
+             ? [[TabStripTabCoordinator alloc] init]
+             : [[TabCoordinator alloc] init];
+}
+
 @end
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h
index bb33c58..daf5dc1 100644
--- a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h
+++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h
@@ -15,6 +15,10 @@
 @interface ToolbarCoordinator : BrowserCoordinator
 // The web state this ToolbarCoordinator is handling.
 @property(nonatomic, assign) web::WebState* webState;
+
+// By default, this component does not interact with the tab strip. Setting
+// |usesTabStrip| to YES, allows interaction with the tab strip.
+@property(nonatomic, assign) BOOL usesTabStrip;
 @end
 
 #endif  // IOS_CLEAN_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_H_
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
index 99ddf639..84ed1a6 100644
--- a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
@@ -45,6 +45,7 @@
 @synthesize viewController = _viewController;
 @synthesize webState = _webState;
 @synthesize mediator = _mediator;
+@synthesize usesTabStrip = _usesTabStrip;
 
 - (instancetype)init {
   if ((self = [super init])) {
@@ -58,12 +59,20 @@
   self.mediator.webState = self.webState;
 }
 
+- (void)setUsesTabStrip:(BOOL)usesTabStrip {
+  DCHECK(!self.started);
+  _usesTabStrip = usesTabStrip;
+}
+
+#pragma mark - BrowserCoordinator
+
 - (void)start {
   if (self.started)
     return;
 
   self.viewController = [[ToolbarViewController alloc]
       initWithDispatcher:static_cast<id>(self.browser->dispatcher())];
+  self.viewController.usesTabStrip = self.usesTabStrip;
 
   CommandDispatcher* dispatcher = self.browser->dispatcher();
   [dispatcher startDispatchingToTarget:self
@@ -76,23 +85,26 @@
   self.mediator.consumer = self.viewController;
   self.mediator.webStateList = &self.browser->web_state_list();
 
-  [self.browser->broadcaster()
-      addObserver:self.mediator
-      forSelector:@selector(broadcastTabStripVisible:)];
+  if (self.usesTabStrip) {
+    [self.browser->broadcaster()
+        addObserver:self.mediator
+        forSelector:@selector(broadcastTabStripVisible:)];
+  }
   LocationBarCoordinator* locationBarCoordinator =
       [[LocationBarCoordinator alloc] init];
   self.locationBarCoordinator = locationBarCoordinator;
   [self addChildCoordinator:locationBarCoordinator];
   [locationBarCoordinator start];
-
   [super start];
 }
 
 - (void)stop {
   [super stop];
-  [self.browser->broadcaster()
-      removeObserver:self.mediator
-         forSelector:@selector(broadcastTabStripVisible:)];
+  if (self.usesTabStrip) {
+    [self.browser->broadcaster()
+        removeObserver:self.mediator
+           forSelector:@selector(broadcastTabStripVisible:)];
+  }
   [self.browser->dispatcher() stopDispatchingToTarget:self];
 }
 
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.h b/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.h
index 6687a102..471928d01 100644
--- a/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.h
+++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.h
@@ -46,6 +46,11 @@
 
 @property(nonatomic, strong) UIViewController* locationBarViewController;
 
+// By default, this view controller does not interact with the tab strip. When
+// |usesTabStrip| is YES, the tab switcher button first displays the tab strip.
+// A second tap on the tab switcher displays the tab grid.
+@property(nonatomic, assign) BOOL usesTabStrip;
+
 @end
 
 #endif  // IOS_CLEAN_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_VIEW_CONTROLLER_H_
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.mm b/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.mm
index c7042f08..ee00a65e 100644
--- a/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.mm
+++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.mm
@@ -49,6 +49,7 @@
 @synthesize reloadButton = _reloadButton;
 @synthesize stopButton = _stopButton;
 @synthesize progressBar = _progressBar;
+@synthesize usesTabStrip = _usesTabStrip;
 
 - (instancetype)init {
   self = [super init];
@@ -180,8 +181,8 @@
   [buttonConstraints
       addObject:[self.tabSwitchStripButton.widthAnchor
                     constraintEqualToConstant:kToolbarButtonWidth]];
-  [self.tabSwitchStripButton addTarget:self.dispatcher
-                                action:@selector(showTabStrip)
+  [self.tabSwitchStripButton addTarget:self
+                                action:@selector(tabSwitcherButtonTapped:)
                       forControlEvents:UIControlEventTouchUpInside];
   [self.tabSwitchStripButton
       setTitleColor:UIColorFromRGB(kToolbarButtonTitleNormalColor)
@@ -482,4 +483,13 @@
                                         completion:nil];
 }
 
+#pragma mark - Button actions
+
+// The action performed depends on the experimental setting of using the tab
+// strip.
+- (void)tabSwitcherButtonTapped:(id)sender {
+  self.usesTabStrip ? [self.dispatcher showTabStrip]
+                    : [self.dispatcher showTabGrid];
+}
+
 @end
diff --git a/ios/clean/chrome/browser/ui/url_loader_adaptor.h b/ios/clean/chrome/browser/ui/url_loader_adaptor.h
new file mode 100644
index 0000000..5073038
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/url_loader_adaptor.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 IOS_CLEAN_CHROME_BROWSER_UI_URL_LOADER_ADAPTOR_H_
+#define IOS_CLEAN_CHROME_BROWSER_UI_URL_LOADER_ADAPTOR_H_
+
+#import "ios/chrome/browser/ui/url_loader.h"
+
+// URL loader to be used for components from the old architecture.
+// TODO(crbug.com/740793): This class should be hooked with the new architecture
+// way of loading URL. Once it is done, remove alerts
+@interface URLLoaderAdaptor : NSObject<UrlLoader>
+
+// TODO(crbug.com/740793): Remove alert once this class is functional.
+@property(nonatomic, strong) UIViewController* viewControllerForAlert;
+
+@end
+
+#endif  // IOS_CLEAN_CHROME_BROWSER_UI_URL_LOADER_ADAPTOR_H_
diff --git a/ios/clean/chrome/browser/ui/url_loader_adaptor.mm b/ios/clean/chrome/browser/ui/url_loader_adaptor.mm
new file mode 100644
index 0000000..fabbf29
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/url_loader_adaptor.mm
@@ -0,0 +1,76 @@
+// 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.
+
+#import "ios/clean/chrome/browser/ui/url_loader_adaptor.h"
+
+#include "base/strings/sys_string_conversions.h"
+#include "ios/web/public/referrer.h"
+#include "url/gurl.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation URLLoaderAdaptor
+
+@synthesize viewControllerForAlert = _viewControllerForAlert;
+
+#pragma mark - UrlLoader
+
+- (void)loadURL:(const GURL&)url
+             referrer:(const web::Referrer&)referrer
+           transition:(ui::PageTransition)transition
+    rendererInitiated:(BOOL)rendererInitiated {
+  // TODO(crbug.com/740793): Remove alert once there is a way to open URL.
+  [self showAlert:[NSString
+                      stringWithFormat:@"Open URL: %@",
+                                       base::SysUTF8ToNSString(url.spec())]];
+}
+
+- (void)webPageOrderedOpen:(const GURL&)url
+                  referrer:(const web::Referrer&)referrer
+              inBackground:(BOOL)inBackground
+                  appendTo:(OpenPosition)appendTo {
+  [self showAlert:[NSString
+                      stringWithFormat:@"Open new tab with URL: %@",
+                                       base::SysUTF8ToNSString(url.spec())]];
+}
+
+- (void)webPageOrderedOpen:(const GURL&)url
+                  referrer:(const web::Referrer&)referrer
+               inIncognito:(BOOL)inIncognito
+              inBackground:(BOOL)inBackground
+                  appendTo:(OpenPosition)appendTo {
+  [self showAlert:[NSString
+                      stringWithFormat:@"Open new tab with URL: %@",
+                                       base::SysUTF8ToNSString(url.spec())]];
+}
+
+- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab {
+  [self showAlert:@"Load session tab"];
+}
+
+- (void)loadJavaScriptFromLocationBar:(NSString*)script {
+  [self showAlert:@"Load javascript"];
+}
+
+#pragma mark - Private Methods
+
+// TODO(crbug.com/740793): Remove this method once no method is using it.
+- (void)showAlert:(NSString*)message {
+  UIAlertController* alertController =
+      [UIAlertController alertControllerWithTitle:message
+                                          message:nil
+                                   preferredStyle:UIAlertControllerStyleAlert];
+  UIAlertAction* action =
+      [UIAlertAction actionWithTitle:@"Done"
+                               style:UIAlertActionStyleCancel
+                             handler:nil];
+  [alertController addAction:action];
+  [self.viewControllerForAlert presentViewController:alertController
+                                            animated:YES
+                                          completion:nil];
+}
+
+@end
diff --git a/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.mm b/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.mm
index ae2c688..e977334 100644
--- a/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.mm
+++ b/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.mm
@@ -15,9 +15,19 @@
 @synthesize baseViewController;
 
 - (void)start {
-  UIViewController* bottomToolbarTabViewController =
-      [[BottomToolbarTabViewController alloc] init];
+  TabContainerViewController* bottomToolbarTabViewController =
+      [[TabContainerViewController alloc] init];
+  bottomToolbarTabViewController.usesBottomToolbar = YES;
   bottomToolbarTabViewController.title = @"Bottom toolbar tab";
+
+  UIViewController* toolbar = [[UIViewController alloc] init];
+  toolbar.view.backgroundColor = [UIColor greenColor];
+  bottomToolbarTabViewController.toolbarViewController = toolbar;
+
+  UIViewController* content = [[UIViewController alloc] init];
+  content.view.backgroundColor = [UIColor whiteColor];
+  bottomToolbarTabViewController.contentViewController = content;
+
   [self.baseViewController pushViewController:bottomToolbarTabViewController
                                      animated:YES];
 }
diff --git a/ios/showcase/tab/sc_top_toolbar_tab_coordinator.mm b/ios/showcase/tab/sc_top_toolbar_tab_coordinator.mm
index 563dfcd..8c8c6ab 100644
--- a/ios/showcase/tab/sc_top_toolbar_tab_coordinator.mm
+++ b/ios/showcase/tab/sc_top_toolbar_tab_coordinator.mm
@@ -15,9 +15,18 @@
 @synthesize baseViewController;
 
 - (void)start {
-  UIViewController* topToolbarTabViewController =
-      [[TopToolbarTabViewController alloc] init];
+  TabContainerViewController* topToolbarTabViewController =
+      [[TabContainerViewController alloc] init];
   topToolbarTabViewController.title = @"Top toolbar tab";
+
+  UIViewController* toolbar = [[UIViewController alloc] init];
+  toolbar.view.backgroundColor = [UIColor greenColor];
+  topToolbarTabViewController.toolbarViewController = toolbar;
+
+  UIViewController* content = [[UIViewController alloc] init];
+  content.view.backgroundColor = [UIColor whiteColor];
+  topToolbarTabViewController.contentViewController = content;
+
   [self.baseViewController pushViewController:topToolbarTabViewController
                                      animated:YES];
 }
diff --git a/ios/showcase/toolbar/sc_toolbar_coordinator.mm b/ios/showcase/toolbar/sc_toolbar_coordinator.mm
index 23fbaf2..36f9f0c 100644
--- a/ios/showcase/toolbar/sc_toolbar_coordinator.mm
+++ b/ios/showcase/toolbar/sc_toolbar_coordinator.mm
@@ -49,6 +49,7 @@
                      ToolsMenuCommands>>(self.alerter);
   ToolbarViewController* toolbarViewController =
       [[ToolbarViewController alloc] initWithDispatcher:dispatcher];
+  toolbarViewController.usesTabStrip = YES;
   [containerViewController addChildViewController:toolbarViewController];
   toolbarViewController.view.frame = containerView.frame;
   [containerView addSubview:toolbarViewController.view];
diff --git a/ios/third_party/material_components_ios/README.chromium b/ios/third_party/material_components_ios/README.chromium
index 64bc0c49..8f47dc53 100644
--- a/ios/third_party/material_components_ios/README.chromium
+++ b/ios/third_party/material_components_ios/README.chromium
@@ -1,7 +1,7 @@
 Name: Material Components for iOS
 URL: https://github.com/material-components/material-components-ios
 Version: 0
-Revision: 7026a1f8016419aa2a05ff08b3897a9878aeae63
+Revision: 604d601bf8e4db1e1d8e16960d20339509735f6a
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/ios/web_view/internal/web_view_java_script_dialog_presenter.h b/ios/web_view/internal/web_view_java_script_dialog_presenter.h
index 1bc856b6..7c1859e 100644
--- a/ios/web_view/internal/web_view_java_script_dialog_presenter.h
+++ b/ios/web_view/internal/web_view_java_script_dialog_presenter.h
@@ -15,7 +15,8 @@
 
 // WebView implementation of JavaScriptDialogPresenter. Passes JavaScript alert
 // handling to |ui_delegate_|.
-class WebViewJavaScriptDialogPresenter : public web::JavaScriptDialogPresenter {
+class WebViewJavaScriptDialogPresenter final
+    : public web::JavaScriptDialogPresenter {
  public:
   WebViewJavaScriptDialogPresenter(CWVWebView* web_view,
                                    id<CWVUIDelegate> ui_delegate);
diff --git a/ipc/README.md b/ipc/README.md
index 250a159..c30689a 100644
--- a/ipc/README.md
+++ b/ipc/README.md
@@ -548,20 +548,8 @@
 `foo::mojom::MyGiganticStructure` to `foo::MyGiganticStructure`, your typemap
 must point to some header which defines
 `IPC::ParamTraits<foo::MyGiganticStructure>`.
-
-Note that if your `ParamTraits` are defined manually (*i.e.* not by invocation
-of `IPC_STRUCT_TRAITS*` macros) you must also ensure that they define the new
-`GetSize` method:
-
-``` cpp
-static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-  // ...
-}
 ```
 
-`base::PickleSizer` has an interface analogous to `base::Pickle`, except that it
-merely accumulates a byte count rather than accumulating serialized data.
-
 There are several examples of this traits implementation in common IPC traits
 defined [here](https://code.google.com/p/chromium/codesearch#chromium/src/ipc/ipc_message_utils.h).
 
diff --git a/ipc/ipc_message_macros.h b/ipc/ipc_message_macros.h
index 4fcaa16..a53e12d 100644
--- a/ipc/ipc_message_macros.h
+++ b/ipc/ipc_message_macros.h
@@ -45,11 +45,6 @@
 //     // Generate destructors.
 //     #include "ipc/struct_destructor_macros.h"
 //     #include "path/to/YYY_message_generator.h"
-//     // Generate param traits size methods.
-//     #include "ipc/param_traits_size_macros.h"
-//     namespace IPC {
-//     #include "path/to/YYY_message_generator.h"
-//     }  // namespace IPC
 //     // Generate param traits write methods.
 //     #include "ipc/param_traits_write_macros.h"
 //     namespace IPC {
diff --git a/ipc/ipc_message_protobuf_utils.h b/ipc/ipc_message_protobuf_utils.h
index 8cacfe8..0168b15 100644
--- a/ipc/ipc_message_protobuf_utils.h
+++ b/ipc/ipc_message_protobuf_utils.h
@@ -23,11 +23,6 @@
 template <class RepeatedFieldLike, class StorageType>
 struct RepeatedFieldParamTraits {
   typedef RepeatedFieldLike param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.size());
-    for (int i = 0; i < p.size(); i++)
-      GetParamSize(sizer, p.Get(i));
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, p.size());
     for (int i = 0; i < p.size(); i++)
diff --git a/ipc/ipc_message_protobuf_utils_unittest.cc b/ipc/ipc_message_protobuf_utils_unittest.cc
index 5c01a7f..61421c6e 100644
--- a/ipc/ipc_message_protobuf_utils_unittest.cc
+++ b/ipc/ipc_message_protobuf_utils_unittest.cc
@@ -24,9 +24,6 @@
 template <>
 struct ParamTraits<ipc_message_utils_test::TestMessage1> {
   typedef ipc_message_utils_test::TestMessage1 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.number());
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, p.number());
   }
@@ -44,11 +41,6 @@
 template <>
 struct ParamTraits<ipc_message_utils_test::TestMessage2> {
   typedef ipc_message_utils_test::TestMessage2 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.numbers());
-    GetParamSize(sizer, p.strings());
-    GetParamSize(sizer, p.messages());
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, p.numbers());
     WriteParam(m, p.strings());
@@ -99,11 +91,6 @@
   base::Pickle pickle;
   IPC::WriteParam(&pickle, message);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, message);
-
-  ASSERT_EQ(sizer.payload_size(), pickle.payload_size());
-
   base::PickleIterator iter(pickle);
   ipc_message_utils_test::TestMessage2 output;
   ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
@@ -124,11 +111,6 @@
   base::Pickle pickle;
   IPC::WriteParam(&pickle, message);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, message);
-
-  ASSERT_EQ(sizer.payload_size(), pickle.payload_size());
-
   base::PickleIterator iter(pickle);
   ipc_message_utils_test::TestMessage2 output;
   ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
@@ -144,11 +126,6 @@
   base::Pickle pickle;
   IPC::WriteParam(&pickle, message);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, message);
-
-  ASSERT_EQ(sizer.payload_size(), pickle.payload_size());
-
   base::PickleIterator iter(pickle);
   ipc_message_utils_test::TestMessage2 output;
   ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
index dd065fd..285e4842 100644
--- a/ipc/ipc_message_utils.cc
+++ b/ipc/ipc_message_utils.cc
@@ -77,69 +77,6 @@
                std::unique_ptr<base::Value>* value,
                int recursion);
 
-void GetValueSize(base::PickleSizer* sizer,
-                  const base::Value* value,
-                  int recursion) {
-  if (recursion > kMaxRecursionDepth) {
-    LOG(ERROR) << "Max recursion depth hit in GetValueSize.";
-    return;
-  }
-
-  sizer->AddInt();
-  switch (value->GetType()) {
-    case base::Value::Type::NONE:
-      break;
-    case base::Value::Type::BOOLEAN:
-      sizer->AddBool();
-      break;
-    case base::Value::Type::INTEGER:
-      sizer->AddInt();
-      break;
-    case base::Value::Type::DOUBLE:
-      sizer->AddDouble();
-      break;
-    case base::Value::Type::STRING: {
-      const base::Value* result;
-      value->GetAsString(&result);
-      if (value->GetAsString(&result)) {
-        DCHECK(result);
-        GetParamSize(sizer, result->GetString());
-      } else {
-        std::string str;
-        bool as_string_result = value->GetAsString(&str);
-        DCHECK(as_string_result);
-        GetParamSize(sizer, str);
-      }
-      break;
-    }
-    case base::Value::Type::BINARY: {
-      sizer->AddData(static_cast<int>(value->GetBlob().size()));
-      break;
-    }
-    case base::Value::Type::DICTIONARY: {
-      sizer->AddInt();
-      const base::DictionaryValue* dict =
-          static_cast<const base::DictionaryValue*>(value);
-      for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
-           it.Advance()) {
-        GetParamSize(sizer, it.key());
-        GetValueSize(sizer, &it.value(), recursion + 1);
-      }
-      break;
-    }
-    case base::Value::Type::LIST: {
-      sizer->AddInt();
-      const base::ListValue* list = static_cast<const base::ListValue*>(value);
-      for (const auto& entry : *list) {
-        GetValueSize(sizer, &entry, recursion + 1);
-      }
-      break;
-    }
-    default:
-      NOTREACHED() << "Invalid base::Value type.";
-  }
-}
-
 void WriteValue(base::Pickle* m, const base::Value* value, int recursion) {
   bool result;
   if (recursion > kMaxRecursionDepth) {
@@ -346,11 +283,6 @@
   l->append(p ? "true" : "false");
 }
 
-void ParamTraits<signed char>::GetSize(base::PickleSizer* sizer,
-                                       const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
 void ParamTraits<signed char>::Write(base::Pickle* m, const param_type& p) {
   m->WriteBytes(&p, sizeof(param_type));
 }
@@ -369,11 +301,6 @@
   l->append(base::IntToString(p));
 }
 
-void ParamTraits<unsigned char>::GetSize(base::PickleSizer* sizer,
-                                       const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
 void ParamTraits<unsigned char>::Write(base::Pickle* m, const param_type& p) {
   m->WriteBytes(&p, sizeof(param_type));
 }
@@ -392,11 +319,6 @@
   l->append(base::UintToString(p));
 }
 
-void ParamTraits<unsigned short>::GetSize(base::PickleSizer* sizer,
-                                          const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
 void ParamTraits<unsigned short>::Write(base::Pickle* m, const param_type& p) {
   m->WriteBytes(&p, sizeof(param_type));
 }
@@ -446,11 +368,6 @@
   l->append(base::StringPrintf("%e", p));
 }
 
-void ParamTraits<double>::GetSize(base::PickleSizer* sizer,
-                                  const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
 void ParamTraits<double>::Write(base::Pickle* m, const param_type& p) {
   m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type));
 }
@@ -480,11 +397,6 @@
   l->append(base::UTF16ToUTF8(p));
 }
 
-void ParamTraits<std::vector<char>>::GetSize(base::PickleSizer* sizer,
-                                             const param_type& p) {
-  sizer->AddData(static_cast<int>(p.size()));
-}
-
 void ParamTraits<std::vector<char>>::Write(base::Pickle* m,
                                            const param_type& p) {
   if (p.empty()) {
@@ -511,11 +423,6 @@
   LogBytes(p, l);
 }
 
-void ParamTraits<std::vector<unsigned char>>::GetSize(base::PickleSizer* sizer,
-                                                      const param_type& p) {
-  sizer->AddData(static_cast<int>(p.size()));
-}
-
 void ParamTraits<std::vector<unsigned char>>::Write(base::Pickle* m,
                                                     const param_type& p) {
   if (p.empty()) {
@@ -544,13 +451,6 @@
   LogBytes(p, l);
 }
 
-void ParamTraits<std::vector<bool>>::GetSize(base::PickleSizer* sizer,
-                                             const param_type& p) {
-  GetParamSize(sizer, static_cast<int>(p.size()));
-  for (size_t i = 0; i < p.size(); ++i)
-    GetParamSize(sizer, static_cast<bool>(p[i]));
-}
-
 void ParamTraits<std::vector<bool>>::Write(base::Pickle* m,
                                            const param_type& p) {
   WriteParam(m, static_cast<int>(p.size()));
@@ -586,11 +486,6 @@
   }
 }
 
-void ParamTraits<base::DictionaryValue>::GetSize(base::PickleSizer* sizer,
-                                                 const param_type& p) {
-  GetValueSize(sizer, &p, 0);
-}
-
 void ParamTraits<base::DictionaryValue>::Write(base::Pickle* m,
                                                const param_type& p) {
   WriteValue(m, &p, 0);
@@ -615,13 +510,6 @@
 }
 
 #if defined(OS_POSIX)
-void ParamTraits<base::FileDescriptor>::GetSize(base::PickleSizer* sizer,
-                                                const param_type& p) {
-  GetParamSize(sizer, p.fd >= 0);
-  if (p.fd >= 0)
-    sizer->AddAttachment();
-}
-
 void ParamTraits<base::FileDescriptor>::Write(base::Pickle* m,
                                               const param_type& p) {
   // This serialization must be kept in sync with
@@ -680,24 +568,6 @@
 }
 #endif  // defined(OS_POSIX)
 
-void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer,
-                                                    const param_type& p) {
-  GetParamSize(sizer, p.IsValid());
-  if (!p.IsValid())
-    return;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  GetParamSize(sizer, p.GetMemoryObject());
-#elif defined(OS_WIN)
-  GetParamSize(sizer, p.GetHandle());
-#else
-  sizer->AddAttachment();
-#endif
-
-  GetParamSize(sizer, p.GetGUID());
-  GetParamSize(sizer, static_cast<uint64_t>(p.GetSize()));
-}
-
 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
                                                   const param_type& p) {
   // This serialization must be kept in sync with
@@ -822,13 +692,6 @@
 }
 
 #if defined(OS_WIN)
-void ParamTraits<PlatformFileForTransit>::GetSize(base::PickleSizer* s,
-                                                  const param_type& p) {
-  GetParamSize(s, p.IsValid());
-  if (p.IsValid())
-    GetParamSize(s, p.GetHandle());
-}
-
 void ParamTraits<PlatformFileForTransit>::Write(base::Pickle* m,
                                                 const param_type& p) {
   m->WriteBool(p.IsValid());
@@ -863,11 +726,6 @@
 }
 #endif  // defined(OS_WIN)
 
-void ParamTraits<base::FilePath>::GetSize(base::PickleSizer* sizer,
-                                          const param_type& p) {
-  p.GetSizeForPickle(sizer);
-}
-
 void ParamTraits<base::FilePath>::Write(base::Pickle* m, const param_type& p) {
   p.WriteToPickle(m);
 }
@@ -882,11 +740,6 @@
   ParamTraits<base::FilePath::StringType>::Log(p.value(), l);
 }
 
-void ParamTraits<base::ListValue>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  GetValueSize(sizer, &p, 0);
-}
-
 void ParamTraits<base::ListValue>::Write(base::Pickle* m, const param_type& p) {
   WriteValue(m, &p, 0);
 }
@@ -908,12 +761,6 @@
   l->append(json);
 }
 
-void ParamTraits<base::NullableString16>::GetSize(base::PickleSizer* sizer,
-                                                  const param_type& p) {
-  GetParamSize(sizer, p.string());
-  GetParamSize(sizer, p.is_null());
-}
-
 void ParamTraits<base::NullableString16>::Write(base::Pickle* m,
                                                 const param_type& p) {
   WriteParam(m, p.string());
@@ -942,15 +789,6 @@
   l->append(")");
 }
 
-void ParamTraits<base::File::Info>::GetSize(base::PickleSizer* sizer,
-                                            const param_type& p) {
-  GetParamSize(sizer, p.size);
-  GetParamSize(sizer, p.is_directory);
-  GetParamSize(sizer, p.last_modified.ToDoubleT());
-  GetParamSize(sizer, p.last_accessed.ToDoubleT());
-  GetParamSize(sizer, p.creation_time.ToDoubleT());
-}
-
 void ParamTraits<base::File::Info>::Write(base::Pickle* m,
                                           const param_type& p) {
   WriteParam(m, p.size);
@@ -991,11 +829,6 @@
   l->append(")");
 }
 
-void ParamTraits<base::Time>::GetSize(base::PickleSizer* sizer,
-                                      const param_type& p) {
-  sizer->AddInt64();
-}
-
 void ParamTraits<base::Time>::Write(base::Pickle* m, const param_type& p) {
   ParamTraits<int64_t>::Write(m, p.ToInternalValue());
 }
@@ -1014,11 +847,6 @@
   ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
 }
 
-void ParamTraits<base::TimeDelta>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  sizer->AddInt64();
-}
-
 void ParamTraits<base::TimeDelta>::Write(base::Pickle* m, const param_type& p) {
   ParamTraits<int64_t>::Write(m, p.ToInternalValue());
 }
@@ -1038,11 +866,6 @@
   ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
 }
 
-void ParamTraits<base::TimeTicks>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  sizer->AddInt64();
-}
-
 void ParamTraits<base::TimeTicks>::Write(base::Pickle* m, const param_type& p) {
   ParamTraits<int64_t>::Write(m, p.ToInternalValue());
 }
@@ -1067,11 +890,6 @@
 static_assert(sizeof(base::UnguessableToken) == 2 * sizeof(uint64_t),
               "base::UnguessableToken should be of size 2 * sizeof(uint64_t).");
 
-void ParamTraits<base::UnguessableToken>::GetSize(base::PickleSizer* sizer,
-                                                  const param_type& p) {
-  sizer->AddBytes(2 * sizeof(uint64_t));
-}
-
 void ParamTraits<base::UnguessableToken>::Write(base::Pickle* m,
                                                 const param_type& p) {
   DCHECK(!p.is_empty());
@@ -1103,15 +921,6 @@
   l->append(p.ToString());
 }
 
-void ParamTraits<IPC::ChannelHandle>::GetSize(base::PickleSizer* sizer,
-                                              const param_type& p) {
-#if defined(OS_NACL_SFI)
-  GetParamSize(sizer, p.socket);
-#else
-  GetParamSize(sizer, p.mojo_handle);
-#endif
-}
-
 void ParamTraits<IPC::ChannelHandle>::Write(base::Pickle* m,
                                             const param_type& p) {
 #if defined(OS_NACL_SFI)
@@ -1142,19 +951,6 @@
   l->append(")");
 }
 
-void ParamTraits<LogData>::GetSize(base::PickleSizer* sizer,
-                                   const param_type& p) {
-  GetParamSize(sizer, p.channel);
-  GetParamSize(sizer, p.routing_id);
-  GetParamSize(sizer, p.type);
-  GetParamSize(sizer, p.flags);
-  GetParamSize(sizer, p.sent);
-  GetParamSize(sizer, p.receive);
-  GetParamSize(sizer, p.dispatch);
-  GetParamSize(sizer, p.message_name);
-  GetParamSize(sizer, p.params);
-}
-
 void ParamTraits<LogData>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.channel);
   WriteParam(m, p.routing_id);
@@ -1232,11 +1028,6 @@
 }
 
 #if defined(OS_WIN)
-void ParamTraits<HANDLE>::GetSize(base::PickleSizer* sizer,
-                                  const param_type& p) {
-  sizer->AddInt();
-}
-
 // Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64
 // bit systems. That's why we use the Windows macros to convert to 32 bits.
 void ParamTraits<HANDLE>::Write(base::Pickle* m, const param_type& p) {
@@ -1257,11 +1048,6 @@
   l->append(base::StringPrintf("0x%p", p));
 }
 
-void ParamTraits<LOGFONT>::GetSize(base::PickleSizer* sizer,
-                                   const param_type& p) {
-  sizer->AddData(sizeof(LOGFONT));
-}
-
 void ParamTraits<LOGFONT>::Write(base::Pickle* m, const param_type& p) {
   m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT));
 }
@@ -1287,10 +1073,6 @@
   l->append(base::StringPrintf("<LOGFONT>"));
 }
 
-void ParamTraits<MSG>::GetSize(base::PickleSizer* sizer, const param_type& p) {
-  sizer->AddData(sizeof(MSG));
-}
-
 void ParamTraits<MSG>::Write(base::Pickle* m, const param_type& p) {
   m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG));
 }
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
index 348ff7e..1beac85 100644
--- a/ipc/ipc_message_utils.h
+++ b/ipc/ipc_message_utils.h
@@ -87,12 +87,6 @@
   typedef std::tuple<Ts...> Tuple;
 };
 
-template <class P>
-static inline void GetParamSize(base::PickleSizer* sizer, const P& p) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  ParamTraits<Type>::GetSize(sizer, static_cast<const Type&>(p));
-}
-
 // This function is checked by 'IPC checker' part of find-bad-constructs
 // Clang plugin to make it's not called on the following types:
 // 1. long / unsigned long (but not typedefs to)
@@ -125,9 +119,6 @@
 template <>
 struct ParamTraits<bool> {
   typedef bool param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddBool();
-  }
   static void Write(base::Pickle* m, const param_type& p) { m->WriteBool(p); }
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -140,7 +131,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<signed char> {
   typedef signed char param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -151,7 +141,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<unsigned char> {
   typedef unsigned char param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -162,7 +151,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<unsigned short> {
   typedef unsigned short param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -173,9 +161,6 @@
 template <>
 struct ParamTraits<int> {
   typedef int param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt();
-  }
   static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); }
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -188,9 +173,6 @@
 template <>
 struct ParamTraits<unsigned int> {
   typedef unsigned int param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt();
-  }
   static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); }
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -216,9 +198,6 @@
 template <>
 struct ParamTraits<long> {
   typedef long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddLong();
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     m->WriteLong(p);
   }
@@ -233,9 +212,6 @@
 template <>
 struct ParamTraits<unsigned long> {
   typedef unsigned long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddLong();
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     m->WriteLong(p);
   }
@@ -251,9 +227,6 @@
 template <>
 struct ParamTraits<long long> {
   typedef long long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt64();
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     m->WriteInt64(static_cast<int64_t>(p));
   }
@@ -268,9 +241,6 @@
 template <>
 struct ParamTraits<unsigned long long> {
   typedef unsigned long long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt64();
-  }
   static void Write(base::Pickle* m, const param_type& p) { m->WriteInt64(p); }
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -286,9 +256,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<float> {
   typedef float param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddFloat();
-  }
   static void Write(base::Pickle* m, const param_type& p) { m->WriteFloat(p); }
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -301,7 +268,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<double> {
   typedef double param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -312,10 +278,6 @@
 template <class P, size_t Size>
 struct ParamTraits<P[Size]> {
   using param_type = P[Size];
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    for (const P& element : p)
-      GetParamSize(sizer, element);
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     for (const P& element : p)
       WriteParam(m, element);
@@ -345,9 +307,6 @@
 template <>
 struct ParamTraits<std::string> {
   typedef std::string param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddString(p);
-  }
   static void Write(base::Pickle* m, const param_type& p) { m->WriteString(p); }
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -360,9 +319,6 @@
 template <>
 struct ParamTraits<base::string16> {
   typedef base::string16 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddString16(p);
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     m->WriteString16(p);
   }
@@ -377,7 +333,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<std::vector<char> > {
   typedef std::vector<char> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle*,
                    base::PickleIterator* iter,
@@ -388,7 +343,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<std::vector<unsigned char> > {
   typedef std::vector<unsigned char> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -399,7 +353,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<std::vector<bool> > {
   typedef std::vector<bool> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -410,11 +363,6 @@
 template <class P>
 struct ParamTraits<std::vector<P>> {
   typedef std::vector<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    for (size_t i = 0; i < p.size(); i++)
-      GetParamSize(sizer, p[i]);
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, static_cast<int>(p.size()));
     for (size_t i = 0; i < p.size(); i++)
@@ -449,12 +397,6 @@
 template <class P>
 struct ParamTraits<std::set<P> > {
   typedef std::set<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter)
-      GetParamSize(sizer, *iter);
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, static_cast<int>(p.size()));
     typename param_type::const_iterator iter;
@@ -483,14 +425,6 @@
 template <class K, class V, class C, class A>
 struct ParamTraits<std::map<K, V, C, A> > {
   typedef std::map<K, V, C, A> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      GetParamSize(sizer, iter->first);
-      GetParamSize(sizer, iter->second);
-    }
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, static_cast<int>(p.size()));
     typename param_type::const_iterator iter;
@@ -523,10 +457,6 @@
 template <class A, class B>
 struct ParamTraits<std::pair<A, B> > {
   typedef std::pair<A, B> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.first);
-    GetParamSize(sizer, p.second);
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, p.first);
     WriteParam(m, p.second);
@@ -550,7 +480,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::DictionaryValue> {
   typedef base::DictionaryValue param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -577,7 +506,6 @@
 template<>
 struct IPC_EXPORT ParamTraits<base::FileDescriptor> {
   typedef base::FileDescriptor param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -589,7 +517,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::SharedMemoryHandle> {
   typedef base::SharedMemoryHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -601,7 +528,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<PlatformFileForTransit> {
   typedef PlatformFileForTransit param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -613,7 +539,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::FilePath> {
   typedef base::FilePath param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -624,7 +549,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::ListValue> {
   typedef base::ListValue param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -635,7 +559,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::NullableString16> {
   typedef base::NullableString16 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -646,7 +569,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::File::Info> {
   typedef base::File::Info param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -669,7 +591,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::Time> {
   typedef base::Time param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -680,7 +601,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::TimeDelta> {
   typedef base::TimeDelta param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -691,7 +611,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::TimeTicks> {
   typedef base::TimeTicks param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -702,7 +621,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<base::UnguessableToken> {
   typedef base::UnguessableToken param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -713,7 +631,6 @@
 template <>
 struct ParamTraits<std::tuple<>> {
   typedef std::tuple<> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {}
   static void Write(base::Pickle* m, const param_type& p) {}
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -728,11 +645,6 @@
 struct TupleParamTraitsHelper {
   using Next = TupleParamTraitsHelper<T, index + 1, count>;
 
-  static void GetSize(base::PickleSizer* sizer, const T& p) {
-    GetParamSize(sizer, std::get<index>(p));
-    Next::GetSize(sizer, p);
-  }
-
   static void Write(base::Pickle* m, const T& p) {
     WriteParam(m, std::get<index>(p));
     Next::Write(m, p);
@@ -752,7 +664,6 @@
 
 template <typename T, int index>
 struct TupleParamTraitsHelper<T, index, index> {
-  static void GetSize(base::PickleSizer* sizer, const T& p) {}
   static void Write(base::Pickle* m, const T& p) {}
   static bool Read(const base::Pickle* m, base::PickleIterator* iter, T* r) {
     return true;
@@ -766,10 +677,6 @@
   using Helper =
       TupleParamTraitsHelper<param_type, 0, std::tuple_size<param_type>::value>;
 
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    Helper::GetSize(sizer, p);
-  }
-
   static void Write(base::Pickle* m, const param_type& p) {
     Helper::Write(m, p);
   }
@@ -786,11 +693,6 @@
 template <class P, size_t stack_capacity>
 struct ParamTraits<base::StackVector<P, stack_capacity> > {
   typedef base::StackVector<P, stack_capacity> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p->size()));
-    for (size_t i = 0; i < p->size(); i++)
-      GetParamSize(sizer, p[i]);
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, static_cast<int>(p->size()));
     for (size_t i = 0; i < p->size(); i++)
@@ -831,14 +733,6 @@
   using param_type = base::small_map<NormalMap, kArraySize, EqualKey, MapInit>;
   using K = typename param_type::key_type;
   using V = typename param_type::data_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      GetParamSize(sizer, iter->first);
-      GetParamSize(sizer, iter->second);
-    }
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     WriteParam(m, static_cast<int>(p.size()));
     typename param_type::const_iterator iter;
@@ -871,14 +765,6 @@
 template <class Key, class Mapped, class Compare>
 struct ParamTraits<base::flat_map<Key, Mapped, Compare>> {
   using param_type = base::flat_map<Key, Mapped, Compare>;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    DCHECK(base::IsValueInRangeForNumericType<int>(p.size()));
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    for (const auto& iter : p) {
-      GetParamSize(sizer, iter.first);
-      GetParamSize(sizer, iter.second);
-    }
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     DCHECK(base::IsValueInRangeForNumericType<int>(p.size()));
     WriteParam(m, static_cast<int>(p.size()));
@@ -917,12 +803,6 @@
 template <class P>
 struct ParamTraits<std::unique_ptr<P>> {
   typedef std::unique_ptr<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    bool valid = !!p;
-    GetParamSize(sizer, valid);
-    if (valid)
-      GetParamSize(sizer, *p);
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     bool valid = !!p;
     WriteParam(m, valid);
@@ -959,12 +839,6 @@
 template <class P>
 struct ParamTraits<base::Optional<P>> {
   typedef base::Optional<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    const bool is_set = static_cast<bool>(p);
-    GetParamSize(sizer, is_set);
-    if (is_set)
-      GetParamSize(sizer, p.value());
-  }
   static void Write(base::Pickle* m, const param_type& p) {
     const bool is_set = static_cast<bool>(p);
     WriteParam(m, is_set);
@@ -1001,7 +875,6 @@
 template<>
 struct IPC_EXPORT ParamTraits<IPC::ChannelHandle> {
   typedef ChannelHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -1012,7 +885,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<LogData> {
   typedef LogData param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -1035,7 +907,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<HANDLE> {
   typedef HANDLE param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -1046,7 +917,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<LOGFONT> {
   typedef LOGFONT param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -1057,7 +927,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<MSG> {
   typedef MSG param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ipc/ipc_message_utils_unittest.cc b/ipc/ipc_message_utils_unittest.cc
index f4ca6ba..084809c 100644
--- a/ipc/ipc_message_utils_unittest.cc
+++ b/ipc/ipc_message_utils_unittest.cc
@@ -96,48 +96,6 @@
     EXPECT_EQ(stack_vector[i], output[i]);
 }
 
-// Tests that PickleSizer and Pickle agree on the size of a complex base::Value.
-TEST(IPCMessageUtilsTest, ValueSize) {
-  std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
-  value->SetKey("foo", base::Value(42));
-  value->SetKey("bar", base::Value(3.14));
-  value->SetKey("baz", base::Value("hello"));
-  value->SetWithoutPathExpansion("qux", std::make_unique<base::Value>());
-
-  std::unique_ptr<base::DictionaryValue> nested_dict(new base::DictionaryValue);
-  nested_dict->SetKey("foobar", base::Value(5));
-  value->SetWithoutPathExpansion("nested", std::move(nested_dict));
-
-  std::unique_ptr<base::ListValue> list_value(new base::ListValue);
-  list_value->AppendString("im a string");
-  list_value->AppendString("im another string");
-  value->SetWithoutPathExpansion("awesome-list", std::move(list_value));
-
-  base::Pickle pickle;
-  IPC::WriteParam(&pickle, *value);
-
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, *value);
-
-  EXPECT_EQ(sizer.payload_size(), pickle.payload_size());
-}
-
-TEST(IPCMessageUtilsTest, JsonValueSize) {
-  const char kJson[] = "[ { \"foo\": \"bar\", \"baz\": 1234.0 } ]";
-  std::unique_ptr<base::Value> json_value = base::JSONReader::Read(kJson);
-  EXPECT_NE(nullptr, json_value);
-  base::ListValue value;
-  value.Append(std::move(json_value));
-
-  base::Pickle pickle;
-  IPC::WriteParam(&pickle, value);
-
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, value);
-
-  EXPECT_EQ(sizer.payload_size(), pickle.payload_size());
-}
-
 TEST(IPCMessageUtilsTest, MojoChannelHandle) {
   mojo::MessagePipe message_pipe;
   IPC::ChannelHandle channel_handle(message_pipe.handle0.release());
@@ -145,10 +103,6 @@
   IPC::Message message;
   IPC::WriteParam(&message, channel_handle);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, channel_handle);
-  EXPECT_EQ(sizer.payload_size(), message.payload_size());
-
   base::PickleIterator iter(message);
   IPC::ChannelHandle result_handle;
   EXPECT_TRUE(IPC::ReadParam(&message, &iter, &result_handle));
@@ -160,11 +114,6 @@
   base::Pickle pickle;
   IPC::WriteParam(&pickle, opt);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, opt);
-
-  EXPECT_EQ(sizer.payload_size(), pickle.payload_size());
-
   std::string log;
   IPC::LogParam(opt, &log);
   EXPECT_EQ("(unset)", log);
@@ -180,11 +129,6 @@
   base::Pickle pickle;
   IPC::WriteParam(&pickle, opt);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, opt);
-
-  EXPECT_EQ(sizer.payload_size(), pickle.payload_size());
-
   std::string log;
   IPC::LogParam(opt, &log);
   EXPECT_EQ("10", log);
@@ -220,11 +164,6 @@
   base::Pickle pickle;
   IPC::WriteParam(&pickle, token);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, token);
-
-  EXPECT_EQ(sizer.payload_size(), pickle.payload_size());
-
   std::string log;
   IPC::LogParam(token, &log);
   EXPECT_EQ(token.ToString(), log);
@@ -243,11 +182,6 @@
   base::Pickle pickle;
   IPC::WriteParam(&pickle, input);
 
-  base::PickleSizer sizer;
-  IPC::GetParamSize(&sizer, input);
-
-  EXPECT_EQ(sizer.payload_size(), pickle.payload_size());
-
   base::PickleIterator iter(pickle);
   base::flat_map<std::string, int> output;
   EXPECT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
diff --git a/ipc/ipc_mojo_param_traits.cc b/ipc/ipc_mojo_param_traits.cc
index 12aaace..d814bd9 100644
--- a/ipc/ipc_mojo_param_traits.cc
+++ b/ipc/ipc_mojo_param_traits.cc
@@ -10,13 +10,6 @@
 
 namespace IPC {
 
-void ParamTraits<mojo::MessagePipeHandle>::GetSize(base::PickleSizer* sizer,
-                                                   const param_type& p) {
-  GetParamSize(sizer, p.is_valid());
-  if (p.is_valid())
-    sizer->AddAttachment();
-}
-
 void ParamTraits<mojo::MessagePipeHandle>::Write(base::Pickle* m,
                                                  const param_type& p) {
   WriteParam(m, p.is_valid());
@@ -48,14 +41,6 @@
   l->append(")");
 }
 
-void ParamTraits<mojo::DataPipeConsumerHandle>::GetSize(
-    base::PickleSizer* sizer,
-    const param_type& p) {
-  GetParamSize(sizer, p.is_valid());
-  if (p.is_valid())
-    sizer->AddAttachment();
-}
-
 void ParamTraits<mojo::DataPipeConsumerHandle>::Write(base::Pickle* m,
                                                       const param_type& p) {
   WriteParam(m, p.is_valid());
diff --git a/ipc/ipc_mojo_param_traits.h b/ipc/ipc_mojo_param_traits.h
index a4d0228c..9562587 100644
--- a/ipc/ipc_mojo_param_traits.h
+++ b/ipc/ipc_mojo_param_traits.h
@@ -15,7 +15,6 @@
 namespace base {
 class Pickle;
 class PickleIterator;
-class PickleSizer;
 }
 
 namespace IPC {
@@ -23,7 +22,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<mojo::MessagePipeHandle> {
   typedef mojo::MessagePipeHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m, base::PickleIterator* iter,
                    param_type* r);
@@ -33,7 +31,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<mojo::DataPipeConsumerHandle> {
   typedef mojo::DataPipeConsumerHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ipc/mach_port_mac.cc b/ipc/mach_port_mac.cc
index 6d3045a..67043f2 100644
--- a/ipc/mach_port_mac.cc
+++ b/ipc/mach_port_mac.cc
@@ -12,12 +12,6 @@
 namespace IPC {
 
 // static
-void ParamTraits<MachPortMac>::GetSize(base::PickleSizer* s,
-                                       const param_type& p) {
-  s->AddAttachment();
-}
-
-// static
 void ParamTraits<MachPortMac>::Write(base::Pickle* m, const param_type& p) {
   if (!m->WriteAttachment(
           new IPC::internal::MachPortAttachmentMac(p.get_mach_port()))) {
diff --git a/ipc/mach_port_mac.h b/ipc/mach_port_mac.h
index f8511344..b95a37b 100644
--- a/ipc/mach_port_mac.h
+++ b/ipc/mach_port_mac.h
@@ -71,7 +71,6 @@
 template <>
 struct IPC_EXPORT ParamTraits<MachPortMac> {
   typedef MachPortMac param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ipc/param_traits_macros.h b/ipc/param_traits_macros.h
index 10034402..7c4cc692 100644
--- a/ipc/param_traits_macros.h
+++ b/ipc/param_traits_macros.h
@@ -13,8 +13,6 @@
   template <>                                                \
   struct IPC_MESSAGE_EXPORT ParamTraits<struct_name> {       \
     typedef struct_name param_type;                          \
-    static void GetSize(base::PickleSizer* sizer,            \
-                        const param_type& p);                \
     static void Write(base::Pickle* m, const param_type& p); \
     static bool Read(const base::Pickle* m,                  \
                      base::PickleIterator* iter,             \
@@ -55,8 +53,6 @@
   template <>                                                      \
   struct IPC_MESSAGE_EXPORT ParamTraits<enum_name> {               \
     typedef enum_name param_type;                                  \
-    static void GetSize(base::PickleSizer* sizer,                  \
-                        const param_type& p);                      \
     static void Write(base::Pickle* m, const param_type& p);       \
     static bool Read(const base::Pickle* m,                        \
                      base::PickleIterator* iter,                   \
diff --git a/ipc/param_traits_size_macros.h b/ipc/param_traits_size_macros.h
deleted file mode 100644
index 142b55a..0000000
--- a/ipc/param_traits_size_macros.h
+++ /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.
-
-#ifndef IPC_PARAM_TRAITS_SIZE_MACROS_H_
-#define IPC_PARAM_TRAITS_SIZE_MACROS_H_
-
-// Null out all the macros that need nulling.
-#include "ipc/ipc_message_null_macros.h"
-
-// STRUCT declarations cause corresponding STRUCT_TRAITS declarations to occur.
-#undef IPC_STRUCT_BEGIN_WITH_PARENT
-#undef IPC_STRUCT_MEMBER
-#undef IPC_STRUCT_END
-#define IPC_STRUCT_BEGIN_WITH_PARENT(struct_name, parent) \
-  IPC_STRUCT_TRAITS_BEGIN(struct_name)
-#define IPC_STRUCT_MEMBER(type, name, ...) IPC_STRUCT_TRAITS_MEMBER(name)
-#define IPC_STRUCT_END() IPC_STRUCT_TRAITS_END()
-
-// Set up so next include will generate size methods.
-#undef IPC_STRUCT_TRAITS_BEGIN
-#undef IPC_STRUCT_TRAITS_MEMBER
-#undef IPC_STRUCT_TRAITS_PARENT
-#undef IPC_STRUCT_TRAITS_END
-#define IPC_STRUCT_TRAITS_BEGIN(struct_name) \
-  void ParamTraits<struct_name>::GetSize(base::PickleSizer* sizer, \
-                                         const param_type& p) {
-#define IPC_STRUCT_TRAITS_MEMBER(name) GetParamSize(sizer, p.name);
-#define IPC_STRUCT_TRAITS_PARENT(type) ParamTraits<type>::GetSize(sizer, p);
-#define IPC_STRUCT_TRAITS_END() }
-
-#undef IPC_ENUM_TRAITS_VALIDATE
-#define IPC_ENUM_TRAITS_VALIDATE(enum_name, validation_expression) \
-  void ParamTraits<enum_name>::GetSize(base::PickleSizer* sizer,   \
-                                       const param_type& value) {  \
-    sizer->AddInt();                                               \
-  }
-
-#endif  // IPC_PARAM_TRAITS_SIZE_MACROS_H_
-
diff --git a/media/audio/audio_manager.h b/media/audio/audio_manager.h
index bd98efa..3b484cd 100644
--- a/media/audio/audio_manager.h
+++ b/media/audio/audio_manager.h
@@ -88,7 +88,7 @@
   // was created.
   // Returns true on success but false if AudioManager could not be shutdown.
   // AudioManager instance must not be deleted if shutdown failed.
-  bool Shutdown();
+  virtual bool Shutdown();
 
   // Log callback used for sending log messages from a stream to the object
   // that manages the stream.
diff --git a/media/audio/cras/audio_manager_cras.cc b/media/audio/cras/audio_manager_cras.cc
index 156d348b..06f94ae 100644
--- a/media/audio/cras/audio_manager_cras.cc
+++ b/media/audio/cras/audio_manager_cras.cc
@@ -16,7 +16,9 @@
 #include "base/nix/xdg_util.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/synchronization/waitable_event.h"
 #include "base/sys_info.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/audio/audio_device.h"
 #include "chromeos/audio/cras_audio_handler.h"
 #include "media/audio/audio_device_description.h"
@@ -58,6 +60,26 @@
   BEAMFORMING_STATE_MAX = BEAMFORMING_USER_DISABLED
 };
 
+bool HasKeyboardMic(const chromeos::AudioDeviceList& devices) {
+  for (const auto& device : devices) {
+    if (device.is_input && device.type == chromeos::AUDIO_TYPE_KEYBOARD_MIC) {
+      return true;
+    }
+  }
+  return false;
+}
+
+const chromeos::AudioDevice* GetDeviceFromId(
+    const chromeos::AudioDeviceList& devices,
+    uint64_t id) {
+  for (const auto& device : devices) {
+    if (device.id == id) {
+      return &device;
+    }
+  }
+  return nullptr;
+}
+
 // Process |device_list| that two shares the same dev_index by creating a
 // virtual device name for them.
 void ProcessVirtualDeviceName(AudioDeviceNames* device_names,
@@ -87,7 +109,7 @@
 
 bool AudioManagerCras::HasAudioInputDevices() {
   chromeos::AudioDeviceList devices;
-  chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices);
+  GetAudioDevices(&devices);
   for (size_t i = 0; i < devices.size(); ++i) {
     if (devices[i].is_input && devices[i].is_for_simple_usage())
       return true;
@@ -97,7 +119,12 @@
 
 AudioManagerCras::AudioManagerCras(std::unique_ptr<AudioThread> audio_thread,
                                    AudioLogFactory* audio_log_factory)
-    : AudioManagerBase(std::move(audio_thread), audio_log_factory) {
+    : AudioManagerBase(std::move(audio_thread), audio_log_factory),
+      on_shutdown_(base::WaitableEvent::ResetPolicy::MANUAL,
+                   base::WaitableEvent::InitialState::NOT_SIGNALED),
+      main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+      weak_ptr_factory_(this) {
+  weak_this_ = weak_ptr_factory_.GetWeakPtr();
   SetMaxOutputStreamsAllowed(kMaxOutputStreams);
 }
 
@@ -111,7 +138,7 @@
 
   if (base::FeatureList::IsEnabled(features::kEnumerateAudioDevices)) {
     chromeos::AudioDeviceList devices;
-    chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices);
+    GetAudioDevices(&devices);
 
     // |dev_idx_map| is a map of dev_index and their audio devices.
     std::map<int, chromeos::AudioDeviceList> dev_idx_map;
@@ -159,7 +186,9 @@
   AudioParameters params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
                          CHANNEL_LAYOUT_STEREO, kDefaultSampleRate, 16,
                          buffer_size);
-  if (chromeos::CrasAudioHandler::Get()->HasKeyboardMic())
+  chromeos::AudioDeviceList devices;
+  GetAudioDevices(&devices);
+  if (HasKeyboardMic(devices))
     params.set_effects(AudioParameters::KEYBOARD_MIC);
 
   return params;
@@ -171,8 +200,7 @@
     return "";
 
   chromeos::AudioDeviceList devices;
-  chromeos::CrasAudioHandler* audio_handler = chromeos::CrasAudioHandler::Get();
-  audio_handler->GetAudioDevices(&devices);
+  GetAudioDevices(&devices);
 
   // At this point, we know we have an ordinary input device, so we look up its
   // device_name, which identifies which hardware device it belongs to.
@@ -180,7 +208,7 @@
   if (!base::StringToUint64(input_device_id, &device_id))
     return "";
   const chromeos::AudioDevice* input_device =
-      audio_handler->GetDeviceFromId(device_id);
+      GetDeviceFromId(devices, device_id);
   if (!input_device)
     return "";
 
@@ -198,14 +226,36 @@
 }
 
 std::string AudioManagerCras::GetDefaultOutputDeviceID() {
-  return base::Uint64ToString(
-      chromeos::CrasAudioHandler::Get()->GetPrimaryActiveOutputNode());
+  DCHECK(GetTaskRunner()->BelongsToCurrentThread());
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+  uint64_t active_output_node_id = 0;
+  if (main_task_runner_->BelongsToCurrentThread()) {
+    // Unittest may use the same thread for audio thread.
+    GetPrimaryActiveOutputNodeOnMainThread(&active_output_node_id, &event);
+  } else {
+    main_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            &AudioManagerCras::GetPrimaryActiveOutputNodeOnMainThread,
+            weak_this_, base::Unretained(&active_output_node_id),
+            base::Unretained(&event)));
+  }
+  WaitEventOrShutdown(&event);
+  return base::Uint64ToString(active_output_node_id);
 }
 
 const char* AudioManagerCras::GetName() {
   return "CRAS";
 }
 
+bool AudioManagerCras::Shutdown() {
+  DCHECK(main_task_runner_->BelongsToCurrentThread());
+  weak_ptr_factory_.InvalidateWeakPtrs();
+  on_shutdown_.Signal();
+  return AudioManager::Shutdown();
+}
+
 AudioOutputStream* AudioManagerCras::MakeLinearOutputStream(
     const AudioParameters& params,
     const LogCallback& log_callback) {
@@ -240,8 +290,22 @@
 }
 
 int AudioManagerCras::GetDefaultOutputBufferSizePerBoard() {
-  int32_t buffer_size;
-  chromeos::CrasAudioHandler::Get()->GetDefaultOutputBufferSize(&buffer_size);
+  DCHECK(GetTaskRunner()->BelongsToCurrentThread());
+  int32_t buffer_size = 512;
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+  if (main_task_runner_->BelongsToCurrentThread()) {
+    // Unittest may use the same thread for audio thread.
+    GetDefaultOutputBufferSizeOnMainThread(&buffer_size, &event);
+  } else {
+    main_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            &AudioManagerCras::GetDefaultOutputBufferSizeOnMainThread,
+            weak_this_, base::Unretained(&buffer_size),
+            base::Unretained(&event)));
+  }
+  WaitEventOrShutdown(&event);
   return static_cast<int>(buffer_size);
 }
 
@@ -304,4 +368,56 @@
   return device_name.unique_id == device_id;
 }
 
+void AudioManagerCras::GetAudioDevices(chromeos::AudioDeviceList* devices) {
+  DCHECK(GetTaskRunner()->BelongsToCurrentThread());
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+  if (main_task_runner_->BelongsToCurrentThread()) {
+    GetAudioDevicesOnMainThread(devices, &event);
+  } else {
+    main_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&AudioManagerCras::GetAudioDevicesOnMainThread,
+                       weak_this_, base::Unretained(devices),
+                       base::Unretained(&event)));
+  }
+  WaitEventOrShutdown(&event);
+}
+
+void AudioManagerCras::GetAudioDevicesOnMainThread(
+    chromeos::AudioDeviceList* devices,
+    base::WaitableEvent* event) {
+  DCHECK(main_task_runner_->BelongsToCurrentThread());
+  // CrasAudioHandler is shut down before AudioManagerCras.
+  if (chromeos::CrasAudioHandler::IsInitialized()) {
+    chromeos::CrasAudioHandler::Get()->GetAudioDevices(devices);
+  }
+  event->Signal();
+}
+
+void AudioManagerCras::GetPrimaryActiveOutputNodeOnMainThread(
+    uint64_t* active_output_node_id,
+    base::WaitableEvent* event) {
+  DCHECK(main_task_runner_->BelongsToCurrentThread());
+  if (chromeos::CrasAudioHandler::IsInitialized()) {
+    chromeos::CrasAudioHandler::Get()->GetPrimaryActiveOutputNode();
+  }
+  event->Signal();
+}
+
+void AudioManagerCras::GetDefaultOutputBufferSizeOnMainThread(
+    int32_t* buffer_size,
+    base::WaitableEvent* event) {
+  DCHECK(main_task_runner_->BelongsToCurrentThread());
+  if (chromeos::CrasAudioHandler::IsInitialized()) {
+    chromeos::CrasAudioHandler::Get()->GetDefaultOutputBufferSize(buffer_size);
+  }
+  event->Signal();
+}
+
+void AudioManagerCras::WaitEventOrShutdown(base::WaitableEvent* event) {
+  base::WaitableEvent* waitables[] = {event, &on_shutdown_};
+  base::WaitableEvent::WaitMany(waitables, arraysize(waitables));
+}
+
 }  // namespace media
diff --git a/media/audio/cras/audio_manager_cras.h b/media/audio/cras/audio_manager_cras.h
index f80900d6..0807037 100644
--- a/media/audio/cras/audio_manager_cras.h
+++ b/media/audio/cras/audio_manager_cras.h
@@ -14,6 +14,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "chromeos/audio/audio_device.h"
 #include "media/audio/audio_manager_base.h"
 
 namespace media {
@@ -35,6 +36,7 @@
       const std::string& input_device_id) override;
   std::string GetDefaultOutputDeviceID() override;
   const char* GetName() override;
+  bool Shutdown() override;
 
   // AudioManagerBase implementation.
   AudioOutputStream* MakeLinearOutputStream(
@@ -78,6 +80,28 @@
 
   void GetAudioDeviceNamesImpl(bool is_input, AudioDeviceNames* device_names);
 
+  void GetAudioDevices(chromeos::AudioDeviceList* devices);
+  void GetAudioDevicesOnMainThread(chromeos::AudioDeviceList* devices,
+                                   base::WaitableEvent* event);
+  void GetPrimaryActiveOutputNodeOnMainThread(uint64_t* active_output_node_id,
+                                              base::WaitableEvent* event);
+  void GetDefaultOutputBufferSizeOnMainThread(int32_t* buffer_size,
+                                              base::WaitableEvent* event);
+
+  void WaitEventOrShutdown(base::WaitableEvent* event);
+
+  // Signaled if AudioManagerCras is shutting down.
+  base::WaitableEvent on_shutdown_;
+
+  // Task runner of browser main thread. CrasAudioHandler should be only
+  // accessed on this thread.
+  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
+
+  // For posting tasks from audio thread to |main_task_runner_|.
+  base::WeakPtr<AudioManagerCras> weak_this_;
+
+  base::WeakPtrFactory<AudioManagerCras> weak_ptr_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(AudioManagerCras);
 };
 
diff --git a/media/audio/cras/cras_input_unittest.cc b/media/audio/cras/cras_input_unittest.cc
index 6421ede..4015b7f0 100644
--- a/media/audio/cras/cras_input_unittest.cc
+++ b/media/audio/cras/cras_input_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
+#include "chromeos/audio/cras_audio_handler.h"
 #include "media/audio/audio_device_description.h"
 #include "media/audio/cras/audio_manager_cras.h"
 #include "media/audio/fake_audio_log_factory.h"
@@ -65,11 +66,15 @@
 class CrasInputStreamTest : public testing::Test {
  protected:
   CrasInputStreamTest() {
+    chromeos::CrasAudioHandler::InitializeForTesting();
     mock_manager_.reset(new StrictMock<MockAudioManagerCrasInput>());
     base::RunLoop().RunUntilIdle();
   }
 
-  ~CrasInputStreamTest() override { mock_manager_->Shutdown(); }
+  ~CrasInputStreamTest() override {
+    chromeos::CrasAudioHandler::Shutdown();
+    mock_manager_->Shutdown();
+  }
 
   CrasInputStream* CreateStream(ChannelLayout layout) {
     return CreateStream(layout, kTestFramesPerPacket);
diff --git a/media/audio/cras/cras_unified_unittest.cc b/media/audio/cras/cras_unified_unittest.cc
index 3bb52fc..7da8fc0 100644
--- a/media/audio/cras/cras_unified_unittest.cc
+++ b/media/audio/cras/cras_unified_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
+#include "chromeos/audio/cras_audio_handler.h"
 #include "media/audio/audio_device_description.h"
 #include "media/audio/cras/audio_manager_cras.h"
 #include "media/audio/fake_audio_log_factory.h"
@@ -59,11 +60,15 @@
 class CrasUnifiedStreamTest : public testing::Test {
  protected:
   CrasUnifiedStreamTest() {
+    chromeos::CrasAudioHandler::InitializeForTesting();
     mock_manager_.reset(new StrictMock<MockAudioManagerCras>());
     base::RunLoop().RunUntilIdle();
   }
 
-  ~CrasUnifiedStreamTest() override { mock_manager_->Shutdown(); }
+  ~CrasUnifiedStreamTest() override {
+    chromeos::CrasAudioHandler::Shutdown();
+    mock_manager_->Shutdown();
+  }
 
   CrasUnifiedStream* CreateStream(ChannelLayout layout) {
     return CreateStream(layout, kTestFramesPerPacket);
diff --git a/media/base/ipc/media_param_traits.cc b/media/base/ipc/media_param_traits.cc
index 8233f3d..742186ce 100644
--- a/media/base/ipc/media_param_traits.cc
+++ b/media/base/ipc/media_param_traits.cc
@@ -20,19 +20,6 @@
 
 namespace IPC {
 
-void ParamTraits<AudioParameters>::GetSize(base::PickleSizer* s,
-                                           const AudioParameters& p) {
-  GetParamSize(s, p.format());
-  GetParamSize(s, p.channel_layout());
-  GetParamSize(s, p.sample_rate());
-  GetParamSize(s, p.bits_per_sample());
-  GetParamSize(s, p.frames_per_buffer());
-  GetParamSize(s, p.channels());
-  GetParamSize(s, p.effects());
-  GetParamSize(s, p.mic_positions());
-  GetParamSize(s, p.latency_tag());
-}
-
 void ParamTraits<AudioParameters>::Write(base::Pickle* m,
                                          const AudioParameters& p) {
   WriteParam(m, p.format());
@@ -84,7 +71,6 @@
 template <>
 struct ParamTraits<media::EncryptionScheme::Pattern> {
   typedef media::EncryptionScheme::Pattern param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -92,12 +78,6 @@
   static void Log(const param_type& p, std::string* l);
 };
 
-void ParamTraits<media::EncryptionScheme>::GetSize(base::PickleSizer* s,
-                                                   const param_type& p) {
-  GetParamSize(s, p.mode());
-  GetParamSize(s, p.pattern());
-}
-
 void ParamTraits<media::EncryptionScheme>::Write(base::Pickle* m,
                                                  const param_type& p) {
   WriteParam(m, p.mode());
@@ -120,13 +100,6 @@
   l->append(base::StringPrintf("<EncryptionScheme>"));
 }
 
-void ParamTraits<media::EncryptionScheme::Pattern>::GetSize(
-    base::PickleSizer* s,
-    const param_type& p) {
-  GetParamSize(s, p.encrypt_blocks());
-  GetParamSize(s, p.skip_blocks());
-}
-
 void ParamTraits<media::EncryptionScheme::Pattern>::Write(base::Pickle* m,
                                                           const param_type& p) {
   WriteParam(m, p.encrypt_blocks());
@@ -151,13 +124,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef MEDIA_BASE_IPC_MEDIA_PARAM_TRAITS_MACROS_H_
-#include "media/base/ipc/media_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/media/base/ipc/media_param_traits.h b/media/base/ipc/media_param_traits.h
index dcc5833..7327542 100644
--- a/media/base/ipc/media_param_traits.h
+++ b/media/base/ipc/media_param_traits.h
@@ -19,7 +19,6 @@
 template <>
 struct ParamTraits<media::AudioParameters> {
   typedef media::AudioParameters param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -30,7 +29,6 @@
 template <>
 struct ParamTraits<media::EncryptionScheme> {
   typedef media::EncryptionScheme param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h
index 12427e00..df01779 100644
--- a/media/base/ipc/media_param_traits_macros.h
+++ b/media/base/ipc/media_param_traits_macros.h
@@ -9,6 +9,7 @@
 #include "media/base/audio_codecs.h"
 #include "media/base/audio_parameters.h"
 #include "media/base/buffering_state.h"
+#include "media/base/cdm_config.h"
 #include "media/base/cdm_key_information.h"
 #include "media/base/cdm_promise.h"
 #include "media/base/channel_layout.h"
@@ -123,6 +124,12 @@
 
 // Struct traits.
 
+IPC_STRUCT_TRAITS_BEGIN(media::CdmConfig)
+  IPC_STRUCT_TRAITS_MEMBER(allow_distinctive_identifier)
+  IPC_STRUCT_TRAITS_MEMBER(allow_persistent_state)
+  IPC_STRUCT_TRAITS_MEMBER(use_hw_secure_codecs)
+IPC_STRUCT_TRAITS_END()
+
 IPC_STRUCT_TRAITS_BEGIN(media::CdmKeyInformation)
   IPC_STRUCT_TRAITS_MEMBER(key_id)
   IPC_STRUCT_TRAITS_MEMBER(status)
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn
index 295cc80..22758f8 100644
--- a/media/capture/BUILD.gn
+++ b/media/capture/BUILD.gn
@@ -107,10 +107,10 @@
     "video/mac/video_capture_device_factory_mac.mm",
     "video/mac/video_capture_device_mac.h",
     "video/mac/video_capture_device_mac.mm",
-    "video/shared_memory_buffer_handle.cc",
-    "video/shared_memory_buffer_handle.h",
     "video/shared_memory_buffer_tracker.cc",
     "video/shared_memory_buffer_tracker.h",
+    "video/shared_memory_handle_provider.cc",
+    "video/shared_memory_handle_provider.h",
     "video/video_capture_buffer_pool.h",
     "video/video_capture_buffer_pool_impl.cc",
     "video/video_capture_buffer_pool_impl.h",
diff --git a/media/capture/content/thread_safe_capture_oracle.cc b/media/capture/content/thread_safe_capture_oracle.cc
index c7a9781..665b0d2 100644
--- a/media/capture/content/thread_safe_capture_oracle.cc
+++ b/media/capture/content/thread_safe_capture_oracle.cc
@@ -34,6 +34,14 @@
 
 }  // namespace
 
+struct ThreadSafeCaptureOracle::InFlightFrameCapture {
+  int frame_number;
+  VideoCaptureDevice::Client::Buffer buffer;
+  std::unique_ptr<VideoCaptureBufferHandle> buffer_access;
+  base::TimeTicks begin_time;
+  base::TimeDelta frame_duration;
+};
+
 ThreadSafeCaptureOracle::ThreadSafeCaptureOracle(
     std::unique_ptr<VideoCaptureDevice::Client> client,
     const VideoCaptureParams& params,
@@ -135,7 +143,7 @@
                            "frame_number", frame_number, "trigger",
                            VideoCaptureOracle::EventAsString(event));
 
-  auto output_buffer_access =
+  std::unique_ptr<VideoCaptureBufferHandle> output_buffer_access =
       output_buffer.handle_provider->GetHandleForInProcessAccess();
   DCHECK_EQ(media::PIXEL_STORAGE_CPU, params_.requested_format.pixel_storage);
   *storage = VideoFrame::WrapExternalSharedMemory(
@@ -143,18 +151,35 @@
       gfx::Rect(visible_size), visible_size, output_buffer_access->data(),
       output_buffer_access->mapped_size(), base::SharedMemoryHandle(), 0u,
       base::TimeDelta());
+
+  // Note: Passing the |output_buffer_access| in the callback is a bit of a
+  // hack. Really, the access should be owned by the VideoFrame so that access
+  // is released (unpinning the shared memory) when the VideoFrame goes
+  // out-of-scope. However, there is an an issue where, at browser shutdown, the
+  // callback below may never be run, and instead it self-deletes: If this
+  // happens, the VideoFrame will release access *after* the Buffer goes
+  // out-of-scope, which is an invalid sequence of steps. This could be fixed in
+  // upstream implementation, but it's not worth spending time tracking it down
+  // because all of this code (and upstream code) is about to be replaced.
+  // http://crbug.com/754872
+  //
+  // To be clear, this solution allows |output_buffer_access| to be deleted
+  // before |output_buffer| if the callback self-deletes rather than ever being
+  // run. The InFlightFrameCapture destructor ensures this.
+  std::unique_ptr<InFlightFrameCapture> capture(new InFlightFrameCapture{
+      frame_number, std::move(output_buffer), std::move(output_buffer_access),
+      capture_begin_time, estimated_frame_duration});
+
   // If creating the VideoFrame wrapper failed, call DidCaptureFrame() with
   // !success to execute the required post-capture steps (tracing, notification
   // of failure to VideoCaptureOracle, etc.).
   if (!(*storage)) {
-    DidCaptureFrame(frame_number, std::move(output_buffer), capture_begin_time,
-                    estimated_frame_duration, *storage, event_time, false);
+    DidCaptureFrame(std::move(capture), *storage, event_time, false);
     return false;
   }
 
   *callback = base::Bind(&ThreadSafeCaptureOracle::DidCaptureFrame, this,
-                         frame_number, base::Passed(&output_buffer),
-                         capture_begin_time, estimated_frame_duration);
+                         base::Passed(&capture));
 
   return true;
 }
@@ -205,23 +230,24 @@
 }
 
 void ThreadSafeCaptureOracle::DidCaptureFrame(
-    int frame_number,
-    VideoCaptureDevice::Client::Buffer buffer,
-    base::TimeTicks capture_begin_time,
-    base::TimeDelta estimated_frame_duration,
+    std::unique_ptr<InFlightFrameCapture> capture,
     scoped_refptr<VideoFrame> frame,
     base::TimeTicks reference_time,
     bool success) {
+  // Release |buffer_access| now that nothing is accessing the memory via the
+  // VideoFrame data pointers anymore.
+  capture->buffer_access.reset();
+
   base::AutoLock guard(lock_);
 
   const bool should_deliver_frame =
-      oracle_.CompleteCapture(frame_number, success, &reference_time);
+      oracle_.CompleteCapture(capture->frame_number, success, &reference_time);
 
   // The following is used by
   // chrome/browser/extension/api/cast_streaming/performance_test.cc, in
   // addition to the usual runtime tracing.
-  TRACE_EVENT_ASYNC_END2("gpu.capture", "Capture", buffer.id, "success",
-                         should_deliver_frame, "timestamp",
+  TRACE_EVENT_ASYNC_END2("gpu.capture", "Capture", capture->buffer.id,
+                         "success", should_deliver_frame, "timestamp",
                          (reference_time - base::TimeTicks()).InMicroseconds());
 
   if (!should_deliver_frame || !client_)
@@ -230,20 +256,19 @@
   frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE,
                                params_.requested_format.frame_rate);
   frame->metadata()->SetTimeTicks(VideoFrameMetadata::CAPTURE_BEGIN_TIME,
-                                  capture_begin_time);
+                                  capture->begin_time);
   frame->metadata()->SetTimeTicks(VideoFrameMetadata::CAPTURE_END_TIME,
                                   base::TimeTicks::Now());
   frame->metadata()->SetTimeDelta(VideoFrameMetadata::FRAME_DURATION,
-                                  estimated_frame_duration);
+                                  capture->frame_duration);
   frame->metadata()->SetTimeTicks(VideoFrameMetadata::REFERENCE_TIME,
                                   reference_time);
 
-  DCHECK(frame->IsMappable());
   media::VideoCaptureFormat format(frame->coded_size(),
                                    params_.requested_format.frame_rate,
                                    frame->format(), media::PIXEL_STORAGE_CPU);
   client_->OnIncomingCapturedBufferExt(
-      std::move(buffer), format, reference_time, frame->timestamp(),
+      std::move(capture->buffer), format, reference_time, frame->timestamp(),
       frame->visible_rect(), *frame->metadata());
 }
 
diff --git a/media/capture/content/thread_safe_capture_oracle.h b/media/capture/content/thread_safe_capture_oracle.h
index 02f60df0..da41881 100644
--- a/media/capture/content/thread_safe_capture_oracle.h
+++ b/media/capture/content/thread_safe_capture_oracle.h
@@ -12,6 +12,7 @@
 #include "media/base/video_frame.h"
 #include "media/capture/capture_export.h"
 #include "media/capture/content/video_capture_oracle.h"
+#include "media/capture/video/video_capture_buffer_handle.h"
 #include "media/capture/video/video_capture_device.h"
 
 namespace tracked_objects {
@@ -97,14 +98,16 @@
   void OnConsumerReportingUtilization(int frame_number, double utilization);
 
  private:
+  // Helper struct to hold the many arguments needed by DidCaptureFrame(), and
+  // also ensure that teardown of these objects happens in the correct order if
+  // bound to an aborted callback.
+  struct InFlightFrameCapture;
+
   friend class base::RefCountedThreadSafe<ThreadSafeCaptureOracle>;
   virtual ~ThreadSafeCaptureOracle();
 
   // Callback invoked on completion of all captures.
-  void DidCaptureFrame(int frame_number,
-                       VideoCaptureDevice::Client::Buffer buffer,
-                       base::TimeTicks capture_begin_time,
-                       base::TimeDelta estimated_frame_duration,
+  void DidCaptureFrame(std::unique_ptr<InFlightFrameCapture> capture,
                        scoped_refptr<VideoFrame> frame,
                        base::TimeTicks reference_time,
                        bool success);
diff --git a/media/capture/ipc/capture_param_traits.cc b/media/capture/ipc/capture_param_traits.cc
index adf81dc8..769dc63a 100644
--- a/media/capture/ipc/capture_param_traits.cc
+++ b/media/capture/ipc/capture_param_traits.cc
@@ -17,14 +17,6 @@
 
 namespace IPC {
 
-void ParamTraits<VideoCaptureFormat>::GetSize(base::PickleSizer* s,
-                                              const VideoCaptureFormat& p) {
-  GetParamSize(s, p.frame_size);
-  GetParamSize(s, p.frame_rate);
-  GetParamSize(s, p.pixel_format);
-  GetParamSize(s, p.pixel_storage);
-}
-
 void ParamTraits<VideoCaptureFormat>::Write(base::Pickle* m,
                                             const VideoCaptureFormat& p) {
   WriteParam(m, p.frame_size);
@@ -53,13 +45,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef MEDIA_CAPTURE_IPC_CAPTURE_PARAM_TRAITS_MACROS_H_
-#include "media/capture/ipc/capture_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/media/capture/ipc/capture_param_traits.h b/media/capture/ipc/capture_param_traits.h
index cf5f217..5a49960 100644
--- a/media/capture/ipc/capture_param_traits.h
+++ b/media/capture/ipc/capture_param_traits.h
@@ -18,7 +18,6 @@
 template <>
 struct ParamTraits<media::VideoCaptureFormat> {
   typedef media::VideoCaptureFormat param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/media/capture/video/fake_video_capture_device_unittest.cc b/media/capture/video/fake_video_capture_device_unittest.cc
index 7bfbb67..0339d906 100644
--- a/media/capture/video/fake_video_capture_device_unittest.cc
+++ b/media/capture/video/fake_video_capture_device_unittest.cc
@@ -57,7 +57,8 @@
 
   ~StubBufferHandleProvider() override {}
 
-  mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit() override {
+  mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit(
+      bool read_only) override {
     NOTREACHED();
     return mojo::ScopedSharedBufferHandle();
   }
diff --git a/media/capture/video/shared_memory_buffer_handle.cc b/media/capture/video/shared_memory_buffer_handle.cc
deleted file mode 100644
index 8814697..0000000
--- a/media/capture/video/shared_memory_buffer_handle.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "media/capture/video/shared_memory_buffer_handle.h"
-
-#include "base/memory/ptr_util.h"
-#include "mojo/public/cpp/system/platform_handle.h"
-
-namespace media {
-
-SharedMemoryBufferHandle::SharedMemoryBufferHandle(
-    base::SharedMemory* shared_memory,
-    size_t mapped_size)
-    : shared_memory_(shared_memory), mapped_size_(mapped_size) {}
-
-SharedMemoryBufferHandle::~SharedMemoryBufferHandle() = default;
-
-size_t SharedMemoryBufferHandle::mapped_size() const {
-  return mapped_size_;
-}
-
-uint8_t* SharedMemoryBufferHandle::data() const {
-  return static_cast<uint8_t*>(shared_memory_->memory());
-}
-
-const uint8_t* SharedMemoryBufferHandle::const_data() const {
-  return static_cast<const uint8_t*>(shared_memory_->memory());
-}
-
-}  // namespace media
diff --git a/media/capture/video/shared_memory_buffer_handle.h b/media/capture/video/shared_memory_buffer_handle.h
deleted file mode 100644
index 839457e..0000000
--- a/media/capture/video/shared_memory_buffer_handle.h
+++ /dev/null
@@ -1,37 +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.
-
-#ifndef MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_BUFFER_HANDLE_H_
-#define MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_BUFFER_HANDLE_H_
-
-#include "media/capture/capture_export.h"
-#include "media/capture/video/video_capture_buffer_handle.h"
-
-namespace media {
-
-// Provides access to memory-mapped shared memory without participating in the
-// lifetime management of the memory. Instances are typically handed out by
-// an instance of VideoCaptureDevice::Client as part of a
-// VideoCaptureDevice::Client::Buffer, which contains a separate
-// |access_permission| that guarantees that the memory stays alive. The buffers
-// are typically managed by an instance of VideoCaptureBufferPool.
-class CAPTURE_EXPORT SharedMemoryBufferHandle
-    : public VideoCaptureBufferHandle {
- public:
-  explicit SharedMemoryBufferHandle(base::SharedMemory* shared_memory,
-                                    size_t mapped_size);
-  ~SharedMemoryBufferHandle() override;
-
-  size_t mapped_size() const override;
-  uint8_t* data() const override;
-  const uint8_t* const_data() const override;
-
- private:
-  base::SharedMemory* const shared_memory_;
-  const size_t mapped_size_;
-};
-
-}  // namespace media
-
-#endif  // MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_BUFFER_HANDLE_H_
diff --git a/media/capture/video/shared_memory_buffer_tracker.cc b/media/capture/video/shared_memory_buffer_tracker.cc
index c64ed384..6f8f3b6 100644
--- a/media/capture/video/shared_memory_buffer_tracker.cc
+++ b/media/capture/video/shared_memory_buffer_tracker.cc
@@ -4,48 +4,42 @@
 
 #include "media/capture/video/shared_memory_buffer_tracker.h"
 
-#include "base/memory/ptr_util.h"
-#include "media/capture/video/shared_memory_buffer_handle.h"
-#include "mojo/public/cpp/system/platform_handle.h"
+#include "base/logging.h"
+#include "ui/gfx/geometry/size.h"
 
 namespace media {
 
-SharedMemoryBufferTracker::SharedMemoryBufferTracker()
-    : VideoCaptureBufferTracker() {}
+SharedMemoryBufferTracker::SharedMemoryBufferTracker() = default;
+
+SharedMemoryBufferTracker::~SharedMemoryBufferTracker() = default;
 
 bool SharedMemoryBufferTracker::Init(const gfx::Size& dimensions,
                                      VideoPixelFormat format,
-                                     VideoPixelStorage storage_type,
-                                     base::Lock* lock) {
+                                     VideoPixelStorage storage_type) {
   DVLOG(2) << __func__ << "allocating ShMem of " << dimensions.ToString();
   set_dimensions(dimensions);
   // |dimensions| can be 0x0 for trackers that do not require memory backing.
   set_max_pixel_count(dimensions.GetArea());
   set_pixel_format(format);
   set_storage_type(storage_type);
-  mapped_size_ = VideoCaptureFormat(dimensions, 0.0f, format, storage_type)
-                     .ImageAllocationSize();
-  if (!mapped_size_)
-    return true;
-  return shared_memory_.CreateAndMapAnonymous(mapped_size_);
+  return provider_.InitForSize(
+      VideoCaptureFormat(dimensions, 0.0f, format, storage_type)
+          .ImageAllocationSize());
 }
 
 std::unique_ptr<VideoCaptureBufferHandle>
 SharedMemoryBufferTracker::GetMemoryMappedAccess() {
-  return base::MakeUnique<SharedMemoryBufferHandle>(&shared_memory_,
-                                                    mapped_size_);
+  return provider_.GetHandleForInProcessAccess();
 }
 
-mojo::ScopedSharedBufferHandle
-SharedMemoryBufferTracker::GetHandleForTransit() {
-  return mojo::WrapSharedMemoryHandle(
-      base::SharedMemory::DuplicateHandle(shared_memory_.handle()),
-      mapped_size_, false /* read_only */);
+mojo::ScopedSharedBufferHandle SharedMemoryBufferTracker::GetHandleForTransit(
+    bool read_only) {
+  return provider_.GetHandleForInterProcessTransit(read_only);
 }
 
 base::SharedMemoryHandle
 SharedMemoryBufferTracker::GetNonOwnedSharedMemoryHandleForLegacyIPC() {
-  return shared_memory_.handle();
+  return provider_.GetNonOwnedSharedMemoryHandleForLegacyIPC();
 }
 
 }  // namespace media
diff --git a/media/capture/video/shared_memory_buffer_tracker.h b/media/capture/video/shared_memory_buffer_tracker.h
index 1d107272..de3cdcc 100644
--- a/media/capture/video/shared_memory_buffer_tracker.h
+++ b/media/capture/video/shared_memory_buffer_tracker.h
@@ -5,31 +5,35 @@
 #ifndef MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_BUFFER_TRACKER_H_
 #define MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_BUFFER_TRACKER_H_
 
-#include "media/capture/video/shared_memory_buffer_handle.h"
+#include "media/capture/video/shared_memory_handle_provider.h"
+#include "media/capture/video/video_capture_buffer_handle.h"
 #include "media/capture/video/video_capture_buffer_tracker.h"
 
+namespace gfx {
+class Size;
+}
+
 namespace media {
 
 // Tracker specifics for SharedMemory.
 class SharedMemoryBufferTracker final : public VideoCaptureBufferTracker {
  public:
   SharedMemoryBufferTracker();
+  ~SharedMemoryBufferTracker() override;
 
   bool Init(const gfx::Size& dimensions,
             VideoPixelFormat format,
-            VideoPixelStorage storage_type,
-            base::Lock* lock) override;
+            VideoPixelStorage storage_type) override;
 
+  // Implementation of VideoCaptureBufferTracker:
   std::unique_ptr<VideoCaptureBufferHandle> GetMemoryMappedAccess() override;
-  mojo::ScopedSharedBufferHandle GetHandleForTransit() override;
+  mojo::ScopedSharedBufferHandle GetHandleForTransit(bool read_only) override;
   base::SharedMemoryHandle GetNonOwnedSharedMemoryHandleForLegacyIPC() override;
 
  private:
-  friend class SharedMemoryBufferHandle;
+  SharedMemoryHandleProvider provider_;
 
-  // The memory created to be shared with renderer processes.
-  base::SharedMemory shared_memory_;
-  size_t mapped_size_;
+  DISALLOW_COPY_AND_ASSIGN(SharedMemoryBufferTracker);
 };
 
 }  // namespace media
diff --git a/media/capture/video/shared_memory_handle_provider.cc b/media/capture/video/shared_memory_handle_provider.cc
new file mode 100644
index 0000000..db5836b
--- /dev/null
+++ b/media/capture/video/shared_memory_handle_provider.cc
@@ -0,0 +1,112 @@
+// 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 "media/capture/video/shared_memory_handle_provider.h"
+
+#include "base/logging.h"
+
+namespace media {
+
+SharedMemoryHandleProvider::SharedMemoryHandleProvider() : map_ref_count_(0) {}
+
+SharedMemoryHandleProvider::~SharedMemoryHandleProvider() {
+  // If the tracker is being destroyed, there must be no outstanding
+  // Handles. If this DCHECK() triggers, it means that either there is a logic
+  // flaw in VideoCaptureBufferPoolImpl, or a client did not delete all of its
+  // owned VideoCaptureBufferHandles before calling Pool::ReliquishXYZ().
+  base::AutoLock lock(mapping_lock_);
+  DCHECK_EQ(map_ref_count_, 0);
+}
+
+bool SharedMemoryHandleProvider::InitForSize(size_t size) {
+  DCHECK_EQ(map_ref_count_, 0);
+  DCHECK(!shared_memory_);
+  shared_memory_.emplace();
+  if (shared_memory_->CreateAnonymous(size)) {
+    mapped_size_ = size;
+    read_only_flag_ = false;
+    return true;
+  }
+  return false;
+}
+
+bool SharedMemoryHandleProvider::InitFromMojoHandle(
+    mojo::ScopedSharedBufferHandle buffer_handle) {
+  DCHECK_EQ(map_ref_count_, 0);
+  DCHECK(!shared_memory_);
+
+  base::SharedMemoryHandle memory_handle;
+  const MojoResult result =
+      mojo::UnwrapSharedMemoryHandle(std::move(buffer_handle), &memory_handle,
+                                     &mapped_size_, &read_only_flag_);
+  if (result != MOJO_RESULT_OK)
+    return false;
+  shared_memory_.emplace(memory_handle, read_only_flag_);
+  return true;
+}
+
+mojo::ScopedSharedBufferHandle
+SharedMemoryHandleProvider::GetHandleForInterProcessTransit(bool read_only) {
+  if (read_only_flag_ && !read_only) {
+    // Wanted read-write access, but read-only access is all that is available.
+    NOTREACHED();
+    return mojo::ScopedSharedBufferHandle();
+  }
+  return mojo::WrapSharedMemoryHandle(
+      base::SharedMemory::DuplicateHandle(shared_memory_->handle()),
+      mapped_size_, read_only_flag_);
+}
+
+base::SharedMemoryHandle
+SharedMemoryHandleProvider::GetNonOwnedSharedMemoryHandleForLegacyIPC() {
+  return shared_memory_->handle();
+}
+
+std::unique_ptr<VideoCaptureBufferHandle>
+SharedMemoryHandleProvider::GetHandleForInProcessAccess() {
+  {
+    base::AutoLock lock(mapping_lock_);
+    DCHECK_GE(map_ref_count_, 0);
+    ++map_ref_count_;
+    if (map_ref_count_ == 1) {
+      CHECK(shared_memory_->Map(mapped_size_));
+      DVLOG(3) << __func__ << ": Mapped memory for in-process access @"
+               << shared_memory_->memory() << '.';
+    }
+  }
+
+  return std::make_unique<Handle>(this);
+}
+
+void SharedMemoryHandleProvider::OnHandleDestroyed() {
+  base::AutoLock lock(mapping_lock_);
+  DCHECK_GT(map_ref_count_, 0);
+  --map_ref_count_;
+  if (map_ref_count_ == 0) {
+    DVLOG(3) << __func__ << ": Unmapping memory for in-process access @"
+             << shared_memory_->memory() << '.';
+    CHECK(shared_memory_->Unmap());
+  }
+}
+
+SharedMemoryHandleProvider::Handle::Handle(SharedMemoryHandleProvider* owner)
+    : owner_(owner) {}
+
+SharedMemoryHandleProvider::Handle::~Handle() {
+  owner_->OnHandleDestroyed();
+}
+
+size_t SharedMemoryHandleProvider::Handle::mapped_size() const {
+  return owner_->mapped_size_;
+}
+
+uint8_t* SharedMemoryHandleProvider::Handle::data() const {
+  return static_cast<uint8_t*>(owner_->shared_memory_->memory());
+}
+
+const uint8_t* SharedMemoryHandleProvider::Handle::const_data() const {
+  return static_cast<const uint8_t*>(owner_->shared_memory_->memory());
+}
+
+}  // namespace media
diff --git a/media/capture/video/shared_memory_handle_provider.h b/media/capture/video/shared_memory_handle_provider.h
new file mode 100644
index 0000000..7acec38e
--- /dev/null
+++ b/media/capture/video/shared_memory_handle_provider.h
@@ -0,0 +1,84 @@
+// 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 MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_HANDLE_PROVIDER_H_
+#define MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_HANDLE_PROVIDER_H_
+
+#include <memory>
+
+#include "base/memory/shared_memory.h"
+#include "base/optional.h"
+#include "media/capture/capture_export.h"
+#include "media/capture/video/video_capture_buffer_handle.h"
+#include "media/capture/video/video_capture_device.h"
+#include "mojo/public/cpp/system/platform_handle.h"
+
+namespace media {
+
+// Provides handles from a single, owned base::SharedMemory instance.
+class CAPTURE_EXPORT SharedMemoryHandleProvider
+    : public media::VideoCaptureDevice::Client::Buffer::HandleProvider {
+ public:
+  // Note: One of the two InitXYZ() methods must be called before using any of
+  // the HandleProvider methods.
+  SharedMemoryHandleProvider();
+
+  ~SharedMemoryHandleProvider() override;
+
+  // Initialize by creating anonymous shared memory of the given |size|. Returns
+  // false if the operation failed.
+  bool InitForSize(size_t size);
+
+  // Initialize by duplicating an existing mojo |buffer_handle|. Returns false
+  // if the operation failed.
+  bool InitFromMojoHandle(mojo::ScopedSharedBufferHandle buffer_handle);
+
+  // Implementation of Buffer::HandleProvider:
+  mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit(
+      bool read_only) override;
+  base::SharedMemoryHandle GetNonOwnedSharedMemoryHandleForLegacyIPC() override;
+  std::unique_ptr<media::VideoCaptureBufferHandle> GetHandleForInProcessAccess()
+      override;
+
+ private:
+  // Accessor to mapped memory. While one or more of these exists, the shared
+  // memory is mapped. When the last of these is destroyed, the shared memory is
+  // unmapped.
+  class Handle : public VideoCaptureBufferHandle {
+   public:
+    explicit Handle(SharedMemoryHandleProvider* owner);
+    ~Handle() final;
+
+    size_t mapped_size() const final;
+    uint8_t* data() const final;
+    const uint8_t* const_data() const final;
+
+   private:
+    SharedMemoryHandleProvider* const owner_;
+  };
+
+  // Called by Handle to decrement |map_ref_count_| and, if zero, unmap the
+  // memory from the process. This is thread-safe.
+  void OnHandleDestroyed();
+
+  // These are set by one of the InitXYZ() methods.
+  base::Optional<base::SharedMemory> shared_memory_;
+  size_t mapped_size_;
+  bool read_only_flag_;
+
+  // Synchronizes changes to |map_ref_count_| and Map() and Unmap() operations
+  // on |shared_memory_|. This is because the thread that calls
+  // GetHandleForInProcessAccess() may pass ownership of the returned Handle to
+  // code that runs on a diffrent thread.
+  base::Lock mapping_lock_;
+
+  // The number of Handle instances that are referencing the mapped memory.
+  int map_ref_count_;
+
+  DISALLOW_COPY_AND_ASSIGN(SharedMemoryHandleProvider);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_CAPTURE_VIDEO_SHARED_MEMORY_HANDLE_PROVIDER_H_
diff --git a/media/capture/video/video_capture_buffer_handle.h b/media/capture/video/video_capture_buffer_handle.h
index 657ebc92..cbc22ef 100644
--- a/media/capture/video/video_capture_buffer_handle.h
+++ b/media/capture/video/video_capture_buffer_handle.h
@@ -5,11 +5,10 @@
 #ifndef MEDIA_CAPTURE_VIDEO_VIDEO_CAPTURE_BUFFER_HANDLE_H_
 #define MEDIA_CAPTURE_VIDEO_VIDEO_CAPTURE_BUFFER_HANDLE_H_
 
-#include "base/files/file.h"
-#include "media/base/video_frame.h"
+#include <stddef.h>
+#include <stdint.h>
+
 #include "media/capture/capture_export.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/gpu_memory_buffer.h"
 
 namespace media {
 
diff --git a/media/capture/video/video_capture_buffer_pool.h b/media/capture/video/video_capture_buffer_pool.h
index ab66edf..050f487 100644
--- a/media/capture/video/video_capture_buffer_pool.h
+++ b/media/capture/video/video_capture_buffer_pool.h
@@ -41,9 +41,11 @@
  public:
   static constexpr int kInvalidId = -1;
 
-  // One-time (per client/per-buffer) call to allow sharing |buffer_id|.
+  // Provides a duplicate handle to the buffer. Destruction of this scoped Mojo
+  // handle does not result in releasing the shared memory held by the pool.
   virtual mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit(
-      int buffer_id) = 0;
+      int buffer_id,
+      bool read_only) = 0;
 
   virtual base::SharedMemoryHandle GetNonOwnedSharedMemoryHandleForLegacyIPC(
       int buffer_id) = 0;
diff --git a/media/capture/video/video_capture_buffer_pool_impl.cc b/media/capture/video/video_capture_buffer_pool_impl.cc
index da6857f..9ef965da 100644
--- a/media/capture/video/video_capture_buffer_pool_impl.cc
+++ b/media/capture/video/video_capture_buffer_pool_impl.cc
@@ -28,7 +28,8 @@
 VideoCaptureBufferPoolImpl::~VideoCaptureBufferPoolImpl() {}
 
 mojo::ScopedSharedBufferHandle
-VideoCaptureBufferPoolImpl::GetHandleForInterProcessTransit(int buffer_id) {
+VideoCaptureBufferPoolImpl::GetHandleForInterProcessTransit(int buffer_id,
+                                                            bool read_only) {
   base::AutoLock lock(lock_);
 
   VideoCaptureBufferTracker* tracker = GetTracker(buffer_id);
@@ -36,7 +37,7 @@
     NOTREACHED() << "Invalid buffer_id.";
     return mojo::ScopedSharedBufferHandle();
   }
-  return tracker->GetHandleForTransit();
+  return tracker->GetHandleForTransit(read_only);
 }
 
 base::SharedMemoryHandle
@@ -227,9 +228,7 @@
 
   std::unique_ptr<VideoCaptureBufferTracker> tracker =
       buffer_tracker_factory_->CreateTracker(storage_type);
-  // TODO(emircan): We pass the lock here to solve GMB allocation issue, see
-  // crbug.com/545238.
-  if (!tracker->Init(dimensions, pixel_format, storage_type, &lock_)) {
+  if (!tracker->Init(dimensions, pixel_format, storage_type)) {
     DLOG(ERROR) << "Error initializing VideoCaptureBufferTracker";
     return kInvalidId;
   }
diff --git a/media/capture/video/video_capture_buffer_pool_impl.h b/media/capture/video/video_capture_buffer_pool_impl.h
index b5073df..72b0c43 100644
--- a/media/capture/video/video_capture_buffer_pool_impl.h
+++ b/media/capture/video/video_capture_buffer_pool_impl.h
@@ -36,7 +36,8 @@
 
   // VideoCaptureBufferPool implementation.
   mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit(
-      int buffer_id) override;
+      int buffer_id,
+      bool read_only) override;
   base::SharedMemoryHandle GetNonOwnedSharedMemoryHandleForLegacyIPC(
       int buffer_id) override;
   std::unique_ptr<VideoCaptureBufferHandle> GetHandleForInProcessAccess(
diff --git a/media/capture/video/video_capture_buffer_tracker.h b/media/capture/video/video_capture_buffer_tracker.h
index 7ef13ecf..b0e4e34 100644
--- a/media/capture/video/video_capture_buffer_tracker.h
+++ b/media/capture/video/video_capture_buffer_tracker.h
@@ -27,8 +27,7 @@
         frame_feedback_id_(0) {}
   virtual bool Init(const gfx::Size& dimensions,
                     media::VideoPixelFormat format,
-                    media::VideoPixelStorage storage_type,
-                    base::Lock* lock) = 0;
+                    media::VideoPixelStorage storage_type) = 0;
   virtual ~VideoCaptureBufferTracker(){};
 
   const gfx::Size& dimensions() const { return dimensions_; }
@@ -51,7 +50,8 @@
   int frame_feedback_id() { return frame_feedback_id_; }
 
   virtual std::unique_ptr<VideoCaptureBufferHandle> GetMemoryMappedAccess() = 0;
-  virtual mojo::ScopedSharedBufferHandle GetHandleForTransit() = 0;
+  virtual mojo::ScopedSharedBufferHandle GetHandleForTransit(
+      bool read_only) = 0;
   virtual base::SharedMemoryHandle
   GetNonOwnedSharedMemoryHandleForLegacyIPC() = 0;
 
diff --git a/media/capture/video/video_capture_device.h b/media/capture/video/video_capture_device.h
index fc66c3f..a5aa8c0 100644
--- a/media/capture/video/video_capture_device.h
+++ b/media/capture/video/video_capture_device.h
@@ -95,8 +95,8 @@
       class CAPTURE_EXPORT HandleProvider {
        public:
         virtual ~HandleProvider() {}
-        virtual mojo::ScopedSharedBufferHandle
-        GetHandleForInterProcessTransit() = 0;
+        virtual mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit(
+            bool read_only) = 0;
         virtual base::SharedMemoryHandle
         GetNonOwnedSharedMemoryHandleForLegacyIPC() = 0;
         virtual std::unique_ptr<VideoCaptureBufferHandle>
diff --git a/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc
index caaf011..a8eaee5 100644
--- a/media/capture/video/video_capture_device_client.cc
+++ b/media/capture/video/video_capture_device_client.cc
@@ -79,8 +79,9 @@
       : buffer_pool_(std::move(buffer_pool)), buffer_id_(buffer_id) {}
 
   // Implementation of HandleProvider:
-  mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit() override {
-    return buffer_pool_->GetHandleForInterProcessTransit(buffer_id_);
+  mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit(
+      bool read_only) override {
+    return buffer_pool_->GetHandleForInterProcessTransit(buffer_id_, read_only);
   }
   base::SharedMemoryHandle GetNonOwnedSharedMemoryHandleForLegacyIPC()
       override {
diff --git a/media/gpu/android/codec_wrapper.cc b/media/gpu/android/codec_wrapper.cc
index e3efc28..ed23903 100644
--- a/media/gpu/android/codec_wrapper.cc
+++ b/media/gpu/android/codec_wrapper.cc
@@ -26,8 +26,8 @@
                    base::Closure output_buffer_release_cb);
 
   std::unique_ptr<MediaCodecBridge> TakeCodec();
-  bool HasValidCodecOutputBuffers() const;
-  void DiscardCodecOutputBuffers();
+  bool HasUnreleasedOutputBuffers() const;
+  void DiscardOutputBuffers();
   bool IsFlushed() const;
   bool IsDraining() const;
   bool IsDrained() const;
@@ -71,7 +71,7 @@
   friend base::RefCountedThreadSafe<CodecWrapperImpl>;
   ~CodecWrapperImpl();
 
-  void DiscardCodecOutputBuffers_Locked();
+  void DiscardOutputBuffers_Locked();
 
   // |lock_| protects access to all member variables.
   mutable base::Lock lock_;
@@ -123,7 +123,7 @@
   base::AutoLock l(lock_);
   if (!codec_)
     return nullptr;
-  DiscardCodecOutputBuffers_Locked();
+  DiscardOutputBuffers_Locked();
   return std::move(codec_);
 }
 
@@ -142,18 +142,18 @@
   return state_ == State::kDrained;
 }
 
-bool CodecWrapperImpl::HasValidCodecOutputBuffers() const {
+bool CodecWrapperImpl::HasUnreleasedOutputBuffers() const {
   base::AutoLock l(lock_);
   return !buffer_ids_.empty();
 }
 
-void CodecWrapperImpl::DiscardCodecOutputBuffers() {
+void CodecWrapperImpl::DiscardOutputBuffers() {
   DVLOG(2) << __func__;
   base::AutoLock l(lock_);
-  DiscardCodecOutputBuffers_Locked();
+  DiscardOutputBuffers_Locked();
 }
 
-void CodecWrapperImpl::DiscardCodecOutputBuffers_Locked() {
+void CodecWrapperImpl::DiscardOutputBuffers_Locked() {
   DVLOG(2) << __func__;
   lock_.AssertAcquired();
   for (auto& kv : buffer_ids_)
@@ -252,8 +252,8 @@
   DVLOG(4) << __func__;
   base::AutoLock l(lock_);
   DCHECK(codec_ && state_ != State::kError);
-  // If |*codec_buffer| were not null, deleting it may deadlock when it
-  // tries to release itself.
+  // If |*codec_buffer| were not null, deleting it would deadlock when its
+  // destructor calls ReleaseCodecOutputBuffer().
   DCHECK(!*codec_buffer);
 
   // Dequeue in a loop so we can avoid propagating the uninteresting
@@ -334,7 +334,8 @@
   if (!valid)
     return false;
 
-  // Discard the buffers preceding the one we're releasing.
+  // Discard the buffers preceding the one we're releasing. The buffers are in
+  // presentation order because the ids are generated in presentation order.
   for (auto it = buffer_ids_.begin(); it < buffer_it; ++it) {
     int index = it->second;
     codec_->ReleaseOutputBuffer(index, false);
@@ -363,12 +364,12 @@
   return impl_->TakeCodec();
 }
 
-bool CodecWrapper::HasValidCodecOutputBuffers() const {
-  return impl_->HasValidCodecOutputBuffers();
+bool CodecWrapper::HasUnreleasedOutputBuffers() const {
+  return impl_->HasUnreleasedOutputBuffers();
 }
 
-void CodecWrapper::DiscardCodecOutputBuffers() {
-  impl_->DiscardCodecOutputBuffers();
+void CodecWrapper::DiscardOutputBuffers() {
+  impl_->DiscardOutputBuffers();
 }
 
 bool CodecWrapper::SupportsFlush(DeviceInfo* device_info) const {
diff --git a/media/gpu/android/codec_wrapper.h b/media/gpu/android/codec_wrapper.h
index 87d0261c..94ee899 100644
--- a/media/gpu/android/codec_wrapper.h
+++ b/media/gpu/android/codec_wrapper.h
@@ -86,12 +86,11 @@
   // Whether an EOS has been dequeued but the codec hasn't been flushed yet.
   bool IsDrained() const;
 
-  // Whether there are any valid CodecOutputBuffers that have not been released.
-  bool HasValidCodecOutputBuffers() const;
+  // Whether there are any dequeued output buffers that have not been released.
+  bool HasUnreleasedOutputBuffers() const;
 
-  // Releases currently dequeued codec buffers back to the codec without
-  // rendering.
-  void DiscardCodecOutputBuffers();
+  // Releases all dequeued output buffers back to the codec without rendering.
+  void DiscardOutputBuffers();
 
   // Whether the codec supports Flush().
   bool SupportsFlush(DeviceInfo* device_info) const;
diff --git a/media/gpu/android/codec_wrapper_unittest.cc b/media/gpu/android/codec_wrapper_unittest.cc
index 16ff9fd..5be6d6f 100644
--- a/media/gpu/android/codec_wrapper_unittest.cc
+++ b/media/gpu/android/codec_wrapper_unittest.cc
@@ -67,7 +67,7 @@
 }
 
 TEST_F(CodecWrapperTest, InitiallyThereAreNoValidCodecOutputBuffers) {
-  ASSERT_FALSE(wrapper_->HasValidCodecOutputBuffers());
+  ASSERT_FALSE(wrapper_->HasUnreleasedOutputBuffers());
 }
 
 TEST_F(CodecWrapperTest, FlushInvalidatesCodecOutputBuffers) {
@@ -94,7 +94,7 @@
   wrapper_->Flush();
   ASSERT_FALSE(codec_buffer1->ReleaseToSurface());
   ASSERT_FALSE(codec_buffer2->ReleaseToSurface());
-  ASSERT_FALSE(wrapper_->HasValidCodecOutputBuffers());
+  ASSERT_FALSE(wrapper_->HasUnreleasedOutputBuffers());
 }
 
 TEST_F(CodecWrapperTest, CodecOutputBuffersAfterFlushAreValid) {
diff --git a/media/gpu/android/fake_codec_allocator.cc b/media/gpu/android/fake_codec_allocator.cc
index d957b7c..21aa7c7b 100644
--- a/media/gpu/android/fake_codec_allocator.cc
+++ b/media/gpu/android/fake_codec_allocator.cc
@@ -56,6 +56,7 @@
   most_recent_codec_destruction_observer_ = nullptr;
   CopyCodecAllocParams(config);
   client_ = client;
+  codec_creation_pending_ = true;
 
   MockCreateMediaCodecAsync(most_recent_overlay(),
                             most_recent_surface_texture());
@@ -69,8 +70,11 @@
 }
 
 MockMediaCodecBridge* FakeCodecAllocator::ProvideMockCodecAsync() {
-  // There must be a pending codec creation.
-  DCHECK(client_);
+  DCHECK(codec_creation_pending_);
+  codec_creation_pending_ = false;
+
+  if (!client_)
+    return nullptr;
 
   std::unique_ptr<MockMediaCodecBridge> codec =
       base::MakeUnique<NiceMock<MockMediaCodecBridge>>();
@@ -82,10 +86,11 @@
 }
 
 void FakeCodecAllocator::ProvideNullCodecAsync() {
-  // There must be a pending codec creation.
-  DCHECK(client_);
+  DCHECK(codec_creation_pending_);
+  codec_creation_pending_ = false;
   most_recent_codec_ = nullptr;
-  client_->OnCodecConfigured(nullptr);
+  if (client_)
+    client_->OnCodecConfigured(nullptr);
 }
 
 void FakeCodecAllocator::CopyCodecAllocParams(
diff --git a/media/gpu/android/fake_codec_allocator.h b/media/gpu/android/fake_codec_allocator.h
index 79a380db..566947d 100644
--- a/media/gpu/android/fake_codec_allocator.h
+++ b/media/gpu/android/fake_codec_allocator.h
@@ -48,7 +48,7 @@
       scoped_refptr<AVDASurfaceBundle> surface_bundle) override;
 
   // Satisfies the pending codec creation with a mock codec and returns a raw
-  // pointer to it.
+  // pointer to it. Returns nullptr if the client WeakPtr was invalidated.
   MockMediaCodecBridge* ProvideMockCodecAsync();
 
   // Satisfies the pending codec creation with a null codec.
@@ -94,6 +94,9 @@
   // get modified by the client.
   void CopyCodecAllocParams(scoped_refptr<CodecConfig> config);
 
+  // Whether CreateMediaCodecAsync() has been called but a codec hasn't been
+  // provided yet.
+  bool codec_creation_pending_ = false;
   base::WeakPtr<AVDACodecAllocatorClient> client_;
   scoped_refptr<CodecConfig> config_;
 
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc
index 05da1c6a..5bfd39b 100644
--- a/media/gpu/android/media_codec_video_decoder.cc
+++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -82,7 +82,7 @@
 
 }  // namespace
 
-CodecAllocatorAdapter::CodecAllocatorAdapter() = default;
+CodecAllocatorAdapter::CodecAllocatorAdapter() : weak_factory(this) {}
 CodecAllocatorAdapter::~CodecAllocatorAdapter() = default;
 
 void CodecAllocatorAdapter::OnCodecConfigured(
@@ -209,10 +209,10 @@
     scoped_refptr<SurfaceTextureGLOwner> surface_texture) {
   DVLOG(2) << __func__;
   if (!surface_texture) {
-    HandleError();
+    EnterTerminalState(State::kError);
     return;
   }
-  surface_texture_ = std::move(surface_texture);
+  surface_texture_bundle_ = new AVDASurfaceBundle(std::move(surface_texture));
   InitializeSurfaceChooser();
 }
 
@@ -252,7 +252,7 @@
   if (state_ == State::kBeforeSurfaceInit) {
     codec_config_->surface_bundle =
         overlay ? new AVDASurfaceBundle(std::move(overlay))
-                : new AVDASurfaceBundle(surface_texture_);
+                : surface_texture_bundle_;
     CreateCodec();
     return;
   }
@@ -266,20 +266,20 @@
   // (It's not possible for this to choose the overlay we're already using.)
   if (!overlay && codec_config_->surface_bundle &&
       !codec_config_->surface_bundle->overlay) {
-    incoming_surface_.reset();
+    incoming_surface_ = nullptr;
     return;
   }
 
-  incoming_surface_.emplace(overlay ? new AVDASurfaceBundle(std::move(overlay))
-                                    : new AVDASurfaceBundle(surface_texture_));
+  incoming_surface_ = overlay ? new AVDASurfaceBundle(std::move(overlay))
+                              : surface_texture_bundle_;
 }
 
 void MediaCodecVideoDecoder::OnSurfaceDestroyed(AndroidOverlay* overlay) {
   DVLOG(2) << __func__;
 
   // If there is a pending transition to the overlay, cancel it.
-  if (incoming_surface_ && (*incoming_surface_)->overlay.get() == overlay) {
-    incoming_surface_.reset();
+  if (incoming_surface_ && incoming_surface_->overlay.get() == overlay) {
+    incoming_surface_ = nullptr;
     return;
   }
 
@@ -289,26 +289,21 @@
     return;
   }
 
+  // If we can't do the transition, enter state kSurfaceDestroyed.
   // TODO(watk): If setOutputSurface() is available we're supposed to
   // transparently handle surface transitions, however we don't handle them
   // while codec creation is in progress. It should be handled gracefully
   // by allocating a new codec.
-  if (state_ == State::kWaitingForCodec) {
-    state_ = State::kSurfaceDestroyed;
+  if (!device_info_->IsSetOutputSurfaceSupported() ||
+      state_ == State::kWaitingForCodec) {
+    EnterTerminalState(State::kSurfaceDestroyed);
     return;
   }
 
-  if (!device_info_->IsSetOutputSurfaceSupported()) {
-    state_ = State::kSurfaceDestroyed;
-    ReleaseCodecAndBundle();
-    if (drain_type_)
-      OnCodecDrained();
-    return;
-  }
-
-  // If there isn't a pending overlay then transition to a SurfaceTexture.
+  // We're using the destroyed overlay so try to transition away from it
+  // (defaulting to a SurfaceTexture).
   if (!incoming_surface_)
-    incoming_surface_.emplace(new AVDASurfaceBundle(surface_texture_));
+    incoming_surface_ = surface_texture_bundle_;
   TransitionToIncomingSurface();
 }
 
@@ -316,14 +311,11 @@
   DVLOG(2) << __func__;
   DCHECK(incoming_surface_);
   DCHECK(codec_);
-  auto surface_bundle = std::move(*incoming_surface_);
-  incoming_surface_.reset();
-  if (codec_->SetSurface(surface_bundle->GetJavaSurface()) == MEDIA_CODEC_OK) {
+  auto surface_bundle = std::move(incoming_surface_);
+  if (codec_->SetSurface(surface_bundle->GetJavaSurface()) == MEDIA_CODEC_OK)
     codec_config_->surface_bundle = std::move(surface_bundle);
-  } else {
-    ReleaseCodecAndBundle();
-    HandleError();
-  }
+  else
+    EnterTerminalState(State::kError);
 }
 
 void MediaCodecVideoDecoder::CreateCodec() {
@@ -331,37 +323,25 @@
   state_ = State::kWaitingForCodec;
   codec_allocator_adapter_.codec_created_cb = base::Bind(
       &MediaCodecVideoDecoder::OnCodecCreated, weak_factory_.GetWeakPtr());
-  codec_allocator_->CreateMediaCodecAsync(codec_allocator_adapter_.AsWeakPtr(),
-                                          codec_config_);
+  codec_allocator_->CreateMediaCodecAsync(
+      codec_allocator_adapter_.weak_factory.GetWeakPtr(), codec_config_);
 }
 
 void MediaCodecVideoDecoder::OnCodecCreated(
     std::unique_ptr<MediaCodecBridge> codec) {
-  DCHECK(state_ == State::kWaitingForCodec ||
-         state_ == State::kSurfaceDestroyed);
+  DCHECK_EQ(state_, State::kWaitingForCodec);
   DCHECK(!codec_);
-  if (codec) {
-    codec_ = base::MakeUnique<CodecWrapper>(
-        std::move(codec),
-        BindToCurrentLoop(base::Bind(&MediaCodecVideoDecoder::ManageTimer,
-                                     weak_factory_.GetWeakPtr(), true)));
-  }
 
-  // If we entered state kSurfaceDestroyed while we were waiting for
-  // the codec, then it's already invalid and we have to drop it.
-  if (state_ == State::kSurfaceDestroyed) {
-    ReleaseCodecAndBundle();
-    return;
-  }
-
-  // Handle the failure case after the kSurfaceDestroyed case to avoid
-  // transitioning from kSurfaceDestroyed to kError.
-  if (!codec_) {
-    HandleError();
+  if (!codec) {
+    EnterTerminalState(State::kError);
     return;
   }
 
   state_ = State::kOk;
+  codec_ = base::MakeUnique<CodecWrapper>(
+      std::move(codec),
+      BindToCurrentLoop(base::Bind(&MediaCodecVideoDecoder::ManageTimer,
+                                   weak_factory_.GetWeakPtr(), true)));
   ManageTimer(true);
 }
 
@@ -393,7 +373,7 @@
   if (codec_->SupportsFlush(device_info_)) {
     DVLOG(2) << "Flushing codec";
     if (!codec_->Flush()) {
-      HandleError();
+      EnterTerminalState(State::kError);
       return;
     }
   } else {
@@ -451,14 +431,14 @@
     return false;
   }
 
-  // Flush the codec when there are no unrendered codec buffers, but decodes
-  // pending. This lets us avoid unbacking any frames when we flush, but only
-  // flush when we have more frames to decode. Without waiting for pending
-  // decodes we would create a new codec at the end of playback on devices that
-  // need the flush workaround.
+  // If the codec is drained, flush it when there is a pending decode and no
+  // unreleased output buffers. This lets us avoid both unbacking frames when we
+  // flush, and flushing unnecessarily, like at EOS.
   if (codec_->IsDrained()) {
-    if (!codec_->HasValidCodecOutputBuffers() && !pending_decodes_.empty())
+    if (!codec_->HasUnreleasedOutputBuffers() && !pending_decodes_.empty()) {
       FlushCodec();
+      return true;
+    }
     return false;
   }
 
@@ -469,7 +449,7 @@
   MediaCodecStatus status = codec_->DequeueInputBuffer(&input_buffer);
   if (status == MEDIA_CODEC_ERROR) {
     DVLOG(1) << "DequeueInputBuffer() error";
-    HandleError();
+    EnterTerminalState(State::kError);
     return false;
   } else if (status == MEDIA_CODEC_TRY_AGAIN_LATER) {
     return false;
@@ -498,7 +478,7 @@
       << "Encrypted support not yet implemented";
   if (queue_status != MEDIA_CODEC_OK) {
     pending_decode.decode_cb.Run(DecodeStatus::DECODE_ERROR);
-    HandleError();
+    EnterTerminalState(State::kError);
     return false;
   }
 
@@ -514,14 +494,17 @@
     return false;
   }
 
-  // Transition to the incoming surface when there are no unrendered codec
-  // buffers. This is so we can ensure we create the right kind of VideoFrame
-  // for the current surface.
+  // If a surface transition is pending, wait for all outstanding buffers to be
+  // released before doing the transition. This is necessary because the
+  // VideoFrames corresponding to these buffers have metadata flags specific to
+  // the surface type, and changing the surface before they're rendered would
+  // invalidate them.
   if (incoming_surface_) {
-    if (codec_->HasValidCodecOutputBuffers())
-      return false;
-    TransitionToIncomingSurface();
-    return true;
+    if (!codec_->HasUnreleasedOutputBuffers()) {
+      TransitionToIncomingSurface();
+      return true;
+    }
+    return false;
   }
 
   base::TimeDelta presentation_time;
@@ -531,9 +514,7 @@
       codec_->DequeueOutputBuffer(&presentation_time, &eos, &output_buffer);
   if (status == MEDIA_CODEC_ERROR) {
     DVLOG(1) << "DequeueOutputBuffer() error";
-    HandleError();
-    if (drain_type_)
-      OnCodecDrained();
+    EnterTerminalState(State::kError);
     return false;
   } else if (status == MEDIA_CODEC_TRY_AGAIN_LATER) {
     return false;
@@ -566,8 +547,8 @@
     return true;
 
   video_frame_factory_->CreateVideoFrame(
-      std::move(output_buffer), surface_texture_, presentation_time,
-      decoder_config_.natural_size(),
+      std::move(output_buffer), surface_texture_bundle_->surface_texture,
+      presentation_time, decoder_config_.natural_size(),
       base::Bind(&MediaCodecVideoDecoder::ForwardVideoFrame,
                  weak_factory_.GetWeakPtr(), reset_generation_));
   return true;
@@ -603,7 +584,9 @@
   // Skip the drain if possible. Only VP8 codecs need draining because
   // they can hang in release() or flush() otherwise
   // (http://crbug.com/598963).
-  if (!codec_ || decoder_config_.codec() != kCodecVP8 || codec_->IsFlushed() ||
+  // TODO(watk): Strongly consider blacklisting VP8 (or specific MediaCodecs)
+  // instead. Draining is responsible for a lot of complexity.
+  if (decoder_config_.codec() != kCodecVP8 || !codec_ || codec_->IsFlushed() ||
       codec_->IsDrained()) {
     OnCodecDrained();
     return;
@@ -612,9 +595,10 @@
   // Queue EOS if the codec isn't already processing one.
   if (!codec_->IsDraining())
     pending_decodes_.push_back(PendingDecode::CreateEos());
+
   // We can safely invalidate outstanding buffers for both types of drain, and
   // doing so can only make the drain complete quicker.
-  codec_->DiscardCodecOutputBuffers();
+  codec_->DiscardOutputBuffers();
   PumpCodec(true);
 }
 
@@ -633,10 +617,19 @@
   FlushCodec();
 }
 
-void MediaCodecVideoDecoder::HandleError() {
-  DVLOG(2) << __func__;
-  state_ = State::kError;
-  ClearPendingDecodes(DecodeStatus::DECODE_ERROR);
+void MediaCodecVideoDecoder::EnterTerminalState(State state) {
+  DVLOG(2) << __func__ << static_cast<int>(state);
+  DCHECK(state == State::kError || state == State::kSurfaceDestroyed);
+  state_ = state;
+
+  // Cancel pending codec creation.
+  codec_allocator_adapter_.weak_factory.InvalidateWeakPtrs();
+  pump_codec_timer_.Stop();
+  ReleaseCodecAndBundle();
+  if (state == State::kError)
+    ClearPendingDecodes(DecodeStatus::DECODE_ERROR);
+  if (drain_type_)
+    OnCodecDrained();
 }
 
 void MediaCodecVideoDecoder::ClearPendingDecodes(DecodeStatus status) {
diff --git a/media/gpu/android/media_codec_video_decoder.h b/media/gpu/android/media_codec_video_decoder.h
index eb0f8904..a46ac8d 100644
--- a/media/gpu/android/media_codec_video_decoder.h
+++ b/media/gpu/android/media_codec_video_decoder.h
@@ -38,9 +38,7 @@
 };
 
 // TODO(watk): Simplify the interface to AVDACodecAllocator.
-struct CodecAllocatorAdapter
-    : public AVDACodecAllocatorClient,
-      public base::SupportsWeakPtr<CodecAllocatorAdapter> {
+struct CodecAllocatorAdapter : public AVDACodecAllocatorClient {
   using CodecCreatedCb =
       base::Callback<void(std::unique_ptr<MediaCodecBridge>)>;
 
@@ -50,6 +48,7 @@
       std::unique_ptr<MediaCodecBridge> media_codec) override;
 
   CodecCreatedCb codec_created_cb;
+  base::WeakPtrFactory<CodecAllocatorAdapter> weak_factory;
 };
 
 // An Android VideoDecoder that delegates to MediaCodec.
@@ -155,8 +154,9 @@
 
   void ClearPendingDecodes(DecodeStatus status);
 
-  // Sets |state_| and runs pending callbacks.
-  void HandleError();
+  // Sets |state_| and does common teardown for the terminal states. |state_|
+  // must be either kSurfaceDestroyed or kError.
+  void EnterTerminalState(State state);
 
   // Releases |codec_| if it's not null.
   void ReleaseCodec();
@@ -189,8 +189,8 @@
   VideoFrameFactory::OutputWithReleaseMailboxCB output_cb_;
   VideoDecoderConfig decoder_config_;
 
-  // The surface bundle that we're transitioning to, if any.
-  base::Optional<scoped_refptr<AVDASurfaceBundle>> incoming_surface_;
+  // The surface bundle that we should transition to if a transition is pending.
+  scoped_refptr<AVDASurfaceBundle> incoming_surface_;
 
   // |codec_config_| must not be modified while |state_| is kWaitingForCodec.
   scoped_refptr<CodecConfig> codec_config_;
@@ -205,14 +205,14 @@
   CodecAllocatorAdapter codec_allocator_adapter_;
   AVDACodecAllocator* codec_allocator_;
 
-  // A SurfaceTexture that is kept for the lifetime of MCVD so that if we have
-  // to synchronously switch surfaces we always have one available.
+  // A SurfaceTexture bundle that is kept for the lifetime of MCVD so that if we
+  // have to synchronously switch surfaces we always have one available.
   // TODO: Remove this once onSurfaceDestroyed() callbacks are not delivered
   // via the gpu thread. We can't post a task to the gpu thread to
   // create a SurfaceTexture inside the onSurfaceDestroyed() handler without
   // deadlocking currently, because the gpu thread might be blocked waiting
   // for the SurfaceDestroyed to be handled.
-  scoped_refptr<SurfaceTextureGLOwner> surface_texture_;
+  scoped_refptr<AVDASurfaceBundle> surface_texture_bundle_;
 
   // The current overlay info, which possibly specifies an overlay to render to.
   OverlayInfo overlay_info_;
diff --git a/media/gpu/android/media_codec_video_decoder_unittest.cc b/media/gpu/android/media_codec_video_decoder_unittest.cc
index 2e6f201..43edd1c 100644
--- a/media/gpu/android/media_codec_video_decoder_unittest.cc
+++ b/media/gpu/android/media_codec_video_decoder_unittest.cc
@@ -315,15 +315,14 @@
 }
 
 TEST_F(MediaCodecVideoDecoderTest,
-       SurfaceDestroyedBeforeCodecCreationDropsCodec) {
+       CodecCreationWeakPtrIsInvalidatedBySurfaceDestroyed) {
   auto* overlay = InitializeWithOverlay_OneDecodePending();
   overlay->OnSurfaceDestroyed();
 
-  // The codec is dropped as soon as it's ready.
-  EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(_, _, _));
-  codec_allocator_->ProvideMockCodecAsync();
-  // Verify expectations before we delete the MCVD.
-  testing::Mock::VerifyAndClearExpectations(codec_allocator_.get());
+  // MCVD should invalidate its CodecAllocatorClient WeakPtr so that it doesn't
+  // receive the codec after surface destroyed. FakeCodecAllocator returns
+  // nullptr if the client pointer was invalidated.
+  ASSERT_FALSE(codec_allocator_->ProvideMockCodecAsync());
 }
 
 TEST_F(MediaCodecVideoDecoderTest, SurfaceDestroyedDoesSyncSurfaceTransition) {
diff --git a/media/gpu/ipc/common/media_message_generator.cc b/media/gpu/ipc/common/media_message_generator.cc
index 6e8178ce..9f3c3ab 100644
--- a/media/gpu/ipc/common/media_message_generator.cc
+++ b/media/gpu/ipc/common/media_message_generator.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "media/gpu/ipc/common/media_message_generator.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "media/gpu/ipc/common/media_message_generator.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/media/gpu/ipc/common/media_param_traits.cc b/media/gpu/ipc/common/media_param_traits.cc
index 13903c78..3ef6325 100644
--- a/media/gpu/ipc/common/media_param_traits.cc
+++ b/media/gpu/ipc/common/media_param_traits.cc
@@ -12,20 +12,6 @@
 
 namespace IPC {
 
-void ParamTraits<media::BitstreamBuffer>::GetSize(base::PickleSizer* s,
-                                                  const param_type& p) {
-  GetParamSize(s, p.id());
-  GetParamSize(s, static_cast<uint64_t>(p.size()));
-  GetParamSize(s, static_cast<uint64_t>(p.offset()));
-  GetParamSize(s, p.presentation_timestamp());
-  GetParamSize(s, p.key_id());
-  if (!p.key_id().empty()) {
-    GetParamSize(s, p.iv());
-    GetParamSize(s, p.subsamples());
-  }
-  GetParamSize(s, p.handle());
-}
-
 void ParamTraits<media::BitstreamBuffer>::Write(base::Pickle* m,
                                                 const param_type& p) {
   WriteParam(m, p.id());
@@ -85,13 +71,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef MEDIA_GPU_IPC_COMMON_MEDIA_PARAM_TRAITS_MACROS_H_
-#include "media/gpu/ipc/common/media_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/media/gpu/ipc/common/media_param_traits.h b/media/gpu/ipc/common/media_param_traits.h
index cd71546..8d8bb1dc 100644
--- a/media/gpu/ipc/common/media_param_traits.h
+++ b/media/gpu/ipc/common/media_param_traits.h
@@ -13,7 +13,6 @@
 template <>
 struct ParamTraits<media::BitstreamBuffer> {
   using param_type = media::BitstreamBuffer;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/media/mojo/clients/mojo_cdm.cc b/media/mojo/clients/mojo_cdm.cc
index 74a06437..4d932f2b 100644
--- a/media/mojo/clients/mojo_cdm.cc
+++ b/media/mojo/clients/mojo_cdm.cc
@@ -119,8 +119,7 @@
   // TODO(jrummell): Pass |security_origin| as a url.mojom.Origin.
   // http://crbug.com/639438.
   remote_cdm_->Initialize(
-      key_system, security_origin.Serialize(),
-      mojom::CdmConfig::From(cdm_config),
+      key_system, security_origin.Serialize(), cdm_config,
       base::Bind(&MojoCdm::OnCdmInitialized, base::Unretained(this)));
 }
 
diff --git a/media/mojo/clients/mojo_renderer_unittest.cc b/media/mojo/clients/mojo_renderer_unittest.cc
index 222543f..f55ef4a 100644
--- a/media/mojo/clients/mojo_renderer_unittest.cc
+++ b/media/mojo/clients/mojo_renderer_unittest.cc
@@ -180,8 +180,7 @@
                                          &cdm_factory_),
         mojo::MakeRequest(&remote_cdm_));
     remote_cdm_->Initialize(
-        kClearKeyKeySystem, "https://www.test.com",
-        mojom::CdmConfig::From(CdmConfig()),
+        kClearKeyKeySystem, "https://www.test.com", CdmConfig(),
         base::Bind(&MojoRendererTest::OnCdmCreated, base::Unretained(this)));
     base::RunLoop().RunUntilIdle();
   }
diff --git a/media/mojo/common/media_type_converters.cc b/media/mojo/common/media_type_converters.cc
index d1f584c..e6f110b 100644
--- a/media/mojo/common/media_type_converters.cc
+++ b/media/mojo/common/media_type_converters.cc
@@ -11,7 +11,6 @@
 #include "base/numerics/safe_conversions.h"
 #include "media/base/audio_buffer.h"
 #include "media/base/audio_decoder_config.h"
-#include "media/base/cdm_config.h"
 #include "media/base/cdm_key_information.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/decrypt_config.h"
@@ -182,28 +181,6 @@
 }
 
 // static
-media::mojom::CdmConfigPtr
-TypeConverter<media::mojom::CdmConfigPtr, media::CdmConfig>::Convert(
-    const media::CdmConfig& input) {
-  media::mojom::CdmConfigPtr config(media::mojom::CdmConfig::New());
-  config->allow_distinctive_identifier = input.allow_distinctive_identifier;
-  config->allow_persistent_state = input.allow_persistent_state;
-  config->use_hw_secure_codecs = input.use_hw_secure_codecs;
-  return config;
-}
-
-// static
-media::CdmConfig
-TypeConverter<media::CdmConfig, media::mojom::CdmConfigPtr>::Convert(
-    const media::mojom::CdmConfigPtr& input) {
-  media::CdmConfig config;
-  config.allow_distinctive_identifier = input->allow_distinctive_identifier;
-  config.allow_persistent_state = input->allow_persistent_state;
-  config.use_hw_secure_codecs = input->use_hw_secure_codecs;
-  return config;
-}
-
-// static
 media::mojom::AudioBufferPtr
 TypeConverter<media::mojom::AudioBufferPtr, scoped_refptr<media::AudioBuffer>>::
     Convert(const scoped_refptr<media::AudioBuffer>& input) {
diff --git a/media/mojo/common/media_type_converters.h b/media/mojo/common/media_type_converters.h
index d99cf1b66..24efca6 100644
--- a/media/mojo/common/media_type_converters.h
+++ b/media/mojo/common/media_type_converters.h
@@ -17,7 +17,6 @@
 class AudioDecoderConfig;
 class DecoderBuffer;
 class DecryptConfig;
-struct CdmConfig;
 struct CdmKeyInformation;
 }
 
@@ -77,15 +76,6 @@
 };
 
 template <>
-struct TypeConverter<media::mojom::CdmConfigPtr, media::CdmConfig> {
-  static media::mojom::CdmConfigPtr Convert(const media::CdmConfig& input);
-};
-template <>
-struct TypeConverter<media::CdmConfig, media::mojom::CdmConfigPtr> {
-  static media::CdmConfig Convert(const media::mojom::CdmConfigPtr& input);
-};
-
-template <>
 struct TypeConverter<media::mojom::AudioBufferPtr,
                      scoped_refptr<media::AudioBuffer>> {
   static media::mojom::AudioBufferPtr Convert(
diff --git a/media/mojo/common/media_type_converters_unittest.cc b/media/mojo/common/media_type_converters_unittest.cc
index 3d5d2a5..28ab886 100644
--- a/media/mojo/common/media_type_converters_unittest.cc
+++ b/media/mojo/common/media_type_converters_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/memory/ptr_util.h"
 #include "media/base/audio_buffer.h"
 #include "media/base/audio_decoder_config.h"
-#include "media/base/cdm_config.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/encryption_scheme.h"
 #include "media/base/media_util.h"
@@ -163,21 +162,6 @@
   EXPECT_TRUE(buffer->decrypt_config()->iv().empty());
 }
 
-TEST(MediaTypeConvertersTest, ConvertCdmConfig) {
-  CdmConfig config;
-  config.allow_distinctive_identifier = true;
-  config.allow_persistent_state = false;
-  config.use_hw_secure_codecs = true;
-
-  mojom::CdmConfigPtr ptr(mojom::CdmConfig::From(config));
-  CdmConfig result(ptr.To<CdmConfig>());
-
-  EXPECT_EQ(config.allow_distinctive_identifier,
-            result.allow_distinctive_identifier);
-  EXPECT_EQ(config.allow_persistent_state, result.allow_persistent_state);
-  EXPECT_EQ(config.use_hw_secure_codecs, result.use_hw_secure_codecs);
-}
-
 TEST(MediaTypeConvertersTest, ConvertAudioBuffer_EOS) {
   // Original.
   scoped_refptr<AudioBuffer> buffer(AudioBuffer::CreateEOSBuffer());
diff --git a/media/mojo/interfaces/content_decryption_module.mojom b/media/mojo/interfaces/content_decryption_module.mojom
index bc671b24..3606062b 100644
--- a/media/mojo/interfaces/content_decryption_module.mojom
+++ b/media/mojo/interfaces/content_decryption_module.mojom
@@ -27,12 +27,9 @@
 [Native]
 enum HdcpVersion;
 
-// Transport layer of media::CdmConfig (see media/base/cdm_config.h).
-struct CdmConfig {
-  bool allow_distinctive_identifier;
-  bool allow_persistent_state;
-  bool use_hw_secure_codecs;
-};
+// See media::CdmConfig
+[Native]
+struct CdmConfig;
 
 // Transport layer of media::CdmPromise (see media/base/cdm_promise.h).
 // - When |success| is true, the promise is resolved and all other fields should
diff --git a/media/mojo/interfaces/content_decryption_module.typemap b/media/mojo/interfaces/content_decryption_module.typemap
index 90baea0..60c33b0 100644
--- a/media/mojo/interfaces/content_decryption_module.typemap
+++ b/media/mojo/interfaces/content_decryption_module.typemap
@@ -5,6 +5,7 @@
 mojom = "//media/mojo/interfaces/content_decryption_module.mojom"
 
 public_headers = [
+  "//media/base/cdm_config.h",
   "//media/base/cdm_key_information.h",
   "//media/base/cdm_promise.h",
   "//media/base/eme_constants.h",
@@ -19,6 +20,7 @@
 ]
 
 type_mappings = [
+  "media.mojom.CdmConfig=media::CdmConfig",
   "media.mojom.CdmKeyStatus=media::CdmKeyInformation::KeyStatus",
   "media.mojom.CdmPromiseResult.Exception=media::CdmPromise::Exception",
   "media.mojom.CdmSessionType=media::CdmSessionType",
diff --git a/media/mojo/services/media_service_unittest.cc b/media/mojo/services/media_service_unittest.cc
index 05a48f03..57a3725 100644
--- a/media/mojo/services/media_service_unittest.cc
+++ b/media/mojo/services/media_service_unittest.cc
@@ -110,8 +110,7 @@
     EXPECT_CALL(*this, OnCdmInitializedInternal(expected_result, cdm_id))
         .Times(Exactly(1))
         .WillOnce(InvokeWithoutArgs(run_loop_.get(), &base::RunLoop::Quit));
-    cdm_->Initialize(key_system, kSecurityOrigin,
-                     mojom::CdmConfig::From(CdmConfig()),
+    cdm_->Initialize(key_system, kSecurityOrigin, CdmConfig(),
                      base::Bind(&MediaServiceTest::OnCdmInitialized,
                                 base::Unretained(this)));
   }
diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc
index af835c5..3f525242 100644
--- a/media/mojo/services/mojo_cdm_service.cc
+++ b/media/mojo/services/mojo_cdm_service.cc
@@ -61,15 +61,14 @@
 
 void MojoCdmService::Initialize(const std::string& key_system,
                                 const std::string& security_origin,
-                                mojom::CdmConfigPtr cdm_config,
+                                const CdmConfig& cdm_config,
                                 InitializeCallback callback) {
   DVLOG(1) << __func__ << ": " << key_system;
   DCHECK(!cdm_);
 
   auto weak_this = weak_factory_.GetWeakPtr();
   cdm_factory_->Create(
-      key_system, url::Origin(GURL(security_origin)),
-      cdm_config.To<CdmConfig>(),
+      key_system, url::Origin(GURL(security_origin)), cdm_config,
       base::Bind(&MojoCdmService::OnSessionMessage, weak_this),
       base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
       base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this),
diff --git a/media/mojo/services/mojo_cdm_service.h b/media/mojo/services/mojo_cdm_service.h
index a9acf3d..9ae5a94 100644
--- a/media/mojo/services/mojo_cdm_service.h
+++ b/media/mojo/services/mojo_cdm_service.h
@@ -51,7 +51,7 @@
   void SetClient(mojom::ContentDecryptionModuleClientPtr client) final;
   void Initialize(const std::string& key_system,
                   const std::string& security_origin,
-                  mojom::CdmConfigPtr cdm_config,
+                  const CdmConfig& cdm_config,
                   InitializeCallback callback) final;
   void SetServerCertificate(const std::vector<uint8_t>& certificate_data,
                             SetServerCertificateCallback callback) final;
diff --git a/mojo/public/cpp/bindings/lib/native_struct_serialization.h b/mojo/public/cpp/bindings/lib/native_struct_serialization.h
index 0bc3c6e9..0983ec6 100644
--- a/mojo/public/cpp/bindings/lib/native_struct_serialization.h
+++ b/mojo/public/cpp/bindings/lib/native_struct_serialization.h
@@ -37,12 +37,6 @@
     base::Pickle pickle;
     Traits::Write(&pickle, value);
 
-#if DCHECK_IS_ON()
-    base::PickleSizer sizer;
-    Traits::GetSize(&sizer, value);
-    DCHECK_EQ(sizer.payload_size(), pickle.payload_size());
-#endif
-
     // Allocate a uint8 array, initialize its header, and copy the Pickle in.
     writer->Allocate(pickle.payload_size(), buffer);
     memcpy(writer->array_writer()->storage(), pickle.payload(),
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_blink.cc b/mojo/public/cpp/bindings/tests/pickled_types_blink.cc
index 7e556507b..9e56bea 100644
--- a/mojo/public/cpp/bindings/tests/pickled_types_blink.cc
+++ b/mojo/public/cpp/bindings/tests/pickled_types_blink.cc
@@ -25,13 +25,6 @@
 
 namespace IPC {
 
-void ParamTraits<mojo::test::PickledStructBlink>::GetSize(
-    base::PickleSizer* sizer,
-    const param_type& p) {
-  sizer->AddInt();
-  sizer->AddInt();
-}
-
 void ParamTraits<mojo::test::PickledStructBlink>::Write(base::Pickle* m,
                                                         const param_type& p) {
   m->WriteInt(p.foo());
@@ -51,9 +44,6 @@
   return true;
 }
 
-#include "ipc/param_traits_size_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
 #include "ipc/param_traits_write_macros.h"
 IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
                           mojo::test::PickledEnumBlink::VALUE_1)
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_blink.h b/mojo/public/cpp/bindings/tests/pickled_types_blink.h
index 37e9e70..fc6bd4e 100644
--- a/mojo/public/cpp/bindings/tests/pickled_types_blink.h
+++ b/mojo/public/cpp/bindings/tests/pickled_types_blink.h
@@ -17,7 +17,6 @@
 namespace base {
 class Pickle;
 class PickleIterator;
-class PickleSizer;
 }
 
 namespace mojo {
@@ -72,7 +71,6 @@
 struct ParamTraits<mojo::test::PickledStructBlink> {
   using param_type = mojo::test::PickledStructBlink;
 
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc b/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc
index 9957c9a..aeb0be4 100644
--- a/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc
+++ b/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc
@@ -26,13 +26,6 @@
 
 namespace IPC {
 
-void ParamTraits<mojo::test::PickledStructChromium>::GetSize(
-    base::PickleSizer* sizer,
-    const param_type& p) {
-  sizer->AddInt();
-  sizer->AddInt();
-}
-
 void ParamTraits<mojo::test::PickledStructChromium>::Write(
     base::Pickle* m,
     const param_type& p) {
@@ -53,9 +46,6 @@
   return true;
 }
 
-#include "ipc/param_traits_size_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
 #include "ipc/param_traits_write_macros.h"
 IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
                           mojo::test::PickledEnumChromium::VALUE_2)
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_chromium.h b/mojo/public/cpp/bindings/tests/pickled_types_chromium.h
index d9287b62..51649c2 100644
--- a/mojo/public/cpp/bindings/tests/pickled_types_chromium.h
+++ b/mojo/public/cpp/bindings/tests/pickled_types_chromium.h
@@ -16,7 +16,6 @@
 namespace base {
 class Pickle;
 class PickleIterator;
-class PickleSizer;
 }
 
 namespace mojo {
@@ -65,7 +64,6 @@
 struct ParamTraits<mojo::test::PickledStructChromium> {
   using param_type = mojo::test::PickledStructChromium;
 
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/net/quic/chromium/quic_chromium_client_session_test.cc b/net/quic/chromium/quic_chromium_client_session_test.cc
index bd98d1d..ec8f1eb 100644
--- a/net/quic/chromium/quic_chromium_client_session_test.cc
+++ b/net/quic/chromium/quic_chromium_client_session_test.cc
@@ -35,6 +35,7 @@
 #include "net/quic/core/quic_client_promised_info.h"
 #include "net/quic/core/quic_packet_writer.h"
 #include "net/quic/platform/api/quic_flags.h"
+#include "net/quic/platform/impl/quic_test_impl.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
 #include "net/quic/test_tools/quic_client_promised_info_peer.h"
 #include "net/quic/test_tools/quic_stream_peer.h"
@@ -174,6 +175,7 @@
     return test::GetNthServerInitiatedStreamId(GetParam(), n);
   }
 
+  QuicFlagSaver flags_;  // Save/restore all QUIC flag values.
   QuicCryptoClientConfig crypto_config_;
   TestNetLog net_log_;
   BoundTestNetLog bound_test_net_log_;
@@ -1126,6 +1128,7 @@
 }
 
 TEST_P(QuicChromiumClientSessionTest, MigrateToSocket) {
+  FLAGS_quic_reloadable_flag_quic_use_stream_notifier2 = false;
   MockRead old_reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
   std::unique_ptr<QuicEncryptedPacket> settings_packet(
       client_maker_.MakeInitialSettingsPacket(1, nullptr));
diff --git a/net/quic/chromium/quic_network_transaction_unittest.cc b/net/quic/chromium/quic_network_transaction_unittest.cc
index 60d1c36b..716037eb 100644
--- a/net/quic/chromium/quic_network_transaction_unittest.cc
+++ b/net/quic/chromium/quic_network_transaction_unittest.cc
@@ -4846,6 +4846,7 @@
 }
 
 TEST_P(QuicNetworkTransactionTest, QuicForceHolBlocking) {
+  FLAGS_quic_reloadable_flag_quic_use_stream_notifier2 = false;
   session_params_.quic_force_hol_blocking = true;
   session_params_.origins_to_force_quic_on.insert(
       HostPortPair::FromString("mail.example.org:443"));
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc
index 28f5949..ab024e087 100644
--- a/net/quic/chromium/quic_stream_factory_test.cc
+++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -38,6 +38,7 @@
 #include "net/quic/core/crypto/quic_decrypter.h"
 #include "net/quic/core/crypto/quic_encrypter.h"
 #include "net/quic/core/quic_client_promised_info.h"
+#include "net/quic/platform/impl/quic_test_impl.h"
 #include "net/quic/test_tools/mock_clock.h"
 #include "net/quic/test_tools/mock_random.h"
 #include "net/quic/test_tools/quic_config_peer.h"
@@ -693,6 +694,7 @@
       IoMode write_error_mode,
       bool disconnected);
 
+  QuicFlagSaver flags_;  // Save/restore all QUIC flag values.
   MockHostResolver host_resolver_;
   scoped_refptr<SSLConfigService> ssl_config_service_;
   MockClientSocketFactory socket_factory_;
@@ -4786,6 +4788,7 @@
 }
 
 TEST_P(QuicStreamFactoryTest, ForceHolBlockingEnabled) {
+  FLAGS_quic_reloadable_flag_quic_use_stream_notifier2 = false;
   force_hol_blocking_ = true;
   Initialize();
 
diff --git a/net/quic/core/crypto/crypto_framer.cc b/net/quic/core/crypto/crypto_framer.cc
index 8d2ca6d..7d7d2c0 100644
--- a/net/quic/core/crypto/crypto_framer.cc
+++ b/net/quic/core/crypto/crypto_framer.cc
@@ -120,7 +120,7 @@
   }
 
   std::unique_ptr<char[]> buffer(new char[len]);
-  QuicDataWriter writer(len, buffer.get(), perspective, HOST_BYTE_ORDER);
+  QuicDataWriter writer(len, buffer.get(), HOST_BYTE_ORDER);
   if (!writer.WriteTag(message.tag())) {
     DCHECK(false) << "Failed to write message tag.";
     return nullptr;
@@ -209,8 +209,7 @@
                                     Perspective perspective) {
   // Add this data to the buffer.
   buffer_.append(input.data(), input.length());
-  QuicDataReader reader(buffer_.data(), buffer_.length(), perspective,
-                        HOST_BYTE_ORDER);
+  QuicDataReader reader(buffer_.data(), buffer_.length(), HOST_BYTE_ORDER);
 
   switch (state_) {
     case STATE_READING_TAG:
diff --git a/net/quic/core/crypto/null_decrypter.cc b/net/quic/core/crypto/null_decrypter.cc
index c42fd34..320c36b 100644
--- a/net/quic/core/crypto/null_decrypter.cc
+++ b/net/quic/core/crypto/null_decrypter.cc
@@ -43,7 +43,7 @@
                                   char* output,
                                   size_t* output_length,
                                   size_t max_output_length) {
-  QuicDataReader reader(ciphertext.data(), ciphertext.length(), perspective_,
+  QuicDataReader reader(ciphertext.data(), ciphertext.length(),
                         HOST_BYTE_ORDER);
   uint128 hash;
 
diff --git a/net/quic/core/quic_connection.cc b/net/quic/core/quic_connection.cc
index d566cd5..32bb773 100644
--- a/net/quic/core/quic_connection.cc
+++ b/net/quic/core/quic_connection.cc
@@ -286,10 +286,7 @@
   SetMaxPacketLength(perspective_ == Perspective::IS_SERVER
                          ? kDefaultServerMaxPacketSize
                          : kDefaultMaxPacketSize);
-  if (packet_generator_.latched_flag_no_stop_waiting_frames()) {
-    QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_no_stop_waiting_frames, 1, 2);
-    received_packet_manager_.set_max_ack_ranges(255);
-  }
+  received_packet_manager_.set_max_ack_ranges(255);
 }
 
 QuicConnection::~QuicConnection() {
@@ -369,10 +366,8 @@
     QUIC_FLAG_COUNT(quic_reloadable_flag_quic_enable_3rtos);
     close_connection_after_three_rtos_ = true;
   }
-  if (packet_generator_.latched_flag_no_stop_waiting_frames() &&
-      version() > QUIC_VERSION_37 &&
+  if (version() > QUIC_VERSION_37 &&
       config.HasClientSentConnectionOption(kNSTP, perspective_)) {
-    QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_no_stop_waiting_frames, 2, 2);
     no_stop_waiting_frames_ = true;
   }
 }
diff --git a/net/quic/core/quic_data_reader.cc b/net/quic/core/quic_data_reader.cc
index 71f1003..8b80eab 100644
--- a/net/quic/core/quic_data_reader.cc
+++ b/net/quic/core/quic_data_reader.cc
@@ -18,15 +18,8 @@
 
 QuicDataReader::QuicDataReader(const char* data,
                                const size_t len,
-                               Perspective perspective,
                                Endianness endianness)
-    : data_(data),
-      len_(len),
-      pos_(0),
-      perspective_(perspective),
-      endianness_(endianness) {
-  QUIC_DVLOG(1) << ENDPOINT << "QuicDataReader";
-}
+    : data_(data), len_(len), pos_(0), endianness_(endianness) {}
 
 bool QuicDataReader::ReadUInt8(uint8_t* result) {
   return ReadBytes(result, sizeof(*result));
diff --git a/net/quic/core/quic_data_reader.h b/net/quic/core/quic_data_reader.h
index 56c53a41..6c60d191 100644
--- a/net/quic/core/quic_data_reader.h
+++ b/net/quic/core/quic_data_reader.h
@@ -36,7 +36,6 @@
   // Caller must provide an underlying buffer to work on.
   QuicDataReader(const char* data,
                  const size_t len,
-                 Perspective perspective,
                  Endianness endianness);
 
   // Empty destructor.
@@ -144,12 +143,6 @@
   // The location of the next read from our data buffer.
   size_t pos_;
 
-  // TODO(zhongyi): remove this field as it is no longer used.
-  // Perspective of this data reader. Please note, although client and server
-  // may have different in-memory representation of the same field, the on wire
-  // representation must be consistent.
-  Perspective perspective_;
-
   // The endianness to read integers and floating numbers.
   Endianness endianness_;
 
diff --git a/net/quic/core/quic_data_writer.cc b/net/quic/core/quic_data_writer.cc
index 7e831d8b..290d335 100644
--- a/net/quic/core/quic_data_writer.cc
+++ b/net/quic/core/quic_data_writer.cc
@@ -16,17 +16,8 @@
 #define ENDPOINT \
   (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
 
-QuicDataWriter::QuicDataWriter(size_t size,
-                               char* buffer,
-                               Perspective perspective,
-                               Endianness endianness)
-    : buffer_(buffer),
-      capacity_(size),
-      length_(0),
-      perspective_(perspective),
-      endianness_(endianness) {
-  QUIC_DVLOG(1) << ENDPOINT << "QuicDataWriter";
-}
+QuicDataWriter::QuicDataWriter(size_t size, char* buffer, Endianness endianness)
+    : buffer_(buffer), capacity_(size), length_(0), endianness_(endianness) {}
 
 QuicDataWriter::~QuicDataWriter() {}
 
diff --git a/net/quic/core/quic_data_writer.h b/net/quic/core/quic_data_writer.h
index b2de22d68..1097a65 100644
--- a/net/quic/core/quic_data_writer.h
+++ b/net/quic/core/quic_data_writer.h
@@ -28,7 +28,6 @@
   // Creates a QuicDataWriter where |buffer| is not owned.
   QuicDataWriter(size_t size,
                  char* buffer,
-                 Perspective perspective,
                  Endianness endianness);
 
   ~QuicDataWriter();
@@ -92,12 +91,6 @@
   size_t capacity_;  // Allocation size of payload (or -1 if buffer is const).
   size_t length_;    // Current length of the buffer.
 
-  // TODO(zhongyi): remove this field as it is no longer used.
-  // Perspective of this data writer. Please note, although client and server
-  // may have different in-memory representation of the same field, the on wire
-  // representation must be consistent.
-  Perspective perspective_;
-
   // The endianness to write integers and floating numbers.
   Endianness endianness_;
 
diff --git a/net/quic/core/quic_data_writer_test.cc b/net/quic/core/quic_data_writer_test.cc
index 0baba76..832d390 100644
--- a/net/quic/core/quic_data_writer_test.cc
+++ b/net/quic/core/quic_data_writer_test.cc
@@ -21,20 +21,15 @@
 }
 
 struct TestParams {
-  TestParams(Perspective perspective, Endianness endianness)
-      : perspective(perspective), endianness(endianness) {}
+  explicit TestParams(Endianness endianness) : endianness(endianness) {}
 
-  Perspective perspective;
   Endianness endianness;
 };
 
 std::vector<TestParams> GetTestParams() {
   std::vector<TestParams> params;
-  for (Perspective perspective :
-       {Perspective::IS_CLIENT, Perspective::IS_SERVER}) {
-    for (Endianness endianness : {NETWORK_BYTE_ORDER, HOST_BYTE_ORDER}) {
-      params.push_back(TestParams(perspective, endianness));
-    }
+  for (Endianness endianness : {NETWORK_BYTE_ORDER, HOST_BYTE_ORDER}) {
+    params.push_back(TestParams(endianness));
   }
   return params;
 }
@@ -126,8 +121,7 @@
 
   for (int i = 0; i < num_test_cases; ++i) {
     char buffer[2];
-    QuicDataWriter writer(2, buffer, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataWriter writer(2, buffer, GetParam().endianness);
     EXPECT_TRUE(writer.WriteUFloat16(test_cases[i].decoded));
     uint16_t result = *reinterpret_cast<uint16_t*>(writer.data());
     if (GetParam().endianness == NETWORK_BYTE_ORDER) {
@@ -195,7 +189,7 @@
       encoded_ufloat = QuicEndian::HostToNet16(encoded_ufloat);
     }
     QuicDataReader reader(reinterpret_cast<char*>(&encoded_ufloat), 2,
-                          GetParam().perspective, GetParam().endianness);
+                          GetParam().endianness);
     uint64_t value;
     EXPECT_TRUE(reader.ReadUFloat16(&value));
     EXPECT_EQ(test_cases[i].decoded, value);
@@ -212,7 +206,7 @@
       read_number = QuicEndian::HostToNet16(read_number);
     }
     QuicDataReader reader(reinterpret_cast<char*>(&read_number), 2,
-                          GetParam().perspective, GetParam().endianness);
+                          GetParam().endianness);
     uint64_t value;
     // All values must be decodable.
     EXPECT_TRUE(reader.ReadUFloat16(&value));
@@ -230,8 +224,7 @@
     EXPECT_LT(value, UINT64_C(0x3FFC0000000));
     previous_value = value;
     char buffer[6];
-    QuicDataWriter writer(6, buffer, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataWriter writer(6, buffer, GetParam().endianness);
     EXPECT_TRUE(writer.WriteUFloat16(value - 1));
     EXPECT_TRUE(writer.WriteUFloat16(value));
     EXPECT_TRUE(writer.WriteUFloat16(value + 1));
@@ -259,15 +252,13 @@
   };
   const int kBufferLength = sizeof(connection_id);
   char buffer[kBufferLength];
-  QuicDataWriter writer(kBufferLength, buffer, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(kBufferLength, buffer, GetParam().endianness);
   writer.WriteConnectionId(connection_id);
   test::CompareCharArraysWithHexError("connection_id", buffer, kBufferLength,
                                       big_endian, kBufferLength);
 
   uint64_t read_connection_id;
-  QuicDataReader reader(buffer, kBufferLength, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataReader reader(buffer, kBufferLength, GetParam().endianness);
   reader.ReadConnectionId(&read_connection_id);
   EXPECT_EQ(connection_id, read_connection_id);
 }
@@ -278,15 +269,13 @@
   };
   const int kBufferLength = sizeof(QuicTag);
   char buffer[kBufferLength];
-  QuicDataWriter writer(kBufferLength, buffer, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(kBufferLength, buffer, GetParam().endianness);
   writer.WriteTag(kCHLO);
   test::CompareCharArraysWithHexError("CHLO", buffer, kBufferLength, CHLO,
                                       kBufferLength);
 
   QuicTag read_chlo;
-  QuicDataReader reader(buffer, kBufferLength, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataReader reader(buffer, kBufferLength, GetParam().endianness);
   reader.ReadTag(&read_chlo);
   EXPECT_EQ(kCHLO, read_chlo);
 }
@@ -297,8 +286,7 @@
   char buffer16[2];
   {
     uint16_t in_memory16 = 0x1122;
-    QuicDataWriter writer(2, buffer16, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataWriter writer(2, buffer16, GetParam().endianness);
     writer.WriteUInt16(in_memory16);
     test::CompareCharArraysWithHexError(
         "uint16_t", buffer16, 2,
@@ -307,16 +295,14 @@
         2);
 
     uint16_t read_number16;
-    QuicDataReader reader(buffer16, 2, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataReader reader(buffer16, 2, GetParam().endianness);
     reader.ReadUInt16(&read_number16);
     EXPECT_EQ(in_memory16, read_number16);
   }
 
   {
     uint64_t in_memory16 = 0x0000000000001122;
-    QuicDataWriter writer(2, buffer16, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataWriter writer(2, buffer16, GetParam().endianness);
     writer.WriteBytesToUInt64(2, in_memory16);
     test::CompareCharArraysWithHexError(
         "uint16_t", buffer16, 2,
@@ -325,8 +311,7 @@
         2);
 
     uint64_t read_number16 = 0u;
-    QuicDataReader reader(buffer16, 2, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataReader reader(buffer16, 2, GetParam().endianness);
     reader.ReadBytesToUInt64(2, &read_number16);
     EXPECT_EQ(in_memory16, read_number16);
   }
@@ -337,8 +322,7 @@
   char big_endian24[] = {0x11, 0x22, 0x33};
   char buffer24[3];
   uint64_t in_memory24 = 0x0000000000112233;
-  QuicDataWriter writer(3, buffer24, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(3, buffer24, GetParam().endianness);
   writer.WriteBytesToUInt64(3, in_memory24);
   test::CompareCharArraysWithHexError(
       "uint24", buffer24, 3,
@@ -347,8 +331,7 @@
       3);
 
   uint64_t read_number24 = 0u;
-  QuicDataReader reader(buffer24, 3, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataReader reader(buffer24, 3, GetParam().endianness);
   reader.ReadBytesToUInt64(3, &read_number24);
   EXPECT_EQ(in_memory24, read_number24);
 }
@@ -359,8 +342,7 @@
   char buffer32[4];
   {
     uint32_t in_memory32 = 0x11223344;
-    QuicDataWriter writer(4, buffer32, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataWriter writer(4, buffer32, GetParam().endianness);
     writer.WriteUInt32(in_memory32);
     test::CompareCharArraysWithHexError(
         "uint32_t", buffer32, 4,
@@ -369,16 +351,14 @@
         4);
 
     uint32_t read_number32;
-    QuicDataReader reader(buffer32, 4, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataReader reader(buffer32, 4, GetParam().endianness);
     reader.ReadUInt32(&read_number32);
     EXPECT_EQ(in_memory32, read_number32);
   }
 
   {
     uint64_t in_memory32 = 0x11223344;
-    QuicDataWriter writer(4, buffer32, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataWriter writer(4, buffer32, GetParam().endianness);
     writer.WriteBytesToUInt64(4, in_memory32);
     test::CompareCharArraysWithHexError(
         "uint32_t", buffer32, 4,
@@ -387,8 +367,7 @@
         4);
 
     uint64_t read_number32 = 0u;
-    QuicDataReader reader(buffer32, 4, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataReader reader(buffer32, 4, GetParam().endianness);
     reader.ReadBytesToUInt64(4, &read_number32);
     EXPECT_EQ(in_memory32, read_number32);
   }
@@ -399,8 +378,7 @@
   char little_endian40[] = {0x55, 0x44, 0x33, 0x22, 0x11};
   char big_endian40[] = {0x11, 0x22, 0x33, 0x44, 0x55};
   char buffer40[5];
-  QuicDataWriter writer(5, buffer40, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(5, buffer40, GetParam().endianness);
   writer.WriteBytesToUInt64(5, in_memory40);
   test::CompareCharArraysWithHexError(
       "uint40", buffer40, 5,
@@ -409,8 +387,7 @@
       5);
 
   uint64_t read_number40 = 0u;
-  QuicDataReader reader(buffer40, 5, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataReader reader(buffer40, 5, GetParam().endianness);
   reader.ReadBytesToUInt64(5, &read_number40);
   EXPECT_EQ(in_memory40, read_number40);
 }
@@ -420,8 +397,7 @@
   char little_endian48[] = {0x66, 0x55, 0x44, 0x33, 0x22, 0x11};
   char big_endian48[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
   char buffer48[6];
-  QuicDataWriter writer(6, buffer48, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(6, buffer48, GetParam().endianness);
   writer.WriteBytesToUInt64(6, in_memory48);
   test::CompareCharArraysWithHexError(
       "uint48", buffer48, 6,
@@ -430,8 +406,7 @@
       6);
 
   uint64_t read_number48 = 0u;
-  QuicDataReader reader(buffer48, 6, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataReader reader(buffer48, 6, GetParam().endianness);
   reader.ReadBytesToUInt64(6., &read_number48);
   EXPECT_EQ(in_memory48, read_number48);
 }
@@ -441,8 +416,7 @@
   char little_endian56[] = {0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11};
   char big_endian56[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
   char buffer56[7];
-  QuicDataWriter writer(7, buffer56, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(7, buffer56, GetParam().endianness);
   writer.WriteBytesToUInt64(7, in_memory56);
   test::CompareCharArraysWithHexError(
       "uint56", buffer56, 7,
@@ -451,8 +425,7 @@
       7);
 
   uint64_t read_number56 = 0u;
-  QuicDataReader reader(buffer56, 7, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataReader reader(buffer56, 7, GetParam().endianness);
   reader.ReadBytesToUInt64(7, &read_number56);
   EXPECT_EQ(in_memory56, read_number56);
 }
@@ -464,8 +437,7 @@
   unsigned char big_endian64[] = {0x11, 0x22, 0x33, 0x44,
                                   0x55, 0x66, 0x77, 0x88};
   char buffer64[8];
-  QuicDataWriter writer(8, buffer64, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(8, buffer64, GetParam().endianness);
   writer.WriteBytesToUInt64(8, in_memory64);
   test::CompareCharArraysWithHexError(
       "uint64_t", buffer64, 8,
@@ -474,13 +446,11 @@
       8);
 
   uint64_t read_number64 = 0u;
-  QuicDataReader reader(buffer64, 8, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataReader reader(buffer64, 8, GetParam().endianness);
   reader.ReadBytesToUInt64(8, &read_number64);
   EXPECT_EQ(in_memory64, read_number64);
 
-  QuicDataWriter writer2(8, buffer64, GetParam().perspective,
-                         GetParam().endianness);
+  QuicDataWriter writer2(8, buffer64, GetParam().endianness);
   writer2.WriteUInt64(in_memory64);
   test::CompareCharArraysWithHexError(
       "uint64_t", buffer64, 8,
@@ -488,8 +458,7 @@
                                                   : AsChars(little_endian64),
       8);
   read_number64 = 0u;
-  QuicDataReader reader2(buffer64, 8, GetParam().perspective,
-                         GetParam().endianness);
+  QuicDataReader reader2(buffer64, 8, GetParam().endianness);
   reader2.ReadUInt64(&read_number64);
   EXPECT_EQ(in_memory64, read_number64);
 }
@@ -500,7 +469,7 @@
   uint16_t i16 = 0x0123;
   uint32_t i32 = 0x01234567;
   uint64_t i64 = 0x0123456789ABCDEF;
-  QuicDataWriter writer(46, buf, GetParam().perspective, GetParam().endianness);
+  QuicDataWriter writer(46, buf, GetParam().endianness);
   for (size_t i = 0; i < 10; ++i) {
     switch (i) {
       case 0u:
@@ -532,7 +501,7 @@
     }
   }
 
-  QuicDataReader reader(buf, 46, GetParam().perspective, GetParam().endianness);
+  QuicDataReader reader(buf, 46, GetParam().endianness);
   for (size_t i = 0; i < 10; ++i) {
     uint8_t read8;
     uint16_t read16;
@@ -590,8 +559,7 @@
 TEST_P(QuicDataWriterTest, WriteBytes) {
   char bytes[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
   char buf[arraysize(bytes)];
-  QuicDataWriter writer(arraysize(buf), buf, GetParam().perspective,
-                        GetParam().endianness);
+  QuicDataWriter writer(arraysize(buf), buf, GetParam().endianness);
   EXPECT_TRUE(writer.WriteBytes(bytes, arraysize(bytes)));
   for (unsigned int i = 0; i < arraysize(bytes); ++i) {
     EXPECT_EQ(bytes[i], buf[i]);
@@ -602,8 +570,7 @@
   char bytes[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
   char buf[arraysize(bytes)];
   for (unsigned int i = 0; i < arraysize(bytes); ++i) {
-    QuicDataWriter writer(arraysize(buf), buf, GetParam().perspective,
-                          GetParam().endianness);
+    QuicDataWriter writer(arraysize(buf), buf, GetParam().endianness);
     EXPECT_TRUE(writer.WriteBytes(bytes, arraysize(bytes)));
     EXPECT_TRUE(writer.WriteUInt8AtOffset('I', i));
     for (unsigned int j = 0; j < arraysize(bytes); ++j) {
diff --git a/net/quic/core/quic_flags_list.h b/net/quic/core/quic_flags_list.h
index 721f0f5..2588eca3 100644
--- a/net/quic/core/quic_flags_list.h
+++ b/net/quic/core/quic_flags_list.h
@@ -74,10 +74,6 @@
 // Congestion window gain for QUIC BBR during PROBE_BW phase.
 QUIC_FLAG(double, FLAGS_quic_bbr_cwnd_gain, 2.0f)
 
-// If true, do not send or process stop waiting frames in QUIC if the NSTP
-// connection option is provided.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_no_stop_waiting_frames, true)
-
 // Allows one self address change.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_allow_one_address_change, false)
 
@@ -118,7 +114,7 @@
 
 // In QUIC, QuicSession gets notified when stream frames are acked, discarded or
 // retransmitted.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_stream_notifier2, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_stream_notifier2, true)
 
 // When true, defaults to BBR congestion control instead of Cubic.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_default_to_bbr, false)
@@ -160,7 +156,7 @@
 
 // When true, allows the LRTT connection option to cause QUIC BBR to exit
 // STARTUP when in recovery and there has been no bandwidth increase for 1RTT.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_exit_startup_on_loss, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_exit_startup_on_loss, true)
 
 // If true, application data is saved before consumption in QUIC.
 QUIC_FLAG(bool,
@@ -178,7 +174,7 @@
 // ack aggregation that prevent persistent standing queues.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes4,
-          false)
+          true)
 
 // Add 4 new ack decimation modes to QUIC that are entirely time based at 1/4
 // or 1/8 RTT.
diff --git a/net/quic/core/quic_framer.cc b/net/quic/core/quic_framer.cc
index a1b05fa0..90e7280 100644
--- a/net/quic/core/quic_framer.cc
+++ b/net/quic/core/quic_framer.cc
@@ -358,7 +358,7 @@
                                    const QuicFrames& frames,
                                    char* buffer,
                                    size_t packet_length) {
-  QuicDataWriter writer(packet_length, buffer, perspective_, endianness());
+  QuicDataWriter writer(packet_length, buffer, endianness());
   if (!AppendPacketHeader(header, &writer)) {
     QUIC_BUG << "AppendPacketHeader failed";
     return 0;
@@ -474,8 +474,7 @@
   std::unique_ptr<char[]> buffer(new char[len]);
   // Endianness is not a concern here, as writer is not going to write integers
   // or floating numbers.
-  QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER,
-                        NETWORK_BYTE_ORDER);
+  QuicDataWriter writer(len, buffer.get(), NETWORK_BYTE_ORDER);
 
   uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST |
                                        PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
@@ -507,8 +506,7 @@
   std::unique_ptr<char[]> buffer(new char[len]);
   // Endianness is not a concern here, version negotiation packet does not have
   // integers or floating numbers.
-  QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER,
-                        NETWORK_BYTE_ORDER);
+  QuicDataWriter writer(len, buffer.get(), NETWORK_BYTE_ORDER);
 
   uint8_t flags = static_cast<uint8_t>(
       PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
@@ -532,8 +530,7 @@
 }
 
 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
-  QuicDataReader reader(packet.data(), packet.length(), perspective_,
-                        endianness());
+  QuicDataReader reader(packet.data(), packet.length(), endianness());
 
   visitor_->OnPacket();
 
@@ -624,8 +621,7 @@
     return RaiseError(QUIC_DECRYPTION_FAILURE);
   }
 
-  QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_,
-                        endianness());
+  QuicDataReader reader(decrypted_buffer, decrypted_length, endianness());
 
   // Set the last packet number after we have decrypted the packet
   // so we are confident is not attacker controlled.
@@ -2429,7 +2425,7 @@
     return false;
   }
   char buf[sizeof(kCHLO)];
-  QuicDataWriter writer(sizeof(kCHLO), buf, perspective_, endianness());
+  QuicDataWriter writer(sizeof(kCHLO), buf, endianness());
   if (!data_producer_->WriteStreamData(id, offset, sizeof(kCHLO), &writer)) {
     QUIC_BUG << "Failed to write data for stream " << id << " with offset "
              << offset << " data_length = " << sizeof(kCHLO);
diff --git a/net/quic/core/quic_framer_test.cc b/net/quic/core/quic_framer_test.cc
index 1ba37a9f..4df6e35 100644
--- a/net/quic/core/quic_framer_test.cc
+++ b/net/quic/core/quic_framer_test.cc
@@ -48,33 +48,6 @@
 const QuicStreamOffset kStreamOffset = UINT64_C(0xBA98FEDC32107654);
 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789);
 
-// Index into the connection_id offset in the header.
-const size_t kConnectionIdOffset = kPublicFlagsSize;
-// Index into the version string in the header. (if present).
-const size_t kVersionOffset = kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID;
-
-// Size in bytes of the stream frame fields for an arbitrary StreamID and
-// offset and the last frame in a packet.
-size_t GetMinStreamFrameSize() {
-  return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
-}
-
-// Index into the packet number offset in the header.
-size_t GetPacketNumberOffset(QuicConnectionIdLength connection_id_length,
-                             bool include_version) {
-  return kConnectionIdOffset + connection_id_length +
-         (include_version ? kQuicVersionSize : 0);
-}
-
-size_t GetPacketNumberOffset(bool include_version) {
-  return GetPacketNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version);
-}
-
-// Index into the message tag of the public reset packet.
-// Public resets always have full connection_ids.
-const size_t kPublicResetPacketMessageTagOffset =
-    kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID;
-
 class TestEncrypter : public QuicEncrypter {
  public:
   ~TestEncrypter() override {}
@@ -290,6 +263,15 @@
   std::vector<std::unique_ptr<string>> stream_data_;
 };
 
+// Simple struct for defining a packet's content, and associated
+// parse error.
+struct PacketFragment {
+  string error_if_missing;
+  std::vector<unsigned char> fragment;
+};
+
+using PacketFragments = std::vector<struct PacketFragment>;
+
 class QuicFramerTest : public QuicTestWithParam<QuicVersion> {
  public:
   QuicFramerTest()
@@ -377,6 +359,53 @@
 
   char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
 
+  // Creates a new QuicEncryptedPacket by concatenating the various
+  // packet fragments in |fragments|.
+  std::unique_ptr<QuicEncryptedPacket> AssemblePacketFromFragments(
+      const PacketFragments& fragments) {
+    char* buffer = new char[kMaxPacketSize + 1];
+    size_t len = 0;
+    for (const auto& fragment : fragments) {
+      memcpy(buffer + len, fragment.fragment.data(), fragment.fragment.size());
+      len += fragment.fragment.size();
+    }
+    return QuicMakeUnique<QuicEncryptedPacket>(buffer, len, true);
+  }
+
+  void CheckFramingBoundaries(const PacketFragments& fragments,
+                              QuicErrorCode error_code) {
+    std::unique_ptr<QuicEncryptedPacket> packet(
+        AssemblePacketFromFragments(fragments));
+    // Check all the various prefixes of |packet| for the expected
+    // parse error and error code.
+    for (size_t i = 0; i < packet->length(); ++i) {
+      string expected_error;
+      size_t len = 0;
+      for (const auto& fragment : fragments) {
+        len += fragment.fragment.size();
+        if (i < len) {
+          expected_error = fragment.error_if_missing;
+          break;
+        }
+      }
+
+      if (expected_error.empty())
+        continue;
+
+      CheckProcessingFails(*packet, i, expected_error, error_code);
+    }
+  }
+
+  void CheckProcessingFails(const QuicEncryptedPacket& packet,
+                            size_t len,
+                            string expected_error,
+                            QuicErrorCode error_code) {
+    QuicEncryptedPacket encrypted(packet.data(), len, false);
+    EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
+    EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len;
+    EXPECT_EQ(error_code, framer_.error()) << "len: " << len;
+  }
+
   void CheckProcessingFails(unsigned char* packet,
                             size_t len,
                             string expected_error,
@@ -392,43 +421,6 @@
     EXPECT_EQ(str, string(frame->data_buffer, frame->data_length));
   }
 
-  void CheckStreamFrameBoundaries(unsigned char* packet,
-                                  size_t stream_id_size,
-                                  bool include_version) {
-    // Now test framing boundaries.
-    for (size_t i = kQuicFrameTypeSize; i < GetMinStreamFrameSize(); ++i) {
-      string expected_error;
-      if (framer_.version() <= QUIC_VERSION_39) {
-        if (i < kQuicFrameTypeSize + stream_id_size) {
-          expected_error = "Unable to read stream_id.";
-        } else if (i < kQuicFrameTypeSize + stream_id_size +
-                           kQuicMaxStreamOffsetSize) {
-          expected_error = "Unable to read offset.";
-        } else {
-          expected_error = "Unable to read frame data.";
-        }
-      } else {
-        const size_t kQuicDataLenSize = sizeof(uint16_t);
-        if (i < kQuicFrameTypeSize + kQuicDataLenSize) {
-          expected_error = "Unable to read data length.";
-        } else if (i < kQuicFrameTypeSize + kQuicDataLenSize + stream_id_size) {
-          expected_error = "Unable to read stream_id.";
-        } else if (i < kQuicFrameTypeSize + kQuicDataLenSize + stream_id_size +
-                           kQuicMaxStreamOffsetSize) {
-          expected_error = "Unable to read offset.";
-        } else {
-          expected_error = "Unable to read frame data.";
-        }
-      }
-      CheckProcessingFails(
-          packet, i + GetPacketHeaderSize(
-                          framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                          include_version, !kIncludeDiversificationNonce,
-                          PACKET_6BYTE_PACKET_NUMBER),
-          expected_error, QUIC_INVALID_STREAM_DATA);
-    }
-  }
-
   void CheckCalculatePacketNumber(QuicPacketNumber expected_packet_number,
                                   QuicPacketNumber last_packet_number) {
     QuicPacketNumber wire_packet_number = expected_packet_number & kMask;
@@ -606,29 +598,38 @@
 
 TEST_P(QuicFramerTest, PacketHeader) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+  PacketFragments packet38 = {
+      // public flags (8 byte connection_id)
+      {"Unable to read public flags.",
+       {0x38}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"Unable to read packet number.",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"Unable to read public flags.",
+       {0x38}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"Unable to read packet number.",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_FALSE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() <= QUIC_VERSION_38 ? packet38 : packet39;
+
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+
+  EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
   EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
@@ -636,53 +637,41 @@
   EXPECT_FALSE(visitor_.header_->public_header.version_flag);
   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
 
-  // Now test framing boundaries.
-  for (size_t i = 0;
-       i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                               !kIncludeVersion, !kIncludeDiversificationNonce,
-                               PACKET_6BYTE_PACKET_NUMBER);
-       ++i) {
-    string expected_error;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < GetPacketNumberOffset(!kIncludeVersion)) {
-      expected_error = "Unable to read ConnectionId.";
-    } else {
-      expected_error = "Unable to read packet number.";
-    }
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
-        expected_error, QUIC_INVALID_PACKET_HEADER);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
 }
 
 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
   QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId);
 
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (0 byte connection_id)
-    0x30,
-    // connection_id
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
+  PacketFragments packet = {
+      // public flags (0 byte connection_id)
+      {"Unable to read public flags.",
+       {0x30}},
+      // connection_id
+      // packet number
+      {"Unable to read packet number.",
+       {0xBC, 0x9A, 0x78, 0x56,
+        0x34, 0x12}}
   };
 
-  unsigned char packet39[] = {
-    // public flags (0 byte connection_id)
-    0x30,
-    // connection_id
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
+  PacketFragments packet39 = {
+      // public flags (0 byte connection_id)
+      {"Unable to read public flags.",
+       {0x30}},
+      // connection_id
+      // packet number
+      {"Unable to read packet number.",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() > QUIC_VERSION_38 ? packet39 : packet),
-      arraysize(packet), false);
-  EXPECT_FALSE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
   EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
@@ -690,56 +679,47 @@
   EXPECT_FALSE(visitor_.header_->public_header.version_flag);
   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
 
-  // Now test framing boundaries.
-  for (size_t i = 0;
-       i < GetPacketHeaderSize(framer_.version(), PACKET_0BYTE_CONNECTION_ID,
-                               !kIncludeVersion, !kIncludeDiversificationNonce,
-                               PACKET_6BYTE_PACKET_NUMBER);
-       ++i) {
-    string expected_error;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < GetPacketNumberOffset(PACKET_0BYTE_CONNECTION_ID,
-                                         !kIncludeVersion)) {
-      expected_error = "Unable to read ConnectionId.";
-    } else {
-      expected_error = "Unable to read packet number.";
-    }
-    CheckProcessingFails(
-        framer_.version() > QUIC_VERSION_38 ? packet39 : packet, i,
-        expected_error, QUIC_INVALID_PACKET_HEADER);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
 }
 
 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (version)
-    0x39,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+  PacketFragments packet = {
+      // public flags (0 byte connection_id)
+      {"Unable to read public flags.",
+       {0x39}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // version tag
+      {"Unable to read protocol version.",
+       {'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes()}},
+      // packet number
+      {"Unable to read packet number.",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (version)
-    0x39,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
+  PacketFragments packet39 = {
+      // public flags (0 byte connection_id)
+      {"Unable to read public flags.",
+       {0x39}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // version tag
+      {"Unable to read protocol version.",
+       {'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes()}},
+      // packet number
+      {"Unable to read packet number.",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_FALSE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
   EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
@@ -748,55 +728,43 @@
   EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]);
   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
 
-  // Now test framing boundaries.
-  for (size_t i = 0;
-       i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                               kIncludeVersion, !kIncludeDiversificationNonce,
-                               PACKET_6BYTE_PACKET_NUMBER);
-       ++i) {
-    string expected_error;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < kVersionOffset) {
-      expected_error = "Unable to read ConnectionId.";
-    } else if (i < GetPacketNumberOffset(kIncludeVersion)) {
-      expected_error = "Unable to read protocol version.";
-    } else {
-      expected_error = "Unable to read packet number.";
-    }
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
-        expected_error, QUIC_INVALID_PACKET_HEADER);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
 }
 
 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
 
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id and 4 byte packet number)
-    0x28,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
+  PacketFragments packet = {
+      // public flags (8 byte connection_id and 4 byte packet number)
+      {"Unable to read public flags.",
+       {0x28}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"Unable to read packet number.",
+       {0xBC, 0x9A, 0x78, 0x56}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id and 4 byte packet number)
-    0x28,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x56, 0x78, 0x9A, 0xBC,
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id and 4 byte packet number)
+      {"Unable to read public flags.",
+       {0x28}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"Unable to read packet number.",
+       {0x56, 0x78, 0x9A, 0xBC}},
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_FALSE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
   EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
@@ -804,53 +772,43 @@
   EXPECT_FALSE(visitor_.header_->public_header.version_flag);
   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
 
-  // Now test framing boundaries.
-  for (size_t i = 0;
-       i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                               !kIncludeVersion, !kIncludeDiversificationNonce,
-                               PACKET_4BYTE_PACKET_NUMBER);
-       ++i) {
-    string expected_error;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < GetPacketNumberOffset(!kIncludeVersion)) {
-      expected_error = "Unable to read ConnectionId.";
-    } else {
-      expected_error = "Unable to read packet number.";
-    }
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
-        expected_error, QUIC_INVALID_PACKET_HEADER);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
 }
 
 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
 
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id and 2 byte packet number)
-    0x18,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A,
+  PacketFragments packet = {
+      // public flags (8 byte connection_id and 2 byte packet number)
+      {"Unable to read public flags.",
+       {0x18}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"Unable to read packet number.",
+       {0xBC, 0x9A}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id and 2 byte packet number)
-    0x18,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x9A, 0xBC,
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id and 2 byte packet number)
+      {"Unable to read public flags.",
+       {0x18}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"Unable to read packet number.",
+       {0x9A, 0xBC}},
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_FALSE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
   EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
@@ -860,42 +818,28 @@
             visitor_.header_->public_header.packet_number_length);
   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
 
-  // Now test framing boundaries.
-  for (size_t i = 0;
-       i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                               !kIncludeVersion, !kIncludeDiversificationNonce,
-                               PACKET_2BYTE_PACKET_NUMBER);
-       ++i) {
-    string expected_error;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < GetPacketNumberOffset(!kIncludeVersion)) {
-      expected_error = "Unable to read ConnectionId.";
-    } else {
-      expected_error = "Unable to read packet number.";
-    }
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
-        expected_error, QUIC_INVALID_PACKET_HEADER);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_PACKET_HEADER);
 }
 
 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
   QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2);
 
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id and 1 byte packet number)
-    0x08,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC,
+  PacketFragments packet = {
+      // public flags (8 byte connection_id and 2 byte packet number)
+      {"Unable to read public flags.",
+       {0x08}},
+      // connection_id
+      {"Unable to read ConnectionId.",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"Unable to read packet number.",
+       {0xBC}},
   };
-  // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
-  EXPECT_FALSE(framer_.ProcessPacket(encrypted));
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(packet));
+  EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
   EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
@@ -905,22 +849,8 @@
             visitor_.header_->public_header.packet_number_length);
   EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
 
-  // Now test framing boundaries.
-  for (size_t i = 0;
-       i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                               !kIncludeVersion, !kIncludeDiversificationNonce,
-                               PACKET_1BYTE_PACKET_NUMBER);
-       ++i) {
-    string expected_error;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < GetPacketNumberOffset(!kIncludeVersion)) {
-      expected_error = "Unable to read ConnectionId.";
-    } else {
-      expected_error = "Unable to read packet number.";
-    }
-    CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
-  }
+
+  CheckFramingBoundaries(packet, QUIC_INVALID_PACKET_HEADER);
 }
 
 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) {
@@ -1251,91 +1181,110 @@
 
 TEST_P(QuicFramerTest, StreamFrame) {
   // clang-format off
-  unsigned char packet[] = {
+  PacketFragments packet = {
       // public flags (8 byte connection_id)
-      0x38,
+      {"",
+       {0x38}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0xBC, 0x9A, 0x78, 0x56,
-      0x34, 0x12,
-
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56,
+        0x34, 0x12}},
       // frame type (stream frame with fin)
-      0xFF,
+      {"",
+       {0xFF}},
       // stream id
-      0x04, 0x03, 0x02, 0x01,
+      {"Unable to read stream_id.",
+       {0x04, 0x03, 0x02, 0x01}},
       // offset
-      0x54, 0x76, 0x10, 0x32,
-      0xDC, 0xFE, 0x98, 0xBA,
-      // data length
-      0x0c, 0x00,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
+      {"Unable to read offset.",
+       {0x54, 0x76, 0x10, 0x32,
+        0xDC, 0xFE, 0x98, 0xBA}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x0c, 0x00,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet39[] = {
+  PacketFragments packet39 = {
       // public flags (8 byte connection_id)
-      0x38,
+      {"",
+       {0x38}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
       // frame type (stream frame with fin)
-      0xFF,
+      {"",
+       {0xFF}},
       // stream id
-      0x01, 0x02, 0x03, 0x04,
+      {"Unable to read stream_id.",
+       {0x01, 0x02, 0x03, 0x04}},
       // offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
-      // data length
-      0x00, 0x0c,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x00, 0x0c,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet40[] = {
+  PacketFragments packet40 = {
       // public flags (8 byte connection_id)
-      0x38,
+      {"",
+       {0x38}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
       // frame type (stream frame with fin)
-      0xFF,
+      {"",
+       {0xFF}},
       // data length
-      0x00, 0x0c,
+      {"Unable to read data length.",
+       {0x00, 0x0c}},
       // stream id
-      0x01, 0x02, 0x03, 0x04,
+      {"Unable to read stream_id.",
+       {0x01, 0x02, 0x03, 0x04}},
       // offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
       // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
+      {"Unable to read frame data.",
+       {'h',  'e',  'l',  'l',
+        'o',  ' ',  'w',  'o',
+        'r',  'l',  'd',  '!'}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   ASSERT_EQ(1u, visitor_.stream_frames_.size());
@@ -1345,10 +1294,7 @@
   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
 
-  // Now test framing boundaries.
-  CheckStreamFrameBoundaries(
-      framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
-      kQuicMaxStreamIdSize, !kIncludeVersion);
+  CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
 }
 
 TEST_P(QuicFramerTest, MissingDiversificationNonce) {
@@ -1445,92 +1391,110 @@
 
 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFE,
-    // stream id
-    0x04, 0x03, 0x02,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56,
+        0x34, 0x12}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFE}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x04, 0x03, 0x02}},
+      // offset
+      {"Unable to read offset.",
+       {0x54, 0x76, 0x10, 0x32,
+        0xDC, 0xFE, 0x98, 0xBA}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x0c, 0x00,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xFE,
-    // stream id
-    0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFE}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x02, 0x03, 0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x00, 0x0c,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-
-  unsigned char packet40[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xF7,
-    // data length
-    0x00, 0x0c,
-    // stream id
-    0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet40 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xF7}},
+      // data length
+      {"Unable to read data length.",
+       {0x00, 0x0c}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x02, 0x03, 0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      // data
+      {"Unable to read frame data.",
+       {'h',  'e',  'l',  'l',
+        'o',  ' ',  'w',  'o',
+        'r',  'l',  'd',  '!'}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   ASSERT_EQ(1u, visitor_.stream_frames_.size());
@@ -1541,98 +1505,115 @@
   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
 
-  // Now test framing boundaries.
-  const size_t stream_id_size = 3;
-  CheckStreamFrameBoundaries(p, stream_id_size, !kIncludeVersion);
+  CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
 }
 
 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFD,
-    // stream id
-    0x04, 0x03,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56,
+        0x34, 0x12}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFD}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x04, 0x03}},
+      // offset
+      {"Unable to read offset.",
+       {0x54, 0x76, 0x10, 0x32,
+        0xDC, 0xFE, 0x98, 0xBA}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x0c, 0x00,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xFD,
-    // stream id
-    0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFD}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x03, 0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x00, 0x0c,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet40[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xEF,
-    // data length
-    0x00, 0x0c,
-    // stream id
-    0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet40 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xEF}},
+      // data length
+      {"Unable to read data length.",
+       {0x00, 0x0c}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x03, 0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      // data
+      {"Unable to read frame data.",
+       {'h',  'e',  'l',  'l',
+        'o',  ' ',  'w',  'o',
+        'r',  'l',  'd',  '!'}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   ASSERT_EQ(1u, visitor_.stream_frames_.size());
@@ -1643,221 +1624,254 @@
   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
 
-  // Now test framing boundaries.
-  const size_t stream_id_size = 2;
-  CheckStreamFrameBoundaries(p, stream_id_size, !kIncludeVersion);
+  CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
 }
 
 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFC,
-    // stream id
-    0x04,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56,
+        0x34, 0x12}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFC}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0x54, 0x76, 0x10, 0x32,
+        0xDC, 0xFE, 0x98, 0xBA}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x0c, 0x00,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xFC,
-    // stream id
-    0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFC}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x00, 0x0c,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet40[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xE7,
-    // data length
-    0x00, 0x0c,
-    // stream id
-    0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet40 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xE7}},
+      // data length
+      {"Unable to read data length.",
+       {0x00, 0x0c}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      // data
+      {"Unable to read frame data.",
+       {'h',  'e',  'l',  'l',
+        'o',  ' ',  'w',  'o',
+        'r',  'l',  'd',  '!'}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   ASSERT_EQ(1u, visitor_.stream_frames_.size());
   EXPECT_EQ(0u, visitor_.ack_frames_.size());
-  // Stream ID should be the last byte of kStreamId.
+  // Stream ID should be the last 1 byte of kStreamId.
   EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
 
-  // Now test framing boundaries.
-  const size_t stream_id_size = 1;
-  CheckStreamFrameBoundaries(p, stream_id_size, !kIncludeVersion);
+  CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
 }
 
 TEST_P(QuicFramerTest, StreamFrameWithVersion) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet = {
+      // public flags (version, 8 byte connection_id)
+      {"",
+       {0x39}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // version tag
+      {"",
+       {'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes()}},
+      // packet number
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56,
+        0x34, 0x12}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFE}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x04, 0x03, 0x02}},
+      // offset
+      {"Unable to read offset.",
+       {0x54, 0x76, 0x10, 0x32,
+        0xDC, 0xFE, 0x98, 0xBA}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x0c, 0x00,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet39[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet39 = {
+      // public flags (version, 8 byte connection_id)
+      {"",
+       {0x39}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // version tag
+      {"",
+       {'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes()}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xFE}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x02, 0x03, 0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      {"Unable to read frame data.",
+       {
+         // data length
+         0x00, 0x0c,
+         // data
+         'h',  'e',  'l',  'l',
+         'o',  ' ',  'w',  'o',
+         'r',  'l',  'd',  '!'}},
   };
 
-  unsigned char packet40[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // data length
-    0x00, 0x0c,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
+  PacketFragments packet40 = {
+      // public flags (version, 8 byte connection_id)
+      {"",
+       {0x39}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // version tag
+      {"",
+       {'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes()}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78,
+        0x9A, 0xBC}},
+      // frame type (stream frame with fin)
+      {"",
+       {0xF7}},
+      // data length
+      {"Unable to read data length.",
+       {0x00, 0x0c}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x02, 0x03, 0x04}},
+      // offset
+      {"Unable to read offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      // data
+      {"Unable to read frame data.",
+       {'h',  'e',  'l',  'l',
+        'o',  ' ',  'w',  'o',
+        'r',  'l',  'd',  '!'}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(visitor_.header_->public_header.version_flag);
-  EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]);
-  EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   ASSERT_EQ(1u, visitor_.stream_frames_.size());
   EXPECT_EQ(0u, visitor_.ack_frames_.size());
-  EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
+  // Stream ID should be the last 3 bytes of kStreamId.
+  EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
   EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
   EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
 
-  // Now test framing boundaries.
-  CheckStreamFrameBoundaries(
-      framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
-      kQuicMaxStreamIdSize, kIncludeVersion);
+  CheckFramingBoundaries(fragments, QUIC_INVALID_STREAM_DATA);
 }
 
 TEST_P(QuicFramerTest, RejectPacket) {
@@ -1977,83 +1991,101 @@
 
 TEST_P(QuicFramerTest, AckFrameOneAckBlock) {
   // clang-format off
-  unsigned char packet[] = {
+  PacketFragments packet = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
       // frame type (ack frame)
       // (one ack block, 2 byte largest observed, 2 byte block length)
-      0x45,
+      {"",
+       {0x45}},
       // largest acked
-      0x34, 0x12,
+      {"Unable to read largest acked.",
+       {0x34, 0x12}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x34, 0x12,
+      {"Unable to read first ack block length.",
+       {0x34, 0x12}},
       // num timestamps.
-      0x00,
+      {"Unable to read num received packets.",
+       {0x00}}
   };
 
-  unsigned char packet39[] = {
+  PacketFragments packet39 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (ack frame)
       // (one ack block, 2 byte largest observed, 2 byte block length)
-      0x45,
+      {"",
+       {0x45}},
       // largest acked
-      0x12, 0x34,
+      {"Unable to read largest acked.",
+       {0x12, 0x34}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x12, 0x34,
+      {"Unable to read first ack block length.",
+       {0x12, 0x34}},
       // num timestamps.
-      0x00,
+      {"Unable to read num received packets.",
+       {0x00}}
   };
 
-  unsigned char packet40[] = {
+  PacketFragments packet40 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (ack frame)
       // (one ack block, 2 byte largest observed, 2 byte block length)
-      0xA5,
+      {"",
+       {0xA5}},
       // num timestamps.
-      0x00,
+      {"Unable to read num received packets.",
+       {0x00}},
       // largest acked
-      0x12, 0x34,
+      {"Unable to read largest acked.",
+       {0x12, 0x34}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x12, 0x34,
+      {"Unable to read first ack block length.",
+       {0x12, 0x34}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(0u, visitor_.stream_frames_.size());
@@ -2062,235 +2094,210 @@
   EXPECT_EQ(kSmallLargestObserved, frame.largest_observed);
   ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
 
-  const size_t kLargestAckedOffset = kQuicFrameTypeSize;
-  const size_t kLargestAckedDeltaTimeOffset =
-      kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kFirstAckBlockLengthOffset =
-      kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize;
-  const size_t kNumTimestampsOffset =
-      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
-  // Now test framing boundaries.
-  const size_t ack_frame_size =
-      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
-  for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
-    string expected_error;
-    if (framer_.version() > QUIC_VERSION_39) {
-      if (i < 2) {
-        expected_error = "Unable to read num received packets.";
-      } else if (i < 2 + PACKET_2BYTE_PACKET_NUMBER) {
-        expected_error = "Unable to read largest acked.";
-      } else if (i < 2 + PACKET_2BYTE_PACKET_NUMBER +
-                         kQuicDeltaTimeLargestObservedSize) {
-        expected_error = "Unable to read ack delay time.";
-      } else {
-        expected_error = "Unable to read first ack block length.";
-      }
-    } else {
-      if (i < kLargestAckedDeltaTimeOffset) {
-        expected_error = "Unable to read largest acked.";
-      } else if (i < kFirstAckBlockLengthOffset) {
-        expected_error = "Unable to read ack delay time.";
-      } else if (i < kNumTimestampsOffset) {
-        expected_error = "Unable to read first ack block length.";
-      } else {
-        expected_error = "Unable to read num received packets.";
-      }
-    }
-    CheckProcessingFails(
-        p,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_ACK_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
 }
+
 TEST_P(QuicFramerTest, FirstAckFrameUnderflow) {
   // clang-format off
-  unsigned char packet[] = {
+  PacketFragments packet = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
       // frame type (ack frame)
       // (one ack block, 2 byte largest observed, 2 byte block length)
-      0x45,
+      {"",
+       {0x45}},
       // largest acked
-      0x34, 0x12,
+      {"Unable to read largest acked.",
+       {0x34, 0x12}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x88, 0x88,
+      {"Unable to read first ack block length.",
+       {0x88, 0x88}},
       // num timestamps.
-      0x00,
+      {FLAGS_quic_reloadable_flag_sanitize_framer_addrange_input
+           ? "Underflow with first ack block length 34952 largest acked is "
+             "4661."
+           : "Unable to read num received packets.",
+       {0x00}}
   };
 
-  unsigned char packet39[] = {
+  PacketFragments packet39 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (ack frame)
       // (one ack block, 2 byte largest observed, 2 byte block length)
-      0x45,
+      {"",
+       {0x45}},
       // largest acked
-      0x12, 0x34,
+      {"Unable to read largest acked.",
+       {0x12, 0x34}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x88, 0x88,
+      {"Unable to read first ack block length.",
+       {0x88, 0x88}},
       // num timestamps.
-      0x00,
+      {FLAGS_quic_reloadable_flag_sanitize_framer_addrange_input
+           ? "Underflow with first ack block length 34952 largest acked is "
+             "4661."
+           : "Unable to read num received packets.",
+       {0x00}}
   };
 
-  unsigned char packet40[] = {
+  PacketFragments packet40 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (ack frame)
       // (one ack block, 2 byte largest observed, 2 byte block length)
-      0xA5,
+      {"",
+       {0xA5}},
       // num timestamps.
-      0x00,
+      {"Unable to read num received packets.",
+       {0x00}},
       // largest acked
-      0x12, 0x34,
+      {"Unable to read largest acked.",
+       {0x12, 0x34}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x88, 0x88,
+      {"Unable to read first ack block length.",
+       {0x88, 0x88}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  framer_.ProcessPacket(encrypted);
-
-  visitor_.header_.get();
-
-  const size_t kLargestAckedOffset = kQuicFrameTypeSize;
-  const size_t kLargestAckedDeltaTimeOffset =
-      kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kFirstAckBlockLengthOffset =
-      kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize;
-  // Now test framing boundaries.
-  const size_t ack_frame_size =
-      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
-  string expected_error;
-  if (framer_.version() <= QUIC_VERSION_39) {
-    if (FLAGS_quic_reloadable_flag_sanitize_framer_addrange_input) {
-      expected_error =
-          "Underflow with first ack block length 34952 largest acked is "
-          "4661.";
-    } else {
-      expected_error = "Unable to read num received packets.";
-    }
-    CheckProcessingFails(
-        p,
-        ack_frame_size +
-            GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_ACK_DATA);
-  }
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_EQ(!FLAGS_quic_reloadable_flag_sanitize_framer_addrange_input,
+            framer_.ProcessPacket(*encrypted));
+  CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
 }
 
 TEST_P(QuicFramerTest, AckFrameOneAckBlockMaxLength) {
   // clang-format off
-  unsigned char packet[] = {
+  PacketFragments packet = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
       // frame type (ack frame)
       // (one ack block, 6 byte largest observed, 2 byte block length)
-      0x4D,
+      {"",
+       {0x4D}},
       // largest acked
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+      {"Unable to read largest acked.",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x34, 0x12,
+      {"Unable to read first ack block length.",
+       {0x34, 0x12}},
       // num timestamps.
-      0x00,
+      {"Unable to read num received packets.",
+       {0x00}}
   };
 
-  unsigned char packet39[] = {
+  PacketFragments packet39 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (ack frame)
       // (one ack block, 6 byte largest observed, 2 byte block length)
-      0x4D,
+      {"",
+       {0x4D}},
       // largest acked
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
+      {"Unable to read largest acked.",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x12, 0x34,
+      {"Unable to read first ack block length.",
+       {0x12, 0x34}},
       // num timestamps.
-      0x00,
+      {"Unable to read num received packets.",
+       {0x00}}
   };
 
-  unsigned char packet40[] = {
+  PacketFragments packet40 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       {0x3C}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (ack frame)
       // (one ack block, 8 byte largest observed, 2 byte block length)
-      0xAD,
+      {"",
+       {0xAD}},
       // num timestamps.
-      0x00,
+      {"Unable to read num received packets.",
+       {0x00}},
       // largest acked
-      0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
+      {"Unable to read largest acked.",
+       {0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       {0x00, 0x00}},
       // first ack block length.
-      0x12, 0x34
+      {"Unable to read first ack block length.",
+       {0x12, 0x34}},
   };
   // clang-format on
 
-  unsigned char* p = packet;
-  size_t packet_size = arraysize(packet);
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-    packet_size = arraysize(packet40);
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-    packet_size = arraysize(packet39);
-  }
-
-  QuicEncryptedPacket encrypted(AsChars(p), packet_size, false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(0u, visitor_.stream_frames_.size());
@@ -2299,204 +2306,229 @@
   EXPECT_EQ(kPacketNumber, frame.largest_observed);
   ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
 
-  const size_t kLargestAckedOffset = kQuicFrameTypeSize;
-  const size_t kLargestAckedDeltaTimeOffset =
-      kLargestAckedOffset + PACKET_6BYTE_PACKET_NUMBER;
-  const size_t kFirstAckBlockLengthOffset =
-      kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize;
-  const size_t kNumTimestampsOffset =
-      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
-  // Now test framing boundaries.
-  const size_t ack_frame_size =
-      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
-  for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
-    string expected_error;
-    if (framer_.version() > QUIC_VERSION_39) {
-      if (i < 2) {
-        expected_error = "Unable to read num received packets.";
-      } else if (i < 2 + PACKET_8BYTE_PACKET_NUMBER) {
-        expected_error = "Unable to read largest acked.";
-      } else if (i < 2 + PACKET_8BYTE_PACKET_NUMBER +
-                         kQuicDeltaTimeLargestObservedSize) {
-        expected_error = "Unable to read ack delay time.";
-      } else {
-        expected_error = "Unable to read first ack block length.";
-      }
-    } else {
-      if (i < kLargestAckedDeltaTimeOffset) {
-        expected_error = "Unable to read largest acked.";
-      } else if (i < kFirstAckBlockLengthOffset) {
-        expected_error = "Unable to read ack delay time.";
-      } else if (i < kNumTimestampsOffset) {
-        expected_error = "Unable to read first ack block length.";
-      } else {
-        expected_error = "Unable to read num received packets.";
-      }
-    }
-    CheckProcessingFails(
-        p,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_ACK_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
 }
 
 TEST_P(QuicFramerTest, AckFrameTwoTimeStampsMultipleAckBlocks) {
   // clang-format off
-  unsigned char packet[] = {
+  PacketFragments packet = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       { 0x3C }},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
       // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+      {"",
+       { 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12 }},
 
       // frame type (ack frame)
       // (more than one ack block, 2 byte largest observed, 2 byte block length)
-      0x65,
+      {"",
+       { 0x65 }},
       // largest acked
-      0x34, 0x12,
+      {"Unable to read largest acked.",
+       { 0x34, 0x12 }},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       { 0x00, 0x00 }},
       // num ack blocks ranges.
-      0x04,
+      {"Unable to read num of ack blocks.",
+       { 0x04 }},
       // first ack block length.
-      0x01, 0x00,
+      {"Unable to read first ack block length.",
+       { 0x01, 0x00 }},
       // gap to next block.
-      0x01,
+      { "Unable to read gap to next ack block.",
+        { 0x01 }},
       // ack block length.
-      0xaf, 0x0e,
+      { "Unable to ack block length.",
+        { 0xaf, 0x0e }},
       // gap to next block.
-      0xff,
+      { "Unable to read gap to next ack block.",
+        { 0xff }},
       // ack block length.
-      0x00, 0x00,
+      { "Unable to ack block length.",
+        { 0x00, 0x00 }},
       // gap to next block.
-      0x91,
+      { "Unable to read gap to next ack block.",
+        { 0x91 }},
       // ack block length.
-      0xea, 0x01,
+      { "Unable to ack block length.",
+        { 0xea, 0x01 }},
       // gap to next block.
-      0x05,
+      { "Unable to read gap to next ack block.",
+        { 0x05 }},
       // ack block length.
-      0x04, 0x00,
+      { "Unable to ack block length.",
+        { 0x04, 0x00 }},
       // Number of timestamps.
-      0x02,
+      { "Unable to read num received packets.",
+        { 0x02 }},
       // Delta from largest observed.
-      0x01,
+      { "Unable to read sequence delta in received packets.",
+        { 0x01 }},
       // Delta time.
-      0x10, 0x32, 0x54, 0x76,
+      { "Unable to read time delta in received packets.",
+        { 0x10, 0x32, 0x54, 0x76 }},
       // Delta from largest observed.
-      0x02,
+      { "Unable to read sequence delta in received packets.",
+        { 0x02 }},
       // Delta time.
-      0x10, 0x32,
+      { "Unable to read incremental time delta in received packets.",
+        { 0x10, 0x32 }},
   };
 
-  unsigned char packet39[] = {
+  PacketFragments packet39 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       { 0x3C }},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
+      {"",
+       { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC }},
 
       // frame type (ack frame)
       // (more than one ack block, 2 byte largest observed, 2 byte block length)
-      0x65,
+      {"",
+       { 0x65 }},
       // largest acked
-      0x12, 0x34,
+      {"Unable to read largest acked.",
+       { 0x12, 0x34 }},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       { 0x00, 0x00 }},
       // num ack blocks ranges.
-      0x04,
+      {"Unable to read num of ack blocks.",
+       { 0x04 }},
       // first ack block length.
-      0x00, 0x01,
+      {"Unable to read first ack block length.",
+       { 0x00, 0x01 }},
       // gap to next block.
-      0x01,
+      { "Unable to read gap to next ack block.",
+        { 0x01 }},
       // ack block length.
-      0x0e, 0xaf,
+      { "Unable to ack block length.",
+        { 0x0e, 0xaf }},
       // gap to next block.
-      0xff,
+      { "Unable to read gap to next ack block.",
+        { 0xff }},
       // ack block length.
-      0x00, 0x00,
+      { "Unable to ack block length.",
+        { 0x00, 0x00 }},
       // gap to next block.
-      0x91,
+      { "Unable to read gap to next ack block.",
+        { 0x91 }},
       // ack block length.
-      0x01, 0xea,
+      { "Unable to ack block length.",
+        { 0x01, 0xea }},
       // gap to next block.
-      0x05,
+      { "Unable to read gap to next ack block.",
+        { 0x05 }},
       // ack block length.
-      0x00, 0x04,
+      { "Unable to ack block length.",
+        { 0x00, 0x04 }},
       // Number of timestamps.
-      0x02,
+      { "Unable to read num received packets.",
+        { 0x02 }},
       // Delta from largest observed.
-      0x01,
+      { "Unable to read sequence delta in received packets.",
+        { 0x01 }},
       // Delta time.
-      0x76, 0x54, 0x32, 0x10,
+      { "Unable to read time delta in received packets.",
+        { 0x76, 0x54, 0x32, 0x10 }},
       // Delta from largest observed.
-      0x02,
+      { "Unable to read sequence delta in received packets.",
+        { 0x02 }},
       // Delta time.
-      0x32, 0x10,
+      { "Unable to read incremental time delta in received packets.",
+        { 0x32, 0x10 }},
   };
 
-  unsigned char packet40[] = {
+  PacketFragments packet40 = {
       // public flags (8 byte connection_id)
-      0x3C,
+      {"",
+       { 0x3C }},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }},
       // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
+      {"",
+       { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC }},
 
       // frame type (ack frame)
       // (more than one ack block, 2 byte largest observed, 2 byte block length)
-      0xB5,
+      {"",
+       { 0xB5 }},
       // num ack blocks ranges.
-      0x04,
+      {"Unable to read num of ack blocks.",
+       { 0x04 }},
       // Number of timestamps.
-      0x02,
+      { "Unable to read num received packets.",
+        { 0x02 }},
       // largest acked
-      0x12, 0x34,
+      {"Unable to read largest acked.",
+       { 0x12, 0x34 }},
       // Zero delta time.
-      0x00, 0x00,
+      {"Unable to read ack delay time.",
+       { 0x00, 0x00 }},
       // first ack block length.
-      0x00, 0x01,
+      {"Unable to read first ack block length.",
+       { 0x00, 0x01 }},
       // gap to next block.
-      0x01,
+      { "Unable to read gap to next ack block.",
+        { 0x01 }},
       // ack block length.
-      0x0e, 0xaf,
+      { "Unable to ack block length.",
+        { 0x0e, 0xaf }},
       // gap to next block.
-      0xff,
+      { "Unable to read gap to next ack block.",
+        { 0xff }},
       // ack block length.
-      0x00, 0x00,
+      { "Unable to ack block length.",
+        { 0x00, 0x00 }},
       // gap to next block.
-      0x91,
+      { "Unable to read gap to next ack block.",
+        { 0x91 }},
       // ack block length.
-      0x01, 0xea,
+      { "Unable to ack block length.",
+        { 0x01, 0xea }},
       // gap to next block.
-      0x05,
+      { "Unable to read gap to next ack block.",
+        { 0x05 }},
       // ack block length.
-      0x00, 0x04,
+      { "Unable to ack block length.",
+        { 0x00, 0x04 }},
       // Delta from largest observed.
-      0x01,
+      { "Unable to read sequence delta in received packets.",
+        { 0x01 }},
       // Delta time.
-      0x76, 0x54, 0x32, 0x10,
+      { "Unable to read time delta in received packets.",
+        { 0x76, 0x54, 0x32, 0x10 }},
       // Delta from largest observed.
-      0x02,
+      { "Unable to read sequence delta in received packets.",
+        { 0x02 }},
       // Delta time.
-      0x32, 0x10,
+      { "Unable to read incremental time delta in received packets.",
+        { 0x32, 0x10 }},
   };
+
   // clang-format on
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(0u, visitor_.stream_frames_.size());
@@ -2506,196 +2538,59 @@
   ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
   EXPECT_EQ(4u, frame.packets.NumIntervals());
 
-  const size_t kLargestAckedOffset = kQuicFrameTypeSize;
-  const size_t kLargestAckedDeltaTimeOffset =
-      kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kNumberOfAckBlocksOffset =
-      kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize;
-  const size_t kFirstAckBlockLengthOffset =
-      kNumberOfAckBlocksOffset + kNumberOfAckBlocksSize;
-  const size_t kGapToNextBlockOffset1 =
-      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kAckBlockLengthOffset1 = kGapToNextBlockOffset1 + 1;
-  const size_t kGapToNextBlockOffset2 =
-      kAckBlockLengthOffset1 + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kAckBlockLengthOffset2 = kGapToNextBlockOffset2 + 1;
-  const size_t kGapToNextBlockOffset3 =
-      kAckBlockLengthOffset2 + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kAckBlockLengthOffset3 = kGapToNextBlockOffset3 + 1;
-  const size_t kGapToNextBlockOffset4 =
-      kAckBlockLengthOffset3 + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kAckBlockLengthOffset4 = kGapToNextBlockOffset3 + 1;
-  const size_t kNumTimestampsOffset =
-      kAckBlockLengthOffset4 + PACKET_2BYTE_PACKET_NUMBER;
-  const size_t kTimestampDeltaLargestObserved1 =
-      kNumTimestampsOffset + kQuicNumTimestampsSize;
-  const size_t kTimestampTimeDeltaLargestObserved1 =
-      kTimestampDeltaLargestObserved1 + 1;
-  const size_t kTimestampDeltaLargestObserved2 =
-      kTimestampTimeDeltaLargestObserved1 + 4;
-  const size_t kTimestampTimeDeltaLargestObserved2 =
-      kTimestampDeltaLargestObserved2 + 1;
-
-  // Now test framing boundaries.
-  const size_t ack_frame_size =
-      kAckBlockLengthOffset4 + PACKET_2BYTE_PACKET_NUMBER;
-  for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
-    string expected_error;
-    if (framer_.version() <= QUIC_VERSION_39) {
-      if (i < kLargestAckedDeltaTimeOffset) {
-        expected_error = "Unable to read largest acked.";
-      } else if (i < kNumberOfAckBlocksOffset) {
-        expected_error = "Unable to read ack delay time.";
-      } else if (i < kFirstAckBlockLengthOffset) {
-        expected_error = "Unable to read num of ack blocks.";
-      } else if (i < kGapToNextBlockOffset1) {
-        expected_error = "Unable to read first ack block length.";
-      } else if (i < kAckBlockLengthOffset1) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kGapToNextBlockOffset2) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kAckBlockLengthOffset2) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kGapToNextBlockOffset3) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kAckBlockLengthOffset3) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kGapToNextBlockOffset4) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kAckBlockLengthOffset4) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kNumTimestampsOffset) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kTimestampDeltaLargestObserved1) {
-        expected_error = "Unable to read num received packets.";
-      } else if (i < kTimestampTimeDeltaLargestObserved1) {
-        expected_error = "Unable to read sequence delta in received packets.";
-      } else if (i < kTimestampDeltaLargestObserved2) {
-        expected_error = "Unable to read time delta in received packets.";
-      } else if (i < kTimestampTimeDeltaLargestObserved2) {
-        expected_error = "Unable to read sequence delta in received packets.";
-      } else {
-        expected_error =
-            "Unable to read incremental time delta in received packets.";
-      }
-    } else {
-      const size_t kNumberOfAckBlocksOffset = kQuicFrameTypeSize;
-      const size_t kNumTimestampsOffset = kNumberOfAckBlocksOffset + 1;
-      const size_t kLargestAckedOffset = kNumTimestampsOffset + 1;
-      const size_t kLargestAckedDeltaTimeOffset =
-          kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER;
-      const size_t kFirstAckBlockLengthOffset =
-          kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize;
-      const size_t kGapToNextBlockOffset1 =
-          kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
-      const size_t kAckBlockLengthOffset1 = kGapToNextBlockOffset1 + 1;
-      const size_t kGapToNextBlockOffset2 =
-          kAckBlockLengthOffset1 + PACKET_2BYTE_PACKET_NUMBER;
-      const size_t kAckBlockLengthOffset2 = kGapToNextBlockOffset2 + 1;
-      const size_t kGapToNextBlockOffset3 =
-          kAckBlockLengthOffset2 + PACKET_2BYTE_PACKET_NUMBER;
-      const size_t kAckBlockLengthOffset3 = kGapToNextBlockOffset3 + 1;
-      const size_t kGapToNextBlockOffset4 =
-          kAckBlockLengthOffset3 + PACKET_2BYTE_PACKET_NUMBER;
-      const size_t kAckBlockLengthOffset4 = kGapToNextBlockOffset3 + 1;
-      const size_t kTimestampDeltaLargestObserved1 =
-          kNumTimestampsOffset + kQuicNumTimestampsSize;
-      const size_t kTimestampTimeDeltaLargestObserved1 =
-          kTimestampDeltaLargestObserved1 + 1;
-      const size_t kTimestampDeltaLargestObserved2 =
-          kTimestampTimeDeltaLargestObserved1 + 4;
-      const size_t kTimestampTimeDeltaLargestObserved2 =
-          kTimestampDeltaLargestObserved2 + 1;
-      if (i < kNumTimestampsOffset) {
-        expected_error = "Unable to read num of ack blocks.";
-      } else if (i < kLargestAckedOffset) {
-        expected_error = "Unable to read num received packets.";
-      } else if (i < kLargestAckedDeltaTimeOffset) {
-        expected_error = "Unable to read largest acked.";
-      } else if (i < kFirstAckBlockLengthOffset) {
-        expected_error = "Unable to read ack delay time.";
-      } else if (i < kGapToNextBlockOffset1) {
-        expected_error = "Unable to read first ack block length.";
-      } else if (i < kAckBlockLengthOffset1) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kGapToNextBlockOffset2) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kAckBlockLengthOffset2) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kGapToNextBlockOffset3) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kAckBlockLengthOffset3) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kGapToNextBlockOffset4) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kAckBlockLengthOffset4) {
-        expected_error = "Unable to read gap to next ack block.";
-      } else if (i < kNumTimestampsOffset) {
-        expected_error = "Unable to ack block length.";
-      } else if (i < kTimestampDeltaLargestObserved1) {
-        expected_error = "Unable to read num received packets.";
-      } else if (i < kTimestampTimeDeltaLargestObserved1) {
-        expected_error = "Unable to read sequence delta in received packets.";
-      } else if (i < kTimestampDeltaLargestObserved2) {
-        expected_error = "Unable to read time delta in received packets.";
-      } else if (i < kTimestampTimeDeltaLargestObserved2) {
-        expected_error = "Unable to read sequence delta in received packets.";
-      } else {
-        expected_error =
-            "Unable to read incremental time delta in received packets.";
-      }
-    }
-
-    CheckProcessingFails(
-        p,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_ACK_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_ACK_DATA);
 }
 
 TEST_P(QuicFramerTest, NewStopWaitingFrame) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x3C,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xA8, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-    // frame type (stop waiting frame)
-    0x06,
-    // least packet number awaiting an ack, delta from packet number.
-    0x08, 0x00, 0x00, 0x00,
-    0x00, 0x00,
+  PacketFragments packet = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x3C}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12}},
+      // frame type (stop waiting frame)
+      {"",
+       {0x06}},
+      // least packet number awaiting an ack, delta from packet number.
+      {"Unable to read least unacked delta.",
+        {0x08, 0x00, 0x00, 0x00,
+         0x00, 0x00}}
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x3C,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xA8,
-    // frame type (stop waiting frame)
-    0x06,
-    // least packet number awaiting an ack, delta from packet number.
-    0x00, 0x00, 0x00, 0x00,
-    0x00, 0x08,
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x3C}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xA8}},
+      // frame type (stop waiting frame)
+      {"",
+       {0x06}},
+      // least packet number awaiting an ack, delta from packet number.
+      {"Unable to read least unacked delta.",
+        {0x00, 0x00, 0x00, 0x00,
+         0x00, 0x08}}
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_38 ? packet39 : packet;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(0u, visitor_.stream_frames_.size());
@@ -2703,17 +2598,7 @@
   const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
   EXPECT_EQ(kLeastUnacked, frame.least_unacked);
 
-  const size_t frame_size = 7;
-  for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) {
-    string expected_error;
-    expected_error = "Unable to read least unacked delta.";
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_STOP_WAITING_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_STOP_WAITING_DATA);
 }
 
 TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) {
@@ -2757,184 +2642,171 @@
   EXPECT_EQ("Invalid unacked delta.", framer_.detailed_error());
 }
 
-TEST_P(QuicFramerTest, RstStreamFrameQuic) {
+TEST_P(QuicFramerTest, RstStreamFrame) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (rst stream frame)
-    0x01,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-
-    // sent byte offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-
-    // error code
-    0x01, 0x00, 0x00, 0x00,
+  PacketFragments packet = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
+      // frame type (rst stream frame)
+      {"",
+       {0x01}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x04, 0x03, 0x02, 0x01}},
+      // sent byte offset
+      {"Unable to read rst stream sent byte offset.",
+       {0x54, 0x76, 0x10, 0x32,
+        0xDC, 0xFE, 0x98, 0xBA}},
+      // error code
+      {"Unable to read rst stream error code.",
+       {0x01, 0x00, 0x00, 0x00}}
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (rst stream frame)
-    0x01,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-
-    // sent byte offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-
-    // error code
-    0x00, 0x00, 0x00, 0x01,
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
+      // frame type (rst stream frame)
+      {"",
+       {0x01}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x01, 0x02, 0x03, 0x04}},
+      // sent byte offset
+      {"Unable to read rst stream sent byte offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+      // error code
+      {"Unable to read rst stream error code.",
+       {0x00, 0x00, 0x00, 0x01}}
   };
 
-  unsigned char packet40[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (rst stream frame)
-    0x01,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-
-    // error code
-    0x00, 0x00, 0x00, 0x01,
-
-    // sent byte offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
+  PacketFragments packet40 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
+      // frame type (rst stream frame)
+      {"",
+       {0x01}},
+      // stream id
+      {"Unable to read stream_id.",
+       {0x01, 0x02, 0x03, 0x04}},
+      // error code
+      {"Unable to read rst stream error code.",
+       {0x00, 0x00, 0x00, 0x01}},
+      // sent byte offset
+      {"Unable to read rst stream sent byte offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
   };
-  // clang-format on
 
-  unsigned char* p = packet;
-  if (framer_.version() > QUIC_VERSION_39) {
-    p = packet40;
-  } else if (framer_.version() > QUIC_VERSION_38) {
-    p = packet39;
-  }
-  QuicEncryptedPacket encrypted(AsChars(p), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_39
+          ? packet40
+          : (framer_.version() > QUIC_VERSION_38 ? packet39 : packet);
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
   EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code);
   EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
 
-  // Now test framing boundaries.
-  for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetRstStreamFrameSize();
-       ++i) {
-    string expected_error;
-    if (framer_.version() <= QUIC_VERSION_39) {
-      if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) {
-        expected_error = "Unable to read stream_id.";
-      } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
-                         kQuicMaxStreamOffsetSize) {
-        expected_error = "Unable to read rst stream sent byte offset.";
-      } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
-                         kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) {
-        expected_error = "Unable to read rst stream error code.";
-      }
-    } else {
-      if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) {
-        expected_error = "Unable to read stream_id.";
-      } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
-                         kQuicErrorCodeSize) {
-        expected_error = "Unable to read rst stream error code.";
-      } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
-                         kQuicMaxStreamOffsetSize + kQuicMaxStreamOffsetSize) {
-        expected_error = "Unable to read rst stream sent byte offset.";
-      }
-    }
-    CheckProcessingFails(
-        p,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_RST_STREAM_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_RST_STREAM_DATA);
 }
 
 TEST_P(QuicFramerTest, ConnectionCloseFrame) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (connection close frame)
-    0x02,
-    // error code
-    0x11, 0x00, 0x00, 0x00,
-
-    // error details length
-    0x0d, 0x00,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
+  PacketFragments packet = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
+      // frame type (connection close frame)
+      {"",
+       {0x02}},
+      // error code
+      {"Unable to read connection close error code.",
+       {0x11, 0x00, 0x00, 0x00}},
+      {"Unable to read connection close error details.",
+       {
+         // error details length
+         0x0d, 0x00,
+         // error details
+         'b',  'e',  'c',  'a',
+         'u',  's',  'e',  ' ',
+         'I',  ' ',  'c',  'a',
+         'n'}
+      }
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (connection close frame)
-    0x02,
-    // error code
-    0x00, 0x00, 0x00, 0x11,
-
-    // error details length
-    0x00, 0x0d,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
+      // frame type (connection close frame)
+      {"",
+       {0x02}},
+      // error code
+      {"Unable to read connection close error code.",
+       {0x00, 0x00, 0x00, 0x11}},
+      {"Unable to read connection close error details.",
+       {
+         // error details length
+         0x0, 0x0d,
+         // error details
+         'b',  'e',  'c',  'a',
+         'u',  's',  'e',  ' ',
+         'I',  ' ',  'c',  'a',
+         'n'}
+      }
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_38 ? packet39 : packet;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(0u, visitor_.stream_frames_.size());
@@ -2944,237 +2816,210 @@
 
   ASSERT_EQ(0u, visitor_.ack_frames_.size());
 
-  // Now test framing boundaries.
-  for (size_t i = kQuicFrameTypeSize;
-       i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) {
-    string expected_error;
-    if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) {
-      expected_error = "Unable to read connection close error code.";
-    } else {
-      expected_error = "Unable to read connection close error details.";
-    }
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_CONNECTION_CLOSE_DATA);
 }
 
 TEST_P(QuicFramerTest, GoAwayFrame) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (go away frame)
-    0x03,
-    // error code
-    0x09, 0x00, 0x00, 0x00,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // error details length
-    0x0d, 0x00,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
+  PacketFragments packet = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
+      // frame type (go away frame)
+      {"",
+       {0x03}},
+      // error code
+      {"Unable to read go away error code.",
+       {0x09, 0x00, 0x00, 0x00}},
+      // stream id
+      {"Unable to read last good stream id.",
+       {0x04, 0x03, 0x02, 0x01}},
+      {"Unable to read goaway reason.",
+       {
+         // error details length
+         0x0d, 0x00,
+         // error details
+         'b',  'e',  'c',  'a',
+         'u',  's',  'e',  ' ',
+         'I',  ' ',  'c',  'a',
+         'n'}
+      }
   };
 
-  unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (go away frame)
-    0x03,
-    // error code
-    0x00, 0x00, 0x00, 0x09,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // error details length
-    0x00, 0x0d,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
+  PacketFragments packet39 = {
+      // public flags (8 byte connection_id)
+      {"",
+       {0x38}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // packet number
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
+      // frame type (go away frame)
+      {"",
+       {0x03}},
+      // error code
+      {"Unable to read go away error code.",
+       {0x00, 0x00, 0x00, 0x09}},
+      // stream id
+      {"Unable to read last good stream id.",
+       {0x01, 0x02, 0x03, 0x04}},
+      // stream id
+      {"Unable to read goaway reason.",
+       {
+         // error details length
+         0x0, 0x0d,
+         // error details
+         'b',  'e',  'c',  'a',
+         'u',  's',  'e',  ' ',
+         'I',  ' ',  'c',  'a',
+         'n'}
+      }
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_38 ? packet39 : packet;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
   EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code);
   EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
 
-  const size_t reason_size = arraysize("because I can") - 1;
-  // Now test framing boundaries.
-  for (size_t i = kQuicFrameTypeSize;
-       i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) {
-    string expected_error;
-    if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) {
-      expected_error = "Unable to read go away error code.";
-    } else if (i <
-               kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) {
-      expected_error = "Unable to read last good stream id.";
-    } else {
-      expected_error = "Unable to read goaway reason.";
-    }
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_GOAWAY_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_GOAWAY_DATA);
 }
 
 TEST_P(QuicFramerTest, WindowUpdateFrame) {
   // clang-format off
-  unsigned char packet[] = {
+  PacketFragments packet = {
       // public flags (8 byte connection_id)
-      0x38,
+      {"",
+       {0x38}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0xBC, 0x9A, 0x78, 0x56,
-      0x34, 0x12,
-
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
       // frame type (window update frame)
-      0x04,
+      {"",
+       {0x04}},
       // stream id
-      0x04, 0x03, 0x02, 0x01,
+      {"Unable to read stream_id.",
+       {0x04, 0x03, 0x02, 0x01}},
       // byte offset
-      0x54, 0x76, 0x10, 0x32,
-      0xDC, 0xFE, 0x98, 0xBA,
-    };
+      {"Unable to read window byte_offset.",
+       {0x54, 0x76, 0x10, 0x32,
+        0xDC, 0xFE, 0x98, 0xBA}},
+  };
 
-  unsigned char packet39[] = {
+  PacketFragments packet39 = {
       // public flags (8 byte connection_id)
-      0x38,
+      {"",
+       {0x38}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (window update frame)
-      0x04,
+      {"",
+       {0x04}},
       // stream id
-      0x01, 0x02, 0x03, 0x04,
+      {"Unable to read stream_id.",
+       {0x01, 0x02, 0x03, 0x04}},
       // byte offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
-    };
+      {"Unable to read window byte_offset.",
+       {0xBA, 0x98, 0xFE, 0xDC,
+        0x32, 0x10, 0x76, 0x54}},
+  };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_38 ? packet39 : packet;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
 
-  // Now test framing boundaries.
-  for (size_t i = kQuicFrameTypeSize;
-       i < QuicFramer::GetWindowUpdateFrameSize(); ++i) {
-    string expected_error;
-    if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) {
-      expected_error = "Unable to read stream_id.";
-    } else {
-      expected_error = "Unable to read window byte_offset.";
-    }
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_WINDOW_UPDATE_DATA);
 }
 
 TEST_P(QuicFramerTest, BlockedFrame) {
   // clang-format off
-  unsigned char packet[] = {
+  PacketFragments packet = {
       // public flags (8 byte connection_id)
-      0x38,
+      {"",
+       {0x38}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0xBC, 0x9A, 0x78, 0x56,
-      0x34, 0x12,
-
+      {"",
+       {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}},
       // frame type (blocked frame)
-      0x05,
+      {"",
+       {0x05}},
       // stream id
-      0x04, 0x03, 0x02, 0x01,
-    };
+      {"Unable to read stream_id.",
+       {0x04, 0x03, 0x02, 0x01}},
+  };
 
-  unsigned char packet39[] = {
+  PacketFragments packet39 = {
       // public flags (8 byte connection_id)
-      0x38,
+      {"",
+       {0x38}},
       // connection_id
-      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
       // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
+      {"",
+       {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}},
       // frame type (blocked frame)
-      0x05,
+      {"",
+       {0x05}},
       // stream id
-      0x01, 0x02, 0x03, 0x04,
-    };
+      {"Unable to read stream_id.",
+       {0x01, 0x02, 0x03, 0x04}},
+  };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
-      arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  PacketFragments& fragments =
+      framer_.version() > QUIC_VERSION_38 ? packet39 : packet;
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(fragments));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
-  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion,
+  EXPECT_TRUE(CheckDecryption(*encrypted, !kIncludeVersion,
                               !kIncludeDiversificationNonce));
 
   EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
 
-  // Now test framing boundaries.
-  for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize();
-       ++i) {
-    string expected_error = "Unable to read stream_id.";
-    CheckProcessingFails(
-        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
-        i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
-                                !kIncludeVersion, !kIncludeDiversificationNonce,
-                                PACKET_6BYTE_PACKET_NUMBER),
-        expected_error, QUIC_INVALID_BLOCKED_DATA);
-  }
+  CheckFramingBoundaries(fragments, QUIC_INVALID_BLOCKED_DATA);
 }
 
 TEST_P(QuicFramerTest, PingFrame) {
@@ -3223,34 +3068,41 @@
 
 TEST_P(QuicFramerTest, PublicResetPacketV33) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (public reset, 8 byte connection_id)
-    0x0A,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (2) + padding
-    0x02, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // tag kRSEQ
-    'R', 'S', 'E', 'Q',
-    // end offset 16
-    0x10, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-    // rejected packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12, 0x00, 0x00,
+  PacketFragments packet = {
+      // public flags (public reset, 8 byte connection_id)
+      {"",
+       {0x0A}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      {"Unable to read reset message.",
+       {
+         // message tag (kPRST)
+         'P', 'R', 'S', 'T',
+         // num_entries (2) + padding
+         0x02, 0x00, 0x00, 0x00,
+         // tag kRNON
+         'R', 'N', 'O', 'N',
+         // end offset 8
+         0x08, 0x00, 0x00, 0x00,
+         // tag kRSEQ
+         'R', 'S', 'E', 'Q',
+         // end offset 16
+         0x10, 0x00, 0x00, 0x00,
+         // nonce proof
+         0x89, 0x67, 0x45, 0x23,
+         0x01, 0xEF, 0xCD, 0xAB,
+         // rejected packet number
+         0xBC, 0x9A, 0x78, 0x56,
+         0x34, 0x12, 0x00, 0x00,
+       }
+      }
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(packet));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.public_reset_packet_.get());
   EXPECT_EQ(kConnectionId,
@@ -3262,58 +3114,48 @@
       IpAddressFamily::IP_UNSPEC,
       visitor_.public_reset_packet_->client_address.host().address_family());
 
-  // Now test framing boundaries.
-  for (size_t i = 0; i < arraysize(packet); ++i) {
-    string expected_error;
-    QUIC_DLOG(INFO) << "iteration: " << i;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PACKET_HEADER);
-    } else if (i < kPublicResetPacketMessageTagOffset) {
-      expected_error = "Unable to read ConnectionId.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PACKET_HEADER);
-    } else {
-      expected_error = "Unable to read reset message.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PUBLIC_RST_PACKET);
-    }
-  }
+  CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
 }
 
 TEST_P(QuicFramerTest, PublicResetPacket) {
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
 
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (public reset, 8 byte connection_id)
-    0x0E,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (2) + padding
-    0x02, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // tag kRSEQ
-    'R', 'S', 'E', 'Q',
-    // end offset 16
-    0x10, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-    // rejected packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12, 0x00, 0x00,
+  PacketFragments packet = {
+      // public flags (public reset, 8 byte connection_id)
+      {"",
+       {0x0E}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      {"Unable to read reset message.",
+       {
+         // message tag (kPRST)
+         'P', 'R', 'S', 'T',
+         // num_entries (2) + padding
+         0x02, 0x00, 0x00, 0x00,
+         // tag kRNON
+         'R', 'N', 'O', 'N',
+         // end offset 8
+         0x08, 0x00, 0x00, 0x00,
+         // tag kRSEQ
+         'R', 'S', 'E', 'Q',
+         // end offset 16
+         0x10, 0x00, 0x00, 0x00,
+         // nonce proof
+         0x89, 0x67, 0x45, 0x23,
+         0x01, 0xEF, 0xCD, 0xAB,
+         // rejected packet number
+         0xBC, 0x9A, 0x78, 0x56,
+         0x34, 0x12, 0x00, 0x00,
+       }
+      }
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(packet));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.public_reset_packet_.get());
   EXPECT_EQ(kConnectionId,
@@ -3325,24 +3167,7 @@
       IpAddressFamily::IP_UNSPEC,
       visitor_.public_reset_packet_->client_address.host().address_family());
 
-  // Now test framing boundaries.
-  for (size_t i = 0; i < arraysize(packet); ++i) {
-    string expected_error;
-    QUIC_DLOG(INFO) << "iteration: " << i;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PACKET_HEADER);
-    } else if (i < kPublicResetPacketMessageTagOffset) {
-      expected_error = "Unable to read ConnectionId.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PACKET_HEADER);
-    } else {
-      expected_error = "Unable to read reset message.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PUBLIC_RST_PACKET);
-    }
-  }
+  CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
 }
 
 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
@@ -3375,49 +3200,57 @@
   };
   // clang-format on
 
-  string expected_error = "Unable to read reset message.";
-  CheckProcessingFails(packet, arraysize(packet), expected_error,
-                       QUIC_INVALID_PUBLIC_RST_PACKET);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+  EXPECT_FALSE(framer_.ProcessPacket(encrypted));
+  ASSERT_EQ(QUIC_INVALID_PUBLIC_RST_PACKET, framer_.error());
+  EXPECT_EQ("Unable to read reset message.", framer_.detailed_error());
 }
 
 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (public reset, 8 byte connection_id)
-    0x0A,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (3) + padding
-    0x03, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // tag kRSEQ
-    'R', 'S', 'E', 'Q',
-    // end offset 16
-    0x10, 0x00, 0x00, 0x00,
-    // tag kCADR
-    'C', 'A', 'D', 'R',
-    // end offset 24
-    0x18, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-    // rejected packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12, 0x00, 0x00,
-    // client address: 4.31.198.44:443
-    0x02, 0x00,
-    0x04, 0x1F, 0xC6, 0x2C,
-    0xBB, 0x01,
+  PacketFragments packet = {
+      // public flags (public reset, 8 byte connection_id)
+      {"",
+       {0x0A}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      {"Unable to read reset message.",
+       {
+         // message tag (kPRST)
+         'P', 'R', 'S', 'T',
+         // num_entries (2) + padding
+         0x03, 0x00, 0x00, 0x00,
+         // tag kRNON
+         'R', 'N', 'O', 'N',
+         // end offset 8
+         0x08, 0x00, 0x00, 0x00,
+         // tag kRSEQ
+         'R', 'S', 'E', 'Q',
+         // end offset 16
+         0x10, 0x00, 0x00, 0x00,
+         // tag kCADR
+         'C', 'A', 'D', 'R',
+         // end offset 24
+         0x18, 0x00, 0x00, 0x00,
+         // nonce proof
+         0x89, 0x67, 0x45, 0x23,
+         0x01, 0xEF, 0xCD, 0xAB,
+         // rejected packet number
+         0xBC, 0x9A, 0x78, 0x56,
+         0x34, 0x12, 0x00, 0x00,
+         // client address: 4.31.198.44:443
+         0x02, 0x00,
+         0x04, 0x1F, 0xC6, 0x2C,
+         0xBB, 0x01,
+       }
+      }
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(packet));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.public_reset_packet_.get());
   EXPECT_EQ(kConnectionId,
@@ -3429,98 +3262,77 @@
             visitor_.public_reset_packet_->client_address.host().ToString());
   EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
 
-  // Now test framing boundaries.
-  for (size_t i = 0; i < arraysize(packet); ++i) {
-    string expected_error;
-    QUIC_DLOG(INFO) << "iteration: " << i;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PACKET_HEADER);
-    } else if (i < kPublicResetPacketMessageTagOffset) {
-      expected_error = "Unable to read ConnectionId.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PACKET_HEADER);
-    } else {
-      expected_error = "Unable to read reset message.";
-      CheckProcessingFails(packet, i, expected_error,
-                           QUIC_INVALID_PUBLIC_RST_PACKET);
-    }
-  }
+  CheckFramingBoundaries(packet, QUIC_INVALID_PUBLIC_RST_PACKET);
 }
 
 TEST_P(QuicFramerTest, VersionNegotiationPacket) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    'Q', '2', '.', '0',
+  PacketFragments packet = {
+      // public flags (version, 8 byte connection_id)
+      {"",
+       {0x39}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // version tag
+      {"Unable to read supported version in negotiation.",
+       {'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+        'Q', '2', '.', '0'}},
   };
   // clang-format on
 
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
 
-  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(packet));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
   EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
   EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
 
-  for (size_t i = 0; i <= kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID; ++i) {
-    string expected_error;
-    QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < kVersionOffset) {
-      expected_error = "Unable to read ConnectionId.";
-    } else {
-      expected_error = "Unable to read supported version in negotiation.";
-      error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
-    }
-    CheckProcessingFails(packet, i, expected_error, error_code);
+  // Remove the last version from the packet so that every truncated
+  // version of the packet is invalid, otherwise checking boundaries
+  // is annoyingly complicated.
+  for (size_t i = 0; i < 4; ++i) {
+    packet.back().fragment.pop_back();
   }
+  CheckFramingBoundaries(packet, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
 }
 
 TEST_P(QuicFramerTest, OldVersionNegotiationPacket) {
   // clang-format off
-  unsigned char packet[] = {
-    // public flags (version, 8 byte connection_id)
-    0x3D,
-    // connection_id
-    0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    'Q', '2', '.', '0',
+  PacketFragments packet = {
+      // public flags (version, 8 byte connection_id)
+      {"",
+       {0x3D}},
+      // connection_id
+      {"",
+       {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}},
+      // version tag
+      {"Unable to read supported version in negotiation.",
+       {'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+        'Q', '2', '.', '0'}},
   };
   // clang-format on
 
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
 
-  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
-  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  std::unique_ptr<QuicEncryptedPacket> encrypted(
+      AssemblePacketFromFragments(packet));
+  EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
   EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
   EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
 
-  for (size_t i = 0; i <= kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID; ++i) {
-    string expected_error;
-    QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER;
-    if (i < kConnectionIdOffset) {
-      expected_error = "Unable to read public flags.";
-    } else if (i < kVersionOffset) {
-      expected_error = "Unable to read ConnectionId.";
-    } else {
-      expected_error = "Unable to read supported version in negotiation.";
-      error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
-    }
-    CheckProcessingFails(packet, i, expected_error, error_code);
+  // Remove the last version from the packet so that every truncated
+  // version of the packet is invalid, otherwise checking boundaries
+  // is annoyingly complicated.
+  for (size_t i = 0; i < 4; ++i) {
+    packet.back().fragment.pop_back();
   }
+  CheckFramingBoundaries(packet, QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
 }
 
 TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
diff --git a/net/quic/core/quic_headers_stream_test.cc b/net/quic/core/quic_headers_stream_test.cc
index 2f47bcc..e0b28f36 100644
--- a/net/quic/core/quic_headers_stream_test.cc
+++ b/net/quic/core/quic_headers_stream_test.cc
@@ -199,8 +199,7 @@
     } else {
       consumed = data.total_length;
       char* buf = new char[consumed];
-      QuicDataWriter writer(consumed, buf, Perspective::IS_CLIENT,
-                            NETWORK_BYTE_ORDER);
+      QuicDataWriter writer(consumed, buf, NETWORK_BYTE_ORDER);
       headers_stream_->WriteStreamData(headers_stream_->stream_bytes_written(),
                                        consumed, &writer);
       saved_data_.append(buf, consumed);
@@ -216,8 +215,7 @@
       saved_data_.append(static_cast<char*>(iov[0].iov_base), consumed);
     } else {
       char* buf = new char[consumed];
-      QuicDataWriter writer(consumed, buf, Perspective::IS_CLIENT,
-                            NETWORK_BYTE_ORDER);
+      QuicDataWriter writer(consumed, buf, NETWORK_BYTE_ORDER);
       headers_stream_->WriteStreamData(headers_stream_->stream_bytes_written(),
                                        consumed, &writer);
       saved_data_.append(buf, consumed);
@@ -1016,6 +1014,7 @@
   EXPECT_CALL(session_,
               WritevData(headers_stream_, kHeadersStreamId, _, _, NO_FIN, _))
       .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData));
+  EXPECT_CALL(*connection_, CloseConnection(QUIC_INTERNAL_ERROR, _, _));
   InSequence s;
   QuicReferenceCountedPointer<MockAckListener> ack_listener1(
       new MockAckListener());
@@ -1063,12 +1062,10 @@
   headers_stream_->OnStreamFrameAcked(frame1, QuicTime::Delta::Zero());
   headers_stream_->OnStreamFrameAcked(frame2, QuicTime::Delta::Zero());
   // Unsent data is acked.
-  if (!session_.save_data_before_consumption()) {
-    EXPECT_CALL(*connection_, CloseConnection(QUIC_INTERNAL_ERROR, _, _));
-    EXPECT_QUIC_BUG(
-        headers_stream_->OnStreamFrameAcked(frame3, QuicTime::Delta::Zero()),
-        "Unsent stream data is acked.");
-  }
+  EXPECT_CALL(*ack_listener2, OnPacketAcked(7, _));
+  EXPECT_QUIC_BUG(
+      headers_stream_->OnStreamFrameAcked(frame3, QuicTime::Delta::Zero()),
+      "Unsent stream data is acked.");
 }
 
 TEST_P(QuicHeadersStreamTest, FrameContainsMultipleHeaders) {
diff --git a/net/quic/core/quic_packet_creator.cc b/net/quic/core/quic_packet_creator.cc
index a3ed7ee..dc64a8e 100644
--- a/net/quic/core/quic_packet_creator.cc
+++ b/net/quic/core/quic_packet_creator.cc
@@ -38,15 +38,12 @@
       framer_(framer),
       buffer_allocator_(buffer_allocator),
       send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT),
-      next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER),
       have_diversification_nonce_(false),
       max_packet_length_(0),
       connection_id_length_(PACKET_8BYTE_CONNECTION_ID),
       packet_size_(0),
       connection_id_(connection_id),
       packet_(0, PACKET_1BYTE_PACKET_NUMBER, nullptr, 0, false, false),
-      latched_flag_no_stop_waiting_frames_(
-          FLAGS_quic_reloadable_flag_quic_no_stop_waiting_frames),
       pending_padding_bytes_(0),
       needs_full_padding_(false) {
   SetMaxPacketLength(kDefaultMaxPacketSize);
@@ -324,7 +321,7 @@
   FillPacketHeader(&header);
   QUIC_CACHELINE_ALIGNED char encrypted_buffer[kMaxPacketSize];
   QuicDataWriter writer(arraysize(encrypted_buffer), encrypted_buffer,
-                        framer_->perspective(), framer_->endianness());
+                        framer_->endianness());
   if (!framer_->AppendPacketHeader(header, &writer)) {
     QUIC_BUG << "AppendPacketHeader failed";
     return;
@@ -574,9 +571,7 @@
 
   if (frame.type == ACK_FRAME) {
     packet_.has_ack = true;
-    if (latched_flag_no_stop_waiting_frames_) {
-      packet_.largest_acked = frame.ack_frame->largest_observed;
-    }
+    packet_.largest_acked = frame.ack_frame->largest_observed;
   }
   if (frame.type == STOP_WAITING_FRAME) {
     packet_.has_stop_waiting = true;
diff --git a/net/quic/core/quic_packet_creator.h b/net/quic/core/quic_packet_creator.h
index 0862c48..61e8af50 100644
--- a/net/quic/core/quic_packet_creator.h
+++ b/net/quic/core/quic_packet_creator.h
@@ -209,10 +209,6 @@
     debug_delegate_ = debug_delegate;
   }
 
-  bool latched_flag_no_stop_waiting_frames() const {
-    return latched_flag_no_stop_waiting_frames_;
-  }
-
   QuicByteCount pending_padding_bytes() const { return pending_padding_bytes_; }
 
  private:
@@ -274,11 +270,6 @@
 
   // Controls whether version should be included while serializing the packet.
   bool send_version_in_packet_;
-  // Staging variable to hold next packet number length. When sequence
-  // number length is to be changed, this variable holds the new length until
-  // a packet boundary, when the creator's packet_number_length_ can be changed
-  // to this new value.
-  QuicPacketNumberLength next_packet_number_length_;
   // If true, then |nonce_for_public_header_| will be included in the public
   // header of all packets created at the initial encryption level.
   bool have_diversification_nonce_;
@@ -301,9 +292,6 @@
   // Packet used to invoke OnSerializedPacket.
   SerializedPacket packet_;
 
-  // The latched value of FLAGS_quic_reloadable_flag_quic_no_stop_waiting_frames
-  bool latched_flag_no_stop_waiting_frames_;
-
   // Pending padding bytes to send. Pending padding bytes will be sent in next
   // packet(s) (after all other frames) if current constructed packet does not
   // have room to send all of them.
diff --git a/net/quic/core/quic_packet_creator_test.cc b/net/quic/core/quic_packet_creator_test.cc
index c5a3c63..3fda43c 100644
--- a/net/quic/core/quic_packet_creator_test.cc
+++ b/net/quic/core/quic_packet_creator_test.cc
@@ -199,8 +199,7 @@
     EXPECT_EQ(stream_id, frame.stream_frame->stream_id);
     if (client_framer_.HasDataProducer()) {
       char buf[kMaxPacketSize];
-      QuicDataWriter writer(kMaxPacketSize, buf, Perspective::IS_CLIENT,
-                            HOST_BYTE_ORDER);
+      QuicDataWriter writer(kMaxPacketSize, buf, HOST_BYTE_ORDER);
       if (frame.stream_frame->data_length > 0) {
         producer_.WriteStreamData(stream_id, frame.stream_frame->offset,
                                   frame.stream_frame->data_length, &writer);
@@ -871,9 +870,7 @@
   EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
   ASSERT_TRUE(retransmittable[0].stream_frame);
   EXPECT_TRUE(serialized_packet_.has_ack);
-  if (FLAGS_quic_reloadable_flag_quic_no_stop_waiting_frames) {
-    EXPECT_EQ(10u, serialized_packet_.largest_acked);
-  }
+  EXPECT_EQ(10u, serialized_packet_.largest_acked);
   DeleteSerializedPacket();
 
   EXPECT_FALSE(creator_.HasPendingFrames());
diff --git a/net/quic/core/quic_packet_generator.cc b/net/quic/core/quic_packet_generator.cc
index 8f1e372..337cdd99 100644
--- a/net/quic/core/quic_packet_generator.cc
+++ b/net/quic/core/quic_packet_generator.cc
@@ -135,7 +135,7 @@
   if (run_fast_path) {
     QUIC_FLAG_COUNT(quic_reloadable_flag_quic_consuming_data_faster);
     return ConsumeDataFastPath(id, iov, offset, state != NO_FIN,
-                               total_bytes_consumed, std::move(ack_listener));
+                               total_bytes_consumed, ack_listener);
   }
 
   // Don't allow the handshake to be bundled with other retransmittable frames.
diff --git a/net/quic/core/quic_packet_generator.h b/net/quic/core/quic_packet_generator.h
index 637653c..3c192c3c 100644
--- a/net/quic/core/quic_packet_generator.h
+++ b/net/quic/core/quic_packet_generator.h
@@ -189,10 +189,6 @@
     packet_creator_.set_debug_delegate(debug_delegate);
   }
 
-  bool latched_flag_no_stop_waiting_frames() const {
-    return packet_creator_.latched_flag_no_stop_waiting_frames();
-  }
-
  private:
   friend class test::QuicPacketGeneratorPeer;
 
diff --git a/net/quic/core/quic_packet_generator_test.cc b/net/quic/core/quic_packet_generator_test.cc
index 2e5c8fba..0beb7cc 100644
--- a/net/quic/core/quic_packet_generator_test.cc
+++ b/net/quic/core/quic_packet_generator_test.cc
@@ -132,7 +132,7 @@
       }
     }
     return QuicPacketGenerator::ConsumeDataFastPath(id, iov, offset, fin, 0,
-                                                    std::move(ack_listener));
+                                                    ack_listener);
   }
 
   QuicConsumedData ConsumeData(
diff --git a/net/quic/core/quic_sent_packet_manager_test.cc b/net/quic/core/quic_sent_packet_manager_test.cc
index eb25463..bce2bbd 100644
--- a/net/quic/core/quic_sent_packet_manager_test.cc
+++ b/net/quic/core/quic_sent_packet_manager_test.cc
@@ -544,7 +544,6 @@
 }
 
 TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
-  FLAGS_quic_reloadable_flag_quic_no_stop_waiting_frames = true;
   EXPECT_EQ(0u, manager_.largest_packet_peer_knows_is_acked());
   SendDataPacket(1);
   SendAckPacket(2, 1);
diff --git a/net/quic/core/quic_stream_send_buffer_test.cc b/net/quic/core/quic_stream_send_buffer_test.cc
index ada0924..563d1b8 100644
--- a/net/quic/core/quic_stream_send_buffer_test.cc
+++ b/net/quic/core/quic_stream_send_buffer_test.cc
@@ -56,7 +56,7 @@
 
 TEST_F(QuicStreamSendBufferTest, CopyDataToBuffer) {
   char buf[4000];
-  QuicDataWriter writer(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER);
+  QuicDataWriter writer(4000, buf, HOST_BYTE_ORDER);
   string copy1(1024, 'a');
   string copy2 = string(512, 'a') + string(256, 'b') + string(256, 'c');
   string copy3(1024, 'c');
@@ -72,7 +72,7 @@
   EXPECT_EQ(copy4, QuicStringPiece(buf + 3072, 768));
 
   // Test data piece across boundries.
-  QuicDataWriter writer2(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER);
+  QuicDataWriter writer2(4000, buf, HOST_BYTE_ORDER);
   string copy5 = string(536, 'a') + string(256, 'b') + string(232, 'c');
   ASSERT_TRUE(send_buffer_.WriteStreamData(1000, 1024, &writer2));
   EXPECT_EQ(copy5, QuicStringPiece(buf, 1024));
@@ -80,7 +80,7 @@
   EXPECT_EQ(copy3, QuicStringPiece(buf + 1024, 1024));
 
   // Invalid data copy.
-  QuicDataWriter writer3(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER);
+  QuicDataWriter writer3(4000, buf, HOST_BYTE_ORDER);
   EXPECT_FALSE(send_buffer_.WriteStreamData(3000, 1024, &writer3));
   EXPECT_FALSE(send_buffer_.WriteStreamData(0, 4000, &writer3));
 }
diff --git a/net/quic/quartc/quartc_stream_test.cc b/net/quic/quartc/quartc_stream_test.cc
index 4413d0c..09cb139 100644
--- a/net/quic/quartc/quartc_stream_test.cc
+++ b/net/quic/quartc/quartc_stream_test.cc
@@ -53,8 +53,7 @@
       // WritevData does not pass down a iovec, data is saved in stream before
       // data is consumed. Retrieve data from stream.
       char* buf = new char[len];
-      QuicDataWriter writer(len, buf, Perspective::IS_CLIENT,
-                            NETWORK_BYTE_ORDER);
+      QuicDataWriter writer(len, buf, NETWORK_BYTE_ORDER);
       QuicStream* stream = GetOrCreateStream(kStreamId);
       DCHECK(stream);
       if (len > 0) {
diff --git a/net/quic/test_tools/quic_crypto_server_config_peer.cc b/net/quic/test_tools/quic_crypto_server_config_peer.cc
index 275c1310..6fcbd3c 100644
--- a/net/quic/test_tools/quic_crypto_server_config_peer.cc
+++ b/net/quic/test_tools/quic_crypto_server_config_peer.cc
@@ -13,10 +13,6 @@
 namespace net {
 namespace test {
 
-ProofSource* QuicCryptoServerConfigPeer::GetProofSource() {
-  return server_config_->proof_source_.get();
-}
-
 QuicReferenceCountedPointer<QuicCryptoServerConfig::Config>
 QuicCryptoServerConfigPeer::GetPrimaryConfig() {
   QuicReaderMutexLock locked(&server_config_->configs_lock_);
@@ -89,11 +85,6 @@
                                                           now);
 }
 
-string QuicCryptoServerConfigPeer::NewServerNonce(QuicRandom* rand,
-                                                  QuicWallTime now) const {
-  return server_config_->NewServerNonce(rand, now);
-}
-
 void QuicCryptoServerConfigPeer::CheckConfigs(
     std::vector<std::pair<string, bool>> expected_ids_and_status) {
   QuicReaderMutexLock locked(&server_config_->configs_lock_);
diff --git a/net/quic/test_tools/quic_crypto_server_config_peer.h b/net/quic/test_tools/quic_crypto_server_config_peer.h
index 374a806..70f2240 100644
--- a/net/quic/test_tools/quic_crypto_server_config_peer.h
+++ b/net/quic/test_tools/quic_crypto_server_config_peer.h
@@ -17,9 +17,6 @@
   explicit QuicCryptoServerConfigPeer(QuicCryptoServerConfig* server_config)
       : server_config_(server_config) {}
 
-  // Returns the proof source.
-  ProofSource* GetProofSource();
-
   // Returns the primary config.
   QuicReferenceCountedPointer<QuicCryptoServerConfig::Config>
   GetPrimaryConfig();
@@ -57,9 +54,6 @@
       const QuicIpAddress& ip,
       QuicWallTime now);
 
-  // Returns a new server nonce.
-  std::string NewServerNonce(QuicRandom* rand, QuicWallTime now) const;
-
   // CheckConfigs compares the state of the Configs in |server_config_| to the
   // description given as arguments.
   // The first of each pair is the server config ID of a Config. The second is a
diff --git a/net/quic/test_tools/quic_spdy_stream_peer.cc b/net/quic/test_tools/quic_spdy_stream_peer.cc
index 5acc7cf6..57ca8fa 100644
--- a/net/quic/test_tools/quic_spdy_stream_peer.cc
+++ b/net/quic/test_tools/quic_spdy_stream_peer.cc
@@ -5,15 +5,3 @@
 #include "net/quic/test_tools/quic_spdy_stream_peer.h"
 
 #include "net/quic/core/quic_spdy_stream.h"
-
-namespace net {
-namespace test {
-
-// static
-void QuicSpdyStreamPeer::SetHeadersDecompressed(QuicSpdyStream* stream,
-                                                bool headers_decompressed) {
-  stream->headers_decompressed_ = headers_decompressed;
-}
-
-}  // namespace test
-}  // namespace net
diff --git a/net/quic/test_tools/quic_spdy_stream_peer.h b/net/quic/test_tools/quic_spdy_stream_peer.h
index 49ee55c..f23466eb 100644
--- a/net/quic/test_tools/quic_spdy_stream_peer.h
+++ b/net/quic/test_tools/quic_spdy_stream_peer.h
@@ -9,15 +9,10 @@
 
 namespace net {
 
-class QuicSpdyStream;
-
 namespace test {
 
 class QuicSpdyStreamPeer {
  public:
-  static void SetHeadersDecompressed(QuicSpdyStream* stream,
-                                     bool headers_decompressed);
-
  private:
   DISALLOW_COPY_AND_ASSIGN(QuicSpdyStreamPeer);
 };
diff --git a/ppapi/proxy/ppapi_messages.cc b/ppapi/proxy/ppapi_messages.cc
index a487a76..8ff3a9dd 100644
--- a/ppapi/proxy/ppapi_messages.cc
+++ b/ppapi/proxy/ppapi_messages.cc
@@ -26,16 +26,6 @@
 #error "Failed to include ppapi/proxy/ppapi_messages.h"
 #endif
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef PPAPI_PROXY_PPAPI_MESSAGES_H_
-#include "ppapi/proxy/ppapi_messages.h"
-#ifndef PPAPI_PROXY_PPAPI_MESSAGES_H_
-#error "Failed to include ppapi/proxy/ppapi_messages.h"
-#endif
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/ppapi/proxy/ppapi_param_traits.cc b/ppapi/proxy/ppapi_param_traits.cc
index a45ce35..d0f71d0 100644
--- a/ppapi/proxy/ppapi_param_traits.cc
+++ b/ppapi/proxy/ppapi_param_traits.cc
@@ -79,11 +79,6 @@
 // PP_Bool ---------------------------------------------------------------------
 
 // static
-void ParamTraits<PP_Bool>::GetSize(base::PickleSizer* s, const param_type& p) {
-  GetParamSize(s, PP_ToBool(p));
-}
-
-// static
 void ParamTraits<PP_Bool>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, PP_ToBool(p));
 }
@@ -156,13 +151,6 @@
 // PP_NetAddress_Private -------------------------------------------------------
 
 // static
-void ParamTraits<PP_NetAddress_Private>::GetSize(base::PickleSizer* s,
-                                                 const param_type& p) {
-  GetParamSize(s, p.size);
-  s->AddBytes(static_cast<int>(p.size));
-}
-
-// static
 void ParamTraits<PP_NetAddress_Private>::Write(base::Pickle* m,
                                                const param_type& p) {
   WriteParam(m, p.size);
@@ -198,13 +186,6 @@
 // HostResource ----------------------------------------------------------------
 
 // static
-void ParamTraits<ppapi::HostResource>::GetSize(base::PickleSizer* s,
-                                               const param_type& p) {
-  GetParamSize(s, p.instance());
-  GetParamSize(s, p.host_resource());
-}
-
-// static
 void ParamTraits<ppapi::HostResource>::Write(base::Pickle* m,
                                              const param_type& p) {
   WriteParam(m, p.instance());
@@ -273,12 +254,6 @@
 // ppapi::PpapiPermissions -----------------------------------------------------
 
 // static
-void ParamTraits<ppapi::PpapiPermissions>::GetSize(base::PickleSizer* s,
-                                                   const param_type& p) {
-  GetParamSize(s, p.GetBits());
-}
-
-// static
 void ParamTraits<ppapi::PpapiPermissions>::Write(base::Pickle* m,
                                                  const param_type& p) {
   WriteParam(m, p.GetBits());
diff --git a/ppapi/proxy/ppapi_param_traits.h b/ppapi/proxy/ppapi_param_traits.h
index 2e63937..1869c99 100644
--- a/ppapi/proxy/ppapi_param_traits.h
+++ b/ppapi/proxy/ppapi_param_traits.h
@@ -49,7 +49,6 @@
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<PP_Bool> {
   typedef PP_Bool param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -60,7 +59,6 @@
 template <>
 struct PPAPI_PROXY_EXPORT ParamTraits<PP_NetAddress_Private> {
   typedef PP_NetAddress_Private param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -144,7 +142,6 @@
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<ppapi::HostResource> {
   typedef ppapi::HostResource param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -176,7 +173,6 @@
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<ppapi::PpapiPermissions> {
   typedef ppapi::PpapiPermissions param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/remoting/host/OWNERS b/remoting/host/OWNERS
index 9ade915..a7f8b91 100644
--- a/remoting/host/OWNERS
+++ b/remoting/host/OWNERS
@@ -1,5 +1,8 @@
 per-file *_messages*.h=set noparent
 per-file *_messages*.h=file://ipc/SECURITY_OWNERS
+

+per-file *_messages.cc=set noparent

+per-file *_messages.cc=file://ipc/SECURITY_OWNERS
 
 per-file *_param_traits*.*=set noparent
 per-file *_param_traits*.*=file://ipc/SECURITY_OWNERS
\ No newline at end of file
diff --git a/remoting/host/chromoting_messages.cc b/remoting/host/chromoting_messages.cc
index 174bebe..36c3cf4 100644
--- a/remoting/host/chromoting_messages.cc
+++ b/remoting/host/chromoting_messages.cc
@@ -14,12 +14,6 @@
 #include "ipc/struct_destructor_macros.h"
 #include "remoting/host/chromoting_messages.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#include "remoting/host/chromoting_messages.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/remoting/host/chromoting_param_traits.cc b/remoting/host/chromoting_param_traits.cc
index 3c00ef37..10d759e 100644
--- a/remoting/host/chromoting_param_traits.cc
+++ b/remoting/host/chromoting_param_traits.cc
@@ -14,13 +14,6 @@
 namespace IPC {
 
 // static
-void ParamTraits<webrtc::DesktopVector>::GetSize(base::PickleSizer* s,
-                                                 const param_type& p) {
-  GetParamSize(s, p.x());
-  GetParamSize(s, p.y());
-}
-
-// static
 void ParamTraits<webrtc::DesktopVector>::Write(base::Pickle* m,
                                                const webrtc::DesktopVector& p) {
   m->WriteInt(p.x());
@@ -46,13 +39,6 @@
 }
 
 // static
-void ParamTraits<webrtc::DesktopSize>::GetSize(base::PickleSizer* s,
-                                               const param_type& p) {
-  GetParamSize(s, p.width());
-  GetParamSize(s, p.height());
-}
-
-// static
 void ParamTraits<webrtc::DesktopSize>::Write(base::Pickle* m,
                                              const webrtc::DesktopSize& p) {
   m->WriteInt(p.width());
@@ -78,15 +64,6 @@
 }
 
 // static
-void ParamTraits<webrtc::DesktopRect>::GetSize(base::PickleSizer* s,
-                                               const param_type& p) {
-  GetParamSize(s, p.left());
-  GetParamSize(s, p.top());
-  GetParamSize(s, p.right());
-  GetParamSize(s, p.bottom());
-}
-
-// static
 void ParamTraits<webrtc::DesktopRect>::Write(base::Pickle* m,
                                              const webrtc::DesktopRect& p) {
   m->WriteInt(p.left());
@@ -282,15 +259,6 @@
 }
 
 // static
-void ParamTraits<remoting::protocol::ProcessResourceUsage>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
-  GetParamSize(s, p.process_name());
-  GetParamSize(s, p.processor_usage());
-  GetParamSize(s, p.working_set_size());
-  GetParamSize(s, p.pagefile_size());
-}
-
-// static
 void ParamTraits<remoting::protocol::ProcessResourceUsage>::Write(
     base::Pickle* m,
     const param_type& p) {
@@ -331,12 +299,6 @@
 }
 
 // static
-void ParamTraits<remoting::protocol::AggregatedProcessResourceUsage>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
-  GetParamSize(s, p.usages());
-}
-
-// static
 void ParamTraits<remoting::protocol::AggregatedProcessResourceUsage>::Write(
     base::Pickle* m,
     const param_type& p) {
diff --git a/remoting/host/chromoting_param_traits.h b/remoting/host/chromoting_param_traits.h
index d325bca..9000505e 100644
--- a/remoting/host/chromoting_param_traits.h
+++ b/remoting/host/chromoting_param_traits.h
@@ -21,7 +21,6 @@
 template <>
 struct ParamTraits<webrtc::DesktopVector> {
   typedef webrtc::DesktopVector param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -32,7 +31,6 @@
 template <>
 struct ParamTraits<webrtc::DesktopSize> {
   typedef webrtc::DesktopSize param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -43,7 +41,6 @@
 template <>
 struct ParamTraits<webrtc::DesktopRect> {
   typedef webrtc::DesktopRect param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -84,7 +81,6 @@
 template <>
 struct ParamTraits<remoting::protocol::ProcessResourceUsage> {
   typedef remoting::protocol::ProcessResourceUsage param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -95,7 +91,6 @@
 template <>
 struct ParamTraits<remoting::protocol::AggregatedProcessResourceUsage> {
   typedef remoting::protocol::AggregatedProcessResourceUsage param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/remoting/host/linux/BUILD.gn b/remoting/host/linux/BUILD.gn
index 4cb1b29..c58650e8 100644
--- a/remoting/host/linux/BUILD.gn
+++ b/remoting/host/linux/BUILD.gn
@@ -40,10 +40,43 @@
     ]
   }
 
+  copy("remoting_me2me_host_copy_user_session_wrapper") {
+    sources = [
+      "remoting_user_session_wrapper.sh",
+    ]
+    outputs = [
+      "$root_build_dir/remoting/user-session",
+    ]
+  }
+
+  copy("remoting_me2me_host_copy_user_session") {
+    sources = [
+      "$root_build_dir/remoting_user_session",
+    ]
+    outputs = [
+      "$root_build_dir/remoting/{{source_file_part}}",
+    ]
+    deps = [
+      ":remoting_user_session",
+    ]
+    if (is_component_build) {
+      sources += [
+        "$root_build_dir/libbase.so",
+        "$root_build_dir/libc++.so",
+      ]
+      deps += [
+        "//base:base",
+        "//buildtools/third_party/libc++:libc++",
+      ]
+    }
+  }
+
   group("remoting_dev_me2me_host") {
     deps = [
       ":remoting_me2me_host_copy_host_wrapper",
       ":remoting_me2me_host_copy_script",
+      ":remoting_me2me_host_copy_user_session",
+      ":remoting_me2me_host_copy_user_session_wrapper",
       ":remoting_native_messaging_host",
       "//remoting/host:remoting_me2me_host",
     ]
diff --git a/remoting/host/linux/linux_me2me_host.py b/remoting/host/linux/linux_me2me_host.py
index 8302e290..6e7e26a 100755
--- a/remoting/host/linux/linux_me2me_host.py
+++ b/remoting/host/linux/linux_me2me_host.py
@@ -40,23 +40,6 @@
 import time
 import uuid
 
-LOG_FILE_ENV_VAR = "CHROME_REMOTE_DESKTOP_LOG_FILE"
-
-ENV_VARS_FORWARDED_TO_CHILD_ENV = [
-    "HOME",
-    "LANG",
-    "LOGNAME",
-    "PATH",
-    "SHELL",
-    "USER",
-    "USERNAME",
-    LOG_FILE_ENV_VAR,
-    "GOOGLE_CLIENT_ID_REMOTING",
-    "GOOGLE_CLIENT_ID_REMOTING_HOST",
-    "GOOGLE_CLIENT_SECRET_REMOTING",
-    "GOOGLE_CLIENT_SECRET_REMOTING_HOST"
-]
-
 # If this env var is defined, extra host params will be loaded from this env var
 # as a list of strings separated by space (\s+). Note that param that contains
 # space is currently NOT supported and will be broken down into two params at
@@ -108,6 +91,8 @@
 else:
   HOST_BINARY_PATH = os.path.join(SCRIPT_DIR, "chrome-remote-desktop-host")
 
+USER_SESSION_PATH = os.path.join(SCRIPT_DIR, "user-session")
+
 CHROME_REMOTING_GROUP_NAME = "chrome-remote-desktop"
 
 HOME_DIR = os.environ["HOME"]
@@ -140,10 +125,17 @@
 USER_SESSION_MESSAGE_FD = 202
 
 # This is the exit code used to signal to wrapper that it should restart instead
-# of exiting. It must be kept in sync with kRestartExitCode in
+# of exiting. It must be kept in sync with kRelaunchExitCode in
 # remoting_user_session.cc.
 RELAUNCH_EXIT_CODE = 41
 
+# This exit code is returned when a needed binary such as user-session or sg
+# cannot be found.
+COMMAND_NOT_FOUND_EXIT_CODE = 127
+
+# This exit code is returned when a needed binary exists but cannot be executed.
+COMMAND_NOT_EXECUTABLE_EXIT_CODE = 126
+
 # Globals needed by the atexit cleanup() handler.
 g_desktop = None
 g_host_hash = hashlib.md5(socket.gethostname()).hexdigest()
@@ -435,41 +427,8 @@
       display += 1
     return display
 
-  def _init_child_env(self, keep_env):
-    if keep_env:
-      self.child_env = dict(os.environ)
-    else:
-      # Create clean environment for new session, so it is cleanly separated
-      # from the user's console X session.
-      self.child_env = {}
-
-      for key in ENV_VARS_FORWARDED_TO_CHILD_ENV:
-        if key in os.environ:
-          self.child_env[key] = os.environ[key]
-
-      # Initialize the environment from files that would normally be read in a
-      # PAM-authenticated session.
-      for env_filename in [
-        "/etc/environment",
-        "/etc/default/locale",
-        os.path.expanduser("~/.pam_environment")]:
-        if not os.path.exists(env_filename):
-          continue
-        try:
-          with open(env_filename, "r") as env_file:
-            for line in env_file:
-              line = line.rstrip("\n")
-              # Split at the first "=", leaving any further instances in the
-              # value.
-              key_value_pair = line.split("=", 1)
-              if len(key_value_pair) == 2:
-                key, value = tuple(key_value_pair)
-                # The file stores key=value assignments, but the value may be
-                # quoted, so strip leading & trailing quotes from it.
-                value = value.strip("'\"")
-                self.child_env[key] = value
-        except IOError:
-          logging.error("Failed to read file: %s" % env_filename)
+  def _init_child_env(self):
+    self.child_env = dict(os.environ)
 
     # Ensure that the software-rendering GL drivers are loaded by the desktop
     # session, instead of any hardware GL drivers installed on the system.
@@ -744,8 +703,8 @@
     if not self.session_proc.pid:
       raise Exception("Could not start X session")
 
-  def launch_session(self, keep_env, x_args):
-    self._init_child_env(keep_env)
+  def launch_session(self, x_args):
+    self._init_child_env()
     self._setup_pulseaudio()
     self._setup_gnubby()
     self._launch_x_server(x_args)
@@ -768,9 +727,7 @@
       _ = signum, frame
       logging.info("Host ready to receive connections.")
       self.host_ready = True
-      if (ParentProcessLogger.instance() and g_desktop is not None and
-          g_desktop.host_ready):
-        ParentProcessLogger.instance().release_parent(True)
+      ParentProcessLogger.release_parent_if_connected(True)
 
     signal.signal(signal.SIGUSR1, sigusr1_handler)
     args.append("--signal-parent")
@@ -861,8 +818,9 @@
       cmdline = psget(process.cmdline)
       if len(cmdline) < 2:
         continue
-      if (os.path.basename(cmdline[0]).startswith('python')
-          and os.path.basename(cmdline[1]) == os.path.basename(sys.argv[0])):
+      if (os.path.basename(cmdline[0]).startswith('python') and
+          os.path.basename(cmdline[1]) == os.path.basename(sys.argv[0]) and
+          "--start" in cmdline and "--child-process" in cmdline):
         process_config = parse_config_arg(cmdline[2:])[0]
         if process_config is None:
           # Fall back to old behavior if there is no --config argument
@@ -935,69 +893,50 @@
   This class creates a pipe to allow logging from the daemon process to be
   copied to the parent process. The daemon process adds a log-handler that
   directs logging output to the pipe. The parent process reads from this pipe
-  until and writes the content to stderr.  When the pipe is no longer needed
-  (for example, the host signals successful launch or permanent failure), the
-  daemon removes the log-handler and closes the pipe, causing the the parent
-  process to reach end-of-file while reading the pipe and exit.
+  and writes the content to stderr. When the pipe is no longer needed (for
+  example, the host signals successful launch or permanent failure), the daemon
+  removes the log-handler and closes the pipe, causing the the parent process
+  to reach end-of-file while reading the pipe and exit.
 
-  When daemonizing, the (singleton) logger should be instantiated before
-  forking. The parent process should call wait_for_logs() before exiting. When
-  running via user-session, the file descriptor for the pipe to the parent
-  process should be passed to the constructor. In the latter case, wait_for_logs
-  may not be used.
-
-  In either case, the (grand-)child process should call start_logging() when it
-  starts, and then use logging.* to issue log statements, as usual. When the
+  The file descriptor for the pipe to the parent process should be passed to
+  the constructor. The (grand-)child process should call start_logging() when
+  it starts, and then use logging.* to issue log statements, as usual. When the
   child has either succesfully started the host or terminated, it must call
   release_parent() to allow the parent to exit.
   """
 
   __instance = None
 
-  def __init__(self, write_fd=None):
-    """Constructor. When daemonizing, must be called before forking.
+  def __init__(self, write_fd):
+    """Constructor.
 
     Constructs the singleton instance of ParentProcessLogger. This should be
     called at most once.
 
-    write_fd: If specified, the logger will use the file descriptor provided
-              for sending log messages instead of creating a new pipe. It is
-              assumed that this is the write end of a pipe created by an
-              already-existing parent process, such as user-session. If
+    write_fd: The write end of the pipe created by the parent process. If
               write_fd is not a valid file descriptor, the constructor will
               throw either IOError or OSError.
     """
-    if write_fd is None:
-      read_pipe, write_pipe = os.pipe()
-    else:
-      read_pipe = None
-      write_pipe = write_fd
     # Ensure write_pipe is closed on exec, otherwise it will be kept open by
     # child processes (X, host), preventing the read pipe from EOF'ing.
-    old_flags = fcntl.fcntl(write_pipe, fcntl.F_GETFD)
-    fcntl.fcntl(write_pipe, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC)
-    if read_pipe is not None:
-      self._read_file = os.fdopen(read_pipe, 'r')
-    else:
-      self._read_file = None
-    self._write_file = os.fdopen(write_pipe, 'w')
+    old_flags = fcntl.fcntl(write_fd, fcntl.F_GETFD)
+    fcntl.fcntl(write_fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC)
+    self._write_file = os.fdopen(write_fd, 'w')
     self._logging_handler = None
     ParentProcessLogger.__instance = self
 
-  def start_logging(self):
+  def _start_logging(self):
     """Installs a logging handler that sends log entries to a pipe, prefixed
     with the string 'MSG:'. This allows them to be distinguished by the parent
     process from commands sent over the same pipe.
 
     Must be called by the child process.
     """
-    if self._read_file is not None:
-      self._read_file.close()
     self._logging_handler = logging.StreamHandler(self._write_file)
     self._logging_handler.setFormatter(logging.Formatter(fmt='MSG:%(message)s'))
     logging.getLogger().addHandler(self._logging_handler)
 
-  def release_parent(self, success):
+  def _release_parent(self, success):
     """Uninstalls logging handler and closes the pipe, releasing the parent.
 
     Must be called by the child process.
@@ -1014,132 +953,151 @@
         self._write_file.flush()
       self._write_file.close()
 
-  def wait_for_logs(self):
-    """Waits and prints log lines from the daemon until the pipe is closed.
+  @staticmethod
+  def try_start_logging(write_fd):
+    """Attempt to initialize ParentProcessLogger and start forwarding log
+    messages.
 
-    Must be called by the parent process.
-
-    Returns:
-      True if the host started and successfully registered with the directory;
-      false otherwise.
+    Returns False if the file descriptor was invalid (safe to ignore).
     """
-    # If Ctrl-C is pressed, inform the user that the daemon is still running.
-    def sigint_handler(signum, frame):
-      _ = signum, frame
-      print("Interrupted. The daemon is still running in the background.",
-            file=sys.stderr)
-      sys.exit(1)
-
-    signal.signal(signal.SIGINT, sigint_handler)
-
-    # Install a fallback timeout to release the parent process, in case the
-    # daemon never responds (e.g. host crash-looping, daemon killed).
-    # This signal will cause the read loop below to stop with an EINTR IOError.
-    #
-    # The value of 120s is chosen to match the heartbeat retry timeout in
-    # hearbeat_sender.cc.
-    def sigalrm_handler(signum, frame):
-      _ = signum, frame
-      print("No response from daemon. It may have crashed, or may still be "
-            "running in the background.", file=sys.stderr)
-
-    signal.signal(signal.SIGALRM, sigalrm_handler)
-    signal.alarm(120)
-
-    self._write_file.close()
-
-    # Print lines as they're logged to the pipe until EOF is reached or readline
-    # is interrupted by one of the signal handlers above.
-    host_ready = False
-    for line in iter(self._read_file.readline, ''):
-      if line[:4] == "MSG:":
-        sys.stderr.write(line[4:])
-      elif line == "READY\n":
-        host_ready = True
-      else:
-        sys.stderr.write("Unrecognized command: " + line)
-    print("Log file: %s" % os.environ[LOG_FILE_ENV_VAR], file=sys.stderr)
-    return host_ready
+    try:
+      ParentProcessLogger(USER_SESSION_MESSAGE_FD)._start_logging()
+      return True
+    except (IOError, OSError):
+      # One of these will be thrown if the file descriptor is invalid, such as
+      # if the the fd got closed by the login shell. In that case, just continue
+      # without sending log messages.
+      return False
 
   @staticmethod
-  def instance():
-    """Returns the singleton instance, if it exists."""
-    return ParentProcessLogger.__instance
+  def release_parent_if_connected(success):
+    """If ParentProcessLogger is active, stop logging and release the parent.
+
+    success: If true, signal to the parent that the script was successful.
+    """
+    instance = ParentProcessLogger.__instance
+    if instance is not None:
+      instance._release_parent(success)
 
 
-def daemonize():
-  """Background this process and detach from controlling terminal, redirecting
-  stdout/stderr to a log file."""
+def run_command_with_group(command, group):
+  """Run a command with a different primary group."""
 
-  # TODO(lambroslambrou): Having stdout/stderr redirected to a log file is not
-  # ideal - it could create a filesystem DoS if the daemon or a child process
-  # were to write excessive amounts to stdout/stderr.  Ideally, stdout/stderr
-  # should be redirected to a pipe or socket, and a process at the other end
-  # should consume the data and write it to a logging facility which can do
-  # data-capping or log-rotation. The 'logger' command-line utility could be
-  # used for this, but it might cause too much syslog spam.
+  # This is implemented using sg, which is an odd character and will try to
+  # prompt for a password if it can't verify the user is a member of the given
+  # group, along with in a few other corner cases. (It will prompt in the
+  # non-member case even if the group doesn't have a password set.)
+  #
+  # To prevent sg from prompting the user for a password that doesn't exist,
+  # redirect stdin and detach sg from the TTY. It will still print something
+  # like "Password: crypt: Invalid argument", so redirect stdout and stderr, as
+  # well. Finally, have the shell unredirect them when executing user-session.
+  #
+  # It is also desirable to have some way to tell whether any errors are
+  # from sg or the command, which is done using a pipe.
 
-  # Create new (temporary) file-descriptors before forking, so any errors get
-  # reported to the main process and set the correct exit-code.
-  # The mode is provided, since Python otherwise sets a default mode of 0777,
-  # which would result in the new file having permissions of 0777 & ~umask,
-  # possibly leaving the executable bits set.
-  if not LOG_FILE_ENV_VAR in os.environ:
-    log_file_prefix = "chrome_remote_desktop_%s_" % time.strftime(
-        '%Y%m%d_%H%M%S', time.localtime(time.time()))
-    log_file = tempfile.NamedTemporaryFile(prefix=log_file_prefix, delete=False)
-    os.environ[LOG_FILE_ENV_VAR] = log_file.name
+  def pre_exec(read_fd, write_fd):
+    os.close(read_fd)
 
-    # The file-descriptor in this case is owned by the tempfile object.
-    log_fd = os.dup(log_file.file.fileno())
-  else:
-    log_fd = os.open(os.environ[LOG_FILE_ENV_VAR],
-                     os.O_WRONLY | os.O_CREAT | os.O_APPEND, 0o600)
+    # /bin/sh may be dash, which only allows redirecting file descriptors 0-9,
+    # the minimum required by POSIX. Since there may be files open elsewhere,
+    # move the relevant file descriptors to specific numbers under that limit.
+    # Because this runs in the child process, it doesn't matter if existing file
+    # descriptors are closed in the process. After, stdio will be redirected to
+    # /dev/null, write_fd will be moved to 6, and the old stdio will be moved
+    # to 7, 8, and 9.
+    if (write_fd != 6):
+      os.dup2(write_fd, 6)
+      os.close(write_fd)
+    os.dup2(0, 7)
+    os.dup2(1, 8)
+    os.dup2(2, 9)
+    devnull = os.open(os.devnull, os.O_RDWR)
+    os.dup2(devnull, 0)
+    os.dup2(devnull, 1)
+    os.dup2(devnull, 2)
+    os.close(devnull)
 
-  devnull_fd = os.open(os.devnull, os.O_RDONLY)
-
-  parent_logger = ParentProcessLogger()
-
-  pid = os.fork()
-
-  if pid == 0:
-    # Child process
+    # os.setsid will detach subprocess from the TTY
     os.setsid()
 
-    # The second fork ensures that the daemon isn't a session leader, so that
-    # it doesn't acquire a controlling terminal.
-    pid = os.fork()
-
-    if pid == 0:
-      # Grandchild process
-      pass
+  # Pipe to check whether sg successfully ran our command.
+  read_fd, write_fd = os.pipe()
+  try:
+    # sg invokes the provided argument using /bin/sh. In that shell, first write
+    # "success\n" to the pipe, which is checked later to determine whether sg
+    # itself succeeded, and then restore stdio, close the extra file
+    # descriptors, and exec the provided command.
+    process = subprocess.Popen(
+        ["sg", group,
+         "echo success >&6; exec {command} "
+           # Restore original stdio
+           "0<&7 1>&8 2>&9 "
+           # Close no-longer-needed file descriptors
+           "6>&- 7<&- 8>&- 9>&-"
+           .format(command=" ".join(map(pipes.quote, command)))],
+        preexec_fn=lambda: pre_exec(read_fd, write_fd))
+    result = process.wait()
+  except OSError as e:
+    logging.error("Failed to execute sg: {}".format(e.strerror))
+    if e.errno == errno.ENOENT:
+      result = COMMAND_NOT_FOUND_EXIT_CODE
     else:
-      # Child process
-      os._exit(0)  # pylint: disable=W0212
-  else:
-    # Parent process
-    if parent_logger.wait_for_logs():
-      os._exit(0)  # pylint: disable=W0212
+      result = COMMAND_NOT_EXECUTABLE_EXIT_CODE
+    # Skip pipe check, since sg was never executed.
+    os.close(read_fd)
+    return result
+  except KeyboardInterrupt:
+    # Because sg is in its own session, it won't have gotten the interrupt.
+    try:
+      os.killpg(os.getpgid(process.pid), signal.SIGINT)
+      result = process.wait()
+    except OSError:
+      logging.warning("Command may still be running")
+      result = 1
+  finally:
+    os.close(write_fd)
+
+  with os.fdopen(read_fd) as read_file:
+    contents = read_file.read()
+  if contents != "success\n":
+    # No success message means sg didn't execute the command. (Maybe the user
+    # is not a member of the group?)
+    logging.error("Failed to access {} group. Is the user a member?"
+                  .format(group))
+    result = COMMAND_NOT_EXECUTABLE_EXIT_CODE
+
+  return result
+
+
+def start_via_user_session(foreground):
+  # We need to invoke user-session
+  command = [USER_SESSION_PATH, "start"]
+  if foreground:
+    command += ["--foreground"]
+  command += ["--"] + sys.argv[1:]
+  try:
+    process = subprocess.Popen(command)
+    result = process.wait()
+  except OSError as e:
+    if e.errno == errno.EACCES:
+      # User may have just been added to the CRD group, in which case they
+      # won't be able to execute user-session directly until they log out and
+      # back in. In the mean time, we can try to switch to the CRD group and
+      # execute user-session.
+      result = run_command_with_group(command, CHROME_REMOTING_GROUP_NAME)
     else:
-      os._exit(1)  # pylint: disable=W0212
+      logging.error("Could not execute {}: {}"
+                    .format(USER_SESSION_PATH, e.strerror))
+      if e.errno == errno.ENOENT:
+        result = COMMAND_NOT_FOUND_EXIT_CODE
+      else:
+        result = COMMAND_NOT_EXECUTABLE_EXIT_CODE
+  except KeyboardInterrupt:
+    # Child will have also gotten the interrupt. Wait for it to exit.
+    result = process.wait()
 
-  logging.info("Daemon process started in the background, logging to '%s'" %
-               os.environ[LOG_FILE_ENV_VAR])
-
-  os.chdir(HOME_DIR)
-
-  parent_logger.start_logging()
-
-  # Copy the file-descriptors to create new stdin, stdout and stderr.  Note
-  # that dup2(oldfd, newfd) closes newfd first, so this will close the current
-  # stdin, stdout and stderr, detaching from the terminal.
-  os.dup2(devnull_fd, sys.stdin.fileno())
-  os.dup2(log_fd, sys.stdout.fileno())
-  os.dup2(log_fd, sys.stderr.fileno())
-
-  # Close the temporary file-descriptors.
-  os.close(devnull_fd)
-  os.close(log_fd)
+  return result
 
 
 def cleanup():
@@ -1168,8 +1126,7 @@
       os.remove(g_desktop.xorg_conf)
 
   g_desktop = None
-  if ParentProcessLogger.instance():
-    ParentProcessLogger.instance().release_parent(False)
+  ParentProcessLogger.release_parent_if_connected(False)
 
 class SignalHandler:
   """Reload the config file on SIGHUP. Since we pass the configuration to the
@@ -1240,18 +1197,14 @@
     logging.info("Failure count for '%s' is now %d", self.label, self.failures)
 
 
-def relaunch_self(child_process):
+def relaunch_self():
   """Relaunches the session to pick up any changes to the session logic in case
-  Chrome Remote Desktop has been upgraded. If this script is running standalone,
-  just relaunch the script. If running under user-session, bubble the relaunch
-  request up so it can relaunch as well.
+  Chrome Remote Desktop has been upgraded. We return a special exit code to
+  inform user-session that it should relaunch.
   """
-  if child_process:
-    # cleanup run via atexit
-    sys.exit(RELAUNCH_EXIT_CODE)
-  else:
-    cleanup()
-    os.execvp(SCRIPT_PATH, sys.argv)
+
+  # cleanup run via atexit
+  sys.exit(RELAUNCH_EXIT_CODE)
 
 
 def waitpid_with_timeout(pid, deadline):
@@ -1519,18 +1472,29 @@
 
   # Determine whether a desktop is already active for the specified host
   # configuration.
-  proc = get_daemon_proc(config_file)
-  if proc is not None:
+  if get_daemon_proc(config_file) is not None:
     # Debian policy requires that services should "start" cleanly and return 0
     # if they are already running.
-    print("Service already running.")
+    if options.child_process:
+      # If the script is running under user-session, try to relay the message.
+      ParentProcessLogger.try_start_logging(USER_SESSION_MESSAGE_FD)
+    logging.info("Service already running.")
+    ParentProcessLogger.release_parent_if_connected(True)
     return 0
 
   if config_file != options.config:
-    # Canonicalize config flag so get_daemon_proc can find us.
-    exec_args = [sys.argv[0], "--config=" + config_file]
-    exec_args += parse_config_arg(sys.argv[1:])[1]
-    os.execvp(SCRIPT_PATH, exec_args)
+    # --config was either not specified or isn't a canonical absolute path.
+    # Replace it with the canonical path so get_daemon_proc can find us.
+    sys.argv = ([sys.argv[0], "--config=" + config_file] +
+                parse_config_arg(sys.argv[1:])[1])
+    if options.child_process:
+      os.execvp(sys.argv[0], sys.argv)
+
+  if not options.child_process:
+    return start_via_user_session(options.foreground)
+
+  # Start logging to user-session messaging pipe if it exists.
+  ParentProcessLogger.try_start_logging(USER_SESSION_MESSAGE_FD)
 
   # If a RANDR-supporting Xvfb is not available, limit the default size to
   # something more sensible.
@@ -1588,21 +1552,6 @@
     logging.error("Failed to load host configuration.")
     return 1
 
-  # If we're running under user-session, try to open the messaging pipe.
-  if options.child_process:
-    # Log to existing messaging pipe if it exists.
-    try:
-      ParentProcessLogger(USER_SESSION_MESSAGE_FD).start_logging()
-    except (IOError, OSError):
-      # One of these will be thrown if the file descriptor is invalid, such as
-      # if the the fd got closed by the login shell. In that case, just continue
-      # without sending log messages.
-      pass
-  # Otherwise, detach a separate "daemon" process to run the session, unless
-  # specifically requested to run in the foreground.
-  elif not options.foreground:
-    daemonize()
-
   if host.host_id:
     logging.info("Using host_id: " + host.host_id)
   if host.gcd_device_id:
@@ -1662,7 +1611,7 @@
           relaunch_times.append(x_server_inhibitor.earliest_relaunch_time)
         else:
           logging.info("Launching X server and X session.")
-          desktop.launch_session(options.child_process, options.args)
+          desktop.launch_session(options.args)
           x_server_inhibitor.record_started(MINIMUM_PROCESS_LIFETIME,
                                             backoff_time)
           allow_relaunch_self = True
diff --git a/remoting/host/linux/remoting_user_session.cc b/remoting/host/linux/remoting_user_session.cc
index 3b49d76..eea4e65 100644
--- a/remoting/host/linux/remoting_user_session.cc
+++ b/remoting/host/linux/remoting_user_session.cc
@@ -78,7 +78,8 @@
     "Remote Desktop, please install the app from the Chrome Web Store:\n"
     "https://chrome.google.com/remotedesktop\n";
 
-// A list of variable to pass through to the child environment.
+// A list of variable to pass through to the child environment. Should be kept
+// in sync with remoting_user_session_wrapper.sh for testing.
 const char* const kPassthroughVariables[] = {
     "GOOGLE_CLIENT_ID_REMOTING", "GOOGLE_CLIENT_ID_REMOTING_HOST",
     "GOOGLE_CLIENT_SECRET_REMOTING", "GOOGLE_CLIENT_SECRET_REMOTING_HOST",
@@ -624,7 +625,16 @@
 // cannot be created, the parent will immediately exit. When executed by a
 // user, the parent process will drop privileges and wait for the host to
 // start, relaying any start-up messages to stdout.
+//
+// TODO(lambroslambrou): Having stdout/stderr redirected to a log file is not
+// ideal - it could create a filesystem DoS if the daemon or a child process
+// were to write excessive amounts to stdout/stderr.  Ideally, stdout/stderr
+// should be redirected to a pipe or socket, and a process at the other end
+// should consume the data and write it to a logging facility which can do
+// data-capping or log-rotation. The 'logger' command-line utility could be
+// used for this, but it might cause too much syslog spam.
 void Daemonize() {
+  // Open file descriptors before forking so errors can be reported.
   LogFile log_file = OpenLogFile();
   int devnull_fd = open("/dev/null", O_RDONLY);
   PCHECK(devnull_fd != -1) << "Failed to open /dev/null";
diff --git a/remoting/host/linux/remoting_user_session_wrapper.sh b/remoting/host/linux/remoting_user_session_wrapper.sh
new file mode 100755
index 0000000..99f0059
--- /dev/null
+++ b/remoting/host/linux/remoting_user_session_wrapper.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+# 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.
+
+# This is a simple wrapper script around the remoting_user_session binary,
+# intended only for development use. It is copied into a build
+# subdirectory as
+# $CHROMIUM_OUTPUT_DIR/remoting/user-session
+# and runs the remoting_user_session binary from the same directory via sudo to
+# allow testing without making remoting_user_session setuid root. The
+# linux_me2me_host.py script is also copied into the remoting/ build directory,
+# so it finds this user-session wrapper script in the same directory.
+
+REMOTING_DIR="$(realpath "$(dirname "$0")")"
+
+if [ -n "$DISPLAY" ]; then
+  ELEVATE=pkexec
+else
+  ELEVATE=sudo
+fi
+
+PASSTHROUGH_VARIABLES=(
+    "GOOGLE_CLIENT_ID_REMOTING" "GOOGLE_CLIENT_ID_REMOTING_HOST"
+    "GOOGLE_CLIENT_SECRET_REMOTING" "GOOGLE_CLIENT_SECRET_REMOTING_HOST"
+    "CHROME_REMOTE_DESKTOP_HOST_EXTRA_PARAMS")
+
+ENVIRONMENT=("USER=${USER}" "LOGNAME=${LOGNAME}")
+for var in "${PASSTHROUGH_VARIABLES[@]}"; do
+  if [ -n "${!var+x}" ]; then
+    ENVIRONMENT+=("${var}=${!var}")
+  fi
+done
+
+# Simulate setuid
+exec "$ELEVATE" python -c "
+import os
+import sys
+
+os.chdir(sys.argv[1])
+os.setreuid($(id -u), -1)
+os.execvp('/usr/bin/env', ['/usr/bin/env'] + sys.argv[2:])" \
+"${REMOTING_DIR}" "${ENVIRONMENT[@]}" \
+"${REMOTING_DIR}/remoting_user_session" "$@"
diff --git a/remoting/remoting_locales.gni b/remoting/remoting_locales.gni
index 42e949d..2a2c6c1 100644
--- a/remoting/remoting_locales.gni
+++ b/remoting/remoting_locales.gni
@@ -83,7 +83,8 @@
   "zh_TW",
 ]
 
-if (!is_official_build) {
+# The fake-bidi locale isn't accepted by the app store.
+if (!is_ios || !is_official_build) {
   remoting_locales += [ "fake-bidi" ]
   remoting_locales_with_underscores += [ "fake_bidi" ]
 }
diff --git a/remoting/resources/remoting_strings.grd b/remoting/resources/remoting_strings.grd
index 2a6f3c77..d476e3f 100644
--- a/remoting/resources/remoting_strings.grd
+++ b/remoting/resources/remoting_strings.grd
@@ -31,8 +31,8 @@
     <output filename="remoting/resources/es.pak" lang="es" type="data_package"/>
     <output filename="remoting/resources/et.pak" lang="et" type="data_package"/>
     <output filename="remoting/resources/fa.pak" lang="fa" type="data_package"/>
-    <if expr="not _official_build">
-      <!-- We don't need to generate the fake-bidi locale for official builds. -->
+    <if expr="not is_ios or not _official_build">
+      <!-- The fake-bidi locale isn't accepted by the app store. -->
       <output filename="remoting/resources/fake-bidi.pak" lang="fake-bidi" type="data_package"/>
     </if>
     <output filename="remoting/resources/fi.pak" lang="fi" type="data_package"/>
@@ -90,8 +90,8 @@
     <output filename="remoting/webapp/_locales/da/messages.json" lang="da" type="chrome_messages_json"/>
     <output filename="remoting/webapp/_locales/de/messages.json" lang="de" type="chrome_messages_json"/>
     <output filename="remoting/webapp/_locales/fa/messages.json" lang="fa" type="chrome_messages_json"/>
-    <if expr="not _official_build">
-      <!-- We don't need to generate the fake-bidi locale for official builds. -->
+    <if expr="not is_ios or not _official_build">
+      <!-- The fake-bidi locale isn't accepted by the app store. -->
       <output filename="remoting/webapp/_locales/fake_bidi/messages.json" lang="fake-bidi" type="chrome_messages_json"/>
     </if>
     <output filename="remoting/webapp/_locales/el/messages.json" lang="el" type="chrome_messages_json"/>
diff --git a/sandbox/win/src/lpc_policy_test.cc b/sandbox/win/src/lpc_policy_test.cc
index f7cc3d4..c44a5879 100644
--- a/sandbox/win/src/lpc_policy_test.cc
+++ b/sandbox/win/src/lpc_policy_test.cc
@@ -177,17 +177,16 @@
   // in Chrome, the heaps tend to be created at startup only.
   std::unique_ptr<HANDLE[]> all_heaps(new HANDLE[number_of_heaps]);
   if (::GetProcessHeaps(number_of_heaps, all_heaps.get()) != number_of_heaps)
-    return SBOX_TEST_FAILED;
+    return SBOX_TEST_FIRST_ERROR;
 
   for (size_t i = 0; i < number_of_heaps; ++i) {
     HANDLE handle = all_heaps[i];
-    if (!HeapLock(handle)) {
-      return SBOX_TEST_FAILED;
-    }
-
-    if (!HeapUnlock(handle)) {
-      return SBOX_TEST_FAILED;
-    }
+    ULONG HeapInformation;
+    BOOL result =
+        HeapQueryInformation(handle, HeapCompatibilityInformation,
+                             &HeapInformation, sizeof(HeapInformation), NULL);
+    if (!result)
+      return SBOX_TEST_SECOND_ERROR;
   }
   return SBOX_TEST_SUCCEEDED;
 }
diff --git a/services/device/generic_sensor/generic_sensor_service_unittest.cc b/services/device/generic_sensor/generic_sensor_service_unittest.cc
index 6966a1d..b80b737 100644
--- a/services/device/generic_sensor/generic_sensor_service_unittest.cc
+++ b/services/device/generic_sensor/generic_sensor_service_unittest.cc
@@ -261,7 +261,13 @@
 }
 
 // Tests GetDefaultConfiguration.
-TEST_F(GenericSensorServiceTest, GetDefaultConfigurationTest) {
+// Failing on Android Tests (dbg); see https://crbug.com/761742.
+#if defined(OS_ANDROID)
+#define MAYBE_GetDefaultConfigurationTest DISABLED_GetDefaultConfigurationTest
+#else
+#define MAYBE_GetDefaultConfigurationTest GetDefaultConfigurationTest
+#endif
+TEST_F(GenericSensorServiceTest, MAYBE_GetDefaultConfigurationTest) {
   mojom::SensorPtr sensor;
   auto client = base::MakeUnique<TestSensorClient>(SensorType::ACCELEROMETER);
   base::RunLoop run_loop;
@@ -307,7 +313,13 @@
 
 // Tests adding an invalid configuation, the max allowed frequency is 50.0 in
 // the mocked SensorImpl, while we add one with 60.0.
-TEST_F(GenericSensorServiceTest, InvalidAddConfigurationTest) {
+// Failing on Android Tests (dbg); see https://crbug.com/761742.
+#if defined(OS_ANDROID)
+#define MAYBE_InvalidAddConfigurationTest DISABLED_InvalidAddConfigurationTest
+#else
+#define MAYBE_InvalidAddConfigurationTest InvalidAddConfigurationTest
+#endif
+TEST_F(GenericSensorServiceTest, MAYBE_InvalidAddConfigurationTest) {
   mojom::SensorPtr sensor;
   auto client =
       base::MakeUnique<TestSensorClient>(SensorType::LINEAR_ACCELERATION);
@@ -374,7 +386,14 @@
 
 // Tests adding more than one clients. If mojo connection is broken on one
 // client, other clients should not be affected.
-TEST_F(GenericSensorServiceTest, ClientMojoConnectionBrokenTest) {
+// Failing on Android Tests (dbg); see https://crbug.com/761742.
+#if defined(OS_ANDROID)
+#define MAYBE_ClientMojoConnectionBrokenTest \
+  DISABLED_ClientMojoConnectionBrokenTest
+#else
+#define MAYBE_ClientMojoConnectionBrokenTest ClientMojoConnectionBrokenTest
+#endif
+TEST_F(GenericSensorServiceTest, MAYBE_ClientMojoConnectionBrokenTest) {
   mojom::SensorPtr sensor_1;
   auto client_1 = base::MakeUnique<TestSensorClient>(SensorType::AMBIENT_LIGHT);
   sensor_provider_->GetSensor(SensorType::AMBIENT_LIGHT,
@@ -478,7 +497,13 @@
 // AddConfiguration(). In this way we make sure it won't be missed by the
 // early quit of main thread (when there is an unexpected notification by
 // SensorReadingChanged()).
-TEST_F(GenericSensorServiceTest, SuspendTest) {
+// Failing on Android Tests (dbg); see https://crbug.com/761742.
+#if defined(OS_ANDROID)
+#define MAYBE_SuspendTest DISABLED_SuspendTest
+#else
+#define MAYBE_SuspendTest SuspendTest
+#endif
+TEST_F(GenericSensorServiceTest, MAYBE_SuspendTest) {
   mojom::SensorPtr sensor;
   auto client = base::MakeUnique<TestSensorClient>(SensorType::AMBIENT_LIGHT);
   sensor_provider_->GetSensor(SensorType::AMBIENT_LIGHT,
@@ -560,7 +585,15 @@
 
 // Test suspend when there are more than one client. The suspended client won't
 // receive SensorReadingChanged() notification.
-TEST_F(GenericSensorServiceTest, MultipleClientsSuspendAndResumeTest) {
+// Failing on Android Tests (dbg); see https://crbug.com/761742.
+#if defined(OS_ANDROID)
+#define MAYBE_MultipleClientsSuspendAndResumeTest \
+  DISABLED_MultipleClientsSuspendAndResumeTest
+#else
+#define MAYBE_MultipleClientsSuspendAndResumeTest \
+  MultipleClientsSuspendAndResumeTest
+#endif
+TEST_F(GenericSensorServiceTest, MAYBE_MultipleClientsSuspendAndResumeTest) {
   mojom::SensorPtr sensor_1;
   auto client_1 = base::MakeUnique<TestSensorClient>(SensorType::AMBIENT_LIGHT);
   sensor_provider_->GetSensor(SensorType::AMBIENT_LIGHT,
diff --git a/services/preferences/pref_service_factory_unittest.cc b/services/preferences/pref_service_factory_unittest.cc
index d144cd28..17cd934 100644
--- a/services/preferences/pref_service_factory_unittest.cc
+++ b/services/preferences/pref_service_factory_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/sequenced_worker_pool_owner.h"
 #include "components/prefs/in_memory_pref_store.h"
+#include "components/prefs/overlay_user_pref_store.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -20,6 +21,7 @@
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/preferences/pref_store_impl.h"
 #include "services/preferences/public/cpp/dictionary_value_update.h"
+#include "services/preferences/public/cpp/in_process_service_factory.h"
 #include "services/preferences/public/cpp/pref_service_main.h"
 #include "services/preferences/public/cpp/scoped_pref_update.h"
 #include "services/preferences/public/interfaces/preferences.mojom.h"
@@ -36,16 +38,11 @@
  public:
   ServiceTestClient(
       service_manager::test::ServiceTest* test,
-      scoped_refptr<WriteablePrefStore> above_user_prefs_pref_store,
-      scoped_refptr<WriteablePrefStore> below_user_prefs_pref_store,
-      scoped_refptr<PersistentPrefStore> user_prefs,
-      scoped_refptr<PrefRegistry> pref_registry,
+      base::Callback<std::unique_ptr<service_manager::Service>()>
+          service_factory,
       base::OnceCallback<void(service_manager::Connector*)> connector_callback)
       : service_manager::test::ServiceTestClient(test),
-        above_user_prefs_pref_store_(std::move(above_user_prefs_pref_store)),
-        below_user_prefs_pref_store_(std::move(below_user_prefs_pref_store)),
-        user_prefs_(std::move(user_prefs)),
-        pref_registry_(std::move(pref_registry)),
+        service_factory_(std::move(service_factory)),
         connector_callback_(std::move(connector_callback)) {
     registry_.AddInterface<service_manager::mojom::ServiceFactory>(
         base::Bind(&ServiceTestClient::Create, base::Unretained(this)));
@@ -62,12 +59,7 @@
                      const std::string& name) override {
     if (name == prefs::mojom::kServiceName) {
       pref_service_context_.reset(new service_manager::ServiceContext(
-          CreatePrefService(
-              nullptr, nullptr, nullptr, above_user_prefs_pref_store_.get(),
-              user_prefs_.get(), nullptr, below_user_prefs_pref_store_.get(),
-              pref_registry_.get())
-              .first,
-          std::move(request)));
+          service_factory_.Run(), std::move(request)));
     } else if (name == "prefs_unittest_helper") {
       test_helper_service_context_ =
           base::MakeUnique<service_manager::ServiceContext>(
@@ -85,10 +77,7 @@
   service_manager::BinderRegistry registry_;
   mojo::BindingSet<service_manager::mojom::ServiceFactory>
       service_factory_bindings_;
-  scoped_refptr<WriteablePrefStore> above_user_prefs_pref_store_;
-  scoped_refptr<WriteablePrefStore> below_user_prefs_pref_store_;
-  scoped_refptr<PersistentPrefStore> user_prefs_;
-  scoped_refptr<PrefRegistry> pref_registry_;
+  base::Callback<std::unique_ptr<service_manager::Service>()> service_factory_;
   std::unique_ptr<service_manager::ServiceContext> pref_service_context_;
   std::unique_ptr<service_manager::ServiceContext> test_helper_service_context_;
   base::OnceCallback<void(service_manager::Connector*)> connector_callback_;
@@ -110,12 +99,17 @@
   void SetUp() override {
     above_user_prefs_pref_store_ = new ValueMapPrefStore();
     below_user_prefs_pref_store_ = new ValueMapPrefStore();
-    user_prefs_ = new InMemoryPrefStore();
+    auto user_prefs = base::MakeRefCounted<InMemoryPrefStore>();
     PrefServiceFactory factory;
-    factory.set_user_prefs(user_prefs_);
+    service_factory_ = base::MakeUnique<InProcessPrefServiceFactory>();
+    auto delegate = service_factory_->CreateDelegate();
+    auto pref_registry = GetInitialPrefRegistry();
+    delegate->InitPrefRegistry(pref_registry.get());
+    factory.set_user_prefs(user_prefs);
     factory.set_recommended_prefs(below_user_prefs_pref_store_);
     factory.set_command_line_prefs(above_user_prefs_pref_store_);
-    pref_service_ = factory.Create(GetInitialPrefRegistry().get());
+    CustomizePrefDelegateAndFactory(delegate.get(), &factory);
+    pref_service_ = factory.Create(pref_registry.get(), std::move(delegate));
 
     base::RunLoop run_loop;
     connector_callback_ =
@@ -127,6 +121,10 @@
     run_loop.Run();
   }
 
+  virtual void CustomizePrefDelegateAndFactory(
+      PrefValueStore::Delegate* delegate,
+      PrefServiceFactory* factory) {}
+
   service_manager::Connector* other_client_connector() {
     return other_client_connector_;
   }
@@ -134,8 +132,7 @@
   // service_manager::test::ServiceTest:
   std::unique_ptr<service_manager::Service> CreateService() override {
     return base::MakeUnique<ServiceTestClient>(
-        this, above_user_prefs_pref_store_, below_user_prefs_pref_store_,
-        user_prefs_, GetInitialPrefRegistry().get(),
+        this, service_factory_->CreatePrefServiceFactory(),
         std::move(connector_callback_));
   }
 
@@ -243,11 +240,11 @@
   base::ScopedTempDir profile_dir_;
   scoped_refptr<WriteablePrefStore> above_user_prefs_pref_store_;
   scoped_refptr<WriteablePrefStore> below_user_prefs_pref_store_;
-  scoped_refptr<PersistentPrefStore> user_prefs_;
   scoped_refptr<PrefRegistrySimple> pref_registry_;
   std::unique_ptr<PrefService> pref_service_;
   service_manager::Connector* other_client_connector_ = nullptr;
   base::OnceCallback<void(service_manager::Connector*)> connector_callback_;
+  std::unique_ptr<InProcessPrefServiceFactory> service_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(PrefServiceFactoryTest);
 };
@@ -605,5 +602,64 @@
   WaitForPrefChange(pref_service2.get(), kKey);
 }
 
+class IncognitoPrefServiceFactoryTest
+    : public PrefServiceFactoryTest,
+      public testing::WithParamInterface<bool> {
+ protected:
+  void CustomizePrefDelegateAndFactory(PrefValueStore::Delegate* delegate,
+                                       PrefServiceFactory* factory) override {
+    scoped_refptr<PersistentPrefStore> overlay =
+        base::MakeRefCounted<InMemoryPrefStore>();
+    scoped_refptr<PersistentPrefStore> underlay =
+        base::MakeRefCounted<InMemoryPrefStore>();
+    const auto overlay_pref_names = GetOverlayPrefNames();
+    delegate->InitIncognitoUserPrefs(overlay, underlay, overlay_pref_names);
+    auto overlay_pref_store = base::MakeRefCounted<OverlayUserPrefStore>(
+        overlay.get(), underlay.get());
+    for (auto* overlay_pref_name : overlay_pref_names)
+      overlay_pref_store->RegisterOverlayPref(overlay_pref_name);
+    factory->set_user_prefs(std::move(overlay_pref_store));
+  }
+
+  std::vector<const char*> GetOverlayPrefNames() {
+    if (GetParam())
+      return {kInitialKey, kOtherInitialKey, kKey};
+    return {};
+  }
+};
+
+// Check that updates in one client eventually propagates to the other.
+TEST_P(IncognitoPrefServiceFactoryTest, InternalAndExternalClients) {
+  auto pref_service2 = Create();
+
+  EXPECT_EQ(kInitialValue, pref_service()->GetInteger(kInitialKey));
+  EXPECT_EQ(kInitialValue, pref_service2->GetInteger(kInitialKey));
+  EXPECT_EQ(kInitialValue, pref_service()->GetInteger(kOtherInitialKey));
+  EXPECT_EQ(kInitialValue, pref_service2->GetInteger(kOtherInitialKey));
+  pref_service()->SetInteger(kInitialKey, kUpdatedValue);
+  WaitForPrefChange(pref_service2.get(), kInitialKey);
+  EXPECT_EQ(kUpdatedValue, pref_service2->GetInteger(kInitialKey));
+
+  pref_service2->SetInteger(kOtherInitialKey, kUpdatedValue);
+  WaitForPrefChange(pref_service(), kOtherInitialKey);
+  EXPECT_EQ(kUpdatedValue, pref_service()->GetInteger(kOtherInitialKey));
+}
+
+// Check that updates in one client eventually propagates to the other.
+TEST_P(IncognitoPrefServiceFactoryTest, MultipleClients) {
+  auto pref_service = Create();
+  auto pref_service2 = CreateForeign();
+
+  EXPECT_EQ(kInitialValue, pref_service->GetInteger(kKey));
+  EXPECT_EQ(kInitialValue, pref_service2->GetInteger(kKey));
+  pref_service->SetInteger(kKey, kUpdatedValue);
+  WaitForPrefChange(pref_service2.get(), kKey);
+  EXPECT_EQ(kUpdatedValue, pref_service2->GetInteger(kKey));
+}
+
+INSTANTIATE_TEST_CASE_P(UnderlayOrOverlayPref,
+                        IncognitoPrefServiceFactoryTest,
+                        testing::Bool());
+
 }  // namespace
 }  // namespace prefs
diff --git a/services/preferences/pref_store_manager_impl.cc b/services/preferences/pref_store_manager_impl.cc
index 1e24c372..a7110da1 100644
--- a/services/preferences/pref_store_manager_impl.cc
+++ b/services/preferences/pref_store_manager_impl.cc
@@ -44,7 +44,8 @@
     if (owner_->incognito_persistent_pref_store_underlay_) {
       if (owner_->incognito_persistent_pref_store_underlay_->initialized()) {
         connection->ProvideIncognitoPersistentPrefStoreUnderlay(
-            owner_->incognito_persistent_pref_store_underlay_.get());
+            owner_->incognito_persistent_pref_store_underlay_.get(),
+            owner_->overlay_pref_names_);
       } else {
         owner_->pending_persistent_incognito_connections_.push_back(connection);
       }
@@ -65,7 +66,8 @@
     PersistentPrefStore* user_prefs,
     PersistentPrefStore* incognito_user_prefs_underlay,
     PrefStore* recommended_prefs,
-    PrefRegistry* pref_registry)
+    PrefRegistry* pref_registry,
+    std::vector<const char*> overlay_pref_names)
     : shared_pref_registry_(base::MakeUnique<SharedPrefRegistry>(
           make_scoped_refptr(pref_registry))),
       weak_factory_(this) {
@@ -80,10 +82,13 @@
   if (incognito_user_prefs_underlay) {
     incognito_persistent_pref_store_underlay_ =
         base::MakeUnique<PersistentPrefStoreImpl>(
-            make_scoped_refptr(user_prefs),
+            make_scoped_refptr(incognito_user_prefs_underlay),
             base::BindOnce(
                 &PrefStoreManagerImpl::OnIncognitoPersistentPrefStoreReady,
                 base::Unretained(this)));
+    overlay_pref_names_ = std::move(overlay_pref_names);
+  } else {
+    DCHECK(overlay_pref_names.empty());
   }
   RegisterPrefStore(PrefValueStore::MANAGED_STORE, managed_prefs);
   RegisterPrefStore(PrefValueStore::SUPERVISED_USER_STORE,
@@ -129,7 +134,7 @@
   DVLOG(1) << "Incognito PersistentPrefStore ready";
   for (const auto& connection : pending_persistent_connections_)
     connection->ProvideIncognitoPersistentPrefStoreUnderlay(
-        incognito_persistent_pref_store_underlay_.get());
+        incognito_persistent_pref_store_underlay_.get(), overlay_pref_names_);
   pending_persistent_incognito_connections_.clear();
 }
 
diff --git a/services/preferences/pref_store_manager_impl.h b/services/preferences/pref_store_manager_impl.h
index fa5ea19b..a297a970 100644
--- a/services/preferences/pref_store_manager_impl.h
+++ b/services/preferences/pref_store_manager_impl.h
@@ -45,7 +45,8 @@
                        PersistentPrefStore* user_prefs,
                        PersistentPrefStore* incognito_user_prefs_underlay,
                        PrefStore* recommended_prefs,
-                       PrefRegistry* pref_registry);
+                       PrefRegistry* pref_registry,
+                       std::vector<const char*> overlay_pref_names);
   ~PrefStoreManagerImpl() override;
 
   base::OnceClosure ShutDownClosure();
@@ -79,6 +80,7 @@
   std::unique_ptr<PersistentPrefStoreImpl> persistent_pref_store_;
   std::unique_ptr<PersistentPrefStoreImpl>
       incognito_persistent_pref_store_underlay_;
+  std::vector<const char*> overlay_pref_names_;
 
   const std::unique_ptr<SharedPrefRegistry> shared_pref_registry_;
 
diff --git a/services/preferences/public/cpp/in_process_service_factory.cc b/services/preferences/public/cpp/in_process_service_factory.cc
index 4127d29d..f3fe807 100644
--- a/services/preferences/public/cpp/in_process_service_factory.cc
+++ b/services/preferences/public/cpp/in_process_service_factory.cc
@@ -48,15 +48,21 @@
         make_scoped_refptr(supervised_user_prefs);
     factory_->extension_prefs_ = make_scoped_refptr(extension_prefs);
     factory_->command_line_prefs_ = make_scoped_refptr(command_line_prefs);
-    factory_->user_prefs_ =
-        make_scoped_refptr(static_cast<PersistentPrefStore*>(user_prefs));
+    if (!factory_->user_prefs_) {
+      factory_->user_prefs_ =
+          make_scoped_refptr(static_cast<PersistentPrefStore*>(user_prefs));
+    }
     factory_->recommended_prefs_ = make_scoped_refptr(recommended_prefs);
   }
 
-  void InitIncognitoUnderlay(
-      PersistentPrefStore* incognito_user_prefs_underlay) override {
+  void InitIncognitoUserPrefs(
+      scoped_refptr<PersistentPrefStore> incognito_user_prefs_overlay,
+      scoped_refptr<PersistentPrefStore> incognito_user_prefs_underlay,
+      const std::vector<const char*>& overlay_pref_names) override {
+    factory_->user_prefs_ = std::move(incognito_user_prefs_overlay);
     factory_->incognito_user_prefs_underlay_ =
-        make_scoped_refptr(incognito_user_prefs_underlay);
+        std::move(incognito_user_prefs_underlay);
+    factory_->overlay_pref_names_ = overlay_pref_names;
   }
 
   void InitPrefRegistry(PrefRegistry* pref_registry) override {
@@ -99,7 +105,7 @@
       managed_prefs_.get(), supervised_user_prefs_.get(),
       extension_prefs_.get(), command_line_prefs_.get(), user_prefs_.get(),
       incognito_user_prefs_underlay_.get(), recommended_prefs_.get(),
-      pref_registry_.get());
+      pref_registry_.get(), std::move(overlay_pref_names_));
   quit_closure_ = std::move(result.second);
   return std::move(result.first);
 }
diff --git a/services/preferences/public/cpp/in_process_service_factory.h b/services/preferences/public/cpp/in_process_service_factory.h
index 10bea7d..16b81fd3 100644
--- a/services/preferences/public/cpp/in_process_service_factory.h
+++ b/services/preferences/public/cpp/in_process_service_factory.h
@@ -43,6 +43,7 @@
   scoped_refptr<PersistentPrefStore> incognito_user_prefs_underlay_;
   scoped_refptr<PrefStore> recommended_prefs_;
   scoped_refptr<PrefRegistry> pref_registry_;
+  std::vector<const char*> overlay_pref_names_;
 
   base::OnceClosure quit_closure_;
 
diff --git a/services/preferences/public/cpp/pref_service_factory.cc b/services/preferences/public/cpp/pref_service_factory.cc
index c83795c..108d068 100644
--- a/services/preferences/public/cpp/pref_service_factory.cc
+++ b/services/preferences/public/cpp/pref_service_factory.cc
@@ -76,7 +76,7 @@
     scoped_refptr<PrefRegistry> pref_registry,
     ConnectCallback callback,
     mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
-    mojom::PersistentPrefStoreConnectionPtr incognito_connection,
+    mojom::IncognitoPersistentPrefStoreConnectionPtr incognito_connection,
     std::vector<mojom::PrefRegistrationPtr> defaults,
     std::unordered_map<PrefValueStore::PrefStoreType,
                        mojom::PrefStoreConnectionPtr> connections) {
@@ -94,22 +94,27 @@
   scoped_refptr<PersistentPrefStore> persistent_pref_store(
       new PersistentPrefStoreClient(
           std::move(persistent_pref_store_connection)));
-  // If in incognito mode, |persistent_pref_store| above will be a connection to
-  // an in-memory pref store and |incognito_connection| will refer to the
-  // underlying profile's user pref store.
-  scoped_refptr<PersistentPrefStore> user_pref_store =
-      incognito_connection
-          ? new OverlayUserPrefStore(
-                persistent_pref_store.get(),
-                new PersistentPrefStoreClient(std::move(incognito_connection)))
-          : persistent_pref_store;
+  if (incognito_connection) {
+    // If in incognito mode, |persistent_pref_store| above will be a connection
+    // to an in-memory pref store and |incognito_connection| will refer to the
+    // underlying profile's user pref store.
+    auto overlay_pref_store = base::MakeRefCounted<OverlayUserPrefStore>(
+        persistent_pref_store.get(),
+        new PersistentPrefStoreClient(
+            std::move(incognito_connection->pref_store_connection)));
+    for (const auto& overlay_pref_name :
+         incognito_connection->overlay_pref_names) {
+      overlay_pref_store->RegisterOverlayPref(overlay_pref_name);
+    }
+    persistent_pref_store = overlay_pref_store;
+  }
   PrefNotifierImpl* pref_notifier = new PrefNotifierImpl();
   auto* pref_value_store = new PrefValueStore(
       managed_prefs.get(), supervised_user_prefs.get(), extension_prefs.get(),
-      command_line_prefs.get(), user_pref_store.get(), recommended_prefs.get(),
-      pref_registry->defaults().get(), pref_notifier);
+      command_line_prefs.get(), persistent_pref_store.get(),
+      recommended_prefs.get(), pref_registry->defaults().get(), pref_notifier);
   auto pref_service = base::MakeUnique<PrefService>(
-      pref_notifier, pref_value_store, user_pref_store.get(),
+      pref_notifier, pref_value_store, persistent_pref_store.get(),
       pref_registry.get(), base::Bind(&DoNothingHandleReadError), true);
   switch (pref_service->GetAllPrefStoresInitializationStatus()) {
     case PrefService::INITIALIZATION_STATUS_WAITING:
diff --git a/services/preferences/public/cpp/pref_service_main.cc b/services/preferences/public/cpp/pref_service_main.cc
index c481b61..daccc1d 100644
--- a/services/preferences/public/cpp/pref_service_main.cc
+++ b/services/preferences/public/cpp/pref_service_main.cc
@@ -18,11 +18,12 @@
                   PersistentPrefStore* user_prefs,
                   PersistentPrefStore* incognito_user_prefs_underlay,
                   PrefStore* recommended_prefs,
-                  PrefRegistry* pref_registry) {
+                  PrefRegistry* pref_registry,
+                  std::vector<const char*> overlay_pref_names) {
   auto service = base::MakeUnique<PrefStoreManagerImpl>(
       managed_prefs, supervised_user_prefs, extension_prefs, command_line_prefs,
       user_prefs, incognito_user_prefs_underlay, recommended_prefs,
-      pref_registry);
+      pref_registry, std::move(overlay_pref_names));
   auto quit_closure = service->ShutDownClosure();
   return std::make_pair(std::move(service), std::move(quit_closure));
 }
diff --git a/services/preferences/public/cpp/pref_service_main.h b/services/preferences/public/cpp/pref_service_main.h
index e0e50bf..5a615b5 100644
--- a/services/preferences/public/cpp/pref_service_main.h
+++ b/services/preferences/public/cpp/pref_service_main.h
@@ -29,7 +29,8 @@
                   PersistentPrefStore* user_prefs,
                   PersistentPrefStore* incognito_user_prefs_underlay,
                   PrefStore* recommended_prefs,
-                  PrefRegistry* pref_registry);
+                  PrefRegistry* pref_registry,
+                  std::vector<const char*> overlay_pref_names);
 
 }  // namespace prefs
 
diff --git a/services/preferences/public/interfaces/preferences.mojom b/services/preferences/public/interfaces/preferences.mojom
index 3c1d7e8..ba576a9 100644
--- a/services/preferences/public/interfaces/preferences.mojom
+++ b/services/preferences/public/interfaces/preferences.mojom
@@ -77,6 +77,11 @@
   bool read_only;
 };
 
+struct IncognitoPersistentPrefStoreConnection {
+  PersistentPrefStoreConnection pref_store_connection;
+  array<string> overlay_pref_names;
+};
+
 // Allows connections to pref stores registered with |PrefStoreRegistry|.
 interface PrefStoreConnector {
   // Connect to all registered pref stores, retrieving the current values of all
@@ -90,7 +95,7 @@
   // queue and connect once |Init| has been called.
   Connect(PrefRegistry pref_registry) =>
       (PersistentPrefStoreConnection connection,
-       PersistentPrefStoreConnection? underlay,
+       IncognitoPersistentPrefStoreConnection? underlay,
        array<PrefRegistration> remote_defaults,
        map<PrefStoreType, PrefStoreConnection> connections);
 };
diff --git a/services/preferences/scoped_pref_connection_builder.cc b/services/preferences/scoped_pref_connection_builder.cc
index 5ad903c5..f9d9267 100644
--- a/services/preferences/scoped_pref_connection_builder.cc
+++ b/services/preferences/scoped_pref_connection_builder.cc
@@ -41,10 +41,18 @@
 }
 
 void ScopedPrefConnectionBuilder::ProvideIncognitoPersistentPrefStoreUnderlay(
-    PersistentPrefStoreImpl* persistent_pref_store) {
-  incognito_connection_ = persistent_pref_store->CreateConnection(
-      PersistentPrefStoreImpl::ObservedPrefs(observed_prefs_.begin(),
-                                             observed_prefs_.end()));
+    PersistentPrefStoreImpl* persistent_pref_store,
+    const std::vector<const char*>& overlay_pref_names) {
+  PersistentPrefStoreImpl::ObservedPrefs observed_prefs(observed_prefs_.begin(),
+                                                        observed_prefs_.end());
+  std::vector<std::string> filtered_overlay_pref_names;
+  for (const char* overlay_pref_name : overlay_pref_names) {
+    if (base::ContainsKey(observed_prefs, overlay_pref_name))
+      filtered_overlay_pref_names.emplace_back(overlay_pref_name);
+  }
+  incognito_connection_ = mojom::IncognitoPersistentPrefStoreConnection::New(
+      persistent_pref_store->CreateConnection(std::move(observed_prefs)),
+      std::move(filtered_overlay_pref_names));
 }
 
 void ScopedPrefConnectionBuilder::ProvideDefaults(
diff --git a/services/preferences/scoped_pref_connection_builder.h b/services/preferences/scoped_pref_connection_builder.h
index 270b31bba..e45e657 100644
--- a/services/preferences/scoped_pref_connection_builder.h
+++ b/services/preferences/scoped_pref_connection_builder.h
@@ -38,7 +38,8 @@
       PersistentPrefStoreImpl* persistent_pref_store);
 
   void ProvideIncognitoPersistentPrefStoreUnderlay(
-      PersistentPrefStoreImpl* persistent_pref_store);
+      PersistentPrefStoreImpl* persistent_pref_store,
+      const std::vector<const char*>& overlay_pref_names);
 
   void ProvideDefaults(std::vector<mojom::PrefRegistrationPtr> defaults);
 
@@ -56,7 +57,7 @@
   std::vector<mojom::PrefRegistrationPtr> defaults_;
 
   mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection_;
-  mojom::PersistentPrefStoreConnectionPtr incognito_connection_;
+  mojom::IncognitoPersistentPrefStoreConnectionPtr incognito_connection_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedPrefConnectionBuilder);
 };
diff --git a/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc b/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc
index 17f9a3d..af652887 100644
--- a/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc
+++ b/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc
@@ -4,58 +4,11 @@
 
 #include "services/video_capture/public/cpp/receiver_media_to_mojo_adapter.h"
 
-#include "media/capture/video/shared_memory_buffer_tracker.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "media/capture/video/shared_memory_handle_provider.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 
 namespace {
 
-class MojoBufferHandleProvider
-    : public media::VideoCaptureDevice::Client::Buffer::HandleProvider {
- public:
-  MojoBufferHandleProvider(mojo::ScopedSharedBufferHandle buffer_handle)
-      : buffer_handle_(std::move(buffer_handle)) {}
-
-  // Implementation of Buffer::HandleProvider:
-  mojo::ScopedSharedBufferHandle GetHandleForInterProcessTransit() override {
-    return buffer_handle_->Clone();
-  }
-  base::SharedMemoryHandle GetNonOwnedSharedMemoryHandleForLegacyIPC()
-      override {
-    LazyUnwrapHandleAndMapMemory();
-    return shared_memory_->handle();
-  }
-  std::unique_ptr<media::VideoCaptureBufferHandle> GetHandleForInProcessAccess()
-      override {
-    LazyUnwrapHandleAndMapMemory();
-    return base::MakeUnique<media::SharedMemoryBufferHandle>(
-        &shared_memory_.value(), memory_size_);
-  }
-
- private:
-  void LazyUnwrapHandleAndMapMemory() {
-    if (shared_memory_.has_value())
-      return;  // already done before
-
-    base::SharedMemoryHandle memory_handle;
-    const MojoResult result =
-        mojo::UnwrapSharedMemoryHandle(buffer_handle_->Clone(), &memory_handle,
-                                       &memory_size_, &read_only_flag_);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-    DCHECK_GT(memory_size_, 0u);
-
-    shared_memory_.emplace(memory_handle, read_only_flag_);
-    if (!shared_memory_->Map(memory_size_)) {
-      DLOG(ERROR) << "LazyUnwrapHandleAndMapMemory: Map failed.";
-    }
-  }
-
-  mojo::ScopedSharedBufferHandle buffer_handle_;
-  base::Optional<base::SharedMemory> shared_memory_;
-  size_t memory_size_ = 0;
-  bool read_only_flag_ = false;
-};
-
 class ScopedAccessPermissionMojoToMediaAdapter
     : public media::VideoCaptureDevice::Client::Buffer::ScopedAccessPermission {
  public:
@@ -80,9 +33,9 @@
 void ReceiverMediaToMojoAdapter::OnNewBufferHandle(
     int32_t buffer_id,
     mojo::ScopedSharedBufferHandle buffer_handle) {
-  receiver_->OnNewBufferHandle(
-      buffer_id,
-      base::MakeUnique<MojoBufferHandleProvider>(std::move(buffer_handle)));
+  auto provider = std::make_unique<media::SharedMemoryHandleProvider>();
+  CHECK(provider->InitFromMojoHandle(std::move(buffer_handle)));
+  receiver_->OnNewBufferHandle(buffer_id, std::move(provider));
 }
 
 void ReceiverMediaToMojoAdapter::OnFrameReadyInBuffer(
diff --git a/services/video_capture/receiver_mojo_to_media_adapter.cc b/services/video_capture/receiver_mojo_to_media_adapter.cc
index f3a199d5..1ac3b6b8 100644
--- a/services/video_capture/receiver_mojo_to_media_adapter.cc
+++ b/services/video_capture/receiver_mojo_to_media_adapter.cc
@@ -107,7 +107,8 @@
     std::unique_ptr<media::VideoCaptureDevice::Client::Buffer::HandleProvider>
         handle_provider) {
   receiver_->OnNewBufferHandle(
-      buffer_id, handle_provider->GetHandleForInterProcessTransit());
+      buffer_id,
+      handle_provider->GetHandleForInterProcessTransit(true /* read-only */));
 }
 
 void ReceiverMojoToMediaAdapter::OnFrameReadyInBuffer(
diff --git a/sql/connection.cc b/sql/connection.cc
index 453d380..9d55b8b 100644
--- a/sql/connection.cc
+++ b/sql/connection.cc
@@ -1170,17 +1170,6 @@
   return true;
 }
 
-bool Connection::RazeWithTimout(base::TimeDelta timeout) {
-  if (!db_) {
-    DLOG_IF(FATAL, !poisoned_) << "Cannot raze null db";
-    return false;
-  }
-
-  ScopedBusyTimeout busy_timeout(db_);
-  busy_timeout.SetTimeout(timeout);
-  return Raze();
-}
-
 bool Connection::RazeAndClose() {
   if (!db_) {
     DLOG_IF(FATAL, !poisoned_) << "Cannot raze null db";
diff --git a/sql/connection.h b/sql/connection.h
index 8b96407..769d56f 100644
--- a/sql/connection.h
+++ b/sql/connection.h
@@ -310,7 +310,7 @@
   // was razed.
   //
   // false is returned if the database is locked by some other
-  // process.  RazeWithTimeout() may be used if appropriate.
+  // process.
   //
   // NOTE(shess): Raze() will DCHECK in the following situations:
   // - database is not open.
@@ -334,7 +334,6 @@
   // TODO(shess): Bake auto_vacuum into Connection's API so it can
   // just pick up the default.
   bool Raze();
-  bool RazeWithTimout(base::TimeDelta timeout);
 
   // Breaks all outstanding transactions (as initiated by
   // BeginTransaction()), closes the SQLite database, and poisons the
diff --git a/sql/meta_table.h b/sql/meta_table.h
index afa6e88..8a5dd595 100644
--- a/sql/meta_table.h
+++ b/sql/meta_table.h
@@ -16,12 +16,18 @@
 class Connection;
 class Statement;
 
+// Creates and manages a table to store generic metadata. The features provided
+// are:
+// * An interface for storing multi-typed key-value data.
+// * Helper methods to assist in database schema version control.
+// * Historical data on past attempts to mmap the database to make it possible
+//   to avoid unconditionally retrying to load broken databases.
 class SQL_EXPORT MetaTable {
  public:
   MetaTable();
   ~MetaTable();
 
-  // Values for Get/SetMmapStatus().  |kMmapFailure| indicates that there was at
+  // Values for Get/SetMmapStatus(). |kMmapFailure| indicates that there was at
   // some point a read error and the database should not be memory-mapped, while
   // |kMmapSuccess| indicates that the entire file was read at some point and
   // can be memory-mapped without constraint.
@@ -32,31 +38,31 @@
   static bool DoesTableExist(Connection* db);
 
   // If the current version of the database is less than or equal to
-  // |deprecated_version|, raze the database.  Must be called outside
-  // of a transaction.
-  // TODO(shess): At this time the database is razed IFF meta exists
-  // and contains a version row with value <= deprecated_version.  It
-  // may make sense to also raze if meta exists but has no version
-  // row, or if meta doesn't exist.  In those cases if the database is
-  // not already empty, it probably resulted from a broken
-  // initialization.
+  // |deprecated_version|, raze the database. Must be called outside of a
+  // transaction.
+  // TODO(shess): At this time the database is razed IFF meta exists and
+  // contains a version row with value <= deprecated_version. It may make sense
+  // to also raze if meta exists but has no version row, or if meta doesn't
+  // exist. In those cases if the database is not already empty, it probably
+  // resulted from a broken initialization.
   // TODO(shess): Folding this into Init() would allow enforcing
-  // |deprecated_version|<|version|.  But Init() is often called in a
+  // |deprecated_version|<|version|. But Init() is often called in a
   // transaction.
   static void RazeIfDeprecated(Connection* db, int deprecated_version);
 
-  // Used to tuck some data into the meta table about mmap status.  The value
+  // Used to tuck some data into the meta table about mmap status. The value
   // represents how much data in bytes has successfully been read from the
   // database, or |kMmapFailure| or |kMmapSuccess|.
   static bool GetMmapStatus(Connection* db, int64_t* status);
   static bool SetMmapStatus(Connection* db, int64_t status);
 
-  // Initializes the MetaTableHelper, creating the meta table if necessary. For
-  // new tables, it will initialize the version number to |version| and the
-  // compatible version number to |compatible_version|.  Versions must be
-  // greater than 0 to distinguish missing versions (see GetVersionNumber()).
-  // If there was no meta table (proxy for a fresh database), mmap status is set
-  // to |kMmapSuccess|.
+  // Initializes the MetaTableHelper, providing the |Connection| pointer and
+  // creating the meta table if necessary. Must be called before any other
+  // non-static methods. For new tables, it will initialize the version number
+  // to |version| and the compatible version number to |compatible_version|.
+  // Versions must be greater than 0 to distinguish missing versions (see
+  // GetVersionNumber()). If there was no meta table (proxy for a fresh
+  // database), mmap status is set to |kMmapSuccess|.
   bool Init(Connection* db, int version, int compatible_version);
 
   // Resets this MetaTable object, making another call to Init() possible.
diff --git a/storage/browser/fileapi/file_writer_delegate.cc b/storage/browser/fileapi/file_writer_delegate.cc
index f84ae46..e0593e3 100644
--- a/storage/browser/fileapi/file_writer_delegate.cc
+++ b/storage/browser/fileapi/file_writer_delegate.cc
@@ -50,8 +50,9 @@
 }
 
 void FileWriterDelegate::Cancel() {
-  // Destroy the request to prevent it from invoking any callbacks.
+  // Destroy the request and invalidate weak ptrs to prevent pending callbacks.
   request_.reset();
+  weak_factory_.InvalidateWeakPtrs();
 
   const int status = file_stream_writer_->Cancel(
       base::Bind(&FileWriterDelegate::OnWriteCancelled,
@@ -181,8 +182,9 @@
 }
 
 void FileWriterDelegate::OnError(base::File::Error error) {
-  // Destroy the request to prevent it from invoking any callbacks.
+  // Destroy the request and invalidate weak ptrs to prevent pending callbacks.
   request_.reset();
+  weak_factory_.InvalidateWeakPtrs();
 
   if (writing_started_)
     MaybeFlushForCompletion(error, 0, ERROR_WRITE_STARTED);
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index f926a66..d1fb79b 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -253,6 +253,9 @@
           "cronet-armv6/sizes"
         ],
         "name": "sizes",
+        "override_compile_targets": [
+          "cronet"
+        ],
         "script": "sizes.py"
       }
     ]
@@ -796,6 +799,9 @@
           "cronet-arm/sizes"
         ],
         "name": "sizes",
+        "override_compile_targets": [
+          "cronet"
+        ],
         "script": "sizes.py"
       }
     ]
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 33984f1..f3e9c609 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2746,21 +2746,6 @@
             ]
         }
     ],
-    "SearchGeolocationConsistency": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "EnableExperiment",
-                    "enable_features": [
-                        "ConsistentOmniboxGeolocation"
-                    ]
-                }
-            ]
-        }
-    ],
     "SecurityChip": [
         {
             "platforms": [
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index bcf05ad..431c6c0 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -3305,7 +3305,7 @@
 crbug.com/591099 external/wpt/css/CSS2/positioning/top-103.xht [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/positioning/top-104.xht [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/positioning/top-113.xht [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/text/text-align-white-space-002.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/text/text-align-white-space-002.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/text/text-align-white-space-006.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/text/text-decoration-applies-to-006.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/text/text-decoration-applies-to-007.xht [ Failure ]
@@ -3834,6 +3834,8 @@
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Crash Failure ]
 crbug.com/591099 external/wpt/cssom-view/cssom-getClientRects-002.html [ Failure ]
+crbug.com/591099 external/wpt/cssom-view/elementFromPoint-002.html [ Failure ]
+crbug.com/591099 external/wpt/cssom-view/elementFromPoint-003.html [ Failure ]
 crbug.com/591099 external/wpt/cssom-view/elementFromPoint.html [ Crash Failure ]
 crbug.com/591099 external/wpt/cssom-view/elementsFromPoint-iframes.html [ Failure ]
 crbug.com/591099 external/wpt/cssom-view/elementsFromPoint-svg.html [ Failure ]
@@ -4010,9 +4012,6 @@
 crbug.com/591099 external/wpt/intersection-observer/remove-element.html [ Failure ]
 crbug.com/591099 external/wpt/intersection-observer/same-document-root.html [ Crash Failure ]
 crbug.com/591099 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/media-source/mediasource-remove.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/payment-request/payment-disabled-by-feature-policy.https.sub.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/pointerevents/compat/pointerevent_touch-action_two-finger_interaction-manual.html [ Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers-manual.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_attributes_nohover_pointers-manual.html [ Crash Pass Timeout ]
@@ -4059,8 +4058,6 @@
 crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webrtc/interfaces.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/webstorage/storage_setitem.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy.https.sub.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/webusb/usb-disabled-by-feature-policy.https.sub.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_up.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Crash Failure ]
@@ -5649,7 +5646,7 @@
 crbug.com/591099 fast/css/zoom-property-parsing.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last.html [ Failure ]
-crbug.com/591099 fast/css3-text/css3-text-align-last/text-align-last.html [ Failure ]
+crbug.com/591099 fast/css3-text/css3-text-align-last/text-align-last.html [ Failure Pass ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style.html [ Failure ]
@@ -10634,7 +10631,7 @@
 crbug.com/591099 fast/text/atomic-inline-before-ellipsis.html [ Failure ]
 crbug.com/591099 fast/text/atsui-kerning-and-ligatures.html [ Failure ]
 crbug.com/591099 fast/text/atsui-spacing-features.html [ Failure ]
-crbug.com/591099 fast/text/basic/002.html [ Failure ]
+crbug.com/591099 fast/text/basic/002.html [ Failure Pass ]
 crbug.com/591099 fast/text/basic/004.html [ Failure ]
 crbug.com/591099 fast/text/basic/015.html [ Failure ]
 crbug.com/591099 fast/text/bidi-explicit-embedding-past-end.html [ Failure Pass ]
@@ -10645,7 +10642,6 @@
 crbug.com/591099 fast/text/chromium-linux-fallback-crash.html [ Failure ]
 crbug.com/591099 fast/text/chromium-linux-fontconfig-renderstyle.html [ Failure ]
 crbug.com/591099 fast/text/chromium-mac-duplicate-ime-composition.html [ Failure ]
-crbug.com/591099 fast/text/color-emoji.html [ Failure Pass ]
 crbug.com/591099 fast/text/combining-character-sequence-fallback-crash.html [ Failure ]
 crbug.com/591099 fast/text/complex-text-opacity.html [ Failure ]
 crbug.com/591099 fast/text/computed-line-height-and-font-size-with-font-size-adjust.html [ Failure ]
@@ -10727,13 +10723,13 @@
 crbug.com/591099 fast/text/international/vertical-text-metrics-test.html [ Crash Failure ]
 crbug.com/591099 fast/text/ipa-tone-letters.html [ Failure ]
 crbug.com/591099 fast/text/justified-selection-at-edge.html [ Failure ]
-crbug.com/591099 fast/text/justified-selection.html [ Failure ]
+crbug.com/591099 fast/text/justified-selection.html [ Failure Pass ]
 crbug.com/591099 fast/text/justify-ideograph-complex.html [ Crash Failure ]
 crbug.com/591099 fast/text/justify-ideograph-leading-expansion.html [ Failure ]
 crbug.com/591099 fast/text/justify-ideograph-simple.html [ Crash Failure ]
 crbug.com/591099 fast/text/justify-ideograph-vertical.html [ Crash Failure ]
 crbug.com/591099 fast/text/justify-nbsp.html [ Failure ]
-crbug.com/591099 fast/text/justify-padding-distribution.html [ Failure ]
+crbug.com/591099 fast/text/justify-padding-distribution.html [ Failure Pass ]
 crbug.com/591099 fast/text/justify-vertical.html [ Failure ]
 crbug.com/591099 fast/text/large-text-composed-char.html [ Failure Timeout ]
 crbug.com/591099 fast/text/letter-spacing-leading-and-trailing.html [ Failure ]
@@ -11233,8 +11229,6 @@
 crbug.com/591099 geolocation-api/watchPosition-page-visibility.html [ Failure ]
 crbug.com/591099 geolocation-api/watchPosition-unique.html [ Failure ]
 crbug.com/591099 geolocation-api/window-close-crash.html [ Failure ]
-crbug.com/591099 hdr/color-jpeg-with-color-profile.html [ Failure Pass ]
-crbug.com/591099 hdr/video-canvas-alpha.html [ Failure Pass ]
 crbug.com/591099 hittesting/border-hittest-inlineFlowBox.html [ Failure ]
 crbug.com/591099 hittesting/culled-inline-crash.html [ Failure ]
 crbug.com/591099 hittesting/hittest-child-of-inlineblock.html [ Crash Failure ]
@@ -12132,8 +12126,6 @@
 crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-disabled.php [ Crash Timeout ]
 crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-enabledforall.php [ Timeout ]
 crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-enabledforself.php [ Crash Timeout ]
-crbug.com/591099 http/tests/feature-policy/payment-disabled.php [ Crash Failure Pass ]
-crbug.com/591099 http/tests/feature-policy/payment-enabledforall.php [ Crash Failure Pass ]
 crbug.com/591099 http/tests/fetch/window/pageimportancesignals.html [ Failure ]
 crbug.com/591099 http/tests/fileapi/blob-url-in-subframe.html [ Failure ]
 crbug.com/591099 http/tests/fileapi/create-blob-url-from-data-url.html [ Failure ]
@@ -12503,7 +12495,6 @@
 crbug.com/591099 http/tests/local/stylesheet-and-script-load-order-http.html [ Failure ]
 crbug.com/591099 http/tests/local/stylesheet-and-script-load-order-media-print.html [ Failure ]
 crbug.com/591099 http/tests/local/stylesheet-and-script-load-order.html [ Failure ]
-crbug.com/591099 http/tests/media/media-source/mediasource-duration.html [ Crash Failure Pass Timeout ]
 crbug.com/591099 http/tests/media/progress-events-generated-correctly.html [ Crash Failure Pass ]
 crbug.com/591099 http/tests/media/video-buffered-range-contains-currentTime.html [ Failure Pass ]
 crbug.com/591099 http/tests/mime/quoted-charset.php [ Failure ]
@@ -13165,10 +13156,8 @@
 crbug.com/591099 http/tests/xmlhttprequest/XMLHttpRequestException.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/abort-should-destroy-responseText.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-data-saver.html [ Failure Timeout ]
-crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-headers-async.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-header-sorted.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-headers-origin.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-body-sync.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-body.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-expose-headers.html [ Failure ]
@@ -13718,7 +13707,7 @@
 crbug.com/591099 inspector/sass/test-find-node-for-position.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-mapping-bad.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-mapping-good.html [ Failure ]
-crbug.com/591099 inspector/sass/test-mapping-many-scss.html [ Failure ]
+crbug.com/591099 inspector/sass/test-mapping-many-scss.html [ Failure Timeout ]
 crbug.com/591099 inspector/sass/test-mapping-with-cache-busting-url.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-ssp-breaking-edits.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-ssp-editing.html [ Crash Failure ]
@@ -14474,6 +14463,7 @@
 crbug.com/591099 paint/invalidation/svg/remove-background-property-on-root.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/remove-outline-property-on-root.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/repaint-moving-svg-and-div.xhtml [ Failure Pass ]
+crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children-2.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/svg/scroll-hit-test.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
@@ -14570,7 +14560,6 @@
 crbug.com/591099 paint/markers/inline-spelling-markers-hidpi-composited.html [ Failure ]
 crbug.com/591099 paint/markers/inline-spelling-markers-hidpi.html [ Failure ]
 crbug.com/591099 paint/markers/inline_spelling_markers.html [ Failure ]
-crbug.com/591099 paint/markers/suggestion-marker-basic.html [ Failure Pass ]
 crbug.com/591099 paint/markers/suggestion-marker-split.html [ Failure ]
 crbug.com/591099 paint/masks/fieldset-mask.html [ Failure ]
 crbug.com/591099 paint/overflow/composited-rounded-clip-floating-element.html [ Failure ]
@@ -18634,10 +18623,8 @@
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/XMLHttpRequestException.html [ Failure ]
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/abort-should-destroy-responseText.html [ Failure ]
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-preflight-data-saver.html [ Failure ]
-crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-preflight-headers-async.html [ Failure ]
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-preflight-request-header-sorted.html [ Failure ]
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-preflight-request-headers-origin.html [ Failure ]
-crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400.html [ Failure ]
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-response-with-body-sync.html [ Failure ]
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-response-with-body.html [ Failure ]
 crbug.com/591099 virtual/mojo-loading/http/tests/xmlhttprequest/access-control-response-with-expose-headers.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
index 8966f1d..6ec914d 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -454,6 +454,7 @@
 
 Bug(none) virtual [ Crash Failure Timeout ]
 
+# Blob support for request bodies.
 crbug.com/761117 external/wpt/XMLHttpRequest/formdata-blob.htm [ Failure ]
 crbug.com/761117 external/wpt/XMLHttpRequest/formdata.htm [ Failure ]
 crbug.com/761117 external/wpt/XMLHttpRequest/send-blob-with-no-mime-type.html [ Failure ]
@@ -466,6 +467,10 @@
 crbug.com/761117 http/tests/xmlhttprequest/post-formdata.html [ Failure ]
 crbug.com/761117 http/tests/xmlhttprequest/workers/post-formdata.html [ Failure ]
 
+# Tests failed when turning on Blob service for network service config.
+crbug.com/611935 external/wpt/IndexedDB/nested-cloning-large-multiple.html [ Failure ]
+crbug.com/611935 external/wpt/IndexedDB/nested-cloning-small.html [ Failure ]
+
 # The next three sections are blocked by converting to new Mojo JS APIs.
 
 # TODO(reillyg): https://chromium-review.googlesource.com/c/chromium/src/+/579791
diff --git a/third_party/WebKit/LayoutTests/NeverFixTests b/third_party/WebKit/LayoutTests/NeverFixTests
index 2555721..454cbfe2 100644
--- a/third_party/WebKit/LayoutTests/NeverFixTests
+++ b/third_party/WebKit/LayoutTests/NeverFixTests
@@ -251,9 +251,6 @@
 crbug.com/381840 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll-background-opaque-to-transparent.html [ WontFix ]
 crbug.com/381840 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll-background-transparent-to-opaque.html [ WontFix ]
 
-# Stack overflow crashes on Win
-crbug.com/601669 [ Win ] svg/as-image/svg-nested.html [ WontFix ]
-
 # GPU rasterization antialiases differently.
 crbug.com/665014 virtual/gpu-rasterization/images/cross-fade-svg-size-diff.html [ WontFix ]
 crbug.com/665014 virtual/gpu-rasterization/images/cross-fade-svg-size.html [ WontFix ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 5556eb5e..f9ac25c 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -3645,9 +3645,8 @@
 crbug.com/760543 [ Linux Release ] virtual/mojo-loading/http/tests/devtools/tracing/timeline-time/timeline-usertiming.html [ Pass Timeout ]
 crbug.com/760543 [ Linux Release ] virtual/mojo-loading/http/tests/devtools/tracing/timeline-paint/timeline-paint.html [ Pass Timeout ]
 
-# Tests crashing or timing out on WebKit Linux Trusty ASAN
-crbug.com/760904 [ Linux Release ] svg/as-image/svg-nested.html [ Pass Crash Timeout ]
-
 # Tests failing on WebKit Mac10.11, WebKit Mac10.10, WebKit Mac10.9
 crbug.com/760967 [ Mac ] external/wpt/payment-request/payment-request-constructor.https.html [ Pass Failure ]
 crbug.com/760967 [ Mac ] external/wpt/payment-request/payment-request-ctor-pmi-handling.https.html [ Pass Failure ]
+
+crbug.com/760405 shadow-dom/crashes/css-focus-recalc.html [ Crash ]
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-actions.html b/third_party/WebKit/LayoutTests/accessibility/aom-click-action.html
similarity index 94%
rename from third_party/WebKit/LayoutTests/accessibility/aom-actions.html
rename to third_party/WebKit/LayoutTests/accessibility/aom-click-action.html
index 743465c..fb33992 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aom-actions.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-click-action.html
@@ -3,6 +3,7 @@
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="../http/tests/resources/permissions-helper.js"></script>
+<script src="resources/aom-helper.js"></script>
 
 <!--
 
@@ -20,19 +21,6 @@
 <button id="target1">Target</button>
 
 <script>
-function enableAccessibilityEventsPermission() {
-  return new Promise(function(resolve, reject) {
-    PermissionsHelper.setPermission(
-        'accessibility-events', 'granted').then(function() {
-      // Make sure AXObjectCacheImpl gets the notification too, its
-      // listener may fire after this one.
-      window.setTimeout(function() {
-        resolve();
-      }, 0);
-    });
-  });
-}
-
 async_test(function(t) {
   enableAccessibilityEventsPermission().then(function() {
     var target1 = document.getElementById("target1");
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-contextmenu-action.html b/third_party/WebKit/LayoutTests/accessibility/aom-contextmenu-action.html
new file mode 100644
index 0000000..9c15baaf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-contextmenu-action.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<script src="../resources/gc.js"></script>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="../http/tests/resources/permissions-helper.js"></script>
+<script src="resources/aom-helper.js"></script>
+
+<!--
+
+Accessibility Object Model
+Explainer: https://github.com/WICG/aom/blob/gh-pages/explainer.md
+Spec: https://wicg.github.io/aom/spec/
+
+-->
+<script>
+test(function(t) {
+    assert_true(internals.runtimeFlags.accessibilityObjectModelEnabled);
+}, "Make sure that Accessibility Object Model is enabled");
+</script>
+
+<button id="context_menu_target">Context Menu Target</button>
+
+<script>
+async_test(function(t) {
+  enableAccessibilityEventsPermission().then(function() {
+    var target = document.getElementById("context_menu_target");
+    var axTarget = accessibilityController.accessibleElementById("context_menu_target");
+
+    var gotDOMEvent = false;
+    target.addEventListener("contextmenu", function(event) {
+      event.preventDefault();
+      gotDOMEvent = true;
+    });
+    var gotAccessibleEvent = false;
+    target.accessibleNode.onaccessiblecontextmenu = function() {
+      gotAccessibleEvent = true;
+    };
+    axTarget.showMenu();
+
+    assert_true(gotAccessibleEvent);
+    assert_true(gotDOMEvent);
+    t.done();
+  });
+}, "AccessibleNode.onaccessiblecontextmenu");
+</script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-decrement-action.html b/third_party/WebKit/LayoutTests/accessibility/aom-decrement-action.html
new file mode 100644
index 0000000..ceefabd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-decrement-action.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<script src="../resources/gc.js"></script>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="../http/tests/resources/permissions-helper.js"></script>
+<script src="resources/aom-helper.js"></script>
+
+<!--
+
+Accessibility Object Model
+Explainer: https://github.com/WICG/aom/blob/gh-pages/explainer.md
+Spec: https://wicg.github.io/aom/spec/
+
+-->
+<script>
+test(function(t) {
+    assert_true(internals.runtimeFlags.accessibilityObjectModelEnabled);
+}, "Make sure that Accessibility Object Model is enabled");
+</script>
+
+<input type=range min=1 max=5 value=3 id="decrement_target">
+
+<script>
+async_test(function(t) {
+  enableAccessibilityEventsPermission().then(function() {
+    var target = document.getElementById("decrement_target");
+    var axTarget = accessibilityController.accessibleElementById("decrement_target");
+
+    var gotAccessibleEvent = false;
+    target.accessibleNode.onaccessibledecrement = function() {
+      gotAccessibleEvent = true;
+    };
+    axTarget.decrement();
+
+    assert_true(gotAccessibleEvent);
+    assert_equals(target.value, "2");
+    t.done();
+  });
+}, "AccessibleNode.onaccessibledecrement");
+</script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-focus-action.html b/third_party/WebKit/LayoutTests/accessibility/aom-focus-action.html
new file mode 100644
index 0000000..a847b36
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-focus-action.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<script src="../resources/gc.js"></script>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="../http/tests/resources/permissions-helper.js"></script>
+<script src="resources/aom-helper.js"></script>
+
+<!--
+
+Accessibility Object Model
+Explainer: https://github.com/WICG/aom/blob/gh-pages/explainer.md
+Spec: https://wicg.github.io/aom/spec/
+
+-->
+<script>
+test(function(t) {
+    assert_true(internals.runtimeFlags.accessibilityObjectModelEnabled);
+}, "Make sure that Accessibility Object Model is enabled");
+</script>
+
+<input id="focus_target">
+
+<script>
+async_test(function(t) {
+  enableAccessibilityEventsPermission().then(function() {
+    var target = document.getElementById("focus_target");
+    var axTarget = accessibilityController.accessibleElementById("focus_target");
+
+    var gotAccessibleEvent = false;
+    target.accessibleNode.onaccessiblefocus = function() {
+      gotAccessibleEvent = true;
+    };
+    axTarget.takeFocus();
+
+    assert_true(gotAccessibleEvent);
+    assert_equals(document.activeElement, target);
+    t.done();
+  });
+}, "AccessibleNode.onaccessiblefocus");
+</script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-increment-action.html b/third_party/WebKit/LayoutTests/accessibility/aom-increment-action.html
new file mode 100644
index 0000000..2f15097
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-increment-action.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<script src="../resources/gc.js"></script>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="../http/tests/resources/permissions-helper.js"></script>
+<script src="resources/aom-helper.js"></script>
+
+<!--
+
+Accessibility Object Model
+Explainer: https://github.com/WICG/aom/blob/gh-pages/explainer.md
+Spec: https://wicg.github.io/aom/spec/
+
+-->
+<script>
+test(function(t) {
+    assert_true(internals.runtimeFlags.accessibilityObjectModelEnabled);
+}, "Make sure that Accessibility Object Model is enabled");
+</script>
+
+<input type=range min=1 max=5 value=3 id="increment_target">
+
+<script>
+async_test(function(t) {
+  enableAccessibilityEventsPermission().then(function() {
+    var target = document.getElementById("increment_target");
+    var axTarget = accessibilityController.accessibleElementById("increment_target");
+
+    var gotAccessibleEvent = false;
+    target.accessibleNode.onaccessibleincrement = function() {
+      gotAccessibleEvent = true;
+    };
+    axTarget.increment();
+
+    assert_true(gotAccessibleEvent);
+    assert_equals(target.value, "4");
+    t.done();
+  });
+}, "AccessibleNode.onaccessibleincrement");
+</script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-scroll-action.html b/third_party/WebKit/LayoutTests/accessibility/aom-scroll-action.html
new file mode 100644
index 0000000..15864642
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-scroll-action.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<script src="../resources/gc.js"></script>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="../http/tests/resources/permissions-helper.js"></script>
+<script src="resources/aom-helper.js"></script>
+
+<!--
+
+Accessibility Object Model
+Explainer: https://github.com/WICG/aom/blob/gh-pages/explainer.md
+Spec: https://wicg.github.io/aom/spec/
+
+-->
+<script>
+test(function(t) {
+    assert_true(internals.runtimeFlags.accessibilityObjectModelEnabled);
+}, "Make sure that Accessibility Object Model is enabled");
+</script>
+
+<input id="scroll_target" style="margin-top: 1000px;">
+
+<script>
+async_test(function(t) {
+  enableAccessibilityEventsPermission().then(function() {
+    var target = document.getElementById("scroll_target");
+    var axTarget = accessibilityController.accessibleElementById("scroll_target");
+
+    var oldY = window.pageYOffset;
+
+    var gotAccessibleEvent = false;
+    target.accessibleNode.onaccessiblescrollintoview = function() {
+      gotAccessibleEvent = true;
+    };
+    axTarget.scrollToMakeVisible();
+
+    assert_true(gotAccessibleEvent);
+    assert_true(window.pageYOffset > oldY);
+    t.done();
+  });
+}, "AccessibleNode.onaccessiblescroll");
+</script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/misspellings.html b/third_party/WebKit/LayoutTests/accessibility/misspellings.html
index efd4105..16cee56 100644
--- a/third_party/WebKit/LayoutTests/accessibility/misspellings.html
+++ b/third_party/WebKit/LayoutTests/accessibility/misspellings.html
@@ -118,7 +118,7 @@
 
     currentTest.action();
 
-    if (window.internals && internals.runtimeFlags.idleTimeSpellCheckingEnabled)
+    if (window.internals)
       internals.runIdleTimeSpellChecker(document);
   }
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/resources/aom-helper.js b/third_party/WebKit/LayoutTests/accessibility/resources/aom-helper.js
new file mode 100644
index 0000000..94aa714
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/accessibility/resources/aom-helper.js
@@ -0,0 +1,12 @@
+function enableAccessibilityEventsPermission() {
+  return new Promise(function(resolve, reject) {
+    PermissionsHelper.setPermission(
+        'accessibility-events', 'granted').then(function() {
+      // Make sure AXObjectCacheImpl gets the notification too, its
+      // listener may fire after this one.
+      window.setTimeout(function() {
+        resolve();
+      }, 0);
+    });
+  });
+}
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/line-height-interpolation.html b/third_party/WebKit/LayoutTests/animations/interpolation/line-height-interpolation.html
index d0087e3..0b8e829 100644
--- a/third_party/WebKit/LayoutTests/animations/interpolation/line-height-interpolation.html
+++ b/third_party/WebKit/LayoutTests/animations/interpolation/line-height-interpolation.html
@@ -184,6 +184,29 @@
   {at: 1, is: '150px'},
   {at: 1.5, is: '0px'}, // line-height must not be less than 0.
 ]);
+assertNoInterpolation({
+  property: 'line-height',
+  from: '4',
+  to: '14q',
+});
+assertInterpolation({
+  property: 'line-height',
+  from: '4q',
+  to: '14q',
+}, [
+  {at: -1, is: '0q'},
+  {at: -0.3, is: '1q'},
+  {at: 0, is: '4q'},
+  {at: 0.3, is: '7q'},
+  {at: 0.6, is: '10q'},
+  {at: 1, is: '14q'},
+  {at: 1.5, is: '19q'},
+]);
+assertNoInterpolation({
+  property: 'line-height',
+  from: '14q',
+  to: 'normal',
+});
 </script>
 </body>
 
diff --git a/third_party/WebKit/LayoutTests/css3/calc/simplification-expected.txt b/third_party/WebKit/LayoutTests/css3/calc/simplification-expected.txt
index 91c2a89..061a3af 100644
--- a/third_party/WebKit/LayoutTests/css3/calc/simplification-expected.txt
+++ b/third_party/WebKit/LayoutTests/css3/calc/simplification-expected.txt
@@ -18,4 +18,6 @@
 100px + 1em => calc(100px + 1em)
 100px + 1em + 100px => calc((100px + 1em) + 100px)
 1em + 1rem => calc(1em + 1rem)
+1q + 10q => calc(11q)
+100q * (10 + 5) => calc(1500q)
 
diff --git a/third_party/WebKit/LayoutTests/css3/calc/simplification.html b/third_party/WebKit/LayoutTests/css3/calc/simplification.html
index c9de6db..a30a7939 100644
--- a/third_party/WebKit/LayoutTests/css3/calc/simplification.html
+++ b/third_party/WebKit/LayoutTests/css3/calc/simplification.html
@@ -24,6 +24,8 @@
     "100px + 1em",
     "100px + 1em + 100px",
     "1em + 1rem",
+    "1q + 10q",
+    "100q * (10 + 5)",
 ];
 
 var results = document.getElementById("results");
diff --git a/third_party/WebKit/LayoutTests/editing/spelling/mark-empty-crash.html b/third_party/WebKit/LayoutTests/editing/spelling/mark-empty-crash.html
index 9d9c454..f4edf306 100644
--- a/third_party/WebKit/LayoutTests/editing/spelling/mark-empty-crash.html
+++ b/third_party/WebKit/LayoutTests/editing/spelling/mark-empty-crash.html
@@ -13,7 +13,6 @@
     window.getSelection().selectAllChildren(document.getElementById('foo'));
     document.execCommand('insertParagraph');
 
-    if (internals.runtimeFlags.idleTimeSpellCheckingEnabled)
-      internals.runIdleTimeSpellChecker(document);
+    internals.runIdleTimeSpellChecker(document);
 }, 'spelling');
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-mutation.html b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-mutation.html
index 28d0196..63438cf2 100644
--- a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-mutation.html
+++ b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-mutation.html
@@ -5,7 +5,7 @@
 <script src="spellcheck_test.js"></script>
 <script>
 function runIdleTimeSpellCheckerIfNeeded(document) {
-  if (!window.internals || !internals.runtimeFlags.idleTimeSpellCheckingEnabled)
+  if (!window.internals)
     return;
   internals.runIdleTimeSpellChecker(document);
 }
diff --git a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-remove-frame.html b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-remove-frame.html
index 9eccc59..aa8e5d3 100644
--- a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-remove-frame.html
+++ b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-async-remove-frame.html
@@ -13,7 +13,7 @@
       document.documentElement.focus();
       document.execCommand('insertText', false, 'zz.');
 
-      if (window.internals && internals.runtimeFlags.idleTimeSpellCheckingEnabled)
+      if (window.internals)
         internals.runIdleTimeSpellChecker(document);
 
       // Remove frame after sending the spellcheck request and before its response.
diff --git a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-crash.html b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-crash.html
index 60a78f1..5fe2813f 100644
--- a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-crash.html
+++ b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-crash.html
@@ -15,7 +15,7 @@
     // Trigger spell checking
     selection.modify('move', 'right', 'character');
 
-    if (window.internals && internals.runtimeFlags.idleTimeSpellCheckingEnabled)
+    if (window.internals)
       internals.runIdleTimeSpellChecker(document);
 });
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-long-text-crash.html b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-long-text-crash.html
index 98a5883..f1abb7f0 100644
--- a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-long-text-crash.html
+++ b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck-mixed-editable-long-text-crash.html
@@ -28,7 +28,7 @@
     // Trigger spell checking
     window.getSelection().collapse(document.getElementById('sample'), 0);
 
-    if (window.internals && internals.runtimeFlags.idleTimeSpellCheckingEnabled)
+    if (window.internals)
       internals.runIdleTimeSpellChecker(document);
 });
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js
index d8fa9835..aaa2442 100644
--- a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js
+++ b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js
@@ -359,13 +359,11 @@
       });
     };
 
-    if (internals.runtimeFlags.idleTimeSpellCheckingEnabled) {
-      if (internals.idleTimeSpellCheckerState(sample.document) === 'HotModeRequested')
+    if (internals.idleTimeSpellCheckerState(sample.document) === 'HotModeRequested')
+      internals.runIdleTimeSpellChecker(sample.document);
+    if (testObject.properties[kNeedsFullCheck]) {
+      while (internals.idleTimeSpellCheckerState(sample.document) !== 'Inactive')
         internals.runIdleTimeSpellChecker(sample.document);
-      if (testObject.properties[kNeedsFullCheck]) {
-        while (internals.idleTimeSpellCheckerState(sample.document) !== 'Inactive')
-          internals.runIdleTimeSpellChecker(sample.document);
-      }
     }
 
     // For a test that does not create new spell check request, a synchronous
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index 56858f4..c6efc51 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -85742,6 +85742,11 @@
      {}
     ]
    ],
+   "css/css-grid-1/support/style-change.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-grid-1/test-plan/index.html": [
     [
      {}
@@ -117397,11 +117402,6 @@
      {}
     ]
    ],
-   "service-workers/service-worker/resources/registration-tests.js": [
-    [
-     {}
-    ]
-   ],
    "service-workers/service-worker/resources/registration-worker.js": [
     [
      {}
@@ -135180,6 +135180,222 @@
      {}
     ]
    ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html",
+     {}
+    ]
+   ],
+   "css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html": [
+    [
+     "/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html",
+     {}
+    ]
+   ],
    "css/css-grid-1/alignment/grid-self-alignment-stretch-001.html": [
     [
      "/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html",
@@ -136146,6 +136362,12 @@
      {}
     ]
    ],
+   "css/css-tables-3/fixed-layout-calc-width-001.html": [
+    [
+     "/css/css-tables-3/fixed-layout-calc-width-001.html",
+     {}
+    ]
+   ],
    "css/css-tables-3/fixed-layout-excess-width-distribution-001.html": [
     [
      "/css/css-tables-3/fixed-layout-excess-width-distribution-001.html",
@@ -137118,6 +137340,12 @@
      {}
     ]
    ],
+   "css/css-values-3/absolute-length-units-001.html": [
+    [
+     "/css/css-values-3/absolute-length-units-001.html",
+     {}
+    ]
+   ],
    "css/css-values-3/calc-unit-analysis.html": [
     [
      "/css/css-values-3/calc-unit-analysis.html",
@@ -186082,7 +186310,7 @@
    "support"
   ],
   "./lint.whitelist": [
-   "223804666e64dde8a7e22ee394baa50d77e0cff0",
+   "41972c110065c638f914d33d35d123a5732f84d6",
    "support"
   ],
   "./update-built-tests.sh": [
@@ -190494,7 +190722,7 @@
    "support"
   ],
   "2dcontext/tools/current-work-canvas.xhtml": [
-   "891246c4dfe34f9b43b5e642b058072c4d664817",
+   "c712cdec9ced8da63eb6b8dfce17906a4210883e",
    "support"
   ],
   "2dcontext/tools/gentest.py": [
@@ -190502,19 +190730,19 @@
    "support"
   ],
   "2dcontext/tools/gentestutils.py": [
-   "f613a789c0e231a3600070583661ba3b1842fed3",
+   "d7862903e270295fd11e2d98c5c4dbcde4ae0717",
    "support"
   ],
   "2dcontext/tools/name2dir.yaml": [
-   "1333578a501fec686bc7ed22edf4cc8e7203ae13",
+   "3a852f1cc85eae2a17e67d56ce0c9bb5e4e69b41",
    "support"
   ],
   "2dcontext/tools/spec.yaml": [
-   "4405a99f9fa29069670a1fb8aaef5e1c89ac33d0",
+   "4692cedcc0d1d5af9ac917fa19d3979e2129a933",
    "support"
   ],
   "2dcontext/tools/specextract.py": [
-   "c6c58223012640480eb1e7d0b9ce4c343cafdb7c",
+   "5c656f7f4859ec0eb0559b1b1dfe6e085032d7c8",
    "support"
   ],
   "2dcontext/tools/templates.yaml": [
@@ -193134,7 +193362,7 @@
    "testharness"
   ],
   "XMLHttpRequest/allow-lists-starting-with-comma.htm": [
-   "5e7870a6d66c475c2f96fd64a146ea751b08f4b1",
+   "34a8d82f397f35902c73d9ced2f3cf900d04ae53",
    "testharness"
   ],
   "XMLHttpRequest/anonymous-mode-unsupported.htm": [
@@ -193530,7 +193758,7 @@
    "support"
   ],
   "XMLHttpRequest/resources/access-control-allow-lists.py": [
-   "72914699c33449255e47adb9668983e1bef8da14",
+   "941a26e0b85d608bb2617362df74263564b5981d",
    "support"
   ],
   "XMLHttpRequest/resources/access-control-auth-basic.py": [
@@ -222009,6 +222237,150 @@
    "6e0f7a2262ec3476d8cf32ea562fe0f67ad5a7f1",
    "reftest"
   ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html": [
+   "19ae01ab31a15efc601d2857d3ca1dd879cb4e66",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html": [
+   "abb8f221910dc58b87ff1d3f5b9f346994688a8d",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html": [
+   "1dee7406f817681eaec5c1b5607b9762bc546329",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html": [
+   "03da21bdcbb4fdb53f93c372da2af4a175fc0bc9",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html": [
+   "c4e793351e05b74a9d859286407f30f019e581ee",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html": [
+   "ab2604e1dd0396402ce6ab0acea3a340d107ad08",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html": [
+   "17b0c72f106d9103af25c654e913ad00c2a5ee19",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html": [
+   "32b50873af5b434817de9ca3fb5ea3b79808bdbc",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html": [
+   "29551eeae983adc5cdd9b518b64a1d0c9560f062",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html": [
+   "396afc15a311bb0a636ba2570b57366a52fbc770",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html": [
+   "49109ff240399f0f1f60308850f805779dfc4b21",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html": [
+   "45a9279c62d4052a150a6da13ae9c177a38f01a2",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html": [
+   "29d4695a9ad8eb5eebcdf15b3693a714bc412779",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html": [
+   "66d7b70d305869abb453caf2f0e51a274bd1a537",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html": [
+   "874f6b55e6b204d6cfc41c73a2c00a5f4229d298",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html": [
+   "51b59909bd41adefa471e9b8bf9ff75e9ed92259",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html": [
+   "6423406f9bfaf43ac97fd4547a784c2bb8d19bc0",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html": [
+   "123575acf3c090c6479e5e4fa064c75fcea56bda",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html": [
+   "f611e34104ae873f1124032aa22621dfcf4fa128",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html": [
+   "c0a3bf24655a77c05dce301b0173f18d0fa42234",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html": [
+   "e39bd0c869b5c69f99ddb0e43ecd516c23e22051",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html": [
+   "436855cb48c5de8f913f209ba8172644c0e97226",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html": [
+   "07ea8b43529cc3abe597b5cbaf71b577c0e08a81",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html": [
+   "4ef7fd0b4687fe9f08513cccff2707bb05d92a78",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html": [
+   "4ecabe7266535153ce6e38e1bee6e4eba28c5260",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html": [
+   "dc702a1d181ef4efcf4d5161ff1b10bbb8e08337",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html": [
+   "a5646db94e62b9455c9ed44e9f1a86f1cda74153",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html": [
+   "9940f6e83d28a45ad87a50b24afe5eca1c3ff596",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html": [
+   "ed6197207c84d52614f2e4bda31aa0794ac244ce",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html": [
+   "df920f26e14d9adb3e987771b74f3ca21d001b9d",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html": [
+   "24cdde781a98046593d3f0a57906b756326c4d83",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html": [
+   "489c89b0d82b3ad92e342db2b680b152e4bab404",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html": [
+   "4905906bd110e7b9ef3ad1ca4e0b01417b0998c8",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html": [
+   "c9ef480494c982efd2cc2b6801eb0c308de0a608",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html": [
+   "f93f4f2a62aa2073676466dcfc5975556dd04739",
+   "testharness"
+  ],
+  "css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html": [
+   "748d617dac4b7c97592967c0df1ee82f6a43cc0a",
+   "testharness"
+  ],
   "css/css-grid-1/alignment/grid-content-distribution-001.html": [
    "5622a264eb2dbd6cf621ac97aa4a8ae5db82c6b3",
    "reftest"
@@ -223077,6 +223449,10 @@
    "a9d8444db24ab38518f07a965a8a537cc6add437",
    "support"
   ],
+  "css/css-grid-1/support/style-change.js": [
+   "a92e1d3f5be007d10fdf432bb198f87b00bdc35a",
+   "support"
+  ],
   "css/css-grid-1/test-plan/index.html": [
    "e633dc7584fbc7bfe99177aa5dd9fbd107a2d3f5",
    "support"
@@ -224637,6 +225013,10 @@
    "d33a4338262c5fec8f3739eb743ff5945743c635",
    "support"
   ],
+  "css/css-tables-3/fixed-layout-calc-width-001.html": [
+   "0b8262ca3abd6104e86c305d738a2c70f6cb1f87",
+   "testharness"
+  ],
   "css/css-tables-3/fixed-layout-excess-width-distribution-001-expected.txt": [
    "a4c3d95f4339d0303dd5baf70b3202ac59a0900f",
    "support"
@@ -232173,6 +232553,10 @@
    "495f99b874611fd8f82f2e33bc4b7d930cc60fde",
    "support"
   ],
+  "css/css-values-3/absolute-length-units-001.html": [
+   "d21dfd079ff6ac225e5f36c25e34bd994a713fa2",
+   "testharness"
+  ],
   "css/css-values-3/absolute_length_units.html": [
    "64ea61f181e9e6c1c801ff7e10c75122beab45c2",
    "visual"
@@ -259530,7 +259914,7 @@
    "support"
   ],
   "html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-expected.txt": [
-   "fac7b9319ec0f3cc607c01a9442e1b16543d5324",
+   "9ff2f5c6d2ab989d607aff60c4b6227d49ad0fca",
    "support"
   ],
   "html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html": [
@@ -284502,7 +284886,7 @@
    "support"
   ],
   "service-workers/service-worker/resources/extendable-event-async-waituntil.js": [
-   "6974e3550cb50b5789c10681abf0a1174bc1a3b8",
+   "1c4145015d38589beea2e5a6850bb4f97f773e0a",
    "support"
   ],
   "service-workers/service-worker/resources/extendable-event-waituntil.js": [
@@ -285045,10 +285429,6 @@
    "9bd12c8a1819a2d2c00e49df61972307b63a1a73",
    "support"
   ],
-  "service-workers/service-worker/resources/registration-tests.js": [
-   "bdb31335f8d15de455108e0186183f1acdaef41e",
-   "support"
-  ],
   "service-workers/service-worker/resources/registration-worker.js": [
    "048f75fc0d193765d6264e7be132c29e56dd7bcb",
    "support"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/current-work-canvas.xhtml b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/current-work-canvas.xhtml
index b41ad7d..1baf354 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/current-work-canvas.xhtml
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/current-work-canvas.xhtml
@@ -1,42 +1,67 @@
-<?xml version="1.0" encoding="UTF-8"?><html xml:lang="en-US-x-hixie" xmlns="http://www.w3.org/1999/xhtml"><head><title>HTML Standard</title><link href="http://www.whatwg.org/style/specification" rel="stylesheet"/><link href="http://www.whatwg.org/images/icon" rel="icon"/><style>
-   .proposal { border: blue solid; padding: 1em; }
-   .bad, .bad *:not(.XXX) { color: gray; border-color: gray; background: transparent; }
-   #updatesStatus { display: none; }
-   #updatesStatus.relevant { display: block; position: fixed; right: 1em; top: 1em; padding: 0.5em; font: bold small sans-serif; min-width: 25em; width: 30%; max-width: 40em; height: auto; border: ridge 4px gray; background: #EEEEEE; color: black; }
-   div.head .logo { width: 11em; margin-bottom: 20em; }
-   #configUI { position: absolute; z-index: 20; top: 10em; right: 0; width: 11em; padding: 0 0.5em 0 0.5em; font-size: small; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em 0 0 1em; -moz-border-radius: 1em 0 0 1em; }
-   #configUI p { margin: 0.75em 0; padding: 0.3em; }
-   #configUI p label { display: block; }
-   #configUI #updateUI, #configUI .loginUI { text-align: center; }
-   #configUI input[type=button] { display: block; margin: auto; }
-   #configUI :link, #configUI :visited { color: white; }
-   #configUI :link:hover, #configUI :visited:hover { background: transparent; }
-   #reviewer { position: fixed; bottom: 0; right: 0; padding: 0.15em 0.25em 0em 0.5em; white-space: nowrap; overflow: hidden; z-index: 30; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em 0 0 0; -moz-border-radius: 1em 0 0 0; max-width: 90%; }
-   #reviewer input { max-width: 50%; }
-   #reviewer * { font-size: small; }
-   #reviewer.off &gt; :not(:first-child) { display: none; }
-   #alert { position: fixed; top: 20%; left: 20%; right: 20%; font-size: 2em; padding: 0.5em; z-index: 40; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em; -moz-border-radius: 1em; -webkit-transition: opacity 1s linear; }
-   #alert.closed { opacity: 0; }
-   #alert button { position: absolute; top: -1em; right: 2em; border-radius: 1em 1em 0 0; border: none; line-height: 0.9; color: white; background: rgb(64,64,64); font-size: 0.6em; font-weight: 900; cursor: pointer; }
-   #alert :link, #alert :visited { color: white; }
-   #alert :link:hover, #alert :visited:hover { background: transparent; }
-   @media print { #configUI { display: none; } }
-   .rfc2119 { font-variant: small-caps; text-shadow: 0 0 0.5em yellow; position: static; }
-   .rfc2119::after { position: absolute; left: 0; width: 25px; text-align: center; color: yellow; text-shadow: 0.075em 0.075em 0.2em black; }
-   .rfc2119.m\ust::after { content: '\2605'; }
-   .rfc2119.s\hould::after { content: '\2606'; }
+<?xml version="1.0" encoding="UTF-8"?><html class="split" lang="en-US-x-hixie" xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"/><meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/><title>HTML Standard</title><meta content="#3c790a" name="theme-color"/><link href="https://resources.whatwg.org/standard.css" rel="stylesheet"/><link href="https://resources.whatwg.org/logo.svg" rel="icon"/><style>
+   .status { min-height: 0.6em; font: 1em sans-serif; width: 9em; padding: 0.3em; position: absolute; z-index: 8; right: 0.3em; background: #EEE; color: black; box-shadow: 0 0 3px #999; overflow: hidden; margin: -2em 0 0 0; border-collapse: initial; border-spacing: initial; }
+   .status:hover { z-index: 9; }
+   .status:focus-within { z-index: 9; }
+   .status.wrapped &gt; :not(input) { display: none; }
+   .status &gt; input { position: absolute; left: 0; top: 0; width: 1em; height: 1em; border: none; background: transparent; padding: 0; margin: 0; }
+   .status &gt; p { font-size: 0.6em; margin: 0; padding: 0; }
+   .status &gt; p + p { padding-top: 0.5em; }
+   .status &gt; p &gt; strong { margin-left: 1.5em; }
+   .status &gt; .support { display: block; }
+   .status &gt; .support &gt; span { padding: 0.2em 0; display: block; display: table; }
+   .status &gt; .support &gt; span.partial { color: #666666; filter: grayscale(50%); }
+   .status &gt; .support &gt; span.no { color: #CCCCCC; filter: grayscale(100%); }
+   .status &gt; .support &gt; span.no::before { opacity: 0.5; }
+   .status &gt; .support &gt; span:first-of-type { padding-top: 0.5em; }
+   .status &gt; .support &gt; span &gt; span { padding: 0 0.5em; display: table-cell; vertical-align: top; }
+   .status &gt; .support &gt; span &gt; span:first-child { width: 100%; }
+   .status &gt; .support &gt; span &gt; span:last-child { width: 100%; white-space: pre; padding: 0; }
+   .status &gt; .support &gt; span::before { content: ' '; display: table-cell; min-width: 1.5em; height: 1.5em; background: no-repeat center center; background-size: contain; text-align: right; font-size: 0.75em; font-weight: bold; }
+   .status &gt; .support &gt; .and_chr::before { background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg); }
+   .status &gt; .support &gt; .and_ff::before { background-image: url(https://resources.whatwg.org/browser-logos/firefox.png); }
+   .status &gt; .support &gt; .and_uc::before { background-image: url(https://resources.whatwg.org/browser-logos/uc.png); } /* UC Browser for Android */
+   .status &gt; .support &gt; .android::before { background-image: url(https://resources.whatwg.org/browser-logos/android.svg); }
+   .status &gt; .support &gt; .bb::before { background-image: url(https://resources.whatwg.org/browser-logos/bb.jpg); } /* Blackberry Browser */
+   .status &gt; .support &gt; .chrome::before { background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg); }
+   .status &gt; .support &gt; .edge::before { background-image: url(https://resources.whatwg.org/browser-logos/edge.svg); }
+   .status &gt; .support &gt; .firefox::before { background-image: url(https://resources.whatwg.org/browser-logos/firefox.png); }
+   .status &gt; .support &gt; .ie::before { background-image: url(https://resources.whatwg.org/browser-logos/ie.png); }
+   .status &gt; .support &gt; .ie_mob::before { background-image: url(https://resources.whatwg.org/browser-logos/ie-mobile.svg); }
+   .status &gt; .support &gt; .ios_saf::before { background-image: url(https://resources.whatwg.org/browser-logos/safari-ios.svg); }
+   .status &gt; .support &gt; .op_mini::before { background-image: url(https://resources.whatwg.org/browser-logos/opera-mini.png); }
+   .status &gt; .support &gt; .op_mob::before { background-image: url(https://resources.whatwg.org/browser-logos/opera.png); }
+   .status &gt; .support &gt; .opera::before { background-image: url(https://resources.whatwg.org/browser-logos/opera.png); }
+   .status &gt; .support &gt; .safari::before { background-image: url(https://resources.whatwg.org/browser-logos/safari.png); }
+   .status &gt; .support &gt; .samsung::before { background-image: url(https://resources.whatwg.org/browser-logos/samsung.png); }
+   .status &gt; .caniuse { text-align: right; font-style: italic; width: 100%; }
+   .status &gt; .caniuse + p { margin-top: 0.5em; border-top: 1px solid silver; }
+
+   @media (max-width: 767px) {
+     .status { right: -9em; }
+   }
+  </style><style>
    [hidden] { display: none; }
-  </style><style type="text/css">
+
+   .bad, .bad *:not(.X\58X) { color: gray; border-color: gray; background: transparent; }
+
+   .fingerprint { position: absolute; right: 0; z-index: 5; }
+   @media (max-width: 767px) {
+     .fingerprint { max-width: 35px; }
+   }
+
+   .applies .yes, .yesno .yes { background: yellow; }
+   .yesno .yes, .yesno .no { text-align: center; }
 
    .applies thead th &gt; * { display: block; }
    .applies thead code { display: block; }
-   .applies tbody th { whitespace: nowrap; }
    .applies td { text-align: center; }
-   .applies .yes { background: yellow; }
 
    .matrix, .matrix td { border: hidden; text-align: right; }
    .matrix { margin-left: 2em; }
 
+   .vertical-summary-table tr &gt; th[rowspan=&quot;2&quot;]:first-child + th,
+   .vertical-summary-table tr &gt; td[rowspan=&quot;2&quot;]:first-child + td { border-bottom: hidden; }
+
    .dice-example { border-collapse: collapse; border-style: hidden solid solid hidden; border-width: thin; margin-left: 3em; }
    .dice-example caption { width: 30em; font-size: smaller; font-style: italic; padding: 0.75em 0; text-align: left; }
    .dice-example td, .dice-example th { border: solid thin; width: 1.35em; height: 1.05em; text-align: center; padding: 0; }
@@ -44,7 +69,6 @@
    td.eg { border-width: thin; text-align: center; }
 
    #table-example-1 { border: solid thin; border-collapse: collapse; margin-left: 3em; }
-   #table-example-1 * { font-family: &quot;Essays1743&quot;, serif; line-height: 1.01em; }
    #table-example-1 caption { padding-bottom: 0.5em; }
    #table-example-1 thead, #table-example-1 tbody { border: none; }
    #table-example-1 th, #table-example-1 td { border: solid thin; }
@@ -73,25 +97,13 @@
    .apple-table-examples.e2 th[scope=row] { padding-left: 1em; }
    .apple-table-examples sup { line-height: 0; }
 
+   .three-column-nowrap tr &gt; td:first-child,
+   .three-column-nowrap tr &gt; td:first-child + td,
+   .three-column-nowrap tr &gt; td:first-child + td + td { white-space: nowrap; }
+
    .details-example img { vertical-align: top; }
 
-   #base64-table {
-     white-space: nowrap;
-     font-size: 0.6em;
-     column-width: 6em;
-     column-count: 5;
-     column-gap: 1em;
-     -moz-column-width: 6em;
-     -moz-column-count: 5;
-     -moz-column-gap: 1em;
-     -webkit-column-width: 6em;
-     -webkit-column-count: 5;
-     -webkit-column-gap: 1em;
-   }
-   #base64-table thead { display: none; }
-   #base64-table * { border: none; }
-   #base64-table tbody td:first-child:after { content: ':'; }
-   #base64-table tbody td:last-child { text-align: right; }
+   .parse-error-table td &gt; p:first-child { margin-top: 0; }
 
    #named-character-references-table {
      white-space: nowrap;
@@ -110,2226 +122,2654 @@
 
    .glyph.control { color: red; }
 
+   #table-example-1 * { font-family: &quot;Essays1743&quot;, serif; line-height: 1.01em; }
    @font-face {
      font-family: 'Essays1743';
-     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743.ttf');
+     src: url('/fonts/Essays1743.ttf');
    }
    @font-face {
      font-family: 'Essays1743';
      font-weight: bold;
-     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Bold.ttf');
+     src: url('/fonts/Essays1743-Bold.ttf');
    }
    @font-face {
      font-family: 'Essays1743';
      font-style: italic;
-     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Italic.ttf');
+     src: url('/fonts/Essays1743-Italic.ttf');
    }
    @font-face {
      font-family: 'Essays1743';
      font-style: italic;
      font-weight: bold;
-     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-BoldItalic.ttf');
+     src: url('/fonts/Essays1743-BoldItalic.ttf');
    }
 
-  </style><style>
-   .domintro:before { display: table; margin: -1em -0.5em -0.5em auto; width: auto; content: 'This box is non-normative. Implementation requirements are given below this box.'; color: black; font-style: italic; border: solid 2px; background: white; padding: 0 0.25em; }
-  </style><link href="data:text/css," id="complete" rel="stylesheet" title="Complete specification"/><link href="data:text/css,.impl%20{%20display:%20none;%20}%0Ahtml%20{%20border:%20solid%20yellow;%20}%20.domintro:before%20{%20display:%20none;%20}" id="author" rel="alternate stylesheet" title="Author documentation only"/><link href="data:text/css,.impl%20{%20background:%20%23FFEEEE;%20}%20.domintro:before%20{%20background:%20%23FFEEEE;%20}" id="highlight" rel="alternate stylesheet" title="Highlight implementation requirements"/><link href="http://www.whatwg.org/specs/web-apps/current-work/status.css" rel="stylesheet"/></head><body class="draft" onload="init()"><header class="head" id="head"><p><a class="logo" href="http://www.whatwg.org/"><img alt="WHATWG" height="101" src="http://www.whatwg.org/images/logo" width="101"/></a></p>
-   <hgroup><h1 class="allcaps">HTML</h1>
-    <h2 class="no-num no-toc">Living Standard — Last Updated 8 August 2011</h2>
-   </hgroup><p class="copyright">© Copyright 2004-2011 Apple Computer, Inc.,
-   Mozilla Foundation, and Opera Software ASA.</p>
-   <p class="copyright">You are granted a license to use, reproduce
-   and create derivative works of this document.</p>
+   @media (max-width: 767px) {
+     #abstractimg { width: 100%; }
+   }
+   #abstractimg, #abstractimg text { font: inherit; }
+   #abstractimg rect { fill: #424242; }
+   #abstractimg text { fill: #ffffff; font-size: 18px }
+   #abstractimg .top { word-spacing: 50px; text-anchor: middle; }
+   #abstractimg .left, #abstractimg .bottom { word-spacing: 12px; }
+   #abstractimg .right { font-size: 25px; }
+  </style></head><body><header class="head with-buttons" id="head">
+   <a class="logo" href="https://whatwg.org/"><img alt="WHATWG" height="100" src="https://resources.whatwg.org/logo.svg" width="100"/></a>
+   <hgroup><h1 class="allcaps">HTML</h1><h2 class="no-num no-toc" id="living-standard">Living Standard — Last Updated <span class="pubdate">31 August 2017</span></h2></hgroup>
+   
+   
 
-  </header><h4 id="the-canvas-element"><span class="secno">4.8.11 </span>The <dfn id="canvas"><code>canvas</code></dfn> element</h4>
+   
+  <p class="copyright">Parts of this specification are © Copyright 2004-2014 Apple Inc., Mozilla Foundation, and Opera Software ASA. You are granted a license to use, reproduce and create derivative works of this document.</p></header><h4 id="the-canvas-element"><span class="secno">4.12.5</span> The <dfn id="canvas"><code>canvas</code></dfn> element<a class="self-link" href="#the-canvas-element"/></h4><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="support"><strong>Support:</strong> canvas<span class="and_chr yes"><span>Chrome for Android</span> <span>59+</span></span><span class="chrome yes"><span>Chrome</span> <span>4+</span></span><span class="and_uc yes"><span>UC Browser for Android</span> <span>11.4+</span></span><span class="ios_saf yes"><span>iOS Safari</span> <span>3.2+</span></span><span class="firefox yes"><span>Firefox</span> <span>3.6+</span></span><span class="ie yes"><span>IE</span> <span>9+</span></span><span class="samsung yes"><span>Samsung Internet</span> <span>4+</span></span><span class="op_mini partial"><span>Opera Mini (limited)</span> <span>all+</span></span><span class="safari yes"><span>Safari</span> <span>4+</span></span><span class="android yes"><span>Android Browser</span> <span>3+</span></span><span class="opera yes"><span>Opera</span> <span>9+</span></span><span class="edge yes"><span>Edge</span> <span>12+</span></span></p><p class="caniuse">Source: <a href="https://caniuse.com/#feat=canvas">caniuse.com</a></p></div>
 
-  <dl class="element"><dt>Categories</dt>
-   <dd><a href="#flow-content">Flow content</a>.</dd>
-   <dd><a href="#phrasing-content">Phrasing content</a>.</dd>
-   <dd><a href="#embedded-content">Embedded content</a>.</dd>
-   <dt>Contexts in which this element can be used:</dt>
-   <dd>Where <a href="#embedded-content">embedded content</a> is expected.</dd>
-   <dt>Content model:</dt>
-   <dd><a href="#transparent">Transparent</a>.</dd>
-   <dd><a href="#transparent">Transparent</a><!--
---><!--FORK--><!--
--->, but with no <a href="#interactive-content">interactive content</a> descendants except for <code><a href="#the-a-element">a</a></code> elements, <code><a href="#the-button-element">button</a></code> elements, <code><a href="#the-input-element">input</a></code> elements whose <code title="attr-input-type"><a href="#attr-input-type">type</a></code> attribute are in the <a href="#checkbox-state" title="attr-input-type-checkbox">Checkbox</a> or <a href="#radio-button-state" title="attr-input-type-radio">Radio Button</a> states, and <code><a href="#the-input-element">input</a></code> elements that are <a href="#concept-button" title="concept-button">buttons</a><!--
---><!--FORK--><!--
--->.</dd> <!-- and maybe <select>, I guess? I've left it in for now, since I guess authors might make accessible selects if they're simple enough, and it's not obvious how to distinguish the simple ones from the complex ones... -->
-   <dt>Content attributes:</dt>
-   <dd><a href="#global-attributes">Global attributes</a></dd>
-   <dd><code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code></dd>
-   <dd><code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code></dd>
-   <dt>DOM interface:</dt>
-   <dd>
-    <pre class="idl">interface <dfn id="htmlcanvaselement">HTMLCanvasElement</dfn> : <a href="#htmlelement">HTMLElement</a> {
-           attribute unsigned long <a href="#dom-canvas-width" title="dom-canvas-width">width</a>;
-           attribute unsigned long <a href="#dom-canvas-height" title="dom-canvas-height">height</a>;
+  <dl class="element"><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-categories" id="the-canvas-element:concept-element-categories">Categories</a>:</dt><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#flow-content-2" id="the-canvas-element:flow-content-2">Flow content</a>.</dd><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#phrasing-content-2" id="the-canvas-element:phrasing-content-2">Phrasing content</a>.</dd><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category">Embedded content</a>.</dd><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#palpable-content-2" id="the-canvas-element:palpable-content-2">Palpable content</a>.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-contexts" id="the-canvas-element:concept-element-contexts">Contexts in which this element can be used</a>:</dt><dd>Where <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-2">embedded content</a> is expected.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-content-model" id="the-canvas-element:concept-element-content-model">Content model</a>:</dt><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#transparent" id="the-canvas-element:transparent">Transparent</a>, but with no <a href="https://html.spec.whatwg.org/multipage/dom.html#interactive-content-2" id="the-canvas-element:interactive-content-2">interactive content</a> descendants except
+   for <code id="the-canvas-element:the-a-element"><a href="https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element">a</a></code> elements, <code id="the-canvas-element:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> elements with
+   <code id="the-canvas-element:attr-hyperlink-usemap"><a href="https://html.spec.whatwg.org/multipage/image-maps.html#attr-hyperlink-usemap">usemap</a></code> attributes, <code id="the-canvas-element:the-button-element"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element">button</a></code> elements,
+   <code id="the-canvas-element:the-input-element"><a href="https://html.spec.whatwg.org/multipage/input.html#the-input-element">input</a></code> elements whose <code id="the-canvas-element:attr-input-type"><a href="https://html.spec.whatwg.org/multipage/input.html#attr-input-type">type</a></code> attribute are in
+   the <a href="https://html.spec.whatwg.org/multipage/input.html#checkbox-state-(type=checkbox)" id="the-canvas-element:checkbox-state-(type=checkbox)">Checkbox</a> or <a href="https://html.spec.whatwg.org/multipage/input.html#radio-button-state-(type=radio)" id="the-canvas-element:radio-button-state-(type=radio)">Radio Button</a> states, <code id="the-canvas-element:the-input-element-2"><a href="https://html.spec.whatwg.org/multipage/input.html#the-input-element">input</a></code> elements that are
+   <a href="https://html.spec.whatwg.org/multipage/forms.html#concept-button" id="the-canvas-element:concept-button">buttons</a>, <code id="the-canvas-element:the-select-element"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element">select</a></code> elements with a <code id="the-canvas-element:attr-select-multiple"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#attr-select-multiple">multiple</a></code> attribute or a <a href="https://html.spec.whatwg.org/multipage/form-elements.html#concept-select-size" id="the-canvas-element:concept-select-size">display size</a> greater than 1, and elements that would not be
+   <a href="https://html.spec.whatwg.org/multipage/dom.html#interactive-content-2" id="the-canvas-element:interactive-content-2-2">interactive content</a> except for having the <code id="the-canvas-element:attr-tabindex"><a href="https://html.spec.whatwg.org/multipage/interaction.html#attr-tabindex">tabindex</a></code> attribute specified.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-tag-omission" id="the-canvas-element:concept-element-tag-omission">Tag omission in text/html</a>:</dt><dd>Neither tag is omissible.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-attributes" id="the-canvas-element:concept-element-attributes">Content attributes</a>:</dt><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#global-attributes" id="the-canvas-element:global-attributes">Global attributes</a></dd><dd><code id="the-canvas-element:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> — Horizontal dimension</dd><dd><code id="the-canvas-element:attr-canvas-height"><a href="#attr-canvas-height">height</a></code> — Vertical dimension</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-dom" id="the-canvas-element:concept-element-dom">DOM interface</a>:</dt><dd>
+    <pre class="idl">typedef (<a href="#canvasrenderingcontext2d" id="the-canvas-element:canvasrenderingcontext2d">CanvasRenderingContext2D</a> or <a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext" id="the-canvas-element:webglrenderingcontext">WebGLRenderingContext</a>) <dfn id="renderingcontext">RenderingContext</dfn>;
 
-  DOMString <a href="#dom-canvas-todataurl" title="dom-canvas-toDataURL">toDataURL</a>(in optional DOMString type, in any... args);
-  void <a href="#dom-canvas-toblob" title="dom-canvas-toBlob">toBlob</a>(in <span>FileCallback</span>? callback, in optional DOMString type, in any... args);
+[Exposed=Window,
+ <a href="https://html.spec.whatwg.org/multipage/dom.html#htmlconstructor" id="the-canvas-element:htmlconstructor">HTMLConstructor</a>]
+interface <dfn id="htmlcanvaselement">HTMLCanvasElement</dfn> : <a href="https://html.spec.whatwg.org/multipage/dom.html#htmlelement" id="the-canvas-element:htmlelement">HTMLElement</a> {
+  [<a href="https://html.spec.whatwg.org/multipage/custom-elements.html#cereactions" id="the-canvas-element:cereactions">CEReactions</a>] attribute unsigned long <a href="#dom-canvas-width" id="the-canvas-element:dom-canvas-width">width</a>;
+  [<a href="https://html.spec.whatwg.org/multipage/custom-elements.html#cereactions" id="the-canvas-element:cereactions-2">CEReactions</a>] attribute unsigned long <a href="#dom-canvas-height" id="the-canvas-element:dom-canvas-height">height</a>;
 
-  object? <a href="#dom-canvas-getcontext" title="dom-canvas-getContext">getContext</a>(in DOMString contextId, in any... args);
-};</pre>
-   </dd>
-  </dl><p>The <code><a href="#the-canvas-element">canvas</a></code> element provides scripts with a
-  resolution-dependent bitmap canvas, which can be used for rendering
-  graphs, game graphics, or other visual images on the fly.</p>
+  <a href="#renderingcontext" id="the-canvas-element:renderingcontext">RenderingContext</a>? <a href="#dom-canvas-getcontext-2" id="the-canvas-element:dom-canvas-getcontext-2">getContext</a>(DOMString contextId, any... arguments);
 
-  <p>Authors should not use the <code><a href="#the-canvas-element">canvas</a></code> element in a
-  document when a more suitable element is available. For example, it
-  is inappropriate to use a <code><a href="#the-canvas-element">canvas</a></code> element to render a
-  page heading: if the desired presentation of the heading is
-  graphically intense, it should be marked up using appropriate
-  elements (typically <code><a href="#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h1</a></code>) and then styled using CSS and
-  supporting technologies such as XBL.</p>
+  USVString <a href="#dom-canvas-todataurl-2" id="the-canvas-element:dom-canvas-todataurl-2">toDataURL</a>(optional DOMString type, optional any quality);
+  void <a href="#dom-canvas-toblob-2" id="the-canvas-element:dom-canvas-toblob-2">toBlob</a>(<a href="#blobcallback" id="the-canvas-element:blobcallback">BlobCallback</a> _callback, optional DOMString type, optional any quality);
+  <a href="#offscreencanvas" id="the-canvas-element:offscreencanvas">OffscreenCanvas</a> <a href="#dom-canvas-transfercontroltooffscreen-2" id="the-canvas-element:dom-canvas-transfercontroltooffscreen-2">transferControlToOffscreen</a>();
+};
 
-  <p>When authors use the <code><a href="#the-canvas-element">canvas</a></code> element, they must also
-  provide content that, when presented to the user, conveys
-  essentially the same function or purpose as the bitmap canvas. This
-  content may be placed as content of the <code><a href="#the-canvas-element">canvas</a></code>
-  element. The contents of the <code><a href="#the-canvas-element">canvas</a></code> element, if any,
-  are the element's <a href="#fallback-content">fallback content</a>.</p>
+callback <dfn id="blobcallback">BlobCallback</dfn> = void (<a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob" id="the-canvas-element:blob">Blob</a>? blob);</pre>
+   </dd></dl>
 
-  <p>In interactive visual media, if <a href="#concept-n-script" title="concept-n-script">scripting is enabled</a> for the
-  <code><a href="#the-canvas-element">canvas</a></code> element, and if support for <code><a href="#the-canvas-element">canvas</a></code>
-  elements has been enabled, the <code><a href="#the-canvas-element">canvas</a></code> element
-  <a href="#represents">represents</a> <a href="#embedded-content">embedded content</a> consisting of
-  a dynamically created image.</p>
+  <p>The <code id="the-canvas-element:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element provides scripts with a resolution-dependent bitmap canvas,
+  which can be used for rendering graphs, game graphics, art, or other visual images on the fly.</p>
 
-  <p>In non-interactive, static, visual media, if the
-  <code><a href="#the-canvas-element">canvas</a></code> element has been previously painted on (e.g. if
-  the page was viewed in an interactive visual medium and is now being
-  printed, or if some script that ran during the page layout process
-  painted on the element), then the <code><a href="#the-canvas-element">canvas</a></code> element
-  <a href="#represents">represents</a> <a href="#embedded-content">embedded content</a> with the
-  current image and size. Otherwise, the element represents its
-  <a href="#fallback-content">fallback content</a> instead.</p>
+  <p>Authors should not use the <code id="the-canvas-element:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element in a document when a more suitable
+  element is available. For example, it is inappropriate to use a <code id="the-canvas-element:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element to
+  render a page heading: if the desired presentation of the heading is graphically intense, it
+  should be marked up using appropriate elements (typically <code id="the-canvas-element:the-h1,-h2,-h3,-h4,-h5,-and-h6-elements"><a href="https://html.spec.whatwg.org/multipage/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h1</a></code>) and then styled using
+  CSS and supporting technologies such as Web Components.</p>
 
-  <p>In non-visual media, and in visual media if <a href="#concept-n-noscript" title="concept-n-noscript">scripting is disabled</a> for the
-  <code><a href="#the-canvas-element">canvas</a></code> element or if support for <code><a href="#the-canvas-element">canvas</a></code>
-  elements has been disabled, the <code><a href="#the-canvas-element">canvas</a></code> element
-  <a href="#represents">represents</a> its <a href="#fallback-content">fallback content</a>
-  instead.</p>
+  <p>When authors use the <code id="the-canvas-element:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element, they must also provide content that, when
+  presented to the user, conveys essentially the same function or purpose as the
+  <code id="the-canvas-element:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code>'s bitmap. This content may be placed as content of the <code id="the-canvas-element:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code>
+  element. The contents of the <code id="the-canvas-element:the-canvas-element-7"><a href="#the-canvas-element">canvas</a></code> element, if any, are the element's <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content">fallback
+  content</a>.</p>
 
-  <!-- CANVAS-FOCUS-FALLBACK -->
-  <p>When a <code><a href="#the-canvas-element">canvas</a></code> element <a href="#represents">represents</a>
-  <a href="#embedded-content">embedded content</a>, the user can still focus descendants
-  of the <code><a href="#the-canvas-element">canvas</a></code> element (in the <a href="#fallback-content">fallback
-  content</a>). When an element is focused, it is the target of
-  keyboard interaction events (even though the element itself is not
-  visible). This allows authors to make an interactive canvas
-  keyboard-accessible: authors should have a one-to-one mapping of
-  interactive regions to focusable elements in the <a href="#fallback-content">fallback
-  content</a>. (Focus has no effect on mouse interaction
-  events.) <a href="#DOMEVENTS">[DOMEVENTS]</a></p>
+  <hr/>
 
-  <p>The <code><a href="#the-canvas-element">canvas</a></code> element has two attributes to control the
-  size of the coordinate space: <dfn id="attr-canvas-width" title="attr-canvas-width"><code>width</code></dfn> and <dfn id="attr-canvas-height" title="attr-canvas-height"><code>height</code></dfn>. These
-  attributes, when specified, must have values that are <a href="#valid-non-negative-integer" title="valid non-negative integer">valid non-negative
-  integers</a>. <span class="impl">The <a href="#rules-for-parsing-non-negative-integers">rules for parsing
-  non-negative integers</a> must be used to obtain their numeric
-  values. If an attribute is missing, or if parsing its value returns
-  an error, then the default value must be used instead.</span> The
-  <code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code> attribute defaults to
-  300, and the <code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code>
-  attribute defaults to 150.</p>
+  <p>In interactive visual media, if <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-n-script" id="the-canvas-element:concept-n-script">scripting is enabled</a> for
+  the <code id="the-canvas-element:the-canvas-element-8"><a href="#the-canvas-element">canvas</a></code> element, and if support for <code id="the-canvas-element:the-canvas-element-9"><a href="#the-canvas-element">canvas</a></code> elements has been enabled,
+  then the <code id="the-canvas-element:the-canvas-element-10"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-3">embedded content</a>
+  consisting of a dynamically created image, the element's bitmap.</p>
 
-  <p>The intrinsic dimensions of the <code><a href="#the-canvas-element">canvas</a></code> element equal
-  the size of the coordinate space, with the numbers interpreted in
-  CSS pixels. However, the element can be sized arbitrarily by a
-  style sheet. During rendering, the image is scaled to fit this layout
-  size.</p>
+  <p>In non-interactive, static, visual media, if the <code id="the-canvas-element:the-canvas-element-11"><a href="#the-canvas-element">canvas</a></code> element has been
+  previously associated with a rendering context (e.g. if the page was viewed in an interactive
+  visual medium and is now being printed, or if some script that ran during the page layout process
+  painted on the element), then the <code id="the-canvas-element:the-canvas-element-12"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-2">represents</a>
+  <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-4">embedded content</a> with the element's current bitmap and size. Otherwise, the element
+  represents its <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-2">fallback content</a> instead.</p>
 
-  <div class="impl">
+  <p>In non-visual media, and in visual media if <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-n-noscript" id="the-canvas-element:concept-n-noscript">scripting is
+  disabled</a> for the <code id="the-canvas-element:the-canvas-element-13"><a href="#the-canvas-element">canvas</a></code> element or if support for <code id="the-canvas-element:the-canvas-element-14"><a href="#the-canvas-element">canvas</a></code> elements
+  has been disabled, the <code id="the-canvas-element:the-canvas-element-15"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-3">represents</a> its <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-3">fallback
+  content</a> instead.</p>
 
-  <p>The size of the coordinate space does not necessarily represent
-  the size of the actual bitmap that the user agent will use
-  internally or during rendering. On high-definition displays, for
-  instance, the user agent may internally use a bitmap with two device
-  pixels per unit in the coordinate space, so that the rendering
-  remains at high quality throughout.</p>
+  
+  <p>When a <code id="the-canvas-element:the-canvas-element-16"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-4">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-5">embedded content</a>, the
+  user can still focus descendants of the <code id="the-canvas-element:the-canvas-element-17"><a href="#the-canvas-element">canvas</a></code> element (in the <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-4">fallback
+  content</a>). When an element is <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="the-canvas-element:focused">focused</a>, it is the target of keyboard interaction
+  events (even though the element itself is not visible). This allows authors to make an interactive
+  canvas keyboard-accessible: authors should have a one-to-one mapping of interactive regions to <i id="the-canvas-element:focusable-area"><a href="https://html.spec.whatwg.org/multipage/interaction.html#focusable-area">focusable areas</a></i> in the <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-5">fallback content</a>. (Focus has no
+  effect on mouse interaction events.) <a href="https://html.spec.whatwg.org/multipage/references.html#refsUIEVENTS">[UIEVENTS]</a></p> 
 
-  <p>When the <code><a href="#the-canvas-element">canvas</a></code> element is created, and subsequently
-  whenever the <code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code> and <code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code> attributes are set (whether
-  to a new value or to the previous value), the bitmap and any
-  associated contexts must be cleared back to their initial state and
-  reinitialized with the newly specified coordinate space
-  dimensions.</p>
+  <p>An element whose nearest <code id="the-canvas-element:the-canvas-element-18"><a href="#the-canvas-element">canvas</a></code> element ancestor is <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="the-canvas-element:being-rendered">being rendered</a>
+  and <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-5">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-6">embedded content</a> is an element that is <dfn id="being-used-as-relevant-canvas-fallback-content">being used as
+  relevant canvas fallback content</dfn>.</p>
 
-  <p>When the canvas is initialized, its bitmap must be cleared to
-  transparent black.</p>
+  <hr/>
 
-  <p>The <dfn id="dom-canvas-width" title="dom-canvas-width"><code>width</code></dfn> and
-  <dfn id="dom-canvas-height" title="dom-canvas-height"><code>height</code></dfn> IDL
-  attributes must <a href="#reflect">reflect</a> the respective content
-  attributes of the same name, with the same defaults.</p>
+  <p>The <code id="the-canvas-element:the-canvas-element-19"><a href="#the-canvas-element">canvas</a></code> element has two attributes to control the size of the element's bitmap:
+  <dfn id="attr-canvas-width"><code>width</code></dfn> and <dfn id="attr-canvas-height"><code>height</code></dfn>. These attributes, when specified, must have
+  values that are <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-non-negative-integer" id="the-canvas-element:valid-non-negative-integer">valid non-negative integers</a>. The <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-non-negative-integers" id="the-canvas-element:rules-for-parsing-non-negative-integers">rules for parsing non-negative integers</a> must be used to obtain their
+  numeric values. If an attribute is missing, or if parsing its value returns an error, then the
+  default value must be used instead. The <code id="the-canvas-element:attr-canvas-width-2"><a href="#attr-canvas-width">width</a></code>
+  attribute defaults to 300, and the <code id="the-canvas-element:attr-canvas-height-2"><a href="#attr-canvas-height">height</a></code> attribute
+  defaults to 150.</p>
 
-  </div>
+  <p>The <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="the-canvas-element:intrinsic-dimensions">intrinsic dimensions</a> of the <code id="the-canvas-element:the-canvas-element-20"><a href="#the-canvas-element">canvas</a></code> element when it
+  <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-6">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-7">embedded content</a> are equal to the dimensions of the
+  element's bitmap.</p>
+
+  <p>The user agent must use a square pixel density consisting of one pixel of image data per
+  coordinate space unit for the bitmaps of a <code id="the-canvas-element:the-canvas-element-21"><a href="#the-canvas-element">canvas</a></code> and its rendering contexts.</p>
+
+  <p class="note">A <code id="the-canvas-element:the-canvas-element-22"><a href="#the-canvas-element">canvas</a></code> element can be sized arbitrarily by a style sheet, its
+  bitmap is then subject to the <a data-x-internal="'object-fit'" href="https://drafts.csswg.org/css-images/#the-object-fit" id="the-canvas-element:'object-fit'">'object-fit'</a> CSS property.</p>
+
+  
+
+  <hr/>
+
+  <p>The bitmaps of <code id="the-canvas-element:the-canvas-element-23"><a href="#the-canvas-element">canvas</a></code> elements, the bitmaps of <code id="the-canvas-element:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> objects,
+  as well as some of the bitmaps of rendering contexts, such as those described in the sections on
+  the <code id="the-canvas-element:canvasrenderingcontext2d-2"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> and <code id="the-canvas-element:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> objects
+  below, have an <dfn id="concept-canvas-origin-clean">origin-clean</dfn> flag, which can be
+  set to true or false. Initially, when the <code id="the-canvas-element:the-canvas-element-24"><a href="#the-canvas-element">canvas</a></code> element or <code id="the-canvas-element:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>
+  object is created, its bitmap's <a href="#concept-canvas-origin-clean" id="the-canvas-element:concept-canvas-origin-clean">origin-clean</a>
+  flag must be set to true.</p>
+
+  <p>A <code id="the-canvas-element:the-canvas-element-25"><a href="#the-canvas-element">canvas</a></code> element can have a rendering context bound to it. Initially, it does not
+  have a bound rendering context. To keep track of whether it has a rendering context or not, and
+  what kind of rendering context it is, a <code id="the-canvas-element:the-canvas-element-26"><a href="#the-canvas-element">canvas</a></code> also has a <dfn id="concept-canvas-context-mode">canvas context mode</dfn>, which is initially <dfn id="concept-canvas-none">none</dfn> but can be changed to either <dfn id="concept-canvas-placeholder">placeholder</dfn>, <dfn id="concept-canvas-2d">2d</dfn>, <dfn id="concept-canvas-bitmaprenderer">bitmaprenderer</dfn>, or <dfn id="concept-canvas-webgl">webgl</dfn> by algorithms defined in this specification.</p>
+
+  <p>When its <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode">canvas context mode</a> is <a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none">none</a>, a <code id="the-canvas-element:the-canvas-element-27"><a href="#the-canvas-element">canvas</a></code> element has no rendering context,
+  and its bitmap must be fully transparent black with an <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="the-canvas-element:intrinsic-width">intrinsic width</a> equal to the
+  numeric value of the element's <code id="the-canvas-element:attr-canvas-width-3"><a href="#attr-canvas-width">width</a></code> attribute and an
+  <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="the-canvas-element:intrinsic-height">intrinsic height</a> equal to the numeric value of the element's <code id="the-canvas-element:attr-canvas-height-3"><a href="#attr-canvas-height">height</a></code> attribute, those values being interpreted in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="the-canvas-element:'px'">CSS pixels</a>, and being updated as the attributes are set, changed, or
+  removed.</p>
+
+  <p>When its <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-2">canvas context mode</a> is <a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder">placeholder</a>, a <code id="the-canvas-element:the-canvas-element-28"><a href="#the-canvas-element">canvas</a></code> element has no
+  rendering context. It serves as a placeholder for an <code id="the-canvas-element:offscreencanvas-2"><a href="#offscreencanvas">OffscreenCanvas</a></code> object, and
+  the content of the <code id="the-canvas-element:the-canvas-element-29"><a href="#the-canvas-element">canvas</a></code> element is updated by calling the <code id="the-canvas-element:offscreencontext-commit"><a href="#offscreencontext-commit">commit()</a></code> method of the <code id="the-canvas-element:offscreencanvas-3"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+  object's rendering context.</p>
+
+  <p>When a <code id="the-canvas-element:the-canvas-element-30"><a href="#the-canvas-element">canvas</a></code> element represents <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-8">embedded content</a>, it provides a
+  <a data-x-internal="paint-source" href="https://drafts.csswg.org/css-images-4/#paint-source" id="the-canvas-element:paint-source">paint source</a> whose width is the element's <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="the-canvas-element:intrinsic-width-2">intrinsic width</a>, whose height
+  is the element's <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="the-canvas-element:intrinsic-height-2">intrinsic height</a>, and whose appearance is the element's bitmap.</p>
+
+  <p>Whenever the <code id="the-canvas-element:attr-canvas-width-4"><a href="#attr-canvas-width">width</a></code> and <code id="the-canvas-element:attr-canvas-height-4"><a href="#attr-canvas-height">height</a></code> content attributes are set, removed, changed, or
+  redundantly set to the value they already have, then the user agent must perform the action
+  from the row of the following table that corresponds to the <code id="the-canvas-element:the-canvas-element-31"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-3">context mode</a>.</p>
+
+  <table><thead><tr><th>
+      <p><a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-4">Context Mode</a></p>
+     </th><th>
+      <p>Action</p>
+
+   </th></tr></thead><tbody><tr><th>
+      <p><a href="#concept-canvas-2d" id="the-canvas-element:concept-canvas-2d">2d</a></p>
+     </th><td>
+      <p>Follow the steps to <a href="#concept-canvas-set-bitmap-dimensions" id="the-canvas-element:concept-canvas-set-bitmap-dimensions">set bitmap
+      dimensions</a> to the numeric values of the <code id="the-canvas-element:attr-canvas-width-5"><a href="#attr-canvas-width">width</a></code>
+      and <code id="the-canvas-element:attr-canvas-height-5"><a href="#attr-canvas-height">height</a></code> content attributes.</p>
+
+    </td></tr><tr><th>
+      <p><a href="#concept-canvas-webgl" id="the-canvas-element:concept-canvas-webgl">webgl</a></p>
+     </th><td>
+      <p>Follow the behavior defined in the WebGL specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+    </td></tr><tr><th>
+      <p><a href="#concept-canvas-bitmaprenderer" id="the-canvas-element:concept-canvas-bitmaprenderer">bitmaprenderer</a></p>
+     </th><td>
+      <p>If the context's <a href="#concept-imagebitmaprenderingcontext-bitmap-mode" id="the-canvas-element:concept-imagebitmaprenderingcontext-bitmap-mode">bitmap
+      mode</a> is set to <a href="#concept-imagebitmaprenderingcontext-blank" id="the-canvas-element:concept-imagebitmaprenderingcontext-blank">blank</a>,
+      run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-canvas-element:set-an-imagebitmaprenderingcontext's-output-bitmap">set an <code>ImageBitmapRenderingContext</code>'s output bitmap</a>,
+      passing the <code id="the-canvas-element:the-canvas-element-32"><a href="#the-canvas-element">canvas</a></code> element's rendering context.</p>
+
+    </td></tr><tr><th>
+      <p><a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder-2">placeholder</a></p>
+     </th><td>
+      <p>Do nothing.</p>
+
+    </td></tr><tr><th>
+      <p><a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none-2">none</a></p>
+     </th><td>
+      <p>Do nothing.</p>
+  </td></tr></tbody></table>
+
+  <p>The <dfn id="dom-canvas-width"><code>width</code></dfn> and <dfn id="dom-canvas-height"><code>height</code></dfn> IDL attributes must <a href="https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#reflect" id="the-canvas-element:reflect">reflect</a> the
+  respective content attributes of the same name, with the same defaults.</p>
+
+  
+
+  <hr/>
+
+  
+  <dl class="domintro"><dt><var>context</var> = <var>canvas</var> . <code id="dom-canvas-getcontext"><a href="#dom-canvas-getcontext-2">getContext</a></code>(<var>contextId</var> [, ... ] )</dt><dd>
+
+    <p>Returns an object that exposes an API for drawing on the canvas. The first argument
+    specifies the desired API, either &quot;<code id="the-canvas-element:canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot;, &quot;<code id="the-canvas-element:canvas-context-bitmaprenderer"><a href="#canvas-context-bitmaprenderer">bitmaprenderer</a></code>&quot; or &quot;<code id="the-canvas-element:canvas-context-webgl"><a href="#canvas-context-webgl">webgl</a></code>&quot;. Subsequent arguments are handled by that API.</p>
+
+    <p>This specification defines the &quot;<code id="the-canvas-element:canvas-context-2d-2"><a href="#canvas-context-2d">2d</a></code>&quot; and &quot;<code id="the-canvas-element:canvas-context-bitmaprenderer-2"><a href="#canvas-context-bitmaprenderer">bitmaprenderer</a></code>&quot; contexts below. There is also a
+    specification that defines a &quot;<code id="the-canvas-element:canvas-context-webgl-2"><a href="#canvas-context-webgl">webgl</a></code>&quot; context.
+    <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+    <p>Returns null if the given context ID is not supported, or if the canvas has already been
+    initialized with another context type (e.g. trying to get a &quot;<code id="the-canvas-element:canvas-context-2d-3"><a href="#canvas-context-2d">2d</a></code>&quot; context after getting a &quot;<code id="the-canvas-element:canvas-context-webgl-3"><a href="#canvas-context-webgl">webgl</a></code>&quot; context).</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-canvas-getcontext-2"><code>getContext(<var>contextId</var>,
+  <var>arguments...</var>)</code></dfn> method of the <code id="the-canvas-element:the-canvas-element-33"><a href="#the-canvas-element">canvas</a></code> element, when invoked,
+  must run the steps in the cell of the following table whose column header describes the
+  <code id="the-canvas-element:the-canvas-element-34"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-5">canvas context
+  mode</a> and whose row header describes the method's first argument.</p>
+
+  <table><thead><tr><td>
+     </td><th><a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none-3">none</a>
+     </th><th><a href="#concept-canvas-2d" id="the-canvas-element:concept-canvas-2d-2">2d</a>
+     </th><th><a href="#concept-canvas-bitmaprenderer" id="the-canvas-element:concept-canvas-bitmaprenderer-2">bitmaprenderer</a>
+     </th><th><a href="#concept-canvas-webgl" id="the-canvas-element:concept-canvas-webgl-2">webgl</a>
+     </th><th><a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder-3">placeholder</a>
+   </th></tr></thead><tbody><tr><th>&quot;<dfn id="canvas-context-2d"><code>2d</code></dfn>&quot;
+     </th><td>
+
+      Follow the <a href="#2d-context-creation-algorithm" id="the-canvas-element:2d-context-creation-algorithm">2D context creation algorithm</a> defined in the section below, passing
+      it the <code id="the-canvas-element:the-canvas-element-35"><a href="#the-canvas-element">canvas</a></code> element and the method's <var>arguments...</var>, to obtain a
+      <code id="the-canvas-element:canvasrenderingcontext2d-3"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object; if this does not throw an exception, then
+      set the <code id="the-canvas-element:the-canvas-element-36"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-6">context
+      mode</a> to <a href="#concept-canvas-2d" id="the-canvas-element:concept-canvas-2d-3">2d</a>, and return the
+      <code id="the-canvas-element:canvasrenderingcontext2d-4"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object.
+
+     </td><td>
+      Return the same object as was returned the last time the method was invoked with this same
+      first argument.
+     </td><td>
+      Return null.
+     </td><td>
+      Return null.
+     </td><td>
+      Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+    </td></tr><tr><th>&quot;<dfn id="canvas-context-bitmaprenderer"><code>bitmaprenderer</code></dfn>&quot;
+     </th><td>
+
+      Follow the <a href="#imagebitmaprenderingcontext-creation-algorithm" id="the-canvas-element:imagebitmaprenderingcontext-creation-algorithm"><code>ImageBitmapRenderingContext</code> creation algorithm</a> defined
+      in the section below, passing it the <code id="the-canvas-element:the-canvas-element-37"><a href="#the-canvas-element">canvas</a></code> element and the method's
+      <var>arguments...</var>, to obtain an <code id="the-canvas-element:imagebitmaprenderingcontext-2"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object; then
+      set the <code id="the-canvas-element:the-canvas-element-38"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-7">context
+      mode</a> to <a href="#concept-canvas-bitmaprenderer" id="the-canvas-element:concept-canvas-bitmaprenderer-3">bitmaprenderer</a>, and return the
+      <code id="the-canvas-element:imagebitmaprenderingcontext-3"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object.
+
+     </td><td>
+      Return null.
+     </td><td>
+      Return the same object as was returned the last time the method was invoked with this same
+      first argument.
+     </td><td>
+      Return null.
+     </td><td>
+      Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+    </td></tr><tr><th>&quot;<dfn id="canvas-context-webgl"><code>webgl</code></dfn>&quot;, if the user agent supports the WebGL feature in its current configuration
+     </th><td>
+
+      Follow the instructions given in the WebGL specification's <i>Context Creation</i> section to
+      obtain either a <code id="the-canvas-element:webglrenderingcontext-2"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code> or null; if the returned value is null,
+      then return null and abort these steps, otherwise, set the <code id="the-canvas-element:the-canvas-element-39"><a href="#the-canvas-element">canvas</a></code> element's
+      <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-8">context mode</a> to <a href="#concept-canvas-webgl" id="the-canvas-element:concept-canvas-webgl-3">webgl</a>, and return the <code id="the-canvas-element:webglrenderingcontext-3"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code>
+      object <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a>
+
+     </td><td>
+      Return null.
+     </td><td>
+      Return null.
+     </td><td>
+      Return the same object as was returned the last time the method was invoked with this same
+      first argument.
+     </td><td>
+      Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-3">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+    </td></tr><tr><th>An unsupported value*
+     </th><td>
+      Return null.
+     </td><td>
+      Return null.
+     </td><td>
+      Return null.
+     </td><td>
+      Return null.
+     </td><td>
+      Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-4">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+  </td></tr></tbody></table>
+
+  <p class="tablenote"><small>* For example, the &quot;<code id="the-canvas-element:canvas-context-webgl-4"><a href="#canvas-context-webgl">webgl</a></code>&quot;
+  value in the case of a user agent having exhausted the graphics hardware's abilities and having no
+  software fallback implementation.</small></p>
+
+  <hr/>
+
+  
+
+  <dl class="domintro"><dt><var>url</var> = <var>canvas</var> . <code id="dom-canvas-todataurl"><a href="#dom-canvas-todataurl-2">toDataURL</a></code>( [ <var>type</var> [, <var>quality</var> ] ] )</dt><dd>
+
+    <p>Returns a <a data-x-internal="data-protocol" href="https://tools.ietf.org/html/rfc2397#section-2" id="the-canvas-element:data-protocol"><code>data:</code> URL</a> for the image in the
+    canvas.</p>
+
+    <p>The first argument, if provided, controls the type of the image to be returned (e.g. PNG or
+    JPEG). The default is &quot;<code id="the-canvas-element:image/png"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;; that type is also used if the given type isn't
+    supported. The second argument applies if the type is an image format that supports variable
+    quality (such as &quot;<code id="the-canvas-element:image/jpeg"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;), and is a number in the range 0.0 to 1.0 inclusive
+    indicating the desired quality level for the resulting image.</p>
+
+    <p>When trying to use types other than &quot;<code id="the-canvas-element:image/png-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;, authors can check if the image
+    was really returned in the requested format by checking to see if the returned string starts
+    with one of the exact strings &quot;<code>data:image/png,</code>&quot; or &quot;<code>data:image/png;</code>&quot;. If it does, the image is PNG, and thus the requested type was
+    not supported. (The one exception to this is if the canvas has either no height or no width, in
+    which case the result might simply be &quot;<code>data:,</code>&quot;.)</p>
+
+   </dd><dt><var>canvas</var> . <code id="dom-canvas-toblob"><a href="#dom-canvas-toblob-2">toBlob</a></code>(<var>callback</var> [, <var>type</var> [, quality ] ] )</dt><dd>
+
+    <p>Creates a <code id="the-canvas-element:blob-2"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object representing a file containing the image in the canvas,
+    and invokes a callback with a handle to that object.</p>
+
+    <p>The second argument, if provided, controls the type of the image to be returned (e.g. PNG or
+    JPEG). The default is &quot;<code id="the-canvas-element:image/png-3"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;; that type is also used if the given type isn't
+    supported. The third argument applies if the type is an image format that supports variable
+    quality (such as &quot;<code id="the-canvas-element:image/jpeg-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;), and is a number in the range 0.0 to 1.0 inclusive
+    indicating the desired quality level for the resulting image.</p>
+
+   </dd><dt><var>canvas</var> . <code id="dom-canvas-transfercontroltooffscreen"><a href="#dom-canvas-transfercontroltooffscreen-2">transferControlToOffscreen</a></code>()</dt><dd>
+    <p>Returns a newly created <code id="the-canvas-element:offscreencanvas-4"><a href="#offscreencanvas">OffscreenCanvas</a></code> object that uses the
+    <code id="the-canvas-element:the-canvas-element-40"><a href="#the-canvas-element">canvas</a></code> element as a placeholder. Once the <code id="the-canvas-element:the-canvas-element-41"><a href="#the-canvas-element">canvas</a></code> element has become a
+    placeholder for an <code id="the-canvas-element:offscreencanvas-5"><a href="#offscreencanvas">OffscreenCanvas</a></code> object, its intrinsic size can no longer be
+    changed, and it cannot have a rendering context. The content of the placeholder canvas is
+    updated by calling the <code id="the-canvas-element:offscreencontext-commit-2"><a href="#offscreencontext-commit">commit()</a></code> method of the
+    <code id="the-canvas-element:offscreencanvas-6"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's rendering context.
+    </p>
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-canvas-todataurl-2"><code>toDataURL(<var>type</var>,
+  <var>quality</var>)</code></dfn> method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If this <code id="the-canvas-element:the-canvas-element-42"><a href="#the-canvas-element">canvas</a></code> element's bitmap's <a href="#concept-canvas-origin-clean" id="the-canvas-element:concept-canvas-origin-clean-2">origin-clean</a> flag is set to false, then throw a
+   <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="the-canvas-element:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="the-canvas-element:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p>
+
+
+   </li><li><p>If this <code id="the-canvas-element:the-canvas-element-43"><a href="#the-canvas-element">canvas</a></code> element's bitmap has no pixels (i.e. either its horizontal
+   dimension or its vertical dimension is zero) then return the string &quot;<code>data:,</code>&quot; and abort these steps. (This is the shortest <a data-x-internal="data-protocol" href="https://tools.ietf.org/html/rfc2397#section-2" id="the-canvas-element:data-protocol-2"><code>data:</code> URL</a>; it represents the empty string in a <code>text/plain</code> resource.)</p></li><li><p>Let <var>file</var> be <a href="#a-serialisation-of-the-bitmap-as-a-file" id="the-canvas-element:a-serialisation-of-the-bitmap-as-a-file">a
+   serialization of this <code>canvas</code> element's bitmap as a file</a>, passing
+   <var>type</var> and <var>quality</var> if they were given.</p></li><li><p>If <var>file</var> is null then return &quot;<code>data:,</code>&quot;.</p></li><li><p>Return a <a data-x-internal="data-protocol" href="https://tools.ietf.org/html/rfc2397#section-2" id="the-canvas-element:data-protocol-3"><code>data:</code> URL</a> representing
+   <var>file</var>. <a href="https://html.spec.whatwg.org/multipage/references.html#refsRFC2397">[RFC2397]</a></p>
+
+   
+
+  </li></ol>
+
+  <p>The <dfn id="dom-canvas-toblob-2"><code>toBlob(<var>callback</var>, <var>type</var>,
+  <var>quality</var>)</code></dfn> method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If this <code id="the-canvas-element:the-canvas-element-44"><a href="#the-canvas-element">canvas</a></code> element's bitmap's <a href="#concept-canvas-origin-clean" id="the-canvas-element:concept-canvas-origin-clean-3">origin-clean</a> flag is set to false, then throw a
+   <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="the-canvas-element:securityerror-2">&quot;<code>SecurityError</code>&quot;</a> <code id="the-canvas-element:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p>
+
+
+   </li><li>
+    <p>If this <code id="the-canvas-element:the-canvas-element-45"><a href="#the-canvas-element">canvas</a></code> element's bitmap has no pixels (i.e. either its horizontal
+    dimension or its vertical dimension is zero) then let <var>result</var> be null.</p>
+
+    <p>Otherwise, let <var>result</var> be a <code id="the-canvas-element:blob-3"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object representing <a href="#a-serialisation-of-the-bitmap-as-a-file" id="the-canvas-element:a-serialisation-of-the-bitmap-as-a-file-2">a serialization of this <code>canvas</code> element's
+    bitmap as a file</a>, passing <var>type</var> and <var>quality</var> if they were given. <a href="https://html.spec.whatwg.org/multipage/references.html#refsFILEAPI">[FILEAPI]</a></p>
+   </li><li><p>Return, but continue running these steps <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel" id="the-canvas-element:in-parallel">in parallel</a>.</p></li><li><p><a href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="the-canvas-element:queue-a-task">Queue a task</a> to <a data-x-internal="es-invoking-callback-functions" href="https://heycam.github.io/webidl/#invoke-a-callback-function" id="the-canvas-element:es-invoking-callback-functions">invoke</a>
+   the <code id="the-canvas-element:blobcallback-2"><a href="#blobcallback">BlobCallback</a></code> <var>callback</var> with <var>result</var> as its argument. The
+   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#task-source" id="the-canvas-element:task-source">task source</a> for this task is the
+   <dfn id="canvas-blob-serialisation-task-source">canvas blob serialization task
+   source</dfn>.</p></li></ol>
+
+  <p>The <dfn id="dom-canvas-transfercontroltooffscreen-2"><code>transferControlToOffscreen()</code></dfn> method,
+  when invoked, must run these steps:</p>
+
+  <ol><li><p>If this <code id="the-canvas-element:the-canvas-element-46"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-9">context
+   mode</a> is not set to <a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none-4">none</a>, throw an
+   <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-5">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+   steps.</p></li><li><p>Let <var>offscreenCanvas</var> be a new <code id="the-canvas-element:offscreencanvas-7"><a href="#offscreencanvas">OffscreenCanvas</a></code> object with its
+   width and height equal to the values of the <code id="the-canvas-element:attr-canvas-width-6"><a href="#attr-canvas-width">width</a></code>
+   and <code id="the-canvas-element:attr-canvas-height-6"><a href="#attr-canvas-height">height</a></code> content attributes of this
+   <code id="the-canvas-element:the-canvas-element-47"><a href="#the-canvas-element">canvas</a></code> element.</p></li><li><p>Set the <a href="#offscreencanvas-placeholder" id="the-canvas-element:offscreencanvas-placeholder">placeholder <code>canvas</code>
+   element</a> of <var>offscreenCanvas</var> to be a weak reference to this <code id="the-canvas-element:the-canvas-element-48"><a href="#the-canvas-element">canvas</a></code>
+   element.</p></li><li><p>Set this <code id="the-canvas-element:the-canvas-element-49"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-10">context
+   mode</a> to <a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder-4">placeholder</a>.</p></li><li><p>Return <var>offscreenCanvas</var>.</p></li></ol>
+
+  
+
+  
+
+  <h5 id="2dcontext"><span class="secno">4.12.5.1</span> The 2D rendering context<a class="self-link" href="#2dcontext"/></h5>
+
+  
+
+  <pre class="idl">typedef (<a href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlimageelement" id="2dcontext:htmlimageelement">HTMLImageElement</a> or
+         <a data-x-internal="svgimageelement" href="https://www.w3.org/TR/SVG11/struct.html#InterfaceSVGImageElement" id="2dcontext:svgimageelement">SVGImageElement</a>) <dfn id="htmlorsvgimageelement">HTMLOrSVGImageElement</dfn>;
+
+typedef (<a href="#htmlorsvgimageelement" id="2dcontext:htmlorsvgimageelement">HTMLOrSVGImageElement</a> or
+         <a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement" id="2dcontext:htmlvideoelement">HTMLVideoElement</a> or
+         <a href="#htmlcanvaselement" id="2dcontext:htmlcanvaselement">HTMLCanvasElement</a> or
+         <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap" id="2dcontext:imagebitmap">ImageBitmap</a> or
+         <a href="#offscreencanvas" id="2dcontext:offscreencanvas">OffscreenCanvas</a>) <dfn id="canvasimagesource">CanvasImageSource</dfn>;
+
+enum <dfn id="canvasfillrule">CanvasFillRule</dfn> { &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero">nonzero</a>&quot;, &quot;<a href="#dom-context-2d-fillrule-evenodd" id="2dcontext:dom-context-2d-fillrule-evenodd">evenodd</a>&quot; };
+
+dictionary <dfn id="canvasrenderingcontext2dsettings">CanvasRenderingContext2DSettings</dfn> {
+  boolean <a href="#dom-canvasrenderingcontext2dsettings-alpha" id="2dcontext:dom-canvasrenderingcontext2dsettings-alpha">alpha</a> = true;
+};
+
+enum <dfn id="imagesmoothingquality">ImageSmoothingQuality</dfn> { &quot;<a href="#dom-context-2d-imagesmoothingquality-low" id="2dcontext:dom-context-2d-imagesmoothingquality-low">low</a>&quot;, &quot;<a href="#dom-context-2d-imagesmoothingquality-medium" id="2dcontext:dom-context-2d-imagesmoothingquality-medium">medium</a>&quot;, &quot;<a href="#dom-context-2d-imagesmoothingquality-high" id="2dcontext:dom-context-2d-imagesmoothingquality-high">high</a>&quot; };
+
+interface <dfn id="canvasrenderingcontext2d">CanvasRenderingContext2D</dfn> {
+  // back-reference to the canvas
+  readonly attribute <a href="#htmlcanvaselement" id="2dcontext:htmlcanvaselement-2">HTMLCanvasElement</a> <a href="#dom-context-2d-canvas-2" id="2dcontext:dom-context-2d-canvas-2">canvas</a>;
+};
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d">CanvasRenderingContext2D</a> implements <a href="#canvasstate" id="2dcontext:canvasstate">CanvasState</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-2">CanvasRenderingContext2D</a> implements <a href="#canvastransform" id="2dcontext:canvastransform">CanvasTransform</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-3">CanvasRenderingContext2D</a> implements <a href="#canvascompositing" id="2dcontext:canvascompositing">CanvasCompositing</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-4">CanvasRenderingContext2D</a> implements <a href="#canvasimagesmoothing" id="2dcontext:canvasimagesmoothing">CanvasImageSmoothing</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-5">CanvasRenderingContext2D</a> implements <a href="#canvasfillstrokestyles" id="2dcontext:canvasfillstrokestyles">CanvasFillStrokeStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-6">CanvasRenderingContext2D</a> implements <a href="#canvasshadowstyles" id="2dcontext:canvasshadowstyles">CanvasShadowStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-7">CanvasRenderingContext2D</a> implements <a href="#canvasfilters" id="2dcontext:canvasfilters">CanvasFilters</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-8">CanvasRenderingContext2D</a> implements <a href="#canvasrect" id="2dcontext:canvasrect">CanvasRect</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-9">CanvasRenderingContext2D</a> implements <a href="#canvasdrawpath" id="2dcontext:canvasdrawpath">CanvasDrawPath</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-10">CanvasRenderingContext2D</a> implements <a href="#canvasuserinterface" id="2dcontext:canvasuserinterface">CanvasUserInterface</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-11">CanvasRenderingContext2D</a> implements <a href="#canvastext" id="2dcontext:canvastext">CanvasText</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-12">CanvasRenderingContext2D</a> implements <a href="#canvasdrawimage" id="2dcontext:canvasdrawimage">CanvasDrawImage</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-13">CanvasRenderingContext2D</a> implements <a href="#canvasimagedata" id="2dcontext:canvasimagedata">CanvasImageData</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-14">CanvasRenderingContext2D</a> implements <a href="#canvaspathdrawingstyles" id="2dcontext:canvaspathdrawingstyles">CanvasPathDrawingStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-15">CanvasRenderingContext2D</a> implements <a href="#canvastextdrawingstyles" id="2dcontext:canvastextdrawingstyles">CanvasTextDrawingStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-16">CanvasRenderingContext2D</a> implements <a href="#canvaspath" id="2dcontext:canvaspath">CanvasPath</a>;
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasstate">CanvasState</dfn> {
+  // state
+  void <a href="#dom-context-2d-save-2" id="2dcontext:dom-context-2d-save-2">save</a>(); // push state on state stack
+  void <a href="#dom-context-2d-restore-2" id="2dcontext:dom-context-2d-restore-2">restore</a>(); // pop state stack and restore state
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvastransform">CanvasTransform</dfn> {
+  // transformations (default transform is the identity matrix)
+  void <a href="#dom-context-2d-scale-2" id="2dcontext:dom-context-2d-scale-2">scale</a>(unrestricted double x, unrestricted double y);
+  void <a href="#dom-context-2d-rotate-2" id="2dcontext:dom-context-2d-rotate-2">rotate</a>(unrestricted double angle);
+  void <a href="#dom-context-2d-translate-2" id="2dcontext:dom-context-2d-translate-2">translate</a>(unrestricted double x, unrestricted double y);
+  void <a href="#dom-context-2d-transform-2" id="2dcontext:dom-context-2d-transform-2">transform</a>(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
+
+  [NewObject] <a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix" id="2dcontext:dommatrix">DOMMatrix</a> <a href="#dom-context-2d-gettransform-2" id="2dcontext:dom-context-2d-gettransform-2">getTransform</a>();
+  void <a href="#dom-context-2d-settransform-2" id="2dcontext:dom-context-2d-settransform-2">setTransform</a>(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
+  void <a href="#dom-context-2d-settransform-2" id="2dcontext:dom-context-2d-settransform-2-2">setTransform</a>(optional <a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit" id="2dcontext:dommatrix2dinit">DOMMatrix2DInit</a> transform);
+  void <a href="#dom-context-2d-resettransform-2" id="2dcontext:dom-context-2d-resettransform-2">resetTransform</a>();
+
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvascompositing">CanvasCompositing</dfn> {
+  // compositing
+  attribute unrestricted double <a href="#dom-context-2d-globalalpha-2" id="2dcontext:dom-context-2d-globalalpha-2">globalAlpha</a>; // (default 1.0)
+  attribute DOMString <a href="#dom-context-2d-globalcompositeoperation-2" id="2dcontext:dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a>; // (default source-over)
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasimagesmoothing">CanvasImageSmoothing</dfn> {
+  // image smoothing
+  attribute boolean <a href="#dom-context-2d-imagesmoothingenabled-2" id="2dcontext:dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a>; // (default true)
+  attribute <a href="#imagesmoothingquality" id="2dcontext:imagesmoothingquality">ImageSmoothingQuality</a> <a href="#dom-context-2d-imagesmoothingquality-2" id="2dcontext:dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a>; // (default low)
+
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasfillstrokestyles">CanvasFillStrokeStyles</dfn> {
+  // colors and styles (see also the <a href="#canvaspathdrawingstyles" id="2dcontext:canvaspathdrawingstyles-2">CanvasPathDrawingStyles</a> and <a href="#canvastextdrawingstyles" id="2dcontext:canvastextdrawingstyles-2">CanvasTextDrawingStyles</a> interfaces)
+  attribute (DOMString or CanvasGradient or CanvasPattern) <a href="#dom-context-2d-strokestyle-2" id="2dcontext:dom-context-2d-strokestyle-2">strokeStyle</a>; // (default black)
+  attribute (DOMString or CanvasGradient or CanvasPattern) <a href="#dom-context-2d-fillstyle-2" id="2dcontext:dom-context-2d-fillstyle-2">fillStyle</a>; // (default black)
+  <a href="#canvasgradient" id="2dcontext:canvasgradient">CanvasGradient</a> <a href="#dom-context-2d-createlineargradient-2" id="2dcontext:dom-context-2d-createlineargradient-2">createLinearGradient</a>(double x0, double y0, double x1, double y1);
+  <a href="#canvasgradient" id="2dcontext:canvasgradient-2">CanvasGradient</a> <a href="#dom-context-2d-createradialgradient-2" id="2dcontext:dom-context-2d-createradialgradient-2">createRadialGradient</a>(double x0, double y0, double r0, double x1, double y1, double r1);
+  <a href="#canvaspattern" id="2dcontext:canvaspattern">CanvasPattern</a>? <a href="#dom-context-2d-createpattern-2" id="2dcontext:dom-context-2d-createpattern-2">createPattern</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource">CanvasImageSource</a> image, [TreatNullAs=EmptyString] DOMString repetition);
+
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasshadowstyles">CanvasShadowStyles</dfn> {
+  // shadows
+  attribute unrestricted double <a href="#dom-context-2d-shadowoffsetx-2" id="2dcontext:dom-context-2d-shadowoffsetx-2">shadowOffsetX</a>; // (default 0)
+  attribute unrestricted double <a href="#dom-context-2d-shadowoffsety-2" id="2dcontext:dom-context-2d-shadowoffsety-2">shadowOffsetY</a>; // (default 0)
+  attribute unrestricted double <a href="#dom-context-2d-shadowblur-2" id="2dcontext:dom-context-2d-shadowblur-2">shadowBlur</a>; // (default 0)
+  attribute DOMString <a href="#dom-context-2d-shadowcolor-2" id="2dcontext:dom-context-2d-shadowcolor-2">shadowColor</a>; // (default transparent black)
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasfilters">CanvasFilters</dfn> {
+  // filters
+  attribute DOMString <a href="#dom-context-2d-filter" id="2dcontext:dom-context-2d-filter">filter</a>; // (default &quot;none&quot;)
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasrect">CanvasRect</dfn> {
+  // rects
+  void <a href="#dom-context-2d-clearrect-2" id="2dcontext:dom-context-2d-clearrect-2">clearRect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+  void <a href="#dom-context-2d-fillrect-2" id="2dcontext:dom-context-2d-fillrect-2">fillRect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+  void <a href="#dom-context-2d-strokerect-2" id="2dcontext:dom-context-2d-strokerect-2">strokeRect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasdrawpath">CanvasDrawPath</dfn> {
+  // path API (see also <a href="#canvaspath" id="2dcontext:canvaspath-2">CanvasPath</a>)
+  void <a href="#dom-context-2d-beginpath-2" id="2dcontext:dom-context-2d-beginpath-2">beginPath</a>();
+  void <a href="#dom-context-2d-fill-2" id="2dcontext:dom-context-2d-fill-2">fill</a>(optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-2">nonzero</a>&quot;);
+  void <a href="#dom-context-2d-fill-2" id="2dcontext:dom-context-2d-fill-2-2">fill</a>(<a href="#path2d" id="2dcontext:path2d">Path2D</a> path, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-2">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-3">nonzero</a>&quot;);
+  void <a href="#dom-context-2d-stroke-2" id="2dcontext:dom-context-2d-stroke-2">stroke</a>();
+  void <a href="#dom-context-2d-stroke-2" id="2dcontext:dom-context-2d-stroke-2-2">stroke</a>(<a href="#path2d" id="2dcontext:path2d-2">Path2D</a> path);
+  void <a href="#dom-context-2d-clip-2" id="2dcontext:dom-context-2d-clip-2">clip</a>(optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-3">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-4">nonzero</a>&quot;);
+  void <a href="#dom-context-2d-clip-2" id="2dcontext:dom-context-2d-clip-2-2">clip</a>(<a href="#path2d" id="2dcontext:path2d-3">Path2D</a> path, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-4">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-5">nonzero</a>&quot;);
+  void <a href="#dom-context-2d-resetclip-2" id="2dcontext:dom-context-2d-resetclip-2">resetClip</a>();
+  boolean <a href="#dom-context-2d-ispointinpath-2" id="2dcontext:dom-context-2d-ispointinpath-2">isPointInPath</a>(unrestricted double x, unrestricted double y, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-5">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-6">nonzero</a>&quot;);
+  boolean <a href="#dom-context-2d-ispointinpath-2" id="2dcontext:dom-context-2d-ispointinpath-2-2">isPointInPath</a>(<a href="#path2d" id="2dcontext:path2d-4">Path2D</a> path, unrestricted double x, unrestricted double y, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-6">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-7">nonzero</a>&quot;);
+  boolean <a href="#dom-context-2d-ispointinstroke-2" id="2dcontext:dom-context-2d-ispointinstroke-2">isPointInStroke</a>(unrestricted double x, unrestricted double y);
+  boolean <a href="#dom-context-2d-ispointinstroke-2" id="2dcontext:dom-context-2d-ispointinstroke-2-2">isPointInStroke</a>(<a href="#path2d" id="2dcontext:path2d-5">Path2D</a> path, unrestricted double x, unrestricted double y);
+};
+
+[Exposed=Window,
+ NoInterfaceObject]
+interface <dfn id="canvasuserinterface">CanvasUserInterface</dfn> {
+  void <a href="#dom-context-2d-drawfocusifneeded-2" id="2dcontext:dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded</a>(<a data-x-internal="element" href="https://dom.spec.whatwg.org/#interface-element" id="2dcontext:element">Element</a> element);
+  void <a href="#dom-context-2d-drawfocusifneeded-2" id="2dcontext:dom-context-2d-drawfocusifneeded-2-2">drawFocusIfNeeded</a>(<a href="#path2d" id="2dcontext:path2d-6">Path2D</a> path, <a data-x-internal="element" href="https://dom.spec.whatwg.org/#interface-element" id="2dcontext:element-2">Element</a> element);
+  void <a href="#dom-context-2d-scrollpathintoview-2" id="2dcontext:dom-context-2d-scrollpathintoview-2">scrollPathIntoView</a>();
+  void <a href="#dom-context-2d-scrollpathintoview-2" id="2dcontext:dom-context-2d-scrollpathintoview-2-2">scrollPathIntoView</a>(<a href="#path2d" id="2dcontext:path2d-7">Path2D</a> path);
+};
+
+[Exposed=Window,
+ NoInterfaceObject]
+interface <dfn id="canvastext">CanvasText</dfn> {
+  // text (see also the <a href="#canvaspathdrawingstyles" id="2dcontext:canvaspathdrawingstyles-3">CanvasPathDrawingStyles</a> and <a href="#canvastextdrawingstyles" id="2dcontext:canvastextdrawingstyles-3">CanvasTextDrawingStyles</a> interfaces)
+  void <a href="#dom-context-2d-filltext-2" id="2dcontext:dom-context-2d-filltext-2">fillText</a>(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
+  void <a href="#dom-context-2d-stroketext-2" id="2dcontext:dom-context-2d-stroketext-2">strokeText</a>(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
+  <a href="#textmetrics" id="2dcontext:textmetrics">TextMetrics</a> <a href="#dom-context-2d-measuretext-2" id="2dcontext:dom-context-2d-measuretext-2">measureText</a>(DOMString text);
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasdrawimage">CanvasDrawImage</dfn> {
+  // drawing images
+  void <a href="#dom-context-2d-drawimage" id="2dcontext:dom-context-2d-drawimage">drawImage</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource-2">CanvasImageSource</a> image, unrestricted double dx, unrestricted double dy);
+  void <a href="#dom-context-2d-drawimage" id="2dcontext:dom-context-2d-drawimage-2">drawImage</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource-3">CanvasImageSource</a> image, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
+  void <a href="#dom-context-2d-drawimage" id="2dcontext:dom-context-2d-drawimage-3">drawImage</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource-4">CanvasImageSource</a> image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasimagedata">CanvasImageData</dfn> {
+  // <a href="#pixel-manipulation" id="2dcontext:pixel-manipulation">pixel manipulation</a>
+  <a href="#imagedata" id="2dcontext:imagedata">ImageData</a> <a href="#dom-context-2d-createimagedata-2" id="2dcontext:dom-context-2d-createimagedata-2">createImageData</a>(long sw, long sh);
+  <a href="#imagedata" id="2dcontext:imagedata-2">ImageData</a> <a href="#dom-context-2d-createimagedata-2" id="2dcontext:dom-context-2d-createimagedata-2-2">createImageData</a>(<a href="#imagedata" id="2dcontext:imagedata-3">ImageData</a> imagedata);
+  <a href="#imagedata" id="2dcontext:imagedata-4">ImageData</a> <a href="#dom-context-2d-getimagedata-2" id="2dcontext:dom-context-2d-getimagedata-2">getImageData</a>(long sx, long sy, long sw, long sh);
+  void <a href="#dom-context-2d-putimagedata-2" id="2dcontext:dom-context-2d-putimagedata-2">putImageData</a>(<a href="#imagedata" id="2dcontext:imagedata-5">ImageData</a> imagedata, long dx, long dy);
+  void <a href="#dom-context-2d-putimagedata-2" id="2dcontext:dom-context-2d-putimagedata-2-2">putImageData</a>(<a href="#imagedata" id="2dcontext:imagedata-6">ImageData</a> imagedata, long dx, long dy, long dirtyX, long dirtyY, long dirtyWidth, long dirtyHeight);
+};
+
+enum <dfn id="canvaslinecap">CanvasLineCap</dfn> { &quot;butt&quot;, &quot;round&quot;, &quot;square&quot; };
+enum <dfn id="canvaslinejoin">CanvasLineJoin</dfn> { &quot;round&quot;, &quot;bevel&quot;, &quot;miter&quot; };
+enum <dfn id="canvastextalign">CanvasTextAlign</dfn> { &quot;<a href="#dom-context-2d-textalign-start" id="2dcontext:dom-context-2d-textalign-start">start</a>&quot;, &quot;<a href="#dom-context-2d-textalign-end" id="2dcontext:dom-context-2d-textalign-end">end</a>&quot;, &quot;<a href="#dom-context-2d-textalign-left" id="2dcontext:dom-context-2d-textalign-left">left</a>&quot;, &quot;<a href="#dom-context-2d-textalign-right" id="2dcontext:dom-context-2d-textalign-right">right</a>&quot;, &quot;<a href="#dom-context-2d-textalign-center" id="2dcontext:dom-context-2d-textalign-center">center</a>&quot; };
+enum <dfn id="canvastextbaseline">CanvasTextBaseline</dfn> { &quot;<a href="#dom-context-2d-textbaseline-top" id="2dcontext:dom-context-2d-textbaseline-top">top</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-hanging" id="2dcontext:dom-context-2d-textbaseline-hanging">hanging</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-middle" id="2dcontext:dom-context-2d-textbaseline-middle">middle</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-alphabetic" id="2dcontext:dom-context-2d-textbaseline-alphabetic">alphabetic</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-ideographic" id="2dcontext:dom-context-2d-textbaseline-ideographic">ideographic</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-bottom" id="2dcontext:dom-context-2d-textbaseline-bottom">bottom</a>&quot; };
+enum <dfn id="canvasdirection">CanvasDirection</dfn> { &quot;<a href="#dom-context-2d-direction-ltr" id="2dcontext:dom-context-2d-direction-ltr">ltr</a>&quot;, &quot;<a href="#dom-context-2d-direction-rtl" id="2dcontext:dom-context-2d-direction-rtl">rtl</a>&quot;, &quot;<a href="#dom-context-2d-direction-inherit" id="2dcontext:dom-context-2d-direction-inherit">inherit</a>&quot; };
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvaspathdrawingstyles">CanvasPathDrawingStyles</dfn> {
+  // line caps/joins
+  attribute unrestricted double <a href="#dom-context-2d-linewidth-2" id="2dcontext:dom-context-2d-linewidth-2">lineWidth</a>; // (default 1)
+  attribute <a href="#canvaslinecap" id="2dcontext:canvaslinecap">CanvasLineCap</a> <a href="#dom-context-2d-linecap-2" id="2dcontext:dom-context-2d-linecap-2">lineCap</a>; // (default &quot;butt&quot;)
+  attribute <a href="#canvaslinejoin" id="2dcontext:canvaslinejoin">CanvasLineJoin</a> <a href="#dom-context-2d-linejoin-2" id="2dcontext:dom-context-2d-linejoin-2">lineJoin</a>; // (default &quot;miter&quot;)
+  attribute unrestricted double <a href="#dom-context-2d-miterlimit-2" id="2dcontext:dom-context-2d-miterlimit-2">miterLimit</a>; // (default 10)
+
+  // dashed lines
+  void <a href="#dom-context-2d-setlinedash-2" id="2dcontext:dom-context-2d-setlinedash-2">setLineDash</a>(sequence&lt;unrestricted double&gt; segments); // default empty
+  sequence&lt;unrestricted double&gt; <a href="#dom-context-2d-getlinedash-2" id="2dcontext:dom-context-2d-getlinedash-2">getLineDash</a>();
+  attribute unrestricted double <a href="#dom-context-2d-linedashoffset-2" id="2dcontext:dom-context-2d-linedashoffset-2">lineDashOffset</a>;
+};
+
+[Exposed=Window,
+ NoInterfaceObject]
+interface <dfn id="canvastextdrawingstyles">CanvasTextDrawingStyles</dfn> {
+  // text
+  attribute DOMString <a href="#dom-context-2d-font-2" id="2dcontext:dom-context-2d-font-2">font</a>; // (default 10px sans-serif)
+  attribute <a href="#canvastextalign" id="2dcontext:canvastextalign">CanvasTextAlign</a> <a href="#dom-context-2d-textalign-2" id="2dcontext:dom-context-2d-textalign-2">textAlign</a>; // (default: &quot;start&quot;)
+  attribute <a href="#canvastextbaseline" id="2dcontext:canvastextbaseline">CanvasTextBaseline</a> <a href="#dom-context-2d-textbaseline-2" id="2dcontext:dom-context-2d-textbaseline-2">textBaseline</a>; // (default: &quot;alphabetic&quot;)
+  attribute <a href="#canvasdirection" id="2dcontext:canvasdirection">CanvasDirection</a> <a href="#dom-context-2d-direction-2" id="2dcontext:dom-context-2d-direction-2">direction</a>; // (default: &quot;inherit&quot;)
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvaspath">CanvasPath</dfn> {
+  // shared path API methods
+  void <a href="#dom-context-2d-closepath-2" id="2dcontext:dom-context-2d-closepath-2">closePath</a>();
+  void <a href="#dom-context-2d-moveto-2" id="2dcontext:dom-context-2d-moveto-2">moveTo</a>(unrestricted double x, unrestricted double y);
+  void <a href="#dom-context-2d-lineto-2" id="2dcontext:dom-context-2d-lineto-2">lineTo</a>(unrestricted double x, unrestricted double y);
+  void <a href="#dom-context-2d-quadraticcurveto-2" id="2dcontext:dom-context-2d-quadraticcurveto-2">quadraticCurveTo</a>(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y);
+  void <a href="#dom-context-2d-beziercurveto-2" id="2dcontext:dom-context-2d-beziercurveto-2">bezierCurveTo</a>(unrestricted double cp1x, unrestricted double cp1y, unrestricted double cp2x, unrestricted double cp2y, unrestricted double x, unrestricted double y);
+  void <a href="#dom-context-2d-arcto-2" id="2dcontext:dom-context-2d-arcto-2">arcTo</a>(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radius); 
+  void <a href="#dom-context-2d-arcto-2" id="2dcontext:dom-context-2d-arcto-2-2">arcTo</a>(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation); 
+  void <a href="#dom-context-2d-rect-2" id="2dcontext:dom-context-2d-rect-2">rect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+  void <a href="#dom-context-2d-arc-2" id="2dcontext:dom-context-2d-arc-2">arc</a>(unrestricted double x, unrestricted double y, unrestricted double radius, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false); 
+  void <a href="#dom-context-2d-ellipse-2" id="2dcontext:dom-context-2d-ellipse-2">ellipse</a>(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false); 
+};
+
+[Exposed=(Window,Worker)]
+interface <dfn id="canvasgradient">CanvasGradient</dfn> {
+  // opaque object
+  void <a href="#dom-canvasgradient-addcolorstop-2" id="2dcontext:dom-canvasgradient-addcolorstop-2">addColorStop</a>(double offset, DOMString color);
+};
+
+[Exposed=(Window,Worker)]
+interface <dfn id="canvaspattern">CanvasPattern</dfn> {
+  // opaque object
+  void <a href="#dom-canvaspattern-settransform-2" id="2dcontext:dom-canvaspattern-settransform-2">setTransform</a>(optional <a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit" id="2dcontext:dommatrix2dinit-2">DOMMatrix2DInit</a> transform);
+};
+
+[Exposed=Window]
+interface <dfn id="textmetrics">TextMetrics</dfn> {
+  // x-direction
+  readonly attribute double <a href="#dom-textmetrics-width-2" id="2dcontext:dom-textmetrics-width-2">width</a>; // advance width
+  readonly attribute double <a href="#dom-textmetrics-actualboundingboxleft-2" id="2dcontext:dom-textmetrics-actualboundingboxleft-2">actualBoundingBoxLeft</a>;
+  readonly attribute double <a href="#dom-textmetrics-actualboundingboxright-2" id="2dcontext:dom-textmetrics-actualboundingboxright-2">actualBoundingBoxRight</a>;
+
+  // y-direction
+  readonly attribute double <a href="#dom-textmetrics-fontboundingboxascent-2" id="2dcontext:dom-textmetrics-fontboundingboxascent-2">fontBoundingBoxAscent</a>;
+  readonly attribute double <a href="#dom-textmetrics-fontboundingboxdescent-2" id="2dcontext:dom-textmetrics-fontboundingboxdescent-2">fontBoundingBoxDescent</a>;
+  readonly attribute double <a href="#dom-textmetrics-actualboundingboxascent-2" id="2dcontext:dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a>;
+  readonly attribute double <a href="#dom-textmetrics-actualboundingboxdescent-2" id="2dcontext:dom-textmetrics-actualboundingboxdescent-2">actualBoundingBoxDescent</a>;
+  readonly attribute double <a href="#dom-textmetrics-emheightascent-2" id="2dcontext:dom-textmetrics-emheightascent-2">emHeightAscent</a>;
+  readonly attribute double <a href="#dom-textmetrics-emheightdescent-2" id="2dcontext:dom-textmetrics-emheightdescent-2">emHeightDescent</a>;
+  readonly attribute double <a href="#dom-textmetrics-hangingbaseline-2" id="2dcontext:dom-textmetrics-hangingbaseline-2">hangingBaseline</a>;
+  readonly attribute double <a href="#dom-textmetrics-alphabeticbaseline-2" id="2dcontext:dom-textmetrics-alphabeticbaseline-2">alphabeticBaseline</a>;
+  readonly attribute double <a href="#dom-textmetrics-ideographicbaseline-2" id="2dcontext:dom-textmetrics-ideographicbaseline-2">ideographicBaseline</a>;
+};
+
+[<a href="#dom-imagedata" id="2dcontext:dom-imagedata">Constructor</a>(unsigned long sw, unsigned long sh),
+ <a href="#dom-imagedata" id="2dcontext:dom-imagedata-2">Constructor</a>(<a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray" id="2dcontext:idl-uint8clampedarray">Uint8ClampedArray</a> data, unsigned long sw, optional unsigned long sh),
+ Exposed=(Window,Worker),
+ <a href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable" id="2dcontext:serializable">Serializable</a>]
+interface <dfn id="imagedata">ImageData</dfn> {
+  readonly attribute unsigned long <a href="#dom-imagedata-width-2" id="2dcontext:dom-imagedata-width-2">width</a>;
+  readonly attribute unsigned long <a href="#dom-imagedata-height-2" id="2dcontext:dom-imagedata-height-2">height</a>;
+  readonly attribute <a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray" id="2dcontext:idl-uint8clampedarray-2">Uint8ClampedArray</a> <a href="#dom-imagedata-data-2" id="2dcontext:dom-imagedata-data-2">data</a>;
+};
+
+[<a href="#dom-path2d" id="2dcontext:dom-path2d">Constructor</a>,
+ <a href="#dom-path2d-copy" id="2dcontext:dom-path2d-copy">Constructor</a>(<a href="#path2d" id="2dcontext:path2d-8">Path2D</a> path),
+ <a href="#dom-path2d-merge" id="2dcontext:dom-path2d-merge">Constructor</a>(sequence&lt;<a href="#path2d" id="2dcontext:path2d-9">Path2D</a>&gt; paths, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-7">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-8">nonzero</a>&quot;),
+ <a href="#dom-path2d-withdata" id="2dcontext:dom-path2d-withdata">Constructor</a>(DOMString d),
+ Exposed=(Window,Worker)]
+interface <dfn id="path2d">Path2D</dfn> {
+  void <a href="#dom-path2d-addpath-2" id="2dcontext:dom-path2d-addpath-2">addPath</a>(<a href="#path2d" id="2dcontext:path2d-10">Path2D</a> path, optional <a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit" id="2dcontext:dommatrix2dinit-3">DOMMatrix2DInit</a> transform);
+};
+<a href="#path2d" id="2dcontext:path2d-11">Path2D</a> implements <a href="#canvaspath" id="2dcontext:canvaspath-3">CanvasPath</a>;</pre>
+
+ 
+
+  <p class="note">To maintain compatibility with existing Web content, user agents need to
+  enumerate methods defined in <code id="2dcontext:canvasuserinterface-2"><a href="#canvasuserinterface">CanvasUserInterface</a></code> immediately after the <code id="2dcontext:dom-context-2d-stroke-2-3"><a href="#dom-context-2d-stroke-2">stroke()</a></code> method on <code id="2dcontext:canvasrenderingcontext2d-17"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
+  objects.</p>
+
+  <dl class="domintro"><dt><var>context</var> = <var>canvas</var> . <code id="2dcontext:dom-canvas-getcontext-2"><a href="#dom-canvas-getcontext-2">getContext</a></code>('2d' [, { [ <code id="2dcontext:dom-canvasrenderingcontext2dsettings-alpha-2"><a href="#dom-canvasrenderingcontext2dsettings-alpha">alpha</a></code>: false ] } ] )</dt><dd>
+
+    <p>Returns a <code id="2dcontext:canvasrenderingcontext2d-18"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object that is permanently bound to a
+    particular <code id="2dcontext:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element.</p>
+
+    <p>If the <code id="2dcontext:dom-canvasrenderingcontext2dsettings-alpha-3"><a href="#dom-canvasrenderingcontext2dsettings-alpha">alpha</a></code> setting is
+    provided and set to false, then the canvas is forced to always be opaque.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-canvas"><a href="#dom-context-2d-canvas-2">canvas</a></code></dt><dd>
+
+    <p>Returns the <code id="2dcontext:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element.</p>
+
+   </dd></dl>
+
+  
+
+  <p>A <code id="2dcontext:canvasrenderingcontext2d-19"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object has an <dfn id="output-bitmap">output bitmap</dfn> that
+  is initialized when the object is created.</p>
+
+
+  <p>The <a href="#output-bitmap" id="2dcontext:output-bitmap">output bitmap</a> has an <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean">origin-clean</a> flag, which can be set to true or false.
+  Initially, when one of these bitmaps is created, its <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean-2">origin-clean</a> flag must be set to true.</p>
+
+
+  <p>The <code id="2dcontext:canvasrenderingcontext2d-20"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object also has an <dfn id="concept-canvas-alpha">alpha</dfn> flag, which can be set to true or false. Initially,
+  when the context is created, its <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha">alpha</a> flag must be
+  set to true. When a <code id="2dcontext:canvasrenderingcontext2d-21"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object has its <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha-2">alpha</a> flag set to false, then its alpha channel must be
+  fixed to 1.0 (fully opaque) for all pixels, and attempts to change the alpha component of any
+  pixel must be silently ignored.</p>
+
+  <p class="note">Thus, the bitmap of such a context starts off as fully-opaque black instead of
+  fully-transparent black; <code id="2dcontext:dom-context-2d-clearrect-2-2"><a href="#dom-context-2d-clearrect-2">clearRect()</a></code> always
+  results in fully-opaque black pixels, every fourth byte from <code id="2dcontext:dom-context-2d-getimagedata-2-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> is always 255, the <code id="2dcontext:dom-context-2d-putimagedata-2-3"><a href="#dom-context-2d-putimagedata-2">putImageData()</a></code> method effectively ignores every
+  fourth byte in its input, and so on. However, the alpha component of styles and images drawn
+  onto the canvas are still honoured up to the point where they would impact the <a href="#output-bitmap" id="2dcontext:output-bitmap-2">output
+  bitmap</a>'s alpha channel; for instance, drawing a 50% transparent white square on a freshly
+  created <a href="#output-bitmap" id="2dcontext:output-bitmap-3">output bitmap</a> with its <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha-3">alpha</a>
+  flag set to false will result in a fully-opaque gray square.</p>
+
+  <hr/>
+
+  <p>The <code id="2dcontext:canvasrenderingcontext2d-22"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> 2D rendering context represents a flat linear
+  Cartesian surface whose origin (0,0) is at the top left corner, with the coordinate space having
+  <var>x</var> values increasing when going right, and <var>y</var> values increasing when going
+  down. The <var>x</var>-coordinate of the right-most edge is equal to the width of the rendering
+  context's <a href="#output-bitmap" id="2dcontext:output-bitmap-4">output bitmap</a> in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="2dcontext:'px'">CSS pixels</a>; similarly, the
+  <var>y</var>-coordinate of the bottom-most edge is equal to the height of the rendering context's
+  <a href="#output-bitmap" id="2dcontext:output-bitmap-5">output bitmap</a> in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="2dcontext:'px'-2">CSS pixels</a>.</p>
+
+  <p>The size of the coordinate space does not necessarily represent the size of the actual bitmaps
+  that the user agent will use internally or during rendering. On high-definition displays, for
+  instance, the user agent may internally use bitmaps with two device pixels per unit in the
+  coordinate space, so that the rendering remains at high quality throughout. Anti-aliasing can
+  similarly be implemented using over-sampling with bitmaps of a higher resolution than the final
+  image on the display.</p>
+
+  <hr/>
+
+  <p>The <dfn id="2d-context-creation-algorithm">2D context creation algorithm</dfn>, which is passed a <var>target</var> (a
+  <code id="2dcontext:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element) and optionally some arguments, consists of running the following
+  steps:</p>
+
+  <ol><li><p>If the algorithm was passed some arguments, then let <var>arg</var> be the first such
+   argument. Otherwise, let <var>arg</var> be undefined.</p></li><li><p>Let <var>settings</var> be the result of <a href="#coerce-context-arguments-for-2d" id="2dcontext:coerce-context-arguments-for-2d">coercing the <var>arg</var> context arguments for 2D</a>.</p></li><li><p>Create a new <code id="2dcontext:canvasrenderingcontext2d-23"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object.</p></li><li><p>Initialize its <code id="2dcontext:dom-context-2d-canvas-2-2"><a href="#dom-context-2d-canvas-2">canvas</a></code> attribute to point to
+   <var>target</var>.</p></li><li><p>Let the new <code id="2dcontext:canvasrenderingcontext2d-24"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-6">output bitmap</a> be
+   the same bitmap as <var>target</var>'s bitmap (so that they are shared).</p></li><li><p><a href="#concept-canvas-set-bitmap-dimensions" id="2dcontext:concept-canvas-set-bitmap-dimensions">Set bitmap dimensions</a> to the
+   numeric values of <var>target</var>'s <code id="2dcontext:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> and
+   <code id="2dcontext:attr-canvas-height"><a href="#attr-canvas-height">height</a></code> content attributes.</p></li><li>
+
+    <p>Process each of the members of <var>settings</var> as follows:</p>
+
+    <dl><dt><dfn id="dom-canvasrenderingcontext2dsettings-alpha"><code>alpha</code></dfn></dt><dd>If false, then set the new <code id="2dcontext:canvasrenderingcontext2d-25"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha-4">alpha</a> flag to false.</dd></dl>
+
+   </li><li><p>Return the new <code id="2dcontext:canvasrenderingcontext2d-26"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object.</p></li></ol>
+
+  <hr/>
+
+  <hr/>
+
+  <p>When a user agent is required to <dfn id="coerce-context-arguments-for-2d">coerce context arguments for 2D</dfn>, it must run these
+  steps:</p>
+
+  <ol><li><p>Let <var>input</var> be the argument to coerce.</p></li><li><p>Let <var>jsval</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="2dcontext:concept-idl-convert">converting</a>
+   <var>input</var> to a JavaScript value. (This can throw an exception.)</p></li><li><p>Let <var>dict</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="2dcontext:concept-idl-convert-2">converting</a>
+   <var>jsval</var> to the dictionary type <code id="2dcontext:canvasrenderingcontext2dsettings"><a href="#canvasrenderingcontext2dsettings">CanvasRenderingContext2DSettings</a></code>. (This can
+   throw an exception.)</p></li><li><p>Return <var>dict</var>.</p></li></ol>
+
+  <hr/>
+
+  <p>When the user agent is to <dfn id="concept-canvas-set-bitmap-dimensions">set bitmap
+  dimensions</dfn> to <var>width</var> and <var>height</var>, it must run these steps:</p>
+
+  <ol><li><p><a href="#reset-the-rendering-context-to-its-default-state" id="2dcontext:reset-the-rendering-context-to-its-default-state">Reset the rendering context to its default state</a>.</p></li><li><p>Resize the <a href="#output-bitmap" id="2dcontext:output-bitmap-7">output bitmap</a> to the new <var>width</var> and <var>height</var>
+   and clear it to fully transparent black.</p></li><li><p>Let <var>canvas</var> be the <code id="2dcontext:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element to which the rendering
+   context's <code id="2dcontext:dom-context-2d-canvas-2-3"><a href="#dom-context-2d-canvas-2">canvas</a></code> attribute was initialized.</p></li><li><p>If the numeric value of <var>canvas</var>'s <code id="2dcontext:attr-canvas-width-2"><a href="#attr-canvas-width">width</a></code>
+   content attribute differs from <var>width</var>, then set <var>canvas</var>'s <code id="2dcontext:attr-canvas-width-3"><a href="#attr-canvas-width">width</a></code> content attribute to the shortest possible string
+   representing <var>width</var> as a <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-non-negative-integer" id="2dcontext:valid-non-negative-integer">valid non-negative integer</a>.</p></li><li><p>If the numeric value of <var>canvas</var>'s <code id="2dcontext:attr-canvas-height-2"><a href="#attr-canvas-height">height</a></code>
+   content attribute differs from <var>height</var>, then set <var>canvas</var>'s <code id="2dcontext:attr-canvas-height-3"><a href="#attr-canvas-height">height</a></code> content attribute to the shortest possible string
+   representing <var>height</var> as a <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-non-negative-integer" id="2dcontext:valid-non-negative-integer-2">valid non-negative integer</a>.</p></li></ol>
 
   <div class="example">
    <p>Only one square appears to be drawn in the following example:</p>
-   <pre>  // canvas is a reference to a &lt;canvas&gt; element
-  var context = canvas.getContext('2d');
-  context.fillRect(0,0,50,50);
-  canvas.setAttribute('width', '300'); // clears the canvas
-  context.fillRect(0,100,50,50);
-  canvas.width = canvas.width; // clears the canvas
-  context.fillRect(100,0,50,50); // only this square remains</pre>
+   <pre>// canvas is a reference to a &lt;canvas&gt; element
+var context = canvas.getContext('2d');
+context.fillRect(0,0,50,50);
+canvas.setAttribute('width', '300'); // clears the canvas
+context.fillRect(0,100,50,50);
+canvas.width = canvas.width; // clears the canvas
+context.fillRect(100,0,50,50); // only this square remains</pre>
   </div>
 
-  <hr/><dl class="domintro"><dt><var title="">context</var> = <var title="">canvas</var> . <code title="dom-canvas-getContext"><a href="#dom-canvas-getcontext">getContext</a></code>(<var title="">contextId</var> [, ... ])</dt>
+  <hr/>
 
-   <dd>
+  <p>When the user agent is to run the <dfn id="concept-canvas-unbinding-steps">unbinding
+  steps</dfn> for a rendering context, it must run these steps:</p>
 
-    <p>Returns an object that exposes an API for drawing on the
-    canvas. The first argument specifies the desired API. Subsequent
-    arguments are handled by that API.</p>
+  <ol><li><p><a href="#reset-the-rendering-context-to-its-default-state" id="2dcontext:reset-the-rendering-context-to-its-default-state-2">Reset the rendering context to its default state</a>.</p></li><li><p>Clear the <code id="2dcontext:canvasrenderingcontext2d-27"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-8">output bitmap</a> to a
+   transparent black.</p></li><li><p>Set the <code id="2dcontext:canvasrenderingcontext2d-28"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean-3">origin-clean</a> flag to true.</p></li><li><p>Let the <code id="2dcontext:canvasrenderingcontext2d-29"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object have no <a href="#output-bitmap" id="2dcontext:output-bitmap-9">output
+   bitmap</a>.</p></li></ol>
 
-<!--2DCONTEXT-->
+  <p>When the user agent is to run the <dfn id="concept-canvas-binding-steps">binding
+  steps</dfn> to bind the rendering context to the <code id="2dcontext:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code> element <var>target</var>, it
+  must run these steps:</p>
 
-    <p>This specification defines the &quot;<code title="canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot; context below. There is also
-    a specification that defines a &quot;<code title="canvas-context-webgl">webgl</code>&quot; context. <a href="#refsWEBGL">[WEBGL]</a></p>
+  <ol><li><p><a href="#reset-the-rendering-context-to-its-default-state" id="2dcontext:reset-the-rendering-context-to-its-default-state-3">Reset the rendering context to its default state</a>.</p></li><li><p>Resize the <code id="2dcontext:canvasrenderingcontext2d-30"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-10">output bitmap</a> to
+   the dimensions of <var>target</var>'s bitmap and clear it to fully transparent black.</p></li><li><p>Set the <code id="2dcontext:canvasrenderingcontext2d-31"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean-4">origin-clean</a> flag to true.</p></li><li><p>Let the <code id="2dcontext:canvasrenderingcontext2d-32"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-11">output bitmap</a> be <var>target</var>'s bitmap.</p></li></ol>
 
-<!--2DCONTEXT-->
+  <hr/>
 
-    <p>The list of defined contexts is given on the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
-    CanvasContexts page</a>. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a>
+  <p>The <dfn id="dom-context-2d-canvas-2"><code>canvas</code></dfn> attribute must return the
+  value it was initialized to when the object was created.</p>
 
-    </p><p>Returns null if the given context ID is not supported or if the
-    canvas has already been initialized with some other (incompatible)
-    context type (e.g. trying to get a &quot;<code title="canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot; context after getting a
-    &quot;<code title="canvas-context-webgl">webgl</code>&quot; context).</p>
+  <hr/>
 
-   </dd>
+  <p id="canvasrenderingcontext2d-currentcolor">Whenever the CSS value <code>currentColor</code> is used as a color in the <code id="2dcontext:canvasrenderingcontext2d-33"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
+  API, the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value">computed value</a> of the <code>currentColor</code> keyword is
+  the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-2">computed value</a> of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'">'color'</a> property on the <code id="2dcontext:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code>
+  element at the time that the color is specified (e.g. when the appropriate attribute is set, or
+  when the method is called; not when the color is rendered or otherwise used). If the computed
+  value of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'-2">'color'</a> property is undefined for a particular case (e.g. because the element is
+  not in a document), then the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-3">computed value</a> of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'-3">'color'</a> property
+  for the purposes of determining the computed value of the <code>currentColor</code>
+  keyword is fully opaque black. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a></p>
 
-  </dl><div class="impl">
+  <p>In the case of <code id="2dcontext:dom-canvasgradient-addcolorstop-2-2"><a href="#dom-canvasgradient-addcolorstop-2">addColorStop()</a></code> on
+  <code id="2dcontext:canvasgradient-3"><a href="#canvasgradient">CanvasGradient</a></code>, the &quot;<a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-4">computed value</a> of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'-4">'color'</a>
+  property&quot; for the purposes of determining the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-5">computed value</a> of the <code>currentColor</code> keyword is always fully opaque black (there is no associated
+  element). <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a></p>
 
-  <p>A <code><a href="#the-canvas-element">canvas</a></code> element can have a <dfn id="primary-context">primary
-  context</dfn>, which is the first context to have been obtained for
-  that element. When created, a <code><a href="#the-canvas-element">canvas</a></code> element must not
-  have a <a href="#primary-context">primary context</a>.</p>
+  <p class="note">This is because <code id="2dcontext:canvasgradient-4"><a href="#canvasgradient">CanvasGradient</a></code> objects are
+  <code id="2dcontext:the-canvas-element-7"><a href="#the-canvas-element">canvas</a></code>-neutral — a <code id="2dcontext:canvasgradient-5"><a href="#canvasgradient">CanvasGradient</a></code> object created by one
+  <code id="2dcontext:the-canvas-element-8"><a href="#the-canvas-element">canvas</a></code> can be used by another, and there is therefore no way to know which is the
+  &quot;element in question&quot; at the time that the color is specified.</p>
 
+  <p class="note">Similar concerns exist with font-related properties; the rules for those are
+  described in detail in the relevant section below.</p>
 
-  <p>The <dfn id="dom-canvas-getcontext" title="dom-canvas-getContext"><code>getContext(<var title="">contextId</var>, <var title="">args...</var>)</code></dfn>
-  method of the <code><a href="#the-canvas-element">canvas</a></code> element, when invoked, must run
-  the following steps:</p>
+  
 
-  <ol><li><p>Let <var title="">contextId</var> be the first argument to
-   the method.</p></li>
+  <hr/>
 
-   <li>
+  <p>The <code id="2dcontext:canvasfillrule-8"><a href="#canvasfillrule">CanvasFillRule</a></code> enumeration is used to select the <dfn id="fill-rule">fill rule</dfn>
+  algorithm by which to determine if a point is inside or outside a path.</p>
 
-    <p>If <var title="">contextId</var> is not the name of a context
-    supported by the user agent, return null and abort these
-    steps.</p>
+  <p>The value &quot;<dfn id="dom-context-2d-fillrule-nonzero"><code>nonzero</code></dfn>&quot; value
+  indicates the non-zero winding rule, wherein
 
-    <p class="note">An example of this would be a user agent that
-    theoretically supports the &quot;<code title="canvas-context-webgl">webgl</code>&quot; 3D context, in the case
-    where the platform does not have hardware support for OpenGL and
-    the user agent does not have a software OpenGL implementation.
-    Despite the user agent recognising the &quot;<code title="canvas-context-webgl">webgl</code>&quot; name, it would return
-    null at this step because that context is not, in practice,
-    supported at the time of the call.</p>
+     a point is considered to be outside a shape if the number of times a half-infinite straight
+     line drawn from that point crosses the shape's path going in one direction is equal to the
+     number of times it crosses the path going in the other direction.
 
-   </li>
+  </p>
 
-   <li><p>If the element has a <a href="#primary-context">primary context</a> and that
-   context's entry in the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
-   CanvasContexts page</a> does not list <var title="">contextId</var>
-   as a context with which it is compatible, return null and abort
-   these steps. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a></p></li>
 
-   <li><p>If the element does not have a <a href="#primary-context">primary context</a>,
-   let the element's <a href="#primary-context">primary context</a> be <var title="">contextId</var>.</p></li>
+  <p>The &quot;<dfn id="dom-context-2d-fillrule-evenodd"><code>evenodd</code></dfn>&quot; value indicates
+  the even-odd rule, wherein
 
-   <li><p>If the <code title="dom-canvas-getContext"><a href="#dom-canvas-getcontext">getContext()</a></code> method has
-   already been invoked on this element for the same <var title="">contextId</var>, return the same object as was returned
-   that time, and abort these steps. The additional arguments are
-   ignored.</p></li>
+     a point is considered to be outside a shape if the number of times a half-infinite straight
+     line drawn from that point crosses the shape's path is even.
 
-   <li><p><dfn id="getcontext-return" title="getContext-return">Return a new object for <var title="">contextId</var></dfn>, as defined by the specification
-   given for <var title="">contextId</var>'s entry in the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
-   CanvasContexts page</a>. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a></p></li>
+  </p>
 
-  </ol><p>New context types may be registered in the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
-  CanvasContexts page</a>. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a></p>
+  <p>If a point is not outside a shape, it is inside the shape.</p>
 
-  <p>Anyone is free to edit the WHATWG Wiki CanvasContexts page at any
-  time to add a new context type. These new context types must be
-  specified with the following information:</p>
 
-  <dl><dt>Keyword</dt>
+  <hr/>
 
-   <dd><p>The value of <var title="">contextID</var> that will return
-   the object for the new API.</p></dd>
+  <p>The <code id="2dcontext:imagesmoothingquality-2"><a href="#imagesmoothingquality">ImageSmoothingQuality</a></code> enumeration is used to express a preference for the
+  interpolation quality to use when smoothing images.</p>
 
+  <p>The &quot;<dfn id="dom-context-2d-imagesmoothingquality-low"><code>low</code></dfn>&quot; value
+  indicates a preference for a low level of image interpolation quality. Low-quality image
+  interpolation may be more computationally efficient than higher settings.</p>
 
-   <dt>Specification</dt>
+  <p>The &quot;<dfn id="dom-context-2d-imagesmoothingquality-medium"><code>medium</code></dfn>&quot; value
+  indicates a preference for a medium level of image interpolation quality.</p>
 
-   <dd><p>A link to a formal specification of the context type's
-   API. It could be another page on the Wiki, or a link to an external
-   page. If the type does not have a formal specification, an informal
-   description can be substituted until such time as a formal
-   specification is available.</p></dd>
+  <p>The &quot;<dfn id="dom-context-2d-imagesmoothingquality-high"><code>high</code></dfn>&quot; value
+  indicates a preference for a high level of image interpolation quality. High-quality image
+  interpolation may be more computationally expensive than lower settings.</p>
 
+  <p class="note">Bilinear scaling is an example of a relatively fast, lower-quality image-smoothing
+  algorithm. Bicubic or Lanczos scaling are examples of image-smoothing algorithms that produce
+  higher-quality output. This specification does not mandate that specific interpolation algorithms
+  be used.</p>
 
-   <dt>Compatible with</dt>
 
-   <dd><p>The list of context types that are compatible with this one
-   (i.e. that operate on the same underlying bitmap). This list must
-   be transitive and symmetric; if one context type is defined as
-   compatible with another, then all types it is compatible with must
-   be compatible with all types the other is compatible with.</p></dd>
+  <h6 id="implementation-notes"><span class="secno">4.12.5.1.1</span> Implementation notes<a class="self-link" href="#implementation-notes"/></h6>
 
-  </dl><p>Vendors may also define experimental contexts using the syntax
-  <code><var title="">vendorname</var>-<var title="">context</var></code>, for example,
-  <code>moz-3d</code>. Such contexts should be registered in the
-  WHATWG Wiki CanvasContexts page.</p>
+  <p><i>This section is non-normative.</i></p>
 
-  </div>
+  <p>The <a href="#output-bitmap" id="implementation-notes:output-bitmap">output bitmap</a>, when it is not directly displayed by the user agent,
+  implementations can, instead of updating this bitmap, merely remember the sequence of drawing
+  operations that have been applied to it until such time as the bitmap's actual data is needed
+  (for example because of a call to <code id="implementation-notes:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code>, or
+  the <code id="implementation-notes:dom-createimagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-createimagebitmap-2">createImageBitmap()</a></code> factory method). In many
+  cases, this will be more memory efficient.</p>
 
-  <hr/><dl class="domintro"><dt><var title="">url</var> = <var title="">canvas</var> . <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL</a></code>( [ <var title="">type</var>, ... ])</dt>
+  <p>The bitmap of a <code id="implementation-notes:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element is the one bitmap that's pretty much always going
+  to be needed in practice. The <a href="#output-bitmap" id="implementation-notes:output-bitmap-2">output bitmap</a> of a rendering context, when it has one,
+  is always just an alias to a <code id="implementation-notes:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element's bitmap.</p>
 
-   <dd>
+  <p>Additional bitmaps are sometimes needed, e.g. to enable fast drawing when the canvas is being
+  painted at a different size than its <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="implementation-notes:intrinsic-dimensions">intrinsic size</a>,
+  or to enable double buffering so that graphics updates, like page scrolling for example, can be
+  processed concurrently while canvas draw commands are being executed.</p>
 
-    <p>Returns a <a href="#data-protocol" title="data protocol"><code title="">data:</code> URL</a> for the image in the canvas.</p>
+  <h6 id="the-canvas-state"><span class="secno">4.12.5.1.2</span> The canvas state<a class="self-link" href="#the-canvas-state"/></h6>
 
-    <p>The first argument, if provided, controls the type of the image
-    to be returned (e.g. PNG or JPEG). The default is <code title="">image/png</code>; that type is also used if the given
-    type isn't supported. The other arguments are specific to the
-    type, and control the way that the image is generated, as given in
-    the table below.</p>
+  <p>Objects that implement the <code id="the-canvas-state:canvasstate"><a href="#canvasstate">CanvasState</a></code> interface maintain a stack of drawing
+  states. <dfn id="drawing-state">Drawing states</dfn> consist of:</p>
 
-    <p>When trying to use types other than &quot;<code>image/png</code>&quot;,
-    authors can check if the image was really returned in the
-    requested format by checking to see if the returned string starts
-    with one of the exact strings &quot;<code title="">data:image/png,</code>&quot; or &quot;<code title="">data:image/png;</code>&quot;. If it does, the image is PNG,
-    and thus the requested type was not supported. (The one exception
-    to this is if the canvas has either no height or no width, in
-    which case the result might simply be &quot;<code title="">data:,</code>&quot;.)</p>
+  <ul class="brief"><li>The current <a href="#transformations" id="the-canvas-state:transformations">transformation matrix</a>.</li><li>The current <a href="#clipping-region" id="the-canvas-state:clipping-region">clipping region</a>.</li><li>The current values of the following attributes: <code id="the-canvas-state:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code>, <code id="the-canvas-state:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code>, <code id="the-canvas-state:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code>, <code id="the-canvas-state:dom-context-2d-linewidth-2"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code>, <code id="the-canvas-state:dom-context-2d-linecap-2"><a href="#dom-context-2d-linecap-2">lineCap</a></code>, <code id="the-canvas-state:dom-context-2d-linejoin-2"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code>, <code id="the-canvas-state:dom-context-2d-miterlimit-2"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code>, <code id="the-canvas-state:dom-context-2d-linedashoffset-2"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code>, <code id="the-canvas-state:dom-context-2d-shadowoffsetx-2"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code>, <code id="the-canvas-state:dom-context-2d-shadowoffsety-2"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code>, <code id="the-canvas-state:dom-context-2d-shadowblur-2"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code>, <code id="the-canvas-state:dom-context-2d-shadowcolor-2"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>, <code id="the-canvas-state:dom-context-2d-filter"><a href="#dom-context-2d-filter">filter</a></code>, <code id="the-canvas-state:dom-context-2d-globalcompositeoperation-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code>, <code id="the-canvas-state:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code>, <code id="the-canvas-state:dom-context-2d-textalign-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code>, <code id="the-canvas-state:dom-context-2d-textbaseline-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code>, <code id="the-canvas-state:dom-context-2d-direction-2"><a href="#dom-context-2d-direction-2">direction</a></code>, <code id="the-canvas-state:dom-context-2d-imagesmoothingenabled-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code>, <code id="the-canvas-state:dom-context-2d-imagesmoothingquality-2"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code>.</li><li>The current <a href="#dash-list" id="the-canvas-state:dash-list">dash list</a>.</li></ul>
 
-   </dd>
+  <p class="note">The <a href="#current-default-path" id="the-canvas-state:current-default-path">current default path</a> and the rendering context's bitmaps are not
+  part of the drawing state. The <a href="#current-default-path" id="the-canvas-state:current-default-path-2">current default path</a> is persistent, and can only be
+  reset using the <code id="the-canvas-state:dom-context-2d-beginpath-2"><a href="#dom-context-2d-beginpath-2">beginPath()</a></code> method. The bitmaps
+  depend on whether and how the rendering context is bound to a <code id="the-canvas-state:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element.</p>
 
-   <dt><var title="">canvas</var> . <code title="dom-canvas-toBlob"><a href="#dom-canvas-toblob">toBlob</a></code>(<var title="">callback</var> [, <var title="">type</var>, ... ])</dt>
-
-   <dd>
-
-    <p>Creates a <code><a href="#blob">Blob</a></code> object representing a file
-    containing the image in the canvas, and invokes a callback with a
-    handle to that object.</p>
-
-    <p>The second argument, if provided, controls the type of the
-    image to be returned (e.g. PNG or JPEG). The default is <code title="">image/png</code>; that type is also used if the given
-    type isn't supported. The other arguments are specific to the
-    type, and control the way that the image is generated, as given in
-    the table below.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>The <dfn id="dom-canvas-todataurl" title="dom-canvas-toDataURL"><code>toDataURL()</code></dfn> method
-  must run the following steps:</p>
-
-  <ol><li><p>If the canvas has no pixels (i.e. either its horizontal
-   dimension or its vertical dimension is zero) then return the string
-   &quot;<code title="">data:,</code>&quot; and abort these steps. (This is the
-   shortest <a href="#data-protocol" title="data protocol"><code title="">data:</code>
-   URL</a>; it represents the empty string in a <code title="">text/plain</code> resource.)</p></li>
-
-   <li><p>Let <var title="">file</var> be <a href="#a-serialization-of-the-image-as-a-file">a serialization of the
-   image as a file</a>, using the method's arguments (if any) as
-   the <var title="">arguments</var>.</p></li>
-
-   <li><p>Return a <a href="#data-protocol" title="data protocol"><code title="">data:</code> URL</a> representing <var title="">file</var>. <a href="#refsRFC2397">[RFC2397]</a></p>
-
-   <!-- should we explicitly require the URL to be base64-encoded and
-   not have any parameters, to ensure the same exact URL is generated
-   in each browser? -->
-
-  </li></ol><p>The <dfn id="dom-canvas-toblob" title="dom-canvas-toBlob"><code>toBlob()</code></dfn> method
-  must run the following steps:</p>
-
-  <ol><li><p>Let <var title="">callback</var> be the first
-   argument.</p></li>
-
-   <li><p>Let <var title="">arguments</var> be the second and
-   subsequent arguments to the method, if any.</p></li>
-
-   <li><p>Let <var title="">file</var> be <a href="#a-serialization-of-the-image-as-a-file">a serialization of the
-   image as a file</a>, using <var title="">arguments</var>.</p></li>
-
-   <li><p>Return, but continue running these steps
-   asynchronously.</p></li>
-
-   <li><p>If <var title="">callback</var> is null, abort these
-   steps.</p></li>
-
-   <li><p><a href="#queue-a-task">Queue a task</a> to invoke the
-   <code>FileCallback</code> <var title="">callback</var> with a
-   <code><a href="#blob">Blob</a></code> object representing <var title="">file</var> as
-   its argument. The <a href="#task-source">task source</a> for this task is the
-   <dfn id="canvas-blob-serialization-task-source">canvas blob serialization task source</dfn>. <a href="#refsFILESYSTEMAPI">[FILESYSTEMAPI]</a> <a href="#refsFILEAPI">[FILEAPI]</a> </p></li>
-
-  </ol><p>When a user agent is to create <dfn id="a-serialization-of-the-image-as-a-file">a serialization of the image
-  as a file</dfn>, optionally with some given <var title="">arguments</var>, it must create an image file in the format
-  given by the first value of <var title="">arguments</var>, or, if
-  there are no <var title="">arguments</var>, in the PNG format. <a href="#refsPNG">[PNG]</a></p>
-
-  <p>If <var title="">arguments</var> is not empty, the first value
-  must be interpreted as a <a href="#mime-type" title="MIME type">MIME type</a>
-  giving the format to use. If the type has any parameters, it must be
-  treated as not supported.</p>
-
-  <p class="example">For example, the value &quot;<code>image/png</code>&quot; would
-  mean to generate a PNG image, the value &quot;<code>image/jpeg</code>&quot;
-  would mean to generate a JPEG image, and the value
-  &quot;<code>image/svg+xml</code>&quot; would mean to generate an SVG image
-  (which would probably require that the implementation actually keep
-  enough information to reliably render an SVG image from the canvas).</p>
-
-  <p>User agents must support PNG (&quot;<code>image/png</code>&quot;). User
-  agents may support other types. If the user agent does not support
-  the requested type, it must create the file using the PNG format. <a href="#refsPNG">[PNG]</a></p>
-
-  <p>User agents must <a href="#converted-to-ascii-lowercase" title="converted to ASCII
-  lowercase">convert the provided type to ASCII lowercase</a>
-  before establishing if they support that type.</p>
-
-  <p>For image types that do not support an alpha channel, the
-  serialized image must be the canvas image composited onto a solid
-  black background using the source-over operator.</p>
-
-  <p>If the first argument in <var title="">arguments</var> gives a
-  type corresponding to one of the types given in the first column of
-  the following table, and the user agent supports that type, then the
-  subsequent arguments, if any, must be treated as described in the
-  second cell of that row.</p>
-
-  </div>
-
-  <table><thead><tr><th> Type </th><th> Other arguments </th><th> Reference
-   </th></tr></thead><tbody><tr><td> <code>image/jpeg</code>
-     </td><td> The second argument<span class="impl">, if it</span> is a
-     number in the range 0.0 to 1.0 inclusive<span class="impl">, must
-     be</span> treated as the desired quality level. <span class="impl">If it is not a number or is outside that range, the
-     user agent must use its default value, as if the argument had
-     been omitted.</span>
-     </td><td> <a href="#refsJPEG">[JPEG]</a>
-  </td></tr></tbody></table><div class="impl">
-
-  <p>For the purposes of these rules, an argument is considered to be
-  a number if it is converted to an IDL double value by the rules for
-  handling arguments of type <code title="">any</code> in the Web IDL
-  specification. <a href="#refsWEBIDL">[WEBIDL]</a></p>
-
-  <p>Other arguments must be ignored and must not cause the user agent
-  to raise an exception. A future version of this specification will
-  probably define other parameters to be passed to these methods to
-  allow authors to more carefully control compression settings, image
-  metadata, etc.</p>
-
-  </div>
-
-  <!--2DCONTEXT-->
-
-  <div data-component="HTML Canvas 2D Context (editor: Ian Hickson)">
-
-  <h5 id="2dcontext"><span class="secno">4.8.11.1 </span>The 2D context</h5>
-
-  <!-- v2: we're on v4.1. suggestions for next version are marked v5, v6. -->
-
-
-
-  <p>This specification defines the <dfn id="canvas-context-2d" title="canvas-context-2d"><code>2d</code></dfn> context type, whose
-  API is implemented using the <code><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
-  interface.</p>
-
-  <div class="impl">
-
-  <p>When the <code title="dom-canvas-getContext"><a href="#dom-canvas-getcontext">getContext()</a></code>
-  method of a <code><a href="#the-canvas-element">canvas</a></code> element is to <a href="#getcontext-return" title="getContext-return">return a new object for the <var title="">contextId</var></a> <code title="canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>, the user agent must return a
-  new <code><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object. Any additional
-  arguments are ignored.</p>
-
-  </div>
-
-  <p>The 2D context represents a flat Cartesian surface whose origin
-  (0,0) is at the top left corner, with the coordinate space having
-  <var title="">x</var> values increasing when going right, and <var title="">y</var> values increasing when going down.</p>
-
-  <pre class="idl">interface <dfn id="canvasrenderingcontext2d">CanvasRenderingContext2D</dfn> {
-
-  // back-reference to the canvas
-  readonly attribute <a href="#htmlcanvaselement">HTMLCanvasElement</a> <a href="#dom-context-2d-canvas" title="dom-context-2d-canvas">canvas</a>;
-
-  // state
-  void <a href="#dom-context-2d-save" title="dom-context-2d-save">save</a>(); // push state on state stack
-  void <a href="#dom-context-2d-restore" title="dom-context-2d-restore">restore</a>(); // pop state stack and restore state
-<!--
-  // v6 we've also received requests for:
-          attribute boolean <span title="dom-context-2d-forceHighQuality">forceHighQuality</span> // (default false)
-  // when enabled, it would prevent the UA from falling back on lower-quality but faster rendering routines
-  // useful e.g. for when an image manipulation app uses <canvas> both for UI previews and the actual work
--->
-  // transformations (default transform is the identity matrix)
-  void <a href="#dom-context-2d-scale" title="dom-context-2d-scale">scale</a>(in double x, in double y);
-  void <a href="#dom-context-2d-rotate" title="dom-context-2d-rotate">rotate</a>(in double angle);
-  void <a href="#dom-context-2d-translate" title="dom-context-2d-translate">translate</a>(in double x, in double y);
-  void <a href="#dom-context-2d-transform" title="dom-context-2d-transform">transform</a>(in double a, in double b, in double c, in double d, in double e, in double f);
-  void <a href="#dom-context-2d-settransform" title="dom-context-2d-setTransform">setTransform</a>(in double a, in double b, in double c, in double d, in double e, in double f);
-<!--
-  // v6 we've also received requests for:
-  void skew(...);
-  void reflect(...); // or mirror(...)
--->
-  // compositing
-           attribute double <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">globalAlpha</a>; // (default 1.0)
-           attribute DOMString <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">globalCompositeOperation</a>; // (default source-over)
-<!--
-  // v6 we've also received requests for:
-  - turning off antialiasing to avoid seams when patterns are painted next to each other
-    - might be better to overdraw?
-    - might be better to just draw at a higher res then downsample, like for 3d?
-  - nested layers
-    - the ability to composite an entire set of drawing operations with one shadow all at once
-      http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2008-August/015567.html
--->
-  // colors and styles
-           attribute any <a href="#dom-context-2d-strokestyle" title="dom-context-2d-strokeStyle">strokeStyle</a>; // (default black)
-           attribute any <a href="#dom-context-2d-fillstyle" title="dom-context-2d-fillStyle">fillStyle</a>; // (default black)
-  <a href="#canvasgradient">CanvasGradient</a> <a href="#dom-context-2d-createlineargradient" title="dom-context-2d-createLinearGradient">createLinearGradient</a>(in double x0, in double y0, in double x1, in double y1);
-  <a href="#canvasgradient">CanvasGradient</a> <a href="#dom-context-2d-createradialgradient" title="dom-context-2d-createRadialGradient">createRadialGradient</a>(in double x0, in double y0, in double r0, in double x1, in double y1, in double r1);
-  <a href="#canvaspattern">CanvasPattern</a> <a href="#dom-context-2d-createpattern" title="dom-context-2d-createPattern">createPattern</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in DOMString repetition);
-  <a href="#canvaspattern">CanvasPattern</a> <a href="#dom-context-2d-createpattern" title="dom-context-2d-createPattern">createPattern</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in DOMString repetition);
-  <a href="#canvaspattern">CanvasPattern</a> <a href="#dom-context-2d-createpattern" title="dom-context-2d-createPattern">createPattern</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in DOMString repetition);
-
-  // line caps/joins
-           attribute double <a href="#dom-context-2d-linewidth" title="dom-context-2d-lineWidth">lineWidth</a>; // (default 1)
-           attribute DOMString <a href="#dom-context-2d-linecap" title="dom-context-2d-lineCap">lineCap</a>; // &quot;butt&quot;, &quot;round&quot;, &quot;square&quot; (default &quot;butt&quot;)
-           attribute DOMString <a href="#dom-context-2d-linejoin" title="dom-context-2d-lineJoin">lineJoin</a>; // &quot;round&quot;, &quot;bevel&quot;, &quot;miter&quot; (default &quot;miter&quot;)
-           attribute double <a href="#dom-context-2d-miterlimit" title="dom-context-2d-miterLimit">miterLimit</a>; // (default 10)
-
-  // shadows
-           attribute double <a href="#dom-context-2d-shadowoffsetx" title="dom-context-2d-shadowOffsetX">shadowOffsetX</a>; // (default 0)
-           attribute double <a href="#dom-context-2d-shadowoffsety" title="dom-context-2d-shadowOffsetY">shadowOffsetY</a>; // (default 0)
-           attribute double <a href="#dom-context-2d-shadowblur" title="dom-context-2d-shadowBlur">shadowBlur</a>; // (default 0)
-           attribute DOMString <a href="#dom-context-2d-shadowcolor" title="dom-context-2d-shadowColor">shadowColor</a>; // (default transparent black)
-
-  // rects
-  void <a href="#dom-context-2d-clearrect" title="dom-context-2d-clearRect">clearRect</a>(in double x, in double y, in double w, in double h);
-  void <a href="#dom-context-2d-fillrect" title="dom-context-2d-fillRect">fillRect</a>(in double x, in double y, in double w, in double h);
-  void <a href="#dom-context-2d-strokerect" title="dom-context-2d-strokeRect">strokeRect</a>(in double x, in double y, in double w, in double h);
-
-  // path API
-  void <a href="#dom-context-2d-beginpath" title="dom-context-2d-beginPath">beginPath</a>();
-  void <a href="#dom-context-2d-closepath" title="dom-context-2d-closePath">closePath</a>();
-  void <a href="#dom-context-2d-moveto" title="dom-context-2d-moveTo">moveTo</a>(in double x, in double y);
-  void <a href="#dom-context-2d-lineto" title="dom-context-2d-lineTo">lineTo</a>(in double x, in double y);
-  void <a href="#dom-context-2d-quadraticcurveto" title="dom-context-2d-quadraticCurveTo">quadraticCurveTo</a>(in double cpx, in double cpy, in double x, in double y);
-  void <a href="#dom-context-2d-beziercurveto" title="dom-context-2d-bezierCurveTo">bezierCurveTo</a>(in double cp1x, in double cp1y, in double cp2x, in double cp2y, in double x, in double y);
-  void <a href="#dom-context-2d-arcto" title="dom-context-2d-arcTo">arcTo</a>(in double x1, in double y1, in double x2, in double y2, in double radius);
-  void <a href="#dom-context-2d-rect" title="dom-context-2d-rect">rect</a>(in double x, in double y, in double w, in double h);
-  void <a href="#dom-context-2d-arc" title="dom-context-2d-arc">arc</a>(in double x, in double y, in double radius, in double startAngle, in double endAngle, in optional boolean anticlockwise);
-  void <a href="#dom-context-2d-fill" title="dom-context-2d-fill">fill</a>();
-  void <a href="#dom-context-2d-stroke" title="dom-context-2d-stroke">stroke</a>();
-  void <a href="#dom-context-2d-drawsystemfocusring" title="dom-context-2d-drawSystemFocusRing">drawSystemFocusRing</a>(in <a href="#element">Element</a> element);
-  boolean <a href="#dom-context-2d-drawcustomfocusring" title="dom-context-2d-drawCustomFocusRing">drawCustomFocusRing</a>(in <a href="#element">Element</a> element);
-  void <a href="#dom-context-2d-scrollpathintoview" title="dom-context-2d-scrollPathIntoView">scrollPathIntoView</a>();
-  void <a href="#dom-context-2d-clip" title="dom-context-2d-clip">clip</a>();
-  boolean <a href="#dom-context-2d-ispointinpath" title="dom-context-2d-isPointInPath">isPointInPath</a>(in double x, in double y);
-
-  // text
-           attribute DOMString <a href="#dom-context-2d-font" title="dom-context-2d-font">font</a>; // (default 10px sans-serif)
-           attribute DOMString <a href="#dom-context-2d-textalign" title="dom-context-2d-textAlign">textAlign</a>; // &quot;start&quot;, &quot;end&quot;, &quot;left&quot;, &quot;right&quot;, &quot;center&quot; (default: &quot;start&quot;)
-           attribute DOMString <a href="#dom-context-2d-textbaseline" title="dom-context-2d-textBaseline">textBaseline</a>; // &quot;top&quot;, &quot;hanging&quot;, &quot;middle&quot;, &quot;alphabetic&quot;, &quot;ideographic&quot;, &quot;bottom&quot; (default: &quot;alphabetic&quot;)
-  void <a href="#dom-context-2d-filltext" title="dom-context-2d-fillText">fillText</a>(in DOMString text, in double x, in double y, in optional double maxWidth);
-  void <a href="#dom-context-2d-stroketext" title="dom-context-2d-strokeText">strokeText</a>(in DOMString text, in double x, in double y, in optional double maxWidth);<!-- v6DVT
-  void <span title="dom-context-2d-fillVerticalText">fillVerticalText</span>(in DOMString text, in double x, in double y, in optional double maxHeight);
-  void <span title="dom-context-2d-strokeVerticalText">strokeVerticalText</span>(in DOMString text, in double x, in double y, in optional double maxHeight); -->
-  <a href="#textmetrics">TextMetrics</a> <a href="#dom-context-2d-measuretext" title="dom-context-2d-measureText">measureText</a>(in DOMString text);
-
-  // drawing images
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in double dx, in double dy);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in double dx, in double dy, in double dw, in double dh);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in double dx, in double dy);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in double dx, in double dy, in double dw, in double dh);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in double dx, in double dy);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in double dx, in double dy, in double dw, in double dh);
-  void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
-
-  // pixel manipulation
-  <a href="#imagedata">ImageData</a> <a href="#dom-context-2d-createimagedata" title="dom-context-2d-createImageData">createImageData</a>(in double sw, in double sh);
-  <a href="#imagedata">ImageData</a> <a href="#dom-context-2d-createimagedata" title="dom-context-2d-createImageData">createImageData</a>(in <a href="#imagedata">ImageData</a> imagedata);
-  <a href="#imagedata">ImageData</a> <a href="#dom-context-2d-getimagedata" title="dom-context-2d-getImageData">getImageData</a>(in double sx, in double sy, in double sw, in double sh);
-  void <a href="#dom-context-2d-putimagedata" title="dom-context-2d-putImageData">putImageData</a>(in <a href="#imagedata">ImageData</a> imagedata, in double dx, in double dy);
-  void <a href="#dom-context-2d-putimagedata" title="dom-context-2d-putImageData">putImageData</a>(in <a href="#imagedata">ImageData</a> imagedata, in double dx, in double dy, in double dirtyX, in double dirtyY, in double dirtyWidth, in double dirtyHeight);
-};
-
-interface <dfn id="canvasgradient">CanvasGradient</dfn> {
-  // opaque object
-  void <a href="#dom-canvasgradient-addcolorstop" title="dom-canvasgradient-addColorStop">addColorStop</a>(in double offset, in DOMString color);
-};
-
-interface <dfn id="canvaspattern">CanvasPattern</dfn> {
-  // opaque object
-};
-
-interface <dfn id="textmetrics">TextMetrics</dfn> {
-  readonly attribute double <a href="#dom-textmetrics-width" title="dom-textmetrics-width">width</a>;
-};
-
-interface <dfn id="imagedata">ImageData</dfn> {
-  readonly attribute unsigned long <a href="#dom-imagedata-width" title="dom-imagedata-width">width</a>;
-  readonly attribute unsigned long <a href="#dom-imagedata-height" title="dom-imagedata-height">height</a>;
-  readonly attribute <a href="#canvaspixelarray">CanvasPixelArray</a> <a href="#dom-imagedata-data" title="dom-imagedata-data">data</a>;
-};
-
-interface <dfn id="canvaspixelarray">CanvasPixelArray</dfn> {
-  readonly attribute unsigned long <a href="#dom-canvaspixelarray-length" title="dom-canvaspixelarray-length">length</a>;
-  <a href="#dom-canvaspixelarray-get" title="dom-CanvasPixelArray-get">getter</a> octet (in unsigned long index);
-  <a href="#dom-canvaspixelarray-set" title="dom-CanvasPixelArray-set">setter</a> void (in unsigned long index, [Clamp] in octet value);
-};</pre>
-
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-canvas"><a href="#dom-context-2d-canvas">canvas</a></code></dt>
-
-   <dd>
-
-    <p>Returns the <code><a href="#the-canvas-element">canvas</a></code> element.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>The <dfn id="dom-context-2d-canvas" title="dom-context-2d-canvas"><code>canvas</code></dfn>
-  attribute must return the <code><a href="#the-canvas-element">canvas</a></code> element that the
-  context paints on.</p>
-
-  <p>Except where otherwise specified, for the 2D context interface,
-  any method call with a numeric argument whose value is infinite or a
-  NaN value must be ignored.</p>
-
-  <!--
-   Philip Taylor wrote:
-   > My experience with some 3d canvas code is that infinities come up in
-   > naturally harmless places, e.g. having a function that scales by x then
-   > translates by 1/x and wanting it to work when x=0 (which ought to draw
-   > nothing, since anything it draws is zero pixels wide), and it's a bit
-   > annoying to track down and fix those issues, so I'd probably like it if
-   > they were harmless in canvas methods. Opera appears to silently not draw
-   > anything if the transformation matrix is not finite, but Firefox throws
-   > exceptions when passing in non-finite arguments.
-  -->
-
-  <p>Whenever the CSS value <code title="">currentColor</code> is used
-  as a color in this API, the &quot;computed value of the 'color' property&quot;
-  for the purposes of determining the computed value of the <code title="">currentColor</code> keyword is the computed value of the
-  'color' property on the element in question at the time that the
-  color is specified (e.g. when the appropriate attribute is set, or
-  when the method is called; not when the color is rendered or
-  otherwise used). If the computed value of the 'color' property is
-  undefined for a particular case (e.g. because the element is not
-  <a href="#in-a-document">in a <code>Document</code></a>), then the &quot;computed value
-  of the 'color' property&quot; for the purposes of determining the
-  computed value of the <code title="">currentColor</code> keyword is
-  fully opaque black. <a href="#refsCSSCOLOR">[CSSCOLOR]</a></p>
-
-  <p>In the case of <code title="dom-canvasgradient-addColorStop"><a href="#dom-canvasgradient-addcolorstop">addColorStop()</a></code> on
-  <code><a href="#canvasgradient">CanvasGradient</a></code>, the &quot;computed value of the 'color'
-  property&quot; for the purposes of determining the computed value of the
-  <code title="">currentColor</code> keyword is always fully opaque
-  black (there is no associated element). <a href="#refsCSSCOLOR">[CSSCOLOR]</a></p>
-
-  <p class="note">This is because <code><a href="#canvasgradient">CanvasGradient</a></code> objects
-  are <code><a href="#the-canvas-element">canvas</a></code>-neutral — a
-  <code><a href="#canvasgradient">CanvasGradient</a></code> object created by one
-  <code><a href="#the-canvas-element">canvas</a></code> can be used by another, and there is therefore
-  no way to know which is the &quot;element in question&quot; at the time that
-  the color is specified.</p>
-
-  </div>
-
-
-
-  <h6 id="the-canvas-state"><span class="secno">4.8.11.1.1 </span>The canvas state</h6>
-
-  <p>Each context maintains a stack of drawing states. <dfn id="drawing-state" title="drawing state">Drawing states</dfn> consist of:</p>
-
-  <ul class="brief"><li>The current <a href="#transformations" title="dom-context-2d-transformation">transformation matrix</a>.</li>
-   <li>The current <a href="#clipping-region">clipping region</a>.</li>
-   <li>The current values of the following attributes: <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code>, <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code>, <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>, <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code>, <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code>, <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code>, <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code>, <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code>, <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code>, <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code>, <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code>, <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>, <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code>, <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code>, <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code>.</li>
-  </ul><p class="note">The current path and the current bitmap are not part
-  of the drawing state. The current path is persistent, and can only
-  be reset using the <code title="dom-context-2d-beginPath"><a href="#dom-context-2d-beginpath">beginPath()</a></code> method. The
-  current bitmap is a property of the canvas, not the context.</p>
-
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-save"><a href="#dom-context-2d-save">save</a></code>()</dt>
-
-   <dd>
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-save"><a href="#dom-context-2d-save-2">save</a></code>()</dt><dd>
 
     <p>Pushes the current state onto the stack.</p>
 
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-restore"><a href="#dom-context-2d-restore">restore</a></code>()</dt>
-
-   <dd>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-restore"><a href="#dom-context-2d-restore-2">restore</a></code>()</dt><dd>
 
     <p>Pops the top state on the stack, restoring the context to that state.</p>
 
-   </dd>
+   </dd></dl>
 
-  </dl><div class="impl">
+  
 
-  <p>The <dfn id="dom-context-2d-save" title="dom-context-2d-save"><code>save()</code></dfn>
-  method must push a copy of the current drawing state onto the
-  drawing state stack.</p>
+  <p>The <dfn id="dom-context-2d-save-2"><code>save()</code></dfn> method, when invoked, must push
+  a copy of the current drawing state onto the drawing state stack.</p>
 
-  <p>The <dfn id="dom-context-2d-restore" title="dom-context-2d-restore"><code>restore()</code></dfn> method
-  must pop the top entry in the drawing state stack, and reset the
-  drawing state it describes. If there is no saved state, the method
-  must do nothing.</p>
+  <p>The <dfn id="dom-context-2d-restore-2"><code>restore()</code></dfn> method, when invoked,
+  must pop the top entry in the drawing state stack, and reset the drawing state it describes. If
+  there is no saved state, then the method must do nothing.</p>
 
-  <!-- v6
-idea from Mihai:
-> 5. Drawing states should be saveable with IDs, and for easier restoring.
->
-> save(id)
-> restore(id)
->
-> If id is not provided, then save() works as defined now. The same for
-> restore().
->
-> Currently, it's not trivial to save and restore a specific state.
-...and from Philip:
-> I think a more convenient syntax would be:
->   var state = ctx.save();
->   ctx.restore(state);
-> But how would it interact with normal calls to ctx.restore()?
-  -->
+  <p>When the user agent is to <dfn id="reset-the-rendering-context-to-its-default-state">reset the rendering context to its default state</dfn>, it must
+  clear the drawing state stack and everything that <a href="#drawing-state" id="the-canvas-state:drawing-state">drawing state</a> consists of to
+  initial values.</p>
 
-  </div>
+  
 
+  
 
-  <h6 id="transformations"><span class="secno">4.8.11.1.2 </span><dfn title="dom-context-2d-transformation">Transformations</dfn></h6>
 
-  <p>The transformation matrix is applied to coordinates when creating
-  shapes and paths.</p> <!-- conformance criteria for actual drawing
-  are described in the various sections below -->
+  <h6 id="line-styles"><span class="secno">4.12.5.1.3</span> Line styles<a class="self-link" href="#line-styles"/></h6>
 
-  <div class="impl">
-
-  <p>When the context is created, the transformation matrix must
-  initially be the identity transform. It may then be adjusted using
-  the transformation methods.</p>
-
-  <p>The transformations must be performed in reverse order. For
-  instance, if a scale transformation that doubles the width is
-  applied, followed by a rotation transformation that rotates drawing
-  operations by a quarter turn, and a rectangle twice as wide as it is
-  tall is then drawn on the canvas, the actual result will be a
-  square.</p>
-
-  </div>
-
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-scale"><a href="#dom-context-2d-scale">scale</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
-
-   <dd>
-
-    <p>Changes the transformation matrix to apply a scaling transformation with the given characteristics.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-rotate"><a href="#dom-context-2d-rotate">rotate</a></code>(<var title="">angle</var>)</dt>
-
-   <dd>
-
-    <p>Changes the transformation matrix to apply a rotation transformation with the given characteristics. The angle is in radians.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-translate"><a href="#dom-context-2d-translate">translate</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
-
-   <dd>
-
-    <p>Changes the transformation matrix to apply a translation transformation with the given characteristics.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-transform"><a href="#dom-context-2d-transform">transform</a></code>(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, <var title="">f</var>)</dt>
-
-   <dd>
-
-    <p>Changes the transformation matrix to apply the matrix given by the arguments as described below.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-setTransform"><a href="#dom-context-2d-settransform">setTransform</a></code>(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, <var title="">f</var>)</dt>
-
-   <dd>
-
-    <p>Changes the transformation matrix <em>to</em> the matrix given by the arguments as described below.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>The <dfn id="dom-context-2d-scale" title="dom-context-2d-scale"><code>scale(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
-  add the scaling transformation described by the arguments to the
-  transformation matrix. The <var title="">x</var> argument represents
-  the scale factor in the horizontal direction and the <var title="">y</var> argument represents the scale factor in the
-  vertical direction. The factors are multiples.</p>
-
-  <p>The <dfn id="dom-context-2d-rotate" title="dom-context-2d-rotate"><code>rotate(<var title="">angle</var>)</code></dfn> method must add the rotation
-  transformation described by the argument to the transformation
-  matrix. The <var title="">angle</var> argument represents a
-  clockwise rotation angle expressed in radians.</p>
-
-  <p>The <dfn id="dom-context-2d-translate" title="dom-context-2d-translate"><code>translate(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
-  add the translation transformation described by the arguments to the
-  transformation matrix. The <var title="">x</var> argument represents
-  the translation distance in the horizontal direction and the <var title="">y</var> argument represents the translation distance in the
-  vertical direction. The arguments are in coordinate space units.</p>
-
-  <p>The <dfn id="dom-context-2d-transform" title="dom-context-2d-transform"><code>transform(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, <var title="">f</var>)</code></dfn> method must replace the current
-  transformation matrix with the result of multiplying the current
-  transformation matrix with the matrix described by:</p>
-
-  </div>
-
-  <table class="matrix"><tbody><tr><td><var title="">a</var></td>
-    <td><var title="">c</var></td>
-    <td><var title="">e</var></td>
-   </tr><tr><td><var title="">b</var></td>
-    <td><var title="">d</var></td>
-    <td><var title="">f</var></td>
-   </tr><tr><td>0</td>
-    <td>0</td>
-    <td>1</td>
-   </tr></tbody></table><p class="note">The arguments <var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, and <var title="">f</var> are sometimes called
-  <var title="">m11</var>, <var title="">m12</var>, <var title="">m21</var>, <var title="">m22</var>, <var title="">dx</var>,
-  and <var title="">dy</var> or <var title="">m11</var>, <var title="">m21</var>, <var title="">m12</var>, <var title="">m22</var>, <var title="">dx</var>, and <var title="">dy</var>. Care should be taken in particular with the order
-  of the second and third arguments (<var title="">b</var> and <var title="">c</var>) as their order varies from API to API and APIs
-  sometimes use the notation <var title="">m12</var>/<var title="">m21</var> and sometimes <var title="">m21</var>/<var title="">m12</var> for those positions.</p>
-
-  <div class="impl">
-
-  <p>The <dfn id="dom-context-2d-settransform" title="dom-context-2d-setTransform"><code>setTransform(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>,
-  <var title="">f</var>)</code></dfn> method must reset the current
-  transform to the identity matrix, and then invoke the <code><a href="#dom-context-2d-transform" title="dom-context-2d-transform">transform</a>(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>,
-  <var title="">f</var>)</code> method with the same arguments.</p>
-
-  </div>
-
-
-  <h6 id="compositing"><span class="secno">4.8.11.1.3 </span>Compositing</h6>
-
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
-
-    <p>Returns the current alpha value applied to rendering operations.</p>
-
-    <p>Can be set, to change the alpha value. Values outside of the
-    range 0.0 .. 1.0 are ignored.</p>
-
-   </dd>
-
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
-
-    <p>Returns the current composition operation, from the list below.</p>
-
-    <p>Can be set, to change the composition operation. Unknown values
-    are ignored.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>All drawing operations are affected by the global compositing
-  attributes, <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> and <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>.</p>
-
-  <!-- conformance criteria for painting are described in the "drawing
-  model" section below -->
-
-  <p>The <dfn id="dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha"><code>globalAlpha</code></dfn>
-  attribute gives an alpha value that is applied to shapes and images
-  before they are composited onto the canvas. The value must be in the
-  range from 0.0 (fully transparent) to 1.0 (no additional
-  transparency). If an attempt is made to set the attribute to a value
-  outside this range, including Infinity and Not-a-Number (NaN)
-  values, the attribute must retain its previous value. When the
-  context is created, the <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> attribute must
-  initially have the value 1.0.</p>
-
-  <p>The <dfn id="dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation"><code>globalCompositeOperation</code></dfn>
-  attribute sets how shapes and images are drawn onto the existing
-  bitmap, once they have had <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> and the
-  current transformation matrix applied. It must be set to a value
-  from the following list. In the descriptions below, the source
-  image, <var title="">A</var>, is the shape or image being rendered,
-  and the destination image, <var title="">B</var>, is the current
-  state of the bitmap.</p>
-
-  </div>
-
-  <dl><dt><dfn id="gcop-source-atop" title="gcop-source-atop"><code>source-atop</code></dfn></dt>
-
-   <dd><var title="">A</var> atop <var title="">B</var>. <span class="note">Display the
-   source image wherever both images are opaque. Display the
-   destination image wherever the destination image is opaque but the
-   source image is transparent. Display transparency elsewhere.</span></dd>
-
-   <dt><dfn id="gcop-source-in" title="gcop-source-in"><code>source-in</code></dfn></dt>
-
-   <dd><var title="">A</var> in <var title="">B</var>. <span class="note">Display the
-   source image wherever both the source image and destination image
-   are opaque. Display transparency elsewhere.</span></dd>
-
-   <dt><dfn id="gcop-source-out" title="gcop-source-out"><code>source-out</code></dfn></dt>
-
-   <dd><var title="">A</var> out <var title="">B</var>. <span class="note">Display the
-   source image wherever the source image is opaque and the
-   destination image is transparent. Display transparency
-   elsewhere.</span></dd>
-
-   <dt><dfn id="gcop-source-over" title="gcop-source-over"><code>source-over</code></dfn> (default)</dt>
-
-   <dd><var title="">A</var> over <var title="">B</var>. <span class="note">Display the
-   source image wherever the source image is opaque. Display the
-   destination image elsewhere.</span></dd>
-
-
-   <dt><dfn id="gcop-destination-atop" title="gcop-destination-atop"><code>destination-atop</code></dfn></dt>
-
-   <dd><var title="">B</var> atop <var title="">A</var>. <span class="note">Same as <code title="gcop-source-atop"><a href="#gcop-source-atop">source-atop</a></code> but using the
-   destination image instead of the source image and vice versa.</span></dd>
-
-   <dt><dfn id="gcop-destination-in" title="gcop-destination-in"><code>destination-in</code></dfn></dt>
-
-   <dd><var title="">B</var> in <var title="">A</var>. <span class="note">Same as <code title="gcop-source-in"><a href="#gcop-source-in">source-in</a></code> but using the destination
-   image instead of the source image and vice versa.</span></dd>
-
-   <dt><dfn id="gcop-destination-out" title="gcop-destination-out"><code>destination-out</code></dfn></dt>
-
-   <dd><var title="">B</var> out <var title="">A</var>. <span class="note">Same as <code title="gcop-source-out"><a href="#gcop-source-out">source-out</a></code> but using the destination
-   image instead of the source image and vice versa.</span></dd>
-
-   <dt><dfn id="gcop-destination-over" title="gcop-destination-over"><code>destination-over</code></dfn></dt>
-
-   <dd><var title="">B</var> over <var title="">A</var>. <span class="note">Same as <code title="gcop-source-over"><a href="#gcop-source-over">source-over</a></code> but using the
-   destination image instead of the source image and vice versa.</span></dd>
-
-
-<!-- no clear definition of this operator (doesn't correspond to a PorterDuff operator)
-   <dt><dfn title="gcop-darker"><code>darker</code></dfn></dt>
-
-   <dd><span class="note">Display the sum of the source image and destination image,
-   with color values approaching 0 as a limit.</span></dd>
--->
-
-   <dt><dfn id="gcop-lighter" title="gcop-lighter"><code>lighter</code></dfn></dt>
-
-   <dd><var title="">A</var> plus <var title="">B</var>. <span class="note">Display the
-   sum of the source image and destination image, with color values
-   approaching 255 (100%) as a limit.</span></dd>
-
-
-   <dt><dfn id="gcop-copy" title="gcop-copy"><code>copy</code></dfn></dt>
-
-   <dd><var title="">A</var> (<var title="">B</var> is
-   ignored). <span class="note">Display the source image instead of the destination
-   image.</span></dd>
-
-
-   <dt><dfn id="gcop-xor" title="gcop-xor"><code>xor</code></dfn></dt>
-
-   <dd><var title="">A</var> xor <var title="">B</var>. <span class="note">Exclusive OR
-   of the source image and destination image.</span></dd>
-
-
-   <dt class="impl"><code><var title="">vendorName</var>-<var title="">operationName</var></code></dt>
-
-   <dd class="impl">Vendor-specific extensions to the list of
-   composition operators should use this syntax.</dd>
-
-  </dl><div class="impl">
-
-  <p>The operators in the above list must be treated as described by
-  the Porter-Duff operator given at the start of their description
-  (e.g. <var title="">A</var> over <var title="">B</var>). They are to
-  be applied as part of the <a href="#drawing-model">drawing model</a>, at which point the
-  <a href="#clipping-region">clipping region</a> is also applied. (Without a clipping
-  region, these operators act on the whole bitmap with every
-  operation.) <a href="#refsPORTERDUFF">[PORTERDUFF]</a></p>
-
-  <p>These values are all case-sensitive — they must be used
-  exactly as shown. User agents must not recognize values that are not
-  a <a href="#case-sensitive">case-sensitive</a> match for one of the values given
-  above.</p>
-
-  <p>On setting, if the user agent does not recognize the specified
-  value, it must be ignored, leaving the value of <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>
-  unaffected.</p>
-
-  <p>When the context is created, the <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>
-  attribute must initially have the value
-  <code>source-over</code>.</p>
-
-  </div>
-
-
-  <h6 id="colors-and-styles"><span class="secno">4.8.11.1.4 </span>Colors and styles</h6>
-
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
-
-    <p>Returns the current style used for stroking shapes.</p>
-
-    <p>Can be set, to change the stroke style.</p>
-
-    <p>The style can be either a string containing a CSS color, or a
-    <code><a href="#canvasgradient">CanvasGradient</a></code> or <code><a href="#canvaspattern">CanvasPattern</a></code>
-    object. Invalid values are ignored.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
-
-    <p>Returns the current style used for filling shapes.</p>
-
-    <p>Can be set, to change the fill style.</p>
-
-    <p>The style can be either a string containing a CSS color, or a
-    <code><a href="#canvasgradient">CanvasGradient</a></code> or <code><a href="#canvaspattern">CanvasPattern</a></code>
-    object. Invalid values are ignored.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <!-- v6 feature requests:
-
-   * Getting and setting colours by component to bypass the CSS value parsing.
-
-     Either:
-        context.fillStyle.red += 1;
-
-     Or:
-        var array = context.fillStyle;
-        array[1] += 1;
-        context.fillStyle = array;
-
-   * A more performant way of setting colours in general, e.g.:
-
-       context.setFillColor(r,g,b,a) // already supported by webkit
-
-     Or:
-
-       context.fillStyle = 0xRRGGBBAA; // set a 32bit int directly
-
-   * fill rule for deciding between winding and even-odd algorithms.
-     SVG has fill-rule: nonzero | evenodd
-       http://www.w3.org/TR/SVG/painting.html#FillProperties
-
-  -->
-
-  <p>The <dfn id="dom-context-2d-strokestyle" title="dom-context-2d-strokeStyle"><code>strokeStyle</code></dfn>
-  attribute represents the color or style to use for the lines around
-  shapes, and the <dfn id="dom-context-2d-fillstyle" title="dom-context-2d-fillStyle"><code>fillStyle</code></dfn>
-  attribute represents the color or style to use inside the
-  shapes.</p>
-
-  <p>Both attributes can be either strings,
-  <code><a href="#canvasgradient">CanvasGradient</a></code>s, or <code><a href="#canvaspattern">CanvasPattern</a></code>s. On
-  setting, strings must be <a href="#parsed-as-a-css-color-value" title="parsed as a CSS &lt;color&gt;
-  value">parsed as CSS &lt;color&gt; values</a> and the color
-  assigned, and <code><a href="#canvasgradient">CanvasGradient</a></code> and
-  <code><a href="#canvaspattern">CanvasPattern</a></code> objects must be assigned themselves. <a href="#refsCSSCOLOR">[CSSCOLOR]</a> If the value is a string but
-  cannot be <a href="#parsed-as-a-css-color-value">parsed as a CSS &lt;color&gt; value</a>, or is
-  neither a string, a <code><a href="#canvasgradient">CanvasGradient</a></code>, nor a
-  <code><a href="#canvaspattern">CanvasPattern</a></code>, then it must be ignored, and the
-  attribute must retain its previous value.</p>
-
-  <p>When set to a <code><a href="#canvaspattern">CanvasPattern</a></code> or
-  <code><a href="#canvasgradient">CanvasGradient</a></code> object, the assignment is
-  <a href="#live">live</a>, meaning that changes made to the object after the
-  assignment do affect subsequent stroking or filling of shapes.</p>
-
-  <p>On getting, if the value is a color, then the <a href="#serialization-of-a-color" title="serialization of a color">serialization of the color</a>
-  must be returned. Otherwise, if it is not a color but a
-  <code><a href="#canvasgradient">CanvasGradient</a></code> or <code><a href="#canvaspattern">CanvasPattern</a></code>, then the
-  respective object must be returned. (Such objects are opaque and
-  therefore only useful for assigning to other attributes or for
-  comparison to other gradients or patterns.)</p>
-
-  <p>The <dfn id="serialization-of-a-color">serialization of a color</dfn> for a color value is a
-  string, computed as follows: if it has alpha equal to 1.0, then the
-  string is a lowercase six-digit hex value, prefixed with a &quot;#&quot;
-  character (U+0023 NUMBER SIGN), with the first two digits
-  representing the red component, the next two digits representing the
-  green component, and the last two digits representing the blue
-  component, the digits being in the range 0-9 a-f (U+0030 to U+0039
-  and U+0061 to U+0066). Otherwise, the color value has alpha less
-  than 1.0, and the string is the color value in the CSS <code title="">rgba()</code> functional-notation format: the literal
-  string <code title="">rgba</code> (U+0072 U+0067 U+0062 U+0061)
-  followed by a U+0028 LEFT PARENTHESIS, a base-ten integer in the
-  range 0-255 representing the red component (using digits 0-9, U+0030
-  to U+0039, in the shortest form possible), a literal U+002C COMMA
-  and U+0020 SPACE, an integer for the green component, a comma and a
-  space, an integer for the blue component, another comma and space, a
-  U+0030 DIGIT ZERO, if the alpha value is greater than zero then a
-  U+002E FULL STOP (representing the decimal point), if the alpha
-  value is greater than zero then one or more digits in the range 0-9
-  (U+0030 to U+0039) representing the fractional part of the alpha
-  value, and finally a U+0029 RIGHT PARENTHESIS.</p> <!-- if people
-  complain this is unreadable, expand it into a <dl> with two nested
-  <ol>s -->
-
-  <p>When the context is created, the <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> and <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> attributes must
-  initially have the string value <code title="">#000000</code>.</p>
-
-  </div>
-
-  <hr/><p>There are two types of gradients, linear gradients and radial
-  gradients, both represented by objects implementing the opaque
-  <code><a href="#canvasgradient">CanvasGradient</a></code> interface.</p>
-
-  <p id="interpolation">Once a gradient has been created (see below),
-  stops are placed along it to define how the colors are distributed
-  along the gradient. <span class="impl">The color of the gradient at
-  each stop is the color specified for that stop. Between each such
-  stop, the colors and the alpha component must be linearly
-  interpolated over the RGBA space without premultiplying the alpha
-  value to find the color to use at that offset. Before the first
-  stop, the color must be the color of the first stop. After the last
-  stop, the color must be the color of the last stop. When there are
-  no stops, the gradient is transparent black.</span></p>
-
-  <dl class="domintro"><dt><var title="">gradient</var> . <code title="dom-canvasgradient-addColorStop"><a href="#dom-canvasgradient-addcolorstop">addColorStop</a></code>(<var title="">offset</var>, <var title="">color</var>)</dt>
-
-   <dd>
-
-    <p>Adds a color stop with the given color to the gradient at the
-    given offset. 0.0 is the offset at one end of the gradient, 1.0 is
-    the offset at the other end.</p>
-
-    <p>Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception if the offset
-    is out of range. Throws a <code><a href="#syntax_err">SYNTAX_ERR</a></code> exception if the
-    color cannot be parsed.</p>
-
-   </dd>
-
-   <dt><var title="">gradient</var> = <var title="">context</var> . <code title="dom-context-2d-createLinearGradient"><a href="#dom-context-2d-createlineargradient">createLinearGradient</a></code>(<var title="">x0</var>, <var title="">y0</var>, <var title="">x1</var>, <var title="">y1</var>)</dt>
-
-   <dd>
-
-    <p>Returns a <code><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
-    linear gradient that paints along the line given by the
-    coordinates represented by the arguments.</p>
-
-    <p>If any of the arguments are not finite numbers, throws a
-    <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception.</p>
-
-   </dd>
-
-   <dt><var title="">gradient</var> = <var title="">context</var> . <code title="dom-context-2d-createRadialGradient"><a href="#dom-context-2d-createradialgradient">createRadialGradient</a></code>(<var title="">x0</var>, <var title="">y0</var>, <var title="">r0</var>, <var title="">x1</var>, <var title="">y1</var>, <var title="">r1</var>)</dt>
-
-   <dd>
-
-    <p>Returns a <code><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
-    radial gradient that paints along the cone given by the circles
-    represented by the arguments.</p>
-
-    <p>If any of the arguments are not finite numbers, throws a
-    <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception. If either of the radii
-    are negative, throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>The <dfn id="dom-canvasgradient-addcolorstop" title="dom-canvasgradient-addColorStop"><code>addColorStop(<var title="">offset</var>, <var title="">color</var>)</code></dfn>
-  method on the <code><a href="#canvasgradient">CanvasGradient</a></code> interface adds a new stop
-  to a gradient. If the <var title="">offset</var> is less than 0,
-  greater than 1, infinite, or NaN, then an
-  <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception must be raised. If the <var title="">color</var> cannot be <a href="#parsed-as-a-css-color-value">parsed as a CSS &lt;color&gt;
-  value</a>, then a <code><a href="#syntax_err">SYNTAX_ERR</a></code> exception must be
-  raised. Otherwise, the gradient must have a new stop placed, at
-  offset <var title="">offset</var> relative to the whole gradient,
-  and with the color obtained by parsing <var title="">color</var> as
-  a CSS &lt;color&gt; value. If multiple stops are added at the same
-  offset on a gradient, they must be placed in the order added, with
-  the first one closest to the start of the gradient, and each
-  subsequent one infinitesimally further along towards the end point
-  (in effect causing all but the first and last stop added at each
-  point to be ignored).</p>
-
-  <p>The <dfn id="dom-context-2d-createlineargradient" title="dom-context-2d-createLinearGradient"><code>createLinearGradient(<var title="">x0</var>, <var title="">y0</var>, <var title="">x1</var>,
-  <var title="">y1</var>)</code></dfn> method takes four arguments
-  that represent the start point (<var title="">x0</var>, <var title="">y0</var>) and end point (<var title="">x1</var>, <var title="">y1</var>) of the gradient. If any of the arguments to <code title="dom-context-2d-createLinearGradient"><a href="#dom-context-2d-createlineargradient">createLinearGradient()</a></code>
-  are infinite or NaN, the method must raise a
-  <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception. Otherwise, the method must
-  return a linear <code><a href="#canvasgradient">CanvasGradient</a></code> initialized with the
-  specified line.</p>
-
-  <p>Linear gradients must be rendered such that all points on a line
-  perpendicular to the line that crosses the start and end points have
-  the color at the point where those two lines cross (with the colors
-  coming from the <a href="#interpolation">interpolation and
-  extrapolation</a> described above). The points in the linear
-  gradient must be transformed as described by the <a href="#transformations" title="dom-context-2d-transformation">current transformation
-  matrix</a> when rendering.</p>
-
-  <p>If <span title=""><var title="">x0</var> = <var title="">x1</var></span> and <span title=""><var title="">y0</var> = <var title="">y1</var></span>, then
-  the linear gradient must paint nothing.</p>
-
-  <p>The <dfn id="dom-context-2d-createradialgradient" title="dom-context-2d-createRadialGradient"><code>createRadialGradient(<var title="">x0</var>, <var title="">y0</var>, <var title="">r0</var>,
-  <var title="">x1</var>, <var title="">y1</var>, <var title="">r1</var>)</code></dfn> method takes six arguments, the
-  first three representing the start circle with origin (<var title="">x0</var>, <var title="">y0</var>) and radius <var title="">r0</var>, and the last three representing the end circle
-  with origin (<var title="">x1</var>, <var title="">y1</var>) and
-  radius <var title="">r1</var>. The values are in coordinate space
-  units. If any of the arguments are infinite or NaN, a
-  <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception must be raised. If either
-  of <var title="">r0</var> or <var title="">r1</var> are negative, an
-  <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception must be raised. Otherwise,
-  the method must return a radial <code><a href="#canvasgradient">CanvasGradient</a></code>
-  initialized with the two specified circles.</p>
-
-  <p>Radial gradients must be rendered by following these steps:</p>
-
-  <ol><li><p>If <span title=""><var title="">x<sub>0</sub></var> = <var title="">x<sub>1</sub></var></span> and <span title=""><var title="">y<sub>0</sub></var> = <var title="">y<sub>1</sub></var></span> and <span title=""><var title="">r<sub>0</sub></var> = <var title="">r<sub>1</sub></var></span>, then the radial gradient must
-   paint nothing. Abort these steps.</p></li>
-
-   <li>
-
-    <p>Let <span title="">x(<var title="">ω</var>) = (<var title="">x<sub>1</sub></var>-<var title="">x<sub>0</sub></var>)<var title="">ω</var> + <var title="">x<sub>0</sub></var></span></p>
-
-    <p>Let <span title="">y(<var title="">ω</var>) = (<var title="">y<sub>1</sub></var>-<var title="">y<sub>0</sub></var>)<var title="">ω</var> + <var title="">y<sub>0</sub></var></span></p>
-
-    <p>Let <span title="">r(<var title="">ω</var>) = (<var title="">r<sub>1</sub></var>-<var title="">r<sub>0</sub></var>)<var title="">ω</var> + <var title="">r<sub>0</sub></var></span></p>
-
-    <p>Let the color at <var title="">ω</var> be the color at
-    that position on the gradient (with the colors coming from the <a href="#interpolation">interpolation and extrapolation</a>
-    described above).</p>
-
-   </li>
-
-   <li><p>For all values of <var title="">ω</var> where <span title="">r(<var title="">ω</var>) &gt; 0</span>,
-   starting with the value of <var title="">ω</var> nearest to
-   positive infinity and ending with the value of <var title="">ω</var> nearest to negative infinity, draw the
-   circumference of the circle with radius <span title="">r(<var title="">ω</var>)</span> at position (<span title="">x(<var title="">ω</var>)</span>, <span title="">y(<var title="">ω</var>)</span>), with the color at <var title="">ω</var>, but only painting on the parts of the
-   canvas that have not yet been painted on by earlier circles in this
-   step for this rendering of the gradient.</p></li>
-
-  </ol><p class="note">This effectively creates a cone, touched by the two
-  circles defined in the creation of the gradient, with the part of
-  the cone before the start circle (0.0) using the color of the first
-  offset, the part of the cone after the end circle (1.0) using the
-  color of the last offset, and areas outside the cone untouched by
-  the gradient (transparent black).</p>
-
-  <p>The points in the radial gradient must be transformed as
-  described by the <a href="#transformations" title="dom-context-2d-transformation">current
-  transformation matrix</a> when rendering.</p>
-
-  <p>Gradients must be painted only where the relevant stroking or
-  filling effects requires that they be drawn.</p>
-
-<!--
-  <p>Support for actually painting gradients is optional. Instead of
-  painting the gradients, user agents may instead just paint the first
-  stop's color. However, <code
-  title="dom-context-2d-createLinearGradient">createLinearGradient()</code>
-  and <code
-  title="dom-context-2d-createRadialGradient">createRadialGradient()</code>
-  must always return objects when passed valid arguments.</p>
--->
-
-  </div>
-
-  <hr/><p>Patterns are represented by objects implementing the opaque
-  <code><a href="#canvaspattern">CanvasPattern</a></code> interface.</p>
-
-  <dl class="domintro"><dt><var title="">pattern</var> = <var title="">context</var> . <code title="dom-context-2d-createPattern"><a href="#dom-context-2d-createpattern">createPattern</a></code>(<var title="">image</var>, <var title="">repetition</var>)</dt>
-
-   <dd>
-
-    <p>Returns a <code><a href="#canvaspattern">CanvasPattern</a></code> object that uses the given image
-    and repeats in the direction(s) given by the <var title="">repetition</var> argument.</p>
-
-    <p>The allowed values for <var title="">repetition</var> are <code title="">repeat</code> (both directions), <code title="">repeat-x</code> (horizontal only), <code title="">repeat-y</code> (vertical only), and <code title="">no-repeat</code> (neither). If the <var title="">repetition</var> argument is empty, the value <code title="">repeat</code> is used.</p>
-
-    <p>If the image has no image data, throws an
-    <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code> exception. If the second argument
-    isn't one of the allowed values, throws a <code><a href="#syntax_err">SYNTAX_ERR</a></code>
-    exception. If the image isn't yet fully decoded, then the method
-    returns null.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>To create objects of this type, the <dfn id="dom-context-2d-createpattern" title="dom-context-2d-createPattern"><code>createPattern(<var title="">image</var>, <var title="">repetition</var>)</code></dfn>
-  method is used. The first argument gives the image to use as the
-  pattern (either an <code><a href="#htmlimageelement">HTMLImageElement</a></code>,
-  <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
-  object). Modifying this image after calling the <code title="dom-context-2d-createPattern"><a href="#dom-context-2d-createpattern">createPattern()</a></code> method
-  must not affect the pattern. The second argument must be a string
-  with one of the following values: <code title="">repeat</code>,
-  <code title="">repeat-x</code>, <code title="">repeat-y</code>,
-  <code title="">no-repeat</code>. If the empty string is specified,
-  <code title="">repeat</code> must be assumed. If an unrecognized value
-  is given, then the user agent must raise a <code><a href="#syntax_err">SYNTAX_ERR</a></code>
-  exception. User agents must recognize the four values described above
-  exactly (e.g. they must not do case folding). Except as specified
-  below, the method must return a <code><a href="#canvaspattern">CanvasPattern</a></code> object
-  suitably initialized.</p>
-
-  <p>The <var title="">image</var> argument is an instance of either
-  <code><a href="#htmlimageelement">HTMLImageElement</a></code>, <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or
-  <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>.</p> <!-- drawImage() has an equivalent
-  paragraph -->
-
-  <p>If the <var title="">image</var> argument is an
-  <code><a href="#htmlimageelement">HTMLImageElement</a></code> object that is not <a href="#img-good" title="img-good">fully decodable</a>, or if the <var title="">image</var> argument is an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
-  object whose <code title="dom-media-readyState"><a href="#dom-media-readystate">readyState</a></code>
-  attribute is either <code title="dom-media-HAVE_NOTHING"><a href="#dom-media-have_nothing">HAVE_NOTHING</a></code> or <code title="dom-media-HAVE_METADATA"><a href="#dom-media-have_metadata">HAVE_METADATA</a></code>, then the
-  implementation must return null.</p> <!-- drawImage() has an
-  equivalent paragraph -->
-
-  <p>If the <var title="">image</var> argument is an
-  <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> object with either a horizontal
-  dimension or a vertical dimension equal to zero, then the
-  implementation must raise an <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code>
-  exception.</p>
-  <!-- drawImage() has an equivalent paragraph -->
-
-  <p>Patterns must be painted so that the top left of the first image
-  is anchored at the origin of the coordinate space, and images are
-  then repeated horizontally to the left and right (if the
-  <code>repeat-x</code> string was specified) or vertically up and
-  down (if the <code>repeat-y</code> string was specified) or in all
-  four directions all over the canvas (if the <code>repeat</code>
-  string was specified). The images are not scaled by this process;
-  one CSS pixel of the image must be painted on one coordinate space
-  unit. Of course, patterns must actually be painted only where the
-  stroking or filling effect requires that they be drawn, and are
-  affected by the current transformation matrix.</p>
-
-  <p>If the original image data is a bitmap image, the value painted
-  at a point in the area of the repetitions is computed by filtering
-  the original image data. The user agent may use any filtering
-  algorithm (for example bilinear interpolation or nearest-neighbor).
-  When the filtering algorithm requires a pixel value from outside the
-  original image data, it must instead use the value from wrapping the
-  pixel's coordinates to the original image's dimensions. (That is,
-  the filter uses 'repeat' behavior, regardless of the value of
-  <var title="">repetition</var>.)
-  <!-- drawImage() has a similar paragraph with different rules -->
-
-  </p><p>When the <code title="dom-context-2d-createPattern"><a href="#dom-context-2d-createpattern">createPattern()</a></code> method
-  is passed an animated image as its <var title="">image</var>
-  argument, the user agent must use the poster frame of the animation,
-  or, if there is no poster frame, the first frame of the
-  animation.</p>
-  <!-- drawImage() has an equivalent paragraph -->
-
-  <p>When the <var title="">image</var> argument is an
-  <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>, then the frame at the <a href="#current-playback-position">current
-  playback position</a> must be used as the source image, and the
-  source image's dimensions must be the <a href="#concept-video-intrinsic-width" title="concept-video-intrinsic-width">intrinsic width</a> and
-  <a href="#concept-video-intrinsic-height" title="concept-video-intrinsic-height">intrinsic height</a>
-  of the <a href="#media-resource">media resource</a> (i.e. after any aspect-ratio
-  correction has been applied).</p>
-  <!-- drawImage() has an equivalent paragraph -->
-
-  <!--
-   Requests for v6 features:
-    * apply transforms to patterns, so you don't have to create
-      transformed patterns manually by rendering them to an off-screen
-      canvas then using that canvas as the pattern.
-  -->
-
-  </div>
-
-
-
-  <h6 id="line-styles"><span class="secno">4.8.11.1.5 </span>Line styles</h6>
-
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-linewidth"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linewidth-2"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> [ = <var>value</var> ]</dt><dd>
 
     <p>Returns the current line width.</p>
 
-    <p>Can be set, to change the line width. Values that are not
-    finite values greater than zero are ignored.</p>
+    <p>Can be set, to change the line width. Values that are not finite values greater than zero are
+    ignored.</p>
 
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-linecap"><a href="#dom-context-2d-linecap-2">lineCap</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linecap-2"><a href="#dom-context-2d-linecap-2">lineCap</a></code> [ = <var>value</var> ]</dt><dd>
 
     <p>Returns the current line cap style.</p>
 
     <p>Can be set, to change the line cap style.</p>
 
-    <p>The possible line cap styles are <code>butt</code>,
-    <code>round</code>, and <code>square</code>. Other values are
-    ignored.</p>
+    <p>The possible line cap styles are &quot;<code>butt</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>square</code>&quot;. Other values are ignored.</p>
 
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-linejoin"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linejoin-2"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> [ = <var>value</var> ]</dt><dd>
 
     <p>Returns the current line join style.</p>
 
     <p>Can be set, to change the line join style.</p>
 
-    <p>The possible line join styles are <code>bevel</code>,
-    <code>round</code>, and <code>miter</code>. Other values are
-    ignored.</p>
+    <p>The possible line join styles are &quot;<code>bevel</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>miter</code>&quot;. Other values are ignored.</p>
 
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> [ = <var title="">value</var> ]</dt>
-
-   <dd>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-miterlimit"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-miterlimit-2"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> [ = <var>value</var> ]</dt><dd>
 
     <p>Returns the current miter limit ratio.</p>
 
-    <p>Can be set, to change the miter limit ratio. Values that are
-    not finite values greater than zero are ignored.</p>
+    <p>Can be set, to change the miter limit ratio. Values that are not finite values greater than
+    zero are ignored.</p>
 
-   </dd>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-setlinedash"><a href="#dom-context-2d-setlinedash-2">setLineDash</a></code>(<var>segments</var>)</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-setlinedash-2"><a href="#dom-context-2d-setlinedash-2">setLineDash</a></code>(<var>segments</var>)</dt><dd>
 
-  </dl><div class="impl">
+    <p>Sets the current line dash pattern (as used when stroking). The argument is a list of
+    distances for which to alternately have the line on and the line off.</p>
 
-  <p>The <dfn id="dom-context-2d-linewidth" title="dom-context-2d-lineWidth"><code>lineWidth</code></dfn>
-  attribute gives the width of lines, in coordinate space units. On
-  getting, it must return the current value. On setting, zero,
-  negative, infinite, and NaN values must be ignored, leaving the
-  value unchanged; other values must change the current value to the
-  new value.</p>
+   </dd><dt><var>segments</var> = <var>context</var> . <code id="dom-context-2d-getlinedash"><a href="#dom-context-2d-getlinedash-2">getLineDash</a></code>()</dt><dt><var>segments</var> = <var>styles</var> . <code id="line-styles:dom-context-2d-getlinedash-2"><a href="#dom-context-2d-getlinedash-2">getLineDash</a></code>()</dt><dd>
 
-  <p>When the context is created, the <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code> attribute must
-  initially have the value <code>1.0</code>.</p>
+    <p>Returns a copy of the current line dash pattern. The array returned will always have an even
+    number of entries (i.e. the pattern is normalized).</p>
 
-  <hr/><p>The <dfn id="dom-context-2d-linecap" title="dom-context-2d-lineCap"><code>lineCap</code></dfn> attribute
-  defines the type of endings that UAs will place on the end of
-  lines. The three valid values are <code>butt</code>,
-  <code>round</code>, and <code>square</code>. The <code>butt</code>
-  value means that the end of each line has a flat edge perpendicular
-  to the direction of the line (and that no additional line cap is
-  added). The <code>round</code> value means that a semi-circle with
-  the diameter equal to the width of the line must then be added on to
-  the end of the line. The <code>square</code> value means that a
-  rectangle with the length of the line width and the width of half
-  the line width, placed flat against the edge perpendicular to the
-  direction of the line, must be added at the end of each line.</p>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-linedashoffset"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code></dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linedashoffset-2"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code></dt><dd>
 
-  <p>On getting, it must return the current value. On setting, if the
-  new value is one of the literal strings <code>butt</code>,
-  <code>round</code>, and <code>square</code>, then the current value
-  must be changed to the new value; other values must ignored, leaving
-  the value unchanged.</p>
+    <p>Returns the phase offset (in the same units as the line dash pattern).</p>
 
-  <p>When the context is created, the <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code> attribute must
-  initially have the value <code>butt</code>.</p>
+    <p>Can be set, to change the phase offset. Values that are not finite values are ignored.</p>
 
-  <hr/><p>The <dfn id="dom-context-2d-linejoin" title="dom-context-2d-lineJoin"><code>lineJoin</code></dfn>
-  attribute defines the type of corners that UAs will place where two
-  lines meet. The three valid values are <code>bevel</code>,
-  <code>round</code>, and <code>miter</code>.</p>
+   </dd></dl>
 
-  <p>On getting, it must return the current value. On setting, if the
-  new value is one of the literal strings <code>bevel</code>,
-  <code>round</code>, and <code>miter</code>, then the current value
-  must be changed to the new value; other values must be ignored,
-  leaving the value unchanged.</p>
+  
 
-  <p>When the context is created, the <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code> attribute must
-  initially have the value <code>miter</code>.</p>
+  <p>Objects that implement the <code id="line-styles:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface have attributes and
+  methods (defined in this section) that control how lines are treated by the object.</p>
 
-  <hr/><p>A join exists at any point in a subpath shared by two consecutive
-  lines. When a subpath is closed, then a join also exists at its
-  first point (equivalent to its last point) connecting the first and
-  last lines in the subpath.</p>
+  <p>The <dfn id="dom-context-2d-linewidth-2"><code>lineWidth</code></dfn> attribute gives the
+  width of lines, in coordinate space units. On getting, it must return the current value. On
+  setting, zero, negative, infinite, and NaN values must be ignored, leaving the value unchanged;
+  other values must change the current value to the new value.</p>
 
-  <p>In addition to the point where the join occurs, two additional
-  points are relevant to each join, one for each line: the two corners
-  found half the line width away from the join point, one
-  perpendicular to each line, each on the side furthest from the other
-  line.</p>
+  <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-2"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+  <code id="line-styles:dom-context-2d-linewidth-2-2"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> attribute must initially have the value
+  1.0.</p>
 
-  <p>A filled triangle connecting these two opposite corners with a
-  straight line, with the third point of the triangle being the join
-  point, must be rendered at all joins. The <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code> attribute controls
-  whether anything else is rendered. The three aforementioned values
-  have the following meanings:</p>
+  <hr/>
 
-  <p>The <code>bevel</code> value means that this is all that is
-  rendered at joins.</p>
+  <p>The <dfn id="dom-context-2d-linecap-2"><code>lineCap</code></dfn> attribute defines the type
+  of endings that UAs will place on the end of lines. The three valid values are &quot;<code>butt</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>square</code>&quot;.</p>
 
-  <p>The <code>round</code> value means that a filled arc connecting
-  the two aforementioned corners of the join, abutting (and not
-  overlapping) the aforementioned triangle, with the diameter equal to
-  the line width and the origin at the point of the join, must be
-  rendered at joins.</p>
+  <p>On getting, it must return the current value. On setting, the current value must be changed
+  to the new value.</p>
 
-  <p>The <code>miter</code> value means that a second filled triangle
-  must (if it can given the miter length) be rendered at the join,
-  with one line being the line between the two aforementioned corners,
-  abutting the first triangle, and the other two being continuations of
-  the outside edges of the two joining lines, as long as required to
-  intersect without going over the miter length.</p>
+  <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-3"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+  <code id="line-styles:dom-context-2d-linecap-2-2"><a href="#dom-context-2d-linecap-2">lineCap</a></code> attribute must initially have the value
+  &quot;<code>butt</code>&quot;.</p>
 
-  <p>The miter length is the distance from the point where the join
-  occurs to the intersection of the line edges on the outside of the
-  join. The miter limit ratio is the maximum allowed ratio of the
-  miter length to half the line width. If the miter length would cause
-  the miter limit ratio to be exceeded, this second triangle must not
-  be rendered.</p>
+  <hr/>
 
-  <p>The miter limit ratio can be explicitly set using the <dfn id="dom-context-2d-miterlimit" title="dom-context-2d-miterLimit"><code>miterLimit</code></dfn>
-  attribute. On getting, it must return the current value. On setting,
-  zero, negative, infinite, and NaN values must be ignored, leaving
-  the value unchanged; other values must change the current value to
-  the new value.</p>
+  <p>The <dfn id="dom-context-2d-linejoin-2"><code>lineJoin</code></dfn> attribute defines the type
+  of corners that UAs will place where two lines meet. The three valid values are
+  &quot;<code>bevel</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>miter</code>&quot;.</p>
 
-  <p>When the context is created, the <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> attribute must
-  initially have the value <code>10.0</code>.</p>
+  <p>On getting, it must return the current value. On setting, the current value must be changed
+  to the new value.</p>
 
-  <!--
-v6: dashed lines have been requested. Philip Taylor provides these
-notes on what would need to be defined for dashed lines:
-> I don't think it's entirely trivial to add, to the detail that's
-> necessary in a specification. The common graphics APIs (at least
-> Cairo, Quartz and java.awt.Graphics, and any SVG implementation) all
-> have dashes specified by passing an array of dash lengths (alternating
-> on/off), so that should be alright as long as you define what units
-> it's measured in and what happens when you specify an odd number of
-> values and how errors are handled and what happens if you update the
-> array later. But after that, what does it do when stroking multiple
-> subpaths, in terms of offsetting the dashes? When you use strokeRect,
-> where is offset 0? Does moveTo reset the offset? How does it interact
-> with lineCap/lineJoin? All the potential issues need test cases too,
-> and the implementations need to make sure they handle any edge cases
-> that the underlying graphics library does differently. (SVG Tiny 1.2
-> appears to skip some of the problems by leaving things undefined and
-> allowing whatever behavior the graphics library has.)
+  <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-4"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+  <code id="line-styles:dom-context-2d-linejoin-2-2"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> attribute must initially have the value
+  &quot;<code>miter</code>&quot;.</p>
 
-Another request has been for hairline width lines, that remain
-hairline width with transform. ack Shaun Morris.
-  -->
+  <hr/>
+
+  <p>When the <code id="line-styles:dom-context-2d-linejoin-2-3"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> attribute has the value &quot;<code>miter</code>&quot;, strokes use the miter limit ratio to decide how to render joins. The
+  miter limit ratio can be explicitly set using the <dfn id="dom-context-2d-miterlimit-2"><code>miterLimit</code></dfn> attribute. On getting, it must return
+  the current value. On setting, zero, negative, infinite, and NaN values must be ignored, leaving
+  the value unchanged; other values must change the current value to the new value.</p>
+  
+
+  <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-5"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+  <code id="line-styles:dom-context-2d-miterlimit-2-2"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> attribute must initially have the value
+  10.0.</p>
+
+  <hr/>
+
+  <p>Each <code id="line-styles:canvaspathdrawingstyles-6"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> object has a <dfn id="dash-list">dash list</dfn>, which is either
+  empty or consists of an even number of non-negative numbers. Initially, the <a href="#dash-list" id="line-styles:dash-list">dash list</a>
+  must be empty.</p>
+
+  <p>The <dfn id="dom-context-2d-setlinedash-2"><code>setLineDash()</code></dfn> method, when
+  invoked, must run these steps:</p>
+
+  <ol><li><p>Let <var>a</var> be the argument.</p></li><li><p>If any value in <var>a</var> is not finite (e.g. an Infinity or a NaN value), or
+   if any value is negative (less than zero), then abort these steps (without throwing an exception;
+   user agents could show a message on a developer console, though, as that would be helpful for
+   debugging).</p></li><li><p>If the number of elements in <var>a</var> is odd, then let <var>a</var>
+   be the concatenation of two copies of <var>a</var>.</p></li><li><p>Let the object's <a href="#dash-list" id="line-styles:dash-list-2">dash list</a> be <var>a</var>.</p></li></ol>
+
+  <p>When the <dfn id="dom-context-2d-getlinedash-2"><code>getLineDash()</code></dfn> method is
+  invoked, it must return a sequence whose values are the values of the object's <a href="#dash-list" id="line-styles:dash-list-3">dash
+  list</a>, in the same order.</p>
+
+  <p>It is sometimes useful to change the &quot;phase&quot; of the dash pattern, e.g. to achieve a &quot;marching
+  ants&quot; effect. The phase can be set using the <dfn id="dom-context-2d-linedashoffset-2"><code>lineDashOffset</code></dfn> attribute. On getting, it must
+  return the current value. On setting, infinite and NaN values must be ignored, leaving the value
+  unchanged; other values must change the current value to the new value.</p>
+
+  <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-7"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+  <code id="line-styles:dom-context-2d-linedashoffset-2-2"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code> attribute must initially have
+  the value 0.0.</p>
+
+  <hr/>
+
+  <p>When a user agent is to <dfn id="trace-a-path">trace a path</dfn>, given an object <var>style</var>
+  that implements the <code id="line-styles:canvaspathdrawingstyles-8"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface, it must run the following
+  algorithm. This algorithm returns a new <a href="#concept-path" id="line-styles:concept-path">path</a>.</p>
+
+  <ol><li><p>Let <var>path</var> be a copy of the path being traced.</p></li><li><p>Prune all zero-length <a href="#line-segments" id="line-styles:line-segments">line segments</a> from <var>path</var>.</p></li><li><p>Remove from <var>path</var> any subpaths containing no lines (i.e. subpaths with
+   just one point).</p></li><li><p>Replace each point in each subpath of <var>path</var> other than the first point
+   and the last point of each subpath by a <i>join</i> that joins the line leading to that point to
+   the line leading out of that point, such that the subpaths all consist of two points (a starting
+   point with a line leading out of it, and an ending point with a line leading into it), one or
+   more lines (connecting the points and the joins), and zero or more joins (each connecting one
+   line to another), connected together such that each subpath is a series of one or more lines with
+   a join between each one and a point on each end.</p></li><li><p>Add a straight closing line to each closed subpath in <var>path</var> connecting
+   the last point and the first point of that subpath; change the last point to a join (from the
+   previously last line to the newly added closing line), and change the first point to a join (from
+   the newly added closing line to the first line).</p>
+
+   </li><li><p>If the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-4">dash list</a> is empty, then jump to the step
+   labeled <i>convert</i>.</p></li><li><p>Let <var>pattern width</var> be the concatenation of all the entries of the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-5">dash list</a>, in coordinate space units.</p>
+
+   </li><li><p>For each subpath <var>subpath</var> in <var>path</var>, run the
+   following substeps. These substeps mutate the subpaths in <var>path</var> <i>in
+   vivo</i>.</p>
+
+    <ol><li><p>Let <var>subpath width</var> be the length of all the lines of <var>subpath</var>, in coordinate space units.</p>
+
+     </li><li><p>Let <var>offset</var> be the value of the <var>styles</var> <code id="line-styles:dom-context-2d-linedashoffset-2-3"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code>, in coordinate space
+     units.</p></li><li>
+
+      <p>While <var>offset</var> is greater than <var>pattern width</var>,
+      decrement it by <var>pattern width</var>.</p>
+
+      <p>While <var>offset</var> is less than zero, increment it by <var>pattern
+      width</var>.</p>
+
+     </li><li><p>Define <var>L</var> to be a linear coordinate line defined along all lines in
+     <var>subpath</var>, such that the start of the first line in the subpath is defined
+     as coordinate 0, and the end of the last line in the subpath is defined as coordinate <var>subpath width</var>.</p></li><li><p>Let <var>position</var> be zero minus <var>offset</var>.</p></li><li><p>Let <var>index</var> be 0.</p></li><li><p>Let <var>current state</var> be <i>off</i> (the other states being <i>on</i>
+     and <i>zero-on</i>).</p></li><li><p><i>Dash on</i>: Let <var>segment length</var> be
+     the value of the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-6">dash
+     list</a>'s <var>index</var>th entry.</p></li><li><p>Increment <var>position</var> by <var>segment length</var>.</p></li><li><p>If <var>position</var> is greater than <var>subpath width</var>,
+     then end these substeps for this subpath and start them again for the next subpath; if there
+     are no more subpaths, then jump to the step labeled <i>convert</i> instead.</p></li><li><p>If <var>segment length</var> is non-zero, then let <var>current state</var> be
+     <i>on</i>.</p></li><li><p>Increment <var>index</var> by one.</p></li><li><p><i>Dash off</i>: Let <var>segment
+     length</var> be the value of the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-7">dash list</a>'s <var>index</var>th entry.</p></li><li><p>Let <var>start</var> be the offset <var>position</var> on <var>L</var>.</p></li><li><p>Increment <var>position</var> by <var>segment length</var>.</p></li><li><p>If <var>position</var> is less than zero, then jump to the step labeled
+     <i>post-cut</i>.</p></li><li><p>If <var>start</var> is less than zero, then let <var>start</var> be
+     zero.</p></li><li><p>If <var>position</var> is greater than <var>subpath width</var>,
+     then let <var>end</var> be the offset <var>subpath width</var> on <var>L</var>. Otherwise, let <var>end</var> be the offset <var>position</var> on <var>L</var>.</p></li><li>
+
+      <p>Jump to the first appropriate step:</p>
+
+      <dl class="switch"><dt>If <var>segment length</var> is zero and <var>current state</var> is
+       <i>off</i></dt><dd>
+
+        <p>Do nothing, just continue to the next step.</p>
+
+       </dd><dt>If <var>current state</var> is <i>off</i></dt><dd>
+
+        <p>Cut the line on which <var>end</var> finds itself short at <var>end</var> and place a point there, cutting the subpath that it was in in two;
+        remove all line segments, joins, points, and subpaths that are between <var>start</var> and <var>end</var>; and finally place a single point at <var>start</var> with no lines connecting to it.</p>
+
+        <p>The point has a <i>directionality</i> for the purposes of drawing line caps (see below).
+        The directionality is the direction that the original line had at that point (i.e. when <var>L</var> was defined above).</p>
+
+       </dd><dt>Otherwise</dt><dd>
+
+        <p>Cut the line on which <var>start</var> finds itself into two at <var>start</var> and place a point there, cutting the subpath that it was in in two, and
+        similarly cut the line on which <var>end</var> finds itself short at <var>end</var> and place a point there, cutting the subpath that <em>it</em> was in in
+        two, and then remove all line segments, joins, points, and subpaths that are between <var>start</var> and <var>end</var>.</p>
+
+        <p>If <var>start</var> and <var>end</var> are the same point, then this
+        results in just the line being cut in two and two points being inserted there, with nothing
+        being removed, unless a join also happens to be at that point, in which case the join must
+        be removed.</p>
+
+       </dd></dl>
+
+     </li><li><p><i>Post-cut</i>: If <var>position</var> is greater than <var>subpath width</var>, then jump to the step labeled <i>convert</i>.</p></li><li><p>If <var>segment length</var> is greater than zero, then let
+     <var>positioned-at-on-dash</var> be false.</p></li><li><p>Increment <var>index</var> by one. If it is equal to the number of entries in
+     the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-8">dash list</a>, then let <var>index</var> be
+     0.</p></li><li><p>Return to the step labeled <i>dash on</i>.</p></li></ol>
+
+   </li><li>
+
+    <p><i>Convert</i>: This is the step that converts the path to a new path that represents its
+    stroke.</p>
+
+    <p>Create a new <a href="#concept-path" id="line-styles:concept-path-2">path</a> that describes the edge of the areas
+    that would be covered if a straight line of length equal to the <var>styles</var>
+    <code id="line-styles:dom-context-2d-linewidth-2-3"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> was swept along each subpath in <var>path</var> while being kept at an angle such that the line is orthogonal to the path
+    being swept, replacing each point with the end cap necessary to satisfy the <var>styles</var> <code id="line-styles:dom-context-2d-linecap-2-3"><a href="#dom-context-2d-linecap-2">lineCap</a></code> attribute as
+    described previously and elaborated below, and replacing each join with the join necessary to
+    satisfy the <var>styles</var> <code id="line-styles:dom-context-2d-linejoin-2-4"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code>
+    type, as defined below.</p>
+
+    <p><strong>Caps</strong>: Each point has a flat edge perpendicular to the direction of the line
+    coming out of it. This is then augmented according to the value of the <var>styles</var> <code id="line-styles:dom-context-2d-linecap-2-4"><a href="#dom-context-2d-linecap-2">lineCap</a></code>. The &quot;<code>butt</code>&quot; value means that no additional line cap is added. The &quot;<code>round</code>&quot; value means that a semi-circle with the diameter equal to the <var>styles</var> <code id="line-styles:dom-context-2d-linewidth-2-4"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> width must
+    additionally be placed on to the line coming out of each point. The &quot;<code>square</code>&quot; value means that a rectangle with the length of the <var>styles</var> <code id="line-styles:dom-context-2d-linewidth-2-5"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> width and the
+    width of half the <var>styles</var> <code id="line-styles:dom-context-2d-linewidth-2-6"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> width, placed flat against the edge
+    perpendicular to the direction of the line coming out of the point, must be added at each
+    point.</p>
+
+    <p>Points with no lines coming out of them must have two caps placed back-to-back as if it was
+    really two points connected to each other by an infinitesimally short straight line in the
+    direction of the point's <i>directionality</i> (as defined above).</p>
+
+    <p><strong>Joins</strong>: In addition to the point where a join occurs, two additional points
+    are relevant to each join, one for each line: the two corners found half the line width away
+    from the join point, one perpendicular to each line, each on the side furthest from the other
+    line.</p>
+
+    <p>A triangle connecting these two opposite corners with a straight line, with the third point
+    of the triangle being the join point, must be added at all joins. The <code id="line-styles:dom-context-2d-linejoin-2-5"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> attribute controls whether anything else is
+    rendered. The three aforementioned values have the following meanings:</p>
+
+    <p>The &quot;<code>bevel</code>&quot; value means that this is all that is rendered at
+    joins.</p>
+
+    <p>The &quot;<code>round</code>&quot; value means that an arc connecting the two aforementioned
+    corners of the join, abutting (and not overlapping) the aforementioned triangle, with the
+    diameter equal to the line width and the origin at the point of the join, must be added at
+    joins.</p>
+
+    <p>The &quot;<code>miter</code>&quot; value means that a second triangle must (if it can given
+    the miter length) be added at the join, with one line being the line between the two
+    aforementioned corners, abutting the first triangle, and the other two being continuations of
+    the outside edges of the two joining lines, as long as required to intersect without going over
+    the miter length.</p>
+
+    <p>The miter length is the distance from the point where the join occurs to the intersection of
+    the line edges on the outside of the join. The miter limit ratio is the maximum allowed ratio of
+    the miter length to half the line width. If the miter length would cause the miter limit ratio
+    (as set by the <var>style</var> <code id="line-styles:dom-context-2d-miterlimit-2-3"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> attribute) to be exceeded, then this second
+    triangle must not be added.</p> 
+
+
+
+    <p>The subpaths in the newly created path must be oriented such that for any point, the number
+    of times a half-infinite straight line drawn from that point crosses a subpath is even if and
+    only if the number of times a half-infinite straight line drawn from that same point crosses a
+    subpath going in one direction is equal to the number of times it crosses a subpath going in the
+    other direction.</p>
+
+   </li><li><p>Return the newly created path.</p></li></ol>
+
+
+
+  
+
+
+  <h6 id="text-styles"><span class="secno">4.12.5.1.4</span> Text styles<a class="self-link" href="#text-styles"/></h6>
+
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-font"><a href="#dom-context-2d-font-2">font</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current font settings.</p>
+
+    <p>Can be set, to change the font. The syntax is the same as for the CSS <a data-x-internal="'font'" href="https://drafts.csswg.org/css-fonts/#font-prop" id="text-styles:'font'">'font'</a>
+    property; values that cannot be parsed as CSS font values are ignored.</p>
+
+    <p>Relative keywords and lengths are computed relative to the font of the <code id="text-styles:the-canvas-element"><a href="#the-canvas-element">canvas</a></code>
+    element.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-textalign"><a href="#dom-context-2d-textalign-2">textAlign</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-textalign-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current text alignment settings.</p>
+
+    <p>Can be set, to change the alignment. The possible values are and their meanings are given
+    below. Other values are ignored. The default is &quot;<code>start</code>&quot;.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-textbaseline"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-textbaseline-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current baseline alignment settings.</p>
+
+    <p>Can be set, to change the baseline alignment. The possible values and their meanings are
+    given below. Other values are ignored. The default is &quot;<code id="text-styles:dom-context-2d-textbaseline-alphabetic"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code>&quot;.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-direction"><a href="#dom-context-2d-direction-2">direction</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-direction-2"><a href="#dom-context-2d-direction-2">direction</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current directionality.</p>
+
+    <p>Can be set, to change the directionality. The possible values and their meanings are given
+    below. Other values are ignored. The default is &quot;<code id="text-styles:dom-context-2d-direction-inherit"><a href="#dom-context-2d-direction-inherit">inherit</a></code>&quot;.</p>
+
+   </dd></dl>
+
+  
+
+  <p>Objects that implement the <code id="text-styles:canvastextdrawingstyles"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface have attributes
+  (defined in this section) that control how text is laid out (rasterized or outlined) by the
+  object. Such objects can also have a <dfn id="font-style-source-object">font style source object</dfn>. For
+  <code id="text-styles:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> objects, this is the <code id="text-styles:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element
+  referenced by the context's canvas property.</p>
+
+  
+
+  <p>The <dfn id="dom-context-2d-font-2"><code>font</code></dfn> IDL attribute, on setting, must
+  be <a data-x-internal="parse-something-according-to-a-css-grammar" href="https://drafts.csswg.org/css-syntax/#parse-grammar" id="text-styles:parse-something-according-to-a-css-grammar">parsed as a CSS &lt;'font'&gt;
+  value</a> (but without supporting property-independent style sheet syntax like 'inherit'), and
+  the resulting font must be assigned to the context, with the <a data-x-internal="'line-height'" href="https://drafts.csswg.org/css2/visudet.html#propdef-line-height" id="text-styles:'line-height'">'line-height'</a> component
+  forced to 'normal', with the <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="text-styles:'font-size'">'font-size'</a> component converted to <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="text-styles:'px'">CSS pixels</a>, and with system fonts being computed to explicit values. If the
+  new value is syntactically incorrect (including using property-independent style sheet syntax like
+  'inherit' or 'initial'), then it must be ignored, without assigning a new font value. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSS">[CSS]</a></p>
+
+  <p>Font family names must be interpreted in the context of the <a href="#font-style-source-object" id="text-styles:font-style-source-object">font style source
+  object</a> when the font is to be used; any fonts embedded using <code>@font-face</code> or loaded using <code id="text-styles:fontface"><a href="https://html.spec.whatwg.org/multipage/infrastructure.html#fontface">FontFace</a></code> objects that are visible to the
+  <a href="#font-style-source-object" id="text-styles:font-style-source-object-2">font style source object</a> must therefore be available once they are loaded. (Each <a href="#font-style-source-object" id="text-styles:font-style-source-object-3">font style source
+  object</a> has a <a data-x-internal="font-source" href="https://drafts.csswg.org/css-font-loading/#font-source" id="text-styles:font-source">font source</a>, which determines what fonts are available.) If a font
+  is used before it is fully loaded, or if the <a href="#font-style-source-object" id="text-styles:font-style-source-object-4">font style source object</a> does not have
+  that font in scope at the time the font is to be used, then it must be treated as if it was an
+  unknown font, falling back to another as described by the relevant CSS specifications. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSFONTS">[CSSFONTS]</a> <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSFONTLOAD">[CSSFONTLOAD]</a></p>
+
+  <p>On getting, the <code id="text-styles:dom-context-2d-font-2-2"><a href="#dom-context-2d-font-2">font</a></code> attribute must return the <a data-x-internal="serializing-a-css-value" href="https://drafts.csswg.org/cssom/#serialize-a-css-value" id="text-styles:serializing-a-css-value">serialized form</a> of the current font of the context (with
+  no <a data-x-internal="'line-height'" href="https://drafts.csswg.org/css2/visudet.html#propdef-line-height" id="text-styles:'line-height'-2">'line-height'</a> component). <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSOM">[CSSOM]</a></p>
+
+  <div class="example">
+
+   <p>For example, after the following statement:</p>
+
+   <pre>context.font = 'italic 400 12px/2 Unknown Font, sans-serif';</pre>
+
+   <p>...the expression <code>context.font</code> would evaluate to the string &quot;<code>italic 12px &quot;Unknown Font&quot;, sans-serif</code>&quot;. The &quot;400&quot;
+   font-weight doesn't appear because that is the default value. The line-height doesn't appear
+   because it is forced to &quot;normal&quot;, the default value.</p>
 
   </div>
 
+  <p>When the object implementing the <code id="text-styles:canvastextdrawingstyles-2"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is created, the
+  font of the context must be set to 10px sans-serif. When the <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="text-styles:'font-size'-2">'font-size'</a> component is
+  set to lengths using percentages, <a data-x-internal="'em'" href="https://drafts.csswg.org/css-values/#em" id="text-styles:'em'">'em'</a> or <a data-x-internal="'ex'" href="https://drafts.csswg.org/css-values/#ex" id="text-styles:'ex'">'ex'</a> units, or the 'larger' or
+  'smaller' keywords, these must be interpreted relative to the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="text-styles:computed-value">computed value</a> of the
+  <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="text-styles:'font-size'-3">'font-size'</a> property of the <a href="#font-style-source-object" id="text-styles:font-style-source-object-5">font style source object</a> at the time that
+  the attribute is set, if it is an element. When the <a data-x-internal="'font-weight'" href="https://drafts.csswg.org/css-fonts/#font-weight-prop" id="text-styles:'font-weight'">'font-weight'</a> component is set to
+  the relative values 'bolder' and 'lighter', these must be interpreted relative to the
+  <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="text-styles:computed-value-2">computed value</a> of the <a data-x-internal="'font-weight'" href="https://drafts.csswg.org/css-fonts/#font-weight-prop" id="text-styles:'font-weight'-2">'font-weight'</a> property of the <a href="#font-style-source-object" id="text-styles:font-style-source-object-6">font style
+  source object</a> at the time that the attribute is set, if it is an element. If the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="text-styles:computed-value-3">computed values</a> are undefined for a particular case (e.g. because
+  the <a href="#font-style-source-object" id="text-styles:font-style-source-object-7">font style source object</a> is not an element or is not <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="text-styles:being-rendered">being
+  rendered</a>), then the relative keywords must be interpreted relative to the normal-weight
+  10px sans-serif default.</p>
 
-  <h6 id="shadows"><span class="secno">4.8.11.1.6 </span><dfn>Shadows</dfn></h6>
+  <p>The <dfn id="dom-context-2d-textalign-2"><code>textAlign</code></dfn> IDL attribute, on
+  getting, must return the current value. On setting, the current value must be changed to the new
+  value. When the object implementing the <code id="text-styles:canvastextdrawingstyles-3"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is
+  created, the <code id="text-styles:dom-context-2d-textalign-2-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute must initially
+  have the value <code id="text-styles:dom-context-2d-textalign-start"><a href="#dom-context-2d-textalign-start">start</a></code>.</p>
 
-  <p>All drawing operations are affected by the four global shadow
-  attributes.</p>
+  <p>The <dfn id="dom-context-2d-textbaseline-2"><code>textBaseline</code></dfn> IDL attribute, on
+  getting, must return the current value. On setting, the current value must be changed to the new
+  value. When the object implementing the <code id="text-styles:canvastextdrawingstyles-4"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is
+  created, the <code id="text-styles:dom-context-2d-textbaseline-2-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute must
+  initially have the value <code id="text-styles:dom-context-2d-textbaseline-alphabetic-2"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code>.</p>
 
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code> [ = <var title="">value</var> ]</dt>
+  <p>The <dfn id="dom-context-2d-direction-2"><code>direction</code></dfn> IDL attribute, on
+  getting, must return the current value. On setting, the current value must be changed to the new
+  value. When the object implementing the <code id="text-styles:canvastextdrawingstyles-5"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is
+  created, the <code id="text-styles:dom-context-2d-direction-2-2"><a href="#dom-context-2d-direction-2">direction</a></code> attribute must initially
+  have the value &quot;<code id="text-styles:dom-context-2d-direction-inherit-2"><a href="#dom-context-2d-direction-inherit">inherit</a></code>&quot;.</p>
 
-   <dd>
+  
 
-    <p>Returns the current shadow color.</p>
+  <p>The <code id="text-styles:dom-context-2d-textalign-2-3"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute's allowed keywords are
+  as follows:</p>
 
-    <p>Can be set, to change the shadow color. Values that cannot be parsed as CSS colors are ignored.</p>
+  <dl><dt><dfn id="dom-context-2d-textalign-start"><code>start</code></dfn>
+   </dt><dd><p>Align to the start edge of the text (left side in left-to-right text, right side in
+   right-to-left text).</p></dd><dt><dfn id="dom-context-2d-textalign-end"><code>end</code></dfn>
+   </dt><dd><p>Align to the end edge of the text (right side in left-to-right text, left side in
+   right-to-left text).</p></dd><dt><dfn id="dom-context-2d-textalign-left"><code>left</code></dfn>
+   </dt><dd><p>Align to the left.</p></dd><dt><dfn id="dom-context-2d-textalign-right"><code>right</code></dfn>
+   </dt><dd><p>Align to the right.</p></dd><dt><dfn id="dom-context-2d-textalign-center"><code>center</code></dfn>
+   </dt><dd><p>Align to the center.</p></dd></dl>
 
-   </dd>
+  <p>The <code id="text-styles:dom-context-2d-textbaseline-2-3"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code>
+  attribute's allowed keywords correspond to alignment points in the
+  font:</p>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code> [ = <var title="">value</var> ]</dt>
-   <dt><var title="">context</var> . <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code> [ = <var title="">value</var> ]</dt>
+  <p><img alt="The top of the em square is roughly at the top of the glyphs in a font, the hanging baseline is where some glyphs like आ are anchored, the middle is half-way between the top of the em square and the bottom of the em square, the alphabetic baseline is where characters like Á, ÿ, f, and Ω are anchored, the ideographic baseline is where glyphs like 私 and 達 are anchored, and the bottom of the em square is roughly at the bottom of the glyphs in a font. The top and bottom of the bounding box can be far from these baselines, due to glyphs extending far outside the em square." height="300" src="https://html.spec.whatwg.org/images/baselines.png" width="738"/></p>
 
-   <dd>
+  <p>The keywords map to these alignment points as follows:</p>
 
-    <p>Returns the current shadow offset.</p>
+  <dl><dt><dfn id="dom-context-2d-textbaseline-top"><code>top</code></dfn>
+   </dt><dd>The top of the em square</dd><dt><dfn id="dom-context-2d-textbaseline-hanging"><code>hanging</code></dfn>
+   </dt><dd>The hanging baseline</dd><dt><dfn id="dom-context-2d-textbaseline-middle"><code>middle</code></dfn>
+   </dt><dd>The middle of the em square</dd><dt><dfn id="dom-context-2d-textbaseline-alphabetic"><code>alphabetic</code></dfn>
+   </dt><dd>The alphabetic baseline</dd><dt><dfn id="dom-context-2d-textbaseline-ideographic"><code>ideographic</code></dfn>
+   </dt><dd>The ideographic baseline</dd><dt><dfn id="dom-context-2d-textbaseline-bottom"><code>bottom</code></dfn>
+   </dt><dd>The bottom of the em square</dd></dl>
 
-    <p>Can be set, to change the shadow offset. Values that are not finite numbers are ignored.</p>
+  <p>The <code id="text-styles:dom-context-2d-direction-2-3"><a href="#dom-context-2d-direction-2">direction</a></code> attribute's allowed keywords are
+  as follows:</p>
 
-   </dd>
+  <dl><dt><dfn id="dom-context-2d-direction-ltr"><code>ltr</code></dfn>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> [ = <var title="">value</var> ]</dt>
+   </dt><dd><p>Treat input to the <a href="#text-preparation-algorithm" id="text-styles:text-preparation-algorithm">text preparation algorithm</a> as left-to-right text.</p></dd><dt><dfn id="dom-context-2d-direction-rtl"><code>rtl</code></dfn>
 
-   <dd>
+   </dt><dd><p>Treat input to the <a href="#text-preparation-algorithm" id="text-styles:text-preparation-algorithm-2">text preparation algorithm</a> as right-to-left text.</p></dd><dt><dfn id="dom-context-2d-direction-inherit"><code>inherit</code></dfn>
 
-    <p>Returns the current level of blur applied to shadows.</p>
+   </dt><dd><p>Default to the directionality of the <code id="text-styles:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element or <code id="text-styles:document"><a href="https://html.spec.whatwg.org/multipage/dom.html#document">Document</a></code>
+   as appropriate.</p></dd></dl>
 
-    <p>Can be set, to change the blur level. Values that are not finite numbers greater than or equal to zero are ignored.</p>
+  <p>The <dfn id="text-preparation-algorithm">text preparation algorithm</dfn> is as follows. It takes as input a string <var>text
+  </var>, a <code id="text-styles:canvastextdrawingstyles-6"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> object <var>target</var>, and an optional length
+  <var>maxWidth</var>. It returns an array of glyph shapes, each positioned on a common coordinate
+  space, a <var>physical alignment</var> whose value is one of <i>left</i>, <i>right</i>, and
+  <i>center</i>, and an <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box">inline box</a>. (Most callers of this algorithm ignore the
+  <var>physical alignment</var> and the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-2">inline box</a>.)</p>
 
-   </dd>
+  <ol><li><p>If <var>maxWidth</var> was provided but is less than or equal to zero or equal to NaN,
+   then return an empty array.</p></li><li><p>Replace all <a data-x-internal="space-characters" href="https://infra.spec.whatwg.org/#ascii-whitespace" id="text-styles:space-characters">ASCII whitespace</a> in <var>text</var> with U+0020 SPACE
+   characters.</p></li><li><p>Let <var>font</var> be the current font of <var>target</var>, as given
+   by that object's <code id="text-styles:dom-context-2d-font-2-3"><a href="#dom-context-2d-font-2">font</a></code> attribute.</p></li><li>
 
-  </dl><div class="impl">
+    <p>Apply the appropriate step from the following list to determine the value of <var>direction</var>:</p>
 
-  <p>The <dfn id="dom-context-2d-shadowcolor" title="dom-context-2d-shadowColor"><code>shadowColor</code></dfn>
-  attribute sets the color of the shadow.</p>
+    <dl class="switch"><dt>If the <var>target</var> object's <code id="text-styles:dom-context-2d-direction-2-4"><a href="#dom-context-2d-direction-2">direction</a></code> attribute has the value &quot;<code id="text-styles:dom-context-2d-direction-ltr"><a href="#dom-context-2d-direction-ltr">ltr</a></code>&quot;</dt><dd>Let <var>direction</var> be '<a href="https://html.spec.whatwg.org/multipage/dom.html#concept-ltr" id="text-styles:concept-ltr">ltr</a>'.</dd><dt>If the <var>target</var> object's <code id="text-styles:dom-context-2d-direction-2-5"><a href="#dom-context-2d-direction-2">direction</a></code> attribute has the value &quot;<code id="text-styles:dom-context-2d-direction-rtl"><a href="#dom-context-2d-direction-rtl">rtl</a></code>&quot;</dt><dd>Let <var>direction</var> be '<a href="https://html.spec.whatwg.org/multipage/dom.html#concept-rtl" id="text-styles:concept-rtl">rtl</a>'.</dd><dt>If the <var>target</var> object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-8">font style source object</a> is an
+     element</dt><dd>Let <var>direction</var> be <a href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality" id="text-styles:the-directionality">the directionality</a> of the <var>target</var> object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-9">font style source object</a>.</dd><dt>If the <var>target</var> object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-10">font style source object</a> is a
+     <code id="text-styles:document-2"><a href="https://html.spec.whatwg.org/multipage/dom.html#document">Document</a></code> with a non-null <a data-x-internal="document-element" href="https://dom.spec.whatwg.org/#document-element" id="text-styles:document-element">document element</a></dt><dd>Let <var>direction</var> be <a href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality" id="text-styles:the-directionality-2">the directionality</a> of the <var>target</var>
+     object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-11">font style source object</a>'s <a data-x-internal="document-element" href="https://dom.spec.whatwg.org/#document-element" id="text-styles:document-element-2">document element</a>.</dd><dt>Otherwise</dt><dd>Let <var>direction</var> be '<a href="https://html.spec.whatwg.org/multipage/dom.html#concept-ltr" id="text-styles:concept-ltr-2">ltr</a>'.</dd></dl>
 
-  <p>When the context is created, the <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code> attribute
-  initially must be fully-transparent black.</p>
+   </li><li><p>Form a hypothetical infinitely-wide CSS <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="text-styles:line-box">line box</a> containing a single
+   <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-3">inline box</a> containing the text <var>text</var>, with all the properties at their
+   initial values except the <a data-x-internal="'font'" href="https://drafts.csswg.org/css-fonts/#font-prop" id="text-styles:'font'-2">'font'</a> property of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-4">inline box</a> set to
+   <var>font</var>, the <a data-x-internal="'direction'" href="https://drafts.csswg.org/css-writing-modes/#direction" id="text-styles:'direction'">'direction'</a> property of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-5">inline box</a> set to
+   <var>direction</var>, and the <a data-x-internal="'white-space'" href="https://drafts.csswg.org/css-text/#white-space-property" id="text-styles:'white-space'">'white-space'</a> property set to 'pre'. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSS">[CSS]</a></p></li><li><p>If <var>maxWidth</var> was provided and the hypothetical width of the
+   <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-6">inline box</a> in the hypothetical <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="text-styles:line-box-2">line box</a> is greater than
+   <var>maxWidth</var> <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="text-styles:'px'-2">CSS pixels</a>, then change <var>font</var> to have a
+   more condensed font (if one is available or if a reasonably readable one can be synthesized by
+   applying a horizontal scale factor to the font) or a smaller font, and return to the previous
+   step.</p></li><li>
 
-  <p>On getting, the <a href="#serialization-of-a-color" title="serialization of a
-  color">serialization of the color</a> must be returned.</p>
+    <p>The <var>anchor point</var> is a point on the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-7">inline box</a>, and the <var>physical
+    alignment</var> is one of the values <i>left</i>, <i>right</i>, and <i>center</i>. These
+    variables are determined by the <code id="text-styles:dom-context-2d-textalign-2-4"><a href="#dom-context-2d-textalign-2">textAlign</a></code> and
+    <code id="text-styles:dom-context-2d-textbaseline-2-4"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> values as follows:</p>
 
-  <p>On setting, the new value must be <a href="#parsed-as-a-css-color-value">parsed as a CSS
-  &lt;color&gt; value</a> and the color assigned. If the value
-  cannot be parsed as a CSS &lt;color&gt; value then it must be
-  ignored, and the attribute must retain its previous value. <a href="#refsCSSCOLOR">[CSSCOLOR]</a></p>
+    <p>Horizontal position:</p>
 
-  <p>The <dfn id="dom-context-2d-shadowoffsetx" title="dom-context-2d-shadowOffsetX"><code>shadowOffsetX</code></dfn>
-  and <dfn id="dom-context-2d-shadowoffsety" title="dom-context-2d-shadowOffsetY"><code>shadowOffsetY</code></dfn>
-  attributes specify the distance that the shadow will be offset in
-  the positive horizontal and positive vertical distance
-  respectively. Their values are in coordinate space units. They are
-  not affected by the current transformation matrix.</p>
+    <dl><dt>If <code id="text-styles:dom-context-2d-textalign-2-5"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-left"><a href="#dom-context-2d-textalign-left">left</a></code></dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-6"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-start-2"><a href="#dom-context-2d-textalign-start">start</a></code> and <var>direction</var> is
+     'ltr'</dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-7"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-end"><a href="#dom-context-2d-textalign-end">end</a></code> and <var>direction</var> is 'rtl'</dt><dd>Let the <var>anchor point</var>'s horizontal position be the left edge of the
+     <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-8">inline box</a>, and let <var>physical alignment</var> be <i>left</i>.</dd><dt>If <code id="text-styles:dom-context-2d-textalign-2-8"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-right"><a href="#dom-context-2d-textalign-right">right</a></code></dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-9"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-end-2"><a href="#dom-context-2d-textalign-end">end</a></code> and <var>direction</var> is 'ltr'</dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-10"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-start-3"><a href="#dom-context-2d-textalign-start">start</a></code> and <var>direction</var> is
+     'rtl'</dt><dd>Let the <var>anchor point</var>'s horizontal position be the right edge of the
+     <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-9">inline box</a>, and let <var>physical alignment</var> be <i>right</i>.</dd><dt>If <code id="text-styles:dom-context-2d-textalign-2-11"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-center"><a href="#dom-context-2d-textalign-center">center</a></code></dt><dd>Let the <var>anchor point</var>'s horizontal position be half way between the left
+     and right edges of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-10">inline box</a>, and let <var>physical alignment</var> be
+     <i>center</i>.</dd></dl>
 
-  <p>When the context is created, the shadow offset attributes must
-  initially have the value <code>0</code>.</p>
+    <p>Vertical position:</p>
 
-  <p>On getting, they must return their current value. On setting, the
-  attribute being set must be set to the new value, except if the
-  value is infinite or NaN, in which case the new value must be
-  ignored.</p>
+    <dl><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-5"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the top of the em box of
+     the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-11">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-6"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-hanging"><a href="#dom-context-2d-textbaseline-hanging">hanging</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the hanging baseline of the
+     first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-12">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-7"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-middle"><a href="#dom-context-2d-textbaseline-middle">middle</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be half way between the bottom
+     and the top of the em box of the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-13">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-8"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-alphabetic-3"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the alphabetic baseline of
+     the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-14">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-9"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-ideographic"><a href="#dom-context-2d-textbaseline-ideographic">ideographic</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the ideographic baseline of
+     the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-15">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-10"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-bottom"><a href="#dom-context-2d-textbaseline-bottom">bottom</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the bottom of the em box of
+     the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-16">inline box</a>.</dd></dl>
 
-  <p>The <dfn id="dom-context-2d-shadowblur" title="dom-context-2d-shadowBlur"><code>shadowBlur</code></dfn>
-  attribute specifies the level of the blurring effect. (The units do
-  not map to coordinate space units, and are not affected by the
-  current transformation matrix.)</p>
+   </li><li>
 
-  <p>When the context is created, the <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> attribute must
-  initially have the value <code>0</code>.</p>
+    <p>Let <var>result</var> be an array constructed by iterating over each glyph in the
+    <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-17">inline box</a> from left to right (if any), adding to the array, for each glyph, the
+    shape of the glyph as it is in the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-18">inline box</a>, positioned on a coordinate space
+    using <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="text-styles:'px'-3">CSS pixels</a> with its origin is at the <var>anchor
+    point</var>.</p>
 
-  <p>On getting, the attribute must return its current value. On
-  setting the attribute must be set to the new value, except if the
-  value is negative, infinite or NaN, in which case the new value must
-  be ignored.</p>
-
-  <p><dfn id="when-shadows-are-drawn" title="when shadows are drawn">Shadows are only drawn
-  if</dfn> the opacity component of the alpha component of the color
-  of <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code> is
-  non-zero and either the <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> is non-zero, or
-  the <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code>
-  is non-zero, or the <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code> is
-  non-zero.</p>
-
-  <p class="critical">It is likely that this will change: browser
-  vendors have indicated an interest in changing the processing model
-  for shadows such that they only draw when the composition operator
-  is &quot;source-over&quot; (the default). <a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-May/thread.html#31457">Read
-  more...</a></p>
-
-  <p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, they must be rendered as follows:</p>
-
-  <ol><li> <p>Let <var title="">A</var> be an infinite transparent black
-   bitmap on which the source image for which a shadow is being
-   created has been rendered.</p> </li>
-
-   <li> <p>Let <var title="">B</var> be an infinite transparent black
-   bitmap, with a coordinate space and an origin identical to <var title="">A</var>.</p> </li>
-
-   <li> <p>Copy the alpha channel of <var title="">A</var> to <var title="">B</var>, offset by <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code> in the
-   positive <var title="">x</var> direction, and <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code> in the
-   positive <var title="">y</var> direction.</p> </li>
-
-   <li> <p>If <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> is greater than
-   0:</p>
-
-    <ol><li> <p>Let <var title="">σ</var> be half the value of
-     <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code>.</p></li>
-
-     <li> <p>Perform a 2D Gaussian Blur on <var title="">B</var>,
-     using <var title="">σ</var> as the standard deviation.</p>
-     <!-- wish i could find a reference for this --> </li>
-
-    </ol><p>User agents may limit values of <var title="">σ</var> to
-    an implementation-specific maximum value to avoid exceeding
-    hardware limitations during the Gaussian blur operation.</p>
-
-   </li>
-
-   <li> <p>Set the red, green, and blue components of every pixel in
-   <var title="">B</var> to the red, green, and blue components
-   (respectively) of the color of <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code>.</p> </li>
-
-   <li> <p>Multiply the alpha component of every pixel in <var title="">B</var> by the alpha component of the color of <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code>.</p> </li>
-
-   <li> <p>The shadow is in the bitmap <var title="">B</var>, and is
-   rendered as part of the <a href="#drawing-model">drawing model</a> described below.</p> </li>
-
-  </ol></div>
-
-  <p>If the current composition operation is <code title="gcop-copy"><a href="#gcop-copy">copy</a></code>, shadows effectively won't render
-  (since the shape will overwrite the shadow).</p>
-
-
-  <h6 id="simple-shapes-(rectangles)"><span class="secno">4.8.11.1.7 </span>Simple shapes (rectangles)</h6>
-
-  <p>There are three methods that immediately draw rectangles to the
-  bitmap. They each take four arguments; the first two give the <var title="">x</var> and <var title="">y</var> coordinates of the top
-  left of the rectangle, and the second two give the width <var title="">w</var> and height <var title="">h</var> of the rectangle,
-  respectively.</p>
-
-  <div class="impl">
-
-  <p>The <a href="#transformations" title="dom-context-2d-transformation">current
-  transformation matrix</a> must be applied to the following four
-  coordinates, which form the path that must then be closed to get the
-  specified rectangle: <span title="">(<var title="">x</var>, <var title="">y</var>)</span>, <span title="">(<span title=""><var title="">x</var>+<var title="">w</var></span>, <var title="">y</var>)</span>,
-  <span title="">(<span title=""><var title="">x</var>+<var title="">w</var></span>,
-  <span title=""><var title="">y</var>+<var title="">h</var></span>)</span>,
-  <span title="">(<var title="">x</var>, <span title=""><var title="">y</var>+<var title="">h</var></span>)</span>.</p>
-
-  <p>Shapes are painted without affecting the current path, and are
-  subject to the <a href="#clipping-region" title="clipping region">clipping region</a>,
-  and, with the exception of <code title="dom-context-2d-clearRect"><a href="#dom-context-2d-clearrect">clearRect()</a></code>, also <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
-  operators</a>.</p>
-
-  </div>
-
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-clearRect"><a href="#dom-context-2d-clearrect">clearRect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
-
-   <dd>
-
-    <p>Clears all pixels on the canvas in the given rectangle to transparent black.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-fillRect"><a href="#dom-context-2d-fillrect">fillRect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
-
-   <dd>
-
-    <p>Paints the given rectangle onto the canvas, using the current fill style.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-strokeRect"><a href="#dom-context-2d-strokerect">strokeRect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
-
-   <dd>
-
-    <p>Paints the box that outlines the given rectangle onto the canvas, using the current stroke style.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>The <dfn id="dom-context-2d-clearrect" title="dom-context-2d-clearRect"><code>clearRect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must clear the pixels in the
-  specified rectangle that also intersect the current clipping region
-  to a fully transparent black, erasing any previous image. If either
-  height or width are zero, this method has no effect.</p>
-
-  <p>The <dfn id="dom-context-2d-fillrect" title="dom-context-2d-fillRect"><code>fillRect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must paint the specified
-  rectangular area using the <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code>. If either height
-  or width are zero, this method has no effect.</p>
-
-  <p>The <dfn id="dom-context-2d-strokerect" title="dom-context-2d-strokeRect"><code>strokeRect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must stroke the specified
-  rectangle's path using the <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code>, <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code>, <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code>, and (if
-  appropriate) <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> attributes. If
-  both height and width are zero, this method has no effect, since
-  there is no path to stroke (it's a point). If only one of the two is
-  zero, then the method will draw a line instead (the path for the
-  outline is just a straight line along the non-zero dimension).</p>
-
-  </div>
-
-
-  <h6 id="complex-shapes-(paths)"><span class="secno">4.8.11.1.8 </span>Complex shapes (paths)</h6>
-
-  <p>The context always has a current path. There is only one current
-  path, it is not part of the <a href="#drawing-state">drawing state</a>.</p>
-
-  <p>A <dfn id="path">path</dfn> has a list of zero or more subpaths. Each
-  subpath consists of a list of one or more points, connected by
-  straight or curved lines, and a flag indicating whether the subpath
-  is closed or not. A closed subpath is one where the last point of
-  the subpath is connected to the first point of the subpath by a
-  straight line. Subpaths with fewer than two points are ignored when
-  painting the path.</p>
+   </li><li><p>Return <var>result</var>, <var>physical alignment</var>, and the inline
+   box.</p></li></ol>
 
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-beginPath"><a href="#dom-context-2d-beginpath">beginPath</a></code>()</dt>
 
-   <dd>
+  <h6 id="building-paths"><span class="secno">4.12.5.1.5</span> Building paths<a class="self-link" href="#building-paths"/></h6>
 
-    <p>Resets the current path.</p>
+  <p>Objects that implement the <code id="building-paths:canvaspath"><a href="#canvaspath">CanvasPath</a></code> interface have a <a href="#concept-path" id="building-paths:concept-path">path</a>. A <dfn id="concept-path">path</dfn> has a list of zero or
+  more subpaths. Each subpath consists of a list of one or more points, connected by straight or
+  curved <dfn id="line-segments">line segments</dfn>, and a flag indicating whether the subpath is closed or not. A
+  closed subpath is one where the last point of the subpath is connected to the first point of the
+  subpath by a straight line. Subpaths with only one point are ignored when painting the path.</p>
 
-   </dd>
+  <p><a href="#concept-path" id="building-paths:concept-path-2">Paths</a> have a <dfn id="need-new-subpath">need new subpath</dfn> flag. When this
+  flag is set, certain APIs create a new subpath rather than extending the previous one. When a
+  <a href="#concept-path" id="building-paths:concept-path-3">path</a> is created, its <a href="#need-new-subpath" id="building-paths:need-new-subpath">need new subpath</a> flag must be
+  set.</p>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-moveTo"><a href="#dom-context-2d-moveto">moveTo</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
+  <p>When an object implementing the <code id="building-paths:canvaspath-2"><a href="#canvaspath">CanvasPath</a></code> interface is created, its <a href="#concept-path" id="building-paths:concept-path-4">path</a> must be initialized to zero subpaths.</p>
 
-   <dd>
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-moveto"><a href="#dom-context-2d-moveto-2">moveTo</a></code>(<var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-moveto-2"><a href="#dom-context-2d-moveto-2">moveTo</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
 
     <p>Creates a new subpath with the given point.</p>
 
-   </dd>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-closepath"><a href="#dom-context-2d-closepath-2">closePath</a></code>()</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-closepath-2"><a href="#dom-context-2d-closepath-2">closePath</a></code>()</dt><dd>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-closePath"><a href="#dom-context-2d-closepath">closePath</a></code>()</dt>
+    <p>Marks the current subpath as closed, and starts a new subpath with a point the same as the
+    start and end of the newly closed subpath.</p>
 
-   <dd>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-lineto"><a href="#dom-context-2d-lineto-2">lineTo</a></code>(<var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-lineto-2"><a href="#dom-context-2d-lineto-2">lineTo</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
 
-    <p>Marks the current subpath as closed, and starts a new subpath with a point the same as the start and end of the newly closed subpath.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-lineTo"><a href="#dom-context-2d-lineto">lineTo</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
-
-   <dd>
-
-    <p>Adds the given point to the current subpath, connected to the previous one by a straight line.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-quadraticCurveTo"><a href="#dom-context-2d-quadraticcurveto">quadraticCurveTo</a></code>(<var title="">cpx</var>, <var title="">cpy</var>, <var title="">x</var>, <var title="">y</var>)</dt>
-
-   <dd>
-
-    <p>Adds the given point to the current subpath, connected to the previous one by a quadratic Bézier curve with the given control point.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-bezierCurveTo"><a href="#dom-context-2d-beziercurveto">bezierCurveTo</a></code>(<var title="">cp1x</var>, <var title="">cp1y</var>, <var title="">cp2x</var>, <var title="">cp2y</var>, <var title="">x</var>, <var title="">y</var>)</dt>
-
-   <dd>
-
-    <p>Adds the given point to the current subpath, connected to the previous one by a cubic Bézier curve with the given control points.</p>
-
-   </dd>
-
-   <dt><var title="">context</var> . <code title="dom-context-2d-arcTo"><a href="#dom-context-2d-arcto">arcTo</a></code>(<var title="">x1</var>, <var title="">y1</var>, <var title="">x2</var>, <var title="">y2</var>, <var title="">radius</var>)</dt>
-
-   <dd>
-
-    <p>Adds an arc with the given control points and radius to the
-    current subpath, connected to the previous point by a straight
+    <p>Adds the given point to the current subpath, connected to the previous one by a straight
     line.</p>
 
-    <p>Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception if the given
+   </dd><dt><var>context</var> . <code id="dom-context-2d-quadraticcurveto"><a href="#dom-context-2d-quadraticcurveto-2">quadraticCurveTo</a></code>(<var>cpx</var>, <var>cpy</var>, <var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-quadraticcurveto-2"><a href="#dom-context-2d-quadraticcurveto-2">quadraticCurveTo</a></code>(<var>cpx</var>, <var>cpy</var>, <var>x</var>, <var>y</var>)</dt><dd>
+
+    <p>Adds the given point to the current subpath, connected to the previous one by a quadratic
+    Bézier curve with the given control point.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-beziercurveto"><a href="#dom-context-2d-beziercurveto-2">bezierCurveTo</a></code>(<var>cp1x</var>, <var>cp1y</var>, <var>cp2x</var>, <var>cp2y</var>, <var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-beziercurveto-2"><a href="#dom-context-2d-beziercurveto-2">bezierCurveTo</a></code>(<var>cp1x</var>, <var>cp1y</var>, <var>cp2x</var>, <var>cp2y</var>, <var>x</var>, <var>y</var>)</dt><dd>
+
+    <p>Adds the given point to the current subpath, connected to the previous one by a cubic
+    Bézier curve with the given control points.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-arcto"><a href="#dom-context-2d-arcto-2">arcTo</a></code>(<var>x1</var>, <var>y1</var>, <var>x2</var>, <var>y2</var>, <var>radiusX</var> [, <var>radiusY</var>, <var>rotation</var> ] )</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-arcto-2"><a href="#dom-context-2d-arcto-2">arcTo</a></code>(<var>x1</var>, <var>y1</var>, <var>x2</var>, <var>y2</var>, <var>radiusX</var> [, <var>radiusY</var>, <var>rotation</var> ] )</dt><dd>
+
+    <p>Adds an arc with the given control points and radius to the current subpath, connected to the
+    previous point by a straight line.</p>
+
+    <p>If two radii are provided, then the first controls the width of the arc's ellipse, and the
+    second controls the height. If only one is provided, or if they are the same, then the arc is
+    from a circle. In the case of an ellipse, the rotation argument controls the clockwise
+    inclination of the ellipse relative to the x-axis.</p>
+
+    <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
     radius is negative.</p>
 
-   </dd>
+    <figure class="diagrams">
+     
+     <img alt="" height="254" src="https://html.spec.whatwg.org/images/arcTo1.png" width="357"/>
+     <img alt="" height="310" src="https://html.spec.whatwg.org/images/arcTo2.png" width="468"/>
+     <img alt="" height="233" src="https://html.spec.whatwg.org/images/arcTo3.png" width="513"/>
+    </figure>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-arc"><a href="#dom-context-2d-arc">arc</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">radius</var>, <var title="">startAngle</var>, <var title="">endAngle</var> [, <var title="">anticlockwise</var> ] )</dt>
 
-   <dd>
 
-    <p>Adds points to the subpath such that the arc described by the
-    circumference of the circle described by the arguments, starting
-    at the given start angle and ending at the given end angle, going
-    in the given direction (defaulting to clockwise), is added to the
-    path, connected to the previous point by a straight line.</p>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-arc"><a href="#dom-context-2d-arc-2">arc</a></code>(<var>x</var>, <var>y</var>, <var>radius</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var> ] )</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-arc-2"><a href="#dom-context-2d-arc-2">arc</a></code>(<var>x</var>, <var>y</var>, <var>radius</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var> ] )</dt><dd>
 
-    <p>Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception if the given
+    <p>Adds points to the subpath such that the arc described by the circumference of the circle
+    described by the arguments, starting at the given start angle and ending at the given end angle,
+    going in the given direction (defaulting to clockwise), is added to the path, connected to the
+    previous point by a straight line.</p>
+
+    <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-2">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
     radius is negative.</p>
 
-   </dd>
+    <figure class="diagrams">
+     
+     <img alt="" height="255" src="https://html.spec.whatwg.org/images/arc1.png" width="590"/>
+    </figure>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-rect"><a href="#dom-context-2d-rect">rect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
 
-   <dd>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-ellipse"><a href="#dom-context-2d-ellipse-2">ellipse</a></code>(<var>x</var>, <var>y</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var>] )</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-ellipse-2"><a href="#dom-context-2d-ellipse-2">ellipse</a></code>(<var>x</var>, <var>y</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var>] )</dt><dd>
+
+    <p>Adds points to the subpath such that the arc described by the circumference of the ellipse
+    described by the arguments, starting at the given start angle and ending at the given end angle,
+    going in the given direction (defaulting to clockwise), is added to the path, connected to the
+    previous point by a straight line.</p>
+
+    <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-3">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
+    radius is negative.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-rect"><a href="#dom-context-2d-rect-2">rect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-rect-2"><a href="#dom-context-2d-rect-2">rect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
 
     <p>Adds a new closed subpath to the path, representing the given rectangle.</p>
 
-   </dd>
+   </dd></dl>
+
+  
+
+  <p>The following methods allow authors to manipulate the <a href="#concept-path" id="building-paths:concept-path-5">paths</a>
+  of objects implementing the <code id="building-paths:canvaspath-3"><a href="#canvaspath">CanvasPath</a></code> interface.</p>
+
+  <p>For objects implementing the <code id="building-paths:canvasdrawpath"><a href="#canvasdrawpath">CanvasDrawPath</a></code> and <code id="building-paths:canvastransform"><a href="#canvastransform">CanvasTransform</a></code>
+  interfaces, the points passed to the methods, and the resulting lines added to <a href="#current-default-path" id="building-paths:current-default-path">current
+  default path</a> by these methods, must be transformed according to the <a href="#transformations" id="building-paths:transformations">current transformation matrix</a> before being added to
+  the path.</p>
+
+  <p>The <dfn id="dom-context-2d-moveto-2"><code>moveTo(<var>x</var>, <var>y</var>)</code></dfn>
+  method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Create a new subpath with the specified point as its first (and only) point.</p></li></ol>
+
+  <p>When the user agent is to <dfn id="ensure-there-is-a-subpath">ensure there is a subpath</dfn> for a coordinate (<var>x</var>,
+  <var>y</var>) on a <a href="#concept-path" id="building-paths:concept-path-6">path</a>, the user agent must check to see if
+  the <a href="#concept-path" id="building-paths:concept-path-7">path</a> has its <a href="#need-new-subpath" id="building-paths:need-new-subpath-2">need new subpath</a> flag set. If it
+  does, then the user agent must create a new subpath with the point (<var>x</var>, <var>y</var>) as
+  its first (and only) point, as if the <code id="building-paths:dom-context-2d-moveto-2-2"><a href="#dom-context-2d-moveto-2">moveTo()</a></code> method
+  had been called, and must then unset the <a href="#concept-path" id="building-paths:concept-path-8">path</a>'s <a href="#need-new-subpath" id="building-paths:need-new-subpath-3">need new
+  subpath</a> flag.</p>
+
+
+  <p>The <dfn id="dom-context-2d-closepath-2"><code>closePath()</code></dfn> method, when invoked,
+  must do nothing if the object's path has no subpaths. Otherwise, it must mark the last subpath as
+  closed, create a new subpath whose first point is the same as the previous subpath's first point,
+  and finally add this new subpath to the path.</p>
+
+  <p class="note">If the last subpath had more than one point in its list of points, then this is
+  equivalent to adding a straight line connecting the last point back to the first point, thus
+  &quot;closing&quot; the shape, and then repeating the last (possibly implied) <code id="building-paths:dom-context-2d-moveto-2-3"><a href="#dom-context-2d-moveto-2">moveTo()</a></code> call.</p>
+
+
+  <p>New points and the lines connecting them are added to subpaths using the methods described
+  below. In all cases, the methods only modify the last subpath in the object's path.</p>
+
+
+  <p>The <dfn id="dom-context-2d-lineto-2"><code>lineTo(<var>x</var>, <var>y</var>)</code></dfn>
+  method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>If the object's path has no subpaths, then <a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath">ensure there is a subpath</a> for
+   <span>(<var>x</var>, <var>y</var>)</span>.</p></li><li><p>Otherwise, connect the last point in the subpath to the given point (<var>x</var>,
+   <var>y</var>) using a straight line, and then add the given point (<var>x</var>, <var>y</var>) to
+   the subpath.</p></li></ol>
+
+  <p>The <dfn id="dom-context-2d-quadraticcurveto-2"><code>quadraticCurveTo(<var>cpx</var>,
+  <var>cpy</var>, <var>x</var>, <var>y</var>)</code></dfn> method, when invoked, must run these
+  steps:</p>
+
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath-2">Ensure there is a subpath</a> for <span>(<var>cpx</var>,
+   <var>cpy</var>)</span></p></li><li><p>Connect the last point in the subpath to the given point (<var>x</var>, <var>y</var>)
+   using a quadratic Bézier curve with control point (<var>cpx</var>, <var>cpy</var>). <a href="https://html.spec.whatwg.org/multipage/references.html#refsBEZIER">[BEZIER]</a></p></li><li><p>Add the given point (<var>x</var>, <var>y</var>) to the subpath.</p></li></ol>
+
+  <p>The <dfn id="dom-context-2d-beziercurveto-2"><code>bezierCurveTo(<var>cp1x</var>,
+  <var>cp1y</var>, <var>cp2x</var>, <var>cp2y</var>, <var>x</var>, <var>y</var>)</code></dfn>
+  method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath-3">Ensure there is a subpath</a> for <span>(<var>cp1x</var>,
+   <var>cp1y</var>)</span>.</p></li><li><p>Connect the last point in the subpath to the given point (<var>x</var>, <var>y</var>)
+   using a cubic Bézier curve with control points (<var>cp1x</var>, <var>cp1y</var>) and
+   (<var>cp2x</var>, <var>cp2y</var>). <a href="https://html.spec.whatwg.org/multipage/references.html#refsBEZIER">[BEZIER]</a></p></li><li><p>Add the point (<var>x</var>, <var>y</var>) to the subpath.</p></li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="dom-context-2d-arcto-2"><code>arcTo(<var>x1</var>, <var>y1</var>, <var>x2</var>,
+  <var>y2</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>)</code></dfn> method,
+  when invoked, must run these steps:</p>
+
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath-4">Ensure there is a subpath</a> for <span>(<var>x1</var>,
+   <var>y1</var>)</span>.</p></li><li><p>If either <var>radiusX</var> or <var>radiusY</var> are negative, then throw an
+   <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-4">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>If <var>radiusY</var> is omitted, then set <var>radiusY</var> to
+   <var>radiusX</var>.</p></li><li><p>Let the point (<var>x0</var>, <var>y0</var>) be the last point in the subpath, transformed
+   by the inverse of the <a href="#transformations" id="building-paths:transformations-2">current transformation
+   matrix</a> (so that it is in the same coordinate system as the points passed to the
+   method).</p></li><li><p>If the point (<var>x0</var>, <var>y0</var>) is equal to the point (<var>x1</var>,
+   <var>y1</var>), or if the point (<var>x1</var>, <var>y1</var>) is equal to the point
+   (<var>x2</var>, <var>y2</var>), or if both <var>radiusX</var> and <var>radiusY</var> are zero,
+   then add the point (<var>x1</var>, <var>y1</var>) to the subpath, and connect that point to the
+   previous point (<var>x0</var>, <var>y0</var>) by a straight line.</p></li><li><p>Otherwise, if the points (<var>x0</var>, <var>y0</var>), (<var>x1</var>, <var>y1</var>),
+   and (<var>x2</var>, <var>y2</var>) all lie on a single straight line, then add the point
+   (<var>x1</var>, <var>y1</var>) to the subpath, and connect that point to the previous point
+   (<var>x0</var>, <var>y0</var>) by a straight line.</p></li><li><p>Otherwise, let <var>The Arc</var> be the shortest arc given by circumference of the
+   ellipse that has radius <var>radiusX</var> on the major axis and radius <var>radiusY</var> on the
+   minor axis, and whose semi-major axis is rotated <var>rotation</var> radians clockwise from the
+   positive x-axis, and that has one point tangent to the half-infinite line that crosses the point
+   (<var>x0</var>, <var>y0</var>) and ends at the point (<var>x1</var>, <var>y1</var>), and that has
+   a different point tangent to the half-infinite line that ends at the point (<var>x1</var>,
+   <var>y1</var>) and crosses the point (<var>x2</var>, <var>y2</var>). The points at which this
+   ellipse touches these two lines are called the start and end tangent points respectively. Connect
+   the point (<var>x0</var>, <var>y0</var>) to the start tangent point by a straight line, adding
+   the start tangent point to the subpath, and then connect the start tangent point to the end
+   tangent point by <var>The Arc</var>, adding the end tangent point to the subpath.</p></li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="dom-context-2d-arc-2"><code>arc(<var>x</var>, <var>y</var>,
+  <var>radius</var>, <var>startAngle</var>, <var>endAngle</var>, <var>anticlockwise</var>)</code></dfn> and <dfn id="dom-context-2d-ellipse-2"><code>ellipse(<var>x</var>, <var>y</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>, <var>startAngle</var>, <var>endAngle</var>, <var>anticlockwise</var>)</code></dfn> methods draw arcs.</p>
+
+  <p>The <code id="building-paths:dom-context-2d-arc-2-2"><a href="#dom-context-2d-arc-2">arc()</a></code> method is equivalent to the <code id="building-paths:dom-context-2d-ellipse-2-2"><a href="#dom-context-2d-ellipse-2">ellipse()</a></code> method in the case where the two radii are equal.
+  When the <code id="building-paths:dom-context-2d-arc-2-3"><a href="#dom-context-2d-arc-2">arc()</a></code> method is invoked, it must act as if the
+  <code id="building-paths:dom-context-2d-ellipse-2-3"><a href="#dom-context-2d-ellipse-2">ellipse()</a></code> method had been invoked with the <var>radiusX</var> and <var>radiusY</var> arguments set to the value of the <var>radius</var> argument, the <var>rotation</var> argument set to zero, and the
+  other arguments set to the same values as their identically named arguments on the <code id="building-paths:dom-context-2d-arc-2-4"><a href="#dom-context-2d-arc-2">arc()</a></code> method.</p>
+
+  <p>The <code id="building-paths:dom-context-2d-ellipse-2-4"><a href="#dom-context-2d-ellipse-2">ellipse()</a></code> method, when invoked, must run these
+  steps:</p>
+
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>If either <var>radiusX</var> or <var>radiusY</var> are negative, then throw an
+   <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-5">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>If the object's path has any subpaths, then add a straight line from the last point in the
+   subpath to the start point of the arc.</p></li><li>
+    <p>Add the start and end points of the arc to the subpath, and connect them with an arc. The arc
+    and its start and end points are defined as follows:</p>
+
+    <p>Consider an ellipse that has its origin at (<var>x</var>, <var>y</var>), that has a
+    major-axis radius <var>radiusX</var> and a minor-axis radius <var>radiusY</var>, and that is
+    rotated about its origin such that its semi-major axis is inclined <var>rotation</var> radians
+    clockwise from the x-axis.</p>
+
+    <p>If <var>anticlockwise</var> is false and <span><var>endAngle</var>-<var>startAngle</var></span> is equal to or greater than <span>2π</span>, or, if <var>anticlockwise</var> is <em>true</em> and <span><var>startAngle</var>-<var>endAngle</var></span> is equal to or greater than <span>2π</span>, then the arc is the whole circumference of this ellipse, and the point
+    at <var>startAngle</var> along this circle's circumference, measured in radians clockwise from
+    the ellipse's semi-major axis, acts as both the start point and the end point.</p>
+
+    <p>Otherwise, the points at <var>startAngle</var> and <var>endAngle</var> along this circle's
+    circumference, measured in radians clockwise from the ellipse's semi-major axis, are the start
+    and end points respectively, and the arc is the path along the circumference of this ellipse
+    from the start point to the end point, going anti-clockwise if <var>anticlockwise</var> is true,
+    and clockwise otherwise. Since the points are on the ellipse, as opposed to being simply angles
+    from zero, the arc can never cover an angle greater than <span>2π</span>
+    radians.</p>
+
+    <p class="note">Even if the arc covers the entire circumference of the ellipse and there are no
+    other points in the subpath, the path is not closed unless the <code id="building-paths:dom-context-2d-closepath-2-2"><a href="#dom-context-2d-closepath-2">closePath()</a></code> method is appropriately invoked.</p>
+   </li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="dom-context-2d-rect-2"><code>rect(<var>x</var>, <var>y</var>, <var>w</var>,
+  <var>h</var>)</code></dfn> method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Create a new subpath containing just the four points (<var>x</var>, <var>y</var>),
+   (<var>x</var>+<var>w</var>, <var>y</var>), (<var>x</var>+<var>w</var>,
+   <var>y</var>+<var>h</var>), (<var>x</var>, <var>y</var>+<var>h</var>), in that order, with those
+   four points connected by straight lines.</p></li><li><p>Mark the subpath as closed.</p></li><li><p>Create a new subpath with the point (<var>x</var>, <var>y</var>) as the only point in the
+   subpath.</p></li></ol>
+
+  
+
+  
+
+
+
+  <h6 id="path2d-objects"><span class="secno">4.12.5.1.6</span> <code id="path2d-objects:path2d"><a href="#path2d">Path2D</a></code> objects<a class="self-link" href="#path2d-objects"/></h6>
+
+  <p><code id="path2d-objects:path2d-2"><a href="#path2d">Path2D</a></code> objects can be used to declare paths that are then later used on
+  objects implementing the <code id="path2d-objects:canvasdrawpath"><a href="#canvasdrawpath">CanvasDrawPath</a></code> interface. In addition to many of the APIs
+  described in earlier sections, <code id="path2d-objects:path2d-3"><a href="#path2d">Path2D</a></code> objects have methods to combine paths, and to
+  add text to paths.</p>
+
+  <dl class="domintro"><dt><var>path</var> = new <code id="path2d-objects:dom-path2d"><a href="#dom-path2d">Path2D</a></code>()</dt><dd>
+
+    <p>Creates a new empty <code id="path2d-objects:path2d-4"><a href="#path2d">Path2D</a></code> object.</p>
+
+   </dd><dt><var>path</var> = new <code id="path2d-objects:dom-path2d-copy"><a href="#dom-path2d-copy">Path2D</a></code>(<var>path</var>)</dt><dd>
+
+    <p>Creates a new <code id="path2d-objects:path2d-5"><a href="#path2d">Path2D</a></code> object that is a copy of the argument.</p>
+
+   </dd><dt><var>path</var> = new <code id="path2d-objects:dom-path2d-merge"><a href="#dom-path2d-merge">Path2D</a></code>(<var>paths</var> [, <var>fillRule</var> ] )</dt><dd>
+
+    <p>Creates a new <code id="path2d-objects:path2d-6"><a href="#path2d">Path2D</a></code> object that describes a path that outlines the given <var>paths</var>, using the given fill rule.</p>
+
+   </dd><dt><var>path</var> = new <code id="path2d-objects:dom-path2d-withdata"><a href="#dom-path2d-withdata">Path2D</a></code>(<var>d</var>)</dt><dd>
+
+    <p>Creates a new path with the path described by the argument, interpreted as SVG path data. <a href="https://html.spec.whatwg.org/multipage/references.html#refsSVG">[SVG]</a></p>
+
+   </dd><dt><var>path</var> . <code id="dom-path2d-addpath"><a href="#dom-path2d-addpath-2">addPath</a></code>(<var>path</var> [, <var>transform</var> ] )</dt><dd>
+
+    <p>Adds to the path the path given by the argument.</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-path2d"><code>Path2D()</code></dfn> constructor, when invoked, must return a
+  newly created <code id="path2d-objects:path2d-7"><a href="#path2d">Path2D</a></code> object.</p>
+
+  <hr/>
+
+  <p>The <dfn id="dom-path2d-copy"><code>Path2D(<var>path</var>)</code></dfn>
+  constructor, when invoked, must return a newly created <code id="path2d-objects:path2d-8"><a href="#path2d">Path2D</a></code> object, to which the
+  subpaths of the argument are added. (In other words, it returns a copy of the argument.)</p>
+
+  <hr/>
+
+  <p>The <dfn id="dom-path2d-merge"><code>Path2D(<var>paths</var>,
+  <var>fillRule</var>)</code></dfn> constructor, when invoked, must run these steps:</p>
+
+  <ol><li>
+
+    <p>Run the appropriate step from the following list, based on the constructor's second
+    argument:</p>
+
+    <dl class="switch"><dt>If it is &quot;nonzero&quot;</dt><dd>
+
+      <p>Let <var>merged path</var> be a <a href="#concept-path" id="path2d-objects:concept-path">path</a> that
+      consists of a set of non-overlapping subpaths that exactly outline the points from which, in
+      any of the <a href="#concept-path" id="path2d-objects:concept-path-2">paths</a> provided in the constructor's first
+      argument, the number of times a half-infinite straight line drawn from that point crosses a
+      subpath going in one direction is not equal to the number of times it crosses a subpath going
+      in the other direction.</p>
+
+     </dd><dt>If it is &quot;evenodd&quot;</dt><dd>
+
+      <p>Let <var>merged path</var> be a <a href="#concept-path" id="path2d-objects:concept-path-3">path</a> that
+      consists of a set of non-overlapping subpaths that exactly outline the points from which, in
+      any of the <a href="#concept-path" id="path2d-objects:concept-path-4">paths</a> provided in the constructor's first
+      argument, the number of times a half-infinite straight line drawn from that point crosses that
+      path is odd.</p>
+
+     </dd></dl>
+
+    <p>The subpaths in <var>merged path</var> must be oriented such that for any point,
+    the number of times a half-infinite straight line drawn from that point crosses a subpath is
+    even if and only if the number of times a half-infinite straight line drawn from that same point
+    crosses a subpath going in one direction is equal to the number of times it crosses a subpath
+    going in the other direction.</p>
+
+   </li><li><p>Add all the subpaths in <var>merged path</var> to the <code id="path2d-objects:path2d-9"><a href="#path2d">Path2D</a></code>
+   object.</p></li><li><p>Set the <code id="path2d-objects:path2d-10"><a href="#path2d">Path2D</a></code> object's <a href="#need-new-subpath" id="path2d-objects:need-new-subpath">need new subpath</a> flag.</p></li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="dom-path2d-withdata"><code>Path2D(<var>d</var>)</code></dfn>
+  constructor, when invoked, must run these steps:</p>
+
+  <ol><li>
+
+    <p>Parse and interpret the <var>d</var> argument according to the SVG specification's
+    rules for path data, thus obtaining an SVG path. <a href="https://html.spec.whatwg.org/multipage/references.html#refsSVG">[SVG]</a></p>
+
+    <p class="note">The resulting path could be empty. SVG defines error handling rules for parsing
+    and applying path data.</p>
+
+   </li><li><p>Let (<var>x</var>, <var>y</var>) be the last point in the SVG
+   path.</p></li><li><p>Create a new <code id="path2d-objects:path2d-11"><a href="#path2d">Path2D</a></code> object and add all the subpaths in the SVG path, if any,
+   to that <code id="path2d-objects:path2d-12"><a href="#path2d">Path2D</a></code> object. </p>
+
+   </li><li><p>Create a new subpath in the <code id="path2d-objects:path2d-13"><a href="#path2d">Path2D</a></code> object with (<var>x</var>, <var>y</var>) as the only point in the subpath.</p></li><li><p>Return the <code id="path2d-objects:path2d-14"><a href="#path2d">Path2D</a></code> object as the constructed object.</p></li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="dom-path2d-addpath-2"><code>addPath(<var>b</var>,
+  <var>transform</var>)</code></dfn> method, when invoked on a <code id="path2d-objects:path2d-15"><a href="#path2d">Path2D</a></code> object
+  <var>a</var>, must run these steps:</p>
+
+  <ol><li><p>If the <code id="path2d-objects:path2d-16"><a href="#path2d">Path2D</a></code> object <var>b</var> has no subpaths, then abort these
+   steps.</p></li><li><p>Create a copy of all the subpaths in <var>b</var>. Let this copy be known as <var>c</var>.</p></li><li><p>Let <var>matrix</var> be the result of <a data-x-internal="create-a-dommatrix-from-a-dictionary" href="https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary" id="path2d-objects:create-a-dommatrix-from-a-dictionary">creating a <code>DOMMatrix</code> from a dictionary</a>
+   <var>transform</var>, with <var>ignore3D</var> set to true.</p></li><li><p>Transform all the coordinates and lines in <var>c</var> by the transform matrix
+   <var>matrix</var>.</p></li><li><p>Let (<var>x</var>, <var>y</var>) be the last point in the last subpath
+   of <var>c</var>.</p></li><li><p>Add all the subpaths in <var>c</var> to <var>a</var>.</p></li><li><p>Create a new subpath in <var>a</var> with (<var>x</var>, <var>y</var>) as the only point in the subpath.</p></li></ol>
+
+  
+
+
+  <h6 id="transformations"><span class="secno">4.12.5.1.7</span> <dfn>Transformations</dfn><a class="self-link" href="#transformations"/></h6><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="bugs"><strong>Spec bugs:</strong> <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=28333" title="Show on example how a,b,c,d,e,f affect the point position">28333</a></p></div>
+
+  <p>Objects that implement the <code id="transformations:canvastransform"><a href="#canvastransform">CanvasTransform</a></code> interface have a <dfn id="current-transformation-matrix">current
+  transformation matrix</dfn>, as well as methods (described in this section) to manipulate it. When
+  an object implementing the <code id="transformations:canvastransform-2"><a href="#canvastransform">CanvasTransform</a></code> interface is created, its transformation
+  matrix must be initialized to the identity transform.</p>
+
+  <p>The <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix">current transformation matrix</a> is applied to coordinates when creating the
+  <a href="#current-default-path" id="transformations:current-default-path">current default path</a>, and when painting text, shapes, and <code id="transformations:path2d"><a href="#path2d">Path2D</a></code>
+  objects, on objects implementing the <code id="transformations:canvastransform-3"><a href="#canvastransform">CanvasTransform</a></code> interface.</p>
+  
+
+  <p class="note">Most of the API uses <code id="transformations:dommatrix"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code> objects rather than this API. This API
+  remains mostly for historical reasons.</p>
+
+  
+
+  <p>The transformations must be performed in reverse order.</p>
+
+  <p class="note">For instance, if a scale transformation that doubles the width is applied to the
+  canvas, followed by a rotation transformation that rotates drawing operations by a quarter turn,
+  and a rectangle twice as wide as it is tall is then drawn on the canvas, the actual result will be
+  a square.</p> 
+
+  
+
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-scale"><a href="#dom-context-2d-scale-2">scale</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
+
+    <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-2">current transformation matrix</a> to apply a scaling transformation
+    with the given characteristics.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-rotate"><a href="#dom-context-2d-rotate-2">rotate</a></code>(<var>angle</var>)</dt><dd>
+
+    <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-3">current transformation matrix</a> to apply a rotation transformation
+    with the given characteristics. The angle is in radians.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-translate"><a href="#dom-context-2d-translate-2">translate</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
+
+    <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-4">current transformation matrix</a> to apply a translation transformation
+    with the given characteristics.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-transform"><a href="#dom-context-2d-transform-2">transform</a></code>(<var>a</var>, <var>b</var>, <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</dt><dd>
+
+    <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-5">current transformation matrix</a> to apply the matrix given by the
+    arguments as described below.</p>
+
+   </dd><dt><var>matrix</var> = <var>context</var> . <code id="dom-context-2d-gettransform"><a href="#dom-context-2d-gettransform-2">getTransform</a></code>()</dt><dd>
+
+    <p>Returns a copy of the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-6">current transformation matrix</a>, as a newly created
+    <code id="transformations:dommatrix-2"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code> object.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-settransform"><a href="#dom-context-2d-settransform-2">setTransform</a></code>(<var>a</var>, <var>b</var>, <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</dt><dd>
+
+    <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-7">current transformation matrix</a> <em>to</em> the matrix given by the
+    arguments as described below.</p>
+
+   </dd><dt><var>context</var> . <code id="transformations:dom-context-2d-settransform-2"><a href="#dom-context-2d-settransform-2">setTransform</a></code>(<var>transform</var>)</dt><dd>
+
+    <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-8">current transformation matrix</a> <em>to</em> the matrix represented by
+    the passed <code id="transformations:dommatrix2dinit"><a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit">DOMMatrix2DInit</a></code> dictionary.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-resettransform"><a href="#dom-context-2d-resettransform-2">resetTransform</a></code>()</dt><dd>
+
+    <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-9">current transformation matrix</a> to the identity transform.</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-context-2d-scale-2"><code>scale(<var>x</var>, <var>y</var>)</code></dfn>
+  method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Add the scaling transformation described by the arguments to the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-10">current
+   transformation matrix</a>. The <var>x</var> argument represents the scale factor in the
+   horizontal direction and the <var>y</var> argument represents the scale factor in the vertical
+   direction. The factors are multiples.</p></li></ol>
+
+  <p>The <dfn id="dom-context-2d-rotate-2"><code>rotate(<var>angle</var>)</code></dfn> method,
+  when invoked, must run these steps:</p>
+
+  <ol><li><p>If <var>angle</var> is infinite or NaN, then abort these steps.</p></li><li><p>Add the rotation transformation described by the argument to the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-11">current
+   transformation matrix</a>. The <var>angle</var> argument represents a clockwise rotation angle
+   expressed in radians.</p></li></ol>
+
+  <p>The <dfn id="dom-context-2d-translate-2"><code>translate(<var>x</var>,
+  <var>y</var>)</code></dfn> method, when invoked, must run these steps:</p>
+
+  <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Add the translation transformation described by the arguments to the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-12">current
+   transformation matrix</a>. The <var>x</var> argument represents the translation distance in
+   the horizontal direction and the <var>y</var> argument represents the translation distance in the
+   vertical direction. The arguments are in coordinate space units.</p></li></ol>
+
+  <p>The <dfn id="dom-context-2d-transform-2"><code>transform(<var>a</var>, <var>b</var>,
+  <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</code></dfn> method, when invoked, must
+  run these steps:</p>
+
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Replace the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-13">current transformation matrix</a> with the result of multiplying the
+   current transformation matrix with the matrix described by:</p></li></ol>
+
+  
+
+  <table class="matrix"><tbody><tr><td><var>a</var></td><td><var>c</var></td><td><var>e</var></td></tr><tr><td><var>b</var></td><td><var>d</var></td><td><var>f</var></td></tr><tr><td>0</td><td>0</td><td>1</td></tr></tbody></table>
+
+  <p class="note">The arguments <var>a</var>, <var>b</var>, <var>c</var>, <var>d</var>,
+  <var>e</var>, and <var>f</var> are sometimes called <var>m11</var>, <var>m12</var>,
+  <var>m21</var>, <var>m22</var>, <var>dx</var>, and <var>dy</var> or <var>m11</var>,
+  <var>m21</var>, <var>m12</var>, <var>m22</var>, <var>dx</var>, and <var>dy</var>. Care ought to be
+  taken in particular with the order of the second and third arguments (<var>b</var> and
+  <var>c</var>) as their order varies from API to API and APIs sometimes use the notation
+  <var>m12</var>/<var>m21</var> and sometimes <var>m21</var>/<var>m12</var> for those positions.</p>
+
+  
+
+  <p>The <dfn id="dom-context-2d-gettransform-2"><code>getTransform()</code></dfn> method, when
+  invoked, must return a newly created <code id="transformations:dommatrix-3"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code> representing a copy of the
+  <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-14">current transformation matrix</a> matrix of the context.</p>
+
+  <p class="note">This returned object is not live, so updating it will not affect the
+  <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-15">current transformation matrix</a>, and updating the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-16">current transformation
+  matrix</a> will not affect an already returned <code id="transformations:dommatrix-4"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code>.</p>
+
+  <p>The <dfn id="dom-context-2d-settransform-2"><code>setTransform(<var>a</var>, <var>b</var>,
+  <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</code></dfn> method, when invoked, must
+  run these steps:</p>
+
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Reset the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-17">current transformation matrix</a> to the identity matrix.</p></li><li><p>Invoke the <code><a href="#dom-context-2d-transform-2" id="transformations:dom-context-2d-transform-2">transform</a>(<var>a</var>, <var>b</var>, <var>c</var>,
+   <var>d</var>, <var>e</var>, <var>f</var>)</code> method with the same arguments.</p></li></ol>
+
+  <p>The <dfn><code>setTransform(<var>transform</var>)</code></dfn> method, when invoked,
+  must reset the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-18">current transformation matrix</a> to the value represented by the result
+  of <a data-x-internal="create-a-dommatrix-from-a-dictionary" href="https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary" id="transformations:create-a-dommatrix-from-a-dictionary">creating a <code>DOMMatrix</code> from a
+  dictionary</a> <var>transform</var>, with <var>ignore3D</var> set to true.</p>
+
+  <p>The <dfn id="dom-context-2d-resettransform-2"><code>resetTransform()</code></dfn> method,
+  when invoked, must reset the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-19">current transformation matrix</a> to the identity
+  matrix.</p>
+
+  
+
+
+
+  <h6 id="image-sources-for-2d-rendering-contexts"><span class="secno">4.12.5.1.8</span> Image sources for 2D rendering contexts<a class="self-link" href="#image-sources-for-2d-rendering-contexts"/></h6>
+
+  <p>Some methods on the <code id="image-sources-for-2d-rendering-contexts:canvasdrawimage"><a href="#canvasdrawimage">CanvasDrawImage</a></code> and <code id="image-sources-for-2d-rendering-contexts:canvasfillstrokestyles"><a href="#canvasfillstrokestyles">CanvasFillStrokeStyles</a></code>
+  interfaces take the union type <code id="image-sources-for-2d-rendering-contexts:canvasimagesource"><a href="#canvasimagesource">CanvasImageSource</a></code> as an argument.</p>
+
+  <p>This union type allows objects implementing any of the following interfaces to be used as image
+  sources:</p>
+
+  <ul><li><code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> (<code id="image-sources-for-2d-rendering-contexts:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> or <a data-x-internal="svg-image" href="https://www.w3.org/TR/SVG11/struct.html#ImageElement" id="image-sources-for-2d-rendering-contexts:svg-image">SVG <code>image</code></a>
+   elements)</li><li><code id="image-sources-for-2d-rendering-contexts:htmlvideoelement"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code> (<code id="image-sources-for-2d-rendering-contexts:the-video-element"><a href="https://html.spec.whatwg.org/multipage/media.html#the-video-element">video</a></code> elements)</li><li><code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> (<code id="image-sources-for-2d-rendering-contexts:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> elements)</li><li><code id="image-sources-for-2d-rendering-contexts:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code></li></ul>
+
+  <p class="note">Although not formally specified as such, <a data-x-internal="svg-image" href="https://www.w3.org/TR/SVG11/struct.html#ImageElement" id="image-sources-for-2d-rendering-contexts:svg-image-2">SVG <code>image</code></a>
+  elements are expected to be implemented nearly identical to <code id="image-sources-for-2d-rendering-contexts:the-img-element-2"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> elements. That is,
+  <a data-x-internal="svg-image" href="https://www.w3.org/TR/SVG11/struct.html#ImageElement" id="image-sources-for-2d-rendering-contexts:svg-image-3">SVG <code>image</code></a> elements share the fundamental concepts and features of
+  <code id="image-sources-for-2d-rendering-contexts:the-img-element-3"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> elements.</p>
+
+  <p class="note">The <code id="image-sources-for-2d-rendering-contexts:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> interface can be created from a number of other
+  image-representing types, including <code id="image-sources-for-2d-rendering-contexts:imagedata"><a href="#imagedata">ImageData</a></code>.</p>
+
+  <p>When a user agent is required to <dfn id="check-the-usability-of-the-image-argument">check the usability of the <var>image</var>
+  argument</dfn>, where <var>image</var> is a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-2"><a href="#canvasimagesource">CanvasImageSource</a></code> object, the
+  user agent must run these steps, which return either <i>good</i>, <i>bad</i>, or
+  <i>aborted</i>:</p>
+
+  <ol><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-2"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object that is in the <a href="https://html.spec.whatwg.org/multipage/images.html#img-error" id="image-sources-for-2d-rendering-contexts:img-error">broken</a> state, then throw an
+   <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="image-sources-for-2d-rendering-contexts:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="image-sources-for-2d-rendering-contexts:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>, return <i>aborted</i>,
+   and abort these steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-3"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object that is not <a href="https://html.spec.whatwg.org/multipage/images.html#img-good" id="image-sources-for-2d-rendering-contexts:img-good">fully decodable</a>, or if <var>image</var> is an
+   <code id="image-sources-for-2d-rendering-contexts:htmlvideoelement-2"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code> object whose <code id="image-sources-for-2d-rendering-contexts:dom-media-readystate-2"><a href="https://html.spec.whatwg.org/multipage/media.html#dom-media-readystate-2">readyState</a></code>
+   attribute is either <code id="image-sources-for-2d-rendering-contexts:dom-media-have_nothing"><a href="https://html.spec.whatwg.org/multipage/media.html#dom-media-have_nothing">HAVE_NOTHING</a></code> or <code id="image-sources-for-2d-rendering-contexts:dom-media-have_metadata"><a href="https://html.spec.whatwg.org/multipage/media.html#dom-media-have_metadata">HAVE_METADATA</a></code>, then return <i>bad</i> and abort these
+   steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-4"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object with an
+   <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="image-sources-for-2d-rendering-contexts:intrinsic-width">intrinsic width</a> or <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="image-sources-for-2d-rendering-contexts:intrinsic-height">intrinsic height</a> (or both) equal to zero, then
+   return <i>bad</i> and abort these steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement-2"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> object with either a horizontal
+   dimension or a vertical dimension equal to zero, then return <i>bad</i> and abort these
+   steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:imagebitmap-3"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object with its
+   <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="image-sources-for-2d-rendering-contexts:detached">[[Detached]]</a> internal slot value set to true, then throw an
+   <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="image-sources-for-2d-rendering-contexts:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="image-sources-for-2d-rendering-contexts:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>, return <i>aborted</i>,
+   and abort these steps.</p></li><li><p>Return <i>good</i>.</p></li></ol>
+
+  <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-3"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-5"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code>,
+  the element's image must be used as the source image.</p>
+
+  <p>Specifically, when a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-4"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an animated image in an
+  <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-6"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code>, the user agent must use the default image of the animation
+  (the one that the format defines is to be used when animation is not supported or is disabled),
+  or, if there is no such image, the first frame of the animation, when rendering the image for
+  <code id="image-sources-for-2d-rendering-contexts:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> APIs.</p>
+
+  <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-5"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:htmlvideoelement-3"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code>, then
+  the frame at the <a href="https://html.spec.whatwg.org/multipage/media.html#current-playback-position" id="image-sources-for-2d-rendering-contexts:current-playback-position">current playback position</a> when the method with the argument is
+  invoked must be used as the source image when rendering the image for
+  <code id="image-sources-for-2d-rendering-contexts:canvasrenderingcontext2d-2"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> APIs, and the source image's dimensions must be the <a href="https://html.spec.whatwg.org/multipage/media.html#concept-video-intrinsic-width" id="image-sources-for-2d-rendering-contexts:concept-video-intrinsic-width">intrinsic width</a> and <a href="https://html.spec.whatwg.org/multipage/media.html#concept-video-intrinsic-height" id="image-sources-for-2d-rendering-contexts:concept-video-intrinsic-height">intrinsic height</a> of the <a href="https://html.spec.whatwg.org/multipage/media.html#media-resource" id="image-sources-for-2d-rendering-contexts:media-resource">media resource</a>
+  (i.e. after any aspect-ratio correction has been applied).</p>
+
+  <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-6"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement-3"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, the
+  element's bitmap must be used as the source image.</p>
+
+  <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-7"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an element that is <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="image-sources-for-2d-rendering-contexts:being-rendered">being
+  rendered</a> and that element has been resized, the original image data of the source image
+  must be used, not the image as it is rendered (e.g. <code id="image-sources-for-2d-rendering-contexts:attr-dim-width"><a href="https://html.spec.whatwg.org/multipage/embedded-content-other.html#attr-dim-width">width</a></code> and
+  <code id="image-sources-for-2d-rendering-contexts:attr-dim-height"><a href="https://html.spec.whatwg.org/multipage/embedded-content-other.html#attr-dim-height">height</a></code> attributes on the source element have no effect on how
+  the object is interpreted when rendering the image for <code id="image-sources-for-2d-rendering-contexts:canvasrenderingcontext2d-3"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
+  APIs).</p>
+
+  <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-8"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:imagebitmap-4"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>, the
+  object's bitmap image data must be used as the source image.</p>
+
+  <p><dfn id="the-image-argument-is-not-origin-clean">The <var>image argument</var> is not origin-clean</dfn> if it is an
+  <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-7"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> or <code id="image-sources-for-2d-rendering-contexts:htmlvideoelement-4"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code> whose <a href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin" id="image-sources-for-2d-rendering-contexts:concept-origin">origin</a> is
+  not the <a href="https://html.spec.whatwg.org/multipage/origin.html#same-origin" id="image-sources-for-2d-rendering-contexts:same-origin">same</a> as the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-origin" id="image-sources-for-2d-rendering-contexts:concept-settings-object-origin">origin</a> specified by the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#entry-settings-object" id="image-sources-for-2d-rendering-contexts:entry-settings-object">entry settings
+  object</a>, or if it is an <code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement-4"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose bitmap's <a href="#concept-canvas-origin-clean" id="image-sources-for-2d-rendering-contexts:concept-canvas-origin-clean">origin-clean</a> flag is false.</p>
+
+
+
+  <h6 id="fill-and-stroke-styles"><span class="secno">4.12.5.1.9</span> Fill and stroke styles<a class="self-link" href="#fill-and-stroke-styles"/></h6>
+
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-fillstyle"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current style used for filling shapes.</p>
+
+    <p>Can be set, to change the fill style.</p>
+
+    <p>The style can be either a string containing a CSS color, or a <code id="fill-and-stroke-styles:canvasgradient"><a href="#canvasgradient">CanvasGradient</a></code> or
+    <code id="fill-and-stroke-styles:canvaspattern"><a href="#canvaspattern">CanvasPattern</a></code> object. Invalid values are ignored.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-strokestyle"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current style used for stroking shapes.</p>
+
+    <p>Can be set, to change the stroke style.</p>
+
+    <p>The style can be either a string containing a CSS color, or a <code id="fill-and-stroke-styles:canvasgradient-2"><a href="#canvasgradient">CanvasGradient</a></code> or
+    <code id="fill-and-stroke-styles:canvaspattern-2"><a href="#canvaspattern">CanvasPattern</a></code> object. Invalid values are ignored.</p>
+
+   </dd></dl>
+
+  
+
+  
+
+  <p>Objects that implement the <code id="fill-and-stroke-styles:canvasfillstrokestyles"><a href="#canvasfillstrokestyles">CanvasFillStrokeStyles</a></code> interface have attributes and
+  methods (defined in this section) that control how shapes are treated by the object.</p>
+
+  <p>The <dfn id="dom-context-2d-fillstyle-2"><code>fillStyle</code></dfn> attribute represents the
+  color or style to use inside shapes, and the <dfn id="dom-context-2d-strokestyle-2"><code>strokeStyle</code></dfn> attribute represents the color
+  or style to use for the lines around the shapes.</p>
+
+  <p>Both attributes can be either strings, <code id="fill-and-stroke-styles:canvasgradient-3"><a href="#canvasgradient">CanvasGradient</a></code>s, or
+  <code id="fill-and-stroke-styles:canvaspattern-3"><a href="#canvaspattern">CanvasPattern</a></code>s. On setting, strings must be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value">parsed as CSS &lt;color&gt; values</a> and the color assigned, and
+  <code id="fill-and-stroke-styles:canvasgradient-4"><a href="#canvasgradient">CanvasGradient</a></code> and <code id="fill-and-stroke-styles:canvaspattern-4"><a href="#canvaspattern">CanvasPattern</a></code> objects must be assigned themselves. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a> If the value is a string but cannot be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value-2">parsed as a CSS
+  &lt;color&gt; value</a>, then it must be ignored, and the attribute must retain its previous
+  value.
+
+  If the new value is a <code id="fill-and-stroke-styles:canvaspattern-5"><a href="#canvaspattern">CanvasPattern</a></code> object that is marked as <a href="#concept-canvas-pattern-not-origin-clean" id="fill-and-stroke-styles:concept-canvas-pattern-not-origin-clean">not origin-clean</a>, then the
+  <code id="fill-and-stroke-styles:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>'s <a href="#concept-canvas-origin-clean" id="fill-and-stroke-styles:concept-canvas-origin-clean">origin-clean</a> flag must be set to false.
+
+  </p>
+
+  <p>When set to a <code id="fill-and-stroke-styles:canvaspattern-6"><a href="#canvaspattern">CanvasPattern</a></code> or <code id="fill-and-stroke-styles:canvasgradient-5"><a href="#canvasgradient">CanvasGradient</a></code> object, the assignment
+  is <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#live" id="fill-and-stroke-styles:live">live</a>, meaning that changes made to the object after the assignment do affect
+  subsequent stroking or filling of shapes.</p>
+
+  <p>On getting, if the value is a color, then the <a href="#serialisation-of-a-color" id="fill-and-stroke-styles:serialisation-of-a-color">serialization of the color</a> must be returned. Otherwise, if it is not a color but a
+  <code id="fill-and-stroke-styles:canvasgradient-6"><a href="#canvasgradient">CanvasGradient</a></code> or <code id="fill-and-stroke-styles:canvaspattern-7"><a href="#canvaspattern">CanvasPattern</a></code>, then the respective object must be
+  returned. (Such objects are opaque and therefore only useful for assigning to other attributes or
+  for comparison to other gradients or patterns.)</p>
+
+  <p>The <dfn id="serialisation-of-a-color">serialization of a color</dfn> for a color
+  value is a string, computed as follows: if it has alpha equal to 1.0, then the string is a
+  lowercase six-digit hex value, prefixed with a &quot;#&quot; character (U+0023 NUMBER SIGN), with the first
+  two digits representing the red component, the next two digits representing the green component,
+  and the last two digits representing the blue component, the digits being <a data-x-internal="lowercase-ascii-hex-digits" href="https://infra.spec.whatwg.org/#ascii-lower-hex-digit" id="fill-and-stroke-styles:lowercase-ascii-hex-digits">ASCII lower hex digits</a>. Otherwise, the color value has alpha less than
+  1.0, and the string is the color value in the CSS <code>rgba()</code>
+  functional-notation format: the literal string &quot;<code>rgba</code>&quot; (U+0072 U+0067 U+0062
+  U+0061) followed by a U+0028 LEFT PARENTHESIS, a base-ten integer in the range 0-255 representing
+  the red component (using <a data-x-internal="ascii-digits" href="https://infra.spec.whatwg.org/#ascii-digit" id="fill-and-stroke-styles:ascii-digits">ASCII digits</a> in the shortest form possible), a literal
+  U+002C COMMA and U+0020 SPACE, an integer for the green component, a comma and a space, an integer
+  for the blue component, another comma and space, a U+0030 DIGIT ZERO, if the alpha value is
+  greater than zero then a U+002E FULL STOP (representing the decimal point), if the alpha value is
+  greater than zero then one or more <a data-x-internal="ascii-digits" href="https://infra.spec.whatwg.org/#ascii-digit" id="fill-and-stroke-styles:ascii-digits-2">ASCII digits</a> representing the fractional part of
+  the alpha, and finally a U+0029
+  RIGHT PARENTHESIS. User agents must express the fractional part of the alpha value, if any, with
+  the level of precision necessary for the alpha value, when reparsed, to be interpreted as the same
+  alpha value.</p>
+  
+
+  <p>When the context is created, the <code id="fill-and-stroke-styles:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> and <code id="fill-and-stroke-styles:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> attributes
+  must initially have the string value <code>#000000</code>.</p>
+
+  <p>When the value is a color, it must not be affected by the transformation matrix when used to
+  draw on bitmaps.</p> 
+
+  
+
+  <hr/>
+
+  <p>There are two types of gradients, linear gradients and radial gradients, both represented by
+  objects implementing the opaque <code id="fill-and-stroke-styles:canvasgradient-7"><a href="#canvasgradient">CanvasGradient</a></code> interface.</p>
+
+  <p id="interpolation">Once a gradient has been created (see below), stops are placed along it to
+  define how the colors are distributed along the gradient. The color of the
+  gradient at each stop is the color specified for that stop. Between each such stop, the colors and
+  the alpha component must be linearly interpolated over the RGBA space without premultiplying the
+  alpha value to find the color to use at that offset. Before the first stop, the color must be the
+  color of the first stop. After the last stop, the color must be the color of the last stop. When
+  there are no stops, the gradient is transparent black.</p>
+
+  <dl class="domintro"><dt><var>gradient</var> . <code id="dom-canvasgradient-addcolorstop"><a href="#dom-canvasgradient-addcolorstop-2">addColorStop</a></code>(<var>offset</var>, <var>color</var>)</dt><dd>
+
+    <p>Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset
+    at one end of the gradient, 1.0 is the offset at the other end.</p>
+
+    <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the offset
+    is out of range. Throws a <a data-x-internal="syntaxerror" href="https://heycam.github.io/webidl/#syntaxerror" id="fill-and-stroke-styles:syntaxerror">&quot;<code>SyntaxError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if
+    the color cannot be parsed.</p>
+
+   </dd><dt><var>gradient</var> = <var>context</var> . <code id="dom-context-2d-createlineargradient"><a href="#dom-context-2d-createlineargradient-2">createLinearGradient</a></code>(<var>x0</var>, <var>y0</var>, <var>x1</var>, <var>y1</var>)</dt><dd>
+
+    <p>Returns a <code id="fill-and-stroke-styles:canvasgradient-8"><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
+    linear gradient that paints along the line given by the
+    coordinates represented by the arguments.</p>
+
+   </dd><dt><var>gradient</var> = <var>context</var> . <code id="dom-context-2d-createradialgradient"><a href="#dom-context-2d-createradialgradient-2">createRadialGradient</a></code>(<var>x0</var>, <var>y0</var>, <var>r0</var>, <var>x1</var>, <var>y1</var>, <var>r1</var>)</dt><dd>
+
+    <p>Returns a <code id="fill-and-stroke-styles:canvasgradient-9"><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
+    radial gradient that paints along the cone given by the circles
+    represented by the arguments.</p>
+
+    <p>If either of the radii are negative, throws an
+    <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror-2">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> exception.</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-canvasgradient-addcolorstop-2"><code>addColorStop(<var>offset</var>,
+  <var>color</var>)</code></dfn> method on the <code id="fill-and-stroke-styles:canvasgradient-10"><a href="#canvasgradient">CanvasGradient</a></code> interface adds a new stop
+  to a gradient. If the <var>offset</var> is less than 0 or greater than 1 then an
+  <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror-3">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> must be thrown. If the
+  <var>color</var> cannot be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value-3">parsed as a CSS &lt;color&gt; value</a>, then a
+  <a data-x-internal="syntaxerror" href="https://heycam.github.io/webidl/#syntaxerror" id="fill-and-stroke-styles:syntaxerror-2">&quot;<code>SyntaxError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> must be thrown. Otherwise, the
+  gradient must have a new stop placed, at offset <var>offset</var> relative to the whole gradient,
+  and with the color obtained by <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value-4">parsing
+  <var>color</var> as a CSS &lt;color&gt; value</a>. If multiple stops are added at the same
+  offset on a gradient, then they must be placed in the order added, with the first one closest to
+  the start of the gradient, and each subsequent one infinitesimally further along towards the end
+  point (in effect causing all but the first and last stop added at each point to be ignored).</p>
+
+  <p>The <dfn id="dom-context-2d-createlineargradient-2"><code>createLinearGradient(<var>x0</var>,
+  <var>y0</var>, <var>x1</var>, <var>y1</var>)</code></dfn> method takes four arguments that
+  represent the start point (<var>x0</var>, <var>y0</var>) and end point (<var>x1</var>,
+  <var>y1</var>) of the gradient. The method, when invoked, must return a linear
+  <code id="fill-and-stroke-styles:canvasgradient-11"><a href="#canvasgradient">CanvasGradient</a></code> initialized with the specified line.</p>
+
+  <p>Linear gradients must be rendered such that all points on a line perpendicular to the line that
+  crosses the start and end points have the color at the point where those two lines cross (with the
+  colors coming from the <a href="#interpolation">interpolation and extrapolation</a> described
+  above). The points in the linear gradient must be transformed as described by the <a href="#transformations" id="fill-and-stroke-styles:transformations">current transformation matrix</a> when rendering.</p>
+
+  <p>If <var>x0</var> = <var>x1</var> and <span><var>y0</var> = <var>y1</var></span>, then the linear
+  gradient must paint nothing.</p>
+
+  <p>The <dfn id="dom-context-2d-createradialgradient-2"><code>createRadialGradient(<var>x0</var>,
+  <var>y0</var>, <var>r0</var>, <var>x1</var>, <var>y1</var>, <var>r1</var>)</code></dfn> method
+  takes six arguments, the first three representing the start circle with origin (<var>x0</var>,
+  <var>y0</var>) and radius <var>r0</var>, and the last three representing the end circle with
+  origin (<var>x1</var>, <var>y1</var>) and radius <var>r1</var>. The values are in coordinate space
+  units. If either of <var>r0</var> or <var>r1</var> are negative, then an
+  <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror-4">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> must be thrown. Otherwise,
+  the method, when invoked, must return a radial <code id="fill-and-stroke-styles:canvasgradient-12"><a href="#canvasgradient">CanvasGradient</a></code> initialized with the
+  two specified circles.</p>
+
+  <p>Radial gradients must be rendered by following these steps:</p>
+
+  <ol><li><p>If <var>x<sub>0</sub></var> = <var>x<sub>1</sub></var> and <var>y<sub>0</sub></var> = <var>y<sub>1</sub></var> and <var>r<sub>0</sub></var> = <var>r<sub>1</sub></var>, then the radial gradient must
+   paint nothing. Abort these steps.</p></li><li>
+
+    <p>Let <span>x(<var>ω</var>) = (<var>x<sub>1</sub></var>-<var>x<sub>0</sub></var>)<var>ω</var> + <var>x<sub>0</sub></var></span></p>
+
+    <p>Let <span>y(<var>ω</var>) = (<var>y<sub>1</sub></var>-<var>y<sub>0</sub></var>)<var>ω</var> + <var>y<sub>0</sub></var></span></p>
+
+    <p>Let <span>r(<var>ω</var>) = (<var>r<sub>1</sub></var>-<var>r<sub>0</sub></var>)<var>ω</var> + <var>r<sub>0</sub></var></span></p>
+
+    <p>Let the color at <var>ω</var> be the color at that position on the gradient
+    (with the colors coming from the <a href="#interpolation">interpolation and extrapolation</a>
+    described above).</p>
+
+   </li><li><p>For all values of <var>ω</var> where <span>r(<var>ω</var>) &gt; 0</span>, starting with the value of <var>ω</var> nearest to positive infinity and ending with the value of <var>ω</var> nearest to negative infinity, draw the circumference of the circle with
+   radius <span>r(<var>ω</var>)</span> at position (<span>x(<var>ω</var>)</span>, <span>y(<var>ω</var>)</span>), with the
+   color at <var>ω</var>, but only painting on the parts of the bitmap that have not
+   yet been painted on by earlier circles in this step for this rendering of the gradient.</p></li></ol>
+
+  <p class="note">This effectively creates a cone, touched by the two circles defined in the
+  creation of the gradient, with the part of the cone before the start circle (0.0) using the color
+  of the first offset, the part of the cone after the end circle (1.0) using the color of the last
+  offset, and areas outside the cone untouched by the gradient (transparent black).</p>
+
+  <p>The resulting radial gradient must then be transformed as described by the <a href="#transformations" id="fill-and-stroke-styles:transformations-2">current transformation matrix</a> when rendering.</p>
+
+  <p>Gradients must be painted only where the relevant stroking or filling effects requires that
+  they be drawn.</p>
+
+  
+
+  <hr/>
+
+  <p>Patterns are represented by objects implementing the opaque <code id="fill-and-stroke-styles:canvaspattern-8"><a href="#canvaspattern">CanvasPattern</a></code>
+  interface.</p>
+
+  <dl class="domintro"><dt><var>pattern</var> = <var>context</var> . <code id="dom-context-2d-createpattern"><a href="#dom-context-2d-createpattern-2">createPattern</a></code>(<var>image</var>, <var>repetition</var>)</dt><dd>
+
+    <p>Returns a <code id="fill-and-stroke-styles:canvaspattern-9"><a href="#canvaspattern">CanvasPattern</a></code> object that uses the given image and repeats in the
+    direction(s) given by the <var>repetition</var> argument.</p>
+
+    <p>The allowed values for <var>repetition</var> are <code>repeat</code> (both
+    directions), <code>repeat-x</code> (horizontal only), <code>repeat-y</code>
+    (vertical only), and <code>no-repeat</code> (neither). If the <var>repetition</var> argument is empty, the value <code>repeat</code> is used.</p>
+
+    <p>If the image isn't yet fully decoded, then nothing is drawn. If the image is a canvas with no
+    data, throws an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="fill-and-stroke-styles:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p>
+
+   </dd><dt><var>pattern</var> . <code id="dom-canvaspattern-settransform"><a href="#dom-canvaspattern-settransform-2">setTransform</a></code>(<var>transform</var>)</dt><dd>
+
+    <p>Sets the transformation matrix that will be used when rendering the pattern during a fill or
+    stroke painting operation.</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-context-2d-createpattern-2"><code>createPattern(<var>image</var>,
+  <var>repetition</var>)</code></dfn> method, when invoked, must run these steps:</p>
+
+  <ol><li><p>Let <var>image</var> be the first argument and <var>repetition</var> be
+   the second argument.</p></li><li><p><a href="#check-the-usability-of-the-image-argument" id="fill-and-stroke-styles:check-the-usability-of-the-image-argument">Check the usability of the <var>image</var> argument</a>. If this
+   returns <i>aborted</i>, then an exception has been thrown and the method doesn't return anything;
+   abort these steps. If it returns <i>bad</i>, then return null and abort these steps. Otherwise it
+   returns <i>good</i>; continue with these steps.</p></li><li><p>If <var>repetition</var> is the empty string, then set it to &quot;<code>repeat</code>&quot;.</p>
+
+   </li><li><p>If <var>repetition</var> is not a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#case-sensitive" id="fill-and-stroke-styles:case-sensitive">case-sensitive</a> match for one of
+   &quot;<code>repeat</code>&quot;, &quot;<code>repeat-x</code>&quot;, &quot;<code>repeat-y</code>&quot;, or &quot;<code>no-repeat</code>&quot;, then throw a
+   <a data-x-internal="syntaxerror" href="https://heycam.github.io/webidl/#syntaxerror" id="fill-and-stroke-styles:syntaxerror-3">&quot;<code>SyntaxError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-8"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p></li><li><p>Create a new <code id="fill-and-stroke-styles:canvaspattern-10"><a href="#canvaspattern">CanvasPattern</a></code> object with the image <var>image</var>
+   and the repetition behavior given by <var>repetition</var>.</p></li><li><p>If <a href="#the-image-argument-is-not-origin-clean" id="fill-and-stroke-styles:the-image-argument-is-not-origin-clean">the <var>image argument</var> is not origin-clean</a>, then mark the
+   <code id="fill-and-stroke-styles:canvaspattern-11"><a href="#canvaspattern">CanvasPattern</a></code> object as <dfn id="concept-canvas-pattern-not-origin-clean">not
+   origin-clean</dfn>.</p></li><li><p>Return the <code id="fill-and-stroke-styles:canvaspattern-12"><a href="#canvaspattern">CanvasPattern</a></code> object.</p></li></ol>
+
+  <p>Modifying the <var>image</var> used when creating a <code id="fill-and-stroke-styles:canvaspattern-13"><a href="#canvaspattern">CanvasPattern</a></code> object
+  after calling the <code id="fill-and-stroke-styles:dom-context-2d-createpattern-2"><a href="#dom-context-2d-createpattern-2">createPattern()</a></code> method must
+  not affect the pattern(s) rendered by the <code id="fill-and-stroke-styles:canvaspattern-14"><a href="#canvaspattern">CanvasPattern</a></code> object.</p>
+
+  <p>Patterns have a transformation matrix, which controls how the pattern is used when it is
+  painted. Initially, a pattern's transformation matrix must be the identity transform.</p>
+
+  <p>The <dfn id="dom-canvaspattern-settransform-2"><code>setTransform(<var>transform</var>)</code></dfn> method,
+  when invoked, must reset the pattern's transformation matrix to the value represented by the
+  result of <a data-x-internal="create-a-dommatrix-from-a-dictionary" href="https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary" id="fill-and-stroke-styles:create-a-dommatrix-from-a-dictionary">creating a <code>DOMMatrix</code>
+  from a dictionary</a> <var>transform</var>, with <var>ignore3D</var> set to true.</p>
+
+  <p>When a pattern is to be rendered within an area, the user agent must run the following steps to
+  determine what is rendered:</p>
+
+  <ol><li><p>Create an infinite transparent black bitmap.</p></li><li>
+
+    <p>Place a copy of the image on the bitmap, anchored such that its top left corner is at the
+    origin of the coordinate space, with one coordinate space unit per <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="fill-and-stroke-styles:'px'">CSS
+    pixel</a> of the image, then place repeated copies of this image horizontally to the left and
+    right, if the repetition behavior is &quot;<code>repeat-x</code>&quot;, or vertically up and
+    down, if the repetition behavior is &quot;<code>repeat-y</code>&quot;, or in all four
+    directions all over the bitmap, if the repetition behavior is &quot;<code>repeat</code>&quot;.</p>
+
+    <p>If the original image data is a bitmap image, then the value painted at a point in the area
+    of the repetitions is computed by filtering the original image data. When scaling up, if the
+    <code id="fill-and-stroke-styles:dom-context-2d-imagesmoothingenabled-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is
+    set to false, then the image must be rendered using nearest-neighbor interpolation. Otherwise,
+    the user agent may use any filtering algorithm (for example bilinear interpolation or
+    nearest-neighbor). User agents which support multiple filtering algorithms may use the value of
+    the <code id="fill-and-stroke-styles:dom-context-2d-imagesmoothingquality-2"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code> attribute
+    to guide the choice of filtering algorithm. When such a filtering algorithm requires a pixel
+    value from outside the original image data, it must instead use the value from wrapping the
+    pixel's coordinates to the original image's dimensions. (That is, the filter uses 'repeat'
+    behavior, regardless of the value of the pattern's repetition behavior.)</p> 
+
+   </li><li><p>Transform the resulting bitmap according to the pattern's transformation matrix.</p></li><li><p>Transform the resulting bitmap again, this time according to the <a href="#transformations" id="fill-and-stroke-styles:transformations-3">current transformation matrix</a>.</p></li><li><p>Replace any part of the image outside the area in which the pattern is to be rendered with
+   transparent black.</p></li><li><p>The resulting bitmap is what is to be rendered, with the same origin and same
+   scale.</p></li></ol>
+
+  <hr/>
+
+  <p>If a radial gradient or repeated pattern is used when the transformation matrix is singular,
+  then the resulting style must be transparent black (otherwise the gradient or pattern would be
+  collapsed to a point or line, leaving the other pixels undefined). Linear gradients and solid
+  colors always define all points even with singular transformation matrices.</p>
+
+  
+
+
+
+
+  <h6 id="drawing-rectangles-to-the-bitmap"><span class="secno">4.12.5.1.10</span> Drawing rectangles to the bitmap<a class="self-link" href="#drawing-rectangles-to-the-bitmap"/></h6>
+
+  <p>Objects that implement the <code id="drawing-rectangles-to-the-bitmap:canvasrect"><a href="#canvasrect">CanvasRect</a></code> interface provide the following methods for
+  immediately drawing rectangles to the bitmap. The methods each take four arguments; the first two
+  give the <var>x</var> and <var>y</var> coordinates of the top left of the rectangle, and the
+  second two give the width <var>w</var> and height <var>h</var> of the rectangle, respectively.</p>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-fill"><a href="#dom-context-2d-fill">fill</a></code>()</dt>
+  
 
-   <dd>
+  <p>The <a href="#transformations" id="drawing-rectangles-to-the-bitmap:transformations">current transformation matrix</a> must be
+  applied to the following four coordinates, which form the path that must then be closed to get the
+  specified rectangle: <span>(<var>x</var>, <var>y</var>)</span>, <span>(<var>x</var>+<var>w</var>, <var>y</var>)</span>, <span>(<var>x</var>+<var>w</var>, <var>y</var>+<var>h</var>)</span>, <span>(<var>x</var>, <var>y</var>+<var>h</var>)</span>.</p>
 
-    <p>Fills the subpaths with the current fill style.</p>
+  <p>Shapes are painted without affecting the <a href="#current-default-path" id="drawing-rectangles-to-the-bitmap:current-default-path">current default path</a>, and are subject to
+  the <a href="#clipping-region" id="drawing-rectangles-to-the-bitmap:clipping-region">clipping region</a>, and, with the exception of <code id="drawing-rectangles-to-the-bitmap:dom-context-2d-clearrect-2"><a href="#dom-context-2d-clearrect-2">clearRect()</a></code>, also <a href="#shadows" id="drawing-rectangles-to-the-bitmap:shadows">shadow
+  effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-rectangles-to-the-bitmap:dom-context-2d-globalalpha-2">global alpha</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-rectangles-to-the-bitmap:dom-context-2d-globalcompositeoperation-2">global composition operators</a>.</p>
 
-   </dd>
+  
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-stroke"><a href="#dom-context-2d-stroke">stroke</a></code>()</dt>
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-clearrect"><a href="#dom-context-2d-clearrect-2">clearRect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
 
-   <dd>
+    <p>Clears all pixels on the bitmap in the given rectangle to transparent black.</p>
 
-    <p>Strokes the subpaths with the current stroke style.</p>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-fillrect"><a href="#dom-context-2d-fillrect-2">fillRect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
 
-   </dd>
+    <p>Paints the given rectangle onto the bitmap, using the current fill style.</p>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-drawSystemFocusRing"><a href="#dom-context-2d-drawsystemfocusring">drawSystemFocusRing</a></code>(<var title="">element</var>)</dt>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-strokerect"><a href="#dom-context-2d-strokerect-2">strokeRect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
 
-   <dd>
+    <p>Paints the box that outlines the given rectangle onto the bitmap, using the current stroke
+    style.</p>
 
-    <p>If the given element is focused, draws a focus ring around the
-    current path, following the platform conventions for focus
-    rings.</p>
+   </dd></dl>
 
-   </dd>
+  
 
-   <dt><var title="">shouldDraw</var> = <var title="">context</var> . <code title="dom-context-2d-drawCustomFocusRing"><a href="#dom-context-2d-drawcustomfocusring">drawCustomFocusRing</a></code>(<var title="">element</var>)</dt>
+  <p>The <dfn id="dom-context-2d-clearrect-2"><code>clearRect(<var>x</var>, <var>y</var>,
+  <var>w</var>, <var>h</var>)</code></dfn> method, when invoked, must run these steps:</p>
 
-   <dd>
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Let <var>pixels</var> be the set of pixels in the specified rectangle that also
+   intersect the current <a href="#clipping-region" id="drawing-rectangles-to-the-bitmap:clipping-region-2">clipping region</a>.</p></li><li><p>Clear the pixels in <var>pixels</var> to a fully transparent black, erasing any
+   previous image.</p></li></ol>
 
-    <p>If the given element is focused, and the user has configured
-    his system to draw focus rings in a particular manner (for
-    example, high contrast focus rings), draws a focus ring around the
-    current path and returns false.</p>
+  <p class="note">If either height or width are zero, this method has no effect, since the set of
+  pixels would be empty.</p>
 
-    <p>Otherwise, returns true if the given element is focused, and
-    false otherwise. This can thus be used to determine when to draw a
-    focus ring (see <a href="#drawCustomFocusRingExample">the
-    example</a> below).</p>
+  <p>The <dfn id="dom-context-2d-fillrect-2"><code>fillRect(<var>x</var>, <var>y</var>,
+  <var>w</var>, <var>h</var>)</code></dfn> method, when invoked, must must run these steps:</p>
 
-   </dd>
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>If either <var>w</var> or <var>h</var> are zero, then abort these steps.</p></li><li><p>Paint the specified rectangular area using the <code id="drawing-rectangles-to-the-bitmap:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code>.</p>
+  </li></ol>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-scrollPathIntoView"><a href="#dom-context-2d-scrollpathintoview">scrollPathIntoView</a></code>()</dt>
+  <p>The <dfn id="dom-context-2d-strokerect-2"><code>strokeRect(<var>x</var>, <var>y</var>,
+  <var>w</var>, <var>h</var>)</code></dfn> method, when invoked, must run these steps:</p>
 
-   <dd>
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Take the result of <a href="#trace-a-path" id="drawing-rectangles-to-the-bitmap:trace-a-path">tracing the path</a> described below,
+   using the <code id="drawing-rectangles-to-the-bitmap:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface's line styles, and fill it with the
+   <code id="drawing-rectangles-to-the-bitmap:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code>.</p></li></ol>
 
-    <p>Scrolls the current path into view. This is especially useful
-    on devices with small screens, where the whole canvas might not be
-    visible at once.</p>
+  <p>If both <var>w</var> and <var>h</var> are zero, the path has a single subpath
+  with just one point (<var>x</var>, <var>y</var>), and no lines, and this method
+  thus has no effect (the <a href="#trace-a-path" id="drawing-rectangles-to-the-bitmap:trace-a-path-2">trace a path</a> algorithm returns an empty path in that
+  case).</p>
 
-   </dd>
+  <p>If just one of either <var>w</var> or <var>h</var> is zero, then the path has
+  a single subpath consisting of two points, with coordinates (<var>x</var>, <var>y</var>) and (<var>x</var>+<var>w</var>, <var>y</var>+<var>h</var>), in that order, connected by a single straight line.</p>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-clip"><a href="#dom-context-2d-clip">clip</a></code>()</dt>
+  <p>Otherwise, the path has a single subpath consisting of four points, with coordinates (<span><var>x</var></span>, <var>y</var>), (<span><var>x</var>+<var>w</var></span>, <var>y</var>), (<var>x</var>+<var>w</var>,
+  <var>y</var>+<var>h</var>), and (<var>x</var>, <var>y</var>+<var>h</var>),
+  connected to each other in that order by straight lines.</p>
 
-   <dd>
+  
 
-    <p>Further constrains the clipping region to the given path.</p>
 
-   </dd>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-isPointInPath"><a href="#dom-context-2d-ispointinpath">isPointInPath</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
+  <h6 id="drawing-text-to-the-bitmap"><span class="secno">4.12.5.1.11</span> Drawing text to the bitmap<a class="self-link" href="#drawing-text-to-the-bitmap"/></h6><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="support"><strong>Support:</strong> canvas-text<span class="and_chr yes"><span>Chrome for Android</span> <span>59+</span></span><span class="chrome yes"><span>Chrome</span> <span>4+</span></span><span class="and_uc yes"><span>UC Browser for Android</span> <span>11.4+</span></span><span class="ios_saf yes"><span>iOS Safari</span> <span>3.2+</span></span><span class="firefox yes"><span>Firefox</span> <span>3.5+</span></span><span class="ie yes"><span>IE</span> <span>9+</span></span><span class="samsung yes"><span>Samsung Internet</span> <span>4+</span></span><span class="op_mini no"><span>Opera Mini</span> <span>None</span></span><span class="safari yes"><span>Safari</span> <span>4+</span></span><span class="android yes"><span>Android Browser</span> <span>2.1+</span></span><span class="opera yes"><span>Opera</span> <span>10.5+</span></span><span class="edge yes"><span>Edge</span> <span>12+</span></span></p><p class="caniuse">Source: <a href="https://caniuse.com/#feat=canvas-text">caniuse.com</a></p></div>
 
-   <dd>
+  <dl class="domintro" id="text-0"><dt><var>context</var> . <code id="dom-context-2d-filltext"><a href="#dom-context-2d-filltext-2">fillText</a></code>(<var>text</var>, <var>x</var>, <var>y</var> [, <var>maxWidth</var> ] )</dt><dt><var>context</var> . <code id="dom-context-2d-stroketext"><a href="#dom-context-2d-stroketext-2">strokeText</a></code>(<var>text</var>, <var>x</var>, <var>y</var> [, <var>maxWidth</var> ] )</dt><dd>
 
-    <p>Returns true if the given point is in the current path.</p>
+    <p>Fills or strokes (respectively) the given text at the given position. If a maximum width is
+    provided, the text will be scaled to fit that width if necessary.</p>
 
-   </dd>
+   </dd><dt><var>metrics</var> = <var>context</var> . <code id="dom-context-2d-measuretext"><a href="#dom-context-2d-measuretext-2">measureText</a></code>(<var>text</var>)</dt><dd>
 
-  </dl><div class="impl">
+    <p>Returns a <code id="drawing-text-to-the-bitmap:textmetrics"><a href="#textmetrics">TextMetrics</a></code> object with the metrics of the given text in the current
+    font.</p>
 
-  <p>Initially, the context's path must have zero subpaths.</p>
+   </dd><dt><var>metrics</var> . <code id="dom-textmetrics-width"><a href="#dom-textmetrics-width-2">width</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxleft"><a href="#dom-textmetrics-actualboundingboxleft-2">actualBoundingBoxLeft</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxright"><a href="#dom-textmetrics-actualboundingboxright-2">actualBoundingBoxRight</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-fontboundingboxascent"><a href="#dom-textmetrics-fontboundingboxascent-2">fontBoundingBoxAscent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-fontboundingboxdescent"><a href="#dom-textmetrics-fontboundingboxdescent-2">fontBoundingBoxDescent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxascent"><a href="#dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxdescent"><a href="#dom-textmetrics-actualboundingboxdescent-2">actualBoundingBoxDescent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-emheightascent"><a href="#dom-textmetrics-emheightascent-2">emHeightAscent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-emheightdescent"><a href="#dom-textmetrics-emheightdescent-2">emHeightDescent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-hangingbaseline"><a href="#dom-textmetrics-hangingbaseline-2">hangingBaseline</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-alphabeticbaseline"><a href="#dom-textmetrics-alphabeticbaseline-2">alphabeticBaseline</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-ideographicbaseline"><a href="#dom-textmetrics-ideographicbaseline-2">ideographicBaseline</a></code></dt><dd>
 
-  <p>The points and lines added to the path by these methods must be
-  transformed according to the <a href="#transformations" title="dom-context-2d-transformation">current transformation
-  matrix</a> as they are added.</p>
+    <p>Returns the measurement described below.</p>
 
+   </dd></dl>
 
-  <p>The <dfn id="dom-context-2d-beginpath" title="dom-context-2d-beginPath"><code>beginPath()</code></dfn>
-  method must empty the list of subpaths so that the context once
-  again has zero subpaths.</p>
+  
 
+  <p>Objects that implement the <code id="drawing-text-to-the-bitmap:canvastext"><a href="#canvastext">CanvasText</a></code> interface provide the following methods for
+  rendering text.</p>
 
-  <p>The <dfn id="dom-context-2d-moveto" title="dom-context-2d-moveTo"><code>moveTo(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
-  create a new subpath with the specified point as its first (and
-  only) point.</p>
+  <p>The <dfn id="dom-context-2d-filltext-2"><code>fillText()</code></dfn> and <dfn id="dom-context-2d-stroketext-2"><code>strokeText()</code></dfn> methods take three or four arguments,
+  <var>text</var>, <var>x</var>, <var>y</var>, and optionally <var>maxWidth</var>, and render the
+  given <var>text</var> at the given (<var>x</var>, <var>y</var>) coordinates ensuring that the text
+  isn't wider than <var>maxWidth</var> if specified, using the current <code id="drawing-text-to-the-bitmap:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code>, <code id="drawing-text-to-the-bitmap:dom-context-2d-textalign-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code>, and <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> values. Specifically, when the methods
+  are invoked, the user agent must run these steps:</p>
 
-  <p>When the user agent is to <dfn id="ensure-there-is-a-subpath">ensure there is a subpath</dfn>
-  for a coordinate (<var title="">x</var>, <var title="">y</var>), the
-  user agent must check to see if the context has any subpaths, and if
-  it does not, then the user agent must create a new subpath with the
-  point (<var title="">x</var>, <var title="">y</var>) as its first
-  (and only) point, as if the <code title="dom-context-2d-moveTo"><a href="#dom-context-2d-moveto">moveTo()</a></code> method had been
-  called.</p>
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Run the <a href="#text-preparation-algorithm" id="drawing-text-to-the-bitmap:text-preparation-algorithm">text preparation algorithm</a>, passing it <var>text</var>, the object
+   implementing the <code id="drawing-text-to-the-bitmap:canvastext-2"><a href="#canvastext">CanvasText</a></code> interface, and, if the <var>maxWidth</var> argument was
+   provided, that argument. Let <var>glyphs</var> be the result.</p>
 
+   </li><li><p>Move all the shapes in <var>glyphs</var> to the right by <var>x</var>
+   <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'">CSS pixels</a> and down by <var>y</var> <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-2">CSS
+   pixels</a>.</p></li><li>
 
-  <p>The <dfn id="dom-context-2d-closepath" title="dom-context-2d-closePath"><code>closePath()</code></dfn>
-  method must do nothing if the context has no subpaths. Otherwise, it
-  must mark the last subpath as closed, create a new subpath whose
-  first point is the same as the previous subpath's first point, and
-  finally add this new subpath to the path.</p>
+    <p>Paint the shapes given in <var>glyphs</var>, as transformed by the <a href="#transformations" id="drawing-text-to-the-bitmap:transformations">current transformation matrix</a>, with each <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-3">CSS pixel</a> in the coordinate space of <var>glyphs</var> mapped to one
+    coordinate space unit.</p>
 
-  <p class="note">If the last subpath had more than one point in its
-  list of points, then this is equivalent to adding a straight line
-  connecting the last point back to the first point, thus &quot;closing&quot;
-  the shape, and then repeating the last (possibly implied) <code title="dom-context-2d-moveTo"><a href="#dom-context-2d-moveto">moveTo()</a></code> call.</p>
+    <p>For <code id="drawing-text-to-the-bitmap:dom-context-2d-filltext-2"><a href="#dom-context-2d-filltext-2">fillText()</a></code>, <code id="drawing-text-to-the-bitmap:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> must be applied to the shapes and <code id="drawing-text-to-the-bitmap:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> must be ignored. For <code id="drawing-text-to-the-bitmap:dom-context-2d-stroketext-2"><a href="#dom-context-2d-stroketext-2">strokeText()</a></code>, the reverse holds: <code id="drawing-text-to-the-bitmap:dom-context-2d-strokestyle-2-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> must be applied to the result of <a href="#trace-a-path" id="drawing-text-to-the-bitmap:trace-a-path">tracing</a> the shapes using the object implementing the
+    <code id="drawing-text-to-the-bitmap:canvastext-3"><a href="#canvastext">CanvasText</a></code> interface for the line styles, and <code id="drawing-text-to-the-bitmap:dom-context-2d-fillstyle-2-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> must be ignored.</p>
 
+    <p>These shapes are painted without affecting the current path, and are subject to <a href="#shadows" id="drawing-text-to-the-bitmap:shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-text-to-the-bitmap:dom-context-2d-globalalpha-2">global
+    alpha</a>, the <a href="#clipping-region" id="drawing-text-to-the-bitmap:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-text-to-the-bitmap:dom-context-2d-globalcompositeoperation-2">global composition operators</a>.</p>
 
-  <p>New points and the lines connecting them are added to subpaths
-  using the methods described below. In all cases, the methods only
-  modify the last subpath in the context's paths.</p>
+   </li></ol>
 
 
-  <p>The <dfn id="dom-context-2d-lineto" title="dom-context-2d-lineTo"><code>lineTo(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
-  <a href="#ensure-there-is-a-subpath">ensure there is a subpath</a> for <span title="">(<var title="">x</var>, <var title="">y</var>)</span> if the context has
-  no subpaths. Otherwise, it must connect the last point in the
-  subpath to the given point (<var title="">x</var>, <var title="">y</var>) using a straight line, and must then add the given
-  point (<var title="">x</var>, <var title="">y</var>) to the
-  subpath.</p>
 
+  <p>The <dfn id="dom-context-2d-measuretext-2"><code>measureText()</code></dfn> method takes one
+  argument, <var>text</var>. When the method is invoked, the user agent must run the
+  <a href="#text-preparation-algorithm" id="drawing-text-to-the-bitmap:text-preparation-algorithm-2">text preparation algorithm</a>, passing it <var>text</var> and the object implementing
+  the <code id="drawing-text-to-the-bitmap:canvastext-4"><a href="#canvastext">CanvasText</a></code> interface, and then using the returned <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="drawing-text-to-the-bitmap:inline-box">inline box</a> must
+  create a new <code id="drawing-text-to-the-bitmap:textmetrics-2"><a href="#textmetrics">TextMetrics</a></code> object with its attributes set as described in the following
+  list.
 
-  <p>The <dfn id="dom-context-2d-quadraticcurveto" title="dom-context-2d-quadraticCurveTo"><code>quadraticCurveTo(<var title="">cpx</var>, <var title="">cpy</var>, <var title="">x</var>,
-  <var title="">y</var>)</code></dfn> method must <a href="#ensure-there-is-a-subpath">ensure there
-  is a subpath</a> for <span title="">(<var title="">cpx</var>,
-  <var title="">cpy</var>)</span>, and then must connect the last
-  point in the subpath to the given point (<var title="">x</var>, <var title="">y</var>) using a quadratic Bézier curve with control
-  point (<var title="">cpx</var>, <var title="">cpy</var>), and must
-  then add the given point (<var title="">x</var>, <var title="">y</var>) to the subpath. <a href="#refsBEZIER">[BEZIER]</a></p>
+  If doing these measurements requires using a font that has an <a href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin" id="drawing-text-to-the-bitmap:concept-origin">origin</a> that is not the
+  <a href="https://html.spec.whatwg.org/multipage/origin.html#same-origin" id="drawing-text-to-the-bitmap:same-origin">same</a> as that of the <code id="drawing-text-to-the-bitmap:document"><a href="https://html.spec.whatwg.org/multipage/dom.html#document">Document</a></code> object that owns the
+  <code id="drawing-text-to-the-bitmap:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element (even if &quot;using a font&quot; means just checking if that font has a
+  particular glyph in it before falling back to another font), then the method, when invoked, must
+  throw a <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="drawing-text-to-the-bitmap:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="drawing-text-to-the-bitmap:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
 
+  Otherwise, it must return the new <code id="drawing-text-to-the-bitmap:textmetrics-3"><a href="#textmetrics">TextMetrics</a></code> object.
+  <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSS">[CSS]</a>
+  <a class="fingerprint" href="https://html.spec.whatwg.org/multipage/introduction.html#fingerprinting-vector" id="drawing-text-to-the-bitmap:fingerprinting-vector" title="There is a potential fingerprinting vector here."><img alt="(This is a fingerprinting vector.)" height="64" src="https://html.spec.whatwg.org/images/fingerprint.png" width="46"/></a>
+  </p>
 
-  <p>The <dfn id="dom-context-2d-beziercurveto" title="dom-context-2d-bezierCurveTo"><code>bezierCurveTo(<var title="">cp1x</var>, <var title="">cp1y</var>, <var title="">cp2x</var>, <var title="">cp2y</var>, <var title="">x</var>, <var title="">y</var>)</code></dfn> method must
-  <a href="#ensure-there-is-a-subpath">ensure there is a subpath</a> for <span title="">(<var title="">cp1x</var>, <var title="">cp1y</var>)</span>, and then must
-  connect the last point in the subpath to the given point (<var title="">x</var>, <var title="">y</var>) using a cubic Bézier
-  curve with control points (<var title="">cp1x</var>, <var title="">cp1y</var>) and (<var title="">cp2x</var>, <var title="">cp2y</var>). Then, it must add the point (<var title="">x</var>, <var title="">y</var>) to the subpath. <a href="#refsBEZIER">[BEZIER]</a></p>
+  
 
-  <hr/><p>The <dfn id="dom-context-2d-arcto" title="dom-context-2d-arcTo"><code>arcTo(<var title="">x1</var>, <var title="">y1</var>, <var title="">x2</var>,
-  <var title="">y2</var>, <var title="">radius</var>)</code></dfn>
-  method must first <a href="#ensure-there-is-a-subpath">ensure there is a subpath</a> for <span title="">(<var title="">x1</var>, <var title="">y1</var>)</span>. Then, the behavior depends on the
-  arguments and the last point in the subpath, as described below.</p>
+  <dl><dt><dfn id="dom-textmetrics-width-2"><code>width</code></dfn> attribute</dt><dd><p>The width of that <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="drawing-text-to-the-bitmap:inline-box-2">inline box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-4">CSS pixels</a>. (The
+   text's advance width.)</p></dd><dt><dfn id="dom-textmetrics-actualboundingboxleft-2"><code>actualBoundingBoxLeft</code></dfn> attribute</dt><dd>
 
-  <p>Negative values for <var title="">radius</var> must cause the
-  implementation to raise an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
-  exception.</p>
+    <p>The distance parallel to the baseline from the alignment point given by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textalign-2-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute to the left side of the bounding
+    rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-5">CSS pixels</a>; positive numbers
+    indicating a distance going left from the given alignment point.
 
-  <p>Let the point (<var title="">x0</var>, <var title="">y0</var>) be
-  the last point in the subpath.</p>
+    </p><p class="note">The sum of this value and the next (<code id="drawing-text-to-the-bitmap:dom-textmetrics-actualboundingboxright-2"><a href="#dom-textmetrics-actualboundingboxright-2">actualBoundingBoxRight</a></code>) can be wider than
+    the width of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="drawing-text-to-the-bitmap:inline-box-3">inline box</a> (<code id="drawing-text-to-the-bitmap:dom-textmetrics-width-2"><a href="#dom-textmetrics-width-2">width</a></code>), in
+    particular with slanted fonts where characters overhang their advance width.</p>
 
-  <p>If the point (<var title="">x0</var>, <var title="">y0</var>) is
-  equal to the point (<var title="">x1</var>, <var title="">y1</var>),
-  or if the point (<var title="">x1</var>, <var title="">y1</var>) is
-  equal to the point (<var title="">x2</var>, <var title="">y2</var>),
-  or if the radius <var title="">radius</var> is zero, then the method
-  must add the point (<var title="">x1</var>, <var title="">y1</var>)
-  to the subpath, and connect that point to the previous point (<var title="">x0</var>, <var title="">y0</var>) by a straight line.</p>
+   </dd><dt><dfn id="dom-textmetrics-actualboundingboxright-2"><code>actualBoundingBoxRight</code></dfn> attribute</dt><dd>
 
-  <p>Otherwise, if the points (<var title="">x0</var>, <var title="">y0</var>), (<var title="">x1</var>, <var title="">y1</var>), and (<var title="">x2</var>, <var title="">y2</var>) all lie on a single straight line, then the
-  method must add the point (<var title="">x1</var>, <var title="">y1</var>) to the subpath, and connect that point to the
-  previous point (<var title="">x0</var>, <var title="">y0</var>) by a
-  straight line.</p>
+    <p>The distance parallel to the baseline from the alignment point given by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textalign-2-3"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute to the right side of the bounding
+    rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-6">CSS pixels</a>; positive numbers
+    indicating a distance going right from the given alignment point.</p>
 
-  <p>Otherwise, let <var title="">The Arc</var> be the shortest arc
-  given by circumference of the circle that has radius <var title="">radius</var>, and that has one point tangent to the
-  half-infinite line that crosses the point (<var title="">x0</var>,
-  <var title="">y0</var>) and ends at the point (<var title="">x1</var>, <var title="">y1</var>), and that has a different
-  point tangent to the half-infinite line that ends at the point (<var title="">x1</var>, <var title="">y1</var>) and crosses the point
-  (<var title="">x2</var>, <var title="">y2</var>). The points at
-  which this circle touches these two lines are called the start and
-  end tangent points respectively. The method must connect the point
-  (<var title="">x0</var>, <var title="">y0</var>) to the start
-  tangent point by a straight line, adding the start tangent point to
-  the subpath, and then must connect the start tangent point to the
-  end tangent point by <var title="">The Arc</var>, adding the end
-  tangent point to the subpath.</p>
+   </dd><dt><dfn id="dom-textmetrics-fontboundingboxascent-2"><code>fontBoundingBoxAscent</code></dfn> attribute</dt><dd>
 
-  <hr/><p>The <dfn id="dom-context-2d-arc" title="dom-context-2d-arc"><code>arc(<var title="">x</var>, <var title="">y</var>, <var title="">radius</var>,
-  <var title="">startAngle</var>, <var title="">endAngle</var>, <var title="">anticlockwise</var>)</code></dfn> method draws an arc. If
-  the context has any subpaths, then the method must add a straight
-  line from the last point in the subpath to the start point of the
-  arc. In any case, it must draw the arc between the start point of
-  the arc and the end point of the arc, and add the start and end
-  points of the arc to the subpath. The arc and its start and end
-  points are defined as follows:</p>
+    <p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the top of the highest
+    bounding rectangle of all the fonts used to render the text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-7">CSS
+    pixels</a>; positive numbers indicating a distance going up from the given baseline.</p>
 
-  <p>Consider a circle that has its origin at (<var title="">x</var>,
-  <var title="">y</var>) and that has radius <var title="">radius</var>. The points at <var title="">startAngle</var>
-  and <var title="">endAngle</var> along this circle's circumference,
-  measured in radians clockwise from the positive x-axis, are the
-  start and end points respectively.</p>
+    <p class="note">This value and the next are useful when rendering a background that have to have
+    a consistent height even if the exact text being rendered changes. The <code id="drawing-text-to-the-bitmap:dom-textmetrics-actualboundingboxascent-2"><a href="#dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a></code> attribute (and
+    its corresponding attribute for the descent) are useful when drawing a bounding box around
+    specific text.</p>
 
-  <p>If the <var title="">anticlockwise</var> argument is omitted or
-  false and <span title=""><var title="">endAngle</var>-<var title="">startAngle</var></span> is equal to or greater than <span title="">2π</span>, or, if the <var title="">anticlockwise</var>
-  argument is <em>true</em> and <span title=""><var title="">startAngle</var>-<var title="">endAngle</var></span> is
-  equal to or greater than <span title="">2π</span>, then the arc
-  is the whole circumference of this circle.</p>
+   </dd><dt><dfn id="dom-textmetrics-fontboundingboxdescent-2"><code>fontBoundingBoxDescent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-3"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the bottom of the lowest
+   bounding rectangle of all the fonts used to render the text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-8">CSS
+   pixels</a>; positive numbers indicating a distance going down from the given
+   baseline.</p></dd><dt><dfn id="dom-textmetrics-actualboundingboxascent-2"><code>actualBoundingBoxAscent</code></dfn> attribute</dt><dd>
 
-  <p>Otherwise, the arc is the path along the circumference of this
-  circle from the start point to the end point, going anti-clockwise
-  if the <var title="">anticlockwise</var> argument is true, and
-  clockwise otherwise. Since the points are on the circle, as opposed
-  to being simply angles from zero, the arc can never cover an angle
-  greater than <span title="">2π</span> radians. If the two points are the
-  same, or if the radius is zero, then the arc is defined as being of
-  zero length in both directions.</p>
+    <p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-4"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the top of the bounding
+    rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-9">CSS pixels</a>; positive numbers
+    indicating a distance going up from the given baseline.
 
-  <p>Negative values for <var title="">radius</var> must cause the
-  implementation to raise an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
-  exception.</p>
+    </p><p class="note">This number can vary greatly based on the input text, even if the first font
+    specified covers all the characters in the input. For example, the <code id="drawing-text-to-the-bitmap:dom-textmetrics-actualboundingboxascent-2-2"><a href="#dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a></code> of a lowercase
+    &quot;o&quot; from an alphabetic baseline would be less than that of an uppercase &quot;F&quot;. The value can
+    easily be negative; for example, the distance from the top of the em box (<code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-5"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> value &quot;<code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code>&quot;) to the top of the bounding rectangle when
+    the given text is just a single comma &quot;<code>,</code>&quot; would likely (unless the font is
+    quite unusual) be negative.</p>
 
-  <hr/><p>The <dfn id="dom-context-2d-rect" title="dom-context-2d-rect"><code>rect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must create a new subpath
-  containing just the four points (<var title="">x</var>, <var title="">y</var>), (<var title="">x</var>+<var title="">w</var>,
-  <var title="">y</var>), (<var title="">x</var>+<var title="">w</var>, <var title="">y</var>+<var title="">h</var>),
-  (<var title="">x</var>, <var title="">y</var>+<var title="">h</var>), with those four points connected by straight
-  lines, and must then mark the subpath as closed. It must then create
-  a new subpath with the point (<var title="">x</var>, <var title="">y</var>) as the only point in the subpath.</p>
+   </dd><dt><dfn id="dom-textmetrics-actualboundingboxdescent-2"><code>actualBoundingBoxDescent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-6"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the bottom of the bounding
+   rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-10">CSS pixels</a>; positive numbers
+   indicating a distance going down from the given baseline.</p></dd><dt><dfn id="dom-textmetrics-emheightascent-2"><code>emHeightAscent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-7"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the highest top of the em
+   squares in the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-11">CSS pixels</a>; positive numbers
+   indicating that the given baseline is below the top of that em square (so this value will usually
+   be positive). Zero if the given baseline is the top of that em square; half the font size if the
+   given baseline is the middle of that em square.</p></dd><dt><dfn id="dom-textmetrics-emheightdescent-2"><code>emHeightDescent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-8"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the lowest bottom of the em
+   squares in the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-2">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-12">CSS pixels</a>; positive numbers
+   indicating that the given baseline is below the bottom of that em square (so this value will
+   usually be negative). (Zero if the given baseline is the bottom of that em square.)</p></dd><dt><dfn id="dom-textmetrics-hangingbaseline-2"><code>hangingBaseline</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-9"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the hanging baseline of the
+   <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-3">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-13">CSS pixels</a>; positive numbers indicating that
+   the given baseline is below the hanging baseline. (Zero if the given baseline is the hanging
+   baseline.)</p></dd><dt><dfn id="dom-textmetrics-alphabeticbaseline-2"><code>alphabeticBaseline</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-10"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the alphabetic baseline of
+   the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-4">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-14">CSS pixels</a>; positive numbers indicating
+   that the given baseline is below the alphabetic baseline. (Zero if the given baseline is the
+   alphabetic baseline.)</p></dd><dt><dfn id="dom-textmetrics-ideographicbaseline-2"><code>ideographicBaseline</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-11"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the ideographic baseline of
+   the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-5">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-15">CSS pixels</a>; positive numbers indicating
+   that the given baseline is below the ideographic baseline. (Zero if the given baseline is the
+   ideographic baseline.)</p></dd></dl>
 
+  <p class="note">Glyphs rendered using <code id="drawing-text-to-the-bitmap:dom-context-2d-filltext-2-2"><a href="#dom-context-2d-filltext-2">fillText()</a></code> and
+  <code id="drawing-text-to-the-bitmap:dom-context-2d-stroketext-2-2"><a href="#dom-context-2d-stroketext-2">strokeText()</a></code> can spill out of the box given by the
+  font size (the em square size) and the width returned by <code id="drawing-text-to-the-bitmap:dom-context-2d-measuretext-2"><a href="#dom-context-2d-measuretext-2">measureText()</a></code> (the text width). Authors are encouraged
+  to use the bounding box values described above if this is an issue.</p>
 
-  <!-- v6 feature request:
-        * points as a primitive shape
-          http://home.comcast.net/~urbanjost/canvas/vogle4.html
-  -->
+  <p class="note">A future version of the 2D context API might provide a way to render fragments of
+  documents, rendered using CSS, straight to the canvas. This would be provided in preference to a
+  dedicated way of doing multiline layout.</p>
 
 
-  <p>The <dfn id="dom-context-2d-fill" title="dom-context-2d-fill"><code>fill()</code></dfn>
-  method must fill all the subpaths of the current path, using
-  <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code>, and using
-  the non-zero winding number rule. Open subpaths must be implicitly
-  closed when being filled (without affecting the actual
-  subpaths).</p>
 
-  <p class="note">Thus, if two overlapping but otherwise independent
-  subpaths have opposite windings, they cancel out and result in no
-  fill. If they have the same winding, that area just gets painted
-  once.</p>
+  <h6 id="drawing-paths-to-the-canvas"><span class="secno">4.12.5.1.12</span> Drawing paths to the canvas<a class="self-link" href="#drawing-paths-to-the-canvas"/></h6>
 
-  <p>The <dfn id="dom-context-2d-stroke" title="dom-context-2d-stroke"><code>stroke()</code></dfn> method
-  must calculate the strokes of all the subpaths of the current path,
-  using the <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code>,
-  <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code>, <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code>, and (if
-  appropriate) <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> attributes, and
-  then fill the combined stroke area using the <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code>
-  attribute.</p>
+  <p>Objects that implement the <code id="drawing-paths-to-the-canvas:canvasdrawpath"><a href="#canvasdrawpath">CanvasDrawPath</a></code> interface have a <dfn id="current-default-path">current default
+  path</dfn>. There is only one <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path">current default path</a>, it is not part of the
+  <a href="#drawing-state" id="drawing-paths-to-the-canvas:drawing-state">drawing state</a>. The <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-2">current default path</a> is a <a href="#concept-path" id="drawing-paths-to-the-canvas:concept-path">path</a>, as described above.</p>
 
-  <p class="note">Since the subpaths are all stroked as one,
-  overlapping parts of the paths in one stroke operation are treated
-  as if their union was what was painted.</p>
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-beginpath"><a href="#dom-context-2d-beginpath-2">beginPath</a></code>()</dt><dd>
 
-  <p>Paths, when filled or stroked, must be painted without affecting
-  the current path, and must be subject to <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
-  operators</a>. (Transformations affect the path when the path is
-  created, not when it is painted, though the stroke <em>style</em> is
-  still affected by the transformation during painting.)</p>
+    <p>Resets the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-3">current default path</a>.</p>
 
-  <p>Zero-length line segments must be pruned before stroking a
-  path. Empty subpaths must be ignored.</p>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-fill"><a href="#dom-context-2d-fill-2">fill</a></code>( [ <var>fillRule</var> ] )</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-fill-2"><a href="#dom-context-2d-fill-2">fill</a></code>(<var>path</var> [, <var>fillRule</var> ] )</dt><dd>
 
-  <hr/><p id="dom-context-2d-drawosfocusring">The <dfn id="dom-context-2d-drawsystemfocusring" title="dom-context-2d-drawSystemFocusRing"><code>drawSystemFocusRing(<var title="">element</var>)</code></dfn> method, when invoked, must run
-  the following steps:</p>
+    <p>Fills the subpaths of the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-4">current default path</a> or the given path with the
+    current fill style, obeying the given fill rule.</p>
 
-  <ol><li><p>If <var title="">element</var> is not focused or is not a
-   descendant of the element with whose context the method is
-   associated, then abort these steps.</p></li>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-stroke"><a href="#dom-context-2d-stroke-2">stroke</a></code>()</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-stroke-2"><a href="#dom-context-2d-stroke-2">stroke</a></code>(<var>path</var>)</dt><dd>
 
-   <li>
+    <p>Strokes the subpaths of the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-5">current default path</a> or the given path with the
+    current stroke style.</p>
 
-    <p>If the user has requested the use of particular focus rings
-    (e.g. high-contrast focus rings), or if the <var title="">element</var> would have a focus ring drawn around it,
-    then draw a focus ring of the appropriate style along the path,
-    following platform conventions, and abort these steps.</p>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-clip"><a href="#dom-context-2d-clip-2">clip</a></code>( [ <var>fillRule</var> ] )</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-clip-2"><a href="#dom-context-2d-clip-2">clip</a></code>(<var>path</var> [, <var>fillRule</var> ] )</dt><dd>
 
-    <p class="note">Some platforms only draw focus rings around
-    elements that have been focused from the keyboard, and not those
-    focused from the mouse. Other platforms simply don't draw focus
-    rings around some elements at all unless relevant accessibility
-    features are enabled. This API is intended to follow these
-    conventions. User agents that implement distinctions based on the
-    manner in which the element was focused are encouraged to classify
-    focus driven by the <code title="dom-focus"><a href="#dom-focus">focus()</a></code> method
-    based on the kind of user interaction event from which the call
-    was triggered (if any).</p>
+    <p>Further constrains the clipping region to the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-6">current default path</a> or the given
+    path, using the given fill rule to determine what points are in the path.</p>
 
-    <p>The focus ring should not be subject to the <a href="#shadows" title="shadows">shadow effects</a>, the <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, or the <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
-    operators</a>, but <em>should</em> be subject to the <a href="#clipping-region" title="clipping region">clipping region</a>.</p>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-resetclip"><a href="#dom-context-2d-resetclip-2">resetClip</a></code>()</dt><dd>
 
-   </li>
+    <p>Unconstrains the clipping region.</p>
 
-   <li>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-ispointinpath"><a href="#dom-context-2d-ispointinpath-2">isPointInPath</a></code>(<var>x</var>, <var>y</var> [, <var>fillRule</var> ] )</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-ispointinpath-2"><a href="#dom-context-2d-ispointinpath-2">isPointInPath</a></code>(<var>path</var>, <var>x</var>, <var>y</var> [, <var>fillRule</var> ] )</dt><dd>
 
-    <p>Optionally, <a href="#inform">inform the user</a> that the
-    focus is at the location given by the path. User agents may wait
-    until the next time the <a href="#event-loop">event loop</a> reaches its
-    &quot;update the rendering&quot; step to optionally inform the user.</p>
+    <p>Returns true if the given point is in the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-7">current default path</a> or the given
+    path, using the given fill rule to determine what points are in the path.</p>
 
-   </li>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-ispointinstroke"><a href="#dom-context-2d-ispointinstroke-2">isPointInStroke</a></code>(<var>x</var>, <var>y</var>)</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-ispointinstroke-2"><a href="#dom-context-2d-ispointinstroke-2">isPointInStroke</a></code>(<var>path</var>, <var>x</var>, <var>y</var>)</dt><dd>
 
-  </ol><p>The <dfn id="dom-context-2d-drawcustomfocusring" title="dom-context-2d-drawCustomFocusRing"><code>drawCustomFocusRing(<var title="">element</var>)</code></dfn> method, when invoked, must run
-  the following steps:</p>
+    <p>Returns true if the given point would be in the region covered by the stroke of the
+    <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-8">current default path</a> or the given path, given the current stroke style.</p>
 
-  <ol><li><p>If <var title="">element</var> is not focused or is not a
-   descendant of the element with whose context the method is
-   associated, then return false and abort these steps.</p></li>
+   </dd></dl><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="bugs"><strong>Spec bugs:</strong> <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=28217" title="&lt;canvas&gt;: not clear if two polygon paths with a common edge should have no line visible">28217</a></p></div>
 
-   <li>
+  
 
-    <p>If the user has requested the use of particular focus rings
-    (e.g. high-contrast focus rings), then draw a focus ring of the
-    appropriate style along the path, return false, and abort these
-    steps.</p>
+  <p>The <dfn id="dom-context-2d-beginpath-2"><code>beginPath()</code></dfn> method, when invoked,
+  must empty the list of subpaths in the context's <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-9">current default path</a> so that the it
+  once again has zero subpaths.</p>
 
-    <p>The focus ring should not be subject to the <a href="#shadows" title="shadows">shadow effects</a>, the <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, or the <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
-    operators</a>, but <em>should</em> be subject to the <a href="#clipping-region" title="clipping region">clipping region</a>.</p>
+  <p>Where the following method definitions use the term <i>intended path</i>, it means the
+  <code id="drawing-paths-to-the-canvas:path2d"><a href="#path2d">Path2D</a></code> argument, if one was provided, or the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-10">current default path</a>
+  otherwise.</p>
 
-   </li>
+  <p>When the intended path is a <code id="drawing-paths-to-the-canvas:path2d-2"><a href="#path2d">Path2D</a></code> object, the coordinates and lines of its
+  subpaths must be transformed according to the <a href="#transformations" id="drawing-paths-to-the-canvas:transformations">
+  current transformation matrix</a> on the object implementing the
+  <code id="drawing-paths-to-the-canvas:canvastransform"><a href="#canvastransform">CanvasTransform</a></code> interface when used by these methods (without affecting the
+  <code id="drawing-paths-to-the-canvas:path2d-3"><a href="#path2d">Path2D</a></code> object itself). When the intended path is the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-11">current default
+  path</a>, it is not affected by the transform. (This is because transformations already affect
+  the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-12">current default path</a> when it is constructed, so applying it when it is painted as
+  well would result in a double transformation.)</p>
 
-   <li>
+  <p>The <dfn id="dom-context-2d-fill-2"><code>fill()</code></dfn> method, when invoked, must fill
+  all the subpaths of the intended path, using <code id="drawing-paths-to-the-canvas:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code>, and using the <a href="#fill-rule" id="drawing-paths-to-the-canvas:fill-rule">fill rule</a> indicated
+  by the <var>fillRule</var> argument. Open subpaths must be implicitly closed when being filled
+  (without affecting the actual subpaths).</p>
 
-    <p>Optionally, <a href="#inform">inform the user</a> that the
-    focus is at the location given by the path. User agents may wait
-    until the next time the <a href="#event-loop">event loop</a> reaches its
-    &quot;update the rendering&quot; step to optionally inform the user.</p>
+  <p>The <dfn id="dom-context-2d-stroke-2"><code>stroke()</code></dfn> method, when invoked, must
+  <a href="#trace-a-path" id="drawing-paths-to-the-canvas:trace-a-path">trace</a> the intended path, using this
+  <code id="drawing-paths-to-the-canvas:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> object for the line styles, and then fill the resulting path
+  using the <code id="drawing-paths-to-the-canvas:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> attribute, using the <a href="#dom-context-2d-fillrule-nonzero" id="drawing-paths-to-the-canvas:dom-context-2d-fillrule-nonzero">non-zero winding rule</a>.</p>
 
-   </li>
+  <p class="note">As a result of how the algorithm to <a href="#trace-a-path" id="drawing-paths-to-the-canvas:trace-a-path-2">trace a path</a> is defined,
+  overlapping parts of the paths in one stroke operation are treated as if their union was what was
+  painted.</p>
 
-   <li><p>Return true.</p></li>
+  <p class="note">The stroke <em>style</em> is affected by the transformation during painting, even
+  if the intended path is the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-13">current default path</a>.</p>
 
-  </ol><p>The <dfn id="dom-context-2d-scrollpathintoview" title="dom-context-2d-scrollPathIntoView"><code>scrollPathIntoView()</code></dfn>
-  method, when invoked, must run the following steps:</p>
+  <p>Paths, when filled or stroked, must be painted without affecting the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-14">current default
+  path</a> or any <code id="drawing-paths-to-the-canvas:path2d-4"><a href="#path2d">Path2D</a></code> objects, and must be subject to <a href="#shadows" id="drawing-paths-to-the-canvas:shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-paths-to-the-canvas:dom-context-2d-globalalpha-2">global
+  alpha</a>, the <a href="#clipping-region" id="drawing-paths-to-the-canvas:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-paths-to-the-canvas:dom-context-2d-globalcompositeoperation-2">global composition operators</a>. (The effect
+  of transformations is described above and varies based on which path is being used.)</p>
 
-  <ol><li><p>Let <var title="">notional child</var> be a hypothetical
-   element that is a rendered child of the <code><a href="#the-canvas-element">canvas</a></code> element
-   whose dimensions are exactly the rectangle of the bounding box of
-   the current path.</p></li>
+  <hr/>
 
-   <li><p><span title="scroll an element into view">Scroll <var title="">notional child</var> into view</span> with the <var title="">align to top flag</var> set.</p>
+  <p>The <dfn id="dom-context-2d-clip-2"><code>clip()</code></dfn> method, when invoked, must
+  create a new <dfn id="clipping-region">clipping region</dfn> by calculating the intersection of the current clipping
+  region and the area described by the intended path, using the <a href="#fill-rule" id="drawing-paths-to-the-canvas:fill-rule-2">fill rule</a> indicated by
+  the <var>fillRule</var> argument. Open subpaths must be implicitly closed when computing the
+  clipping region, without affecting the actual subpaths. The new clipping region replaces the
+  current clipping region.</p>
 
-   </li><li><p>Optionally, <a href="#inform">inform the user</a> that the
-   caret and/or selection cover <var title="">the specified
-   rectangle</var> of the canvas. User agents may wait until the next
-   time the <a href="#event-loop">event loop</a> reaches its &quot;update the rendering&quot;
-   step to optionally inform the user.</p></li>
+  <p>When the context is initialized, the clipping region must be set to the largest infinite
+  surface (i.e. by default, no clipping occurs).</p>
 
-  </ol><p class="note" id="inform">&quot;Inform the user&quot;, as used in this
-  section, could mean calling a system accessibility API, which would
-  notify assistive technologies such as magnification tools. To
-  properly drive magnification based on a focus change, a system
-  accessibility API driving a screen magnifier needs the bounds for
-  the newly focused object. The methods above are intended to enable
-  this by allowing the user agent to report the bounding box of the
-  path used to render the focus ring as the bounds of the <var title="">element</var> element passed as an argument, if that
-  element is focused, and the bounding box of the area to which the
-  user agent is scrolling as the bounding box of the current
-  selection.</p>
+  
 
-  <hr/><p>The <dfn id="dom-context-2d-clip" title="dom-context-2d-clip"><code>clip()</code></dfn>
-  method must create a new <dfn id="clipping-region">clipping region</dfn> by calculating
-  the intersection of the current clipping region and the area
-  described by the current path, using the non-zero winding number
-  rule. Open subpaths must be implicitly closed when computing the
-  clipping region, without affecting the actual subpaths. The new
+  <p>The <dfn id="dom-context-2d-resetclip-2"><code>resetClip()</code></dfn> method, when invoked,
+  must create a new <a href="#clipping-region" id="drawing-paths-to-the-canvas:clipping-region-2">clipping region</a> that is the largest infinite surface. The new
   clipping region replaces the current clipping region.</p>
 
-  <p>When the context is initialized, the clipping region must be set
-  to the rectangle with the top left corner at (0,0) and the width and
-  height of the coordinate space.</p>
+  <hr/>
 
-  <!-- v6
-   Jordan OSETE suggests:
-    * support ways of extending the clipping region (union instead of intersection)
-       - also "add", "subtract", "replace", "intersect" and "xor"
-    * support ways of resetting the clipping region without save/restore
-  -->
+  <p>The <dfn id="dom-context-2d-ispointinpath-2"><code>isPointInPath()</code></dfn> method, when
+  invoked, must return true if the point given by the <var>x</var> and <var>y</var> coordinates
+  passed to the method, when treated as coordinates in the canvas coordinate space unaffected by the
+  current transformation, is inside the intended path as determined by the <a href="#fill-rule" id="drawing-paths-to-the-canvas:fill-rule-3">fill rule</a>
+  indicated by the <var>fillRule</var> argument; and must return false otherwise. Open subpaths must
+  be implicitly closed when computing the area inside the path, without affecting the actual
+  subpaths. Points on the path itself must be considered to be inside the path. If either of the
+  arguments are infinite or NaN, then the method must return false.</p>
 
-  <hr/><p>The <dfn id="dom-context-2d-ispointinpath" title="dom-context-2d-isPointInPath"><code>isPointInPath(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
-  return true if the point given by the <var title="">x</var> and <var title="">y</var> coordinates passed to the method, when treated as
-  coordinates in the canvas coordinate space unaffected by the current
-  transformation, is inside the current path as determined by the
-  non-zero winding number rule; and must return false
-  otherwise. Points on the path itself are considered to be inside the
-  path. If either of the arguments is infinite or NaN, then the method
-  must return false.</p>
+  <hr/>
 
-  </div>
+  <p>The <dfn id="dom-context-2d-ispointinstroke-2"><code>isPointInStroke()</code></dfn> method,
+  when invoked, must return true if the point given by the <var>x</var> and <var>y</var> coordinates
+  passed to the method, when treated as coordinates in the canvas coordinate space unaffected by the
+  current transformation, is inside the path that results from <a href="#trace-a-path" id="drawing-paths-to-the-canvas:trace-a-path-3">tracing</a> the intended path, using the <a href="#dom-context-2d-fillrule-nonzero" id="drawing-paths-to-the-canvas:dom-context-2d-fillrule-nonzero-2">non-zero winding rule</a>, and using the
+  <code id="drawing-paths-to-the-canvas:canvaspathdrawingstyles-2"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface for the line styles; and must return false
+  otherwise. Points on the resulting path must be considered to be inside the path. If either of the
+  arguments are infinite or NaN, then the method must return false.</p>
 
+  <hr/>
+
+  
 
   <div class="example" id="drawCustomFocusRingExample">
 
-   <p>This <code><a href="#the-canvas-element">canvas</a></code> element has a couple of checkboxes. The
-   path-related commands are highlighted:</p>
+   <p>This <code id="drawing-paths-to-the-canvas:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element has a couple of checkboxes. The path-related commands are
+   highlighted:</p>
 
    <pre>&lt;canvas height=400 width=750&gt;
  &lt;label&gt;&lt;input type=checkbox id=showA&gt; Show As&lt;/label&gt;
@@ -2356,11 +2796,9 @@
    }
 <strong>   context.beginPath();
    context.rect(x-7, y-7, 12 + metrics.width+2, 14);
-   if (paint &amp;&amp; context.drawCustomFocusRing(element)) {
-     context.strokeStyle = 'silver';
-     context.stroke();
-   }
-</strong>   context.restore();
+</strong>
+   context.drawFocusIfNeeded(element);
+   context.restore();
  }
  function drawBase() { /* ... */ }
  function drawAs() { /* ... */ }
@@ -2382,6 +2820,7 @@
    var context = canvas.getContext('2d');
    var x = event.clientX;
    var y = event.clientY;
+   var node = event.target;
    while (node) {
      x -= node.offsetLeft - node.scrollLeft;
      y -= node.offsetTop - node.scrollTop;
@@ -2401,929 +2840,460 @@
  document.getElementsByTagName('canvas')[0].addEventListener('click', processClick, false);
  redraw();
 &lt;/script&gt;</pre>
-<!-- http://software.hixie.ch/utilities/js/live-dom-viewer/saved/340 -->
+
 
   </div>
 
+  <h6 id="drawing-focus-rings-and-scrolling-paths-into-view"><span class="secno">4.12.5.1.13</span> Drawing focus rings and scrolling paths into view<a class="self-link" href="#drawing-focus-rings-and-scrolling-paths-into-view"/></h6>
 
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-drawfocusifneeded"><a href="#dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded</a></code>(<var>element</var>)</dt><dt><var>context</var> . <code id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-drawfocusifneeded-2"><a href="#dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded</a></code>(<var>path</var>, <var>element</var>)</dt><dd>
 
+    <p>If the given element is <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="drawing-focus-rings-and-scrolling-paths-into-view:focused">focused</a>, draws a focus ring around the <a href="#current-default-path" id="drawing-focus-rings-and-scrolling-paths-into-view:current-default-path">current
+    default path</a> or the given path, following the platform conventions for focus rings.</p>
 
-  <h6 id="text-0"><span class="secno">4.8.11.1.9 </span>Text</h6> <!-- a v3 feature -->
+   </dd><dt><var>context</var> . <code id="dom-context-2d-scrollpathintoview"><a href="#dom-context-2d-scrollpathintoview-2">scrollPathIntoView</a></code>()</dt><dt><var>context</var> . <code id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-scrollpathintoview-2"><a href="#dom-context-2d-scrollpathintoview-2">scrollPathIntoView</a></code>(<var>path</var>)</dt><dd>
 
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code> [ = <var title="">value</var> ]</dt>
+    <p>Scrolls the <a href="#current-default-path" id="drawing-focus-rings-and-scrolling-paths-into-view:current-default-path-2">current default path</a> or the given path into view. This is especially
+    useful on devices with small screens, where the whole canvas might not be visible at once.</p>
 
-   <dd>
+   </dd></dl>
 
-    <p>Returns the current font settings.</p>
+  
 
-    <p>Can be set, to change the font. The syntax is the same as for
-    the CSS 'font' property; values that cannot be parsed as CSS font
-    values are ignored.</p>
+  Objects that implement the <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvasuserinterface"><a href="#canvasuserinterface">CanvasUserInterface</a></code> interface provide the following
+  methods to control drawing focus rings and scrolling paths into view.
 
-    <p>Relative keywords and lengths are computed relative to the font
-    of the <code><a href="#the-canvas-element">canvas</a></code> element.</p>
+  <hr/>
 
-   </dd>
+  <p id="dom-context-2d-drawosfocusring">The <dfn id="dom-context-2d-drawfocusifneeded-2"><code>drawFocusIfNeeded(<var>element</var>)</code></dfn>
+  method, when invoked, must run these steps:</p>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> [ = <var title="">value</var> ]</dt>
+  <ol><li><p>If <var>element</var> is not <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="drawing-focus-rings-and-scrolling-paths-into-view:focused-2">focused</a> or is not a descendant of the element with
+   whose context the method is associated, then abort these steps.</p></li><li>
 
-   <dd>
+    <p>Draw a focus ring of the appropriate style along the intended path, following platform
+    conventions.</p>
 
-    <p>Returns the current text alignment settings.</p>
+    <p class="note">Some platforms only draw focus rings around elements that have been focused from
+    the keyboard, and not those focused from the mouse. Other platforms simply don't draw focus
+    rings around some elements at all unless relevant accessibility features are enabled. This API
+    is intended to follow these conventions. User agents that implement distinctions based on the
+    manner in which the element was focused are encouraged to classify focus driven by the <code id="drawing-focus-rings-and-scrolling-paths-into-view:dom-focus-2"><a href="https://html.spec.whatwg.org/multipage/interaction.html#dom-focus-2">focus()</a></code> method based on the kind of user interaction event from which
+    the call was triggered (if any).</p>
 
-    <p>Can be set, to change the alignment. The possible values are
-    <code title="">start</code>, <code title="">end</code>, <code title="">left</code>, <code title="">right</code>, and <code title="">center</code>. Other values are ignored. The default is
-    <code title="">start</code>.</p>
+    <p>The focus ring should not be subject to the <a href="#shadows" id="drawing-focus-rings-and-scrolling-paths-into-view:shadows">shadow effects</a>, the
+    <a href="#dom-context-2d-globalalpha-2" id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-globalalpha-2">global alpha</a>, the <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-globalcompositeoperation-2">global composition operators</a>, or any of
+    the members in the <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvasfillstrokestyles"><a href="#canvasfillstrokestyles">CanvasFillStrokeStyles</a></code>, <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code>,
+    <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvastextdrawingstyles"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interfaces, but <em>should</em> be subject to the
+    <a href="#clipping-region" id="drawing-focus-rings-and-scrolling-paths-into-view:clipping-region">clipping region</a>. (The effect of transformations is described above and varies based
+    on which path is being used.)</p>
 
-   </dd>
+   </li><li><p><a href="#inform">Inform the user</a> that the focus is at the location given by the
+   intended path. User agents may wait until the next time the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="drawing-focus-rings-and-scrolling-paths-into-view:event-loop">event loop</a> reaches its
+   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering" id="drawing-focus-rings-and-scrolling-paths-into-view:update-the-rendering">update the rendering</a> step to optionally inform the user.</p></li></ol>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> [ = <var title="">value</var> ]</dt>
+  <p>User agents should not implicitly close open subpaths in the intended path when drawing the
+  focus ring.</p>
 
-   <dd>
+  <p class="note">This might be a moot point, however. For example, if the focus ring is drawn as an
+  axis-aligned bounding rectangle around the points in the intended path, then whether the subpaths
+  are closed or not has no effect. This specification intentionally does not specify precisely how
+  focus rings are to be drawn: user agents are expected to honor their platform's native
+  conventions.</p>
 
-    <p>Returns the current baseline alignment settings.</p>
+  <hr/>
 
-    <p>Can be set, to change the baseline alignment. The possible
-    values and their meanings are given below. Other values are
-    ignored. The default is <code title="">alphabetic</code>.</p>
+  <p>The <dfn id="dom-context-2d-scrollpathintoview-2"><code>scrollPathIntoView()</code></dfn>
+  method, when invoked, must run these steps:</p>
 
-   </dd>
+  <ol><li><p>Let <var>the specified rectangle</var> be the rectangle of the bounding box of
+   the intended path.</p></li><li><p>Let <var>notional child</var> be a hypothetical element that is a rendered child
+   of the <code id="drawing-focus-rings-and-scrolling-paths-into-view:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element whose dimensions are those of <var>the specified
+   rectangle</var>.</p></li><li><p><a data-x-internal="scroll-an-element-into-view" href="https://drafts.csswg.org/cssom-view/#scroll-an-element-into-view" id="drawing-focus-rings-and-scrolling-paths-into-view:scroll-an-element-into-view">Scroll <var>notional child</var> into
+   view</a> with the <var>align to top flag</var> set.</p>
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText</a></code>(<var title="">text</var>, <var title="">x</var>, <var title="">y</var> [, <var title="">maxWidth</var> ] )</dt>
-   <dt><var title="">context</var> . <code title="dom-context-2d-strokeText"><a href="#dom-context-2d-stroketext">strokeText</a></code>(<var title="">text</var>, <var title="">x</var>, <var title="">y</var> [, <var title="">maxWidth</var> ] )</dt>
+   </li><li><p>Optionally, <a href="#inform">inform the user</a> that the caret or selection (or both)
+   cover <var>the specified rectangle</var> of the canvas. The user agent may wait until the next
+   time the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="drawing-focus-rings-and-scrolling-paths-into-view:event-loop-2">event loop</a> reaches its <a href="https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering" id="drawing-focus-rings-and-scrolling-paths-into-view:update-the-rendering-2">update the rendering</a> step to
+   optionally inform the user.</p></li></ol>
 
-   <dd>
+  <p id="inform">&quot;Inform the user&quot;, as used in this section, does not imply any persistent state
+  change. It could mean, for instance, calling a system accessibility API to notify assistive
+  technologies such as magnification tools so that the user's magnifier moves to the given area of
+  the canvas. However, it does not associate the path with the element, or provide a region for
+  tactile feedback, etc.</p>
 
-    <p>Fills or strokes (respectively) the given text at the given
-    position. If a maximum width is provided, the text will be scaled
-    to fit that width if necessary.</p>
+  
 
-   </dd>
+  <h6 id="drawing-images"><span class="secno">4.12.5.1.14</span> Drawing images<a class="self-link" href="#drawing-images"/></h6>
 
-   <dt><var title="">metrics</var> = <var title="">context</var> . <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText</a></code>(<var title="">text</var>)</dt>
+  <p>Objects that implement the <code id="drawing-images:canvasdrawimage"><a href="#canvasdrawimage">CanvasDrawImage</a></code> interface have the <dfn id="dom-context-2d-drawimage"><code>drawImage</code></dfn> method to draw images.</p>
 
-   <dd>
-
-    <p>Returns a <code><a href="#textmetrics">TextMetrics</a></code> object with the metrics of the given text in the current font.</p>
-
-   </dd>
-
-   <dt><var title="">metrics</var> . <code title="dom-textmetrics-width"><a href="#dom-textmetrics-width">width</a></code></dt>
-
-   <dd>
-
-    <p>Returns the advance width of the text that was passed to the
-    <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code>
-    method.</p>
-
-   </dd>
-
-  </dl><div class="impl">
-
-  <p>The <dfn id="dom-context-2d-font" title="dom-context-2d-font"><code>font</code></dfn> IDL
-  attribute, on setting, must be parsed the same way as the 'font'
-  property of CSS (but without supporting property-independent style
-  sheet syntax like 'inherit'), and the resulting font must be
-  assigned to the context, with the 'line-height' component forced to
-  'normal', with the 'font-size' component converted to CSS pixels,
-  and with system fonts being computed to explicit values. If the new
-  value is syntactically incorrect (including using
-  property-independent style sheet syntax like 'inherit' or
-  'initial'), then it must be ignored, without assigning a new font
-  value. <a href="#refsCSS">[CSS]</a></p>
-
-  <p>Font names must be interpreted in the context of the
-  <code><a href="#the-canvas-element">canvas</a></code> element's stylesheets; any fonts embedded using
-  <code title="">@font-face</code> must therefore be available once
-  they are loaded. (If a font is referenced before it is fully loaded,
-  then it must be treated as if it was an unknown font, falling back
-  to another as described by the relevant CSS specifications.) <a href="#refsCSSFONTS">[CSSFONTS]</a></p>
-
-  <p>Only vector fonts should be used by the user agent; if a user
-  agent were to use bitmap fonts then transformations would likely
-  make the font look very ugly.</p>
-
-  <p>On getting, the <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code>
-  attribute must return the <span title="serializing a CSS
-  value">serialized form</span> of the current font of the context
-  (with no 'line-height' component). <a href="#refsCSSOM">[CSSOM]</a></p>
-
-  <div class="example">
-
-   <p>For example, after the following statement:</p>
-
-   <pre>context.font = 'italic 400 12px/2 Unknown Font, sans-serif';</pre>
-
-   <p>...the expression <code title="">context.font</code> would
-   evaluate to the string &quot;<code title="">italic 12px &quot;Unknown Font&quot;, sans-serif</code>&quot;. The
-   &quot;400&quot; font-weight doesn't appear because that is the default
-   value. The line-height doesn't appear because it is forced to
-   &quot;normal&quot;, the default value.</p>
-
-  </div>
-
-  <p>When the context is created, the font of the context must be set
-  to 10px sans-serif. When the 'font-size' component is set to lengths
-  using percentages, 'em' or 'ex' units, or the 'larger' or 'smaller'
-  keywords, these must be interpreted relative to the computed value
-  of the 'font-size' property of the corresponding <code><a href="#the-canvas-element">canvas</a></code>
-  element at the time that the attribute is set. When the
-  'font-weight' component is set to the relative values 'bolder' and
-  'lighter', these must be interpreted relative to the computed value
-  of the 'font-weight' property of the corresponding
-  <code><a href="#the-canvas-element">canvas</a></code> element at the time that the attribute is
-  set. If the computed values are undefined for a particular case
-  (e.g. because the <code><a href="#the-canvas-element">canvas</a></code> element is not <a href="#in-a-document">in a
-  <code>Document</code></a>), then the relative keywords must be
-  interpreted relative to the normal-weight 10px sans-serif
-  default.</p>
-
-  <p>The <dfn id="dom-context-2d-textalign" title="dom-context-2d-textAlign"><code>textAlign</code></dfn> IDL
-  attribute, on getting, must return the current value. On setting, if
-  the value is one of <code title="">start</code>, <code title="">end</code>, <code title="">left</code>, <code title="">right</code>, or <code title="">center</code>, then the
-  value must be changed to the new value. Otherwise, the new value
-  must be ignored. When the context is created, the <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> attribute must
-  initially have the value <code title="">start</code>.</p>
-
-  <p>The <dfn id="dom-context-2d-textbaseline" title="dom-context-2d-textBaseline"><code>textBaseline</code></dfn>
-  IDL attribute, on getting, must return the current value. On
-  setting, if the value is one of <code title="dom-context-2d-textBaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code>, <code title="dom-context-2d-textBaseline-hanging"><a href="#dom-context-2d-textbaseline-hanging">hanging</a></code>, <code title="dom-context-2d-textBaseline-middle"><a href="#dom-context-2d-textbaseline-middle">middle</a></code>, <code title="dom-context-2d-textBaseline-alphabetic"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code>,
-  <code title="dom-context-2d-textBaseline-ideographic"><a href="#dom-context-2d-textbaseline-ideographic">ideographic</a></code>,
-  or <code title="dom-context-2d-textBaseline-bottom"><a href="#dom-context-2d-textbaseline-bottom">bottom</a></code>,
-  then the value must be changed to the new value. Otherwise, the new
-  value must be ignored. When the context is created, the <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> attribute
-  must initially have the value <code title="">alphabetic</code>.</p>
-
-  </div>
-
-  <p>The <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code>
-  attribute's allowed keywords correspond to alignment points in the
-  font:</p>
-
-  <p><img alt="The top of the em square is roughly at the top of the glyphs in a font, the hanging baseline is where some glyphs like आ are anchored, the middle is half-way between the top of the em square and the bottom of the em square, the alphabetic baseline is where characters like Á, ÿ, f, and Ω are anchored, the ideographic baseline is where glyphs like 私 and 達 are anchored, and the bottom of the em square is roughly at the bottom of the glyphs in a font. The top and bottom of the bounding box can be far from these baselines, due to glyphs extending far outside the em square." height="300" src="http://www.whatwg.org/specs/web-apps/current-work/http://images.whatwg.org/baselines.png" width="738"/></p>
-
-  <p>The keywords map to these alignment points as follows:</p>
-
-  <dl><dt><dfn id="dom-context-2d-textbaseline-top" title="dom-context-2d-textBaseline-top"><code>top</code></dfn>
-   </dt><dd>The top of the em square</dd>
-
-   <dt><dfn id="dom-context-2d-textbaseline-hanging" title="dom-context-2d-textBaseline-hanging"><code>hanging</code></dfn>
-   </dt><dd>The hanging baseline</dd>
-
-   <dt><dfn id="dom-context-2d-textbaseline-middle" title="dom-context-2d-textBaseline-middle"><code>middle</code></dfn>
-   </dt><dd>The middle of the em square</dd>
-
-   <dt><dfn id="dom-context-2d-textbaseline-alphabetic" title="dom-context-2d-textBaseline-alphabetic"><code>alphabetic</code></dfn>
-   </dt><dd>The alphabetic baseline</dd>
-
-   <dt><dfn id="dom-context-2d-textbaseline-ideographic" title="dom-context-2d-textBaseline-ideographic"><code>ideographic</code></dfn>
-   </dt><dd>The ideographic baseline</dd>
-
-   <dt><dfn id="dom-context-2d-textbaseline-bottom" title="dom-context-2d-textBaseline-bottom"><code>bottom</code></dfn>
-   </dt><dd>The bottom of the em square</dd>
-
-  </dl><div class="impl">
-
-  <p>The <dfn id="dom-context-2d-filltext" title="dom-context-2d-fillText"><code>fillText()</code></dfn> and
-  <dfn id="dom-context-2d-stroketext" title="dom-context-2d-strokeText"><code>strokeText()</code></dfn>
-  methods take three or four arguments, <var title="">text</var>, <var title="">x</var>, <var title="">y</var>, and optionally <var title="">maxWidth</var>, and render the given <var title="">text</var> at the given (<var title="">x</var>, <var title="">y</var>) coordinates ensuring that the text isn't wider
-  than <var title="">maxWidth</var> if specified, using the current
-  <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code>, <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code>, and <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code>
-  values. Specifically, when the methods are called, the user agent
-  must run the following steps:</p>
-
-  <ol><li><p>If <var title="">maxWidth</var> is present but less than or
-   equal to zero, return without doing anything; abort these
-   steps.</p></li>
-
-   <li><p>Let <var title="">font</var> be the current font of the
-   context, as given by the <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code> attribute.</p></li>
-
-   <li><p>Replace all the <a href="#space-character" title="space character">space
-   characters</a> in <var title="">text</var> with U+0020 SPACE
-   characters.</p></li>
-
-   <li><p>Form a hypothetical infinitely wide CSS line box containing
-   a single inline box containing the text <var title="">text</var>,
-   with all the properties at their initial values except the 'font'
-   property of the inline box set to <var title="">font</var>, the
-   'direction' property of the inline box set to <a href="#the-directionality">the
-   directionality</a> of the <code><a href="#the-canvas-element">canvas</a></code> element, and the
-   'white-space' property set to 'pre'. <a href="#refsCSS">[CSS]</a></p></li>
-
-   <!-- if you insert a step here, make sure to adjust the next step's
-   final words -->
-
-   <li><p>If the <var title="">maxWidth</var> argument was specified
-   and the hypothetical width of the inline box in the hypothetical
-   line box is greater than <var title="">maxWidth</var> CSS pixels,
-   then change <var title="">font</var> to have a more condensed font
-   (if one is available or if a reasonably readable one can be
-   synthesized by applying a horizontal scale factor to the font) or a
-   smaller font, and return to the previous step.</p></li>
-
-   <li>
-
-    <p>Let the <var title="">anchor point</var> be a point on the
-    inline box, determined by the <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> and <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> values, as
-    follows:</p>
-
-    <p>Horizontal position:</p>
-
-    <dl><dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">left</code></dt>
-     <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">start</code> and <a href="#the-directionality">the directionality</a> of the
-     <code><a href="#the-canvas-element">canvas</a></code> element is 'ltr'</dt>
-     <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">end</code> and <a href="#the-directionality">the directionality</a> of the
-     <code><a href="#the-canvas-element">canvas</a></code> element is 'rtl'</dt>
-
-     <dd>Let the <var title="">anchor point</var>'s horizontal
-     position be the left edge of the inline box.</dd>
-
-
-     <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">right</code></dt>
-     <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">end</code> and  <a href="#the-directionality">the directionality</a> of the
-     <code><a href="#the-canvas-element">canvas</a></code> element is 'ltr'</dt>
-     <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">start</code> and <a href="#the-directionality">the directionality</a> of the
-     <code><a href="#the-canvas-element">canvas</a></code> element is 'rtl'</dt>
-
-     <dd>Let the <var title="">anchor point</var>'s horizontal
-     position be the right edge of the inline box.</dd>
-
-
-     <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">center</code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s horizontal
-     position be half way between the left and right edges of the
-     inline box.</dd>
-
-    </dl><p>Vertical position:</p>
-
-    <dl><dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical position
-     be the top of the em box of the first available font of the
-     inline box.</dd>
-
-
-     <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-hanging"><a href="#dom-context-2d-textbaseline-hanging">hanging</a></code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical position
-     be the hanging baseline of the first available font of the inline
-     box.</dd>
-
-
-     <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-middle"><a href="#dom-context-2d-textbaseline-middle">middle</a></code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical position
-     be half way between the bottom and the top of the em box of the
-     first available font of the inline box.</dd>
-
-
-     <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-alphabetic"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical position
-     be the alphabetic baseline of the first available font of the inline
-     box.</dd>
-
-
-     <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-ideographic"><a href="#dom-context-2d-textbaseline-ideographic">ideographic</a></code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical position
-     be the ideographic baseline of the first available font of the inline
-     box.</dd>
-
-
-     <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-bottom"><a href="#dom-context-2d-textbaseline-bottom">bottom</a></code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical position
-     be the bottom of the em box of the first available font of the
-     inline box.</dd>
-
-    </dl></li>
-
-   <li>
-
-    <p>Paint the hypothetical inline box as the shape given by the
-    text's glyphs, as transformed by the <a href="#transformations" title="dom-context-2d-transformation">current transformation
-    matrix</a>, and anchored and sized so that before applying the
-    <a href="#transformations" title="dom-context-2d-transformation">current transformation
-    matrix</a>, the <var title="">anchor point</var> is at (<var title="">x</var>, <var title="">y</var>) and each CSS pixel is
-    mapped to one coordinate space unit.</p>
-
-    <p>For <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText()</a></code>
-    <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> must be
-    applied to the glyphs and <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> must be
-    ignored. For <code title="dom-context-2d-strokeText"><a href="#dom-context-2d-stroketext">strokeText()</a></code> the reverse
-    holds and <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> must be
-    applied to the glyph outlines and <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> must be
-    ignored.</p>
-
-    <p>Text is painted without affecting the current path, and is
-    subject to <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
-    operators</a>.</p>
-
-   </li>
-
-  </ol><!--v6DVT - this is commented out until CSS can get its act together
-enough to actual specify vertical text rendering (how long have we
-been waiting now?)
-
-WHEN EDITING THIS, FIX THE PARTS MARKED "&#x0058;&#x0058;&#x0058;" BELOW
-
-  <p>The <dfn
-  title="dom-context-2d-fillVerticalText"><code>fillVerticalText()</code></dfn>
-  and <dfn
-  title="dom-context-2d-strokeVerticalText"><code>strokeVerticalText()</code></dfn>
-  methods take three or four arguments, <var title="">text</var>, <var
-  title="">x</var>, <var title="">y</var>, and optionally <var
-  title="">maxHeight</var>, and render the given <var
-  title="">text</var> as vertical text at the given (<var
-  title="">x</var>, <var title="">y</var>) coordinates ensuring that
-  the text isn't taller than <var title="">maxHeight</var> if
-  specified, using the current <code
-  title="dom-context-2d-font">font</code> and <code
-  title="dom-context-2d-textAlign">textAlign</code>
-  values. Specifically, when the methods are called, the user agent
-  must run the following steps:</p>
-
-  <ol>
-
-   <li><p>If <var title="">maxHeight</var> is present but less than or
-   equal to zero, return without doing anything; abort these
-   steps.</p></li>
-
-   <li><p>Let <var title="">font</var> be the current font of the
-   context, as given by the <code
-   title="dom-context-2d-font">font</code> attribute.</p></li>
-
-   <li><p>Replace all the <span title="space character">space
-   characters</span> in <var title="">text</var> with U+0020 SPACE
-   characters.</p></li>
-
-   <li><p>Form a <em class="&#x0058;&#x0058;&#x0058;">whatever CSS ends up calling
-   vertical line boxes and inline boxes</em> containing the text <var
-   title="">text</var>, with all the properties at their initial
-   values except the 'font' property of the inline box set to <var
-   title="">font</var> and the 'direction' property of the inline
-   box set to <span>the directionality</span> of the <code>canvas</code>
-   element.</p></li>
-
-   <!- - if you insert a step here, make sure to adjust the next step's
-   final words - ->
-
-   <li><p>If the <var title="">maxHeight</var> argument was specified
-   and the hypothetical height of the <em class="&#x0058;&#x0058;&#x0058;">box</em>
-   in the hypothetical line box is greater than <var
-   title="">maxHeight</var> CSS pixels, then change <var
-   title="">font</var> to have a more condensed font (if one is
-   available or if a reasonably readable one can be synthesized by
-   applying an appropriate scale factor to the font) or a smaller
-   font, and return to the previous step.</p></li>
-
-   <li>
-
-    <p>Let the <var title="">anchor point</var> be a point on the <em
-    class="&#x0058;&#x0058;&#x0058;">inline box</var>, determined by the <code
-    title="dom-context-2d-textAlign">textAlign</code>, as follows:</p>
-
-    <p>Vertical position:</p>
-
-    <dl>
-
-     <dt> If <code
-     title="dom-context-2d-textAlign">textAlign</code> is <code
-     title="">start</code></dt>
-     <dt> If <code
-     title="dom-context-2d-textAlign">textAlign</code> is <code
-     title="">left</code> and <span>the directionality</span> of the
-     <code>canvas</code> element is 'ltr'</dt>
-     <dt> If <code
-     title="dom-context-2d-textAlign">textAlign</code> is <code
-     title="">right</code> and <span>the directionality</span> of the
-     <code>canvas</code> element is 'rtl'</dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical
-     position be the top edge of the <em class="&#x0058;&#x0058;&#x0058;">inline
-     box</em>.</dd>
-
-     <dt> If <code
-     title="dom-context-2d-textAlign">textAlign</code> is <code
-     title="">end</code></dt>
-     <dt> If <code
-     title="dom-context-2d-textAlign">textAlign</code> is <code
-     title="">right</code> and <span>the directionality</span> of the
-     <code>canvas</code> element is 'ltr'</dt>
-     <dt> If <code
-     title="dom-context-2d-textAlign">textAlign</code> is <code
-     title="">left</code> and <span>the directionality</span> of the
-     <code>canvas</code> element is 'rtl'</dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical
-     position be the bottom edge of the <em class="&#x0058;&#x0058;&#x0058;">inline
-     box</em>.</dd>
-
-
-     <dt> If <code
-     title="dom-context-2d-textAlign">textAlign</code> is <code
-     title="">center</code></dt>
-
-     <dd>Let the <var title="">anchor point</var>'s vertical position
-     be half way between the top and bottom edges of the <em
-     class="&#x0058;&#x0058;&#x0058;">inline box</em>.</dd>
-
-    </dl>
-
-    <p>Let the horizontal position be half way between the left and
-    right edges of the em box of the first available font of the <em
-    class="&#x0058;&#x0058;&#x0058;">inline box</em>.</p>
-
-   </li>
-
-   <li>
-
-    <p>Paint the hypothetical inline box as the shape given by the
-    text's glyphs, as transformed by the <span
-    title="dom-context-2d-transformation">current transformation
-    matrix</span>, and anchored and sized so that before applying the
-    <span title="dom-context-2d-transformation">current transformation
-    matrix</span>, the <var title="">anchor point</var> is at (<var
-    title="">x</var>, <var title="">y</var>) and each CSS pixel is
-    mapped to one coordinate space unit.</p>
-
-    <p>For <code
-    title="dom-context-2d-fillVerticalText">fillVerticalText()</code>
-    <code title="dom-context-2d-fillStyle">fillStyle</code> must be
-    applied and <code
-    title="dom-context-2d-strokeStyle">strokeStyle</code> must be
-    ignored. For <code
-    title="dom-context-2d-strokeVerticalText">strokeVerticalText()</code>
-    the reverse holds and <code
-    title="dom-context-2d-strokeStyle">strokeStyle</code> must be
-    applied and <code
-    title="dom-context-2d-fillStyle">fillStyle</code> must be
-    ignored.</p>
-
-    <p>Text is painted without affecting the current path, and is
-    subject to <span title="shadows">shadow effects</span>, <span
-    title="dom-context-2d-globalAlpha">global alpha</span>, the <span
-    title="clipping region">clipping region</span>, and <span
-    title="dom-context-2d-globalCompositeOperation">global composition
-    operators</span>.</p>
-
-   </li>
-
-  </ol>
-
-v6DVT (also check for '- -' bits in the part above) --><p>The <dfn id="dom-context-2d-measuretext" title="dom-context-2d-measureText"><code>measureText()</code></dfn>
-  method takes one argument, <var title="">text</var>. When the method
-  is invoked, the user agent must replace all the <a href="#space-character" title="space
-  character">space characters</a> in <var title="">text</var> with
-  U+0020 SPACE characters, and then must form a hypothetical
-  infinitely wide CSS line box containing a single inline box
-  containing the text <var title="">text</var>, with all the
-  properties at their initial values except the 'white-space' property
-  of the inline element set to 'pre' and the 'font' property of the
-  inline element set to the current font of the context as given by
-  the <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code> attribute, and
-  must then return a new <code><a href="#textmetrics">TextMetrics</a></code> object with its
-  <code title="dom-textmetrics-width"><a href="#dom-textmetrics-width">width</a></code> attribute set to
-  the width of that inline box, in CSS pixels. <a href="#refsCSS">[CSS]</a></p>
-
-  <p>The <code><a href="#textmetrics">TextMetrics</a></code> interface is used for the objects
-  returned from <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code>. It has one
-  attribute, <dfn id="dom-textmetrics-width" title="dom-textmetrics-width"><code>width</code></dfn>, which is set
-  by the <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code>
-  method.</p>
-
-  <p class="note">Glyphs rendered using <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText()</a></code> and <code title="dom-context-2d-strokeText"><a href="#dom-context-2d-stroketext">strokeText()</a></code> can spill out
-  of the box given by the font size (the em square size) and the width
-  returned by <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code> (the text
-  width). This version of the specification does not provide a way to
-  obtain the bounding box dimensions of the text. If the text is to be
-  rendered and removed, care needs to be taken to replace the entire
-  area of the canvas that the clipping region covers, not just the box
-  given by the em square height and measured text width.</p>
-
-  <!-- v6: Drawing text along a given path -->
-  <!-- v6: Adding text to a path -->
-  <!-- see also: http://www.w3.org/TR/SVG11/text.html#TextpathLayoutRules -->
-  <!-- see also: http://developer.mozilla.org/en/docs/Drawing_text_using_a_canvas -->
-
-  </div>
-
-  <p class="note">A future version of the 2D context API may provide a
-  way to render fragments of documents, rendered using CSS, straight
-  to the canvas. This would be provided in preference to a dedicated
-  way of doing multiline layout.</p>
-
-
-
-  <h6 id="images"><span class="secno">4.8.11.1.10 </span>Images</h6>
-
-  <p>To draw images onto the canvas, the <dfn id="dom-context-2d-drawimage" title="dom-context-2d-drawImage"><code>drawImage</code></dfn> method
-  can be used.</p>
+  
 
   <p>This method can be invoked with three different sets of arguments:</p>
 
-  <ul class="brief"><li><code title="">drawImage(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>)</code>
-   </li><li><code title="">drawImage(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</code>
-   </li><li><code title="">drawImage(<var title="">image</var>, <var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, <var title="">sh</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</code>
-  </li></ul><!-- v3: drawImage() of an ImageData object might make sense (when resizing as well as filtering) - ack Charles Pritchard --><p>Each of those three can take either an
-  <code><a href="#htmlimageelement">HTMLImageElement</a></code>, an <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or
-  an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code> for the <var title="">image</var>
-  argument.</p>
+  <ul class="brief"><li><code>drawImage(<var>image</var>, <var>dx</var>, <var>dy</var>)</code>
+   </li><li><code>drawImage(<var>image</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</code>
+   </li><li><code>drawImage(<var>image</var>, <var>sx</var>, <var>sy</var>, <var>sw</var>, <var>sh</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</code>
+  </li></ul>
 
-  <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>)</dt>
-   <dt><var title="">context</var> . <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</dt>
-   <dt><var title="">context</var> . <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var title="">image</var>, <var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, <var title="">sh</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</dt>
+  
 
-   <dd>
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-drawimage-2"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var>image</var>, <var>dx</var>, <var>dy</var>)</dt><dt><var>context</var> . <code id="drawing-images:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var>image</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</dt><dt><var>context</var> . <code id="drawing-images:dom-context-2d-drawimage-2"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var>image</var>, <var>sx</var>, <var>sy</var>, <var>sw</var>, <var>sh</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</dt><dd>
 
     <p>Draws the given image onto the canvas. The arguments are
     interpreted as follows:</p>
 
-    <p><img alt="The sx and sy parameters give the x and y coordinates of the source rectangle; the sw and sh arguments give the width and height of the source rectangle; the dx and dy give the x and y coordinates of the destination rectangle; and the dw and dh arguments give the width and height of the destination rectangle." height="356" src="http://www.whatwg.org/specs/web-apps/current-work/http://images.whatwg.org/drawImage.png" width="356"/></p>
+    <p><img alt="The sx and sy parameters give the x and y coordinates of the source rectangle; the sw and sh arguments give the width and height of the source rectangle; the dx and dy give the x and y coordinates of the destination rectangle; and the dw and dh arguments give the width and height of the destination rectangle." height="356" src="https://html.spec.whatwg.org/images/drawImage.png" width="356"/></p>
 
-    <p>If the first argument isn't an <code><a href="#the-img-element">img</a></code>,
-    <code><a href="#the-canvas-element">canvas</a></code>, or <code><a href="#the-video-element">video</a></code> element, throws a
-    <code><a href="#type_mismatch_err">TYPE_MISMATCH_ERR</a></code> exception. If the image has no
-    image data, throws an <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code> exception. If
-    the one of the source rectangle dimensions is zero, throws an
-    <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception. If the image isn't yet
-    fully decoded, then nothing is drawn.</p>
+    <p>If the image isn't yet fully decoded, then nothing is drawn. If the image is a canvas with no
+    data, throws an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="drawing-images:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="drawing-images:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p>
 
-   </dd>
+   </dd></dl>
 
-  </dl><div class="impl">
+  
 
-  <p>If not specified, the <var title="">dw</var> and <var title="">dh</var> arguments must default to the values of <var title="">sw</var> and <var title="">sh</var>, interpreted such that
-  one CSS pixel in the image is treated as one unit in the canvas
-  coordinate space. If the <var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, and <var title="">sh</var> arguments are omitted, they must default to 0, 0,
-  the image's intrinsic width in image pixels, and the image's
-  intrinsic height in image pixels, respectively. If the image has no
-  intrinsic dimensions, the <i>concrete object size</i> must be used
-  instead, as determined using the CSS &quot;<a href="http://dev.w3.org/csswg/css3-images/#default-sizing">Concrete
-  Object Size Resolution</a>&quot; algorithm, with the <i>specified
-  size</i> having neither a definite width nor height, nor any
-  additional contraints, the object's intrinsic properties being those
-  of the <var title="">image</var> argument, and the <i>default object
-  size</i> being the size of the <code><a href="#the-canvas-element">canvas</a></code> element. <a href="#refsCSSIMAGES">[CSSIMAGES]</a></p>
+  <p>When the <code id="drawing-images:dom-context-2d-drawimage-3"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method is invoked, the user
+  agent must run these steps:</p>
 
-  <p>The <var title="">image</var> argument is an instance of either
-  <code><a href="#htmlimageelement">HTMLImageElement</a></code>, <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or
-  <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>.</p> <!-- createPattern() has an
-  equivalent paragraph -->
+  <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#check-the-usability-of-the-image-argument" id="drawing-images:check-the-usability-of-the-image-argument">Check the usability of the <var>image</var> argument</a>. If this
+   returns <i>aborted</i>, then an exception has been thrown and the method doesn't return anything;
+   abort these steps. If it returns <i>bad</i>, then abort these steps without drawing anything.
+   Otherwise it returns <i>good</i>; continue with these steps.</p></li><li>
 
-  <p>If the <var title="">image</var> argument is an
-  <code><a href="#htmlimageelement">HTMLImageElement</a></code> object that is not <a href="#img-good" title="img-good">fully decodable</a>, or if the <var title="">image</var> argument is an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
-  object whose <code title="dom-media-readyState"><a href="#dom-media-readystate">readyState</a></code>
-  attribute is either <code title="dom-media-HAVE_NOTHING"><a href="#dom-media-have_nothing">HAVE_NOTHING</a></code> or <code title="dom-media-HAVE_METADATA"><a href="#dom-media-have_metadata">HAVE_METADATA</a></code>, then the
-  implementation must return without drawing anything.</p> <!--
-  createPattern() has an equivalent paragraph -->
+    <p>Establish the source and destination rectangles as follows:</p>
 
-  <p>If the <var title="">image</var> argument is an
-  <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> object with either a horizontal
-  dimension or a vertical dimension equal to zero, then the
-  implementation must raise an <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code>
-  exception.</p>
-  <!-- createPattern() has an equivalent paragraph -->
+    <p>If not specified, the <var>dw</var> and <var>dh</var> arguments must default to the values of
+    <var>sw</var> and <var>sh</var>, interpreted such that one <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-images:'px'">CSS pixel</a>
+    in the image is treated as one unit in the <a href="#output-bitmap" id="drawing-images:output-bitmap">output bitmap</a>'s coordinate space. If the
+    <var>sx</var>, <var>sy</var>, <var>sw</var>, and <var>sh</var> arguments are omitted, then they
+    must default to 0, 0, the image's <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="drawing-images:intrinsic-width">intrinsic width</a> in image pixels, and the image's
+    <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="drawing-images:intrinsic-height">intrinsic height</a> in image pixels, respectively. If the image has no <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="drawing-images:intrinsic-dimensions">intrinsic
+    dimensions</a>, then the <i>concrete object size</i> must be used instead, as determined
+    using the CSS &quot;<a href="https://drafts.csswg.org/css-images/#default-sizing">Concrete Object
+    Size Resolution</a>&quot; algorithm, with the <i>specified size</i> having neither a definite width
+    nor height, nor any additional constraints, the object's intrinsic properties being those of the
+    <var>image</var> argument, and the <a data-x-internal="default-object-size" href="https://drafts.csswg.org/css-images/#default-object-size" id="drawing-images:default-object-size">default object size</a> being the size of the
+    <a href="#output-bitmap" id="drawing-images:output-bitmap-2">output bitmap</a>. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSIMAGES">[CSSIMAGES]</a></p>
 
-  <p>The source rectangle is the rectangle whose corners are the four
-  points (<var title="">sx</var>, <var title="">sy</var>), (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <var title="">sy</var>), (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>), (<var title="">sx</var>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>).</p>
+    <p>The source rectangle is the rectangle whose corners are the four points (<var>sx</var>, <var>sy</var>), (<var>sx</var>+<var>sw</var>, <var>sy</var>), (<var>sx</var>+<var>sw</var>, <var>sy</var>+<var>sh</var>),
+    (<var>sx</var>, <var>sy</var>+<var>sh</var>).</p>
 
-  <p>If one of the <var title="">sw</var> or <var title="">sh</var>
-  arguments is zero, the implementation must raise an
-  <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception.</p>
+    <p>The destination rectangle is the rectangle whose corners are the four points (<var>dx</var>, <var>dy</var>), (<var>dx</var>+<var>dw</var>, <var>dy</var>), (<var>dx</var>+<var>dw</var>, <var>dy</var>+<var>dh</var>),
+    (<var>dx</var>, <var>dy</var>+<var>dh</var>).</p>
 
-  <p>The destination rectangle is the rectangle whose corners are the
-  four points (<var title="">dx</var>, <var title="">dy</var>),
-  (<span title=""><var title="">dx</var>+<var title="">dw</var></span>, <var title="">dy</var>), (<span title=""><var title="">dx</var>+<var title="">dw</var></span>, <span title=""><var title="">dy</var>+<var title="">dh</var></span>), (<var title="">dx</var>, <span title=""><var title="">dy</var>+<var title="">dh</var></span>).</p>
+    <p>When the source rectangle is outside the source image, the source rectangle must be clipped
+    to the source image and the destination rectangle must be clipped in the same proportion.</p>
 
-  <p>When <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> is
-  invoked, the region of the image specified by the source rectangle
-  must be painted on the region of the canvas specified by the
-  destination rectangle, after applying the <a href="#transformations" title="dom-context-2d-transformation">current transformation
-  matrix</a> to the points of the destination rectangle.</p>
+    <p class="note">When the destination rectangle is outside the destination image (the
+    <a href="#output-bitmap" id="drawing-images:output-bitmap-3">output bitmap</a>), the pixels that land outside the <a href="#output-bitmap" id="drawing-images:output-bitmap-4">output bitmap</a> are
+    discarded, as if the destination was an infinite canvas whose rendering was clipped to the
+    dimensions of the <a href="#output-bitmap" id="drawing-images:output-bitmap-5">output bitmap</a>.</p>
 
-  <p>The original image data of the source image must be used, not the
-  image as it is rendered (e.g. <code title="attr-dim-width"><a href="#attr-dim-width">width</a></code> and <code title="attr-dim-height"><a href="#attr-dim-height">height</a></code> attributes on the source
-  element have no effect). The image data must be processed in the
-  original direction, even if the dimensions given are negative. <!--
-  remove that last sentence if it causes confusion. Someone once
-  suggested that 5,5,-2,-2 was different than 3,3,2,2; this is trying
-  to clarify that this is no the case. --></p>
+   </li><li><p>If one of the <var>sw</var> or <var>sh</var> arguments is zero, then abort
+   these steps. Nothing is painted.</p></li><li>
 
-  <p class="note">This specification does not define the algorithm to
-  use when scaling the image, if necessary.</p>
+    <p>Paint the region of the <var>image</var> argument specified by the source rectangle
+    on the region of the rendering context's <a href="#output-bitmap" id="drawing-images:output-bitmap-6">output bitmap</a> specified by the
+    destination rectangle, after applying the <a href="#transformations" id="drawing-images:transformations">current
+    transformation matrix</a> to the destination rectangle.</p>
 
-  <p class="note">When a canvas is drawn onto itself, the <a href="#drawing-model">drawing
-  model</a> requires the source to be copied before the image is drawn
-  back onto the canvas, so it is possible to copy parts of a canvas
-  onto overlapping parts of itself.</p>
+    <p>The image data must be processed in the original direction, even if the dimensions given are
+    negative. </p>
 
-  <p>If the original image data is a bitmap image, the value painted
-  at a point in the destination rectangle is computed by filtering the
-  original image data. The user agent may use any filtering algorithm
-  (for example bilinear interpolation or nearest-neighbor). When the
-  filtering algorithm requires a pixel value from outside the original
-  image data, it must instead use the value from the nearest edge
-  pixel. (That is, the filter uses 'clamp-to-edge' behavior.)</p>
-  <!-- see CORE-32111 and:
-       http://krijnhoetmer.nl/irc-logs/whatwg/20100818#l-737
-       http://www.w3.org/Bugs/Public/show_bug.cgi?id=10799#c11
-  -->
-  <!-- createPattern() has a similar paragraph with different rules -->
+    <p>When scaling up, if the <code id="drawing-images:dom-context-2d-imagesmoothingenabled-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is set to
+    true, the user agent should attempt to apply a smoothing algorithm to the image data when it is
+    scaled. User agents which support multiple filtering algorithms may use the value of the <code id="drawing-images:dom-context-2d-imagesmoothingquality-2"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code> attribute to guide
+    the choice of filtering algorithm when the <code id="drawing-images:dom-context-2d-imagesmoothingenabled-2-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is set to
+    true. Otherwise, the image must be rendered using nearest-neighbor interpolation.</p>
 
-  <p>When the <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method
-  is passed an animated image as its <var title="">image</var>
-  argument, the user agent must use the poster frame of the animation,
-  or, if there is no poster frame, the first frame of the
-  animation.</p>
-  <!-- createPattern() has an equivalent paragraph -->
+    <p class="note">This specification does not define the precise algorithm to use when scaling an
+    image down, or when scaling an image up when the <code id="drawing-images:dom-context-2d-imagesmoothingenabled-2-3"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is set to
+    true.</p>
 
-  <p>When the <var title="">image</var> argument is an
-  <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>, then the frame at the <a href="#current-playback-position">current
-  playback position</a> must be used as the source image, and the
-  source image's dimensions must be the <a href="#concept-video-intrinsic-width" title="concept-video-intrinsic-width">intrinsic width</a> and
-  <a href="#concept-video-intrinsic-height" title="concept-video-intrinsic-height">intrinsic height</a>
-  of the <a href="#media-resource">media resource</a> (i.e. after any aspect-ratio
-  correction has been applied).</p>
-  <!-- createPattern() has an equivalent paragraph -->
+    <p class="note">When a <code id="drawing-images:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element is drawn onto itself, the <a href="#drawing-model" id="drawing-images:drawing-model">drawing
+    model</a> requires the source to be copied before the image is drawn, so it is possible to
+    copy parts of a <code id="drawing-images:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element onto overlapping parts of itself.</p>
 
-  <p>Images are painted without affecting the current path, and are
-  subject to <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
-  operators</a>.</p>
+    <p>If the original image data is a bitmap image, then the value painted at a point in the
+    destination rectangle is computed by filtering the original image data. The user agent may use
+    any filtering algorithm (for example bilinear interpolation or nearest-neighbor). When the
+    filtering algorithm requires a pixel value from outside the original image data, it must instead
+    use the value from the nearest edge pixel. (That is, the filter uses 'clamp-to-edge' behavior.)
+    When the filtering algorithm requires a pixel value from outside the source rectangle but inside
+    the original image data, then the value from the original image data must be used.</p>
+    
+    
 
-  </div>
+    <p class="note">Thus, scaling an image in parts or in whole will have the same effect. This does
+    mean that when sprites coming from a single sprite sheet are to be scaled, adjacent images in
+    the sprite sheet can interfere. This can be avoided by ensuring each sprite in the sheet is
+    surrounded by a border of transparent black, or by copying sprites to be scaled into temporary
+    <code id="drawing-images:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> elements and drawing the scaled sprites from there.</p>
+
+    <p>Images are painted without affecting the current path, and are subject to <a href="#shadows" id="drawing-images:shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-images:dom-context-2d-globalalpha-2">global
+    alpha</a>, the <a href="#clipping-region" id="drawing-images:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-images:dom-context-2d-globalcompositeoperation-2">global composition operators</a>.</p>
+
+   </li><li><p>If <a href="#the-image-argument-is-not-origin-clean" id="drawing-images:the-image-argument-is-not-origin-clean">the <var>image argument</var> is not origin-clean</a>, then set the
+   <code id="drawing-images:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>'s <a href="#concept-canvas-origin-clean" id="drawing-images:concept-canvas-origin-clean">origin-clean</a> flag to false.</p></li></ol>
+
+  
 
 
+  <h6 id="pixel-manipulation"><span class="secno">4.12.5.1.15</span> <dfn>Pixel manipulation</dfn><a class="self-link" href="#pixel-manipulation"/></h6>
 
-  <h6 id="pixel-manipulation"><span class="secno">4.8.11.1.11 </span><dfn>Pixel manipulation</dfn></h6>
+  <dl class="domintro"><dt><var>imagedata</var> = new <code id="pixel-manipulation:dom-imagedata"><a href="#dom-imagedata">ImageData</a></code>(<var>sw</var>, <var>sh</var>)</dt><dt><var>imagedata</var> = <var>context</var> . <code id="dom-context-2d-createimagedata"><a href="#dom-context-2d-createimagedata-2">createImageData</a></code>(<var>sw</var>, <var>sh</var>)</dt><dd>
 
-  <dl class="domintro"><dt><var title="">imagedata</var> = <var title="">context</var> . <code title="dom-context-2d-createImageData"><a href="#dom-context-2d-createimagedata">createImageData</a></code>(<var title="">sw</var>, <var title="">sh</var>)</dt>
+    <p>Returns an <code id="pixel-manipulation:imagedata"><a href="#imagedata">ImageData</a></code> object with the given dimensions. All the pixels in the
+    returned object are transparent black.</p>
 
-   <dd>
+    <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if either of
+    the width or height arguments are zero.</p>
 
-    <p>Returns an <code><a href="#imagedata">ImageData</a></code> object with the given
-    dimensions in CSS pixels (which might map to a different number of
-    actual device pixels exposed by the object itself). All the pixels
-    in the returned object are transparent black.</p>
+   </dd><dt><var>imagedata</var> = <var>context</var> . <code id="pixel-manipulation:dom-context-2d-createimagedata-2"><a href="#dom-context-2d-createimagedata-2">createImageData</a></code>(<var>imagedata</var>)</dt><dd>
 
-   </dd>
+    <p>Returns an <code id="pixel-manipulation:imagedata-2"><a href="#imagedata">ImageData</a></code> object with the same dimensions as the argument. All the
+    pixels in the returned object are transparent black.</p>
 
-   <dt><var title="">imagedata</var> = <var title="">context</var> . <code title="dom-context-2d-createImageData"><a href="#dom-context-2d-createimagedata">createImageData</a></code>(<var title="">imagedata</var>)</dt>
+   </dd><dt><var>imagedata</var> = new <code id="pixel-manipulation:dom-imagedata-2"><a href="#dom-imagedata">ImageData</a></code>(<var>data</var>, <var>sw</var> [, <var>sh</var> ] )</dt><dd>
 
-   <dd>
+    <p>Returns an <code id="pixel-manipulation:imagedata-3"><a href="#imagedata">ImageData</a></code> object using the data provided in the <code id="pixel-manipulation:idl-uint8clampedarray"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> argument, interpreted using the given
+    dimensions.</p>
 
-    <p>Returns an <code><a href="#imagedata">ImageData</a></code> object with the same
-    dimensions as the argument. All the pixels in the returned object
-    are transparent black.</p>
+    <p>As each pixel in the data is represented by four numbers, the length of the data needs to be
+    a multiple of four times the given width. If the height is provided as well, then the length
+    needs to be exactly the width times the height times 4.</p>
 
-   </dd>
+    <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-2">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
+    data and dimensions can't be interpreted consistently, or if either dimension is zero.</p>
 
-   <dt><var title="">imagedata</var> = <var title="">context</var> . <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData</a></code>(<var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, <var title="">sh</var>)</dt>
+   </dd><dt><var>imagedata</var> = <var>context</var> . <code id="dom-context-2d-getimagedata"><a href="#dom-context-2d-getimagedata-2">getImageData</a></code>(<var>sx</var>, <var>sy</var>, <var>sw</var>, <var>sh</var>)</dt><dd>
 
-   <dd>
+    <p>Returns an <code id="pixel-manipulation:imagedata-4"><a href="#imagedata">ImageData</a></code> object containing the image data for the given rectangle of
+    the bitmap.</p>
 
-    <p>Returns an <code><a href="#imagedata">ImageData</a></code> object containing the image
-    data for the given rectangle of the canvas.</p>
+    <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-3">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the either
+    of the width or height arguments are zero.</p>
 
-    <p>Throws a <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception if any of the
-    arguments are not finite. Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
-    exception if the either of the width or height arguments are
-    zero.</p>
+   </dd><dt><var>imagedata</var> . <code id="dom-imagedata-width"><a href="#dom-imagedata-width-2">width</a></code></dt><dt><var>imagedata</var> . <code id="dom-imagedata-height"><a href="#dom-imagedata-height-2">height</a></code></dt><dd>
 
-   </dd>
+    <p>Returns the actual dimensions of the data in the <code id="pixel-manipulation:imagedata-5"><a href="#imagedata">ImageData</a></code> object, in
+    pixels.</p>
 
-   <dt><var title="">imagedata</var> . <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code></dt>
-   <dt><var title="">imagedata</var> . <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code></dt>
+   </dd><dt><var>imagedata</var> . <code id="dom-imagedata-data"><a href="#dom-imagedata-data-2">data</a></code></dt><dd>
 
-   <dd>
+    <p>Returns the one-dimensional array containing the data in RGBA order, as integers in the range
+    0 to 255.</p>
 
-    <p>Returns the actual dimensions of the data in the <code><a href="#imagedata">ImageData</a></code> object, in device pixels.</p>
+   </dd><dt><var>context</var> . <code id="dom-context-2d-putimagedata"><a href="#dom-context-2d-putimagedata-2">putImageData</a></code>(<var>imagedata</var>, <var>dx</var>, <var>dy</var> [, <var>dirtyX</var>, <var>dirtyY</var>, <var>dirtyWidth</var>, <var>dirtyHeight</var> ] )</dt><dd>
 
-   </dd>
+    <p>Paints the data from the given <code id="pixel-manipulation:imagedata-6"><a href="#imagedata">ImageData</a></code> object onto the bitmap. If a dirty
+    rectangle is provided, only the pixels from that rectangle are painted.</p>
 
-   <dt><var title="">imagedata</var> . <code title="dom-imagedata-data"><a href="#dom-imagedata-data">data</a></code></dt>
+    <p>The <code id="pixel-manipulation:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> and <code id="pixel-manipulation:dom-context-2d-globalcompositeoperation-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> attributes, as
+    well as the shadow attributes, are ignored for the purposes of this method call; pixels in the
+    canvas are replaced wholesale, with no composition, alpha blending, no shadows, etc.</p>
 
-   <dd>
+    <p>Throws an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="pixel-manipulation:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="pixel-manipulation:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the
+    <var>imagedata</var> object's data's <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="pixel-manipulation:detached">[[Detached]]</a> internal slot value is true.</p>
 
-    <p>Returns the one-dimensional array containing the data in RGBA order, as integers in the range 0 to 255.</p>
+   </dd></dl>
 
-   </dd>
+  
 
-   <dt><var title="">context</var> . <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData</a></code>(<var title="">imagedata</var>, <var title="">dx</var>, <var title="">dy</var> [, <var title="">dirtyX</var>, <var title="">dirtyY</var>, <var title="">dirtyWidth</var>, <var title="">dirtyHeight</var> ])</dt>
+  <p>Objects that implement the <code id="pixel-manipulation:canvasimagedata"><a href="#canvasimagedata">CanvasImageData</a></code> interface provide the following methods
+  for reading and writing pixel data to the bitmap.</p>
 
-   <dd>
+  <p>The <dfn id="dom-imagedata"><code>ImageData()</code></dfn> constructors and the
+  <dfn id="dom-context-2d-createimagedata-2"><code>createImageData()</code></dfn> methods are
+  used to instantiate new <code id="pixel-manipulation:imagedata-7"><a href="#imagedata">ImageData</a></code> objects.</p>
 
-    <p>Paints the data from the given <code><a href="#imagedata">ImageData</a></code> object
-    onto the canvas. If a dirty rectangle is provided, only the pixels
-    from that rectangle are painted.</p>
+  <p>When the <code id="pixel-manipulation:dom-imagedata-3"><a href="#dom-imagedata">ImageData()</a></code> constructor is invoked with two
+  numeric arguments <var>sw</var> and <var>sh</var>, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object">create an <code>ImageData</code>
+  object</a> with parameter <var>pixelsPerRow</var> set to <var>sw</var>, and <var>rows</var> set
+  to <var>sh</var>. The image data of the newly created <code id="pixel-manipulation:imagedata-8"><a href="#imagedata">ImageData</a></code> object must be
+  initialized to transparent black. If both <var>sw</var> and <var>sh</var> are non-zero, then
+  return the new <code id="pixel-manipulation:imagedata-9"><a href="#imagedata">ImageData</a></code> object. If one or both of <var>sw</var> and <var>sh</var>
+  are zero, then the constructor must throw an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-4">&quot;<code>IndexSizeError</code>&quot;</a>
+  <code id="pixel-manipulation:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> instead.</p>
 
-    <p>The <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>
-    and <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>
-    attributes, as well as the shadow attributes, are ignored for the
-    purposes of this method call; pixels in the canvas are replaced
-    wholesale, with no composition, alpha blending, no shadows,
-    etc.</p>
+  <p>When the <code id="pixel-manipulation:dom-imagedata-4"><a href="#dom-imagedata">ImageData()</a></code> constructor is invoked with its first
+  argument being an <code id="pixel-manipulation:idl-uint8clampedarray-2"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> <var>source</var>
+  and its second and optional third arguments being numeric arguments <var>sw</var> and
+  <var>sh</var>, it must run these steps:</p>
 
-    <p>If the first argument is null, throws a
-    <code><a href="#type_mismatch_err">TYPE_MISMATCH_ERR</a></code> exception. Throws a
-    <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception if any of the other
-    arguments are not finite.</p>
+  <ol><li><p>Let <var>length</var> be the number of bytes in <var>source</var>.</p></li><li><p>If <var>length</var> is not a non-zero integral multiple of four, then throw an
+   <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="pixel-manipulation:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="pixel-manipulation:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+   steps.</p></li><li><p>Let <var>length</var> be <var>length</var> divided by four.</p>
 
-   </dd>
+   </li><li>
 
-  </dl><div class="impl">
+    <p>If <var>length</var> is not an integral multiple of <var>sw</var>, then throw an
+    <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-5">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p>
 
-  <p>The <dfn id="dom-context-2d-createimagedata" title="dom-context-2d-createImageData"><code>createImageData()</code></dfn>
-  method is used to instantiate new blank <code><a href="#imagedata">ImageData</a></code>
-  objects. When the method is invoked with two arguments <var title="">sw</var> and <var title="">sh</var>, it must return an
-  <code><a href="#imagedata">ImageData</a></code> object representing a rectangle with a width
-  in CSS pixels equal to the absolute magnitude of <var title="">sw</var> and a height in CSS pixels equal to the absolute
-  magnitude of <var title="">sh</var>. When invoked with a single <var title="">imagedata</var> argument, it must return an
-  <code><a href="#imagedata">ImageData</a></code> object representing a rectangle with the same
-  dimensions as the <code><a href="#imagedata">ImageData</a></code> object passed as the
-  argument. The <code><a href="#imagedata">ImageData</a></code> object returned must be filled
-  with transparent black.</p>
+    <p class="note">At this step, the length is guaranteed to be greater than zero (otherwise the
+    second step above would have aborted the steps), so if <var>sw</var> is zero, this
+    step will throw the exception and abort these steps.</p>
 
-  <p>The <dfn id="dom-context-2d-getimagedata" title="dom-context-2d-getImageData"><code>getImageData(<var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>,
-  <var title="">sh</var>)</code></dfn> method must return an
-  <code><a href="#imagedata">ImageData</a></code> object representing the underlying pixel data
-  for the area of the canvas denoted by the rectangle whose corners are
-  the four points (<var title="">sx</var>, <var title="">sy</var>),
-  (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <var title="">sy</var>), (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>), (<var title="">sx</var>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>), in canvas
-  coordinate space units. Pixels outside the canvas must be returned
-  as transparent black. Pixels must be returned as non-premultiplied
-  alpha values.</p>
+   </li><li><p>Let <var>height</var> be <var>length</var> divided by <var>sw</var>.</p></li><li><p>If the <var>sh</var> argument was not omitted, and its value is not equal to
+   <var>height</var>, then throw an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-6">&quot;<code>IndexSizeError</code>&quot;</a>
+   <code id="pixel-manipulation:domexception-8"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p></li><li>
 
-  <p>If any of the arguments to <code title="dom-context-2d-createImageData"><a href="#dom-context-2d-createimagedata">createImageData()</a></code> or
-  <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code>
-  are infinite or NaN, the method must instead raise a
-  <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception. If either the <var title="">sw</var> or <var title="">sh</var> arguments are zero,
-  the method must instead raise an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
-  exception.</p>
+    <p><a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-2">Create an <code>ImageData</code> object</a>, with parameter <var>pixelsPerRow</var>
+    set to <var>sw</var>, <var>rows</var> set to <var>sh</var>, and using <var>source</var>.
+    Return the newly created <code id="pixel-manipulation:imagedata-10"><a href="#imagedata">ImageData</a></code> object.</p>
 
-  <p><code><a href="#imagedata">ImageData</a></code> objects must be initialized so that their
-  <dfn id="dom-imagedata-width" title="dom-imagedata-width"><code>width</code></dfn> attribute
-  is set to <var title="">w</var>, the number of physical device
-  pixels per row in the image data, their <dfn id="dom-imagedata-height" title="dom-imagedata-height"><code>height</code></dfn> attribute is
-  set to <var title="">h</var>, the number of rows in the image data,
-  and their <dfn id="dom-imagedata-data" title="dom-imagedata-data"><code>data</code></dfn>
-  attribute is initialized to a <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object
-  holding the image data. At least one pixel's worth of image data
-  must be returned.</p>
+    <p class="note">The resulting object's data is not a <em>copy</em> of <var>source</var>, it's
+    the actual <code id="pixel-manipulation:idl-uint8clampedarray-3"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> object passed as the
+    first argument to the constructor.</p>
 
-  <p>The <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object provides ordered,
-  indexed access to the color components of each pixel of the image
-  data. The data must be represented in left-to-right order, row by
-  row top to bottom, starting with the top left, with each pixel's
-  red, green, blue, and alpha components being given in that order for
-  each pixel. Each component of each device pixel represented in this
-  array must be in the range 0..255, representing the 8 bit value for
-  that component. The components must be assigned consecutive indices
-  starting with 0 for the top left pixel's red component.</p>
+   </li></ol>
 
-  <p>The <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object thus represents <var title="">h</var>×<var title="">w</var>×4 integers. The
-  <dfn id="dom-canvaspixelarray-length" title="dom-canvaspixelarray-length"><code>length</code></dfn>
-  attribute of a <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object must return this
-  number.</p>
+  <p>When the <code id="pixel-manipulation:dom-context-2d-createimagedata-2-2"><a href="#dom-context-2d-createimagedata-2">createImageData()</a></code> method is
+  invoked with two numeric arguments <var>sw</var> and <var>sh</var>, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-3">create an
+  <code>ImageData</code> object</a>, with parameter <var>pixelsPerRow</var> set to the
+  absolute magnitude of <var>sw</var>, and parameter <var>rows</var> set to the absolute magnitude
+  of <var>sh</var>. Initialize the image data of the new <code id="pixel-manipulation:imagedata-11"><a href="#imagedata">ImageData</a></code> object to
+  transparent black. If both <var>sw</var> and <var>sh</var> are non-zero, then return
+  the new <code id="pixel-manipulation:imagedata-12"><a href="#imagedata">ImageData</a></code> object. If one or both of <var>sw</var> and <var>sh</var> are
+  zero, then throw an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-7">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-9"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>
+  instead.</p>
 
-  <p>The object's <a href="#supported-property-indices">supported property indices</a> are the
-  numbers in the range 0 .. <span title=""><var title="">h</var>×<var title="">w</var>×4-1</span>.</p>
+  <p>When the <code id="pixel-manipulation:dom-context-2d-createimagedata-2-3"><a href="#dom-context-2d-createimagedata-2">createImageData()</a></code> method is
+  invoked with a single <var>imagedata</var> argument, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-4">create an
+  <code>ImageData</code> object</a>, with parameter <var>pixelsPerRow</var> set to the value of
+  the <code id="pixel-manipulation:dom-imagedata-width-2"><a href="#dom-imagedata-width-2">width</a></code> attribute of the <code id="pixel-manipulation:imagedata-13"><a href="#imagedata">ImageData</a></code>
+  object passed as the argument, and the <var>rows</var> parameter set to the value of the
+  <code id="pixel-manipulation:dom-imagedata-height-2"><a href="#dom-imagedata-height-2">height</a></code> attribute.
+  Initialize the image data of the new <code id="pixel-manipulation:imagedata-14"><a href="#imagedata">ImageData</a></code> object to transparent black. Return
+  the newly created <code id="pixel-manipulation:imagedata-15"><a href="#imagedata">ImageData</a></code> object.</p>
 
-  <p>To <dfn id="dom-canvaspixelarray-get" title="dom-CanvasPixelArray-get">determine the value of
-  an indexed property</dfn> <var title="">index</var>, the user agent
-  must return the value of the <var title="">index</var>th component
-  in the array.</p>
+  <p>The <dfn id="dom-context-2d-getimagedata-2"><code>getImageData(<var>sx</var>,
+  <var>sy</var>, <var>sw</var>, <var>sh</var>)</code></dfn> method, when invoked, must,
+  if either the <var>sw</var> or <var>sh</var> arguments are zero, throw an
+  <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-8">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-10"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>; otherwise,
+  
+  if the <code id="pixel-manipulation:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>'s <a href="#concept-canvas-origin-clean" id="pixel-manipulation:concept-canvas-origin-clean">origin-clean</a> flag is set to false, it must throw a
+  <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="pixel-manipulation:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="pixel-manipulation:domexception-11"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>;
+  
+  otherwise, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-5">create an <code>ImageData</code> object</a>, with parameter
+  <var>pixelsPerRow</var> set to <var>sw</var>, and parameter <var>rows</var> set to <var>sh</var>.
+  Set the pixel values of the image data of the newly created <code id="pixel-manipulation:imagedata-16"><a href="#imagedata">ImageData</a></code> object to
+  represent the <a href="#output-bitmap" id="pixel-manipulation:output-bitmap">output bitmap</a> for the area of that bitmap denoted by the rectangle
+  whose corners are the four points (<var>sx</var>, <var>sy</var>), (<span><var>sx</var>+<var>sw</var></span>, <var>sy</var>), (<span><var>sx</var>+<var>sw</var></span>, <span><var>sy</var>+<var>sh</var></span>), (<var>sx</var>,
+  <var>sy</var>+<var>sh</var>), in the bitmap's coordinate space units.
+  Pixels outside the <a href="#output-bitmap" id="pixel-manipulation:output-bitmap-2">output bitmap</a> must be set to transparent black. Pixel values
+  must not be premultiplied by alpha.</p>
 
-  <p>To <dfn id="dom-canvaspixelarray-set" title="dom-CanvasPixelArray-set">set the value of an
-  existing indexed property</dfn> <var title="">index</var> to value
-  <var title="">value</var>, the value of the <var title="">index</var>th component in the array must be set to <var title="">value</var>.</p>
+  <p>When the user agent is required to <dfn id="create-an-imagedata-object">create an <code>ImageData</code> object</dfn>, given a
+  positive integer number of rows <var>rows</var>, a positive integer number of pixels per row
+  <var>pixelsPerRow</var>, and an optional <code id="pixel-manipulation:idl-uint8clampedarray-4"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> <var>source</var>, it must run these
+  steps:</p>
 
-  <p class="note">The width and height (<var title="">w</var> and <var title="">h</var>) might be different from the <var title="">sw</var>
-  and <var title="">sh</var> arguments to the above methods, e.g. if
-  the canvas is backed by a high-resolution bitmap, or if the <var title="">sw</var> and <var title="">sh</var> arguments are
-  negative.</p>
+  <ol><li><p>Let <var>imageData</var> be a new uninitialized <code id="pixel-manipulation:imagedata-17"><a href="#imagedata">ImageData</a></code> object.</p></li><li><p>If <var>source</var> is specified, then assign the <dfn id="dom-imagedata-data-2"><code>data</code></dfn> attribute of <var>imageData</var> to
+   <var>source</var>.</p></li><li>
+    <p>If <var>source</var> is not specified, then initialize the <code id="pixel-manipulation:dom-imagedata-data-2"><a href="#dom-imagedata-data-2">data</a></code> attribute of <var>imageData</var> to a new <code id="pixel-manipulation:idl-uint8clampedarray-5"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> object. The <code id="pixel-manipulation:idl-uint8clampedarray-6"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> object must use a new <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer">Canvas
+    Pixel <code>ArrayBuffer</code></a> for its storage, and must have a
+    zero start offset and a length equal to the length of its storage, in bytes. The <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer-2">Canvas
+    Pixel <code>ArrayBuffer</code></a> must have the correct size to
+    store <var>rows</var> × <var>pixelsPerRow</var> pixels.</p>
 
-  <p>The <dfn id="dom-context-2d-putimagedata" title="dom-context-2d-putImageData"><code>putImageData(<var title="">imagedata</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dirtyX</var>, <var title="">dirtyY</var>, <var title="">dirtyWidth</var>, <var title="">dirtyHeight</var>)</code></dfn> method writes data from
-  <code><a href="#imagedata">ImageData</a></code> structures back to the canvas.</p>
+    <p>If the <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer-3">Canvas Pixel <code>ArrayBuffer</code></a> cannot be
+    allocated, then rethrow the <code id="pixel-manipulation:js-rangeerror"><a data-x-internal="js-rangeerror" href="https://tc39.github.io/ecma262/#sec-native-error-types-used-in-this-standard-rangeerror">RangeError</a></code> thrown by JavaScript,
+    and abort these steps.</p>
+   </li><li><p>Initialize the <dfn id="dom-imagedata-width-2"><code>width</code></dfn> attribute of
+   <var>imageData</var> to <var>pixelsPerRow</var>.</p></li><li><p>Initialize the <dfn id="dom-imagedata-height-2"><code>height</code></dfn> attribute of
+   <var>imageData</var> to <var>rows</var>.</p></li><li><p>Return <var>imageData</var>.</p></li></ol>
 
-  <p>If any of the arguments to the method are infinite or NaN, the
-  method must raise a <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception.</p>
+  <p><code id="pixel-manipulation:imagedata-18"><a href="#imagedata">ImageData</a></code> objects are <a href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects" id="pixel-manipulation:serializable-objects">serializable objects</a>. Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps" id="pixel-manipulation:serialization-steps">serialization
+  steps</a>, given <var>value</var> and <var>serialized</var>, are:</p>
 
-  <p>When the last four arguments are omitted, they must be assumed to
-  have the values 0, 0, the <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code> member of the <var title="">imagedata</var> structure, and the <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code> member of the <var title="">imagedata</var> structure, respectively.</p>
+  <ol><li><p>Set <var>serialized</var>.[[Data]] to the <a href="https://html.spec.whatwg.org/multipage/structured-data.html#sub-serialization" id="pixel-manipulation:sub-serialization">sub-serialization</a> of the value of
+   <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-data-2-2"><a href="#dom-imagedata-data-2">data</a></code> attribute.</p></li><li><p>Set <var>serialized</var>.[[Width]] to the value of <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-width-2-2"><a href="#dom-imagedata-width-2">width</a></code> attribute.</p></li><li><p>Set <var>serialized</var>.[[Height]] to the value of <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-height-2-2"><a href="#dom-imagedata-height-2">height</a></code> attribute.</p></li></ol>
 
-  <p>When invoked with arguments that do not, per the last few
-  paragraphs, cause an exception to be raised, the <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code> method
-  must act as follows:</p>
+  <p>Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps" id="pixel-manipulation:deserialization-steps">deserialization steps</a>, given <var>serialized</var> and <var>value</var>,
+  are:</p>
+
+  <ol><li><p>Initialize <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-data-2-3"><a href="#dom-imagedata-data-2">data</a></code> attribute
+   to the <a href="https://html.spec.whatwg.org/multipage/structured-data.html#sub-deserialization" id="pixel-manipulation:sub-deserialization">sub-deserialization</a> of <var>serialized</var>.[[Data]].</p></li><li><p>Initialize <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-width-2-3"><a href="#dom-imagedata-width-2">width</a></code> attribute
+   to <var>serialized</var>.[[Width]].</p></li><li><p>Initialize <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-height-2-3"><a href="#dom-imagedata-height-2">height</a></code> attribute
+   to <var>serialized</var>.[[Height]].</p></li></ol>
+
+  <p>A <dfn id="canvas-pixel-arraybuffer">Canvas Pixel <code>ArrayBuffer</code></dfn> is an <code id="pixel-manipulation:idl-arraybuffer"><a data-x-internal="idl-arraybuffer" href="https://heycam.github.io/webidl/#idl-ArrayBuffer">ArrayBuffer</a></code> whose data is represented in left-to-right order, row
+  by row top to bottom, starting with the top left, with each pixel's red, green, blue, and alpha
+  components being given in that order for each pixel. Each component of each pixel represented in
+  this array must be in the range 0..255, representing the 8 bit value for that component. The
+  components must be assigned consecutive indices starting with 0 for the top left pixel's red
+  component.</p>
+
+  <p>The <dfn id="dom-context-2d-putimagedata-2"><code>putImageData()</code></dfn> method writes
+  data from <code id="pixel-manipulation:imagedata-19"><a href="#imagedata">ImageData</a></code> structures back to the rendering context's <a href="#output-bitmap" id="pixel-manipulation:output-bitmap-3">output
+  bitmap</a>. Its arguments are: <var>imagedata</var>, <var>dx</var>, <var>dy</var>,
+  <var>dirtyX</var>, <var>dirtyY</var>, <var>dirtyWidth</var>, and <var>dirtyHeight</var>.</p>
+
+  <p>When the last four arguments to this method are omitted, they must be assumed to have the
+  values 0, 0, the <code id="pixel-manipulation:dom-imagedata-width-2-4"><a href="#dom-imagedata-width-2">width</a></code> member of the <var>imagedata</var> structure, and the <code id="pixel-manipulation:dom-imagedata-height-2-4"><a href="#dom-imagedata-height-2">height</a></code>
+  member of the <var>imagedata</var> structure, respectively.</p>
+
+  <p>The method, when invoked, must act as follows:</p>
 
   <ol><li>
 
-    <p>Let <var title="">dx<sub>device</sub></var> be the x-coordinate
-    of the device pixel in the underlying pixel data of the canvas
-    corresponding to the <var title="">dx</var> coordinate in the
-    canvas coordinate space.</p>
+    <p>If <var>imagedata</var>'s <code id="pixel-manipulation:dom-imagedata-data-2-4"><a href="#dom-imagedata-data-2">data</a></code> attribute value's
+    <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="pixel-manipulation:detached-2">[[Detached]]</a> internal slot value is true, then throw an
+    <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="pixel-manipulation:invalidstateerror-3">&quot;<code>InvalidStateError</code>&quot;</a> <code id="pixel-manipulation:domexception-12"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+    steps.</p>
 
-    <p>Let <var title="">dy<sub>device</sub></var> be the y-coordinate
-    of the device pixel in the underlying pixel data of the canvas
-    corresponding to the <var title="">dy</var> coordinate in the
-    canvas coordinate space.</p>
+   </li><li>
 
-   </li>
+    <p>If <var>dirtyWidth</var> is negative, then let <var>dirtyX</var> be <span><var>dirtyX</var>+<var>dirtyWidth</var></span>, and let <var>dirtyWidth</var> be equal
+    to the absolute magnitude of <var>dirtyWidth</var>.</p>
 
-   <li>
+    <p>If <var>dirtyHeight</var> is negative, then let <var>dirtyY</var> be <span><var>dirtyY</var>+<var>dirtyHeight</var></span>, and let <var>dirtyHeight</var> be
+    equal to the absolute magnitude of <var>dirtyHeight</var>.</p>
 
-    <p>If <var title="">dirtyWidth</var> is negative, let <var title="">dirtyX</var> be <span title=""><var title="">dirtyX</var>+<var title="">dirtyWidth</var></span>, and let <var title="">dirtyWidth</var> be equal to the absolute magnitude of
-    <var title="">dirtyWidth</var>.</p>
+   </li><li>
 
-    <p>If <var title="">dirtyHeight</var> is negative, let <var title="">dirtyY</var> be <span title=""><var title="">dirtyY</var>+<var title="">dirtyHeight</var></span>, and let <var title="">dirtyHeight</var> be equal to the absolute magnitude of
-    <var title="">dirtyHeight</var>.</p>
+    <p>If <var>dirtyX</var> is negative, then let <var>dirtyWidth</var> be <span><var>dirtyWidth</var>+<var>dirtyX</var></span>, and let <var>dirtyX</var> be zero.</p>
 
-   </li>
+    <p>If <var>dirtyY</var> is negative, then let <var>dirtyHeight</var> be <span><var>dirtyHeight</var>+<var>dirtyY</var></span>, and let <var>dirtyY</var> be zero.</p>
 
-   <li>
+   </li><li>
 
-    <p>If <var title="">dirtyX</var> is negative, let <var title="">dirtyWidth</var> be <span title=""><var title="">dirtyWidth</var>+<var title="">dirtyX</var></span>, and
-    let <var title="">dirtyX</var> be zero.</p>
+    <p>If <var>dirtyX</var>+<var>dirtyWidth</var> is greater than the <code id="pixel-manipulation:dom-imagedata-width-2-5"><a href="#dom-imagedata-width-2">width</a></code> attribute of the <var>imagedata</var> argument, then
+    let <var>dirtyWidth</var> be the value of that <code id="pixel-manipulation:dom-imagedata-width-2-6"><a href="#dom-imagedata-width-2">width</a></code>
+    attribute, minus the value of <var>dirtyX</var>.</p>
 
-    <p>If <var title="">dirtyY</var> is negative, let <var title="">dirtyHeight</var> be <span title=""><var title="">dirtyHeight</var>+<var title="">dirtyY</var></span>, and
-    let <var title="">dirtyY</var> be zero.</p>
+    <p>If <var>dirtyY</var>+<var>dirtyHeight</var> is greater than the <code id="pixel-manipulation:dom-imagedata-height-2-5"><a href="#dom-imagedata-height-2">height</a></code> attribute of the <var>imagedata</var> argument, then
+    let <var>dirtyHeight</var> be the value of that <code id="pixel-manipulation:dom-imagedata-height-2-6"><a href="#dom-imagedata-height-2">height</a></code> attribute, minus the value of <var>dirtyY</var>.</p>
 
-   </li>
+   </li><li>
 
-   <li>
+    <p>If, after those changes, either <var>dirtyWidth</var> or <var>dirtyHeight</var> are negative
+    or zero, then abort these steps without affecting any bitmaps.</p>
 
-    <p>If <span title=""><var title="">dirtyX</var>+<var title="">dirtyWidth</var></span> is greater than the <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code> attribute of the <var title="">imagedata</var> argument, let <var title="">dirtyWidth</var> be the value of that <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code> attribute, minus the
-    value of <var title="">dirtyX</var>.</p>
+   </li><li><p>For all integer values of <var>x</var> and <var>y</var> where <span><var>dirtyX</var> ≤ <var>x</var> &lt; <span><var>dirtyX</var>+<var>dirtyWidth</var></span></span> and <span><var>dirtyY</var> ≤ <var>y</var> &lt; <span><var>dirtyY</var>+<var>dirtyHeight</var></span></span>, copy the
+   four channels of the pixel with coordinate (<var>x</var>, <var>y</var>) in
+   the <var>imagedata</var> data structure's <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer-4">Canvas Pixel
+   <code>ArrayBuffer</code></a> to the pixel with coordinate (<span><var>dx</var>+<var>x</var></span>, <var>dy</var>+<var>y</var>)
+   in the rendering context's <a href="#output-bitmap" id="pixel-manipulation:output-bitmap-4">output bitmap</a>.</p></li></ol>
 
-    <p>If <span title=""><var title="">dirtyY</var>+<var title="">dirtyHeight</var></span> is greater than the <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code> attribute of the <var title="">imagedata</var> argument, let <var title="">dirtyHeight</var> be the value of that <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code> attribute, minus the
-    value of <var title="">dirtyY</var>.</p>
+  <p class="note">Due to the lossy nature of converting to and from premultiplied alpha color
+  values, pixels that have just been set using <code id="pixel-manipulation:dom-context-2d-putimagedata-2"><a href="#dom-context-2d-putimagedata-2">putImageData()</a></code> might be returned to an equivalent
+  <code id="pixel-manipulation:dom-context-2d-getimagedata-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> as different values.</p>
 
-   </li>
+  <p>The current path, <a href="#transformations" id="pixel-manipulation:transformations">transformation matrix</a>,
+  <a href="#shadows" id="pixel-manipulation:shadows">shadow attributes</a>, <a href="#dom-context-2d-globalalpha-2" id="pixel-manipulation:dom-context-2d-globalalpha-2-2">global
+  alpha</a>, the <a href="#clipping-region" id="pixel-manipulation:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="pixel-manipulation:dom-context-2d-globalcompositeoperation-2-2">global composition operator</a> must not
+  affect the methods described in this section.</p>
 
-   <li>
-
-    <p>If, after those changes, either <var title="">dirtyWidth</var>
-    or <var title="">dirtyHeight</var> is negative or zero, stop these
-    steps without affecting the canvas.</p>
-
-   </li>
-
-   <li><p>Otherwise, for all integer values of <var title="">x</var>
-   and <var title="">y</var> where <span title=""><var title="">dirtyX</var> ≤ <var title="">x</var> &lt; <span title=""><var title="">dirtyX</var>+<var title="">dirtyWidth</var></span></span>
-   and <span title=""><var title="">dirtyY</var> ≤ <var title="">y</var> &lt; <span title=""><var title="">dirtyY</var>+<var title="">dirtyHeight</var></span></span>, copy the four channels of
-   the pixel with coordinate (<var title="">x</var>, <var title="">y</var>) in the <var title="">imagedata</var> data
-   structure to the pixel with coordinate (<span title=""><var title="">dx<sub>device</sub></var>+<var title="">x</var></span>,
-   <span title=""><var title="">dy<sub>device</sub></var>+<var title="">y</var></span>) in the underlying pixel data of the
-   canvas.</p></li>
-
-  </ol><p>The handling of pixel rounding when the specified coordinates do
-  not exactly map to the device coordinate space is not defined by
-  this specification, except that the following must result in no
-  visible changes to the rendering:</p>
-
-  <pre>context.putImageData(context.getImageData(x, y, w, h), p, q);</pre>
-
-  <p>...for any value of <var title="">x</var>, <var title="">y</var>,
-  <var title="">w</var>, and <var title="">h</var> and where <var title="">p</var> is the smaller of <var title="">x</var> and the sum
-  of <var title="">x</var> and <var title="">w</var>, and <var title="">q</var> is the smaller of <var title="">y</var> and the sum
-  of <var title="">y</var> and <var title="">h</var>; and except that
-  the following two calls:</p>
-
-  <pre>context.createImageData(w, h);
-context.getImageData(0, 0, w, h);</pre>
-
-  <p>...must return <code><a href="#imagedata">ImageData</a></code> objects with the same
-  dimensions, for any value of <var title="">w</var> and <var title="">h</var>. In other words, while user agents may round the
-  arguments of these methods so that they map to device pixel
-  boundaries, any rounding performed must be performed consistently
-  for all of the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">createImageData()</a></code>, <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> and <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code>
-  operations.</p>
-
-  <p class="note">Due to the lossy nature of converting to and from
-  premultiplied alpha color values, pixels that have just been set
-  using <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code> might be
-  returned to an equivalent <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> as
-  different values.</p>
-
-  <p>The current path, <a href="#transformations" title="dom-context-2d-transformation">transformation matrix</a>,
-  <a href="#shadows" title="shadows">shadow attributes</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
-  operator</a> must not affect the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> and <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code>
-  methods.</p>
-
-  </div>
+  
 
   <div class="example">
 
-   <p>The data returned by <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> is at the
-   resolution of the canvas backing store, which is likely to not be
-   one device pixel to each CSS pixel if the display used is a high
-   resolution display.</p>
-
-   <p>In the following example, the script generates an
-   <code><a href="#imagedata">ImageData</a></code> object so that it can draw onto it.</p>
+   <p>In the following example, the script generates an <code id="pixel-manipulation:imagedata-20"><a href="#imagedata">ImageData</a></code> object so that it can
+   draw onto it.</p>
 
    <pre>// canvas is a reference to a &lt;canvas&gt; element
 var context = canvas.getContext('2d');
@@ -3348,11 +3318,11 @@
 
   <div class="example">
 
-   <p>Here is an example of using <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> and <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code> to
-   implement an edge detection filter.</p>
+   <p>Here is an example of using <code id="pixel-manipulation:dom-context-2d-getimagedata-2-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> and <code id="pixel-manipulation:dom-context-2d-putimagedata-2-2"><a href="#dom-context-2d-putimagedata-2">putImageData()</a></code> to implement an edge detection
+   filter.</p>
 
    <pre>&lt;!DOCTYPE HTML&gt;
-&lt;html&gt;
+&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
   &lt;title&gt;Edge detection demo&lt;/title&gt;
   &lt;script&gt;
@@ -3375,9 +3345,9 @@
      var output = context.createImageData(canvas.width, canvas.height);
 
      // alias some variables for convenience
-     // notice that we are using input.width and input.height here
-     // as they might not be the same as canvas.width and canvas.height
-     // (in particular, they might be different on high-res displays)
+     // In this case input.width and input.height
+     // match canvas.width and canvas.height
+     // but we'll use the former to keep the code generic.
      var w = input.width, h = input.height;
      var inputData = input.data;
      var outputData = output.data;
@@ -3408,102 +3378,322 @@
   </div>
 
 
-  <div class="impl">
-
-  <h6 id="drawing-model"><span class="secno">4.8.11.1.12 </span><dfn>Drawing model</dfn></h6>
-
-  <p>When a shape or image is painted, user agents must follow these
-  steps, in the order given (or act as if they do):</p>
-
-  <ol><li><p>Render the shape or image onto an infinite transparent black
-   bitmap, creating image <var title="">A</var>, as described in the
-   previous sections. For shapes, the current fill, stroke, and line
-   styles must be honored, and the stroke must itself also be
-   subjected to the current transformation matrix.</p></li>
-
-   <li><p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, render the shadow from
-   image <var title="">A</var>, using the current shadow styles,
-   creating image <var title="">B</var>.</p></li>
-
-   <li><p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, multiply the alpha
-   component of every pixel in <var title="">B</var> by <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>.</p></li>
-
-   <li><p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, composite <var title="">B</var> within the <a href="#clipping-region">clipping region</a> over the
-   current canvas bitmap using the current composition
-   operator.</p></li>
-
-   <li><p>Multiply the alpha component of every pixel in <var title="">A</var> by <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>.</p></li>
-
-   <li><p>Composite <var title="">A</var> within the <a href="#clipping-region">clipping
-   region</a> over the current canvas bitmap using the current
-   composition operator.</p></li>
-
-  </ol></div>
 
 
-  <h6 id="best-practices"><span class="secno">4.8.11.1.13 </span>Best practices</h6>
+  <h6 id="compositing"><span class="secno">4.12.5.1.16</span> Compositing<a class="self-link" href="#compositing"/></h6>
+
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-globalalpha"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current alpha value applied to rendering operations.</p>
+
+    <p>Can be set, to change the alpha value. Values outside of the range 0.0 .. 1.0 are
+    ignored.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-globalcompositeoperation"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current composition operation, from the values defined in the Compositing and
+    Blending specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a>.</p>
+
+    <p>Can be set, to change the composition operation. Unknown values are ignored.</p>
+
+   </dd></dl><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="bugs"><strong>Spec bugs:</strong> <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=27313" title="It seems like this should be defined in terms of an IDL enum. If not, please clarify the relationshi [...]">27313</a></p></div>
+
+  
+
+  <p>All drawing operations on an object which implements the <code id="compositing:canvascompositing"><a href="#canvascompositing">CanvasCompositing</a></code>
+  interface are affected by the global compositing attributes, <code id="compositing:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> and <code id="compositing:dom-context-2d-globalcompositeoperation-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code>.</p>
+
+  
+
+  <p>The <dfn id="dom-context-2d-globalalpha-2"><code>globalAlpha</code></dfn> attribute gives an
+  alpha value that is applied to shapes and images before they are composited onto the <a href="#output-bitmap" id="compositing:output-bitmap">output
+  bitmap</a>. The value must be in the range from 0.0 (fully transparent) to 1.0 (no additional
+  transparency). If an attempt is made to set the attribute to a value outside this range, including
+  Infinity and Not-a-Number (NaN) values, then the attribute must retain its previous value. When
+  the context is created, the <code id="compositing:dom-context-2d-globalalpha-2-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> attribute
+  must initially have the value 1.0.</p>
+
+  <p>The <dfn id="dom-context-2d-globalcompositeoperation-2"><code>globalCompositeOperation</code></dfn> attribute
+  sets the <dfn id="current-composition-operator">current composition operator</dfn>, which controls how shapes and images are drawn onto the
+  <a href="#output-bitmap" id="compositing:output-bitmap-2">output bitmap</a>, once they have had <code id="compositing:dom-context-2d-globalalpha-2-3"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> and the current transformation matrix
+  applied. The possible values are those defined in the Compositing and Blending specification, and
+  include the values <dfn id="gcop-source-over"><code>source-over</code></dfn>
+  and <dfn id="gcop-copy"><code>copy</code></dfn>.
+  <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a></p>
+
+  <p>These values are all case-sensitive — they must be used exactly as defined. User agents
+  must not recognize values that are not a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#case-sensitive" id="compositing:case-sensitive">case-sensitive</a> match for one of the values
+  given in the Compositing and Blending specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a></p>
+
+  <p>On setting, if the user agent does not recognize the specified value, it must be ignored,
+  leaving the value of <code id="compositing:dom-context-2d-globalcompositeoperation-2-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> unaffected.
+  Otherwise, the attribute must be set to the given new value.</p>
+
+  <p>When the context is created, the <code id="compositing:dom-context-2d-globalcompositeoperation-2-3"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> attribute must
+  initially have the value <code id="compositing:gcop-source-over"><a href="#gcop-source-over">source-over</a></code>.</p>
+
+  
+
+
+
+  <h6 id="image-smoothing"><span class="secno">4.12.5.1.17</span> Image smoothing<a class="self-link" href="#image-smoothing"/></h6>
+
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-imagesmoothingenabled"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns whether pattern fills and the <code id="image-smoothing:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method will attempt to smooth images if
+    their pixels don't line up exactly with the display, when scaling images up.</p>
+
+    <p>Can be set, to change whether images are smoothed (true) or not (false).</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-imagesmoothingquality"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current image-smoothing-quality preference.</p>
+
+    <p>Can be set, to change the preferred quality of image smoothing. The possible values are
+    &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-low"><a href="#dom-context-2d-imagesmoothingquality-low">low</a></code>&quot;, &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-medium"><a href="#dom-context-2d-imagesmoothingquality-medium">medium</a></code>&quot; and &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-high"><a href="#dom-context-2d-imagesmoothingquality-high">high</a></code>&quot;. Unknown values are ignored.</p>
+
+   </dd></dl>
+
+  
+
+  <p>Objects that implement the <code id="image-smoothing:canvasimagesmoothing"><a href="#canvasimagesmoothing">CanvasImageSmoothing</a></code> interface have attributes that
+  control how image smoothing is performed.</p>
+
+  <p>The <dfn id="dom-context-2d-imagesmoothingenabled-2"><code>imageSmoothingEnabled</code></dfn>
+  attribute, on getting, must return the last value it was set to. On setting, it must be set to the
+  new value. When the object implementing the <code id="image-smoothing:canvasimagesmoothing-2"><a href="#canvasimagesmoothing">CanvasImageSmoothing</a></code> interface is
+  created, the attribute must be set to true.</p>
+
+  <p>The <dfn id="dom-context-2d-imagesmoothingquality-2"><code>imageSmoothingQuality</code></dfn>
+  attribute, on getting, must return the last value it was set to. On setting, it must be set to the
+  new value. When the object implementing the <code id="image-smoothing:canvasimagesmoothing-3"><a href="#canvasimagesmoothing">CanvasImageSmoothing</a></code> interface is
+  created, the attribute must be set to &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-low-2"><a href="#dom-context-2d-imagesmoothingquality-low">low</a></code>&quot;.</p>
+
+  
+
+
+  <h6 id="shadows"><span class="secno">4.12.5.1.18</span> <dfn>Shadows</dfn><a class="self-link" href="#shadows"/></h6>
+
+  <p>All drawing operations on an object which implements the <code id="shadows:canvasshadowstyles"><a href="#canvasshadowstyles">CanvasShadowStyles</a></code>
+  interface are affected by the four global shadow attributes.</p>
+
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-shadowcolor"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current shadow color.</p>
+
+    <p>Can be set, to change the shadow color. Values that cannot be parsed as CSS colors are ignored.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-shadowoffsetx"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code> [ = <var>value</var> ]</dt><dt><var>context</var> . <code id="dom-context-2d-shadowoffsety"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current shadow offset.</p>
+
+    <p>Can be set, to change the shadow offset. Values that are not finite numbers are ignored.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-context-2d-shadowblur"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current level of blur applied to shadows.</p>
+
+    <p>Can be set, to change the blur level. Values that are not finite numbers greater than or
+    equal to zero are ignored.</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-context-2d-shadowcolor-2"><code>shadowColor</code></dfn> attribute sets the
+  color of the shadow.</p>
+
+  <p>When the context is created, the <code id="shadows:dom-context-2d-shadowcolor-2"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>
+  attribute initially must be fully-transparent black.</p>
+
+  <p>On getting, the <a href="#serialisation-of-a-color" id="shadows:serialisation-of-a-color">serialization of the color</a>
+  must be returned.</p>
+
+  <p>On setting, the new value must be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="shadows:parsed-as-a-css-color-value">parsed as a CSS &lt;color&gt; value</a> and the
+  color assigned. If the value cannot be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="shadows:parsed-as-a-css-color-value-2">parsed as a CSS &lt;color&gt; value</a> then it
+  must be ignored, and the attribute must retain its previous value. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a></p>
+
+  <p>The <dfn id="dom-context-2d-shadowoffsetx-2"><code>shadowOffsetX</code></dfn> and <dfn id="dom-context-2d-shadowoffsety-2"><code>shadowOffsetY</code></dfn> attributes specify the distance
+  that the shadow will be offset in the positive horizontal and positive vertical distance
+  respectively. Their values are in coordinate space units. They are not affected by the current
+  transformation matrix.</p>
+
+  <p>When the context is created, the shadow offset attributes must initially have the value
+  0.</p>
+
+  <p>On getting, they must return their current value. On setting, the attribute being set must be
+  set to the new value, except if the value is infinite or NaN, in which case the new value must be
+  ignored.</p>
+
+  <p>The <dfn id="dom-context-2d-shadowblur-2"><code>shadowBlur</code></dfn> attribute specifies
+  the level of the blurring effect. (The units do not map to coordinate space units, and are not
+  affected by the current transformation matrix.)</p>
+
+  <p>When the context is created, the <code id="shadows:dom-context-2d-shadowblur-2"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code>
+  attribute must initially have the value 0.</p>
+
+  <p>On getting, the attribute must return its current value. On setting the attribute must be set
+  to the new value, except if the value is negative, infinite or NaN, in which case the new value
+  must be ignored.</p>
+
+  <p><dfn id="when-shadows-are-drawn">Shadows are only drawn if</dfn> the opacity component of
+  the alpha component of the color of <code id="shadows:dom-context-2d-shadowcolor-2-2"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code> is
+  non-zero and either the <code id="shadows:dom-context-2d-shadowblur-2-2"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code> is non-zero, or
+  the <code id="shadows:dom-context-2d-shadowoffsetx-2"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code> is non-zero, or the <code id="shadows:dom-context-2d-shadowoffsety-2"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code> is non-zero.</p>
+
+  <p><a href="#when-shadows-are-drawn" id="shadows:when-shadows-are-drawn">When shadows are drawn</a>, they must be rendered as follows:</p>
+
+  <ol><li><p>Let <var>A</var> be an infinite transparent black bitmap on which the source
+   image for which a shadow is being created has been rendered.</p></li><li><p>Let <var>B</var> be an infinite transparent black bitmap, with a coordinate
+   space and an origin identical to <var>A</var>.</p></li><li><p>Copy the alpha channel of <var>A</var> to <var>B</var>, offset by <code id="shadows:dom-context-2d-shadowoffsetx-2-2"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code> in the positive <var>x</var>
+   direction, and <code id="shadows:dom-context-2d-shadowoffsety-2-2"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code> in the positive
+   <var>y</var> direction.</p></li><li>
+
+    <p>If <code id="shadows:dom-context-2d-shadowblur-2-3"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code> is greater than 0:</p>
+
+    <ol><li> <p>Let <var>σ</var> be half the value of <code id="shadows:dom-context-2d-shadowblur-2-4"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code>.</p></li><li> <p>Perform a 2D Gaussian Blur on <var>B</var>, using <var>σ</var>
+     as the standard deviation.</p>  </li></ol>
+
+    <p>User agents may limit values of <var>σ</var> to an implementation-specific
+    maximum value to avoid exceeding hardware limitations during the Gaussian blur operation.</p>
+
+   </li><li><p>Set the red, green, and blue components of every pixel in <var>B</var> to the
+   red, green, and blue components (respectively) of the color of <code id="shadows:dom-context-2d-shadowcolor-2-3"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>.</p></li><li><p>Multiply the alpha component of every pixel in <var>B</var> by the alpha
+   component of the color of <code id="shadows:dom-context-2d-shadowcolor-2-4"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>.</p></li><li><p>The shadow is in the bitmap <var>B</var>, and is rendered as part of the
+   <a href="#drawing-model" id="shadows:drawing-model">drawing model</a> described below.</p></li></ol>
+
+  
+
+  <p>If the current composition operation is <code id="shadows:gcop-copy"><a href="#gcop-copy">copy</a></code>, then shadows
+  effectively won't render (since the shape will overwrite the shadow).</p>
+
+  <h6 id="filters"><span class="secno">4.12.5.1.19</span> Filters<a class="self-link" href="#filters"/></h6>
+
+  <p>All drawing operations on an object which implements the <code id="filters:canvasfilters"><a href="#canvasfilters">CanvasFilters</a></code>
+  interface are affected by the global <dfn id="dom-context-2d-filter"><code>filter</code></dfn>
+  attribute.</p>
+
+  <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-filter-2"><a href="#dom-context-2d-filter">filter</a></code> [ = <var>value</var> ]</dt><dd>
+
+    <p>Returns the current filter.</p>
+
+    <p>Can be set, to change the filter. Values that cannot be parsed as a
+    <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list">&lt;filter-function-list&gt;</a> value are ignored.</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <code id="filters:dom-context-2d-filter"><a href="#dom-context-2d-filter">filter</a></code> attribute, on getting, must
+  return the last value it was successfully set to. The value must not be re-serialized. On setting,
+  if the new value is 'none' (not the empty string, null, or undefined), filters must be disabled
+  for the context. Otherwise, the value must be parsed as a
+  <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list-2">&lt;filter-function-list&gt;</a> value. If the value cannot be parsed as a
+  <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list-3">&lt;filter-function-list&gt;</a> value, where using property-independent style sheet
+  syntax like 'inherit' or 'initial' is considered an invalid value, then it must be ignored, and
+  the attribute must retain its previous value. When creating the object implementing the
+  <code id="filters:canvasfilters-2"><a href="#canvasfilters">CanvasFilters</a></code> interface, the attribute must be set to 'none'.</p>
+
+  <p>A <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list-4">&lt;filter-function-list&gt;</a> value consists of a sequence of one or more
+  filter functions or references to SVG filters. The input to the filter is used as the input
+  to the first item in the list. Subsequent items take the output of the previous item as
+  their input. <a href="https://html.spec.whatwg.org/multipage/references.html#refsFILTERS">[FILTERS]</a></p>
+
+  <p>Coordinates used in the value of the <code id="filters:dom-context-2d-filter-2"><a href="#dom-context-2d-filter">filter</a></code> attribute are interpreted such that one pixel is
+  equivalent to one SVG user space unit and to one canvas coordinate space unit. Filter coordinates
+  are not affected by the <a href="#transformations" id="filters:transformations">current transformation
+  matrix</a>. The current transformation matrix affects only the input to the filter. Filters
+  are applied in the <a href="#output-bitmap" id="filters:output-bitmap">output bitmap</a>'s coordinate space.</p>
+
+  <p>When the value of the <code id="filters:dom-context-2d-filter-3"><a href="#dom-context-2d-filter">filter</a></code> attribute defines
+  lengths using percentages or using <a data-x-internal="'em'" href="https://drafts.csswg.org/css-values/#em" id="filters:'em'">'em'</a> or <a data-x-internal="'ex'" href="https://drafts.csswg.org/css-values/#ex" id="filters:'ex'">'ex'</a> units, these must be
+  interpreted relative to the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="filters:computed-value">computed value</a> of the <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="filters:'font-size'">'font-size'</a> property
+  of the <a href="#font-style-source-object" id="filters:font-style-source-object">font style source object</a> at the time that the attribute is set, if it is an
+  element. If the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="filters:computed-value-2">computed values</a> are undefined for a
+  particular case (e.g. because the <a href="#font-style-source-object" id="filters:font-style-source-object-2">font style source object</a> is not an element or is
+  not <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="filters:being-rendered">being rendered</a>), then the relative keywords must be interpreted relative to the
+  default value of the <code id="filters:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code> attribute. The 'larger' and
+  'smaller' keywords are not supported.</p>
+
+  <p>If the value of the <code id="filters:dom-context-2d-filter-4"><a href="#dom-context-2d-filter">filter</a></code> attribute refers to an
+  SVG filter in the same document, and this SVG filter changes, then the changed filter is used for
+  the next draw operation.</p>
+
+  <p>If the value of the <code id="filters:dom-context-2d-filter-5"><a href="#dom-context-2d-filter">filter</a></code> attribute refers to an
+  SVG filter in an external resource document and that document is not loaded when a drawing
+  operation is invoked, then the drawing operation must proceed with no filtering.</p>
+
+  
+
+  <h6 id="working-with-externally-defined-svg-filters"><span class="secno">4.12.5.1.20</span> Working with externally-defined SVG filters<a class="self-link" href="#working-with-externally-defined-svg-filters"/></h6>
 
   <p><i>This section is non-normative.</i></p>
 
-  <p>When a canvas is interactive, authors should include focusable
-  elements in the element's fallback content corresponding to each
-  focusable part of the canvas, as in the <a href="#drawCustomFocusRingExample">example above</a>.</p>
+  <p>Since drawing is performed using filter value 'none' until an externally-defined
+  filter has finished loading, authors might wish to determine whether such a filter
+  has finished loading before proceeding with a drawing operation. One way to accomplish
+  this is to load the externally-defined filter elsewhere within the same page in some
+  element that sends a <code>load</code> event (for example, an <a data-x-internal="svg-use" href="https://www.w3.org/TR/SVG11/struct.html#UseElement" id="working-with-externally-defined-svg-filters:svg-use">SVG
+  <code>use</code></a> element), and wait for the <code>load</code> event to be
+  dispatched.</p>
 
-  <p>To indicate which focusable part of the canvas is currently
-  focused, authors should use the <code title="dom-context-2d-drawSystemFocusRing"><a href="#dom-context-2d-drawsystemfocusring">drawSystemFocusRing()</a></code>
-  method, passing it the element for which a ring is being drawn. This
-  method only draws the focus ring if the element is focused, so that
-  it can simply be called whenever drawing the element, without
+  
+
+  <h6 id="drawing-model"><span class="secno">4.12.5.1.21</span> <dfn>Drawing model</dfn><a class="self-link" href="#drawing-model"/></h6>
+
+  <p>When a shape or image is painted, user agents must follow these steps, in the order given (or
+  act as if they do):</p>
+
+  <ol><li><p>Render the shape or image onto an infinite transparent black bitmap, creating image <var>A</var>, as described in the previous sections. For shapes, the current fill, stroke,
+   and line styles must be honored, and the stroke must itself also be subjected to the current
+   transformation matrix.</p></li><li><p>When the filter attribute is set to a value other than 'none' and all the
+   externally-defined filters it references, if any, are in documents that are currently loaded,
+   then use image <var>A</var> as the input to the <code id="drawing-model:dom-context-2d-filter"><a href="#dom-context-2d-filter">filter</a></code>, creating image <var>B</var>. Otherwise, let
+   <var>B</var> be an alias for <var>A</var>.</p></li><li><p><a href="#when-shadows-are-drawn" id="drawing-model:when-shadows-are-drawn">When shadows are drawn</a>, render the shadow from image <var>B</var>,
+   using the current shadow styles, creating image <var>C</var>.</p></li><li><p><a href="#when-shadows-are-drawn" id="drawing-model:when-shadows-are-drawn-2">When shadows are drawn</a>, multiply the alpha component of every pixel in <var>C</var> by <code id="drawing-model:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code>.</p></li><li><p><a href="#when-shadows-are-drawn" id="drawing-model:when-shadows-are-drawn-3">When shadows are drawn</a>, composite <var>C</var> within the
+   <a href="#clipping-region" id="drawing-model:clipping-region">clipping region</a> over the current <a href="#output-bitmap" id="drawing-model:output-bitmap">output bitmap</a> using the <a href="#current-composition-operator" id="drawing-model:current-composition-operator">current
+   composition operator</a>.</p></li><li><p>Multiply the alpha component of every pixel in <var>B</var> by <code id="drawing-model:dom-context-2d-globalalpha-2-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code>.</p></li><li><p>Composite <var>B</var> within the <a href="#clipping-region" id="drawing-model:clipping-region-2">clipping region</a> over the current
+   <a href="#output-bitmap" id="drawing-model:output-bitmap-2">output bitmap</a> using the <a href="#current-composition-operator" id="drawing-model:current-composition-operator-2">current composition operator</a>.</p></li></ol>
+
+  <p>When compositing onto the <a href="#output-bitmap" id="drawing-model:output-bitmap-3">output bitmap</a>, pixels that would fall outside of the
+  <a href="#output-bitmap" id="drawing-model:output-bitmap-4">output bitmap</a> must be discarded.</p>
+
+  
+
+
+
+
+  <h6 id="best-practices"><span class="secno">4.12.5.1.22</span> Best practices<a class="self-link" href="#best-practices"/></h6>
+
+  <p>When a canvas is interactive, authors should include focusable elements in the element's
+  fallback content corresponding to each focusable part of the canvas, as in the <a href="#drawCustomFocusRingExample">example above</a>.</p>
+
+  <p>When rendering focus rings, to ensure that focus rings have the appearance of native focus
+  rings, authors should use the <code id="best-practices:dom-context-2d-drawfocusifneeded-2"><a href="#dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded()</a></code> method, passing it the
+  element for which a ring is being drawn. This method only draws the focus ring if the element is
+  <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="best-practices:focused">focused</a>, so that it can simply be called whenever drawing the element, without
   checking whether the element is focused or not first.</p>
 
-  <p>Authors should avoid implementing text editing controls using the
-  <code><a href="#the-canvas-element">canvas</a></code> element. Doing so has a large number of
-  disadvantages:</p>
+  <p>In addition to drawing focus rings, authors should use the <code id="best-practices:dom-context-2d-scrollpathintoview-2"><a href="#dom-context-2d-scrollpathintoview-2">scrollPathIntoView()</a></code> method when an element in
+  the canvas is focused, to make sure it is visible on the screen (if applicable).</p>
 
-  <ul><li>Mouse placement of the caret has to be reimplemented.</li>
+  <p id="no-text-editing-in-canvas-please">Authors should avoid implementing text editing controls
+  using the <code id="best-practices:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element. Doing so has a large number of disadvantages:</p>
 
-   <li>Keyboard movement of the caret has to be reimplemented (possibly across lines, for multiline text input).</li>
+  <ul><li>Mouse placement of the caret has to be reimplemented.</li><li>Keyboard movement of the caret has to be reimplemented (possibly across lines, for multiline
+   text input).</li><li>Scrolling of the text control has to be implemented (horizontally for long lines, vertically
+   for multiline input).</li><li>Native features such as copy-and-paste have to be reimplemented.</li><li>Native features such as spell-checking have to be reimplemented.</li><li>Native features such as drag-and-drop have to be reimplemented.</li><li>Native features such as page-wide text search have to be reimplemented.</li><li>Native features specific to the user, for example custom text services, have to be
+   reimplemented. This is close to impossible since each user might have different services
+   installed, and there is an unbounded set of possible such services.</li><li>Bidirectional text editing has to be reimplemented.</li><li>For multiline text editing, line wrapping has to be implemented for all relevant
+   languages.</li><li>Text selection has to be reimplemented.</li><li>Dragging of bidirectional text selections has to be reimplemented.</li><li>Platform-native keyboard shortcuts have to be reimplemented.</li><li>Platform-native input method editors (IMEs) have to be reimplemented.</li><li>Undo and redo functionality has to be reimplemented.</li><li>Accessibility features such as magnification following the caret or selection have to be
+   reimplemented.</li></ul>
 
-   <li>Scrolling of the text field has to be implemented (horizontally for long lines, vertically for multiline input).</li>
-
-   <li>Native features such as copy-and-paste have to be reimplemented.</li>
-
-   <li>Native features such as spell-checking have to be reimplemented.</li>
-
-   <li>Native features such as drag-and-drop have to be reimplemented.</li>
-
-   <li>Native features such as page-wide text search have to be reimplemented.</li>
-
-   <li>Native features specific to the user, for example custom text
-   services, have to be reimplemented. This is close to impossible
-   since each user might have different services installed, and there
-   is an unbounded set of possible such services.</li>
-
-   <li>Bidirectional text editing has to be reimplemented.</li>
-
-   <li>For multiline text editing, line wrapping has to be implemented for all relevant languages.</li>
-
-   <li>Text selection has to be reimplemented.</li>
-
-   <li>Dragging of bidirectional text selections has to be reimplemented.</li>
-
-   <li>Platform-native keyboard shortcuts have to be reimplemented.</li>
-
-   <li>Platform-native input method editors (IMEs) have to be reimplemented.</li>
-
-   <li>Undo and redo functionality has to be reimplemented.</li>
-
-   <li>Accessibility features such as magnification following the
-   caret or selection have to be reimplemented.</li>
-
-  </ul><p>This is a huge amount of work, and authors are most strongly
-  encouraged to avoid doing any of it by instead using the
-  <code><a href="#the-input-element">input</a></code> element, the <code><a href="#the-textarea-element">textarea</a></code> element, or
-  the <code title="attr-contenteditable"><a href="#attr-contenteditable">contenteditable</a></code>
-  attribute.</p>
+  <p>This is a huge amount of work, and authors are most strongly encouraged to avoid doing any of
+  it by instead using the <code id="best-practices:the-input-element"><a href="https://html.spec.whatwg.org/multipage/input.html#the-input-element">input</a></code> element, the <code id="best-practices:the-textarea-element"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#the-textarea-element">textarea</a></code> element, or the
+  <code id="best-practices:attr-contenteditable"><a href="https://html.spec.whatwg.org/multipage/interaction.html#attr-contenteditable">contenteditable</a></code> attribute.</p>
 
 
-  <h6 id="examples"><span class="secno">4.8.11.1.14 </span>Examples</h6>
+  <h6 id="examples"><span class="secno">4.12.5.1.23</span> Examples<a class="self-link" href="#examples"/></h6>
 
   <p><i>This section is non-normative.</i></p>
 
@@ -3554,140 +3744,835 @@
 
   </div>
 
+  <div class="example">
 
+   <p>The 2D rendering context for <code id="examples:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> is often used for sprite-based games. The
+   following example demonstrates this:</p>
 
-  </div><!--data-component-->
+   <iframe height="216" src="https://html.spec.whatwg.org/demos/canvas/blue-robot/index-idle.html" width="396"/>
 
-  <!--2DCONTEXT-->
+   <p>Here is the source for this example:</p>
 
-  <div class="impl">
-
-  <h5 id="color-spaces-and-color-correction"><span class="secno">4.8.11.2 </span>Color spaces and color correction</h5>
-
-  <p>The <code><a href="#the-canvas-element">canvas</a></code> APIs must perform color correction at
-  only two points: when rendering images with their own gamma
-  correction and color space information onto the canvas, to convert
-  the image to the color space used by the canvas (e.g. using the 2D
-  Context's <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code>
-  method with an <code><a href="#htmlimageelement">HTMLImageElement</a></code> object), and when
-  rendering the actual canvas bitmap to the output device.</p>
-
-  <p class="note">Thus, in the 2D context, colors used to draw shapes
-  onto the canvas will exactly match colors obtained through the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code>
-  method.</p>
-
-  <p>The <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method
-  must not include color space information in the resource
-  returned. Where the output format allows it, the color of pixels in
-  resources created by <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> must match those
-  returned by the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code>
-  method.</p>
-
-  <p>In user agents that support CSS, the color space used by a
-  <code><a href="#the-canvas-element">canvas</a></code> element must match the color space used for
-  processing any colors for that element in CSS.</p>
-
-  <p>The gamma correction and color space information of images must
-  be handled in such a way that an image rendered directly using an
-  <code><a href="#the-img-element">img</a></code> element would use the same colors as one painted on
-  a <code><a href="#the-canvas-element">canvas</a></code> element that is then itself
-  rendered. Furthermore, the rendering of images that have no color
-  correction information (such as those returned by the <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method) must be
-  rendered with no color correction.</p>
-
-  <p class="note">Thus, in the 2D context, calling the <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method to render
-  the output of the <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method to the
-  canvas, given the appropriate dimensions, has no visible effect.</p>
-
-  </div>
-
-
-  <div class="impl">
-
-  <h5 id="security-with-canvas-elements"><span class="secno">4.8.11.3 </span>Security with <code><a href="#the-canvas-element">canvas</a></code> elements</h5>
-
-  <p><strong>Information leakage</strong> can occur if scripts from
-  one <a href="#origin">origin</a> can access information (e.g. read pixels)
-  from images from another origin (one that isn't the <a href="#same-origin" title="same origin">same</a>).</p>
-
-  <p>To mitigate this, <code><a href="#the-canvas-element">canvas</a></code> elements are defined to
-  have a flag indicating whether they are <i>origin-clean</i>. All
-  <code><a href="#the-canvas-element">canvas</a></code> elements must start with their
-  <i>origin-clean</i> set to true. The flag must be set to false if
-  any of the following actions occur:</p>
-
-  <ul><li><p>The element's 2D context's <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method is
-   called with an <code><a href="#htmlimageelement">HTMLImageElement</a></code> or an
-   <code><a href="#htmlvideoelement">HTMLVideoElement</a></code> whose <a href="#origin">origin</a> is not the
-   <a href="#same-origin" title="same origin">same</a> as that of the
-   <code><a href="#document">Document</a></code> object that owns the <code><a href="#the-canvas-element">canvas</a></code>
-   element.</p></li>
-
-   <li><p>The element's 2D context's <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method is
-   called with an <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose
-   <i>origin-clean</i> flag is false.</p></li>
-
-   <li><p>The element's 2D context's <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> attribute is set
-   to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
-   <code><a href="#htmlimageelement">HTMLImageElement</a></code> or an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
-   whose <a href="#origin">origin</a> was not the <a href="#same-origin" title="same
-   origin">same</a> as that of the <code><a href="#document">Document</a></code> object
-   that owns the <code><a href="#the-canvas-element">canvas</a></code> element when the pattern was
-   created.</p></li>
-
-   <li><p>The element's 2D context's <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> attribute is set
-   to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
-   <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose <i>origin-clean</i> flag was
-   false when the pattern was created.</p></li>
-
-   <li><p>The element's 2D context's <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> attribute is
-   set to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
-   <code><a href="#htmlimageelement">HTMLImageElement</a></code> or an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
-   whose <a href="#origin">origin</a> was not the <a href="#same-origin" title="same
-   origin">same</a> as that of the <code><a href="#document">Document</a></code> object
-   that owns the <code><a href="#the-canvas-element">canvas</a></code> element when the pattern was
-   created.</p></li>
-
-   <li><p>The element's 2D context's <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> attribute is
-   set to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
-   <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose <i>origin-clean</i> flag was
-   false when the pattern was created.</p></li>
-
-   <li><p>The element's 2D context's <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText()</a></code> or <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">strokeText()</a></code> methods are
-   invoked and consider using a font that has an <a href="#origin">origin</a>
-   that is not the <a href="#same-origin" title="same origin">same</a> as that of
-   the <code><a href="#document">Document</a></code> object that owns the <code><a href="#the-canvas-element">canvas</a></code>
-   element. (The font doesn't even have to be used; all that matters
-   is whether the font was considered for any of the glyphs
-   drawn.)</p></li> <!-- because fonts could consider sensitive
-   material, I guess; and because that sensitivity could extend to
-   whether or not a particular glyph is in the font in the first
-   place. -->
-
-  </ul><p>Whenever the <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method of a
-  <code><a href="#the-canvas-element">canvas</a></code> element whose <i>origin-clean</i> flag is set to
-  false is called, the method must raise a <code><a href="#security_err">SECURITY_ERR</a></code>
-  exception.</p>
-
-  <p>Whenever the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> method of
-  the 2D context of a <code><a href="#the-canvas-element">canvas</a></code> element whose
-  <i>origin-clean</i> flag is set to false is called with otherwise
-  correct arguments, the method must raise a <code><a href="#security_err">SECURITY_ERR</a></code>
-  exception.</p>
-
-  <p>Whenever the <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code> method of
-  the 2D context of a <code><a href="#the-canvas-element">canvas</a></code> element ends up using a font
-  that has an <a href="#origin">origin</a> that is not the <a href="#same-origin" title="same
-  origin">same</a> as that of the <code><a href="#document">Document</a></code> object that
-  owns the <code><a href="#the-canvas-element">canvas</a></code> element, the method must raise a
-  <code><a href="#security_err">SECURITY_ERR</a></code> exception.</p>
-
-  <p class="note">Even resetting the canvas state by changing its
-  <code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code> or <code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code> attributes doesn't reset
-  the <i>origin-clean</i> flag.</p>
+   <pre>&lt;!DOCTYPE HTML&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;title&gt;Blue Robot Demo&lt;/title&gt;
+&lt;style&gt;
+  html { overflow: hidden; min-height: 200px; min-width: 380px; }
+  body { height: 200px; position: relative; margin: 8px; }
+  .buttons { position: absolute; bottom: 0px; left: 0px; margin: 4px; }
+&lt;/style&gt;
+&lt;canvas width=&quot;380&quot; height=&quot;200&quot;&gt;&lt;/canvas&gt;
+&lt;script&gt;
+ var Landscape = function (context, width, height) {
+   this.offset = 0;
+   this.width = width;
+   this.advance = function (dx) {
+     this.offset += dx;
+   };
+   this.horizon = height * 0.7;
+   // This creates the sky gradient (from a darker blue to white at the bottom)
+   this.sky = context.createLinearGradient(0, 0, 0, this.horizon);
+   this.sky.addColorStop(0.0, 'rgb(55,121,179)');
+   this.sky.addColorStop(0.7, 'rgb(121,194,245)');
+   this.sky.addColorStop(1.0, 'rgb(164,200,214)');
+   // this creates the grass gradient (from a darker green to a lighter green)
+   this.earth = context.createLinearGradient(0, this.horizon, 0, height);
+   this.earth.addColorStop(0.0, 'rgb(81,140,20)');
+   this.earth.addColorStop(1.0, 'rgb(123,177,57)');
+   this.paintBackground = function (context, width, height) {
+     // first, paint the sky and grass rectangles
+     context.fillStyle = this.sky;
+     context.fillRect(0, 0, width, this.horizon);
+     context.fillStyle = this.earth;
+     context.fillRect(0, this.horizon, width, height-this.horizon);
+     // then, draw the cloudy banner
+     // we make it cloudy by having the draw text off the top of the
+     // canvas, and just having the blurred shadow shown on the canvas
+     context.save();
+     context.translate(width-((this.offset+(this.width*3.2)) % (this.width*4.0))+0, 0);
+     context.shadowColor = 'white';
+     context.shadowOffsetY = 30+this.horizon/3; // offset down on canvas
+     context.shadowBlur = '5';
+     context.fillStyle = 'white';
+     context.textAlign = 'left';
+     context.textBaseline = 'top';
+     context.font = '20px sans-serif';
+     context.fillText('WHATWG ROCKS', 10, -30); // text up above canvas
+     context.restore();
+     // then, draw the background tree
+     context.save();
+     context.translate(width-((this.offset+(this.width*0.2)) % (this.width*1.5))+30, 0);
+     context.beginPath();
+     context.fillStyle = 'rgb(143,89,2)';
+     context.lineStyle = 'rgb(10,10,10)';
+     context.lineWidth = 2;
+     context.rect(0, this.horizon+5, 10, -50); // trunk
+     context.fill();
+     context.stroke();
+     context.beginPath();
+     context.fillStyle = 'rgb(78,154,6)';
+     context.arc(5, this.horizon-60, 30, 0, Math.PI*2); // leaves
+     context.fill();
+     context.stroke();
+     context.restore();
+   };
+   this.paintForeground = function (context, width, height) {
+     // draw the box that goes in front
+     context.save();
+     context.translate(width-((this.offset+(this.width*0.7)) % (this.width*1.1))+0, 0);
+     context.beginPath();
+     context.rect(0, this.horizon - 5, 25, 25);
+     context.fillStyle = 'rgb(220,154,94)';
+     context.lineStyle = 'rgb(10,10,10)';
+     context.lineWidth = 2;
+     context.fill();
+     context.stroke();
+     context.restore();
+   };
+ };
+&lt;/script&gt;
+&lt;script&gt;
+ var BlueRobot = function () {
+   this.sprites = new Image();
+   this.sprites.src = 'blue-robot.png'; // this sprite sheet has 8 cells
+   this.targetMode = 'idle';
+   this.walk = function () {
+     this.targetMode = 'walk';
+   };
+   this.stop = function () {
+     this.targetMode = 'idle';
+   };
+   this.frameIndex = {
+     'idle': [0], // first cell is the idle frame
+     'walk': [1,2,3,4,5,6], // the walking animation is cells 1-6
+     'stop': [7], // last cell is the stopping animation
+   };
+   this.mode = 'idle';
+   this.frame = 0; // index into frameIndex
+   this.tick = function () {
+     // this advances the frame and the robot
+     // the return value is how many pixels the robot has moved
+     this.frame += 1;
+     if (this.frame &gt;= this.frameIndex[this.mode].length) {
+       // we've reached the end of this animation cycle
+       this.frame = 0;
+       if (this.mode != this.targetMode) {
+         // switch to next cycle
+         if (this.mode == 'walk') {
+           // we need to stop walking before we decide what to do next
+           this.mode = 'stop';
+         } else if (this.mode == 'stop') {
+           if (this.targetMode == 'walk')
+             this.mode = 'walk';
+           else
+             this.mode = 'idle';
+         } else if (this.mode == 'idle') {
+           if (this.targetMode == 'walk')
+             this.mode = 'walk';
+         }
+       }
+     }
+     if (this.mode == 'walk')
+       return 8;
+     return 0;
+   },
+   this.paint = function (context, x, y) {
+     if (!this.sprites.complete) return;
+     // draw the right frame out of the sprite sheet onto the canvas
+     // we assume each frame is as high as the sprite sheet
+     // the x,y coordinates give the position of the bottom center of the sprite
+     context.drawImage(this.sprites,
+                       this.frameIndex[this.mode][this.frame] * this.sprites.height, 0, this.sprites.height, this.sprites.height,
+                       x-this.sprites.height/2, y-this.sprites.height, this.sprites.height, this.sprites.height);
+   };
+ };
+&lt;/script&gt;
+&lt;script&gt;
+ var canvas = document.getElementsByTagName('canvas')[0];
+ var context = canvas.getContext('2d');
+ var landscape = new Landscape(context, canvas.width, canvas.height);
+ var blueRobot = new BlueRobot();
+ // paint when the browser wants us to, using requestAnimationFrame()
+ function paint() {
+   context.clearRect(0, 0, canvas.width, canvas.height);
+   landscape.paintBackground(context, canvas.width, canvas.height);
+   blueRobot.paint(context, canvas.width/2, landscape.horizon*1.1);
+   landscape.paintForeground(context, canvas.width, canvas.height);
+   requestAnimationFrame(paint);
+ }
+ paint();
+ // but tick every 150ms, so that we don't slow down when we don't paint
+ setInterval(function () {
+   var dx = blueRobot.tick();
+   landscape.advance(dx);
+ }, 100);
+&lt;/script&gt;
+&lt;p class=&quot;buttons&quot;&gt;
+ &lt;input type=button value=&quot;Walk&quot; onclick=&quot;blueRobot.walk()&quot;&gt;
+ &lt;input type=button value=&quot;Stop&quot; onclick=&quot;blueRobot.stop()&quot;&gt;
+&lt;footer&gt;
+ &lt;small&gt; Blue Robot Player Sprite by &lt;a href=&quot;https://johncolburn.deviantart.com/&quot;&gt;JohnColburn&lt;/a&gt;.
+ Licensed under the terms of the Creative Commons Attribution Share-Alike 3.0 Unported license.&lt;/small&gt;
+ &lt;small&gt; This work is itself licensed under a &lt;a rel=&quot;license&quot; href=&quot;https://creativecommons.org/licenses/by-sa/3.0/&quot;&gt;Creative
+ Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;/small&gt;
+&lt;/footer&gt;
+</pre>
 
   </div>
 
 
 
-  </body></html>
+
+  <h5 id="the-imagebitmap-rendering-context"><span class="secno">4.12.5.2</span> The <code id="the-imagebitmap-rendering-context:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> rendering context<a class="self-link" href="#the-imagebitmap-rendering-context"/></h5>
+
+  <h6 id="introduction-6"><span class="secno">4.12.5.2.1</span> Introduction<a class="self-link" href="#introduction-6"/></h6>
+
+  <p><code id="introduction-6:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> is a performance-oriented interface that provides a
+  low overhead method for displaying the contents of <code id="introduction-6:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> objects. It uses
+  transfer semantics to reduce overall memory consumption. It also streamlines performance by
+  avoiding intermediate compositing, unlike the <code id="introduction-6:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method of
+  <code id="introduction-6:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>.</p>
+
+  <p>Using an <code id="introduction-6:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> element as an intermediate for getting an image resource into a
+  canvas, for example, would result in two copies of the decoded image existing in memory at the
+  same time: the <code id="introduction-6:the-img-element-2"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> element's copy, and the one in the canvas's backing store. This
+  memory cost can be prohibitive when dealing with extremely large images. This can be avoided by
+  using <code id="introduction-6:imagebitmaprenderingcontext-2"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code>.</p>
+
+  <div class="example">
+   <p>Using <code id="introduction-6:imagebitmaprenderingcontext-3"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code>, here is how to transcode an image to the JPEG
+   format in a memory- and CPU-efficient way:</p>
+
+   <pre>createImageBitmap(inputImageBlob).then(image =&gt; {
+  const canvas = document.createElement('canvas');
+  const context = canvas.getContext('bitmaprenderer');
+  context.transferFromImageBitmap(image);
+
+  canvas.toBlob(outputJPEGBlob =&gt; {
+    // Do something with outputJPEGBlob.
+  }, 'image/jpeg');
+});</pre>
+  </div>
+
+  <h6 id="the-imagebitmaprenderingcontext-interface"><span class="secno">4.12.5.2.2</span> The <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> interface<a class="self-link" href="#the-imagebitmaprenderingcontext-interface"/></h6>
+
+  <pre class="idl">[Exposed=Window]
+interface <dfn id="imagebitmaprenderingcontext">ImageBitmapRenderingContext</dfn> {
+  readonly attribute <a href="#htmlcanvaselement" id="the-imagebitmaprenderingcontext-interface:htmlcanvaselement">HTMLCanvasElement</a> <a href="#dom-imagebitmaprenderingcontext-canvas-2" id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-canvas-2">canvas</a>;
+  void <a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2" id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap</a>(ImageBitmap? bitmap);
+};
+
+dictionary <dfn id="imagebitmaprenderingcontextsettings">ImageBitmapRenderingContextSettings</dfn> {
+  boolean <a href="#dom-imagebitmaprenderingcontextsettings-alpha" id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontextsettings-alpha">alpha</a> = true;
+};</pre>
+
+  <dl class="domintro"><dt><var>context</var> = <var>canvas</var> . <code id="the-imagebitmaprenderingcontext-interface:dom-canvas-getcontext-2"><a href="#dom-canvas-getcontext-2">getContext</a></code>('bitmaprenderer' [, { [ <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontextsettings-alpha-2"><a href="#dom-imagebitmaprenderingcontextsettings-alpha">alpha</a></code>: false ] } ] )</dt><dd>
+
+    <p>Returns an <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-2"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object that is permanently bound to a
+    particular <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element.</p>
+
+    <p>If the <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontextsettings-alpha-3"><a href="#dom-imagebitmaprenderingcontextsettings-alpha">alpha</a></code> setting is
+    provided and set to false, then the canvas is forced to always be opaque.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-imagebitmaprenderingcontext-canvas"><a href="#dom-imagebitmaprenderingcontext-canvas-2">canvas</a></code></dt><dd>
+
+    <p>Returns the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element that the context is bound to.</p>
+
+   </dd><dt><var>context</var> . <code id="dom-imagebitmaprenderingcontext-transferfromimagebitmap"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap</a></code>(imageBitmap)</dt><dd>
+
+    <p>Transfers the underlying <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data">bitmap data</a>
+    from <var>imageBitmap</var> to <var>context</var>, and the bitmap becomes the contents of the
+    <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element to which <var>context</var> is bound.</p>
+
+   </dd><dt><var>context</var> . <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2-2"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap</a></code>(
+   null)</dt><dd>
+
+    <p>Replaces contents of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element to which <var>context</var>
+    is bound with a transparent black bitmap whose size corresponds to the <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> and <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-height"><a href="#attr-canvas-height">height</a></code>
+    content attributes of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code> element.</p>
+
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-imagebitmaprenderingcontext-canvas-2"><code>canvas</code></dfn> attribute
+  must return the value it was initialized to when the object was created.</p>
+
+  <p>An <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-3"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object has an <dfn id="concept-imagebitmaprenderingcontext-output-bitmap">output bitmap</dfn>, which is a
+  reference to <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-2">bitmap data</a>.</p>
+
+  <p>An <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-4"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object has a <dfn id="concept-imagebitmaprenderingcontext-bitmap-mode">bitmap mode</dfn>, which can be set to
+  <dfn id="concept-imagebitmaprenderingcontext-valid">valid</dfn> or <dfn id="concept-imagebitmaprenderingcontext-blank">blank</dfn>. A value of <a href="#concept-imagebitmaprenderingcontext-valid" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-valid">valid</a> indicates that the context's
+  <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap">output bitmap</a> refers to
+  <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-3">bitmap data</a> that was acquired via <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2-3"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap()</a></code>.
+  A value <a href="#concept-imagebitmaprenderingcontext-blank" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-blank">blank</a> indicates that the
+  context's <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-2">output
+  bitmap</a> is a default transparent bitmap.</p>
+
+  <p>An <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-5"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object also has an <dfn id="concept-imagebitmaprenderingcontext-alpha">alpha</dfn> flag, which can be set to true or
+  false. When an <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-6"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object has its <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha">alpha</a> flag set to false, the contents
+  of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code> element to which the context is bound are obtained by
+  compositing the context's <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-3">output bitmap</a> onto an opaque
+  black bitmap of the same size using the source-over composite operation. If the <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha-2">alpha</a> flag is set to true, then the
+  <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-4">output bitmap</a> is used
+  as the contents of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-7"><a href="#the-canvas-element">canvas</a></code> element to which the context is bound. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a></p>
+
+  <p class="note">The step of compositing over an opaque black bitmap ought to be elided whenever
+  equivalent results can be obtained more efficiently by other means.</p>
+
+  <hr/>
+
+  <p>When a user agent is required to <dfn id="set-an-imagebitmaprenderingcontext's-output-bitmap">set an <code>ImageBitmapRenderingContext</code>'s output
+  bitmap</dfn>, with a <var>context</var> argument that is an
+  <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-7"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object and an optional argument <var>bitmap</var> that
+  refers to <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-4">bitmap data</a>, it must run these
+  steps:</p>
+
+  <ol><li><p>If a <var>bitmap</var> argument was not provided, then:</p>
+
+    <ol><li><p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-bitmap-mode" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-bitmap-mode">bitmap mode</a> to <a href="#concept-imagebitmaprenderingcontext-blank" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-blank-2">blank</a>.</p></li><li><p>Let <var>canvas</var> be the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-8"><a href="#the-canvas-element">canvas</a></code> element to which <var>context</var>
+     is bound.</p></li><li><p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-5">output bitmap</a> to be fully
+     transparent black with an <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="the-imagebitmaprenderingcontext-interface:intrinsic-width">intrinsic width</a> equal to the numeric value of
+     <var>canvas</var>'s <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-width-2"><a href="#attr-canvas-width">width</a></code> attribute and an
+     <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="the-imagebitmaprenderingcontext-interface:intrinsic-height">intrinsic height</a> equal to the numeric value of <var>canvas</var>'s <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-height-2"><a href="#attr-canvas-height">height</a></code> attribute, those values being interpreted in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="the-imagebitmaprenderingcontext-interface:'px'">CSS pixels</a>.</p></li><li><p>Set the <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-6">output bitmap</a>'s <a href="#concept-canvas-origin-clean" id="the-imagebitmaprenderingcontext-interface:concept-canvas-origin-clean">origin-clean</a> flag to true.</p></li></ol>
+
+   </li><li><p>If a <var>bitmap</var> argument was provided, then:</p>
+
+    <ol><li><p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-bitmap-mode" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-bitmap-mode-2">bitmap mode</a> to <a href="#concept-imagebitmaprenderingcontext-valid" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-valid-2">valid</a>.</p></li><li>
+      <p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-7">output bitmap</a> to refer
+      to the same underlying bitmap data as <var>bitmap</var>, without making a copy.</p>
+
+      <p class="note">The <a href="#concept-canvas-origin-clean" id="the-imagebitmaprenderingcontext-interface:concept-canvas-origin-clean-2">origin-clean</a> flag of
+      <var>bitmap</var> is included in the bitmap data to be referenced by <var>context</var>'s
+      <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-8">output bitmap</a>.</p>
+     </li></ol>
+
+   </li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="imagebitmaprenderingcontext-creation-algorithm"><code>ImageBitmapRenderingContext</code> creation algorithm</dfn>, which is passed a
+  <var>target</var> (a <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-9"><a href="#the-canvas-element">canvas</a></code> element) and optionally some arguments, consists of
+  running the following steps:</p>
+
+  <ol><li><p>If the algorithm was passed some arguments, then let <var>arg</var> be the first such
+   argument. Otherwise, let <var>arg</var> be undefined.</p></li><li><p>Let <var>settings</var> be the result of <a href="#coerce-context-arguments-for-imagebitmaprenderingcontext" id="the-imagebitmaprenderingcontext-interface:coerce-context-arguments-for-imagebitmaprenderingcontext">coercing the <var>arg</var> context arguments for
+   <code>ImageBitmapRenderingContext</code></a>.</p></li><li><p>Create a new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-8"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object.</p></li><li><p>Initialize its <code id="the-imagebitmaprenderingcontext-interface:dom-context-2d-canvas-2"><a href="#dom-context-2d-canvas-2">canvas</a></code> attribute to point to
+   <var>target</var>.</p></li><li><p>Let the new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-9"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object's <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-9">output bitmap</a> and
+   <var>target</var>'s bitmap be a shared reference to the same bitmap.</p></li><li><p>Run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-imagebitmaprenderingcontext-interface:set-an-imagebitmaprenderingcontext's-output-bitmap">set an <code>ImageBitmapRenderingContext</code>'s output
+   bitmap</a>, using the new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-10"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object as the
+   <var>context</var> argument, and with no <var>bitmap</var> argument.</p></li><li><p>Initialize <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha-3">alpha</a> flag to true.
+
+   </p></li><li>
+
+    <p>Process each of the members of <var>settings</var> as follows:</p>
+
+    <dl><dt><dfn id="dom-imagebitmaprenderingcontextsettings-alpha"><code>alpha</code></dfn></dt><dd>If false, then set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha-4">alpha</a> flag to false.</dd></dl>
+
+   </li><li><p>Return the new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-11"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object.</p></li></ol>
+
+  <hr/>
+
+  <p>When a user agent is required to <dfn id="coerce-context-arguments-for-imagebitmaprenderingcontext">coerce context arguments for
+  <code>ImageBitmapRenderingContext</code></dfn>, it must run these steps:</p>
+
+  <ol><li><p>Let <var>input</var> be the argument to coerce.</p></li><li><p>Let <var>jsval</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="the-imagebitmaprenderingcontext-interface:concept-idl-convert">converting</a> <var>input</var> to a JavaScript value. (This can
+   throw an exception.)</p></li><li><p>Let <var>dict</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="the-imagebitmaprenderingcontext-interface:concept-idl-convert-2">converting</a>
+   <var>jsval</var> to the dictionary type <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontextsettings"><a href="#imagebitmaprenderingcontextsettings">ImageBitmapRenderingContextSettings</a></code>. (This
+   can throw an exception.)</p></li><li><p>Return <var>dict</var>.</p></li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="dom-imagebitmaprenderingcontext-transferfromimagebitmap-2"><code>transferFromImageBitmap(<var>imageBitmap</var>)</code></dfn>
+  method, when invoked, must run these steps:</p>
+
+  <ol><li><p>Let <var>bitmapContext</var> be the <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-12"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object on
+   which the <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2-4"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap()</a></code>
+   method was called.</p></li><li><p>If <var>imageBitmap</var> is null, then run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-imagebitmaprenderingcontext-interface:set-an-imagebitmaprenderingcontext's-output-bitmap-2">set an
+   ImageBitmapRenderingContext's output bitmap</a>, with <var>bitmapContext</var> as the
+   <var>context</var> argument and no <var>bitmap</var> argument, then abort these steps.</p></li><li><p>If the value of <var>imageBitmap</var>'s <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-imagebitmaprenderingcontext-interface:detached">[[Detached]]</a> internal slot is set to
+   true, then throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-imagebitmaprenderingcontext-interface:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-imagebitmaprenderingcontext-interface:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and
+   abort these steps.</p></li><li><p>Run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-imagebitmaprenderingcontext-interface:set-an-imagebitmaprenderingcontext's-output-bitmap-3">set an <code>ImageBitmapRenderingContext</code>'s output
+   bitmap</a>, with the <var>context</var> argument equal to <var>bitmapContext</var>, and the
+   <var>bitmap</var> argument referring to <var>imageBitmap</var>'s underlying <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-5">bitmap data</a>.
+
+   </p></li><li><p>Set the value of <var>imageBitmap</var>'s <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-imagebitmaprenderingcontext-interface:detached-2">[[Detached]]</a> internal slot to
+   true.</p></li><li><p>Unset <var>imageBitmap's</var> <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-6">bitmap
+   data</a>.</p></li></ol>
+
+  
+
+
+
+
+  <h5 id="the-offscreencanvas-interface"><span class="secno">4.12.5.3</span> The <code id="the-offscreencanvas-interface:offscreencanvas"><a href="#offscreencanvas">OffscreenCanvas</a></code> interface<a class="self-link" href="#the-offscreencanvas-interface"/></h5><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="support"><strong>Support:</strong> offscreencanvas<span class="and_chr no"><span>Chrome for Android</span> <span>None</span></span><span class="chrome no"><span>Chrome</span> <span>None</span></span><span class="and_uc no"><span>UC Browser for Android</span> <span>None</span></span><span class="ios_saf no"><span>iOS Safari</span> <span>None</span></span><span class="firefox no"><span>Firefox</span> <span>None</span></span><span class="ie no"><span>IE</span> <span>None</span></span><span class="samsung no"><span>Samsung Internet</span> <span>None</span></span><span class="op_mini no"><span>Opera Mini</span> <span>None</span></span><span class="safari no"><span>Safari</span> <span>None</span></span><span class="android no"><span>Android Browser</span> <span>None</span></span><span class="opera no"><span>Opera</span> <span>None</span></span><span class="edge no"><span>Edge</span> <span>None</span></span></p><p class="caniuse">Source: <a href="https://caniuse.com/#feat=offscreencanvas">caniuse.com</a></p></div>
+
+  <pre class="idl">typedef (<a href="#offscreencanvasrenderingcontext2d" id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a> or
+        <a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext" id="the-offscreencanvas-interface:webglrenderingcontext">WebGLRenderingContext</a>) <dfn id="offscreenrenderingcontext">OffscreenRenderingContext</dfn>;
+
+dictionary <dfn id="imageencodeoptions">ImageEncodeOptions</dfn> {
+  DOMString <a href="#image-encode-options-type" id="the-offscreencanvas-interface:image-encode-options-type">type</a> = &quot;image/png&quot;;
+  unrestricted double <a href="#image-encode-options-quality" id="the-offscreencanvas-interface:image-encode-options-quality">quality</a> = 1.0;
+};
+
+enum <dfn id="offscreenrenderingcontexttype">OffscreenRenderingContextType</dfn> { &quot;<a href="#offscreen-context-type-2d" id="the-offscreencanvas-interface:offscreen-context-type-2d">2d</a>&quot;, &quot;<a href="#offscreen-context-type-webgl" id="the-offscreencanvas-interface:offscreen-context-type-webgl">webgl</a>&quot; };
+
+[<a href="#dom-offscreencanvas-2" id="the-offscreencanvas-interface:dom-offscreencanvas-2">Constructor</a>([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height), Exposed=(Window,Worker), <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transferable" id="the-offscreencanvas-interface:transferable">Transferable</a>]
+interface <dfn id="offscreencanvas">OffscreenCanvas</dfn> : <a data-x-internal="eventtarget" href="https://dom.spec.whatwg.org/#interface-eventtarget" id="the-offscreencanvas-interface:eventtarget">EventTarget</a> {
+  attribute unsigned long long <a href="#dom-offscreencanvas-width-2" id="the-offscreencanvas-interface:dom-offscreencanvas-width-2">width</a>;
+  attribute unsigned long long <a href="#dom-offscreencanvas-height-2" id="the-offscreencanvas-interface:dom-offscreencanvas-height-2">height</a>;
+
+  <a href="#offscreenrenderingcontext" id="the-offscreencanvas-interface:offscreenrenderingcontext">OffscreenRenderingContext</a>? <a href="#dom-offscreencanvas-getcontext-2" id="the-offscreencanvas-interface:dom-offscreencanvas-getcontext-2">getContext</a>(<a href="#offscreenrenderingcontexttype" id="the-offscreencanvas-interface:offscreenrenderingcontexttype">OffscreenRenderingContextType</a> contextType, any... arguments);
+  <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap" id="the-offscreencanvas-interface:imagebitmap">ImageBitmap</a> <a href="#dom-offscreencanvas-transfertoimagebitmap-2" id="the-offscreencanvas-interface:dom-offscreencanvas-transfertoimagebitmap-2">transferToImageBitmap</a>();
+  Promise&lt;<a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob" id="the-offscreencanvas-interface:blob">Blob</a>&gt; <a href="#dom-offscreencanvas-converttoblob-2" id="the-offscreencanvas-interface:dom-offscreencanvas-converttoblob-2">convertToBlob</a>(optional <a href="#imageencodeoptions" id="the-offscreencanvas-interface:imageencodeoptions">ImageEncodeOptions</a> options);
+};
+</pre>
+
+  <p><code id="the-offscreencanvas-interface:offscreencanvas-2"><a href="#offscreencanvas">OffscreenCanvas</a></code> objects are used to create rendering contexts, much like an
+  <code id="the-offscreencanvas-interface:htmlcanvaselement"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, but with no connection to the DOM. This makes it possible to
+  use canvas rendering contexts in <a href="https://html.spec.whatwg.org/multipage/workers.html#workers">workers</a>.</p>
+
+  <p>An <code id="the-offscreencanvas-interface:offscreencanvas-3"><a href="#offscreencanvas">OffscreenCanvas</a></code> object may hold a weak reference to a <dfn id="offscreencanvas-placeholder">placeholder <code>canvas</code> element</dfn>, which is
+  typically in the DOM, whose embedded content is provided by the <code id="the-offscreencanvas-interface:offscreencanvas-4"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+  object. The bitmap of the <code id="the-offscreencanvas-interface:offscreencanvas-5"><a href="#offscreencanvas">OffscreenCanvas</a></code> object is pushed to the <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder">placeholder <code>canvas</code> element</a> by
+  calling the <dfn id="offscreencontext-commit"><code>commit()</code></dfn> method of the
+  <code id="the-offscreencanvas-interface:offscreencanvas-6"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's rendering context. All rendering context types that
+  can be created by an <code id="the-offscreencanvas-interface:offscreencanvas-7"><a href="#offscreencanvas">OffscreenCanvas</a></code> object must implement a <code id="the-offscreencanvas-interface:offscreencontext-commit"><a href="#offscreencontext-commit">commit()</a></code> method. The exact behavior of the commit
+  method (e.g. whether it copies or transfers bitmaps) may vary, as defined by the rendering
+  contexts' respective specifications. Only the <a href="#offscreencanvasrenderingcontext2d" id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d-2">2D context for offscreen canvases</a> is defined
+  in this specification.</p>
+
+  <dl class="domintro"><dt><var>offscreenCanvas</var> = new <code id="dom-offscreencanvas"><a href="#dom-offscreencanvas-2">OffscreenCanvas</a></code>(<var>width</var>,
+   <var>height</var>)</dt><dt>
+
+   </dt><dd>
+
+    <p>Returns a new <code id="the-offscreencanvas-interface:offscreencanvas-8"><a href="#offscreencanvas">OffscreenCanvas</a></code> object that is not linked to a <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-2">placeholder <code>canvas</code> element</a>, and
+    whose bitmap's size is determined by the <var>width</var> and <var>height</var> arguments.</p>
+
+   </dd><dt><var>context</var> = <var>offscreenCanvas</var> . <code id="dom-offscreencanvas-getcontext"><a href="#dom-offscreencanvas-getcontext-2">getContext</a></code>(<var>contextType</var> [, ... ] )</dt><dd>
+
+    <p>Returns an object that exposes an API for drawing on the <code id="the-offscreencanvas-interface:offscreencanvas-9"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+    object. The first argument specifies the desired API, either &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-2d-2"><a href="#offscreen-context-type-2d">2d</a></code>&quot;, or &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-2"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot;. Subsequent arguments are handled by that
+    API.</p>
+
+    <p>This specification defines the &quot;<code id="the-offscreencanvas-interface:canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot; context below,
+    which is similar but distinct from the &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-2d-3"><a href="#offscreen-context-type-2d">2d</a></code>&quot;
+    context that is created from a <code id="the-offscreencanvas-interface:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element. There is also a specification that
+    defines a &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-3"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot; context.
+    <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+    <p>Returns null if the canvas has already been initialized with another context type (e.g.
+    trying to get a &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-2d-4"><a href="#offscreen-context-type-2d">2d</a></code>&quot; context after getting a
+    &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-4"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot; context).</p>
+
+   </dd></dl>
+
+  
+
+  <p>An <code id="the-offscreencanvas-interface:offscreencanvas-10"><a href="#offscreencanvas">OffscreenCanvas</a></code> object has an internal <dfn id="offscreencanvas-bitmap">bitmap</dfn> that is initialized when the object
+  is created. The width and height of the <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap">bitmap</a> are
+  equal to the values of the <code id="the-offscreencanvas-interface:dom-offscreencanvas-width-2-2"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreencanvas-interface:dom-offscreencanvas-height-2-2"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes of the <code id="the-offscreencanvas-interface:offscreencanvas-11"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+  object. Initially, all the bitmap's pixels are transparent black.</p>
+
+  <p>An <code id="the-offscreencanvas-interface:offscreencanvas-12"><a href="#offscreencanvas">OffscreenCanvas</a></code> object can have a rendering context bound to it. Initially,
+  it does not have a bound rendering context. To keep track of whether it has a rendering context
+  or not, and what kind of rendering context it is, an <code id="the-offscreencanvas-interface:offscreencanvas-13"><a href="#offscreencanvas">OffscreenCanvas</a></code> object also
+  has a <dfn id="offscreencanvas-context-mode">context mode</dfn>, which is initially <dfn id="offscreencanvas-context-none">none</dfn> but can be changed to either <dfn id="offscreencanvas-context-2d">2d</dfn>, <dfn id="offscreencanvas-context-webgl">webgl</dfn> or <dfn id="offscreencanvas-context-detached">detached</dfn> by algorithms defined in this
+  specification.</p>
+
+  <p>The constructor <dfn id="dom-offscreencanvas-2"><code>OffscreenCanvas(<var>width</var>,
+  <var>height</var>)</code></dfn>, when invoked, must create a new <code id="the-offscreencanvas-interface:offscreencanvas-14"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+  object with its <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-2">bitmap</a> initialized to a rectangular
+  array of transparent black pixels of the dimensions specified by <var>width</var> and
+  <var>height</var>; and its <code id="the-offscreencanvas-interface:dom-offscreencanvas-width-2-3"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreencanvas-interface:dom-offscreencanvas-height-2-3"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes initialized to <var>width</var> and
+  <var>height</var> respectively.</p>
+
+  <hr/>
+
+  <p><code id="the-offscreencanvas-interface:offscreencanvas-15"><a href="#offscreencanvas">OffscreenCanvas</a></code> objects are <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transferable-objects" id="the-offscreencanvas-interface:transferable-objects">transferable</a>. Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transfer-steps" id="the-offscreencanvas-interface:transfer-steps">transfer steps</a>, given <var>value</var> and
+  <var>dataHolder</var>, are as follows:</p>
+
+  <ol><li><p>If <var>value</var>'s <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode">context mode</a> is
+   not equal to <a href="#offscreencanvas-context-none" id="the-offscreencanvas-interface:offscreencanvas-context-none">none</a>, then throw an
+   <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>Set <var>value</var>'s <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-2">context mode</a> to
+   <a href="#offscreencanvas-context-detached" id="the-offscreencanvas-interface:offscreencanvas-context-detached">detached</a>.</p></li><li><p>Let <var>width</var> and <var>height</var> be the dimensions of <var>value</var>'s <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-3">bitmap</a>.</p></li><li><p>Unset <var>value</var>'s <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-4">bitmap</a>.</p></li><li><p>Set <var>dataHolder</var>.[[With]] to <var>width</var>, and
+   <var>dataHolder</var>.[[Height]] to <var>height</var>.</p></li><li><p>Set <var>dataHolder</var>.[[PlaceholderCanvas]] to be a weak reference to
+   <var>value</var>'s <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-3">placeholder <code>canvas</code>
+   element</a>, if <var>value</var> has one, or null if it does not.</p></li></ol>
+
+  <p>Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transfer-receiving-steps" id="the-offscreencanvas-interface:transfer-receiving-steps">transfer-receiving steps</a>, given <var>dataHolder</var> and <var>value</var>,
+  are:</p>
+
+  <ol><li><p>Initialize <var>value</var>'s <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-5">bitmap</a> to a
+   rectangular array of transparent black pixels with width given by <var>dataHolder</var>.[[Width]]
+   and height given by <var>dataHolder</var>.[[Height]].</p></li><li><p>If <var>dataHolder</var>.[[PlaceholderCanvas]] is not null, set <var>value</var>'s <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-4">placeholder <code>canvas</code> element</a> to
+   <var>dataHolder</var>.[[PlaceholderCanvas]] (while maintaining the weak reference
+   semantics).</p></li></ol>
+
+  <hr/>
+
+  <p>The <dfn id="dom-offscreencanvas-getcontext-2"><code>getContext(<var>contextId</var>,
+  <var>arguments...</var>)</code></dfn> method of an <code id="the-offscreencanvas-interface:offscreencanvas-16"><a href="#offscreencanvas">OffscreenCanvas</a></code> object, when
+  invoked, must run the steps in the cell of the following table whose column header describes the
+  <code id="the-offscreencanvas-interface:offscreencanvas-17"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-3">context
+  mode</a> and whose row header describes the method's first argument.</p>
+
+  <table><thead><tr><td>
+     </td><th><a href="#offscreencanvas-context-none" id="the-offscreencanvas-interface:offscreencanvas-context-none-2">none</a>
+     </th><th><a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d">2d</a>
+     </th><th><a href="#offscreencanvas-context-webgl" id="the-offscreencanvas-interface:offscreencanvas-context-webgl">webgl</a>
+     </th><th><a href="#offscreencanvas-context-detached" id="the-offscreencanvas-interface:offscreencanvas-context-detached-2">detached</a>
+   </th></tr></thead><tbody><tr><th>&quot;<dfn id="offscreen-context-type-2d"><code>2d</code></dfn>&quot;
+     </th><td>
+      Follow the steps to <a href="#offscreen-2d-context-creation-algorithm" id="the-offscreencanvas-interface:offscreen-2d-context-creation-algorithm">create an
+      offscreen 2D context</a> defined in the section below, passing it the
+      <code id="the-offscreencanvas-interface:offscreencanvas-18"><a href="#offscreencanvas">OffscreenCanvas</a></code> object and the method's <var>arguments...</var>, to obtain
+      an <code id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d-3"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object; if this does not throw an
+      exception, then set the <code id="the-offscreencanvas-interface:offscreencanvas-19"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-4">context mode</a> to <a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d-2">2d</a>, and return the new
+      <code id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d-4"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object.
+     </td><td>
+      Return the same object as was returned the last time the method was invoked with this same
+      first argument.
+     </td><td>
+      Return null.
+     </td><td>
+      Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+    </td></tr><tr><th>&quot;<dfn id="offscreen-context-type-webgl"><code>webgl</code></dfn>&quot;
+     </th><td>
+      Follow the instructions given in the WebGL specification's <i>Context Creation</i> section to
+      obtain either a <code id="the-offscreencanvas-interface:webglrenderingcontext-2"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code> or null; if the returned value is null,
+      then return null and abort these steps, otherwise, set the <code id="the-offscreencanvas-interface:offscreencanvas-20"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+      object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-5">context mode</a> to <a href="#offscreencanvas-context-webgl" id="the-offscreencanvas-interface:offscreencanvas-context-webgl-2">webgl</a>, and return the
+      <code id="the-offscreencanvas-interface:webglrenderingcontext-3"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code> object. <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a>
+     </td><td>
+      Return null.
+     </td><td>
+      Return the same value as was returned the last time the method was invoked with this same
+      first argument.
+     </td><td>
+      Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-3">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+  </td></tr></tbody></table>
+
+  <hr/>
+
+  
+
+  <dl class="domintro"><dt><var>offscreenCanvas</var> . <code id="dom-offscreencanvas-width"><a href="#dom-offscreencanvas-width-2">width</a></code> [
+   = <var>value</var> ]</dt><dt><var>offscreenCanvas</var> . <code id="dom-offscreencanvas-height"><a href="#dom-offscreencanvas-height-2">height</a></code> [
+   = <var>value</var> ]</dt><dd>
+    <p>These attributes return the dimensions of the <code id="the-offscreencanvas-interface:offscreencanvas-21"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-6">bitmap</a>.</p>
+
+    <p>They can be set, to replace the <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-7">bitmap</a> with a
+    new, transparent black bitmap of the specified dimensions (effectively resizing it).</p>
+   </dd></dl>
+
+  
+
+  <p>If either the <dfn id="dom-offscreencanvas-width-2"><code>width</code></dfn> or <dfn id="dom-offscreencanvas-height-2"><code>height</code></dfn> attributes of an
+  <code id="the-offscreencanvas-interface:offscreencanvas-22"><a href="#offscreencanvas">OffscreenCanvas</a></code> object are set (to a new value or to the same value as before) and
+  the <code id="the-offscreencanvas-interface:offscreencanvas-23"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-6">context
+  mode</a> is <a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d-3">2d</a>, then replace the
+  <code id="the-offscreencanvas-interface:offscreencanvas-24"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-8">bitmap</a> with a
+  new transparent black bitmap and <a href="#reset-the-rendering-context-to-its-default-state" id="the-offscreencanvas-interface:reset-the-rendering-context-to-its-default-state">reset the rendering context to its default state</a>.
+  The new bitmap's dimensions are equal to the new values of the <code id="the-offscreencanvas-interface:dom-offscreencanvas-width-2-4"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreencanvas-interface:dom-offscreencanvas-height-2-4"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes.</p>
+
+  <p>The resizing behavior for &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-5"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot;
+  contexts is defined in the WebGL specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+  
+
+  <p class="note">If an <code id="the-offscreencanvas-interface:offscreencanvas-25"><a href="#offscreencanvas">OffscreenCanvas</a></code> object whose dimensions were changed has
+  a <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-5">placeholder <code>canvas</code> element</a>, then
+  the <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-6">placeholder <code>canvas</code> element</a>'s
+  <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="the-offscreencanvas-interface:intrinsic-dimensions">intrinsic size</a> will only be updated via the <code id="the-offscreencanvas-interface:offscreencontext-commit-2"><a href="#offscreencontext-commit">commit()</a></code> method of the <code id="the-offscreencanvas-interface:offscreencanvas-26"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+  object's rendering context.</p>
+
+  <dl class="domintro"><dt><var>promise</var> = <var>offscreenCanvas</var> . <code id="dom-offscreencanvas-converttoblob"><a href="#dom-offscreencanvas-converttoblob-2">convertToBlob</a></code>( [<var>options</var>] )</dt><dd>
+    <p>Returns a promise that will fulfill with a new <code id="the-offscreencanvas-interface:blob-2"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object representing a file
+    containing the image in the <code id="the-offscreencanvas-interface:offscreencanvas-27"><a href="#offscreencanvas">OffscreenCanvas</a></code> object.</p>
+
+    <p>The argument, if provided, is a dictionary that controls the encoding options of the image
+    file to be created. The <code id="the-offscreencanvas-interface:image-encode-options-type-2"><a href="#image-encode-options-type">type</a></code>
+    field specifies the file format and has a default value of &quot;<code id="the-offscreencanvas-interface:image/png"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;; that type
+    is also used if the requested type isn't supported. If the image format supports variable
+    quality (such as &quot;<code id="the-offscreencanvas-interface:image/jpeg"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;), then the <code id="the-offscreencanvas-interface:image-encode-options-quality-2"><a href="#image-encode-options-quality">quality</a></code> field is a number in the range 0.0
+    to 1.0 inclusive indicating the desired quality level for the resulting image.</p>
+   </dd><dt><var>canvas</var> . <code id="dom-offscreencanvas-transfertoimagebitmap"><a href="#dom-offscreencanvas-transfertoimagebitmap-2">transferToImageBitmap</a></code>()</dt><dd>
+    <p>Returns a newly created <code id="the-offscreencanvas-interface:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object with the image in the
+    <code id="the-offscreencanvas-interface:offscreencanvas-28"><a href="#offscreencanvas">OffscreenCanvas</a></code> object. The image in the <code id="the-offscreencanvas-interface:offscreencanvas-29"><a href="#offscreencanvas">OffscreenCanvas</a></code> object is
+    replaced with a new blank image.</p>
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="dom-offscreencanvas-converttoblob-2"><code>convertToBlob(<var>options</var>)</code></dfn> method,
+  when invoked, must run the following steps:</p>
+
+  <ol><li><p>If the value of this <code id="the-offscreencanvas-interface:offscreencanvas-30"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-offscreencanvas-interface:detached">[[Detached]]</a>
+   internal slot is set to true, then return a promise rejected with an
+   <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-4">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+   steps.</p></li><li><p>If this <code id="the-offscreencanvas-interface:offscreencanvas-31"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-7">context mode</a> is <a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d-4">2d</a> and the rendering context's <a href="#offscreencontext2d-bitmap" id="the-offscreencanvas-interface:offscreencontext2d-bitmap">bitmap</a>'s <a href="#offscreencontext2d-origin-clean" id="the-offscreencanvas-interface:offscreencontext2d-origin-clean">origin-clean</a> flag is set to false, then return a
+   promise rejected with a <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="the-offscreencanvas-interface:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and
+   abort these steps.</p>
+
+   </li><li><p>If this <code id="the-offscreencanvas-interface:offscreencanvas-32"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-9">bitmap</a> has no pixels (i.e. either its
+   horizontal dimension or its vertical dimension is zero) then return a promise rejected with an
+   <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="the-offscreencanvas-interface:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+   steps.</p></li><li><p>Let <var>result</var> be a new promise object.</p></li><li><p>Return <var>result</var>, and <a href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="the-offscreencanvas-interface:queue-a-task">queue a task</a> to run the remaining steps
+   <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel" id="the-offscreencanvas-interface:in-parallel">in parallel</a>.</p></li><li><p>Let <var>blob</var> be a <code id="the-offscreencanvas-interface:blob-3"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object, created in the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-realm" id="the-offscreencanvas-interface:concept-relevant-realm">relevant Realm</a> of this <code id="the-offscreencanvas-interface:offscreencanvas-33"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+   object, representing <a href="#a-serialisation-of-the-bitmap-as-a-file" id="the-offscreencanvas-interface:a-serialisation-of-the-bitmap-as-a-file">a serialization of
+   this <code>OffscreenCanvas</code> object's <span>bitmap</span> as
+   a file</a>, passing the values of the <dfn id="image-encode-options-type"><code>type</code></dfn> and <dfn id="image-encode-options-quality"><code>quality</code></dfn> fields of <var>options</var>, if
+   <var>options</var> was specified. <a href="https://html.spec.whatwg.org/multipage/references.html#refsFILEAPI">[FILEAPI]</a></p></li><li><p>If <var>blob</var> is null, then reject <var>result</var> with an
+   <a data-x-internal="encodingerror" href="https://heycam.github.io/webidl/#encodingerror" id="the-offscreencanvas-interface:encodingerror">&quot;<code>EncodingError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>Otherwise, resolve <var>result</var> with <var>blob</var>.</p></li></ol>
+
+  <p>The <dfn id="dom-offscreencanvas-transfertoimagebitmap-2"><code>transferToImageBitmap()</code></dfn> method,
+  when invoked, must run the following steps:</p>
+  <ol><li><p>If the value of this <code id="the-offscreencanvas-interface:offscreencanvas-34"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-offscreencanvas-interface:detached-2">[[Detached]]</a>
+   internal slot is set to true, then throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-5">&quot;<code>InvalidStateError</code>&quot;</a>
+   <code id="the-offscreencanvas-interface:domexception-8"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p></li><li><p>If this <code id="the-offscreencanvas-interface:offscreencanvas-35"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-8">context mode</a> is set to <a href="#offscreencanvas-context-none" id="the-offscreencanvas-interface:offscreencanvas-context-none-3">none</a>, then throw an
+   <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-6">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-9"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+   steps.</p></li><li><p>Let <var>image</var> be a newly created <code id="the-offscreencanvas-interface:imagebitmap-3"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object that references
+   the same underlying bitmap data as this <code id="the-offscreencanvas-interface:offscreencanvas-36"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-10">bitmap</a>.</p></li><li><p>Set this <code id="the-offscreencanvas-interface:offscreencanvas-37"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-11">bitmap</a> to reference a newly created bitmap of the
+   same dimensions as the previous bitmap, and with its pixels initialized to transparent black,
+   or opaque black if the rendering context's <a href="#offscreencontext2d-alpha" id="the-offscreencanvas-interface:offscreencontext2d-alpha">alpha</a> flag is set to false.</p></li><li><p>Return <var>image</var>.</p></li></ol>
+  
+
+  <h6 id="the-offscreen-2d-rendering-context"><span class="secno">4.12.5.3.1</span> The offscreen 2D rendering context<a class="self-link" href="#the-offscreen-2d-rendering-context"/></h6>
+
+  <pre class="idl">[Exposed=(Window,Worker)]
+interface <a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a> {
+  void <a href="#offscreencontext2d-commit-2" id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2">commit</a>();
+  readonly attribute <a href="#offscreencanvas" id="the-offscreen-2d-rendering-context:offscreencanvas">OffscreenCanvas</a> <a href="#offscreencontext2d-canvas-2" id="the-offscreen-2d-rendering-context:offscreencontext2d-canvas-2">canvas</a>;
+};
+
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-2">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasstate" id="the-offscreen-2d-rendering-context:canvasstate">CanvasState</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-3">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvastransform" id="the-offscreen-2d-rendering-context:canvastransform">CanvasTransform</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-4">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvascompositing" id="the-offscreen-2d-rendering-context:canvascompositing">CanvasCompositing</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-5">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasimagesmoothing" id="the-offscreen-2d-rendering-context:canvasimagesmoothing">CanvasImageSmoothing</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-6">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasfillstrokestyles" id="the-offscreen-2d-rendering-context:canvasfillstrokestyles">CanvasFillStrokeStyles</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-7">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasshadowstyles" id="the-offscreen-2d-rendering-context:canvasshadowstyles">CanvasShadowStyles</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-8">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasfilters" id="the-offscreen-2d-rendering-context:canvasfilters">CanvasFilters</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-9">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasrect" id="the-offscreen-2d-rendering-context:canvasrect">CanvasRect</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-10">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasdrawpath" id="the-offscreen-2d-rendering-context:canvasdrawpath">CanvasDrawPath</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-11">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasdrawimage" id="the-offscreen-2d-rendering-context:canvasdrawimage">CanvasDrawImage</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-12">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasimagedata" id="the-offscreen-2d-rendering-context:canvasimagedata">CanvasImageData</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-13">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvaspathdrawingstyles" id="the-offscreen-2d-rendering-context:canvaspathdrawingstyles">CanvasPathDrawingStyles</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-14">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvaspath" id="the-offscreen-2d-rendering-context:canvaspath">CanvasPath</a>;
+</pre>
+
+  <p>The <dfn id="offscreencanvasrenderingcontext2d"><code>OffscreenCanvasRenderingContext2D</code></dfn> is a rendering context
+  interface for drawing to the <a href="#offscreencanvas-bitmap" id="the-offscreen-2d-rendering-context:offscreencanvas-bitmap">bitmap</a> of an
+  <code id="the-offscreen-2d-rendering-context:offscreencanvas-2"><a href="#offscreencanvas">OffscreenCanvas</a></code> object. It is similar to <code id="the-offscreen-2d-rendering-context:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>,
+  with the following differences:</p>
+  <ul><li><p><a href="#canvastext" id="the-offscreen-2d-rendering-context:canvastext">text rendering</a> is not supported;</p></li><li><p>there is no support for <a href="#canvasuserinterface" id="the-offscreen-2d-rendering-context:canvasuserinterface">user interface</a>
+   features;</p></li><li><p>its <code id="the-offscreen-2d-rendering-context:offscreencontext2d-canvas-2-2"><a href="#offscreencontext2d-canvas-2">canvas</a></code> attribute refers to an
+   <code id="the-offscreen-2d-rendering-context:offscreencanvas-3"><a href="#offscreencanvas">OffscreenCanvas</a></code> object rather than a <code id="the-offscreen-2d-rendering-context:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element;</p></li><li><p>it has a <code id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2-2"><a href="#offscreencontext2d-commit-2">commit()</a></code> method for pushing the
+   rendered image to the context's <code id="the-offscreen-2d-rendering-context:offscreencanvas-4"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder">placeholder <code>canvas</code> element</a>.</p></li></ul>
+
+  <p>An <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-15"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object has a <dfn id="offscreencontext2d-bitmap">bitmap</dfn> that is initialized when the object is
+  created.</p>
+
+  <p>The <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap">bitmap</a> has an <dfn id="offscreencontext2d-origin-clean">origin-clean</dfn> flag, which can be set to true or
+  false. Initially, when one of these bitmaps is created, its <a href="#offscreencontext2d-origin-clean" id="the-offscreen-2d-rendering-context:offscreencontext2d-origin-clean">origin-clean</a> flag must be set to true.</p>
+
+  <p>An <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-16"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object also has an <dfn id="offscreencontext2d-alpha">alpha</dfn> flag, which can be set to true or false. Initially,
+  when the context is created, its alpha flag must be set to true. When an
+  <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-17"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object has its <a href="#offscreencontext2d-alpha" id="the-offscreen-2d-rendering-context:offscreencontext2d-alpha">alpha</a> flag set to false, then its alpha channel must be
+  fixed to 1.0 (fully opaque) for all pixels, and attempts to change the alpha component of any pixel
+  must be silently ignored.</p>
+
+  <p>An <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-18"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object has an <dfn id="associated-offscreencanvas-object">associated
+  <code>OffscreenCanvas</code> object</dfn>, which is the <code id="the-offscreen-2d-rendering-context:offscreencanvas-5"><a href="#offscreencanvas">OffscreenCanvas</a></code> object
+  from which the <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-19"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object was created.
+
+  </p><dl class="domintro"><dt><var>offscreenCanvasRenderingContext2D</var> . <code id="offscreencontext2d-commit"><a href="#offscreencontext2d-commit-2">commit</a></code>()</dt><dd>
+    <p>Copies the rendering context's <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-2">bitmap</a> to
+    the bitmap of the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-2">placeholder <code>canvas</code>
+    element</a> of the <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object">associated <code>OffscreenCanvas</code> object</a>. The copy
+    operation is asynchronous.</p>
+   </dd><dt><var>offscreenCanvas</var> = <var>offscreenCanvasRenderingContext2D</var> . <code id="offscreencontext2d-canvas"><a href="#offscreencontext2d-canvas-2">canvas</a></code></dt><dd>
+    <p>Returns the <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-2">associated <code>OffscreenCanvas</code> object</a>.</p>
+   </dd></dl>
+
+  
+
+  <p>The <dfn id="offscreen-2d-context-creation-algorithm">offscreen 2D context creation algorithm</dfn>, which is passed a
+  <var>target</var> (an <code id="the-offscreen-2d-rendering-context:offscreencanvas-6"><a href="#offscreencanvas">OffscreenCanvas</a></code> object) and optionally some arguments,
+  consists of running the following steps:</p>
+
+  <ol><li><p>If the algorithm was passed some arguments, let <var>arg</var> be the first such
+   argument. Otherwise, let <var>arg</var> be undefined.</p></li><li><p>Let <var>settings</var> be the result of <a href="#coerce-context-arguments-for-2d" id="the-offscreen-2d-rendering-context:coerce-context-arguments-for-2d">coercing the <var>arg</var> context arguments
+   for 2D</a>.</p></li><li><p>Let <var>context</var> be a new <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-20"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>
+   object.</p></li><li><p>Set <var>context</var>'s <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-3">associated <code>OffscreenCanvas</code> object</a> to
+   <var>target</var>.</p></li><li><p>Process each of the members of <var>settings</var> as follows:</p>
+    <dl><dt><code id="the-offscreen-2d-rendering-context:dom-canvasrenderingcontext2dsettings-alpha"><a href="#dom-canvasrenderingcontext2dsettings-alpha">alpha</a></code></dt><dd>If false, set <var>context</var>'s <a href="#offscreencontext2d-alpha" id="the-offscreen-2d-rendering-context:offscreencontext2d-alpha-2">alpha</a>
+     flag to false.</dd></dl>
+   </li><li><p>Set <var>context</var>'s <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-3">bitmap</a> to a newly
+   created bitmap with the dimensions specified by the <code id="the-offscreen-2d-rendering-context:dom-offscreencanvas-width-2"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreen-2d-rendering-context:dom-offscreencanvas-height-2"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes of <var>target</var>, and set
+   <var>target</var>'s bitmap to the same bitmap (so that they are shared).</p></li><li><p>If <var>context</var>'s <a href="#offscreencontext2d-alpha" id="the-offscreen-2d-rendering-context:offscreencontext2d-alpha-3">alpha</a> flag is set
+   to true, initialize all the pixels of <var>context</var>'s <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-4">bitmap</a> to transparent black. Otherwise, initialize
+   the pixels to opaque black.</p></li><li><p>Return <var>context</var>.</p></li></ol>
+
+  <p>The <dfn id="offscreencontext2d-commit-2"><code>commit()</code></dfn> method, when invoked,
+  must run the following steps:</p>
+
+  <ol><li><p>If this <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-21"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>'s <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-4">associated
+    <code>OffscreenCanvas</code> object</a> does not have a <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-3">placeholder <code>canvas</code> element</a>, abort
+    these steps.</p></li><li><p>Let <var>image</var> be a copy of this <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-22"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>'s
+    <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-5">bitmap</a>, including the value of its <a href="#offscreencontext2d-origin-clean" id="the-offscreen-2d-rendering-context:offscreencontext2d-origin-clean-2">origin-clean</a> flag.</p></li><li>
+     <p><a href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="the-offscreen-2d-rendering-context:queue-a-task">Queue a task</a> in the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-4">placeholder <code>canvas</code> element</a>'s
+     <a href="https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object" id="the-offscreen-2d-rendering-context:relevant-settings-object">relevant settings object</a>'s <a href="https://html.spec.whatwg.org/multipage/webappapis.html#responsible-event-loop" id="the-offscreen-2d-rendering-context:responsible-event-loop">responsible event loop</a> (which will be a
+     <a href="https://html.spec.whatwg.org/multipage/browsers.html#browsing-context" id="the-offscreen-2d-rendering-context:browsing-context">browsing context</a> <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="the-offscreen-2d-rendering-context:event-loop">event loop</a>) to set the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-5">placeholder <code>canvas</code> element</a>'s
+     <a href="#output-bitmap" id="the-offscreen-2d-rendering-context:output-bitmap">output bitmap</a> to be a reference to <var>image</var>.</p>
+
+     <p class="note">If <var>image</var> has different dimensions than the bitmap previously
+     referenced as the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-6">placeholder <code>canvas</code>
+     element</a>'s <a href="#output-bitmap" id="the-offscreen-2d-rendering-context:output-bitmap-2">output bitmap</a>, then this task will result in a change in
+     the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-7">placeholder <code>canvas</code>
+     element</a>'s <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="the-offscreen-2d-rendering-context:intrinsic-dimensions">intrinsic size</a>, which can affect
+     document layout.</p>
+    </li></ol>
+
+  <p class="note">Implementations are encouraged to short-circuit the graphics update steps of
+  the <a href="https://html.spec.whatwg.org/multipage/browsers.html#browsing-context" id="the-offscreen-2d-rendering-context:browsing-context-2">browsing context</a> <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="the-offscreen-2d-rendering-context:event-loop-2">event loop</a> for the purposes of updating the
+  contents of a <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-8">placeholder <code>canvas</code>
+  element</a> to the display. This could mean, for example, that the <code id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2-3"><a href="#offscreencontext2d-commit-2">commit()</a></code> method can copy the bitmap contents directly
+  to a graphics buffer that is mapped to the physical display location of the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-9">placeholder <code>canvas</code> element</a>. This or
+  similar short-circuiting approaches can significantly reduce display latency, especially in cases
+  where the <code id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2-4"><a href="#offscreencontext2d-commit-2">commit()</a></code> method is invoked from a worker
+  and the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="the-offscreen-2d-rendering-context:event-loop-3">event loop</a> of the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-10">placeholder <code>canvas</code> element</a>'s
+  <a href="https://html.spec.whatwg.org/multipage/browsers.html#browsing-context" id="the-offscreen-2d-rendering-context:browsing-context-3">browsing context</a> is busy. However, such shortcuts can not have any
+  script-observable side-effects. This means that the committed bitmap still needs to be sent to
+  the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-11">placeholder <code>canvas</code> element</a>, in
+  case the element is used as a <code id="the-offscreen-2d-rendering-context:canvasimagesource"><a href="#canvasimagesource">CanvasImageSource</a></code>, as an
+  <code id="the-offscreen-2d-rendering-context:imagebitmapsource"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmapsource">ImageBitmapSource</a></code>, or in case <code id="the-offscreen-2d-rendering-context:dom-canvas-todataurl-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code>
+  or <code id="the-offscreen-2d-rendering-context:dom-canvas-toblob-2"><a href="#dom-canvas-toblob-2">toBlob()</a></code> are called on it.</p>
+
+  <p>The <dfn id="offscreencontext2d-canvas-2"><code>canvas</code></dfn> attribute, on getting,
+  must return this <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-23"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>'s <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-5">associated
+  <code>OffscreenCanvas</code> object</a>.
+
+  </p>
+
+  
+
+  <h5 id="colour-spaces-and-colour-correction"><span class="secno">4.12.5.4</span> Color spaces and color correction<a class="self-link" href="#colour-spaces-and-colour-correction"/></h5>
+
+  <p>The <code id="colour-spaces-and-colour-correction:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> APIs must perform color correction at only two points: when rendering
+  images with their own gamma correction and color space information onto a bitmap, to convert the
+  image to the color space used by the bitmaps (e.g. using the 2D Context's <code id="colour-spaces-and-colour-correction:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method with an
+  <code id="colour-spaces-and-colour-correction:htmlorsvgimageelement"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object), and when rendering the actual canvas bitmap to the
+  output device.</p>
+
+  <p class="note">Thus, in the 2D context, colors used to draw shapes onto the canvas will exactly
+  match colors obtained through the <code id="colour-spaces-and-colour-correction:dom-context-2d-getimagedata-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> method.</p>
+
+  <p>The <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code> method, when invoked, must not
+  include color space information in the resources they return. Where the output format allows it,
+  the color of pixels in resources created by <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code>
+  must match those returned by the <code id="colour-spaces-and-colour-correction:dom-context-2d-getimagedata-2-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code>
+  method.</p>
+
+  <p>In user agents that support CSS, the color space used by a <code id="colour-spaces-and-colour-correction:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element must
+  match the color space used for processing any colors for that element in CSS.</p>
+
+  <p>The gamma correction and color space information of images must be handled in such a way that
+  an image rendered directly using an <code id="colour-spaces-and-colour-correction:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> element would use the same colors as one
+  painted on a <code id="colour-spaces-and-colour-correction:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element that is then itself rendered. Furthermore, the rendering
+  of images that have no color correction information (such as those returned by the <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2-3"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code> method) must be rendered with no color
+  correction.</p>
+
+  <p class="note">Thus, in the 2D context, calling the <code id="colour-spaces-and-colour-correction:dom-context-2d-drawimage-2"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method to render the output of the <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2-4"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code> method to the canvas, given the appropriate
+  dimensions, has no visible effect.</p>
+
+  
+
+
+
+  <h5 id="serialising-bitmaps-to-a-file"><span class="secno">4.12.5.5</span> Serializing bitmaps to a file<a class="self-link" href="#serialising-bitmaps-to-a-file"/></h5>
+
+  
+
+  <p>When a user agent is to create <dfn id="a-serialisation-of-the-bitmap-as-a-file">a
+  serialization of the bitmap as a file</dfn>, given an optional <var>type</var> and
+  <var>quality</var>, it must create an image file in the format given by <var>type</var>, or if
+  <var>type</var> was not supplied, in the PNG format. If an error occurs during the creation of
+  the image file (e.g. an internal encoder error), then the result of the serialization is null.
+  <a href="https://html.spec.whatwg.org/multipage/references.html#refsPNG">[PNG]</a></p>
+
+  <p>The image file's pixel data must be the bitmap's pixel data scaled to one image pixel per
+  coordinate space unit, and if the file format used supports encoding resolution metadata, the
+  resolution must be given as 96dpi (one image pixel per <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="serialising-bitmaps-to-a-file:'px'">CSS pixel</a>).</p>
+
+  <p>If <var>type</var> is supplied, then it must be interpreted as a <a data-x-internal="mime-type" href="https://mimesniff.spec.whatwg.org/#mime-type" id="serialising-bitmaps-to-a-file:mime-type">MIME
+  type</a> giving the format to use. If the type has any parameters, then it must be treated as
+  not supported.</p>
+
+  <p class="example">For example, the value &quot;<code id="serialising-bitmaps-to-a-file:image/png"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot; would mean to generate a PNG
+  image, the value &quot;<code id="serialising-bitmaps-to-a-file:image/jpeg"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot; would mean to generate a JPEG image, and the value
+  &quot;<code id="serialising-bitmaps-to-a-file:image/svg+xml"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/svg+xml">image/svg+xml</a></code>&quot; would mean to generate an SVG image (which would require that the
+  user agent track how the bitmap was generated, an unlikely, though potentially awesome,
+  feature).</p>
+
+  <p>User agents must support PNG (&quot;<code id="serialising-bitmaps-to-a-file:image/png-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;). User agents may support other types.
+  If the user agent does not support the requested type, then it must create the file using the PNG
+  format. <a href="https://html.spec.whatwg.org/multipage/references.html#refsPNG">[PNG]</a></p>
+
+  <p>User agents must <a data-x-internal="converted-to-ascii-lowercase" href="https://infra.spec.whatwg.org/#ascii-lowercase" id="serialising-bitmaps-to-a-file:converted-to-ascii-lowercase">convert the provided type to ASCII
+  lowercase</a> before establishing if they support that type.</p>
+
+  <p>For image types that do not support an alpha channel, the serialized image must be the bitmap
+  image composited onto a solid black background using the source-over operator.</p>
+
+  <p>If <var>type</var> is an image format that supports variable quality (such as
+  &quot;<code id="serialising-bitmaps-to-a-file:image/jpeg-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;) and <var>quality</var> is given, then, if <a data-x-internal="js-type" href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values" id="serialising-bitmaps-to-a-file:js-type">Type</a>(<var>quality</var>) is Number, and <var>quality</var> is in the range
+  0.0 to 1.0 inclusive, the user agent must treat <var>quality</var> as the desired quality level.
+  If <a data-x-internal="js-type" href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values" id="serialising-bitmaps-to-a-file:js-type-2">Type</a>(<var>quality</var>) is not Number, or if <var>quality</var>
+  is outside that range, the user agent must use its default quality value, as if the
+  <var>quality</var> argument had not been given.</p>
+
+  <p class="note">The use of type-testing here, instead of simply declaring <var>quality</var> as
+  a Web IDL <code>double</code>, is a historical artifact.</p>
+
+  
+
+
+  
+
+  <h5 id="security-with-canvas-elements"><span class="secno">4.12.5.6</span> Security with <code id="security-with-canvas-elements:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> elements<a class="self-link" href="#security-with-canvas-elements"/></h5>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p><strong>Information leakage</strong> can occur if scripts from one <a href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin" id="security-with-canvas-elements:concept-origin">origin</a> can
+  access information (e.g. read pixels) from images from another origin (one that isn't the <a href="https://html.spec.whatwg.org/multipage/origin.html#same-origin" id="security-with-canvas-elements:same-origin">same</a>).</p>
+
+  <p>To mitigate this, bitmaps used with <code id="security-with-canvas-elements:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> elements and <code id="security-with-canvas-elements:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>
+  objects are defined to have a flag indicating whether they are <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean">origin-clean</a>. All bitmaps start with their <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-2">origin-clean</a> set to true. The flag is set to false
+  when cross-origin images are used.</p>
+
+  <p>The <code id="security-with-canvas-elements:dom-canvas-todataurl-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code>, <code id="security-with-canvas-elements:dom-canvas-toblob-2"><a href="#dom-canvas-toblob-2">toBlob()</a></code>, and <code id="security-with-canvas-elements:dom-context-2d-getimagedata-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> methods check the flag and will
+  throw a <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="security-with-canvas-elements:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="security-with-canvas-elements:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> rather than leak
+  cross-origin data.</p>
+
+  <p>The value of the <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-3">origin-clean</a> flag is
+  propagated from a source <code id="security-with-canvas-elements:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element's bitmap to a new <code id="security-with-canvas-elements:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>
+  object by <code id="security-with-canvas-elements:dom-createimagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-createimagebitmap-2">createImageBitmap()</a></code>. Conversely, a
+  destination <code id="security-with-canvas-elements:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element's bitmap will have its <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-4">origin-clean</a> flags set to false by <code id="security-with-canvas-elements:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage</a></code> if the source image is an
+  <code id="security-with-canvas-elements:imagebitmap-3"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object whose bitmap has its <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-5">origin-clean</a> flag set to false.</p>
+
+  <p>The flag can be reset in certain situations; for example, when changing the value of the
+  <code id="security-with-canvas-elements:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> or the <code id="security-with-canvas-elements:attr-canvas-height"><a href="#attr-canvas-height">height</a></code> content attribute of the <code id="security-with-canvas-elements:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code> element
+  to which a <code id="security-with-canvas-elements:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> is bound, the bitmap is
+  cleared and its <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-6">origin-clean</a> flag is reset.</p>
+
+  <p>When using an <code id="security-with-canvas-elements:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code>, the value of the <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-7">origin-clean</a> flag is propagated from
+  <code id="security-with-canvas-elements:imagebitmap-4"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> objects when they are transferred to the <code id="security-with-canvas-elements:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code>
+  via <a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2" id="security-with-canvas-elements:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap()</a>.</p>
+
+  
+
+  </body></html>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/gentestutils.py b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/gentestutils.py
index 030cd8e..400a27e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/gentestutils.py
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/gentestutils.py
@@ -9,12 +9,9 @@
 # It has been adapted for use with the Web Platform Test Suite suite at
 # https://github.com/w3c/web-platform-tests/
 #
-# The W3C version excludes a number of features (multiple versions of each test
-# case of varying verbosity, Mozilla mochitests, semi-automated test harness)
-# to focus on simply providing reviewable test cases. It also expects a different
-# directory structure.
-# This code attempts to support both versions, but the non-W3C version hasn't
-# been tested recently and is probably broken.
+# The original version had a number of now-removed features (multiple versions of
+# each test case of varying verbosity, Mozilla mochitests, semi-automated test
+# harness). It also had a different directory structure.
 
 # To update or add test cases:
 #
@@ -28,9 +25,8 @@
 # (100x50 images in both cases), or a string 'size 100 50' (or any other size)
 # followed by Python code using Pycairo to generate the image.
 #
-# * Run "python gentest.py".
+# * Run "./build.sh".
 # This requires a few Python modules which might not be ubiquitous.
-# It has only been tested on Linux.
 # It will usually emit some warnings, which ideally should be fixed but can
 # generally be safely ignored.
 #
@@ -57,16 +53,10 @@
 
 def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOFFSCREENCANVAS):
 
-    # Default mode is for the W3C test suite; the --standalone option
-    # generates various extra files that aren't needed there
-    W3CMODE = True
-    if '--standalone' in sys.argv:
-        W3CMODE = False
-
     MISCOUTPUTDIR = './output'
-    SPECOUTPUTDIR = '../../annotated-spec'
+    SPECOUTPUTDIR = '../'
 
-    SPECOUTPUTPATH = '../annotated-spec' # relative to TESTOUTPUTDIR
+    SPECOUTPUTPATH = './' # relative to TESTOUTPUTDIR
 
     def simpleEscapeJS(str):
         return str.replace('\\', '\\\\').replace('"', '\\"')
@@ -186,17 +176,26 @@
 
     # Ensure the test output directories exist
     testdirs = [TESTOUTPUTDIR, IMAGEOUTPUTDIR, MISCOUTPUTDIR]
-    if not W3CMODE: testdirs.append('%s/mochitests' % MISCOUTPUTDIR)
-    else:
-        for map_dir in set(name_mapping.values()):
-            testdirs.append("%s/%s" % (TESTOUTPUTDIR, map_dir))
+    for map_dir in set(name_mapping.values()):
+        testdirs.append("%s/%s" % (TESTOUTPUTDIR, map_dir))
     for d in testdirs:
         try: os.mkdir(d)
         except: pass # ignore if it already exists
 
-    mochitests = []
     used_images = {}
 
+    def map_name(name):
+        mapped_name = None
+        for mn in sorted(name_mapping.keys(), key=len, reverse=True):
+            if name.startswith(mn):
+                mapped_name = "%s/%s" % (name_mapping[mn], name)
+                break
+        if not mapped_name:
+            print "LIKELY ERROR: %s has no defined target directory mapping" % name
+        if 'manual' in test:
+            mapped_name += "-manual"
+        return mapped_name
+
     def expand_test_code(code):
         code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code) # must come before '@assert throws'
 
@@ -265,66 +264,6 @@
 
         return code
 
-    def expand_mochitest_code(code):
-        code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code)
-
-        code = re.sub(r'@assert pixel (\d+,\d+) == (\d+,\d+,\d+,\d+);',
-            r'isPixel(ctx, \1, \2, "\1", "\2", 0);',
-            code)
-
-        code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+);',
-            r'isPixel(ctx, \1, \2, "\1", "\2", 2);',
-            code)
-
-        code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);',
-            r'isPixel(ctx, \1, \2, "\1", "\2", \3);',
-            code)
-
-        code = re.sub(r'@assert throws (\S+_ERR) (.*);',
-            lambda m: 'var _thrown = undefined; try {\n  %s;\n} catch (e) { _thrown = e }; ok(_thrown && _thrown.code == DOMException.%s, "should throw %s");'
-                % (m.group(2), m.group(1), m.group(1))
-            , code)
-
-        code = re.sub(r'@assert throws (\S+Error) (.*);',
-            lambda m: 'var _thrown = undefined; try {\n  %s;\n} catch (e) { _thrown = e }; ok(_thrown && (_thrown instanceof %s), "should throw %s");'
-                % (m.group(2), m.group(1), m.group(1))
-            , code)
-
-        code = re.sub(r'@assert throws (.*);',
-            lambda m: 'try { var _thrown = false;\n  %s;\n} catch (e) { _thrown = true; } finally { ok(_thrown, "should throw exception"); }'
-                % (m.group(1))
-            , code)
-
-        code = re.sub(r'@assert (.*) =~ (.*);',
-            lambda m: 'ok(%s.match(%s), "%s.match(%s)");'
-                % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2)))
-            , code)
-
-        code = re.sub(r'@assert (.*);',
-            lambda m: 'ok(%s, "%s");'
-                % (m.group(1), escapeJS(m.group(1)))
-            , code)
-
-        code = re.sub(r'((?:^|\n|;)\s*)ok(.*;) @moz-todo',
-            lambda m: '%stodo%s'
-                % (m.group(1), m.group(2))
-            , code)
-
-        code = re.sub(r'((?:^|\n|;)\s*)(is.*;) @moz-todo',
-            lambda m: '%stodo_%s'
-                % (m.group(1), m.group(2))
-            , code)
-
-        code = re.sub(r'@moz-UniversalBrowserRead;',
-            "netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');"
-            , code)
-
-        code = code.replace('../images/', 'image_')
-
-        assert '@' not in code, '@ not in code:\n%s' % code
-
-        return code
-
     used_tests = {}
     for i in range(len(tests)):
         test = tests[i]
@@ -336,19 +275,13 @@
             print "Test %s is defined twice" % name
         used_tests[name] = 1
 
-        mapped_name = None
-        for mn in sorted(name_mapping.keys(), key=len, reverse=True):
-            if name.startswith(mn):
-                mapped_name = "%s/%s" % (name_mapping[mn], name)
-                break
+        mapped_name = map_name(name)
         if not mapped_name:
-            print "LIKELY ERROR: %s has no defined target directory mapping" % name
             if ISOFFSCREENCANVAS:
                 continue
             else:
                 mapped_name = name
-        if 'manual' in test:
-            mapped_name += "-manual"
+
 
         cat_total = ''
         for cat_part in [''] + name.split('.')[:-1]:
@@ -361,7 +294,7 @@
             if ref not in spec_ids:
                 print "Test %s uses nonexistent spec point %s" % (name, ref)
             spec_refs.setdefault(ref, []).append(name)
-        #if not (len(test.get('testing', [])) or 'mozilla' in test):
+
         if not test.get('testing', []):
             print "Test %s doesn't refer to any spec points" % name
 
@@ -370,51 +303,14 @@
 
         code = expand_test_code(test['code'])
 
-        mochitest = not (W3CMODE or 'manual' in test or 'disabled' in test.get('mozilla', {}))
-        if mochitest:
-            mochi_code = expand_mochitest_code(test['code'])
-
-            mochi_name = name
-            if 'mozilla' in test:
-                if 'throws' in test['mozilla']:
-                    mochi_code = templates['mochitest.exception'] % mochi_code
-                if 'bug' in test['mozilla']:
-                    mochi_name = "%s - bug %s" % (name, test['mozilla']['bug'])
-
-            if 'desc' in test:
-                mochi_desc = '<!-- Testing: %s -->\n' % test['desc']
-            else:
-                mochi_desc = ''
-
-            if 'deferTest' in mochi_code:
-                mochi_setup = ''
-                mochi_footer = ''
-            else:
-                mochi_setup = ''
-                mochi_footer = 'SimpleTest.finish();\n'
-
-            for f in ['isPixel', 'todo_isPixel', 'deferTest', 'wrapFunction']:
-                if f in mochi_code:
-                    mochi_setup += templates['mochitest.%s' % f]
-        else:
-            if not W3CMODE:
-                print "Skipping mochitest for %s" % name
-            mochi_name = ''
-            mochi_desc = ''
-            mochi_code = ''
-            mochi_setup = ''
-            mochi_footer = ''
-
         expectation_html = ''
         if 'expected' in test and test['expected'] is not None:
             expected = test['expected']
             expected_img = None
             if expected == 'green':
-                expected_img = make_flat_image('green-100x50.png', 100, 50, 0,1,0,1)
-                if W3CMODE: expected_img = "/images/" + expected_img
+                expected_img = "/images/" + make_flat_image('green-100x50.png', 100, 50, 0,1,0,1)
             elif expected == 'clear':
-                expected_img = make_flat_image('clear-100x50.png', 100, 50, 0,0,0,0)
-                if W3CMODE: expected_img = "/images/" + expected_img
+                expected_img = "/images/" + make_flat_image('clear-100x50.png', 100, 50, 0,0,0,0)
             else:
                 if ';' in expected: print "Found semicolon in %s" % name
                 expected = re.sub(r'^size (\d+) (\d+)',
@@ -438,11 +334,9 @@
         prev = tests[i-1]['name'] if i != 0 else 'index'
         next = tests[i+1]['name'] if i != len(tests)-1 else 'index'
 
-        name_wrapped = name.replace('.', '.&#8203;') # (see https://bugzilla.mozilla.org/show_bug.cgi?id=376188)
+        name_wrapped = name.replace('.', '.&#8203;')
 
-        refs = ''.join('<li><a href="%s/canvas.html#testrefs.%s">%s</a>\n' % (SPECOUTPUTPATH, n,n) for n in test.get('testing', []))
-        if not W3CMODE and 'mozilla' in test and 'bug' in test['mozilla']:
-            refs += '<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=%d">Bugzilla</a>' % test['mozilla']['bug']
+        refs = ''.join('<li><a href="%s/annotated-spec.html#testrefs.%s">%s</a>\n' % (SPECOUTPUTPATH, n,n) for n in test.get('testing', []))
 
         notes = '<p class="notes">%s' % test['notes'] if 'notes' in test else ''
 
@@ -462,8 +356,7 @@
                 used_images[i] = 1
                 i = '../images/%s' % i
             images += '<img src="%s" id="%s" class="resource">\n' % (i,id)
-        mochi_images = images.replace('../images/', 'image_')
-        if W3CMODE: images = images.replace("../images/", "/images/")
+        images = images.replace("../images/", "/images/")
 
         fonts = ''
         fonthack = ''
@@ -492,135 +385,17 @@
                 'fonts':fonts, 'fonthack':fonthack,
                 'canvas':canvas, 'expected':expectation_html, 'code':code,
                 'scripts':scripts + extra_script,
-                'mochi_name':mochi_name, 'mochi_desc':mochi_desc, 'mochi_code':mochi_code,
-                'mochi_setup':mochi_setup, 'mochi_footer':mochi_footer, 'mochi_images':mochi_images,
                 'fallback':fallback
             }
 
-            if W3CMODE:
-                f = codecs.open('%s/%s%s.html' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
-                f.write(templates['w3c'] % template_params)
-                if ISOFFSCREENCANVAS:
-                    f = codecs.open('%s/%s%s.worker.js' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
-                    f.write(templates['w3cworker'] % template_params)
-            else:
-                f = codecs.open('%s/%s%s.html' % (TESTOUTPUTDIR, name, name_variant), 'w', 'utf-8')
-                f.write(templates['standalone'] % template_params)
-
-                f = codecs.open('%s/framed.%s%s.html' % (TESTOUTPUTDIR, name, name_variant), 'w', 'utf-8')
-                f.write(templates['framed'] % template_params)
-
-                f = codecs.open('%s/minimal.%s%s.html' % (TESTOUTPUTDIR, name, name_variant), 'w', 'utf-8')
-                f.write(templates['minimal'] % template_params)
-
-            if mochitest:
-                mochitests.append(name)
-                f = codecs.open('%s/mochitests/test_%s%s.html' % (MISCOUTPUTDIR, name, name_variant), 'w', 'utf-8')
-                f.write(templates['mochitest'] % template_params)
-
-    def write_mochitest_makefile():
-        f = open('%s/mochitests/Makefile.in' % MISCOUTPUTDIR, 'w')
-        f.write(templates['mochitest.Makefile'])
-        files = ['test_%s.html' % n for n in mochitests] + ['image_%s' % n for n in used_images]
-        chunksize = 100
-        chunks = []
-        for i in range(0, len(files), chunksize):
-            chunk = files[i:i+chunksize]
-            name = '_TEST_FILES_%d' % (i / chunksize)
-            chunks.append(name)
-            f.write('%s = \\\n' % name)
-            for file in chunk: f.write('\t%s \\\n' % file)
-            f.write('\t$(NULL)\n\n')
-        f.write('# split up into groups to work around command-line length limits\n')
-        for name in chunks:
-            f.write('libs:: $(%s)\n\t$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)\n\n' % name)
-
-    if not W3CMODE:
-        for i in used_images:
-            shutil.copyfile("../../images/%s" % i, "%s/mochitests/image_%s" % (MISCOUTPUTDIR, i))
-        write_mochitest_makefile()
+            f = codecs.open('%s/%s%s.html' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
+            f.write(templates['w3c'] % template_params)
+            if ISOFFSCREENCANVAS:
+                f = codecs.open('%s/%s%s.worker.js' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
+                f.write(templates['w3cworker'] % template_params)
 
     print
 
-    def write_index():
-        f = open('%s/index.html' % TESTOUTPUTDIR, 'w')
-        f.write(templates['index.w3c' if W3CMODE else 'index'] % { 'updated':time.strftime('%Y-%m-%d', time.gmtime()) })
-        f.write('\n<ul class="testlist">\n')
-        depth = 1
-        for category in category_names:
-            name = category[1:-1] or ''
-            count = len(category_contents_all[category])
-            new_depth = category.count('.')
-            while new_depth < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1
-            f.write(' '*depth + templates['index.w3c.category.item' if W3CMODE else 'index.category.item'] % (name or 'all', name, count, '' if count==1 else 's'))
-            while new_depth+1 > depth: f.write(' '*depth + '<ul>\n'); depth += 1
-            for item in category_contents_direct.get(category, []):
-                f.write(' '*depth + '<li><a href="%s.html">%s</a>\n' % (item, item) )
-        while 0 < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1
-
-    def write_category_indexes():
-        for category in category_names:
-            name = (category[1:-1] or 'all')
-
-            f = open('%s/index.%s.html' % (TESTOUTPUTDIR, name), 'w')
-            f.write(templates['index.w3c.frame' if W3CMODE else 'index.frame'] % { 'backrefs':backref_html(name), 'category':name })
-            for item in category_contents_all[category]:
-                f.write(templates['index.w3c.frame.item' if W3CMODE else 'index.frame.item'] % item)
-
-    def write_reportgen():
-        f = open('%s/reportgen.html' % MISCOUTPUTDIR, 'w')
-        items_text = ',\n'.join(('"%s"' % item) for item in category_contents_all['.'])
-        f.write(templates['reportgen'] % {'items':items_text })
-
-    def write_results():
-        results = {}
-        uas = []
-        uastrings = {}
-        for item in category_contents_all['.']: results[item] = {}
-
-        f = open('%s/results.html' % MISCOUTPUTDIR, 'w')
-        f.write(templates['results'])
-
-        if not os.path.exists('results.yaml'):
-            print "Can't find results.yaml"
-        else:
-            for resultset in yaml.load(open('results.yaml', "r").read()):
-                #title = "%s (%s)" % (resultset['ua'], resultset['time'])
-                title = resultset['name']
-                #assert title not in uas # don't allow repetitions
-                if title not in uas:
-                    uas.append(title)
-                    uastrings[title] = resultset['ua']
-                else:
-                    assert uastrings[title] == resultset['ua']
-                for r in resultset['results']:
-                    if r['id'] not in results:
-                        print 'Skipping results for removed test %s' % r['id']
-                        continue
-                    results[r['id']][title] = (
-                            r['status'].lower(),
-                            re.sub(r'%(..)', lambda m: chr(int(m.group(1), 16)),
-                            re.sub(r'%u(....)', lambda m: unichr(int(m.group(1), 16)),
-                                r['notes'])).encode('utf8')
-                            )
-
-        passes = {}
-        for ua in uas:
-            f.write('<th title="%s">%s\n' % (uastrings[ua], ua))
-            passes[ua] = 0
-        for id in category_contents_all['.']:
-            f.write('<tr><td><a href="#%s" id="%s">#</a> <a href="%s.html">%s</a>\n' % (id, id, id, id))
-            for ua in uas:
-                status, details = results[id].get(ua, ('', ''))
-                f.write('<td class="r %s"><ul class="d">%s</ul>\n' % (status, details))
-                if status == 'pass': passes[ua] += 1
-        f.write('<tr><th>Passes\n')
-        for ua in uas:
-            f.write('<td>%.1f%%\n' % ((100.0 * passes[ua]) / len(category_contents_all['.'])))
-        f.write('<tr><td>\n')
-        for ua in uas:
-            f.write('<td>%s\n' % ua)
-        f.write('</table>\n')
 
     def getNodeText(node):
         t, offsets = '', []
@@ -687,7 +462,7 @@
         # Insert our new stylesheet
         n = doc.getElementsByTagName('head')[0].appendChild(doc.createElement('link'))
         n.setAttribute('rel', 'stylesheet')
-        n.setAttribute('href', '../common/canvas-spec.css' if W3CMODE else '../spectest.css')
+        n.setAttribute('href', '../common/canvas-spec.css')
         n.setAttribute('type', 'text/css')
 
         spec_assertion_patterns = []
@@ -734,11 +509,6 @@
         matched_assertions = {}
 
         def process_element(e):
-            if e.nodeType == e.ELEMENT_NODE and (e.getAttribute('class') == 'impl' or e.hasAttribute('data-component')):
-                for c in e.childNodes:
-                    process_element(c)
-                return
-
             t, offsets = getNodeText(e)
             for id, pattern, keyword, previously in spec_assertion_patterns:
                 m = pattern.search(t)
@@ -786,7 +556,7 @@
                     n1.appendChild(doc.createTextNode(' '))
                     for test_id in spec_refs.get(id, []):
                         n = n1.appendChild(doc.createElement('a'))
-                        n.setAttribute('href', '../canvas/%s.html' % test_id)
+                        n.setAttribute('href', '%s.html' % map_name(test_id))
                         n.appendChild(doc.createTextNode(test_id))
                         n1.appendChild(doc.createTextNode(' '))
                     n0 = doc.createTextNode(end_node.nodeValue[:end])
@@ -808,17 +578,13 @@
 
         # Convert from XHTML back to HTML
         doc.documentElement.removeAttribute('xmlns')
-        doc.documentElement.setAttribute('lang', doc.documentElement.getAttribute('xml:lang'))
 
         head = doc.documentElement.getElementsByTagName('head')[0]
         head.insertBefore(doc.createElement('meta'), head.firstChild).setAttribute('charset', 'UTF-8')
 
-        f = codecs.open('%s/canvas.html' % SPECOUTPUTDIR, 'w', 'utf-8')
+        f = codecs.open('%s/annotated-spec.html' % SPECOUTPUTDIR, 'w', 'utf-8')
         f.write(htmlSerializer(doc))
 
-    if not W3CMODE:
-        write_index()
-        write_category_indexes()
-        write_reportgen()
-        write_results()
+
+    if not ISOFFSCREENCANVAS:
         write_annotated_spec()
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/name2dir.yaml b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/name2dir.yaml
index c0508dd..2c2eecd 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/name2dir.yaml
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/name2dir.yaml
@@ -32,15 +32,15 @@
 2d.text.draw.space.collapse.space:    "text-styles"
 2d.text.draw.space.collapse.start:    "text-styles"
 2d.state:                             "the-canvas-state"
-2d.canvas:                            "../html/semantics/embedded-content/the-canvas-element/"
-2d.getcontext:                        "../html/semantics/embedded-content/the-canvas-element/"
-2d.scaled:                            "../html/semantics/embedded-content/the-canvas-element/"
-2d.type:                              "../html/semantics/embedded-content/the-canvas-element/"
-context:                              "../html/semantics/embedded-content/the-canvas-element/"
-fallback:                             "../html/semantics/embedded-content/the-canvas-element/"
-initial:                              "../html/semantics/embedded-content/the-canvas-element/"
-security:                             "../html/semantics/embedded-content/the-canvas-element/"
-size:                                 "../html/semantics/embedded-content/the-canvas-element/"
-toBlob:                               "../html/semantics/embedded-content/the-canvas-element/"
-toDataURL:                            "../html/semantics/embedded-content/the-canvas-element/"
-type:                                 "../html/semantics/embedded-content/the-canvas-element/"
+2d.canvas:                            "../html/semantics/embedded-content/the-canvas-element"
+2d.getcontext:                        "../html/semantics/embedded-content/the-canvas-element"
+2d.scaled:                            "../html/semantics/embedded-content/the-canvas-element"
+2d.type:                              "../html/semantics/embedded-content/the-canvas-element"
+context:                              "../html/semantics/embedded-content/the-canvas-element"
+fallback:                             "../html/semantics/embedded-content/the-canvas-element"
+initial:                              "../html/semantics/embedded-content/the-canvas-element"
+security:                             "../html/semantics/embedded-content/the-canvas-element"
+size:                                 "../html/semantics/embedded-content/the-canvas-element"
+toBlob:                               "../html/semantics/embedded-content/the-canvas-element"
+toDataURL:                            "../html/semantics/embedded-content/the-canvas-element"
+type:                                 "../html/semantics/embedded-content/the-canvas-element"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/spec.yaml b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/spec.yaml
index eb46206..278dc95 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/spec.yaml
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/spec.yaml
@@ -1,6 +1,6 @@
-# Extracts from http://www.whatwg.org/specs/web-apps/current-work/
+# Extracts from https://html.spec.whatwg.org/
 #
-# (c) Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and Opera Software ASA.
+# Parts of this specification are © Copyright 2004-2014 Apple Inc., Mozilla Foundation, and Opera Software ASA.
 # You are granted a license to use, reproduce and create derivative works of this document.
 
 assertions:
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/specextract.py b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/specextract.py
index 042c0bd..c3b4a07 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/specextract.py
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/tools/specextract.py
@@ -1,15 +1,16 @@
 import html5lib
 import html5lib.treebuilders.dom
+import re
 
 # Expected use:
-#   curl --compressed http://www.whatwg.org/specs/web-apps/current-work/ >current-work
+#   curl --compressed https://html.spec.whatwg.org/multipage/canvas.html >current-work
 #   python specextract.py
 #
 # Generates current-work-canvas.xhtml, for use by gentest.py to create the annotated spec document
 
 def extract():
-    parser = html5lib.html5parser.HTMLParser(tree=html5lib.treebuilders.dom.TreeBuilder)
-    doc = parser.parse(open('current-work', "r"), encoding='utf-8')
+    parser = html5lib.html5parser.HTMLParser(tree=html5lib.getTreeBuilder("dom"))
+    doc = parser.parse(open('current-work', "r"), transport_encoding='utf-8')
 
     head = doc.getElementsByTagName('head')[0]
     for n in head.childNodes:
@@ -20,9 +21,15 @@
     #thecanvas = doc.getElementById('the-canvas') # doesn't work (?!)
     thecanvas = [ n for n in doc.getElementsByTagName('h4') if n.getAttribute('id') == 'the-canvas-element' ][0]
 
+    # Add copyright from https://html.spec.whatwg.org/multipage/acknowledgements.html#acknowledgments
+    copy = doc.createElement('p')
+    copy.setAttribute('class', 'copyright')
+    copy.appendChild(doc.createTextNode(u'Parts of this specification are \xA9 Copyright 2004-2014 Apple Inc., Mozilla Foundation, and Opera Software ASA. You are granted a license to use, reproduce and create derivative works of this document.'))
+    header.appendChild(copy)
+
     keep = [header, thecanvas]
     node = thecanvas.nextSibling
-    while node.nodeName != 'h4':
+    while node.nodeName != 'nav':
         keep.append(node)
         node = node.nextSibling
     p = thecanvas.parentNode
@@ -33,23 +40,27 @@
     for n in header.childNodes[3:-4]:
         header.removeChild(n)
 
-    def make_absolute(uri):
-        if uri.startswith('data:'):
-            return uri
-        elif uri[0] == '/':
-            return 'http://www.whatwg.org' + uri
+    def make_absolute(url):
+        match = re.match(r'(\w+:|#)', url)
+        if match:
+            return url
+        elif url[0] == '/':
+            return 'https://html.spec.whatwg.org' + url
         else:
-            return 'http://www.whatwg.org/specs/web-apps/current-work/' + uri
+            return 'https://html.spec.whatwg.org/multipage/' + url
 
-    # Fix the stylesheet, icon and image references
-    for e in doc.getElementsByTagName('link'):
+    # Fix relative URLs
+    for e in doc.getElementsByTagName('script'):
+        e.setAttribute('src', make_absolute(e.getAttribute('src')))
+    for e in doc.getElementsByTagName('iframe'):
+        e.setAttribute('src', make_absolute(e.getAttribute('src')))
+    for e in doc.getElementsByTagName('img'):
+        e.setAttribute('src', make_absolute(e.getAttribute('src')))
+    for e in doc.getElementsByTagName('a'):
         e.setAttribute('href', make_absolute(e.getAttribute('href')))
-    for img in doc.getElementsByTagName('img'):
-        img.setAttribute('src', make_absolute(img.getAttribute('src')))
 
     # Convert to XHTML, because it's quicker to re-parse than HTML5
     doc.documentElement.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml')
-    doc.documentElement.setAttribute('xml:lang', doc.documentElement.getAttribute('lang'))
     doc.removeChild(doc.firstChild) # remove the DOCTYPE
 
     open('current-work-canvas.xhtml', 'w').write(doc.toxml(encoding = 'UTF-8'))
diff --git a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm
new file mode 100644
index 0000000..ccd9f7c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Tests CORS denying preflighted request to resource without CORS headers for OPTIONS</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+  </head>
+  <body>
+    <script type="text/javascript">
+    test(function() {
+      const xhr = new XMLHttpRequest;
+
+      xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+          "/XMLHttpRequest/resources/access-control-basic-options-not-supported.py", false);
+
+      // Non-CORS-safelisted header
+      xhr.setRequestHeader("x-test", "foobar");
+
+      // This fails because the server-side script is not prepared for an OPTIONS request
+      try {
+        xhr.send();
+      } catch(e) {
+        assert_equals(xhr.status, 0);
+        return;
+      }
+      assert_unreached("Preflighted request was not denied.");
+    }, "Preflighted cross-origin request denied");
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-preflight-headers-async.htm b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-preflight-headers-async.htm
new file mode 100644
index 0000000..6e05cfe
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-preflight-headers-async.htm
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Test that async CORS requests with custom headers are sent with OPTIONS preflight</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="/common/utils.js"></script>
+  </head>
+  <body>
+    <script type="text/javascript">
+async_test((test) => {
+  let xhr = new XMLHttpRequest;
+  const uuid = token();
+
+  xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+      "/XMLHttpRequest/resources/reset-token.py?token=" + uuid, false);
+  xhr.send();
+
+  xhr = new XMLHttpRequest;
+  xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+      "/XMLHttpRequest/resources/no-custom-header-on-preflight.py?token=" + uuid);
+  xhr.setRequestHeader("x-test", "foobar");
+
+  xhr.onerror = test.unreached_func("Unexpected error");
+
+  xhr.onload = test.step_func_done(() => {
+    assert_equals(xhr.responseText, "PASS");
+  });
+
+  xhr.send();
+}, "Preflighted async request with custom header");
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm
new file mode 100644
index 0000000..3852099
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Tests that preflight requests returning invalid 400 status code result in error.</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+  </head>
+  <body>
+    <script type="text/javascript">
+    async_test((test) => {
+      const xhr = new XMLHttpRequest;
+
+      xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py?code=400");
+
+      xhr.setRequestHeader("x-pass", "pass");
+
+      xhr.onerror = test.step_func_done(function() {
+        assert_equals(xhr.status, 0);
+      });
+
+      xhr.onload = test.unreached_func("Invalid 400 response to preflight should result in error.");
+
+      xhr.send();
+    }, "Request with 400 preflight response");
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html
new file mode 100644
index 0000000..71e1ee8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: stretch;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 200);
+  grid.style.alignItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html
new file mode 100644
index 0000000..01f48ccd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'start' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: start;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html
new file mode 100644
index 0000000..d3c5ae1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'normal' causes no effect on non-replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: stretch;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 200);
+  grid.style.alignItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html
new file mode 100644
index 0000000..1f5ca8d1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'stretch' causes no effect on non-replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: normal;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 200);
+  grid.style.alignItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html
new file mode 100644
index 0000000..07b0aca7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid's align-items value from 'start' to 'normal' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: start;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html
new file mode 100644
index 0000000..f0f4d5d4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'normal' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: normal;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 200);
+  grid.style.alignItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html
new file mode 100644
index 0000000..5dd70bd1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'stretch' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 80px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: start;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-height", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html
new file mode 100644
index 0000000..f1b22c56
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'stretch' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 80px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: stretch;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 80);
+  grid.style.alignItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html
new file mode 100644
index 0000000..fb0041c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'normal' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 80px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: start;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-height", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html
new file mode 100644
index 0000000..1e68845b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 80px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: normal;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 80);
+  grid.style.alignItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html
new file mode 100644
index 0000000..e388520
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'start' causes replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: stretch;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 200);
+  grid.style.alignItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html
new file mode 100644
index 0000000..3ab4977a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'start' to 'stretch' causes replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: start;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html
new file mode 100644
index 0000000..bd6ce3f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'normal' causes replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: stretch;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 200);
+  grid.style.alignItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html
new file mode 100644
index 0000000..ab56566
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: normal;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html
new file mode 100644
index 0000000..844713a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'normal' causes no effect on replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: start;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html
new file mode 100644
index 0000000..dd3b4be
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'start' causes no effect on replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 200px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: normal;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html
new file mode 100644
index 0000000..5b2c20e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'stretch' causes replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 80px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: start;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 100);
+  grid.style.alignItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-height", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html
new file mode 100644
index 0000000..77711aaa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'stretch' to 'start' causes replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 100px;
+  grid-template-rows: 80px;
+  font: 20px/1 Ahem;
+  background: grey;
+  align-items: stretch;
+}
+#item {
+  background: blue;
+  align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-height", 80);
+  grid.style.alignItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html
new file mode 100644
index 0000000..9d0bbc9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: stretch;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 200);
+  grid.style.justifyItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html
new file mode 100644
index 0000000..86dc271
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'start' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: start;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 120);
+  grid.style.justifyItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html
new file mode 100644
index 0000000..1c92223
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'normal' causes no effect on non-replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: stretch;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 200);
+  grid.style.alignItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html
new file mode 100644
index 0000000..94a634b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'stretch' causes no effect on non-replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: normal;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 200);
+  grid.style.justifyItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html
new file mode 100644
index 0000000..3476f122
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid's justify-items value from 'start' to 'normal' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: start;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 120);
+  grid.style.justifyItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html
new file mode 100644
index 0000000..92db002
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'normal' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: normal;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 200);
+  grid.style.justifyItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html
new file mode 100644
index 0000000..997fa85
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'stretch' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 80px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: start;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 120);
+  grid.style.justifyItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-width", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html
new file mode 100644
index 0000000..9d18be6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'stretch' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 80px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: stretch;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 80);
+  grid.style.justifyItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html
new file mode 100644
index 0000000..78b9fbd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'normal' causes non-replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 80px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: start;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 120);
+  grid.style.justifyItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-width", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html
new file mode 100644
index 0000000..1426cc41
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 80px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: normal;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 80);
+  grid.style.justifyItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html
new file mode 100644
index 0000000..ca9f47a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'start' causes replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: stretch;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 200);
+  grid.style.justifyItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html
new file mode 100644
index 0000000..103b04d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'start' to 'stretch' causes replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: start;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 100);
+  grid.style.justifyItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html
new file mode 100644
index 0000000..9c85e5a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'normal' causes replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: stretch;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 200);
+  grid.style.justifyItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html
new file mode 100644
index 0000000..093c0f9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: normal;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 100);
+  grid.style.justifyItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html
new file mode 100644
index 0000000..1cf53580
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'normal' causes no effect on replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: start;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 100);
+  grid.style.justifyItems = "normal";
+  evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html
new file mode 100644
index 0000000..87ec1ae
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'start' causes no effect on replaced items.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 200px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: normal;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 100);
+  grid.style.justifyItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html
new file mode 100644
index 0000000..1968522
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'stretch' causes replaced items to shrink.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 80px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: start;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 100);
+  grid.style.justifyItems = "stretch";
+  evaluateStyleChange(item, "after", "data-expected-width", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html
new file mode 100644
index 0000000..a797403
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'stretch' to 'start' causes replaced items to grow.">
+<style>
+.grid {
+  position: relative;
+  display: inline-grid;
+  grid-template-columns: 80px;
+  grid-template-rows: 100px;
+  font: 20px/1 Ahem;
+  background: grey;
+  justify-items: stretch;
+}
+#item {
+  background: blue;
+  justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+  evaluateStyleChange(item, "before", "data-expected-width", 80);
+  grid.style.justifyItems = "start";
+  evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+  <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/support/style-change.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/support/style-change.js
new file mode 100644
index 0000000..636b08a3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid-1/support/style-change.js
@@ -0,0 +1,5 @@
+function evaluateStyleChange(element, phase, expectedProperty, expectedResult) {
+    element.className += " " + phase;
+    element.setAttribute(expectedProperty, expectedResult);
+    checkLayout("." + phase);
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-values-3/absolute-length-units-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-values-3/absolute-length-units-001.html
new file mode 100644
index 0000000..ae208345
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-values-3/absolute-length-units-001.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>absolute length units test</title>
+<meta name="author" title="Hwanseung Lee" href="mailto:hs1217.lee@samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-values-3/#absolute-lengths"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+    #t1 { width: 96px; height: 2.54cm; }
+    #t2 { width: 2.54cm; height: 25.4mm; }
+    #t3 { width: 25.4mm; height: 101.6q; }
+    #t4 { width: 101.6q; height: 1in; }
+    #t5 { width: 1in; height: 6pc; }
+    #t6 { width: 6pc; height: 72pt; }
+    #t7 { width: 72pt; height: 96px; }
+</style>
+</head>
+<body>
+    <div id="t1"> </div>
+    <div id="t2"> </div>
+    <div id="t3"> </div>
+    <div id="t4"> </div>
+    <div id="t5"> </div>
+    <div id="t6"> </div>
+    <div id="t7"> </div>
+
+    <script type="text/javascript">
+
+    var test_items = ["t1", "t2", "t3", "t4", "t5", "t6", "t7"]
+
+    function getPropertyValue(id, property) {
+        var elem = document.getElementById(id);
+        return window.getComputedStyle(elem, null).getPropertyValue(property);
+    }
+
+    test(function(){
+        for (var i = 0; i < test_items.length; i++) {
+            assert_equals(getPropertyValue(test_items[i], "width"), getPropertyValue(test_items[i], "height"));
+        }
+    }, "all width and height should be same");
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-cancel-stream.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-cancel-stream.html
index 2a02e1f..58d6745 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-cancel-stream.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-cancel-stream.html
@@ -12,7 +12,6 @@
   <body>
     <script src="../resources/utils.js"></script>
     <script>
-
 promise_test(function(test) {
     return new Response(new Blob([], { "type" : "text/plain" })).body.cancel();
 }, "Cancelling a starting blob Response stream");
@@ -51,16 +50,19 @@
 }, "Cancelling a loading Response stream");
 
 promise_test(function() {
+    async function readAll(reader) {
+      while (true) {
+        const {value, done} = await reader.read();
+        if (done)
+          return;
+      }
+    }
+
     return fetch(RESOURCES_DIR + "top.txt").then(function(response) {
         var reader = response.body.getReader();
-        var closedPromise = reader.closed.then(function() {
-            return reader.cancel();
-        });
-        reader.read();
-        return closedPromise;
+        return readAll(reader).then(() => reader.cancel());
     });
 }, "Cancelling a closed Response stream");
-
     </script>
   </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-expected.txt
index db7cf7d5..1177c75 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 640 tests; 604 PASS, 36 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 640 tests; 608 PASS, 32 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS <img srcset="/images/green-1x1.png?a2 300w, /images/green-16x16.png?a2 301w"> ref sizes="100vw" (standards mode)
 PASS <img srcset="/images/green-1x1.png?b2 450w, /images/green-16x16.png?b2 451w"> ref sizes="100vw" (standards mode)
 PASS <img srcset="/images/green-1x1.png?c2 600w, /images/green-16x16.png?c2 601w"> ref sizes="100vw" (standards mode)
@@ -19,7 +19,7 @@
 PASS <img srcset="/images/green-1x1.png?e14 50w, /images/green-16x16.png?e14 51w" sizes="0.1vmax"> ref sizes="1px" (standards mode)
 PASS <img srcset="/images/green-1x1.png?e15 50w, /images/green-16x16.png?e15 51w" sizes="0.1cm"> ref sizes="1px" (standards mode)
 PASS <img srcset="/images/green-1x1.png?e16 50w, /images/green-16x16.png?e16 51w" sizes="1mm"> ref sizes="1px" (standards mode)
-FAIL <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png"
+PASS <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (standards mode)
 PASS <img srcset="/images/green-1x1.png?e18 50w, /images/green-16x16.png?e18 51w" sizes="0.01in"> ref sizes="1px" (standards mode)
 PASS <img srcset="/images/green-1x1.png?e19 50w, /images/green-16x16.png?e19 51w" sizes="0.1pc"> ref sizes="1px" (standards mode)
 PASS <img srcset="/images/green-1x1.png?e20 50w, /images/green-16x16.png?e20 51w" sizes="0.1pt"> ref sizes="1px" (standards mode)
@@ -179,7 +179,7 @@
 PASS <img srcset="/images/green-1x1.png?e14 50w, /images/green-16x16.png?e14 51w" sizes="0.1vmax"> ref sizes="1px" (quirks mode)
 PASS <img srcset="/images/green-1x1.png?e15 50w, /images/green-16x16.png?e15 51w" sizes="0.1cm"> ref sizes="1px" (quirks mode)
 PASS <img srcset="/images/green-1x1.png?e16 50w, /images/green-16x16.png?e16 51w" sizes="1mm"> ref sizes="1px" (quirks mode)
-FAIL <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png"
+PASS <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (quirks mode)
 PASS <img srcset="/images/green-1x1.png?e18 50w, /images/green-16x16.png?e18 51w" sizes="0.01in"> ref sizes="1px" (quirks mode)
 PASS <img srcset="/images/green-1x1.png?e19 50w, /images/green-16x16.png?e19 51w" sizes="0.1pc"> ref sizes="1px" (quirks mode)
 PASS <img srcset="/images/green-1x1.png?e20 50w, /images/green-16x16.png?e20 51w" sizes="0.1pt"> ref sizes="1px" (quirks mode)
@@ -339,7 +339,7 @@
 PASS <img srcset="/images/green-1x1.png?e14 50w, /images/green-16x16.png?e14 51w" sizes="0.1vmax"> ref sizes="1px" (display:none)
 PASS <img srcset="/images/green-1x1.png?e15 50w, /images/green-16x16.png?e15 51w" sizes="0.1cm"> ref sizes="1px" (display:none)
 PASS <img srcset="/images/green-1x1.png?e16 50w, /images/green-16x16.png?e16 51w" sizes="1mm"> ref sizes="1px" (display:none)
-FAIL <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png"
+PASS <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (display:none)
 PASS <img srcset="/images/green-1x1.png?e18 50w, /images/green-16x16.png?e18 51w" sizes="0.01in"> ref sizes="1px" (display:none)
 PASS <img srcset="/images/green-1x1.png?e19 50w, /images/green-16x16.png?e19 51w" sizes="0.1pc"> ref sizes="1px" (display:none)
 PASS <img srcset="/images/green-1x1.png?e20 50w, /images/green-16x16.png?e20 51w" sizes="0.1pt"> ref sizes="1px" (display:none)
@@ -499,7 +499,7 @@
 PASS <img srcset="/images/green-1x1.png?e14 50w, /images/green-16x16.png?e14 51w" sizes="0.1vmax"> ref sizes="1px" (width:1000px)
 PASS <img srcset="/images/green-1x1.png?e15 50w, /images/green-16x16.png?e15 51w" sizes="0.1cm"> ref sizes="1px" (width:1000px)
 PASS <img srcset="/images/green-1x1.png?e16 50w, /images/green-16x16.png?e16 51w" sizes="1mm"> ref sizes="1px" (width:1000px)
-FAIL <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png"
+PASS <img srcset="/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w" sizes="1q"> ref sizes="1px" (width:1000px)
 PASS <img srcset="/images/green-1x1.png?e18 50w, /images/green-16x16.png?e18 51w" sizes="0.01in"> ref sizes="1px" (width:1000px)
 PASS <img srcset="/images/green-1x1.png?e19 50w, /images/green-16x16.png?e19 51w" sizes="0.1pc"> ref sizes="1px" (width:1000px)
 PASS <img srcset="/images/green-1x1.png?e20 50w, /images/green-16x16.png?e20 51w" sizes="0.1pt"> ref sizes="1px" (width:1000px)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist b/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist
index f2eb7a6..7e33959 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist
+++ b/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist
@@ -28,6 +28,7 @@
 INDENT TABS: encoding/legacy*/*
 INDENT TABS: encrypted-media/polyfill/Makefile
 
+TRAILING WHITESPACE: 2dcontext/tools/current-work-canvas.xhtml
 TRAILING WHITESPACE: app-uri/*
 TRAILING WHITESPACE: battery-status/*
 TRAILING WHITESPACE: conformance-checkers/*
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js
index 40a4cbba..abf54934 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js
@@ -43,9 +43,10 @@
         async_task_waituntil(event).then(reportResultExpecting('InvalidStateError'));
         break;
       case 'script-extendable-event':
-        new_event_waituntil().then(reportResultExpecting('InvalidStateError'));
+        self.dispatchEvent(new ExtendableEvent('nontrustedevent'));
         break;
     }
+
     event.source.postMessage('ACK');
   });
 
@@ -70,6 +71,10 @@
     }
   });
 
+self.addEventListener('nontrustedevent', function(event) {
+    sync_waituntil(event).then(reportResultExpecting('InvalidStateError'));
+  });
+
 function reportResultExpecting(expectedResult) {
   return function (result) {
     port.postMessage({result : result, expected: expectedResult});
@@ -80,19 +85,7 @@
 function sync_waituntil(event) {
   return new Promise((res, rej) => {
     try {
-        event.waitUntil(Promise.resolve());
-        res('OK');
-      } catch (error) {
-        res(error.name);
-      }
-  });
-}
-
-function new_event_waituntil() {
-  return new Promise((res, rej) => {
-    try {
-      let e = new ExtendableEvent('foo');
-      e.waitUntil(new Promise(() => {}));
+      event.waitUntil(Promise.resolve());
       res('OK');
     } catch (error) {
       res(error.name);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/registration-tests.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/registration-tests.js
deleted file mode 100644
index cf60628..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/registration-tests.js
+++ /dev/null
@@ -1,460 +0,0 @@
-function registration_tests(register_method, check_error_types) {
-  // The navigator.serviceWorker.register() method guarantees that the newly
-  // installing worker is available as registration.installing when its promise
-  // resolves. However these tests are also used to test installation using a
-  // <link> element where it is possible for the installing worker to have
-  // already become the waiting or active worker. So This method is used to get
-  // the newest worker when these tests need access to the ServiceWorker itself.
-  function get_newest_worker(registration) {
-    if (registration.installing)
-      return registration.installing;
-    if (registration.waiting)
-      return registration.waiting;
-    if (registration.active)
-      return registration.active;
-  }
-
-  promise_test(function(t) {
-      var script = 'resources/registration-worker.js';
-      var scope = 'resources/registration/normal';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_true(
-              registration instanceof ServiceWorkerRegistration,
-              'Successfully registered.');
-            return registration.unregister();
-          });
-    }, 'Registering normal scope');
-
-  promise_test(function(t) {
-      var script = 'resources/registration-worker.js';
-      var scope = 'resources/registration/scope-with-fragment#ref';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_true(
-              registration instanceof ServiceWorkerRegistration,
-              'Successfully registered.');
-            assert_equals(
-              registration.scope,
-              normalizeURL('resources/registration/scope-with-fragment'),
-              'A fragment should be removed from scope')
-            return registration.unregister();
-          });
-    }, 'Registering scope with fragment');
-
-  promise_test(function(t) {
-      var script = 'resources/registration-worker.js';
-      var scope = 'resources/';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_true(
-              registration instanceof ServiceWorkerRegistration,
-              'Successfully registered.');
-            return registration.unregister();
-          });
-    }, 'Registering same scope as the script directory');
-
-  promise_test(function(t) {
-      var script = 'resources/registration-worker.js';
-      var scope = 'resources';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registering same scope as the script directory without the last ' +
-              'slash should fail with SecurityError.');
-    }, 'Registering same scope as the script directory without the last slash');
-
-  promise_test(function(t) {
-      var script = 'resources/registration-worker.js';
-      var scope = 'different-directory/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration scope outside the script directory should fail ' +
-              'with SecurityError.');
-    }, 'Registration scope outside the script directory');
-
-  promise_test(function(t) {
-      var script = 'resources/registration-worker.js';
-      var scope = 'http://example.com/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration scope outside domain should fail with SecurityError.');
-    }, 'Registering scope outside domain');
-
-  promise_test(function(t) {
-      var script = 'http://example.com/worker.js';
-      var scope = 'http://example.com/scope/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration script outside domain should fail with SecurityError.');
-    }, 'Registering script outside domain');
-
-  promise_test(function(t) {
-      var script = 'resources/no-such-worker.js';
-      var scope = 'resources/scope/no-such-worker';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of non-existent script should fail.');
-    }, 'Registering non-existent script');
-
-  promise_test(function(t) {
-      var script = 'resources/invalid-chunked-encoding.py';
-      var scope = 'resources/scope/invalid-chunked-encoding/';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of invalid chunked encoding script should fail.');
-    }, 'Registering invalid chunked encoding script');
-
-  promise_test(function(t) {
-      var script = 'resources/invalid-chunked-encoding-with-flush.py';
-      var scope = 'resources/scope/invalid-chunked-encoding-with-flush/';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of invalid chunked encoding script should fail.');
-    }, 'Registering invalid chunked encoding script with flush');
-
-  promise_test(function(t) {
-      var script = 'resources/mime-type-worker.py';
-      var scope = 'resources/scope/no-mime-type-worker/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration of no MIME type script should fail.');
-    }, 'Registering script with no MIME type');
-
-  promise_test(function(t) {
-      var script = 'resources/mime-type-worker.py?mime=text/plain';
-      var scope = 'resources/scope/bad-mime-type-worker/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration of plain text script should fail.');
-    }, 'Registering script with bad MIME type');
-
-  const validMimeTypes = [
-    'application/ecmascript',
-    'application/javascript',
-    'application/x-ecmascript',
-    'application/x-javascript',
-    'text/ecmascript',
-    'text/javascript',
-    'text/javascript1.0',
-    'text/javascript1.1',
-    'text/javascript1.2',
-    'text/javascript1.3',
-    'text/javascript1.4',
-    'text/javascript1.5',
-    'text/jscript',
-    'text/livescript',
-    'text/x-ecmascript',
-    'text/x-javascript'
-  ];
-
-  for (const validMimeType of validMimeTypes) {
-    promise_test(() => {
-      var script = `resources/mime-type-worker.py?mime=${validMimeType}`;
-      var scope = 'resources/scope/good-mime-type-worker/';
-
-      return register_method(script, {scope}).then(registration => {
-        assert_true(
-          registration instanceof ServiceWorkerRegistration,
-          'Successfully registered.');
-        return registration.unregister();
-      });
-    }, `Registering script with good MIME type ${validMimeType}`);
-
-    promise_test(() => {
-      var script = `resources/import-mime-type-worker.py?mime=${validMimeType}`;
-      var scope = 'resources/scope/good-mime-type-worker/';
-
-      return register_method(script, { scope }).then(registration => {
-        assert_true(
-          registration instanceof ServiceWorkerRegistration,
-          'Successfully registered.');
-        return registration.unregister();
-      });
-    }, `Registering script that imports script with good MIME type ${validMimeType}`);
-  }
-
-  promise_test(function(t) {
-      var script = 'resources/import-mime-type-worker.py';
-      var scope = 'resources/scope/no-mime-type-worker/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration of no MIME type imported script should fail.');
-    }, 'Registering script that imports script with no MIME type');
-
-  promise_test(function(t) {
-      var script = 'resources/import-mime-type-worker.py?mime=text/plain';
-      var scope = 'resources/scope/bad-mime-type-worker/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration of plain text imported script should fail.');
-    }, 'Registering script that imports script with bad MIME type');
-
-
-  promise_test(function(t) {
-      var script = 'resources/redirect.py?Redirect=' +
-                    encodeURIComponent('/resources/registration-worker.js');
-      var scope = 'resources/scope/redirect/';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registration of redirected script should fail.');
-    }, 'Registering redirected script');
-
-  promise_test(function(t) {
-      var script = 'resources/malformed-worker.py?parse-error';
-      var scope = 'resources/scope/parse-error';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of script including parse error should fail.');
-    }, 'Registering script including parse error');
-
-  promise_test(function(t) {
-      var script = 'resources/malformed-worker.py?undefined-error';
-      var scope = 'resources/scope/undefined-error';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of script including undefined error should fail.');
-    }, 'Registering script including undefined error');
-
-  promise_test(function(t) {
-      var script = 'resources/malformed-worker.py?uncaught-exception';
-      var scope = 'resources/scope/uncaught-exception';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of script including uncaught exception should fail.');
-    }, 'Registering script including uncaught exception');
-
-  promise_test(function(t) {
-      var script = 'resources/malformed-worker.py?caught-exception';
-      var scope = 'resources/scope/caught-exception';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_true(
-              registration instanceof ServiceWorkerRegistration,
-              'Successfully registered.');
-            return registration.unregister();
-          });
-    }, 'Registering script including caught exception');
-
-  promise_test(function(t) {
-      var script = 'resources/malformed-worker.py?import-malformed-script';
-      var scope = 'resources/scope/import-malformed-script';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of script importing malformed script should fail.');
-    }, 'Registering script importing malformed script');
-
-  promise_test(function(t) {
-      var script = 'resources/malformed-worker.py?import-no-such-script';
-      var scope = 'resources/scope/import-no-such-script';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'Registration of script importing non-existent script should fail.');
-    }, 'Registering script importing non-existent script');
-
-  promise_test(function(t) {
-      // URL-encoded full-width 'scope'.
-      var name = '%ef%bd%93%ef%bd%83%ef%bd%8f%ef%bd%90%ef%bd%85';
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/' + name + '/escaped-multibyte-character-scope';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_equals(
-              registration.scope,
-              normalizeURL(scope),
-              'URL-encoded multibyte characters should be available.');
-            return registration.unregister();
-          });
-    }, 'Scope including URL-encoded multibyte characters');
-
-  promise_test(function(t) {
-      // Non-URL-encoded full-width "scope".
-      var name = String.fromCodePoint(0xff53, 0xff43, 0xff4f, 0xff50, 0xff45);
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/' + name  + '/non-escaped-multibyte-character-scope';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_equals(
-              registration.scope,
-              normalizeURL(scope),
-              'Non-URL-encoded multibyte characters should be available.');
-            return registration.unregister();
-          });
-    }, 'Scope including non-escaped multibyte characters');
-
-  promise_test(function(t) {
-      var script = 'resources%2fempty-worker.js';
-      var scope = 'resources/scope/encoded-slash-in-script-url';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'URL-encoded slash in the script URL should be rejected.');
-    }, 'Script URL including URL-encoded slash');
-
-  promise_test(function(t) {
-      var script = 'resources%2Fempty-worker.js';
-      var scope = 'resources/scope/encoded-slash-in-script-url';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'URL-encoded slash in the script URL should be rejected.');
-    }, 'Script URL including uppercase URL-encoded slash');
-
-  promise_test(function(t) {
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/scope%2fencoded-slash-in-scope';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'URL-encoded slash in the scope should be rejected.');
-    }, 'Scope including URL-encoded slash');
-
-  promise_test(function(t) {
-      var script = 'resources%5cempty-worker.js';
-      var scope = 'resources/scope/encoded-slash-in-script-url';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'URL-encoded backslash in the script URL should be rejected.');
-    }, 'Script URL including URL-encoded backslash');
-
-  promise_test(function(t) {
-      var script = 'resources%5Cempty-worker.js';
-      var scope = 'resources/scope/encoded-slash-in-script-url';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'URL-encoded backslash in the script URL should be rejected.');
-    }, 'Script URL including uppercase URL-encoded backslash');
-
-  promise_test(function(t) {
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/scope%5cencoded-slash-in-scope';
-      return promise_rejects(t,
-          check_error_types ? new TypeError : null,
-          register_method(script, {scope: scope}),
-          'URL-encoded backslash in the scope should be rejected.');
-    }, 'Scope including URL-encoded backslash');
-
-  promise_test(function(t) {
-      var script = 'resources/././empty-worker.js';
-      var scope = 'resources/scope/parent-reference-in-script-url';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_equals(
-              get_newest_worker(registration).scriptURL,
-              normalizeURL('resources/empty-worker.js'),
-              'Script URL including self-reference should be normalized.');
-            return registration.unregister();
-          });
-    }, 'Script URL including self-reference');
-
-  promise_test(function(t) {
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/././scope/self-reference-in-scope';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_equals(
-              registration.scope,
-              normalizeURL('resources/scope/self-reference-in-scope'),
-              'Scope including self-reference should be normalized.');
-            return registration.unregister();
-          });
-    }, 'Scope including self-reference');
-
-  promise_test(function(t) {
-      var script = 'resources/../resources/empty-worker.js';
-      var scope = 'resources/scope/parent-reference-in-script-url';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_equals(
-              get_newest_worker(registration).scriptURL,
-              normalizeURL('resources/empty-worker.js'),
-              'Script URL including parent-reference should be normalized.');
-            return registration.unregister();
-          });
-    }, 'Script URL including parent-reference');
-
-  promise_test(function(t) {
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/../resources/scope/parent-reference-in-scope';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            assert_equals(
-              registration.scope,
-              normalizeURL('resources/scope/parent-reference-in-scope'),
-              'Scope including parent-reference should be normalized.');
-            return registration.unregister();
-          });
-    }, 'Scope including parent-reference');
-
-  promise_test(function(t) {
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/../scope/parent-reference-in-scope';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Scope not under the script directory should be rejected.');
-    }, 'Scope including parent-reference and not under the script directory');
-
-  promise_test(function(t) {
-      var script = 'resources////empty-worker.js';
-      var scope = 'resources/scope/consecutive-slashes-in-script-url';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Consecutive slashes in the script url should not be unified.');
-    }, 'Script URL including consecutive slashes');
-
-  promise_test(function(t) {
-      var script = 'resources/empty-worker.js';
-      var scope = 'resources/scope////consecutive-slashes-in-scope';
-      return register_method(script, {scope: scope})
-        .then(function(registration) {
-            // Although consecutive slashes in the scope are not unified, the
-            // scope is under the script directory and registration should
-            // succeed.
-            assert_equals(
-              registration.scope,
-              normalizeURL(scope),
-              'Should successfully be registered.');
-            return registration.unregister();
-          })
-    }, 'Scope including consecutive slashes');
-
-  promise_test(function(t) {
-      var script = 'filesystem:' + normalizeURL('resources/empty-worker.js');
-      var scope = 'resources/scope/filesystem-script-url';
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registering a script which has same-origin filesystem: URL should ' +
-              'fail with SecurityError.');
-    }, 'Script URL is same-origin filesystem: URL');
-
-  promise_test(function(t) {
-      var script = 'resources/empty-worker.js';
-      var scope = 'filesystem:' + normalizeURL('resources/scope/filesystem-scope-url');
-      return promise_rejects(t,
-          check_error_types ? 'SecurityError' : null,
-          register_method(script, {scope: scope}),
-          'Registering with the scope that has same-origin filesystem: URL ' +
-              'should fail with SecurityError.');
-    }, 'Scope URL is same-origin filesystem: URL');
-}
diff --git a/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types-expected.txt b/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types-expected.txt
index 43aecdb3..0291158 100644
--- a/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types-expected.txt
@@ -21,6 +21,9 @@
 #o { font-size: 16px; }
 #p { font-size: 1pc; }
 #q { font-size: 100%; }
+#r { font-size: 40q; }
+#s { font-size: 40q; }
+#t { font-size: 40q; }
 Expected result:
 
 #a { font-size: 1em; }
@@ -40,5 +43,8 @@
 #o { font-size: 16px; }
 #p { font-size: 1pc; }
 #q { font-size: 100%; }
+#r { font-size: 40q; }
+#s { font-size: 40q; }
+#t { font-size: 40q; }
 
 
diff --git a/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types.html b/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types.html
index 9d8b2d3a..8213ac1e 100644
--- a/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types.html
+++ b/third_party/WebKit/LayoutTests/fast/css/parsing-css-number-types.html
@@ -11,15 +11,18 @@
 /*Px   */ #h { font-size: 16Px; }
 /*px   */ #i { font-size: 16\70\78; }
 /*pX   */ #j { font-size: 16\70 X; }
-/*Cm   */ #k { font-size: 1Cm;}
-/*MM   */ #l { font-size: 1M\4d;}
-/*In   */ #m { font-size: 1In;}
+/*Cm   */ #k { font-size: 1Cm; }
+/*MM   */ #l { font-size: 1M\4d; }
+/*In   */ #m { font-size: 1In; }
 /*pt   */ #n { font-size: 12pt; }
 /*pt   */ #o { font-size: 16p\78; }
-/*PC   */ #p { font-size: 1\70 C;}
-/*%    */ #q { font-size: 100%;}
-/*mS    #r { pause: 2000mS; }  */
-/*KhZ   #s { pitch: 105KhZ; } */
+/*PC   */ #p { font-size: 1\70 C; }
+/*%    */ #q { font-size: 100%; }
+/*q    */ #r { font-size: 40q; }
+/*q    */ #s { font-size: 40\51; }
+/*q    */ #t { font-size: 40\71; }
+/*mS    #u { pause: 2000mS; }  */
+/*KhZ   #v { pitch: 105KhZ; } */
 </style>
 
 <script>
@@ -77,8 +80,11 @@
 #o { font-size: 16px; }
 #p { font-size: 1pc; }
 #q { font-size: 100%; }
-<!--#r { pause: 2000ms; }  
-#s { pitch: 105kHz; }  -->
+#r { font-size: 40q; }
+#s { font-size: 40q; }
+#t { font-size: 40q; }
+<!--#u { pause: 2000ms; }
+#v { pitch: 105kHz; }  -->
 </pre>
 <script>
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/wait-forever-in-install-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/wait-forever-in-install-worker.js
deleted file mode 100644
index 32349594..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/wait-forever-in-install-worker.js
+++ /dev/null
@@ -1,3 +0,0 @@
-self.addEventListener('install', function(event) {
-    event.waitUntil(new Promise(function() {}));
-  });
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple-expected.txt b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple-expected.txt
deleted file mode 100644
index 2a15954..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-CONSOLE WARNING: line 17: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
-CONSOLE ERROR: line 28: Failed to load http://localhost:8000/xmlhttprequest/resources/access-control-basic-get-fail-non-simple.cgi: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8000' is therefore not allowed access. The response had HTTP status code 403.
-PASS: Exception thrown. Cross-domain access was denied in 'send'. [Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'http://localhost:8000/xmlhttprequest/resources/access-control-basic-get-fail-non-simple.cgi'.].
-
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple.html b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple.html
deleted file mode 100644
index 304601c..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<html>
-<body>
-<pre id='console'></pre>
-<script type="text/javascript">
-function log(message)
-{
-    document.getElementById('console').appendChild(document.createTextNode(message + "\n"));
-}
-
-if (window.testRunner)
-    testRunner.dumpAsText();
-
-(function() {
-    var xhr = new XMLHttpRequest;
-
-    try {
-        xhr.open("GET", "http://localhost:8000/xmlhttprequest/resources/access-control-basic-get-fail-non-simple.cgi", false);
-    } catch(e) {
-        log("FAIL: Exception thrown. Cross-domain access is not allowed in 'open'. [" + e.message + "].");
-        return;
-    }
-
-    // Non-whitelisted method
-    xhr.setRequestHeader("x-webkit", "foobar");
-
-    // This is going to fail because the cgi script is not prepared for an OPTIONS request. 
-    try {
-        xhr.send();
-    } catch(e) {
-        log("PASS: Exception thrown. Cross-domain access was denied in 'send'. [" + e.message + "].");
-        return;
-    }
-
-    log(xhr.responseText);
-})();
-</script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-headers-async-expected.txt b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-headers-async-expected.txt
deleted file mode 100644
index e6acce1..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-headers-async-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-CONSOLE WARNING: line 11: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
-Test that custom headers are not sent with OPTIONS preflight request.
-
-PASS
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-headers-async.html b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-headers-async.html
deleted file mode 100644
index b1d413af..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-headers-async.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<p>Test that custom headers are not sent with OPTIONS preflight request.</p>
-<script>
-if (window.testRunner) {
-    testRunner.dumpAsText();
-    testRunner.waitUntilDone();
-}
-
-function resetStatus()
-{
-    var req = new XMLHttpRequest;
-    req.open("GET", "/resources/reset-temp-file.php?filename=access-control-preflight-headers-status", false);
-    req.send();
-}
-
-function sendRequest()
-{
-    var req = new XMLHttpRequest;
-    req.open("GET", "http://localhost:8000/xmlhttprequest/resources/no-custom-header.php");
-    req.setRequestHeader("X-Custom-Header", "foobar");
-    req.onerror = function() {
-        document.body.appendChild(document.createTextNode("FAIL: onerror called"));
-        if (window.testRunner)
-            testRunner.notifyDone();
-    }
-    req.onload = function() {
-        document.body.appendChild(document.createTextNode(req.responseText));
-        if (window.testRunner)
-            testRunner.notifyDone();
-    }
-    req.send();
-}
-
-resetStatus();
-sendRequest();
-</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400-expected.txt b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400-expected.txt
deleted file mode 100644
index 2dddee0..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-CONSOLE ERROR: Failed to load http://localhost:8000/xmlhttprequest/resources/access-control-preflight-request-invalid-status.php?code=400: Response for preflight has invalid HTTP status code 400
-Test that preflight requests with invalid status code results in error. Should print PASS.
-
-PASS
-
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400.html b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400.html
deleted file mode 100644
index d59d5358..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<html>
-<body>
-<p>Test that preflight requests with invalid status code results in error. Should print PASS.</p>
-<div id="log"></div>
-<script>
-function log(message) {
-    document.getElementById("log").innerHTML += message + "<br>";
-}
-
-if (window.layoutTestController) {
-    layoutTestController.dumpAsText();
-    layoutTestController.waitUntilDone();
-}
-
-var xhr = new XMLHttpRequest();
-xhr.open("GET", "http://localhost:8000/xmlhttprequest/resources/access-control-preflight-request-invalid-status.php?code=400");
-xhr.setRequestHeader("X-Custom-Header", "PASS");
-xhr.onerror = function () {
-    log("PASS");
-    if (window.layoutTestController)
-        layoutTestController.notifyDone();
-};
-xhr.onload = function () {
-    log("FAIL");
-    if (window.layoutTestController)
-        layoutTestController.notifyDone();
-};
-xhr.send();
-</script>
-</html>
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-controller-close-connection.html b/third_party/WebKit/LayoutTests/presentation/presentation-controller-close-connection.html
index 0f09a27..3029e7e 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-controller-close-connection.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-controller-close-connection.html
@@ -3,7 +3,8 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
@@ -13,28 +14,26 @@
 var connection = null;
 
 async_test(t => {
-  presentationServiceMock.then(service => {
-    // This is receiving the user gesture and runs the callback.
-    waitForClick(() => {
-      new PresentationRequest("https://example.com/").start().then(
-        theConnection => {
-          connection = theConnection;
-          connection.onclose = (closeEvent) => {
-            assert_equals(closeEvent.reason, "closed");
-            assert_equals(closeEvent.message, "");
-            assert_equals(connection.state, "closed");
-          };
-          connection.onconnect = () => {
-            // Open a receiver page and pass controller connection's
-            // controllerConnectionPtr and receiverConnectionRequest to it.
-            w = window.open("resources/presentation-receiver-close-connection.html");
-            w.controllerConnectionPtr = service.getControllerConnectionPtr();
-            w.receiverConnectionRequest = service.getReceiverConnectionRequest();
-            w.shouldCallClose = false;
-          };
-        });
-    }, button);
-  });
+  // This is receiving the user gesture and runs the callback.
+  waitForClick(() => {
+    new PresentationRequest("https://example.com/").start().then(
+      theConnection => {
+        connection = theConnection;
+        connection.onclose = (closeEvent) => {
+          assert_equals(closeEvent.reason, "closed");
+          assert_equals(closeEvent.message, "");
+          assert_equals(connection.state, "closed");
+        };
+        connection.onconnect = () => {
+          // Open a receiver page and pass controller connection's
+          // controllerConnectionPtr and receiverConnectionRequest to it.
+          w = window.open("resources/presentation-receiver-close-connection.html");
+          w.controllerConnectionPtr = presentationServiceMock.getControllerConnectionPtr();
+          w.receiverConnectionRequest = presentationServiceMock.getReceiverConnectionRequest();
+          w.shouldCallClose = false;
+        };
+      });
+  }, button);
 
   window.addEventListener("message", t.step_func(e => {
     if (e.data == "receiver connection closed") {
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-controller-connection-closed-by-receiver.html b/third_party/WebKit/LayoutTests/presentation/presentation-controller-connection-closed-by-receiver.html
index 77020d1..6d27668 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-controller-connection-closed-by-receiver.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-controller-connection-closed-by-receiver.html
@@ -3,7 +3,8 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
@@ -12,28 +13,26 @@
 var controllerConnectionClosed = false;
 
 async_test(t => {
-  presentationServiceMock.then(service => {
-    // This is receiving the user gesture and runs the callback.
-    waitForClick(() => {
-      new PresentationRequest("https://example.com/").start().then(
-        connection => {
-          connection.onclose = (closeEvent) => {
-            assert_equals(closeEvent.reason, "closed");
-            assert_equals(closeEvent.message, "");
-            assert_equals(connection.state, "closed");
-            controllerConnectionClosed = true;
-          };
-          connection.onconnect = () => {
-            // Open a receiver page and pass controller connection's
-            // controllerConnectionPtr and receiverConnectionRequest to it.
-            w = window.open("resources/presentation-receiver-close-connection.html");
-            w.controllerConnectionPtr = service.getControllerConnectionPtr();
-            w.receiverConnectionRequest = service.getReceiverConnectionRequest();
-            w.shouldCallClose = true;
-          };
-        });
-    }, button);
-  });
+  // This is receiving the user gesture and runs the callback.
+  waitForClick(() => {
+    new PresentationRequest("https://example.com/").start().then(
+      connection => {
+        connection.onclose = (closeEvent) => {
+          assert_equals(closeEvent.reason, "closed");
+          assert_equals(closeEvent.message, "");
+          assert_equals(connection.state, "closed");
+          controllerConnectionClosed = true;
+        };
+        connection.onconnect = () => {
+          // Open a receiver page and pass controller connection's
+          // controllerConnectionPtr and receiverConnectionRequest to it.
+          w = window.open("resources/presentation-receiver-close-connection.html");
+          w.controllerConnectionPtr = presentationServiceMock.getControllerConnectionPtr();
+          w.receiverConnectionRequest = presentationServiceMock.getReceiverConnectionRequest();
+          w.shouldCallClose = true;
+        };
+      });
+  }, button);
 
   window.addEventListener("message", t.step_func(e => {
       if (e.data == "receiver connection closed") {
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-controller-terminate-connection.html b/third_party/WebKit/LayoutTests/presentation/presentation-controller-terminate-connection.html
index 5ed4479a..7020c976a 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-controller-terminate-connection.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-controller-terminate-connection.html
@@ -3,25 +3,24 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
 
 async_test(t => {
-    presentationServiceMock.then(mockService => {
-    const button = document.querySelector('button');
-    // This is receiving the user gesture and runs the callback.
-    waitForClick(() => {
-      new PresentationRequest('https://example.com').start().then(
-        connection => {
-          connection.onterminate = t.step_func_done();
-          connection.onconnect = () => {
-            connection.terminate();
-          };
-        });
-    }, button);
-  });
+  const button = document.querySelector('button');
+  // This is receiving the user gesture and runs the callback.
+  waitForClick(() => {
+    new PresentationRequest('https://example.com').start().then(
+      connection => {
+        connection.onterminate = t.step_func_done();
+        connection.onconnect = () => {
+          connection.terminate();
+        };
+      });
+  }, button);
 }, "Test that controller connection.terminate() fires onterminate event handler.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-onreceiverconnection.html b/third_party/WebKit/LayoutTests/presentation/presentation-onreceiverconnection.html
index 22d43798..162ef302e 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-onreceiverconnection.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-onreceiverconnection.html
@@ -3,7 +3,8 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <script>
 
@@ -11,21 +12,19 @@
   internals.settings.setPresentationReceiver(true);
   t.add_cleanup(_ => { internals.settings.setPresentationReceiver(false); });
 
-  presentationServiceMock.then(mockService => {
-    const url = 'http://example.com/a.html';
-    const id = 'fakePresentationId';
+  const url = 'http://example.com/a.html';
+  const id = 'fakePresentationId';
 
-    mockService.onSetClient = () => {
-      mockService.onReceiverConnectionAvailable(url, id);
-    };
+  presentationServiceMock.onSetClient = () => {
+    presentationServiceMock.onReceiverConnectionAvailable(url, id);
+  };
 
-    navigator.presentation.receiver.connectionList.then(
-      t.step_func_done(list => {
-        assert_equals(list.connections.length, 1);
-        assert_equals(list.connections[0].url, url);
-        assert_equals(list.connections[0].id, id);
-      }));
-  });
+  navigator.presentation.receiver.connectionList.then(
+    t.step_func_done(list => {
+      assert_equals(list.connections.length, 1);
+      assert_equals(list.connections[0].url, url);
+      assert_equals(list.connections[0].id, id);
+    }));
 }, "Test presentation.receiver.connectionList resolves with incoming connection.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-receiver-terminate-connection.html b/third_party/WebKit/LayoutTests/presentation/presentation-receiver-terminate-connection.html
index 3d462d4..e0414ede 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-receiver-terminate-connection.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-receiver-terminate-connection.html
@@ -3,7 +3,8 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
@@ -12,26 +13,24 @@
 var controllerConnectionTerminated = false;
 
 async_test(t => {
-  presentationServiceMock.then(service => {
-    // This is receiving the user gesture and runs the callback.
-    waitForClick(() => {
-      new PresentationRequest("https://example.com/").start().then(
-        connection => {
-          connection.onterminate = () => {
-            assert_equals(connection.state, "terminated");
-            controllerConnectionTerminated = true;
-          };
-          connection.onconnect = () => {
-            // Open a receiver page and pass controller connection's
-            // controllerConnectionPtr and receiverConnectionRequest to it.
-            var w = window.open(
-                "resources/presentation-receiver-postmessage.html");
-            w.controllerConnectionPtr = service.getControllerConnectionPtr();
-            w.receiverConnectionRequest = service.getReceiverConnectionRequest();
-          };
-        });
-    }, button);
-  });
+  // This is receiving the user gesture and runs the callback.
+  waitForClick(() => {
+    new PresentationRequest("https://example.com/").start().then(
+      connection => {
+        connection.onterminate = () => {
+          assert_equals(connection.state, "terminated");
+          controllerConnectionTerminated = true;
+        };
+        connection.onconnect = () => {
+          // Open a receiver page and pass controller connection's
+          // controllerConnectionPtr and receiverConnectionRequest to it.
+          var w = window.open(
+              "resources/presentation-receiver-postmessage.html");
+          w.controllerConnectionPtr = presentationServiceMock.getControllerConnectionPtr();
+          w.receiverConnectionRequest = presentationServiceMock.getReceiverConnectionRequest();
+        };
+      });
+  }, button);
 
   window.addEventListener("message", t.step_func(e => {
     if (e.data == "passed" || e.data == "failed") {
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-reconnect.html b/third_party/WebKit/LayoutTests/presentation/presentation-reconnect.html
index 6d70f89..68b3e995 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-reconnect.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-reconnect.html
@@ -4,29 +4,28 @@
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="../resources/gc.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
 
 async_test(t => {
-  presentationServiceMock.then(mockService => {
-    var button = document.querySelector('button');
-    var connection = null;
-    var request = new PresentationRequest('https://example.com');
+  var button = document.querySelector('button');
+  var connection = null;
+  var request = new PresentationRequest('https://example.com');
 
-    waitForClick(_ => {
-      request.start().then(conn => {
-        connection = conn;
-        assert_not_equals(connection, null);
+  waitForClick(_ => {
+    request.start().then(conn => {
+      connection = conn;
+      assert_not_equals(connection, null);
 
-        request.reconnect(connection.id).then(
-          t.step_func_done(conn => {
-            assert_true(connection === conn);
-        }));
-      });
-    }, button);
-  });
+      request.reconnect(connection.id).then(
+        t.step_func_done(conn => {
+          assert_true(connection === conn);
+      }));
+    });
+  }, button);
 }, "Test that Presentation.reconnect() resolves with existing presentation connection.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-start-error.html b/third_party/WebKit/LayoutTests/presentation/presentation-start-error.html
index 1f70c78..528c1fc 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-start-error.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-start-error.html
@@ -3,7 +3,8 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
@@ -11,24 +12,22 @@
 var button = document.querySelector('button');
 
 async_test(t => {
-  presentationServiceMock.then(service => {
-    service.startPresentation = urls => {
-      return Promise.resolve({
-        presentation_info: null,
-        error: {
-          error_type: 3 /* PresentationErrorType.PREVIOUS_START_IN_PROGRESS */,
-          message: 'Previous start in progress'
-        }
-      });
-    };
-    // This is receiving the user gesture and runs the callback.
-    waitForClick(() => {
-      var request = new PresentationRequest("http://example.com");
-      request.start().catch(t.step_func_done(ex => {
-        assert_equals(ex.name, 'OperationError');
-      }));
-    }, button);
-  });
+  presentationServiceMock.startPresentation = urls => {
+    return Promise.resolve({
+      presentation_info: null,
+      error: {
+        errorType: blink.mojom.PresentationErrorType.PREVIOUS_START_IN_PROGRESS,
+        message: 'Previous start in progress'
+      }
+    });
+  };
+  // This is receiving the user gesture and runs the callback.
+  waitForClick(() => {
+    var request = new PresentationRequest("http://example.com");
+    request.start().catch(t.step_func_done(ex => {
+      assert_equals(ex.name, 'OperationError');
+    }));
+  }, button);
 }, "Test that the PresentationRequest.start() rejects with OperationError if PresentationService reports PREVIOUS_START_IN_PROGRESS error");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-start.html b/third_party/WebKit/LayoutTests/presentation/presentation-start.html
index ce6e5366..10b7151 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-start.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-start.html
@@ -3,7 +3,8 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
@@ -11,16 +12,14 @@
 var button = document.querySelector('button');
 
 var testPresentationRequestStart = function(t, requestArgument, connectionUrl) {
-  presentationServiceMock.then(service => {
-    // This is receiving the user gesture and runs the callback.
-    waitForClick(() => {
-      new PresentationRequest(requestArgument).start().then(
-      t.step_func_done(connection => {
-        assert_equals(connection.url, connectionUrl);
-        assert_equals(connection.state, 'connecting');
-      }));
-    }, button);
-  });
+  // This is receiving the user gesture and runs the callback.
+  waitForClick(() => {
+    new PresentationRequest(requestArgument).start().then(
+    t.step_func_done(connection => {
+      assert_equals(connection.url, connectionUrl);
+      assert_equals(connection.state, 'connecting');
+    }));
+  }, button);
 };
 
 async_test(t => {
diff --git a/third_party/WebKit/LayoutTests/presentation/presentationconnectionavailableevent-ctor-mock.html b/third_party/WebKit/LayoutTests/presentation/presentationconnectionavailableevent-ctor-mock.html
index 85b752dd..cd3a0c4 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentationconnectionavailableevent-ctor-mock.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentationconnectionavailableevent-ctor-mock.html
@@ -3,25 +3,24 @@
 <body>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="resources/presentation-service-mock.js"></script>
 <button>click me</button>
 <script>
 
 async_test(t => {
-  presentationServiceMock.then(t.step_func(mockService => {
-    var button = document.querySelector('button');
-    // This is receiving the user gesture and runs the callback.
-    waitForClick(t.step_func(_ => {
-      new PresentationRequest('https://example.com').start().then(
-      t.step_func_done(result => {
-        var e = new PresentationConnectionAvailableEvent(
-            'connectionavailable', { connection: result });
-        assert_not_equals(e, null);
-        assert_equals(e.connection, result);
-      }));
-    }), button);
-  }));
+  var button = document.querySelector('button');
+  // This is receiving the user gesture and runs the callback.
+  waitForClick(t.step_func(_ => {
+    new PresentationRequest('https://example.com').start().then(
+    t.step_func_done(result => {
+      var e = new PresentationConnectionAvailableEvent(
+          'connectionavailable', { connection: result });
+      assert_not_equals(e, null);
+      assert_equals(e.connection, result);
+    }));
+  }), button);
 }, "Test that the PresentationConnectionAvailableEvent ctor can take a valid PresentationConnection.")
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/presentation/presentationrequest.html b/third_party/WebKit/LayoutTests/presentation/presentationrequest.html
index 2deab27..b89b15c 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentationrequest.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentationrequest.html
@@ -4,6 +4,9 @@
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="../resources/gc.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
+<script src="resources/presentation-service-mock.js"></script>
 <script>
 
 var presentationUrl = "http://example.com";
diff --git a/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-close-connection.html b/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-close-connection.html
index 84295fe..cdd828a 100644
--- a/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-close-connection.html
+++ b/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-close-connection.html
@@ -2,43 +2,40 @@
 <html>
 <body>
 <script src="../../resources/testharness.js"></script>
-<script src="../../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="presentation-service-mock.js"></script>
 <script>
 
 // Parent window sets parameter for this page.
-assert_not_equals(controllerConnectionPtr, null);
-assert_not_equals(receiverConnectionRequest, null);
 assert_not_equals(shouldCallClose, null);
 
 internals.settings.setPresentationReceiver(true);
 
-presentationServiceMock.then(mockService => {
-  const url = 'http://example.com/a.html';
-  const id = 'fakeSessionId';
+const pageUrl = 'http://example.com/a.html';
+const id = 'fakeSessionId';
 
-  mockService.onSetClient = () => {
-    mockService.onReceiverConnectionAvailable(
-        url, id, controllerConnectionPtr, receiverConnectionRequest);
+presentationServiceMock.onSetClient = () => {
+  presentationServiceMock.onReceiverConnectionAvailable(
+      pageUrl, id, controllerConnectionPtr, receiverConnectionRequest);
+};
+
+navigator.presentation.receiver.connectionList.then(list => {
+  assert_equals(list.connections.length, 1);
+  const connection = list.connections[0];
+  connection.onclose = () => {
+    assert_equals(connection.state, 'closed');
+    setTimeout(() => {
+      assert_equals(list.connections.length, 0);
+      opener.postMessage('receiver connection closed', '*');
+    } ,0);
   };
-
-  navigator.presentation.receiver.connectionList.then(list => {
-    assert_equals(list.connections.length, 1);
-    const connection = list.connections[0];
-    connection.onclose = () => {
-      assert_equals(connection.state, 'closed');
-      setTimeout(() => {
-        assert_equals(list.connections.length, 0);
-        opener.postMessage('receiver connection closed', '*');
-      } ,0);
-    };
-    opener.postMessage('receiver connection ready', '*');
-    if (shouldCallClose) {
-      list.connections.forEach(theConnection => {
-        theConnection.close();
-      });
-    }
-  });
+  opener.postMessage('receiver connection ready', '*');
+  if (shouldCallClose) {
+    list.connections.forEach(theConnection => {
+      theConnection.close();
+    });
+  }
 });
 
 window.onunload = () => {
diff --git a/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-postmessage.html b/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-postmessage.html
index a94f8e8..240ee67 100644
--- a/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-postmessage.html
+++ b/third_party/WebKit/LayoutTests/presentation/resources/presentation-receiver-postmessage.html
@@ -2,7 +2,8 @@
 <html>
 <body>
 <script src="../../resources/testharness.js"></script>
-<script src="../../resources/mojo-helpers.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/third_party/WebKit/public/platform/modules/presentation/presentation.mojom.js"></script>
 <script src="presentation-service-mock.js"></script>
 <script>
 
@@ -14,20 +15,18 @@
 
 var connection = null;
 
-presentationServiceMock.then(mockService => {
-  const url = 'http://example.com/a.html';
-  const id = 'fakeSessionId';
+const pageUrl = 'http://example.com/a.html';
+const id = 'fakeSessionId';
 
-  mockService.onSetClient = () => {
-    mockService.onReceiverConnectionAvailable(
-        url, id, controllerConnectionPtr, receiverConnectionRequest);
-  };
+presentationServiceMock.onSetClient = () => {
+  presentationServiceMock.onReceiverConnectionAvailable(
+      pageUrl, id, controllerConnectionPtr, receiverConnectionRequest);
+};
 
-  navigator.presentation.receiver.connectionList.then(list => {
-    assert_equals(list.connections.length, 1);
-    connection = list.connections[0];
-    connection.terminate();
-  });
+navigator.presentation.receiver.connectionList.then(list => {
+  assert_equals(list.connections.length, 1);
+  connection = list.connections[0];
+  connection.terminate();
 });
 
 window.onunload = () => {
diff --git a/third_party/WebKit/LayoutTests/presentation/resources/presentation-service-mock.js b/third_party/WebKit/LayoutTests/presentation/resources/presentation-service-mock.js
index 9bfcbad0..2767cddf 100644
--- a/third_party/WebKit/LayoutTests/presentation/resources/presentation-service-mock.js
+++ b/third_party/WebKit/LayoutTests/presentation/resources/presentation-service-mock.js
@@ -4,105 +4,99 @@
 
 "use strict";
 
-let presentationServiceMock = loadMojoModules(
-    'presentationServiceMock',
-    [
-      'third_party/WebKit/public/platform/modules/presentation/presentation.mojom',
-      'url/mojo/url.mojom',
-      'mojo/public/js/bindings',
-    ]).then(mojo => {
-      let [ presentationService, url, bindings ] = mojo.modules;
+class MockPresentationConnection {
+};
 
-      class MockPresentationConnection {
-      };
+class PresentationServiceMock {
+  constructor() {
+    this.pendingResponse_ = null;
+    this.bindingSet_ = new mojo.BindingSet(blink.mojom.PresentationService);
+    this.controllerConnectionPtr_ = null;
+    this.receiverConnectionRequest_ = null;
 
-      class PresentationServiceMock {
-        constructor(interfaceProvider) {
-          interfaceProvider.addInterfaceOverrideForTesting(
-              presentationService.PresentationService.name,
-              handle => this.bindingSet_.addBinding(this, handle));
-          this.interfaceProvider_ = interfaceProvider;
-          this.pendingResponse_ = null;
-          this.bindingSet_ = new bindings.BindingSet(
-              presentationService.PresentationService);
-          this.controllerConnectionPtr_ = null;
-          this.receiverConnectionRequest_ = null;
+    this.interceptor_ = new MojoInterfaceInterceptor(
+        blink.mojom.PresentationService.name);
+    this.interceptor_.oninterfacerequest =
+        e => this.bindingSet_.addBinding(this, e.handle);
+    this.interceptor_.start();
 
-          this.onSetClient = null;
-        }
+    this.onSetClient = null;
+  }
 
-        setClient(client) {
-          this.client_ = client;
+  reset() {
+    this.bindingSet_.closeAllBindings();
+    this.interceptor_.stop();
+  }
 
-          if (this.onSetClient)
-            this.onSetClient();
-        }
+  setClient(client) {
+    this.client_ = client;
 
-        startPresentation(urls) {
-          return Promise.resolve({
-              presentation_info: { url: urls[0], id: 'fakePresentationId' },
-              error: null,
-          });
-        }
+    if (this.onSetClient)
+      this.onSetClient();
+  }
 
-        reconnectPresentation(urls) {
-          return Promise.resolve({
-              presentation_info: { url: urls[0], id: 'fakePresentationId' },
-              error: null,
-          });
-        }
+  async startPresentation(urls) {
+    return {
+        presentationInfo: { url: urls[0], id: 'fakePresentationId' },
+        error: null,
+    };
+  }
 
-        terminate(presentationUrl, presentationId) {
-          this.client_.onConnectionStateChanged(
-              { url: presentationUrl, id: presentationId },
-              presentationService.PresentationConnectionState.TERMINATED);
-        }
+  async reconnectPresentation(urls) {
+    return {
+        presentationInfo: { url: urls[0], id: 'fakePresentationId' },
+        error: null,
+    };
+  }
 
-        setPresentationConnection(
-            presentation_info, controllerConnectionPtr,
-            receiverConnectionRequest) {
-          this.controllerConnectionPtr_ = controllerConnectionPtr;
-          this.receiverConnectionRequest_ = receiverConnectionRequest;
-          this.client_.onConnectionStateChanged(
-              presentation_info,
-              presentationService.PresentationConnectionState.CONNECTED);
-        }
+  terminate(presentationUrl, presentationId) {
+    this.client_.onConnectionStateChanged(
+        { url: presentationUrl, id: presentationId },
+        blink.mojom.PresentationConnectionState.TERMINATED);
+  }
 
-        onReceiverConnectionAvailable(
-            strUrl, id, opt_controllerConnectionPtr, opt_receiverConnectionRequest) {
-          const mojoUrl = new url.Url();
-          mojoUrl.url = strUrl;
-          var controllerConnectionPtr = opt_controllerConnectionPtr;
-          if (!controllerConnectionPtr) {
-            controllerConnectionPtr = new presentationService.PresentationConnectionPtr();
-            const connectionBinding = new bindings.Binding(
-                presentationService.PresentationConnection,
-                new MockPresentationConnection(),
-                bindings.makeRequest(controllerConnectionPtr));
-          }
+  setPresentationConnection(
+      presentation_info, controllerConnectionPtr,
+      receiverConnectionRequest) {
+    this.controllerConnectionPtr_ = controllerConnectionPtr;
+    this.receiverConnectionRequest_ = receiverConnectionRequest;
+    this.client_.onConnectionStateChanged(
+        presentation_info,
+        blink.mojom.PresentationConnectionState.CONNECTED);
+  }
 
-          var receiverConnectionRequest = opt_receiverConnectionRequest;
-          if (!receiverConnectionRequest) {
-            receiverConnectionRequest = bindings.makeRequest(
-                new presentationService.PresentationConnectionPtr());
-          }
+  onReceiverConnectionAvailable(
+      strUrl, id, opt_controllerConnectionPtr, opt_receiverConnectionRequest) {
+    const mojoUrl = new url.mojom.Url();
+    mojoUrl.url = strUrl;
+    var controllerConnectionPtr = opt_controllerConnectionPtr;
+    if (!controllerConnectionPtr) {
+      controllerConnectionPtr = new blink.mojom.PresentationConnectionPtr();
+      const connectionBinding = new mojo.Binding(
+          blink.mojom.PresentationConnection,
+          new MockPresentationConnection(),
+          mojo.makeRequest(controllerConnectionPtr));
+    }
 
-          this.client_.onReceiverConnectionAvailable(
-              { url: mojoUrl, id: id },
-              controllerConnectionPtr, receiverConnectionRequest);
-        }
+    var receiverConnectionRequest = opt_receiverConnectionRequest;
+    if (!receiverConnectionRequest) {
+      receiverConnectionRequest = mojo.makeRequest(
+          new blink.mojom.PresentationConnectionPtr());
+    }
 
-        getControllerConnectionPtr() {
-          return this.controllerConnectionPtr_;
-        }
+    this.client_.onReceiverConnectionAvailable(
+        { url: mojoUrl, id: id },
+        controllerConnectionPtr, receiverConnectionRequest);
+  }
 
-        getReceiverConnectionRequest() {
-          return this.receiverConnectionRequest_;
-        }
-      }
+  getControllerConnectionPtr() {
+    return this.controllerConnectionPtr_;
+  }
 
-      return new PresentationServiceMock(mojo.frameInterfaces);
-    });
+  getReceiverConnectionRequest() {
+    return this.receiverConnectionRequest_;
+  }
+}
 
 function waitForClick(callback, button) {
   button.addEventListener('click', callback, { once: true });
@@ -118,3 +112,5 @@
   eventSender.mouseDown();
   eventSender.mouseUp();
 }
+
+let presentationServiceMock = new PresentationServiceMock();
diff --git a/third_party/WebKit/LayoutTests/shadow-dom/crashes/css-focus-recalc.html b/third_party/WebKit/LayoutTests/shadow-dom/crashes/css-focus-recalc.html
new file mode 100644
index 0000000..d4a6f0af
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/shadow-dom/crashes/css-focus-recalc.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<script src='../../resources/testharness.js'></script>
+<script src='../../resources/testharnessreport.js'></script>
+<html>
+<body>
+<style>
+#host:not(:focus)::after {
+    content: 'text';
+}
+</style>
+
+<div id="host" tabindex=0></div>
+</body>
+<script>
+test(() => {
+    host.attachShadow({mode: 'closed'});
+    host.focus();
+    assert_true(true, "This test should not crash.");
+}, "the style is recalculated by host.focus()");
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/svg/as-image/svg-nested-expected.txt b/third_party/WebKit/LayoutTests/svg/as-image/svg-nested-expected.txt
deleted file mode 100644
index 9774b229..0000000
--- a/third_party/WebKit/LayoutTests/svg/as-image/svg-nested-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-Success - a hugely nested SVG did not crash us.
diff --git a/third_party/WebKit/LayoutTests/svg/as-image/svg-nested.html b/third_party/WebKit/LayoutTests/svg/as-image/svg-nested.html
deleted file mode 100644
index ca149e59..0000000
--- a/third_party/WebKit/LayoutTests/svg/as-image/svg-nested.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<html>
-<head>
-<script>
-if (window.testRunner) {
-  testRunner.dumpAsText();
-  testRunner.waitUntilDone();
-}
-</script>
-</head>
-<body>
-Success - a hugely nested SVG did not crash us.
-<script>
-function done() {
-  if (window.testRunner)
-    testRunner.notifyDone();
-  else
-    alert('done!');
-}
-
-var x = '';
-for (i=0; i<50000; ++i)
-  x += '<a>';
-for (i=0; i<50000; ++i)
-  x += '</a>';
-var uri = 'data:image/svg+xml,' + x;
-var i = new Image();
-i.onerror = done;
-i.src = uri;
-</script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/svg/dom/SVGLength-absolute-length-units.html b/third_party/WebKit/LayoutTests/svg/dom/SVGLength-absolute-length-units.html
new file mode 100644
index 0000000..a0adc3e0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/svg/dom/SVGLength-absolute-length-units.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<svg width="1" height="1" visibility="hidden">
+</svg>
+<script>
+var svgElement = document.querySelector("svg");
+var EPSILON = Math.pow(2, -8);
+
+test(function() {
+    svgElement.setAttribute("width", "96px");
+    assert_approx_equals(svgElement.width.baseVal.value, 96, EPSILON);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 96, EPSILON);
+    svgElement.width.baseVal.valueInSpecifiedUnits = 192;
+    assert_approx_equals(svgElement.width.baseVal.value, 192, EPSILON);
+    assert_equals(svgElement.width.baseVal.unitType, SVGLength.SVG_LENGTHTYPE_PX);
+    svgElement.width.baseVal.value = 288;
+    assert_equals(svgElement.width.baseVal.value, 288);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 288, EPSILON);
+}, "Tests px unit");
+
+test(function() {
+    svgElement.setAttribute("width", "2.54cm");
+    assert_approx_equals(svgElement.width.baseVal.value, 96, EPSILON);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 2.54, EPSILON);
+    svgElement.width.baseVal.valueInSpecifiedUnits = 5.08;
+    assert_approx_equals(svgElement.width.baseVal.value, 192, EPSILON);
+    assert_equals(svgElement.width.baseVal.unitType, SVGLength.SVG_LENGTHTYPE_CM);
+    svgElement.width.baseVal.value = 288;
+    assert_equals(svgElement.width.baseVal.value, 288);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 7.62, EPSILON);
+}, "Tests cm unit");
+
+test(function() {
+    svgElement.setAttribute("width", "25.4mm");
+    assert_approx_equals(svgElement.width.baseVal.value, 96, EPSILON);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 25.4, EPSILON);
+    svgElement.width.baseVal.valueInSpecifiedUnits = 50.8;
+    assert_approx_equals(svgElement.width.baseVal.value, 192, EPSILON);
+    assert_equals(svgElement.width.baseVal.unitType, SVGLength.SVG_LENGTHTYPE_MM);
+    svgElement.width.baseVal.value = 288;
+    assert_equals(svgElement.width.baseVal.value, 288);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 76.2, EPSILON);
+}, "Tests mm unit");
+
+test(function() {
+    svgElement.setAttribute("width", "1in");
+    assert_approx_equals(svgElement.width.baseVal.value, 96, EPSILON);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 1, EPSILON);
+    svgElement.width.baseVal.valueInSpecifiedUnits = 2;
+    assert_approx_equals(svgElement.width.baseVal.value, 192, EPSILON);
+    assert_equals(svgElement.width.baseVal.unitType, SVGLength.SVG_LENGTHTYPE_IN);
+    svgElement.width.baseVal.value = 288;
+    assert_equals(svgElement.width.baseVal.value, 288);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 3, EPSILON);
+}, "Tests in unit");
+
+test(function() {
+    svgElement.setAttribute("width", "72pt");
+    assert_approx_equals(svgElement.width.baseVal.value, 96, EPSILON);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 72, EPSILON);
+    svgElement.width.baseVal.valueInSpecifiedUnits = 144;
+    assert_approx_equals(svgElement.width.baseVal.value, 192, EPSILON);
+    assert_equals(svgElement.width.baseVal.unitType, SVGLength.SVG_LENGTHTYPE_PT);
+    svgElement.width.baseVal.value = 288;
+    assert_equals(svgElement.width.baseVal.value, 288);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 216, EPSILON);
+}, "Tests pt unit");
+
+test(function() {
+    svgElement.setAttribute("width", "6pc");
+    assert_approx_equals(svgElement.width.baseVal.value, 96, EPSILON);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 6, EPSILON);
+    svgElement.width.baseVal.valueInSpecifiedUnits = 12;
+    assert_approx_equals(svgElement.width.baseVal.value, 192, EPSILON);
+    assert_equals(svgElement.width.baseVal.unitType, SVGLength.SVG_LENGTHTYPE_PC);
+    svgElement.width.baseVal.value = 288;
+    assert_equals(svgElement.width.baseVal.value, 288);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 18, EPSILON);
+}, "Tests pc unit");
+
+test(function() {
+    svgElement.setAttribute("width", "101.6q");
+    assert_approx_equals(svgElement.width.baseVal.value, 96, EPSILON);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 101.6, EPSILON);
+    svgElement.width.baseVal.valueInSpecifiedUnits = 203.2;
+    assert_approx_equals(svgElement.width.baseVal.value, 192, EPSILON);
+    assert_equals(svgElement.width.baseVal.unitType, SVGLength.SVG_LENGTHTYPE_UNKNOWN);
+    svgElement.width.baseVal.value = 288;
+    assert_equals(svgElement.width.baseVal.value, 288);
+    assert_approx_equals(svgElement.width.baseVal.valueInSpecifiedUnits, 304.8, EPSILON);
+}, "Tests q unit");
+
+</script>
\ No newline at end of file
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 a80b0a5d6..6605a59 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -44,6 +44,11 @@
     getter multiline
     getter multiselectable
     getter onaccessibleclick
+    getter onaccessiblecontextmenu
+    getter onaccessibledecrement
+    getter onaccessiblefocus
+    getter onaccessibleincrement
+    getter onaccessiblescrollintoview
     getter orientation
     getter owns
     getter placeholder
@@ -93,6 +98,11 @@
     setter multiline
     setter multiselectable
     setter onaccessibleclick
+    setter onaccessiblecontextmenu
+    setter onaccessibledecrement
+    setter onaccessiblefocus
+    setter onaccessibleincrement
+    setter onaccessiblescrollintoview
     setter orientation
     setter owns
     setter placeholder
diff --git a/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.cpp b/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.cpp
index 34545cd..4335ada 100644
--- a/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.cpp
@@ -11,17 +11,16 @@
 
 void V8ConstructorAttributeGetter(
     v8::Local<v8::Name> property_name,
-    const v8::PropertyCallbackInfo<v8::Value>& info) {
+    const v8::PropertyCallbackInfo<v8::Value>& info,
+    const WrapperTypeInfo* wrapper_type_info) {
   RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(
       info.GetIsolate(), "Blink_V8ConstructorAttributeGetter");
-  v8::Local<v8::Value> data = info.Data();
-  DCHECK(data->IsExternal());
   V8PerContextData* per_context_data =
       V8PerContextData::From(info.Holder()->CreationContext());
   if (!per_context_data)
     return;
-  V8SetReturnValue(info, per_context_data->ConstructorForType(
-                             WrapperTypeInfo::Unwrap(data)));
+  V8SetReturnValue(info,
+                   per_context_data->ConstructorForType(wrapper_type_info));
 }
 
 v8::Local<v8::Value> V8Deserialize(v8::Isolate* isolate,
diff --git a/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.h b/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.h
index b1e7761e..286aa525 100644
--- a/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.h
+++ b/third_party/WebKit/Source/bindings/core/v8/GeneratedCodeHelper.h
@@ -24,7 +24,8 @@
 
 CORE_EXPORT void V8ConstructorAttributeGetter(
     v8::Local<v8::Name> property_name,
-    const v8::PropertyCallbackInfo<v8::Value>&);
+    const v8::PropertyCallbackInfo<v8::Value>&,
+    const WrapperTypeInfo*);
 
 CORE_EXPORT v8::Local<v8::Value> V8Deserialize(
     v8::Isolate*,
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp b/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp
index 854ccb1..c30afdd 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp
@@ -64,21 +64,19 @@
   v8::Local<v8::Name> name = V8AtomicString(isolate, attribute.name);
   v8::AccessorNameGetterCallback getter = attribute.getter;
   v8::AccessorNameSetterCallback setter = attribute.setter;
-  v8::Local<v8::Value> data =
-      v8::External::New(isolate, const_cast<WrapperTypeInfo*>(attribute.data));
 
   DCHECK(attribute.property_location_configuration);
   if (attribute.property_location_configuration &
       V8DOMConfiguration::kOnInstance) {
     instance_template->SetNativeDataProperty(
-        name, getter, setter, data,
+        name, getter, setter, v8::Local<v8::Value>(),
         static_cast<v8::PropertyAttribute>(attribute.attribute),
         v8::Local<v8::AccessorSignature>());
   }
   if (attribute.property_location_configuration &
       V8DOMConfiguration::kOnPrototype) {
     prototype_template->SetNativeDataProperty(
-        name, getter, setter, data,
+        name, getter, setter, v8::Local<v8::Value>(),
         static_cast<v8::PropertyAttribute>(attribute.attribute),
         v8::Local<v8::AccessorSignature>());
   }
@@ -100,8 +98,6 @@
   v8::Local<v8::Name> name = V8AtomicString(isolate, config.name);
   v8::AccessorNameGetterCallback getter = config.getter;
   v8::AccessorNameSetterCallback setter = config.setter;
-  v8::Local<v8::Value> data =
-      v8::External::New(isolate, const_cast<WrapperTypeInfo*>(config.data));
   v8::PropertyAttribute attribute =
       static_cast<v8::PropertyAttribute>(config.attribute);
   const unsigned location = config.property_location_configuration;
@@ -110,12 +106,14 @@
   v8::Local<v8::Context> context = isolate->GetCurrentContext();
   if (location & V8DOMConfiguration::kOnInstance && !instance.IsEmpty()) {
     instance
-        ->SetNativeDataProperty(context, name, getter, setter, data, attribute)
+        ->SetNativeDataProperty(context, name, getter, setter,
+                                v8::Local<v8::Value>(), attribute)
         .ToChecked();
   }
   if (location & V8DOMConfiguration::kOnPrototype && !prototype.IsEmpty()) {
     prototype
-        ->SetNativeDataProperty(context, name, getter, setter, data, attribute)
+        ->SetNativeDataProperty(context, name, getter, setter,
+                                v8::Local<v8::Value>(), attribute)
         .ToChecked();
   }
   if (location & V8DOMConfiguration::kOnInterface)
@@ -132,20 +130,18 @@
   v8::AccessorNameGetterCallback getter = attribute.getter;
   DCHECK(!attribute.setter);
   DCHECK_EQ(attribute.world_configuration, V8DOMConfiguration::kAllWorlds);
-  v8::Local<v8::Value> data =
-      v8::External::New(isolate, const_cast<WrapperTypeInfo*>(attribute.data));
 
   DCHECK(attribute.property_location_configuration);
   if (attribute.property_location_configuration &
       V8DOMConfiguration::kOnInstance) {
     instance_template->SetLazyDataProperty(
-        name, getter, data,
+        name, getter, v8::Local<v8::Value>(),
         static_cast<v8::PropertyAttribute>(attribute.attribute));
   }
   if (attribute.property_location_configuration &
       V8DOMConfiguration::kOnPrototype) {
     prototype_template->SetLazyDataProperty(
-        name, getter, data,
+        name, getter, v8::Local<v8::Value>(),
         static_cast<v8::PropertyAttribute>(attribute.attribute));
   }
   if (attribute.property_location_configuration &
@@ -265,8 +261,6 @@
   if (config.holder_check_configuration ==
       V8DOMConfiguration::kDoNotCheckHolder)
     signature = v8::Local<v8::Signature>();
-  v8::Local<v8::Value> data =
-      v8::External::New(isolate, const_cast<WrapperTypeInfo*>(config.data));
 
   const unsigned location = config.property_location_configuration;
   DCHECK(location);
@@ -274,11 +268,12 @@
       (V8DOMConfiguration::kOnInstance | V8DOMConfiguration::kOnPrototype)) {
     v8::Local<FunctionOrTemplate> getter =
         CreateAccessorFunctionOrTemplate<FunctionOrTemplate>(
-            isolate, getter_callback, cached_property_key, data, signature, 0);
+            isolate, getter_callback, cached_property_key,
+            v8::Local<v8::Value>(), signature, 0);
     v8::Local<FunctionOrTemplate> setter =
         CreateAccessorFunctionOrTemplate<FunctionOrTemplate>(
             isolate, setter_callback, V8PrivateProperty::kNoCachedAccessor,
-            data, signature, 1);
+            v8::Local<v8::Value>(), signature, 1);
     if (location & V8DOMConfiguration::kOnInstance &&
         !IsObjectAndEmpty(instance_or_template)) {
       instance_or_template->SetAccessorProperty(
@@ -300,11 +295,11 @@
     v8::Local<FunctionOrTemplate> getter =
         CreateAccessorFunctionOrTemplate<FunctionOrTemplate>(
             isolate, getter_callback, V8PrivateProperty::kNoCachedAccessor,
-            data, v8::Local<v8::Signature>(), 0);
+            v8::Local<v8::Value>(), v8::Local<v8::Signature>(), 0);
     v8::Local<FunctionOrTemplate> setter =
         CreateAccessorFunctionOrTemplate<FunctionOrTemplate>(
             isolate, setter_callback, V8PrivateProperty::kNoCachedAccessor,
-            data, v8::Local<v8::Signature>(), 1);
+            v8::Local<v8::Value>(), v8::Local<v8::Signature>(), 1);
     interface_or_template->SetAccessorProperty(
         name, getter, setter,
         static_cast<v8::PropertyAttribute>(config.attribute));
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.h b/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.h
index f4401553..a9bc59f2 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.h
+++ b/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.h
@@ -82,7 +82,6 @@
     v8::AccessorNameGetterCallback getter;
     v8::AccessorNameSetterCallback setter;
 
-    const WrapperTypeInfo* data;
     // v8::PropertyAttribute
     unsigned attribute : 8;
     // PropertyLocationConfiguration
@@ -143,7 +142,6 @@
     const char* const name;
     v8::FunctionCallback getter;
     v8::FunctionCallback setter;
-    const WrapperTypeInfo* data;
     // V8PrivateProperty::CachedAccessorSymbol
     unsigned cached_property_key : 1;
     // v8::PropertyAttribute
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
index 0847a40..e2058806 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
@@ -435,10 +435,10 @@
                      Protection protection) override {
     switch (protection) {
       case Protection::kNoAccess:
-        WTF::SetSystemPagesInaccessible(data, length);
+        CHECK(WTF::SetSystemPagesAccess(data, length, WTF::PageInaccessible));
         return;
       case Protection::kReadWrite:
-        (void)WTF::SetSystemPagesAccessible(data, length);
+        CHECK(WTF::SetSystemPagesAccess(data, length, WTF::PageReadWrite));
         return;
       default:
         NOTREACHED();
diff --git a/third_party/WebKit/Source/bindings/scripts/code_generator_web_agent_api.py b/third_party/WebKit/Source/bindings/scripts/code_generator_web_agent_api.py
index 96b76aa..61215cf 100644
--- a/third_party/WebKit/Source/bindings/scripts/code_generator_web_agent_api.py
+++ b/third_party/WebKit/Source/bindings/scripts/code_generator_web_agent_api.py
@@ -21,11 +21,15 @@
 
 import os
 import posixpath
+import sys
 
 from code_generator import CodeGeneratorBase, render_template
 # TODO(dglazkov): Move TypedefResolver to code_generator.py
 from code_generator_v8 import TypedefResolver
-from name_style_converter import NameStyleConverter
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', '..',
+                             'third_party', 'blink', 'tools'))
+from blinkpy.common.name_style_converter import NameStyleConverter
 
 MODULE_PYNAME = os.path.splitext(os.path.basename(__file__))[0] + '.py'
 
diff --git a/third_party/WebKit/Source/bindings/scripts/name_style_converer_test.py b/third_party/WebKit/Source/bindings/scripts/name_style_converer_test.py
deleted file mode 100644
index 71067c3..0000000
--- a/third_party/WebKit/Source/bindings/scripts/name_style_converer_test.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=import-error,print-statement,relative-import,protected-access
-
-"""Unit tests for name_style_converter.py."""
-
-import unittest
-
-from name_style_converter import NameStyleConverter
-from name_style_converter import SmartTokenizer
-
-
-class SmartTokenizerTest(unittest.TestCase):
-    def test_simple_cases(self):
-        tokenizer = SmartTokenizer('foo')
-        self.assertEqual(tokenizer.tokenize(), ['foo'])
-
-        tokenizer = SmartTokenizer('fooBar')
-        self.assertEqual(tokenizer.tokenize(), ['foo', 'Bar'])
-
-        tokenizer = SmartTokenizer('fooBarBaz')
-        self.assertEqual(tokenizer.tokenize(), ['foo', 'Bar', 'Baz'])
-
-        tokenizer = SmartTokenizer('Baz')
-        self.assertEqual(tokenizer.tokenize(), ['Baz'])
-
-        tokenizer = SmartTokenizer('')
-        self.assertEqual(tokenizer.tokenize(), [])
-
-        tokenizer = SmartTokenizer('FOO')
-        self.assertEqual(tokenizer.tokenize(), ['FOO'])
-
-        tokenizer = SmartTokenizer('foo2')
-        self.assertEqual(tokenizer.tokenize(), ['foo', '2'])
-
-    def test_tricky_cases(self):
-        tokenizer = SmartTokenizer('XMLHttpRequest')
-        self.assertEqual(tokenizer.tokenize(), ['XML', 'Http', 'Request'])
-
-        tokenizer = SmartTokenizer('HTMLElement')
-        self.assertEqual(tokenizer.tokenize(), ['HTML', 'Element'])
-
-        tokenizer = SmartTokenizer('WebGLRenderingContext')
-        self.assertEqual(tokenizer.tokenize(),
-                         ['WebGL', 'Rendering', 'Context'])
-
-        tokenizer = SmartTokenizer('CanvasRenderingContext2D')
-        self.assertEqual(tokenizer.tokenize(),
-                         ['Canvas', 'Rendering', 'Context', '2D'])
-
-        tokenizer = SmartTokenizer('SVGSVGElement')
-        self.assertEqual(tokenizer.tokenize(), ['SVG', 'SVG', 'Element'])
-
-
-class NameStyleConverterTest(unittest.TestCase):
-    def test_snake_case(self):
-        converter = NameStyleConverter('HTMLElement')
-        self.assertEqual(converter.to_snake_case(), 'html_element')
-
-    def test_upper_camel_case(self):
-        converter = NameStyleConverter('someSuperThing')
-        self.assertEqual(converter.to_upper_camel_case(), 'SomeSuperThing')
-
-        converter = NameStyleConverter('SVGElement')
-        self.assertEqual(converter.to_upper_camel_case(), 'SVGElement')
-
-    def test_macro_case(self):
-        converter = NameStyleConverter('WebGLBaz2D')
-        self.assertEqual(converter.to_macro_case(), 'WEBGL_BAZ_2D')
-
-    def test_all_cases(self):
-        converter = NameStyleConverter('SVGScriptElement')
-        self.assertEqual(converter.to_all_cases(), {
-            'snake_case': 'svg_script_element',
-            'upper_camel_case': 'SVGScriptElement',
-            'macro_case': 'SVG_SCRIPT_ELEMENT',
-        })
diff --git a/third_party/WebKit/Source/bindings/scripts/scripts.gni b/third_party/WebKit/Source/bindings/scripts/scripts.gni
index 844a14e9..d26dba8 100644
--- a/third_party/WebKit/Source/bindings/scripts/scripts.gni
+++ b/third_party/WebKit/Source/bindings/scripts/scripts.gni
@@ -28,32 +28,35 @@
                                          "blink_idl_parser.py",
                                        ],
                                        "abspath")
-idl_compiler_files = get_path_info([
-                                     "idl_compiler.py",
+idl_compiler_files =
+    get_path_info(
+        [
+          "idl_compiler.py",
 
-                                     # Blink IDL front end (ex-lexer/parser)
-                                     "idl_definitions.py",
-                                     "idl_reader.py",
-                                     "idl_types.py",
-                                     "idl_validator.py",
-                                     "interface_dependency_resolver.py",
+          # Blink IDL front end (ex-lexer/parser)
+          "idl_definitions.py",
+          "idl_reader.py",
+          "idl_types.py",
+          "idl_validator.py",
+          "interface_dependency_resolver.py",
 
-                                     # V8 code generator
-                                     "code_generator.py",
-                                     "code_generator_v8.py",
-                                     "code_generator_web_agent_api.py",
-                                     "v8_attributes.py",
-                                     "v8_callback_function.py",
-                                     "v8_callback_interface.py",
-                                     "v8_dictionary.py",
-                                     "v8_globals.py",
-                                     "v8_interface.py",
-                                     "v8_methods.py",
-                                     "v8_types.py",
-                                     "v8_union.py",
-                                     "v8_utilities.py",
-                                   ],
-                                   "abspath")
+          # V8 code generator
+          "code_generator.py",
+          "code_generator_v8.py",
+          "code_generator_web_agent_api.py",
+          "v8_attributes.py",
+          "v8_callback_function.py",
+          "v8_callback_interface.py",
+          "v8_dictionary.py",
+          "v8_globals.py",
+          "v8_interface.py",
+          "v8_methods.py",
+          "v8_types.py",
+          "v8_union.py",
+          "v8_utilities.py",
+          "//third_party/blink/tools/blinkpy/common/name_style_converter.py",
+        ],
+        "abspath")
 
 # Calls the compute_interfaces_info_individual script.
 #
diff --git a/third_party/WebKit/Source/bindings/scripts/v8_attributes.py b/third_party/WebKit/Source/bindings/scripts/v8_attributes.py
index 36f1ba6..9a21120 100644
--- a/third_party/WebKit/Source/bindings/scripts/v8_attributes.py
+++ b/third_party/WebKit/Source/bindings/scripts/v8_attributes.py
@@ -190,8 +190,6 @@
             else ['']),  # [PerWorldBindings]
     }
 
-    if is_constructor_attribute(attribute):
-        update_constructor_attribute_context(interface, attribute, context)
     if not has_custom_getter(attribute):
         getter_context(interface, attribute, context)
     if not has_custom_setter(attribute) and has_setter(interface, attribute):
@@ -252,7 +250,8 @@
 
 
 def is_lazy_data_attribute(attribute):
-    return ((attribute['constructor_type'] and not attribute['needs_constructor_getter_callback']) or
+    return ((attribute['constructor_type'] and not
+             (attribute['measure_as'] or attribute['deprecate_as'])) or
             (attribute['idl_type'] == 'Window' and attribute['name'] == 'frames') or
             (attribute['idl_type'] == 'Window' and attribute['name'] == 'self') or
             (attribute['idl_type'] == 'Window' and attribute['name'] == 'window'))
@@ -604,7 +603,3 @@
 
 def is_named_constructor_attribute(attribute):
     return attribute.idl_type.name.endswith('ConstructorConstructor')
-
-
-def update_constructor_attribute_context(interface, attribute, context):
-    context['needs_constructor_getter_callback'] = context['measure_as'] or context['deprecate_as']
diff --git a/third_party/WebKit/Source/bindings/scripts/v8_interface.py b/third_party/WebKit/Source/bindings/scripts/v8_interface.py
index 1e47d1df..7c948d3e 100644
--- a/third_party/WebKit/Source/bindings/scripts/v8_interface.py
+++ b/third_party/WebKit/Source/bindings/scripts/v8_interface.py
@@ -179,7 +179,6 @@
         'cross_origin_named_getter_counter': counter_prefix + 'CrossOriginNamedGetter',
         'cross_origin_named_setter_counter': counter_prefix + 'CrossOriginNamedSetter',
         'indexed_property_getter_counter': counter_prefix + 'IndexedPropertyGetter',
-        'named_constructor_attribute_getter_counter': counter_prefix + 'NamedConstructorAttributeGetter',
         'named_property_getter_counter': counter_prefix + 'NamedPropertyGetter',
         'named_property_query_counter': counter_prefix + 'NamedPropertyQuery',
         'named_property_setter_counter': counter_prefix + 'NamedPropertySetter',
diff --git a/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
index 7f30504..4ec6d03 100644
--- a/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
@@ -274,7 +274,11 @@
   UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), WebFeature::k{{attribute.measure_as('ConstructorGetter')}});
   {% endif %}
 
-  V8ConstructorAttributeGetter(property, info);
+  {% if attribute.is_named_constructor %}
+  V8{{attribute.constructor_type}}::NamedConstructorAttributeGetter(property, info);
+  {% else %}
+  V8ConstructorAttributeGetter(property, info, &V8{{attribute.constructor_type}}::wrapperTypeInfo);
+  {% endif %}
 }
 {% endmacro %}
 
@@ -498,12 +502,7 @@
 {% macro build_attribute_or_accessor_configuration(attribute, config_type) %}
 {% from 'utilities.cpp.tmpl' import property_location %}
 {% if attribute.constructor_type %}
-  {% if attribute.needs_constructor_getter_callback %}
-    {% set getter_callback = '%s::%sConstructorGetterCallback' % (v8_class_or_partial, attribute.name) %}
-  {% else %}
-    {% set getter_callback = 'V8%s::NamedConstructorAttributeGetter' % (attribute.constructor_type)
-        if attribute.is_named_constructor else 'V8ConstructorAttributeGetter' %}
-  {% endif %}
+  {% set getter_callback = '%s::%sConstructorGetterCallback' % (v8_class_or_partial, attribute.name) %}
   {% set setter_callback = 'nullptr' %}
 {% else %}{# regular attributes #}
   {% set getter_callback = '%s::%sAttributeGetterCallback' % (v8_class_or_partial, attribute.name) %}
@@ -511,9 +510,6 @@
       if attribute.has_setter else 'nullptr' %}
 {% endif %}
 
-{% set wrapper_type_info =
-    'const_cast<WrapperTypeInfo*>(&V8%s::wrapperTypeInfo)' % attribute.constructor_type
-    if attribute.constructor_type else 'nullptr' %}
 {% set property_attribute = 'static_cast<v8::PropertyAttribute>(%s)' %
                             ' | '.join(attribute.property_attributes) %}
 {% set cached_property_key = 'V8PrivateProperty::k' +
@@ -531,13 +527,11 @@
         '"%s"' % attribute.name,
         getter_callback_for_main_world,
         setter_callback_for_main_world,
-        wrapper_type_info,
     ],
     'non_main' : [
         '"%s"' % attribute.name,
         getter_callback,
         setter_callback,
-        wrapper_type_info,
     ],
 } %}
 {% set accessor_only_fields = [] if config_type == 'attribute' else [cached_property_key] %}
diff --git a/third_party/WebKit/Source/bindings/templates/external_reference_table.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/external_reference_table.cpp.tmpl
index c747660..0b755fe3 100644
--- a/third_party/WebKit/Source/bindings/templates/external_reference_table.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/external_reference_table.cpp.tmpl
@@ -27,10 +27,8 @@
     {%-    for world_suffix in attribute.world_suffixes %}
     {%      if not attribute.constructor_type %}
     reinterpret_cast<intptr_t>({{v8_class}}::{{attribute.name}}AttributeGetterCallback{{world_suffix}}),
-    {%      elif attribute.needs_constructor_getter_callback %}
+    {%      else %}
     reinterpret_cast<intptr_t>({{v8_class}}::{{attribute.name}}ConstructorGetterCallback{{world_suffix}}),
-    {%      elif attribute.is_named_constructor %}
-    reinterpret_cast<intptr_t>(V8{{attribute.constructor_type}}::NamedConstructorAttributeGetter{{world_suffix}}),
     {%      endif %}
     {%      if attribute.has_setter %}
     reinterpret_cast<intptr_t>({{v8_class}}::{{attribute.name}}AttributeSetterCallback{{world_suffix}}),
@@ -73,6 +71,7 @@
     {%  endif %}
     {%  if interface.has_security_check %}
     reinterpret_cast<intptr_t>({{v8_class}}::securityCheck),
+    reinterpret_cast<intptr_t>(&{{v8_class}}::wrapperTypeInfo),
     {%  endif %}
 
     {# Other properties #}
@@ -107,17 +106,9 @@
     reinterpret_cast<intptr_t>({{v8_class}}::securityCheck),
     {%-  endif %}
     {% endif %}{# not is_array_buffer_or_view #}
-
-    {% if not interface.is_partial or is_snapshotted %}
-    reinterpret_cast<intptr_t>(&{{interface.v8_name}}::wrapperTypeInfo),
-    {% endif %}
-    {% if interface.named_constructor %}
-    reinterpret_cast<intptr_t>(&{{interface.v8_name}}Constructor::wrapperTypeInfo),
-    {% endif %}
     {% endfor %}{# interfaces #}
 
     reinterpret_cast<intptr_t>(V8ObjectConstructor::IsValidConstructorMode),
-    reinterpret_cast<intptr_t>(V8ConstructorAttributeGetter),
 #endif  // OS_ANDROID
     0  // terminate with a null
   };
diff --git a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
index 8f63d688..1d71f06 100644
--- a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
@@ -689,7 +689,6 @@
 void {{v8_class}}Constructor::NamedConstructorAttributeGetter(
     v8::Local<v8::Name> propertyName,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
-  {{ runtime_timer_scope_disabled_by_default(runtime_call_stats.named_constructor_attribute_getter_counter) }}
   v8::Local<v8::Context> creationContext = info.Holder()->CreationContext();
   V8PerContextData* perContextData = V8PerContextData::From(creationContext);
   if (!perContextData) {
@@ -812,10 +811,10 @@
 {% set getter_callback_for_main_world = '%sForMainWorld' % getter_callback %}
 {% set setter_callback_for_main_world = '%sForMainWorld' % setter_callback
        if not method.is_unforgeable else 'nullptr' %}
-    {"{{method.name}}", {{getter_callback_for_main_world}}, {{setter_callback_for_main_world}}, &{{v8_class}}::wrapperTypeInfo, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, V8DOMConfiguration::MainWorld},
-    {"{{method.name}}", {{getter_callback}}, {{setter_callback}}, &{{v8_class}}::wrapperTypeInfo, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, V8DOMConfiguration::NonMainWorlds}}
+    {"{{method.name}}", {{getter_callback_for_main_world}}, {{setter_callback_for_main_world}}, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, V8DOMConfiguration::MainWorld},
+    {"{{method.name}}", {{getter_callback}}, {{setter_callback}}, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, V8DOMConfiguration::NonMainWorlds}}
 {% else %}
-    {"{{method.name}}", {{getter_callback}}, {{setter_callback}}, &{{v8_class}}::wrapperTypeInfo, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, V8DOMConfiguration::kAllWorlds}
+    {"{{method.name}}", {{getter_callback}}, {{setter_callback}}, {{property_attribute}}, {{property_location(method)}}, {{holder_check}}, V8DOMConfiguration::kAllWorlds}
 {% endif %}
 };
 for (const auto& attributeConfig : {{method.name}}OriginSafeAttributeConfiguration)
diff --git a/third_party/WebKit/Source/bindings/templates/interface.h.tmpl b/third_party/WebKit/Source/bindings/templates/interface.h.tmpl
index b1c113d7..8cfaaeb 100644
--- a/third_party/WebKit/Source/bindings/templates/interface.h.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface.h.tmpl
@@ -18,8 +18,8 @@
   STATIC_ONLY({{v8_class}}Constructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  {{exported}}static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
-  {{exported}}static const WrapperTypeInfo wrapperTypeInfo;
+  static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
+  static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 {% endif %}
@@ -169,7 +169,7 @@
     {%- else -%}
     const v8::FunctionCallbackInfo<v8::Value>&
     {%- endif -%});
-  {% elif attribute.needs_constructor_getter_callback %}
+  {% else %}
   {{exported}}static void {{attribute.name}}ConstructorGetterCallback{{world_suffix}}(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
   {% endif %}
   {% if attribute.has_setter %}
diff --git a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
index 0fe6d85..fc20cdb1 100644
--- a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
@@ -196,7 +196,7 @@
 {% for world_suffix in attribute.world_suffixes %}
 {% if not attribute.constructor_type %}
 {{attribute_getter_callback(attribute, world_suffix)}}
-{% elif attribute.needs_constructor_getter_callback %}
+{% else %}
 {{constructor_getter_callback(attribute, world_suffix)}}
 {% endif %}
 {% if attribute.has_setter %}
diff --git a/third_party/WebKit/Source/bindings/templates/partial_interface.h.tmpl b/third_party/WebKit/Source/bindings/templates/partial_interface.h.tmpl
index 78faefb..9793b9f 100644
--- a/third_party/WebKit/Source/bindings/templates/partial_interface.h.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/partial_interface.h.tmpl
@@ -70,7 +70,7 @@
     {%- else %}
     const v8::FunctionCallbackInfo<v8::Value>& info
     {%- endif %});
-  {% elif attribute.needs_constructor_getter_callback %}
+  {% else %}
   {{exported}}static void {{attribute.name}}ConstructorGetterCallback{{world_suffix}}(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info);
   {% endif %}
   {% if attribute.has_setter %}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp
index 4b94c1a2..d3cb40e2 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp
@@ -115,7 +115,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8SVGTestInterfaceAccessors[] = {
-    { "type", V8SVGTestInterface::typeAttributeGetterCallback, V8SVGTestInterface::typeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "type", V8SVGTestInterface::typeAttributeGetterCallback, V8SVGTestInterface::typeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static void installV8SVGTestInterfaceTemplate(
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp
index 2ceaae32..67b1d6b1 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp
@@ -255,7 +255,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestCallbackFunctionsAccessors[] = {
-    { "customElementsCallbacksReadonlyAttribute", V8TestCallbackFunctions::customElementsCallbacksReadonlyAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customElementsCallbacksReadonlyAttribute", V8TestCallbackFunctions::customElementsCallbacksReadonlyAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestCallbackFunctionsMethods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp
index 629b7ed..2e75bb8 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp
@@ -242,7 +242,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestIntegerIndexedAccessors[] = {
-    { "length", V8TestIntegerIndexed::lengthAttributeGetterCallback, V8TestIntegerIndexed::lengthAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "length", V8TestIntegerIndexed::lengthAttributeGetterCallback, V8TestIntegerIndexed::lengthAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestIntegerIndexedMethods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp
index bc8d73e..8b18bd7a 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp
@@ -242,7 +242,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestIntegerIndexedGlobalAccessors[] = {
-    { "length", V8TestIntegerIndexedGlobal::lengthAttributeGetterCallback, V8TestIntegerIndexedGlobal::lengthAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "length", V8TestIntegerIndexedGlobal::lengthAttributeGetterCallback, V8TestIntegerIndexedGlobal::lengthAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestIntegerIndexedGlobalMethods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp
index 4bcbbe9e..e07a1a22 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp
@@ -242,7 +242,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestIntegerIndexedPrimaryGlobalAccessors[] = {
-    { "length", V8TestIntegerIndexedPrimaryGlobal::lengthAttributeGetterCallback, V8TestIntegerIndexedPrimaryGlobal::lengthAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "length", V8TestIntegerIndexedPrimaryGlobal::lengthAttributeGetterCallback, V8TestIntegerIndexedPrimaryGlobal::lengthAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestIntegerIndexedPrimaryGlobalMethods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
index 76e17ff..1c1cc829 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
@@ -2244,6 +2244,24 @@
   TestInterfaceImplementationV8Internal::testInterfaceAttributeAttributeSetter(v8Value, info);
 }
 
+void V8TestInterface::testInterfaceConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceImplementation_testInterfaceConstructorAttribute_ConstructorGetterCallback");
+
+  V8ConstructorAttributeGetter(property, info, &V8TestInterface::wrapperTypeInfo);
+}
+
+void V8TestInterface::TestInterfaceConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceImplementation_TestInterface_ConstructorGetterCallback");
+
+  V8ConstructorAttributeGetter(property, info, &V8TestInterface::wrapperTypeInfo);
+}
+
+void V8TestInterface::TestInterface2ConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceImplementation_TestInterface2_ConstructorGetterCallback");
+
+  V8ConstructorAttributeGetter(property, info, &V8TestInterface2::wrapperTypeInfo);
+}
+
 void V8TestInterface::doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceImplementation_doubleAttribute_Getter");
 
@@ -3315,66 +3333,66 @@
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 #endif
 static const V8DOMConfiguration::AttributeConfiguration V8TestInterfaceLazyDataAttributes[] = {
-    { "testInterfaceConstructorAttribute", V8ConstructorAttributeGetter, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterface::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceConstructorAttribute", V8TestInterface::testInterfaceConstructorAttributeConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "TestInterface", V8ConstructorAttributeGetter, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterface::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "TestInterface", V8TestInterface::TestInterfaceConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "TestInterface2", V8ConstructorAttributeGetter, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterface2::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "TestInterface2", V8TestInterface::TestInterface2ConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
 #pragma clang diagnostic pop
 #endif
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterfaceAccessors[] = {
-    { "testInterfaceAttribute", V8TestInterface::testInterfaceAttributeAttributeGetterCallback, V8TestInterface::testInterfaceAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceAttribute", V8TestInterface::testInterfaceAttributeAttributeGetterCallback, V8TestInterface::testInterfaceAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doubleAttribute", V8TestInterface::doubleAttributeAttributeGetterCallback, V8TestInterface::doubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doubleAttribute", V8TestInterface::doubleAttributeAttributeGetterCallback, V8TestInterface::doubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "floatAttribute", V8TestInterface::floatAttributeAttributeGetterCallback, V8TestInterface::floatAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "floatAttribute", V8TestInterface::floatAttributeAttributeGetterCallback, V8TestInterface::floatAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unrestrictedDoubleAttribute", V8TestInterface::unrestrictedDoubleAttributeAttributeGetterCallback, V8TestInterface::unrestrictedDoubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unrestrictedDoubleAttribute", V8TestInterface::unrestrictedDoubleAttributeAttributeGetterCallback, V8TestInterface::unrestrictedDoubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unrestrictedFloatAttribute", V8TestInterface::unrestrictedFloatAttributeAttributeGetterCallback, V8TestInterface::unrestrictedFloatAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unrestrictedFloatAttribute", V8TestInterface::unrestrictedFloatAttributeAttributeGetterCallback, V8TestInterface::unrestrictedFloatAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testEnumAttribute", V8TestInterface::testEnumAttributeAttributeGetterCallback, V8TestInterface::testEnumAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testEnumAttribute", V8TestInterface::testEnumAttributeAttributeGetterCallback, V8TestInterface::testEnumAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "stringOrDoubleAttribute", V8TestInterface::stringOrDoubleAttributeAttributeGetterCallback, V8TestInterface::stringOrDoubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "stringOrDoubleAttribute", V8TestInterface::stringOrDoubleAttributeAttributeGetterCallback, V8TestInterface::stringOrDoubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "uncapitalAttribute", V8TestInterface::uncapitalAttributeAttributeGetterCallback, V8TestInterface::uncapitalAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "uncapitalAttribute", V8TestInterface::uncapitalAttributeAttributeGetterCallback, V8TestInterface::uncapitalAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticStringAttribute", V8TestInterface::staticStringAttributeAttributeGetterCallback, V8TestInterface::staticStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticStringAttribute", V8TestInterface::staticStringAttributeAttributeGetterCallback, V8TestInterface::staticStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticReturnDOMWrapperAttribute", V8TestInterface::staticReturnDOMWrapperAttributeAttributeGetterCallback, V8TestInterface::staticReturnDOMWrapperAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticReturnDOMWrapperAttribute", V8TestInterface::staticReturnDOMWrapperAttributeAttributeGetterCallback, V8TestInterface::staticReturnDOMWrapperAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticReadOnlyStringAttribute", V8TestInterface::staticReadOnlyStringAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticReadOnlyStringAttribute", V8TestInterface::staticReadOnlyStringAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticReadOnlyReturnDOMWrapperAttribute", V8TestInterface::staticReadOnlyReturnDOMWrapperAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticReadOnlyReturnDOMWrapperAttribute", V8TestInterface::staticReadOnlyReturnDOMWrapperAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "legacyInterfaceTypeCheckingAttribute", V8TestInterface::legacyInterfaceTypeCheckingAttributeAttributeGetterCallback, V8TestInterface::legacyInterfaceTypeCheckingAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "legacyInterfaceTypeCheckingAttribute", V8TestInterface::legacyInterfaceTypeCheckingAttributeAttributeGetterCallback, V8TestInterface::legacyInterfaceTypeCheckingAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "alwaysExposedAttribute", V8TestInterface::alwaysExposedAttributeAttributeGetterCallback, V8TestInterface::alwaysExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "alwaysExposedAttribute", V8TestInterface::alwaysExposedAttributeAttributeGetterCallback, V8TestInterface::alwaysExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "lenientThisAttribute", V8TestInterface::lenientThisAttributeAttributeGetterCallback, V8TestInterface::lenientThisAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kDoNotCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "lenientThisAttribute", V8TestInterface::lenientThisAttributeAttributeGetterCallback, V8TestInterface::lenientThisAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kDoNotCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implementsStaticReadOnlyLongAttribute", V8TestInterface::implementsStaticReadOnlyLongAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implementsStaticReadOnlyLongAttribute", V8TestInterface::implementsStaticReadOnlyLongAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implementsStaticStringAttribute", V8TestInterface::implementsStaticStringAttributeAttributeGetterCallback, V8TestInterface::implementsStaticStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implementsStaticStringAttribute", V8TestInterface::implementsStaticStringAttributeAttributeGetterCallback, V8TestInterface::implementsStaticStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implementsReadonlyStringAttribute", V8TestInterface::implementsReadonlyStringAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implementsReadonlyStringAttribute", V8TestInterface::implementsReadonlyStringAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implementsStringAttribute", V8TestInterface::implementsStringAttributeAttributeGetterCallback, V8TestInterface::implementsStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implementsStringAttribute", V8TestInterface::implementsStringAttributeAttributeGetterCallback, V8TestInterface::implementsStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implementsNodeAttribute", V8TestInterface::implementsNodeAttributeAttributeGetterCallback, V8TestInterface::implementsNodeAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implementsNodeAttribute", V8TestInterface::implementsNodeAttributeAttributeGetterCallback, V8TestInterface::implementsNodeAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implementsEventHandlerAttribute", V8TestInterface::implementsEventHandlerAttributeAttributeGetterCallback, V8TestInterface::implementsEventHandlerAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implementsEventHandlerAttribute", V8TestInterface::implementsEventHandlerAttributeAttributeGetterCallback, V8TestInterface::implementsEventHandlerAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implements3StringAttribute", V8TestInterface::implements3StringAttributeAttributeGetterCallback, V8TestInterface::implements3StringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implements3StringAttribute", V8TestInterface::implements3StringAttributeAttributeGetterCallback, V8TestInterface::implements3StringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implements3StaticStringAttribute", V8TestInterface::implements3StaticStringAttributeAttributeGetterCallback, V8TestInterface::implements3StaticStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implements3StaticStringAttribute", V8TestInterface::implements3StaticStringAttributeAttributeGetterCallback, V8TestInterface::implements3StaticStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "partial2LongAttribute", V8TestInterface::partial2LongAttributeAttributeGetterCallback, V8TestInterface::partial2LongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "partial2LongAttribute", V8TestInterface::partial2LongAttributeAttributeGetterCallback, V8TestInterface::partial2LongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "partial2StaticLongAttribute", V8TestInterface::partial2StaticLongAttributeAttributeGetterCallback, V8TestInterface::partial2StaticLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "partial2StaticLongAttribute", V8TestInterface::partial2StaticLongAttributeAttributeGetterCallback, V8TestInterface::partial2StaticLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterfaceMethods[] = {
@@ -3500,11 +3518,11 @@
 
   if (RuntimeEnabledFeatures::FeatureNameEnabled()) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "conditionalReadOnlyLongAttribute", V8TestInterface::conditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "conditionalReadOnlyLongAttribute", V8TestInterface::conditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "staticConditionalReadOnlyLongAttribute", V8TestInterface::staticConditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "staticConditionalReadOnlyLongAttribute", V8TestInterface::staticConditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "conditionalLongAttribute", V8TestInterface::conditionalLongAttributeAttributeGetterCallback, V8TestInterface::conditionalLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "conditionalLongAttribute", V8TestInterface::conditionalLongAttributeAttributeGetterCallback, V8TestInterface::conditionalLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(
         isolate, world, instance_template, prototype_template, interface_template,
@@ -3513,9 +3531,9 @@
   }
   if (RuntimeEnabledFeatures::Implements2FeatureNameEnabled()) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "implements2StaticStringAttribute", V8TestInterface::implements2StaticStringAttributeAttributeGetterCallback, V8TestInterface::implements2StaticStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "implements2StaticStringAttribute", V8TestInterface::implements2StaticStringAttributeAttributeGetterCallback, V8TestInterface::implements2StaticStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "implements2StringAttribute", V8TestInterface::implements2StringAttributeAttributeGetterCallback, V8TestInterface::implements2StringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "implements2StringAttribute", V8TestInterface::implements2StringAttributeAttributeGetterCallback, V8TestInterface::implements2StringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(
         isolate, world, instance_template, prototype_template, interface_template,
@@ -3524,7 +3542,7 @@
   }
   if (RuntimeEnabledFeatures::ImplementsFeatureNameEnabled()) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "implementsRuntimeEnabledNodeAttribute", V8TestInterface::implementsRuntimeEnabledNodeAttributeAttributeGetterCallback, V8TestInterface::implementsRuntimeEnabledNodeAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "implementsRuntimeEnabledNodeAttribute", V8TestInterface::implementsRuntimeEnabledNodeAttributeAttributeGetterCallback, V8TestInterface::implementsRuntimeEnabledNodeAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(
         isolate, world, instance_template, prototype_template, interface_template,
@@ -3533,13 +3551,13 @@
   }
   if (RuntimeEnabledFeatures::PartialFeatureNameEnabled()) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "partialCallWithExecutionContextLongAttribute", V8TestInterface::partialCallWithExecutionContextLongAttributeAttributeGetterCallback, V8TestInterface::partialCallWithExecutionContextLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "partialCallWithExecutionContextLongAttribute", V8TestInterface::partialCallWithExecutionContextLongAttributeAttributeGetterCallback, V8TestInterface::partialCallWithExecutionContextLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "partialLongAttribute", V8TestInterface::partialLongAttributeAttributeGetterCallback, V8TestInterface::partialLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "partialLongAttribute", V8TestInterface::partialLongAttributeAttributeGetterCallback, V8TestInterface::partialLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "partialPartialEnumTypeAttribute", V8TestInterface::partialPartialEnumTypeAttributeAttributeGetterCallback, V8TestInterface::partialPartialEnumTypeAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "partialPartialEnumTypeAttribute", V8TestInterface::partialPartialEnumTypeAttributeAttributeGetterCallback, V8TestInterface::partialPartialEnumTypeAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "partialStaticLongAttribute", V8TestInterface::partialStaticLongAttributeAttributeGetterCallback, V8TestInterface::partialStaticLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "partialStaticLongAttribute", V8TestInterface::partialStaticLongAttributeAttributeGetterCallback, V8TestInterface::partialStaticLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(
         isolate, world, instance_template, prototype_template, interface_template,
@@ -3626,45 +3644,45 @@
 
   if (isSecureContext) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "partial2SecureContextAttribute", V8TestInterface::partial2SecureContextAttributeAttributeGetterCallback, V8TestInterface::partial2SecureContextAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "partial2SecureContextAttribute", V8TestInterface::partial2SecureContextAttributeAttributeGetterCallback, V8TestInterface::partial2SecureContextAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "partialSecureContextAttribute", V8TestInterface::partialSecureContextAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "partialSecureContextAttribute", V8TestInterface::partialSecureContextAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "secureContextAttribute", V8TestInterface::secureContextAttributeAttributeGetterCallback, V8TestInterface::secureContextAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "secureContextAttribute", V8TestInterface::secureContextAttributeAttributeGetterCallback, V8TestInterface::secureContextAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
     if (RuntimeEnabledFeatures::PartialFeatureNameEnabled()) {
       static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-          { "partialSecureContextLongAttribute", V8TestInterface::partialSecureContextLongAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "partialSecureContextLongAttribute", V8TestInterface::partialSecureContextLongAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
       };
       V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
     }
     if (RuntimeEnabledFeatures::SecureFeatureEnabled()) {
       static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-          { "partialSecureContextRuntimeEnabledAttribute", V8TestInterface::partialSecureContextRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "partialSecureContextRuntimeEnabledAttribute", V8TestInterface::partialSecureContextRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-          { "secureContextRuntimeEnabledAttribute", V8TestInterface::secureContextRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::secureContextRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "secureContextRuntimeEnabledAttribute", V8TestInterface::secureContextRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::secureContextRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
       };
       V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
     }
   }
   if (executionContext && (executionContext->IsDocument())) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "windowExposedAttribute", V8TestInterface::windowExposedAttributeAttributeGetterCallback, V8TestInterface::windowExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "windowExposedAttribute", V8TestInterface::windowExposedAttributeAttributeGetterCallback, V8TestInterface::windowExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
     if (isSecureContext) {
       static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-          { "partialSecureContextWindowExposedAttribute", V8TestInterface::partialSecureContextWindowExposedAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWindowExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "partialSecureContextWindowExposedAttribute", V8TestInterface::partialSecureContextWindowExposedAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWindowExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-          { "secureContextWindowExposedAttribute", V8TestInterface::secureContextWindowExposedAttributeAttributeGetterCallback, V8TestInterface::secureContextWindowExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "secureContextWindowExposedAttribute", V8TestInterface::secureContextWindowExposedAttributeAttributeGetterCallback, V8TestInterface::secureContextWindowExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
       };
       V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       if (RuntimeEnabledFeatures::SecureFeatureEnabled()) {
         static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-            { "partialSecureContextWindowExposedRuntimeEnabledAttribute", V8TestInterface::partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+            { "partialSecureContextWindowExposedRuntimeEnabledAttribute", V8TestInterface::partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-            { "secureContextWindowExposedRuntimeEnabledAttribute", V8TestInterface::secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+            { "secureContextWindowExposedRuntimeEnabledAttribute", V8TestInterface::secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
         };
         V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       }
@@ -3672,21 +3690,21 @@
   }
   if (executionContext && (executionContext->IsWorkerGlobalScope())) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "workerExposedAttribute", V8TestInterface::workerExposedAttributeAttributeGetterCallback, V8TestInterface::workerExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "workerExposedAttribute", V8TestInterface::workerExposedAttributeAttributeGetterCallback, V8TestInterface::workerExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
     if (isSecureContext) {
       static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-          { "partialSecureContextWorkerExposedAttribute", V8TestInterface::partialSecureContextWorkerExposedAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWorkerExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "partialSecureContextWorkerExposedAttribute", V8TestInterface::partialSecureContextWorkerExposedAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWorkerExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-          { "secureContextWorkerExposedAttribute", V8TestInterface::secureContextWorkerExposedAttributeAttributeGetterCallback, V8TestInterface::secureContextWorkerExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "secureContextWorkerExposedAttribute", V8TestInterface::secureContextWorkerExposedAttributeAttributeGetterCallback, V8TestInterface::secureContextWorkerExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
       };
       V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       if (RuntimeEnabledFeatures::SecureFeatureEnabled()) {
         static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-            { "partialSecureContextWorkerExposedRuntimeEnabledAttribute", V8TestInterface::partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+            { "partialSecureContextWorkerExposedRuntimeEnabledAttribute", V8TestInterface::partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-            { "secureContextWorkerExposedRuntimeEnabledAttribute", V8TestInterface::secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+            { "secureContextWorkerExposedRuntimeEnabledAttribute", V8TestInterface::secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterface::secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
         };
         V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       }
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
index 420ed1b6..9e815f07 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
@@ -66,6 +66,9 @@
 
   CORE_EXPORT static void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
+  CORE_EXPORT static void testInterfaceConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
+  CORE_EXPORT static void TestInterfaceConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
+  CORE_EXPORT static void TestInterface2ConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
   CORE_EXPORT static void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
index 2da3f0ee..fe3c2a9f 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
@@ -684,7 +684,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterface2Accessors[] = {
-    { "size", V8TestInterface2::sizeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum | v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "size", V8TestInterface2::sizeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum | v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterface2Methods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp
index 8391d94..c55bd04 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp
@@ -241,9 +241,9 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterface3Accessors[] = {
-    { "length", V8TestInterface3::lengthAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "length", V8TestInterface3::lengthAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyStringifierAttribute", V8TestInterface3::readonlyStringifierAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyStringifierAttribute", V8TestInterface3::readonlyStringifierAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterface3Methods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp
index 91a2be2..125fb611 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp
@@ -538,22 +538,22 @@
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 #endif
 static const V8DOMConfiguration::AttributeConfiguration V8TestInterfaceCheckSecurityAttributes[] = {
-    { "doNotCheckSecurityLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityLongAttributeAttributeGetterCallback, V8TestInterfaceCheckSecurity::doNotCheckSecurityLongAttributeAttributeSetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doNotCheckSecurityLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityLongAttributeAttributeGetterCallback, V8TestInterfaceCheckSecurity::doNotCheckSecurityLongAttributeAttributeSetterCallback, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doNotCheckSecurityReadonlyLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityReadonlyLongAttributeAttributeGetterCallback, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doNotCheckSecurityReadonlyLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityReadonlyLongAttributeAttributeGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doNotCheckSecurityOnSetterLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityOnSetterLongAttributeAttributeGetterCallback, V8TestInterfaceCheckSecurity::doNotCheckSecurityOnSetterLongAttributeAttributeSetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doNotCheckSecurityOnSetterLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityOnSetterLongAttributeAttributeGetterCallback, V8TestInterfaceCheckSecurity::doNotCheckSecurityOnSetterLongAttributeAttributeSetterCallback, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doNotCheckSecurityReplaceableReadonlyLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityReplaceableReadonlyLongAttributeAttributeGetterCallback, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doNotCheckSecurityReplaceableReadonlyLongAttribute", V8TestInterfaceCheckSecurity::doNotCheckSecurityReplaceableReadonlyLongAttributeAttributeGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
 #pragma clang diagnostic pop
 #endif
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterfaceCheckSecurityAccessors[] = {
-    { "readonlyLongAttribute", V8TestInterfaceCheckSecurity::readonlyLongAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyLongAttribute", V8TestInterfaceCheckSecurity::readonlyLongAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "longAttribute", V8TestInterfaceCheckSecurity::longAttributeAttributeGetterCallback, V8TestInterfaceCheckSecurity::longAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "longAttribute", V8TestInterfaceCheckSecurity::longAttributeAttributeGetterCallback, V8TestInterfaceCheckSecurity::longAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterfaceCheckSecurityMethods[] = {
@@ -605,18 +605,18 @@
 
   // Custom signature
   static const V8DOMConfiguration::AttributeConfiguration doNotCheckSecurityVoidMethodOriginSafeAttributeConfiguration[] = {
-      {"doNotCheckSecurityVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityVoidMethodOriginSafeMethodGetterCallback, V8TestInterfaceCheckSecurity::TestInterfaceCheckSecurityOriginSafeMethodSetterCallback, &V8TestInterfaceCheckSecurity::wrapperTypeInfo, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds}
+      {"doNotCheckSecurityVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityVoidMethodOriginSafeMethodGetterCallback, V8TestInterfaceCheckSecurity::TestInterfaceCheckSecurityOriginSafeMethodSetterCallback, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds}
   };
   for (const auto& attributeConfig : doNotCheckSecurityVoidMethodOriginSafeAttributeConfiguration)
     V8DOMConfiguration::InstallAttribute(isolate, world, instanceTemplate, prototypeTemplate, attributeConfig);
   static const V8DOMConfiguration::AttributeConfiguration doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeAttributeConfiguration[] = {
-      {"doNotCheckSecurityPerWorldBindingsVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallbackForMainWorld, V8TestInterfaceCheckSecurity::TestInterfaceCheckSecurityOriginSafeMethodSetterCallbackForMainWorld, &V8TestInterfaceCheckSecurity::wrapperTypeInfo, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::MainWorld},
-      {"doNotCheckSecurityPerWorldBindingsVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallback, V8TestInterfaceCheckSecurity::TestInterfaceCheckSecurityOriginSafeMethodSetterCallback, &V8TestInterfaceCheckSecurity::wrapperTypeInfo, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::NonMainWorlds}}
+      {"doNotCheckSecurityPerWorldBindingsVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallbackForMainWorld, V8TestInterfaceCheckSecurity::TestInterfaceCheckSecurityOriginSafeMethodSetterCallbackForMainWorld, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::MainWorld},
+      {"doNotCheckSecurityPerWorldBindingsVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallback, V8TestInterfaceCheckSecurity::TestInterfaceCheckSecurityOriginSafeMethodSetterCallback, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::NonMainWorlds}}
   };
   for (const auto& attributeConfig : doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeAttributeConfiguration)
     V8DOMConfiguration::InstallAttribute(isolate, world, instanceTemplate, prototypeTemplate, attributeConfig);
   static const V8DOMConfiguration::AttributeConfiguration doNotCheckSecurityUnforgeableVoidMethodOriginSafeAttributeConfiguration[] = {
-      {"doNotCheckSecurityUnforgeableVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityUnforgeableVoidMethodOriginSafeMethodGetterCallback, nullptr, &V8TestInterfaceCheckSecurity::wrapperTypeInfo, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds}
+      {"doNotCheckSecurityUnforgeableVoidMethod", V8TestInterfaceCheckSecurity::doNotCheckSecurityUnforgeableVoidMethodOriginSafeMethodGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds}
   };
   for (const auto& attributeConfig : doNotCheckSecurityUnforgeableVoidMethodOriginSafeAttributeConfiguration)
     V8DOMConfiguration::InstallAttribute(isolate, world, instanceTemplate, prototypeTemplate, attributeConfig);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp
index b5a622f5..29a82fbf 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp
@@ -423,8 +423,6 @@
 void V8TestInterfaceConstructorConstructor::NamedConstructorAttributeGetter(
     v8::Local<v8::Name> propertyName,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
-  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceConstructor_NamedConstructorAttributeGetter");
-
   v8::Local<v8::Context> creationContext = info.Holder()->CreationContext();
   V8PerContextData* perContextData = V8PerContextData::From(creationContext);
   if (!perContextData) {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
index 22a0b4e..b2acbb29 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
@@ -30,8 +30,8 @@
   STATIC_ONLY(V8TestInterfaceConstructorConstructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  CORE_EXPORT static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
-  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
+  static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
+  static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceConstructor {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp
index a02eabc46..1e97050 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp
@@ -117,7 +117,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterfaceDocumentAccessors[] = {
-    { "location", V8TestInterfaceDocument::locationAttributeGetterCallback, V8TestInterfaceDocument::locationAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "location", V8TestInterfaceDocument::locationAttributeGetterCallback, V8TestInterfaceDocument::locationAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static void installV8TestInterfaceDocumentTemplate(
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp
index d8c232f1..8148f0e0 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp
@@ -130,9 +130,9 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterfaceEventInitConstructorAccessors[] = {
-    { "readonlyStringAttribute", V8TestInterfaceEventInitConstructor::readonlyStringAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyStringAttribute", V8TestInterfaceEventInitConstructor::readonlyStringAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "isTrusted", V8TestInterfaceEventInitConstructor::isTrustedAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "isTrusted", V8TestInterfaceEventInitConstructor::isTrustedAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 void V8TestInterfaceEventInitConstructor::constructorCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.cpp
index 59d1a77..5c59d58 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.cpp
@@ -131,8 +131,6 @@
 void V8TestInterfaceEventTargetConstructor::NamedConstructorAttributeGetter(
     v8::Local<v8::Name> propertyName,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
-  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceEventTarget_NamedConstructorAttributeGetter");
-
   v8::Local<v8::Context> creationContext = info.Holder()->CreationContext();
   V8PerContextData* perContextData = V8PerContextData::From(creationContext);
   if (!perContextData) {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h
index dd70df2..676665e7 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h
@@ -30,8 +30,8 @@
   STATIC_ONLY(V8TestInterfaceEventTargetConstructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  CORE_EXPORT static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
-  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
+  static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
+  static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceEventTarget {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp
index 1596e79..da31d51a 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp
@@ -381,9 +381,9 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterfaceGarbageCollectedAccessors[] = {
-    { "attr1", V8TestInterfaceGarbageCollected::attr1AttributeGetterCallback, V8TestInterfaceGarbageCollected::attr1AttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "attr1", V8TestInterfaceGarbageCollected::attr1AttributeGetterCallback, V8TestInterfaceGarbageCollected::attr1AttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "size", V8TestInterfaceGarbageCollected::sizeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum | v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "size", V8TestInterfaceGarbageCollected::sizeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum | v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterfaceGarbageCollectedMethods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.cpp
index 972a67c7..0b92aa1 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.cpp
@@ -71,6 +71,12 @@
 
 } // namespace TestInterfaceNamedConstructorV8Internal
 
+void V8TestInterfaceNamedConstructor::testNamedConstructorConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceNamedConstructor_testNamedConstructorConstructorAttribute_ConstructorGetterCallback");
+
+  V8TestNamedConstructor::NamedConstructorAttributeGetter(property, info);
+}
+
 // Suppress warning: global constructors, because AttributeConfiguration is trivial
 // and does not depend on another global objects.
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
@@ -78,7 +84,7 @@
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 #endif
 static const V8DOMConfiguration::AttributeConfiguration V8TestInterfaceNamedConstructorLazyDataAttributes[] = {
-    { "testNamedConstructorConstructorAttribute", V8TestNamedConstructor::NamedConstructorAttributeGetter, nullptr, const_cast<WrapperTypeInfo*>(&V8TestNamedConstructor::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testNamedConstructorConstructorAttribute", V8TestInterfaceNamedConstructor::testNamedConstructorConstructorAttributeConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
 #pragma clang diagnostic pop
@@ -208,8 +214,6 @@
 void V8TestInterfaceNamedConstructorConstructor::NamedConstructorAttributeGetter(
     v8::Local<v8::Name> propertyName,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
-  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceNamedConstructor_NamedConstructorAttributeGetter");
-
   v8::Local<v8::Context> creationContext = info.Holder()->CreationContext();
   V8PerContextData* perContextData = V8PerContextData::From(creationContext);
   if (!perContextData) {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h
index 59bf0cc..8c09326 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h
@@ -29,8 +29,8 @@
   STATIC_ONLY(V8TestInterfaceNamedConstructorConstructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  CORE_EXPORT static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
-  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
+  static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
+  static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceNamedConstructor {
@@ -54,6 +54,8 @@
 
   // Callback functions
 
+  CORE_EXPORT static void testNamedConstructorConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
+
   static void InstallRuntimeEnabledFeaturesOnTemplate(
       v8::Isolate*,
       const DOMWrapperWorld&,
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.cpp
index de2645e..ddda413 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.cpp
@@ -140,8 +140,6 @@
 void V8TestInterfaceNamedConstructor2Constructor::NamedConstructorAttributeGetter(
     v8::Local<v8::Name> propertyName,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
-  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterfaceNamedConstructor2_NamedConstructorAttributeGetter");
-
   v8::Local<v8::Context> creationContext = info.Holder()->CreationContext();
   V8PerContextData* perContextData = V8PerContextData::From(creationContext);
   if (!perContextData) {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h
index 775135f..abc1f04 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h
@@ -29,8 +29,8 @@
   STATIC_ONLY(V8TestInterfaceNamedConstructor2Constructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  CORE_EXPORT static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
-  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
+  static void NamedConstructorAttributeGetter(v8::Local<v8::Name> propertyName, const v8::PropertyCallbackInfo<v8::Value>& info);
+  static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceNamedConstructor2 {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp
index 545d219..7ffa1ad26 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp
@@ -408,20 +408,20 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterfaceNodeAccessors[] = {
-    { "nodeName", V8TestInterfaceNode::nodeNameAttributeGetterCallback, V8TestInterfaceNode::nodeNameAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "nodeName", V8TestInterfaceNode::nodeNameAttributeGetterCallback, V8TestInterfaceNode::nodeNameAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "stringAttribute", V8TestInterfaceNode::stringAttributeAttributeGetterCallback, V8TestInterfaceNode::stringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "stringAttribute", V8TestInterfaceNode::stringAttributeAttributeGetterCallback, V8TestInterfaceNode::stringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyTestInterfaceEmptyAttribute", V8TestInterfaceNode::readonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyTestInterfaceEmptyAttribute", V8TestInterfaceNode::readonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "eventHandlerAttribute", V8TestInterfaceNode::eventHandlerAttributeAttributeGetterCallback, V8TestInterfaceNode::eventHandlerAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "eventHandlerAttribute", V8TestInterfaceNode::eventHandlerAttributeAttributeGetterCallback, V8TestInterfaceNode::eventHandlerAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestInterfaceNode::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
-    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestInterfaceNode::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
+    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestInterfaceNode::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
+    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestInterfaceNode::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
 
-    { "reflectStringAttribute", V8TestInterfaceNode::reflectStringAttributeAttributeGetterCallback, V8TestInterfaceNode::reflectStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectStringAttribute", V8TestInterfaceNode::reflectStringAttributeAttributeGetterCallback, V8TestInterfaceNode::reflectStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectUrlStringAttribute", V8TestInterfaceNode::reflectUrlStringAttributeAttributeGetterCallback, V8TestInterfaceNode::reflectUrlStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectUrlStringAttribute", V8TestInterfaceNode::reflectUrlStringAttributeAttributeGetterCallback, V8TestInterfaceNode::reflectUrlStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterfaceNodeMethods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp
index 3cf056d..5488de5 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp
@@ -289,9 +289,9 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterfaceOriginTrialEnabledAccessors[] = {
-    { "doubleAttribute", V8TestInterfaceOriginTrialEnabled::doubleAttributeAttributeGetterCallback, V8TestInterfaceOriginTrialEnabled::doubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doubleAttribute", V8TestInterfaceOriginTrialEnabled::doubleAttributeAttributeGetterCallback, V8TestInterfaceOriginTrialEnabled::doubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticStringAttribute", V8TestInterfaceOriginTrialEnabled::staticStringAttributeAttributeGetterCallback, V8TestInterfaceOriginTrialEnabled::staticStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticStringAttribute", V8TestInterfaceOriginTrialEnabled::staticStringAttributeAttributeGetterCallback, V8TestInterfaceOriginTrialEnabled::staticStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterfaceOriginTrialEnabledMethods[] = {
@@ -351,11 +351,11 @@
 
   if (RuntimeEnabledFeatures::FeatureNameEnabled()) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "conditionalReadOnlyLongAttribute", V8TestInterfaceOriginTrialEnabled::conditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "conditionalReadOnlyLongAttribute", V8TestInterfaceOriginTrialEnabled::conditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "staticConditionalReadOnlyLongAttribute", V8TestInterfaceOriginTrialEnabled::staticConditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "staticConditionalReadOnlyLongAttribute", V8TestInterfaceOriginTrialEnabled::staticConditionalReadOnlyLongAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "conditionalLongAttribute", V8TestInterfaceOriginTrialEnabled::conditionalLongAttributeAttributeGetterCallback, V8TestInterfaceOriginTrialEnabled::conditionalLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "conditionalLongAttribute", V8TestInterfaceOriginTrialEnabled::conditionalLongAttributeAttributeGetterCallback, V8TestInterfaceOriginTrialEnabled::conditionalLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(
         isolate, world, instance_template, prototype_template, interface_template,
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
index 8a2d395..f5d3616 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
@@ -483,12 +483,12 @@
 
   if (isSecureContext) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "secureContextAttribute", V8TestInterfaceSecureContext::secureContextAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "secureContextAttribute", V8TestInterfaceSecureContext::secureContextAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
     if (RuntimeEnabledFeatures::SecureFeatureEnabled()) {
       static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-          { "secureContextRuntimeEnabledAttribute", V8TestInterfaceSecureContext::secureContextRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "secureContextRuntimeEnabledAttribute", V8TestInterfaceSecureContext::secureContextRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
       };
       V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
     }
@@ -496,12 +496,12 @@
   if (executionContext && (executionContext->IsDocument())) {
     if (isSecureContext) {
       static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-          { "secureContextWindowExposedAttribute", V8TestInterfaceSecureContext::secureContextWindowExposedAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWindowExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "secureContextWindowExposedAttribute", V8TestInterfaceSecureContext::secureContextWindowExposedAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWindowExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
       };
       V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       if (RuntimeEnabledFeatures::SecureFeatureEnabled()) {
         static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-            { "secureContextWindowExposedRuntimeEnabledAttribute", V8TestInterfaceSecureContext::secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+            { "secureContextWindowExposedRuntimeEnabledAttribute", V8TestInterfaceSecureContext::secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
         };
         V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       }
@@ -510,12 +510,12 @@
   if (executionContext && (executionContext->IsWorkerGlobalScope())) {
     if (isSecureContext) {
       static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-          { "secureContextWorkerExposedAttribute", V8TestInterfaceSecureContext::secureContextWorkerExposedAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWorkerExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+          { "secureContextWorkerExposedAttribute", V8TestInterfaceSecureContext::secureContextWorkerExposedAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWorkerExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
       };
       V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       if (RuntimeEnabledFeatures::SecureFeatureEnabled()) {
         static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-            { "secureContextWorkerExposedRuntimeEnabledAttribute", V8TestInterfaceSecureContext::secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+            { "secureContextWorkerExposedRuntimeEnabledAttribute", V8TestInterfaceSecureContext::secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
         };
         V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
       }
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp
index 7374765..aed592a 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp
@@ -241,13 +241,13 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestNodeAccessors[] = {
-    { "href", V8TestNode::hrefAttributeGetterCallback, V8TestNode::hrefAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "href", V8TestNode::hrefAttributeGetterCallback, V8TestNode::hrefAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "hrefThrows", V8TestNode::hrefThrowsAttributeGetterCallback, V8TestNode::hrefThrowsAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "hrefThrows", V8TestNode::hrefThrowsAttributeGetterCallback, V8TestNode::hrefThrowsAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "hrefCallWith", V8TestNode::hrefCallWithAttributeGetterCallback, V8TestNode::hrefCallWithAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "hrefCallWith", V8TestNode::hrefCallWithAttributeGetterCallback, V8TestNode::hrefCallWithAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "hrefByteString", V8TestNode::hrefByteStringAttributeGetterCallback, V8TestNode::hrefByteStringAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "hrefByteString", V8TestNode::hrefByteStringAttributeGetterCallback, V8TestNode::hrefByteStringAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 void V8TestNode::constructorCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
index 3b5ac64..cd578ab 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
@@ -10404,9 +10404,15 @@
 void V8TestObject::testInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
   RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestObject_testInterfaceEmptyConstructorAttribute_ConstructorGetterCallback");
 
+  V8ConstructorAttributeGetter(property, info, &V8TestInterfaceEmpty::wrapperTypeInfo);
+}
+
+void V8TestObject::testInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestObject_testInterfaceEmptyConstructorAttribute_ConstructorGetterCallback");
+
   Deprecation::CountDeprecation(CurrentExecutionContext(info.GetIsolate()), WebFeature::kdeprecatedTestInterfaceEmptyConstructorAttribute);
 
-  V8ConstructorAttributeGetter(property, info);
+  V8ConstructorAttributeGetter(property, info, &V8TestInterfaceEmpty::wrapperTypeInfo);
 }
 
 void V8TestObject::measureAsFeatureNameTestInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
@@ -10414,7 +10420,7 @@
 
   UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), WebFeature::kFeatureName);
 
-  V8ConstructorAttributeGetter(property, info);
+  V8ConstructorAttributeGetter(property, info, &V8TestInterfaceEmpty::wrapperTypeInfo);
 }
 
 void V8TestObject::customObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
@@ -13152,9 +13158,9 @@
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 #endif
 static const V8DOMConfiguration::AttributeConfiguration V8TestObjectAttributes[] = {
-    { "testInterfaceEmptyConstructorAttribute", V8TestObject::testInterfaceEmptyConstructorAttributeConstructorGetterCallback, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterfaceEmpty::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceEmptyConstructorAttribute", V8TestObject::testInterfaceEmptyConstructorAttributeConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "measureAsFeatureNameTestInterfaceEmptyConstructorAttribute", V8TestObject::measureAsFeatureNameTestInterfaceEmptyConstructorAttributeConstructorGetterCallback, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterfaceEmpty::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "measureAsFeatureNameTestInterfaceEmptyConstructorAttribute", V8TestObject::measureAsFeatureNameTestInterfaceEmptyConstructorAttributeConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
 #pragma clang diagnostic pop
@@ -13167,312 +13173,312 @@
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 #endif
 static const V8DOMConfiguration::AttributeConfiguration V8TestObjectLazyDataAttributes[] = {
-    { "testInterfaceEmptyConstructorAttribute", V8ConstructorAttributeGetter, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterfaceEmpty::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceEmptyConstructorAttribute", V8TestObject::testInterfaceEmptyConstructorAttributeConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
 #pragma clang diagnostic pop
 #endif
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestObjectAccessors[] = {
-    { "stringifierAttribute", V8TestObject::stringifierAttributeAttributeGetterCallback, V8TestObject::stringifierAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "stringifierAttribute", V8TestObject::stringifierAttributeAttributeGetterCallback, V8TestObject::stringifierAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyStringAttribute", V8TestObject::readonlyStringAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyStringAttribute", V8TestObject::readonlyStringAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyTestInterfaceEmptyAttribute", V8TestObject::readonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyTestInterfaceEmptyAttribute", V8TestObject::readonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyLongAttribute", V8TestObject::readonlyLongAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyLongAttribute", V8TestObject::readonlyLongAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "dateAttribute", V8TestObject::dateAttributeAttributeGetterCallback, V8TestObject::dateAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "dateAttribute", V8TestObject::dateAttributeAttributeGetterCallback, V8TestObject::dateAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "stringAttribute", V8TestObject::stringAttributeAttributeGetterCallback, V8TestObject::stringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "stringAttribute", V8TestObject::stringAttributeAttributeGetterCallback, V8TestObject::stringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "byteStringAttribute", V8TestObject::byteStringAttributeAttributeGetterCallback, V8TestObject::byteStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "byteStringAttribute", V8TestObject::byteStringAttributeAttributeGetterCallback, V8TestObject::byteStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "usvStringAttribute", V8TestObject::usvStringAttributeAttributeGetterCallback, V8TestObject::usvStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "usvStringAttribute", V8TestObject::usvStringAttributeAttributeGetterCallback, V8TestObject::usvStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "domTimeStampAttribute", V8TestObject::domTimeStampAttributeAttributeGetterCallback, V8TestObject::domTimeStampAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "domTimeStampAttribute", V8TestObject::domTimeStampAttributeAttributeGetterCallback, V8TestObject::domTimeStampAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "booleanAttribute", V8TestObject::booleanAttributeAttributeGetterCallback, V8TestObject::booleanAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "booleanAttribute", V8TestObject::booleanAttributeAttributeGetterCallback, V8TestObject::booleanAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "byteAttribute", V8TestObject::byteAttributeAttributeGetterCallback, V8TestObject::byteAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "byteAttribute", V8TestObject::byteAttributeAttributeGetterCallback, V8TestObject::byteAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doubleAttribute", V8TestObject::doubleAttributeAttributeGetterCallback, V8TestObject::doubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doubleAttribute", V8TestObject::doubleAttributeAttributeGetterCallback, V8TestObject::doubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "floatAttribute", V8TestObject::floatAttributeAttributeGetterCallback, V8TestObject::floatAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "floatAttribute", V8TestObject::floatAttributeAttributeGetterCallback, V8TestObject::floatAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "longAttribute", V8TestObject::longAttributeAttributeGetterCallback, V8TestObject::longAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "longAttribute", V8TestObject::longAttributeAttributeGetterCallback, V8TestObject::longAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "longLongAttribute", V8TestObject::longLongAttributeAttributeGetterCallback, V8TestObject::longLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "longLongAttribute", V8TestObject::longLongAttributeAttributeGetterCallback, V8TestObject::longLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "octetAttribute", V8TestObject::octetAttributeAttributeGetterCallback, V8TestObject::octetAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "octetAttribute", V8TestObject::octetAttributeAttributeGetterCallback, V8TestObject::octetAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "shortAttribute", V8TestObject::shortAttributeAttributeGetterCallback, V8TestObject::shortAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "shortAttribute", V8TestObject::shortAttributeAttributeGetterCallback, V8TestObject::shortAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unrestrictedDoubleAttribute", V8TestObject::unrestrictedDoubleAttributeAttributeGetterCallback, V8TestObject::unrestrictedDoubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unrestrictedDoubleAttribute", V8TestObject::unrestrictedDoubleAttributeAttributeGetterCallback, V8TestObject::unrestrictedDoubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unrestrictedFloatAttribute", V8TestObject::unrestrictedFloatAttributeAttributeGetterCallback, V8TestObject::unrestrictedFloatAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unrestrictedFloatAttribute", V8TestObject::unrestrictedFloatAttributeAttributeGetterCallback, V8TestObject::unrestrictedFloatAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unsignedLongAttribute", V8TestObject::unsignedLongAttributeAttributeGetterCallback, V8TestObject::unsignedLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unsignedLongAttribute", V8TestObject::unsignedLongAttributeAttributeGetterCallback, V8TestObject::unsignedLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unsignedLongLongAttribute", V8TestObject::unsignedLongLongAttributeAttributeGetterCallback, V8TestObject::unsignedLongLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unsignedLongLongAttribute", V8TestObject::unsignedLongLongAttributeAttributeGetterCallback, V8TestObject::unsignedLongLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unsignedShortAttribute", V8TestObject::unsignedShortAttributeAttributeGetterCallback, V8TestObject::unsignedShortAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unsignedShortAttribute", V8TestObject::unsignedShortAttributeAttributeGetterCallback, V8TestObject::unsignedShortAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testInterfaceEmptyAttribute", V8TestObject::testInterfaceEmptyAttributeAttributeGetterCallback, V8TestObject::testInterfaceEmptyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceEmptyAttribute", V8TestObject::testInterfaceEmptyAttributeAttributeGetterCallback, V8TestObject::testInterfaceEmptyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testObjectAttribute", V8TestObject::testObjectAttributeAttributeGetterCallback, V8TestObject::testObjectAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testObjectAttribute", V8TestObject::testObjectAttributeAttributeGetterCallback, V8TestObject::testObjectAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "cssAttribute", V8TestObject::cssAttributeAttributeGetterCallback, V8TestObject::cssAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "cssAttribute", V8TestObject::cssAttributeAttributeGetterCallback, V8TestObject::cssAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "imeAttribute", V8TestObject::imeAttributeAttributeGetterCallback, V8TestObject::imeAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "imeAttribute", V8TestObject::imeAttributeAttributeGetterCallback, V8TestObject::imeAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "svgAttribute", V8TestObject::svgAttributeAttributeGetterCallback, V8TestObject::svgAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "svgAttribute", V8TestObject::svgAttributeAttributeGetterCallback, V8TestObject::svgAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "xmlAttribute", V8TestObject::xmlAttributeAttributeGetterCallback, V8TestObject::xmlAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "xmlAttribute", V8TestObject::xmlAttributeAttributeGetterCallback, V8TestObject::xmlAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "nodeFilterAttribute", V8TestObject::nodeFilterAttributeAttributeGetterCallback, V8TestObject::nodeFilterAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "nodeFilterAttribute", V8TestObject::nodeFilterAttributeAttributeGetterCallback, V8TestObject::nodeFilterAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "serializedScriptValueAttribute", V8TestObject::serializedScriptValueAttributeAttributeGetterCallback, V8TestObject::serializedScriptValueAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "serializedScriptValueAttribute", V8TestObject::serializedScriptValueAttributeAttributeGetterCallback, V8TestObject::serializedScriptValueAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "anyAttribute", V8TestObject::anyAttributeAttributeGetterCallback, V8TestObject::anyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "anyAttribute", V8TestObject::anyAttributeAttributeGetterCallback, V8TestObject::anyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "promiseAttribute", V8TestObject::promiseAttributeAttributeGetterCallback, V8TestObject::promiseAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "promiseAttribute", V8TestObject::promiseAttributeAttributeGetterCallback, V8TestObject::promiseAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "windowAttribute", V8TestObject::windowAttributeAttributeGetterCallback, V8TestObject::windowAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "windowAttribute", V8TestObject::windowAttributeAttributeGetterCallback, V8TestObject::windowAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "documentAttribute", V8TestObject::documentAttributeAttributeGetterCallback, V8TestObject::documentAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "documentAttribute", V8TestObject::documentAttributeAttributeGetterCallback, V8TestObject::documentAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "documentFragmentAttribute", V8TestObject::documentFragmentAttributeAttributeGetterCallback, V8TestObject::documentFragmentAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "documentFragmentAttribute", V8TestObject::documentFragmentAttributeAttributeGetterCallback, V8TestObject::documentFragmentAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "documentTypeAttribute", V8TestObject::documentTypeAttributeAttributeGetterCallback, V8TestObject::documentTypeAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "documentTypeAttribute", V8TestObject::documentTypeAttributeAttributeGetterCallback, V8TestObject::documentTypeAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "elementAttribute", V8TestObject::elementAttributeAttributeGetterCallback, V8TestObject::elementAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "elementAttribute", V8TestObject::elementAttributeAttributeGetterCallback, V8TestObject::elementAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "nodeAttribute", V8TestObject::nodeAttributeAttributeGetterCallback, V8TestObject::nodeAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "nodeAttribute", V8TestObject::nodeAttributeAttributeGetterCallback, V8TestObject::nodeAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "shadowRootAttribute", V8TestObject::shadowRootAttributeAttributeGetterCallback, V8TestObject::shadowRootAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "shadowRootAttribute", V8TestObject::shadowRootAttributeAttributeGetterCallback, V8TestObject::shadowRootAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "arrayBufferAttribute", V8TestObject::arrayBufferAttributeAttributeGetterCallback, V8TestObject::arrayBufferAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "arrayBufferAttribute", V8TestObject::arrayBufferAttributeAttributeGetterCallback, V8TestObject::arrayBufferAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "float32ArrayAttribute", V8TestObject::float32ArrayAttributeAttributeGetterCallback, V8TestObject::float32ArrayAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "float32ArrayAttribute", V8TestObject::float32ArrayAttributeAttributeGetterCallback, V8TestObject::float32ArrayAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "uint8ArrayAttribute", V8TestObject::uint8ArrayAttributeAttributeGetterCallback, V8TestObject::uint8ArrayAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "uint8ArrayAttribute", V8TestObject::uint8ArrayAttributeAttributeGetterCallback, V8TestObject::uint8ArrayAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "self", V8TestObject::selfAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "self", V8TestObject::selfAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyEventTargetAttribute", V8TestObject::readonlyEventTargetAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyEventTargetAttribute", V8TestObject::readonlyEventTargetAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyEventTargetOrNullAttribute", V8TestObject::readonlyEventTargetOrNullAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyEventTargetOrNullAttribute", V8TestObject::readonlyEventTargetOrNullAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "readonlyWindowAttribute", V8TestObject::readonlyWindowAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "readonlyWindowAttribute", V8TestObject::readonlyWindowAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "htmlCollectionAttribute", V8TestObject::htmlCollectionAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "htmlCollectionAttribute", V8TestObject::htmlCollectionAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "htmlElementAttribute", V8TestObject::htmlElementAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "htmlElementAttribute", V8TestObject::htmlElementAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "stringFrozenArrayAttribute", V8TestObject::stringFrozenArrayAttributeAttributeGetterCallback, V8TestObject::stringFrozenArrayAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "stringFrozenArrayAttribute", V8TestObject::stringFrozenArrayAttributeAttributeGetterCallback, V8TestObject::stringFrozenArrayAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testInterfaceEmptyFrozenArrayAttribute", V8TestObject::testInterfaceEmptyFrozenArrayAttributeAttributeGetterCallback, V8TestObject::testInterfaceEmptyFrozenArrayAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceEmptyFrozenArrayAttribute", V8TestObject::testInterfaceEmptyFrozenArrayAttributeAttributeGetterCallback, V8TestObject::testInterfaceEmptyFrozenArrayAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "booleanOrNullAttribute", V8TestObject::booleanOrNullAttributeAttributeGetterCallback, V8TestObject::booleanOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "booleanOrNullAttribute", V8TestObject::booleanOrNullAttributeAttributeGetterCallback, V8TestObject::booleanOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "stringOrNullAttribute", V8TestObject::stringOrNullAttributeAttributeGetterCallback, V8TestObject::stringOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "stringOrNullAttribute", V8TestObject::stringOrNullAttributeAttributeGetterCallback, V8TestObject::stringOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "longOrNullAttribute", V8TestObject::longOrNullAttributeAttributeGetterCallback, V8TestObject::longOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "longOrNullAttribute", V8TestObject::longOrNullAttributeAttributeGetterCallback, V8TestObject::longOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testInterfaceOrNullAttribute", V8TestObject::testInterfaceOrNullAttributeAttributeGetterCallback, V8TestObject::testInterfaceOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceOrNullAttribute", V8TestObject::testInterfaceOrNullAttributeAttributeGetterCallback, V8TestObject::testInterfaceOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testEnumAttribute", V8TestObject::testEnumAttributeAttributeGetterCallback, V8TestObject::testEnumAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testEnumAttribute", V8TestObject::testEnumAttributeAttributeGetterCallback, V8TestObject::testEnumAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testEnumOrNullAttribute", V8TestObject::testEnumOrNullAttributeAttributeGetterCallback, V8TestObject::testEnumOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testEnumOrNullAttribute", V8TestObject::testEnumOrNullAttributeAttributeGetterCallback, V8TestObject::testEnumOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticStringAttribute", V8TestObject::staticStringAttributeAttributeGetterCallback, V8TestObject::staticStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticStringAttribute", V8TestObject::staticStringAttributeAttributeGetterCallback, V8TestObject::staticStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticLongAttribute", V8TestObject::staticLongAttributeAttributeGetterCallback, V8TestObject::staticLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticLongAttribute", V8TestObject::staticLongAttributeAttributeGetterCallback, V8TestObject::staticLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "eventHandlerAttribute", V8TestObject::eventHandlerAttributeAttributeGetterCallback, V8TestObject::eventHandlerAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "eventHandlerAttribute", V8TestObject::eventHandlerAttributeAttributeGetterCallback, V8TestObject::eventHandlerAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doubleOrStringAttribute", V8TestObject::doubleOrStringAttributeAttributeGetterCallback, V8TestObject::doubleOrStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doubleOrStringAttribute", V8TestObject::doubleOrStringAttributeAttributeGetterCallback, V8TestObject::doubleOrStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doubleOrStringOrNullAttribute", V8TestObject::doubleOrStringOrNullAttributeAttributeGetterCallback, V8TestObject::doubleOrStringOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doubleOrStringOrNullAttribute", V8TestObject::doubleOrStringOrNullAttributeAttributeGetterCallback, V8TestObject::doubleOrStringOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doubleOrNullStringAttribute", V8TestObject::doubleOrNullStringAttributeAttributeGetterCallback, V8TestObject::doubleOrNullStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doubleOrNullStringAttribute", V8TestObject::doubleOrNullStringAttributeAttributeGetterCallback, V8TestObject::doubleOrNullStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "stringOrStringSequenceAttribute", V8TestObject::stringOrStringSequenceAttributeAttributeGetterCallback, V8TestObject::stringOrStringSequenceAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "stringOrStringSequenceAttribute", V8TestObject::stringOrStringSequenceAttributeAttributeGetterCallback, V8TestObject::stringOrStringSequenceAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testEnumOrDoubleAttribute", V8TestObject::testEnumOrDoubleAttributeAttributeGetterCallback, V8TestObject::testEnumOrDoubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testEnumOrDoubleAttribute", V8TestObject::testEnumOrDoubleAttributeAttributeGetterCallback, V8TestObject::testEnumOrDoubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unrestrictedDoubleOrStringAttribute", V8TestObject::unrestrictedDoubleOrStringAttributeAttributeGetterCallback, V8TestObject::unrestrictedDoubleOrStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unrestrictedDoubleOrStringAttribute", V8TestObject::unrestrictedDoubleOrStringAttributeAttributeGetterCallback, V8TestObject::unrestrictedDoubleOrStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "nestedUnionAtribute", V8TestObject::nestedUnionAtributeAttributeGetterCallback, V8TestObject::nestedUnionAtributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "nestedUnionAtribute", V8TestObject::nestedUnionAtributeAttributeGetterCallback, V8TestObject::nestedUnionAtributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "activityLoggingAccessForAllWorldsLongAttribute", V8TestObject::activityLoggingAccessForAllWorldsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingAccessForAllWorldsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "activityLoggingAccessForAllWorldsLongAttribute", V8TestObject::activityLoggingAccessForAllWorldsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingAccessForAllWorldsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "activityLoggingGetterForAllWorldsLongAttribute", V8TestObject::activityLoggingGetterForAllWorldsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingGetterForAllWorldsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "activityLoggingGetterForAllWorldsLongAttribute", V8TestObject::activityLoggingGetterForAllWorldsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingGetterForAllWorldsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "activityLoggingSetterForAllWorldsLongAttribute", V8TestObject::activityLoggingSetterForAllWorldsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingSetterForAllWorldsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "activityLoggingSetterForAllWorldsLongAttribute", V8TestObject::activityLoggingSetterForAllWorldsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingSetterForAllWorldsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "cachedAttributeAnyAttribute", V8TestObject::cachedAttributeAnyAttributeAttributeGetterCallback, V8TestObject::cachedAttributeAnyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "cachedAttributeAnyAttribute", V8TestObject::cachedAttributeAnyAttributeAttributeGetterCallback, V8TestObject::cachedAttributeAnyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "cachedArrayAttribute", V8TestObject::cachedArrayAttributeAttributeGetterCallback, V8TestObject::cachedArrayAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "cachedArrayAttribute", V8TestObject::cachedArrayAttributeAttributeGetterCallback, V8TestObject::cachedArrayAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "cachedStringOrNoneAttribute", V8TestObject::cachedStringOrNoneAttributeAttributeGetterCallback, V8TestObject::cachedStringOrNoneAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "cachedStringOrNoneAttribute", V8TestObject::cachedStringOrNoneAttributeAttributeGetterCallback, V8TestObject::cachedStringOrNoneAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "callWithExecutionContextAnyAttribute", V8TestObject::callWithExecutionContextAnyAttributeAttributeGetterCallback, V8TestObject::callWithExecutionContextAnyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "callWithExecutionContextAnyAttribute", V8TestObject::callWithExecutionContextAnyAttributeAttributeGetterCallback, V8TestObject::callWithExecutionContextAnyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "callWithScriptStateAnyAttribute", V8TestObject::callWithScriptStateAnyAttributeAttributeGetterCallback, V8TestObject::callWithScriptStateAnyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "callWithScriptStateAnyAttribute", V8TestObject::callWithScriptStateAnyAttributeAttributeGetterCallback, V8TestObject::callWithScriptStateAnyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "callWithExecutionContextAndScriptStateAnyAttribute", V8TestObject::callWithExecutionContextAndScriptStateAnyAttributeAttributeGetterCallback, V8TestObject::callWithExecutionContextAndScriptStateAnyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "callWithExecutionContextAndScriptStateAnyAttribute", V8TestObject::callWithExecutionContextAndScriptStateAnyAttributeAttributeGetterCallback, V8TestObject::callWithExecutionContextAndScriptStateAnyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "checkSecurityForNodeReadonlyDocumentAttribute", V8TestObject::checkSecurityForNodeReadonlyDocumentAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "checkSecurityForNodeReadonlyDocumentAttribute", V8TestObject::checkSecurityForNodeReadonlyDocumentAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "customObjectAttribute", V8TestObject::customObjectAttributeAttributeGetterCallback, V8TestObject::customObjectAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customObjectAttribute", V8TestObject::customObjectAttributeAttributeGetterCallback, V8TestObject::customObjectAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "customGetterLongAttribute", V8TestObject::customGetterLongAttributeAttributeGetterCallback, V8TestObject::customGetterLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customGetterLongAttribute", V8TestObject::customGetterLongAttributeAttributeGetterCallback, V8TestObject::customGetterLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "customGetterReadonlyObjectAttribute", V8TestObject::customGetterReadonlyObjectAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customGetterReadonlyObjectAttribute", V8TestObject::customGetterReadonlyObjectAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "customSetterLongAttribute", V8TestObject::customSetterLongAttributeAttributeGetterCallback, V8TestObject::customSetterLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customSetterLongAttribute", V8TestObject::customSetterLongAttributeAttributeGetterCallback, V8TestObject::customSetterLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "deprecatedLongAttribute", V8TestObject::deprecatedLongAttributeAttributeGetterCallback, V8TestObject::deprecatedLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "deprecatedLongAttribute", V8TestObject::deprecatedLongAttributeAttributeGetterCallback, V8TestObject::deprecatedLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "enforceRangeLongAttribute", V8TestObject::enforceRangeLongAttributeAttributeGetterCallback, V8TestObject::enforceRangeLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "enforceRangeLongAttribute", V8TestObject::enforceRangeLongAttributeAttributeGetterCallback, V8TestObject::enforceRangeLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "implementedAsLongAttribute", V8TestObject::implementedAsLongAttributeAttributeGetterCallback, V8TestObject::implementedAsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "implementedAsLongAttribute", V8TestObject::implementedAsLongAttributeAttributeGetterCallback, V8TestObject::implementedAsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "customImplementedAsLongAttribute", V8TestObject::customImplementedAsLongAttributeAttributeGetterCallback, V8TestObject::customImplementedAsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customImplementedAsLongAttribute", V8TestObject::customImplementedAsLongAttributeAttributeGetterCallback, V8TestObject::customImplementedAsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "customGetterImplementedAsLongAttribute", V8TestObject::customGetterImplementedAsLongAttributeAttributeGetterCallback, V8TestObject::customGetterImplementedAsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customGetterImplementedAsLongAttribute", V8TestObject::customGetterImplementedAsLongAttributeAttributeGetterCallback, V8TestObject::customGetterImplementedAsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "customSetterImplementedAsLongAttribute", V8TestObject::customSetterImplementedAsLongAttributeAttributeGetterCallback, V8TestObject::customSetterImplementedAsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "customSetterImplementedAsLongAttribute", V8TestObject::customSetterImplementedAsLongAttributeAttributeGetterCallback, V8TestObject::customSetterImplementedAsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "measureAsLongAttribute", V8TestObject::measureAsLongAttributeAttributeGetterCallback, V8TestObject::measureAsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "measureAsLongAttribute", V8TestObject::measureAsLongAttributeAttributeGetterCallback, V8TestObject::measureAsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "notEnumerableLongAttribute", V8TestObject::notEnumerableLongAttributeAttributeGetterCallback, V8TestObject::notEnumerableLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "notEnumerableLongAttribute", V8TestObject::notEnumerableLongAttributeAttributeGetterCallback, V8TestObject::notEnumerableLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestObject::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
-    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestObject::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
+    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestObject::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
+    { "perWorldBindingsReadonlyTestInterfaceEmptyAttribute", V8TestObject::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
 
-    { "activityLoggingAccessPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
-    { "activityLoggingAccessPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
+    { "activityLoggingAccessPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
+    { "activityLoggingAccessPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
 
-    { "activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
-    { "activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
+    { "activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
+    { "activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
 
-    { "activityLoggingGetterPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
-    { "activityLoggingGetterPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
+    { "activityLoggingGetterPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
+    { "activityLoggingGetterPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
 
-    { "activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
-    { "activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
+    { "activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld, V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
+    { "activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute", V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback, V8TestObject::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
 
-    { "location", V8TestObject::locationAttributeGetterCallback, V8TestObject::locationAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "location", V8TestObject::locationAttributeGetterCallback, V8TestObject::locationAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "locationWithException", V8TestObject::locationWithExceptionAttributeGetterCallback, V8TestObject::locationWithExceptionAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "locationWithException", V8TestObject::locationWithExceptionAttributeGetterCallback, V8TestObject::locationWithExceptionAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "locationWithCallWith", V8TestObject::locationWithCallWithAttributeGetterCallback, V8TestObject::locationWithCallWithAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "locationWithCallWith", V8TestObject::locationWithCallWithAttributeGetterCallback, V8TestObject::locationWithCallWithAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "locationByteString", V8TestObject::locationByteStringAttributeGetterCallback, V8TestObject::locationByteStringAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "locationByteString", V8TestObject::locationByteStringAttributeGetterCallback, V8TestObject::locationByteStringAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "locationWithPerWorldBindings", V8TestObject::locationWithPerWorldBindingsAttributeGetterCallbackForMainWorld, V8TestObject::locationWithPerWorldBindingsAttributeSetterCallbackForMainWorld, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
-    { "locationWithPerWorldBindings", V8TestObject::locationWithPerWorldBindingsAttributeGetterCallback, V8TestObject::locationWithPerWorldBindingsAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
+    { "locationWithPerWorldBindings", V8TestObject::locationWithPerWorldBindingsAttributeGetterCallbackForMainWorld, V8TestObject::locationWithPerWorldBindingsAttributeSetterCallbackForMainWorld, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kMainWorld },
+    { "locationWithPerWorldBindings", V8TestObject::locationWithPerWorldBindingsAttributeGetterCallback, V8TestObject::locationWithPerWorldBindingsAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kNonMainWorlds },
 
-    { "locationLegacyInterfaceTypeChecking", V8TestObject::locationLegacyInterfaceTypeCheckingAttributeGetterCallback, V8TestObject::locationLegacyInterfaceTypeCheckingAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "locationLegacyInterfaceTypeChecking", V8TestObject::locationLegacyInterfaceTypeCheckingAttributeGetterCallback, V8TestObject::locationLegacyInterfaceTypeCheckingAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "locationGarbageCollected", V8TestObject::locationGarbageCollectedAttributeGetterCallback, V8TestObject::locationGarbageCollectedAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "locationGarbageCollected", V8TestObject::locationGarbageCollectedAttributeGetterCallback, V8TestObject::locationGarbageCollectedAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "raisesExceptionLongAttribute", V8TestObject::raisesExceptionLongAttributeAttributeGetterCallback, V8TestObject::raisesExceptionLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "raisesExceptionLongAttribute", V8TestObject::raisesExceptionLongAttributeAttributeGetterCallback, V8TestObject::raisesExceptionLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "raisesExceptionGetterLongAttribute", V8TestObject::raisesExceptionGetterLongAttributeAttributeGetterCallback, V8TestObject::raisesExceptionGetterLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "raisesExceptionGetterLongAttribute", V8TestObject::raisesExceptionGetterLongAttributeAttributeGetterCallback, V8TestObject::raisesExceptionGetterLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "setterRaisesExceptionLongAttribute", V8TestObject::setterRaisesExceptionLongAttributeAttributeGetterCallback, V8TestObject::setterRaisesExceptionLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "setterRaisesExceptionLongAttribute", V8TestObject::setterRaisesExceptionLongAttributeAttributeGetterCallback, V8TestObject::setterRaisesExceptionLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "raisesExceptionTestInterfaceEmptyAttribute", V8TestObject::raisesExceptionTestInterfaceEmptyAttributeAttributeGetterCallback, V8TestObject::raisesExceptionTestInterfaceEmptyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "raisesExceptionTestInterfaceEmptyAttribute", V8TestObject::raisesExceptionTestInterfaceEmptyAttributeAttributeGetterCallback, V8TestObject::raisesExceptionTestInterfaceEmptyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "cachedAttributeRaisesExceptionGetterAnyAttribute", V8TestObject::cachedAttributeRaisesExceptionGetterAnyAttributeAttributeGetterCallback, V8TestObject::cachedAttributeRaisesExceptionGetterAnyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "cachedAttributeRaisesExceptionGetterAnyAttribute", V8TestObject::cachedAttributeRaisesExceptionGetterAnyAttributeAttributeGetterCallback, V8TestObject::cachedAttributeRaisesExceptionGetterAnyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectTestInterfaceAttribute", V8TestObject::reflectTestInterfaceAttributeAttributeGetterCallback, V8TestObject::reflectTestInterfaceAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectTestInterfaceAttribute", V8TestObject::reflectTestInterfaceAttributeAttributeGetterCallback, V8TestObject::reflectTestInterfaceAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectReflectedNameAttributeTestAttribute", V8TestObject::reflectReflectedNameAttributeTestAttributeAttributeGetterCallback, V8TestObject::reflectReflectedNameAttributeTestAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectReflectedNameAttributeTestAttribute", V8TestObject::reflectReflectedNameAttributeTestAttributeAttributeGetterCallback, V8TestObject::reflectReflectedNameAttributeTestAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectBooleanAttribute", V8TestObject::reflectBooleanAttributeAttributeGetterCallback, V8TestObject::reflectBooleanAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectBooleanAttribute", V8TestObject::reflectBooleanAttributeAttributeGetterCallback, V8TestObject::reflectBooleanAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectLongAttribute", V8TestObject::reflectLongAttributeAttributeGetterCallback, V8TestObject::reflectLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectLongAttribute", V8TestObject::reflectLongAttributeAttributeGetterCallback, V8TestObject::reflectLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectUnsignedShortAttribute", V8TestObject::reflectUnsignedShortAttributeAttributeGetterCallback, V8TestObject::reflectUnsignedShortAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectUnsignedShortAttribute", V8TestObject::reflectUnsignedShortAttributeAttributeGetterCallback, V8TestObject::reflectUnsignedShortAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectUnsignedLongAttribute", V8TestObject::reflectUnsignedLongAttributeAttributeGetterCallback, V8TestObject::reflectUnsignedLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectUnsignedLongAttribute", V8TestObject::reflectUnsignedLongAttributeAttributeGetterCallback, V8TestObject::reflectUnsignedLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "id", V8TestObject::idAttributeGetterCallback, V8TestObject::idAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "id", V8TestObject::idAttributeGetterCallback, V8TestObject::idAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "name", V8TestObject::nameAttributeGetterCallback, V8TestObject::nameAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "name", V8TestObject::nameAttributeGetterCallback, V8TestObject::nameAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "class", V8TestObject::classAttributeGetterCallback, V8TestObject::classAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "class", V8TestObject::classAttributeGetterCallback, V8TestObject::classAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectedId", V8TestObject::reflectedIdAttributeGetterCallback, V8TestObject::reflectedIdAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectedId", V8TestObject::reflectedIdAttributeGetterCallback, V8TestObject::reflectedIdAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectedName", V8TestObject::reflectedNameAttributeGetterCallback, V8TestObject::reflectedNameAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectedName", V8TestObject::reflectedNameAttributeGetterCallback, V8TestObject::reflectedNameAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "reflectedClass", V8TestObject::reflectedClassAttributeGetterCallback, V8TestObject::reflectedClassAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "reflectedClass", V8TestObject::reflectedClassAttributeGetterCallback, V8TestObject::reflectedClassAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "limitedToOnlyOneAttribute", V8TestObject::limitedToOnlyOneAttributeAttributeGetterCallback, V8TestObject::limitedToOnlyOneAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "limitedToOnlyOneAttribute", V8TestObject::limitedToOnlyOneAttributeAttributeGetterCallback, V8TestObject::limitedToOnlyOneAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "limitedToOnlyAttribute", V8TestObject::limitedToOnlyAttributeAttributeGetterCallback, V8TestObject::limitedToOnlyAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "limitedToOnlyAttribute", V8TestObject::limitedToOnlyAttributeAttributeGetterCallback, V8TestObject::limitedToOnlyAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "limitedToOnlyOtherAttribute", V8TestObject::limitedToOnlyOtherAttributeAttributeGetterCallback, V8TestObject::limitedToOnlyOtherAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "limitedToOnlyOtherAttribute", V8TestObject::limitedToOnlyOtherAttributeAttributeGetterCallback, V8TestObject::limitedToOnlyOtherAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "limitedWithMissingDefaultAttribute", V8TestObject::limitedWithMissingDefaultAttributeAttributeGetterCallback, V8TestObject::limitedWithMissingDefaultAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "limitedWithMissingDefaultAttribute", V8TestObject::limitedWithMissingDefaultAttributeAttributeGetterCallback, V8TestObject::limitedWithMissingDefaultAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "limitedWithInvalidMissingDefaultAttribute", V8TestObject::limitedWithInvalidMissingDefaultAttributeAttributeGetterCallback, V8TestObject::limitedWithInvalidMissingDefaultAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "limitedWithInvalidMissingDefaultAttribute", V8TestObject::limitedWithInvalidMissingDefaultAttributeAttributeGetterCallback, V8TestObject::limitedWithInvalidMissingDefaultAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "corsSettingAttribute", V8TestObject::corsSettingAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "corsSettingAttribute", V8TestObject::corsSettingAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "limitedWithEmptyMissingInvalidAttribute", V8TestObject::limitedWithEmptyMissingInvalidAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "limitedWithEmptyMissingInvalidAttribute", V8TestObject::limitedWithEmptyMissingInvalidAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "RuntimeCallStatsCounterAttribute", V8TestObject::RuntimeCallStatsCounterAttributeAttributeGetterCallback, V8TestObject::RuntimeCallStatsCounterAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "RuntimeCallStatsCounterAttribute", V8TestObject::RuntimeCallStatsCounterAttributeAttributeGetterCallback, V8TestObject::RuntimeCallStatsCounterAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "RuntimeCallStatsCounterReadOnlyAttribute", V8TestObject::RuntimeCallStatsCounterReadOnlyAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "RuntimeCallStatsCounterReadOnlyAttribute", V8TestObject::RuntimeCallStatsCounterReadOnlyAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "replaceableReadonlyLongAttribute", V8TestObject::replaceableReadonlyLongAttributeAttributeGetterCallback, V8TestObject::replaceableReadonlyLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "replaceableReadonlyLongAttribute", V8TestObject::replaceableReadonlyLongAttributeAttributeGetterCallback, V8TestObject::replaceableReadonlyLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "locationPutForwards", V8TestObject::locationPutForwardsAttributeGetterCallback, V8TestObject::locationPutForwardsAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "locationPutForwards", V8TestObject::locationPutForwardsAttributeGetterCallback, V8TestObject::locationPutForwardsAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "setterCallWithCurrentWindowAndEnteredWindowStringAttribute", V8TestObject::setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeGetterCallback, V8TestObject::setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "setterCallWithCurrentWindowAndEnteredWindowStringAttribute", V8TestObject::setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeGetterCallback, V8TestObject::setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "setterCallWithExecutionContextStringAttribute", V8TestObject::setterCallWithExecutionContextStringAttributeAttributeGetterCallback, V8TestObject::setterCallWithExecutionContextStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "setterCallWithExecutionContextStringAttribute", V8TestObject::setterCallWithExecutionContextStringAttributeAttributeGetterCallback, V8TestObject::setterCallWithExecutionContextStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "treatNullAsEmptyStringStringAttribute", V8TestObject::treatNullAsEmptyStringStringAttributeAttributeGetterCallback, V8TestObject::treatNullAsEmptyStringStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "treatNullAsEmptyStringStringAttribute", V8TestObject::treatNullAsEmptyStringStringAttributeAttributeGetterCallback, V8TestObject::treatNullAsEmptyStringStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "treatNullAsNullStringStringAttribute", V8TestObject::treatNullAsNullStringStringAttributeAttributeGetterCallback, V8TestObject::treatNullAsNullStringStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "treatNullAsNullStringStringAttribute", V8TestObject::treatNullAsNullStringStringAttributeAttributeGetterCallback, V8TestObject::treatNullAsNullStringStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "legacyInterfaceTypeCheckingFloatAttribute", V8TestObject::legacyInterfaceTypeCheckingFloatAttributeAttributeGetterCallback, V8TestObject::legacyInterfaceTypeCheckingFloatAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "legacyInterfaceTypeCheckingFloatAttribute", V8TestObject::legacyInterfaceTypeCheckingFloatAttributeAttributeGetterCallback, V8TestObject::legacyInterfaceTypeCheckingFloatAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "legacyInterfaceTypeCheckingTestInterfaceAttribute", V8TestObject::legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeGetterCallback, V8TestObject::legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "legacyInterfaceTypeCheckingTestInterfaceAttribute", V8TestObject::legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeGetterCallback, V8TestObject::legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "legacyInterfaceTypeCheckingTestInterfaceOrNullAttribute", V8TestObject::legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeGetterCallback, V8TestObject::legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "legacyInterfaceTypeCheckingTestInterfaceOrNullAttribute", V8TestObject::legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeGetterCallback, V8TestObject::legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "urlStringAttribute", V8TestObject::urlStringAttributeAttributeGetterCallback, V8TestObject::urlStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "urlStringAttribute", V8TestObject::urlStringAttributeAttributeGetterCallback, V8TestObject::urlStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "urlStringAttribute", V8TestObject::urlStringAttributeAttributeGetterCallback, V8TestObject::urlStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "urlStringAttribute", V8TestObject::urlStringAttributeAttributeGetterCallback, V8TestObject::urlStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unforgeableLongAttribute", V8TestObject::unforgeableLongAttributeAttributeGetterCallback, V8TestObject::unforgeableLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unforgeableLongAttribute", V8TestObject::unforgeableLongAttributeAttributeGetterCallback, V8TestObject::unforgeableLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "measuredLongAttribute", V8TestObject::measuredLongAttributeAttributeGetterCallback, V8TestObject::measuredLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "measuredLongAttribute", V8TestObject::measuredLongAttributeAttributeGetterCallback, V8TestObject::measuredLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "sameObjectAttribute", V8TestObject::sameObjectAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "sameObjectAttribute", V8TestObject::sameObjectAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "saveSameObjectAttribute", V8TestObject::saveSameObjectAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "saveSameObjectAttribute", V8TestObject::saveSameObjectAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticSaveSameObjectAttribute", V8TestObject::staticSaveSameObjectAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticSaveSameObjectAttribute", V8TestObject::staticSaveSameObjectAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unscopableLongAttribute", V8TestObject::unscopableLongAttributeAttributeGetterCallback, V8TestObject::unscopableLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unscopableLongAttribute", V8TestObject::unscopableLongAttributeAttributeGetterCallback, V8TestObject::unscopableLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testInterfaceAttribute", V8TestObject::testInterfaceAttributeAttributeGetterCallback, V8TestObject::testInterfaceAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceAttribute", V8TestObject::testInterfaceAttributeAttributeGetterCallback, V8TestObject::testInterfaceAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testInterfaceGarbageCollectedAttribute", V8TestObject::testInterfaceGarbageCollectedAttributeAttributeGetterCallback, V8TestObject::testInterfaceGarbageCollectedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceGarbageCollectedAttribute", V8TestObject::testInterfaceGarbageCollectedAttributeAttributeGetterCallback, V8TestObject::testInterfaceGarbageCollectedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "testInterfaceGarbageCollectedOrNullAttribute", V8TestObject::testInterfaceGarbageCollectedOrNullAttributeAttributeGetterCallback, V8TestObject::testInterfaceGarbageCollectedOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceGarbageCollectedOrNullAttribute", V8TestObject::testInterfaceGarbageCollectedOrNullAttributeAttributeGetterCallback, V8TestObject::testInterfaceGarbageCollectedOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "size", V8TestObject::sizeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum | v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "size", V8TestObject::sizeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontEnum | v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestObjectMethods[] = {
@@ -13793,9 +13799,9 @@
 
   if (RuntimeEnabledFeatures::FeatureNameEnabled()) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "runtimeEnabledLongAttribute", V8TestObject::runtimeEnabledLongAttributeAttributeGetterCallback, V8TestObject::runtimeEnabledLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "runtimeEnabledLongAttribute", V8TestObject::runtimeEnabledLongAttributeAttributeGetterCallback, V8TestObject::runtimeEnabledLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-        { "unscopableRuntimeEnabledLongAttribute", V8TestObject::unscopableRuntimeEnabledLongAttributeAttributeGetterCallback, V8TestObject::unscopableRuntimeEnabledLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "unscopableRuntimeEnabledLongAttribute", V8TestObject::unscopableRuntimeEnabledLongAttributeAttributeGetterCallback, V8TestObject::unscopableRuntimeEnabledLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(
         isolate, world, instance_template, prototype_template, interface_template,
@@ -13847,12 +13853,12 @@
   v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
   ALLOW_UNUSED_LOCAL(signature);
   static const V8DOMConfiguration::AccessorConfiguration accessororiginTrialEnabledLongAttributeConfiguration[] = {
-  { "originTrialEnabledLongAttribute", V8TestObject::originTrialEnabledLongAttributeAttributeGetterCallback, V8TestObject::originTrialEnabledLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
+  { "originTrialEnabledLongAttribute", V8TestObject::originTrialEnabledLongAttributeAttributeGetterCallback, V8TestObject::originTrialEnabledLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
   };
   for (const auto& accessorConfig : accessororiginTrialEnabledLongAttributeConfiguration)
     V8DOMConfiguration::InstallAccessor(isolate, world, instance, prototype, interface, signature, accessorConfig);
   static const V8DOMConfiguration::AccessorConfiguration accessorunscopableOriginTrialEnabledLongAttributeConfiguration[] = {
-  { "unscopableOriginTrialEnabledLongAttribute", V8TestObject::unscopableOriginTrialEnabledLongAttributeAttributeGetterCallback, V8TestObject::unscopableOriginTrialEnabledLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
+  { "unscopableOriginTrialEnabledLongAttribute", V8TestObject::unscopableOriginTrialEnabledLongAttributeAttributeGetterCallback, V8TestObject::unscopableOriginTrialEnabledLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
   };
   for (const auto& accessorConfig : accessorunscopableOriginTrialEnabledLongAttributeConfiguration)
     V8DOMConfiguration::InstallAccessor(isolate, world, instance, prototype, interface, signature, accessorConfig);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h
index eed9ee5..f7ff0ec 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h
@@ -221,6 +221,7 @@
   CORE_EXPORT static void callWithExecutionContextAndScriptStateAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void checkSecurityForNodeReadonlyDocumentAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void testInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
+  CORE_EXPORT static void testInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
   CORE_EXPORT static void measureAsFeatureNameTestInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
   CORE_EXPORT static void customObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void customObjectAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
index 9ac33b7..86a4a25 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
@@ -385,6 +385,12 @@
   TestTypedefsV8Internal::uLongLongAttributeAttributeSetter(v8Value, info);
 }
 
+void V8TestTypedefs::tAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestTypedefs_tAttribute_ConstructorGetterCallback");
+
+  V8ConstructorAttributeGetter(property, info, &V8TestInterface::wrapperTypeInfo);
+}
+
 void V8TestTypedefs::domStringOrDoubleOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestTypedefs_domStringOrDoubleOrNullAttribute_Getter");
 
@@ -484,16 +490,16 @@
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 #endif
 static const V8DOMConfiguration::AttributeConfiguration V8TestTypedefsLazyDataAttributes[] = {
-    { "tAttribute", V8ConstructorAttributeGetter, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterface::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "tAttribute", V8TestTypedefs::tAttributeConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
 #pragma clang diagnostic pop
 #endif
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestTypedefsAccessors[] = {
-    { "uLongLongAttribute", V8TestTypedefs::uLongLongAttributeAttributeGetterCallback, V8TestTypedefs::uLongLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "uLongLongAttribute", V8TestTypedefs::uLongLongAttributeAttributeGetterCallback, V8TestTypedefs::uLongLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "domStringOrDoubleOrNullAttribute", V8TestTypedefs::domStringOrDoubleOrNullAttributeAttributeGetterCallback, V8TestTypedefs::domStringOrDoubleOrNullAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "domStringOrDoubleOrNullAttribute", V8TestTypedefs::domStringOrDoubleOrNullAttributeAttributeGetterCallback, V8TestTypedefs::domStringOrDoubleOrNullAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestTypedefsMethods[] = {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h
index 4410962..ac64e2e 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h
@@ -54,6 +54,7 @@
 
   CORE_EXPORT static void uLongLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void uLongLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
+  CORE_EXPORT static void tAttributeConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
   CORE_EXPORT static void domStringOrDoubleOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void domStringOrDoubleOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInheritedLegacyUnenumerableNamedProperties.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInheritedLegacyUnenumerableNamedProperties.cpp
index edf2c59..034bbb2 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInheritedLegacyUnenumerableNamedProperties.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInheritedLegacyUnenumerableNamedProperties.cpp
@@ -153,7 +153,7 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInheritedLegacyUnenumerableNamedPropertiesAccessors[] = {
-    { "longAttribute", V8TestInheritedLegacyUnenumerableNamedProperties::longAttributeAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "longAttribute", V8TestInheritedLegacyUnenumerableNamedProperties::longAttributeAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static void installV8TestInheritedLegacyUnenumerableNamedPropertiesTemplate(
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
index 5cae655..6206c738 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
@@ -622,6 +622,12 @@
   TestInterface5ImplementationV8Internal::testInterfaceAttributeAttributeSetter(v8Value, info);
 }
 
+void V8TestInterface5::testInterfaceConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterface5Implementation_testInterfaceConstructorAttribute_ConstructorGetterCallback");
+
+  V8ConstructorAttributeGetter(property, info, &V8TestInterface5::wrapperTypeInfo);
+}
+
 void V8TestInterface5::doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_TestInterface5Implementation_doubleAttribute_Getter");
 
@@ -913,28 +919,28 @@
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 #endif
 static const V8DOMConfiguration::AttributeConfiguration V8TestInterface5LazyDataAttributes[] = {
-    { "testInterfaceConstructorAttribute", V8ConstructorAttributeGetter, nullptr, const_cast<WrapperTypeInfo*>(&V8TestInterface5::wrapperTypeInfo), static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceConstructorAttribute", V8TestInterface5::testInterfaceConstructorAttributeConstructorGetterCallback, nullptr, static_cast<v8::PropertyAttribute>(v8::DontEnum), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 #if defined(COMPONENT_BUILD) && defined(WIN32) && defined(__clang__)
 #pragma clang diagnostic pop
 #endif
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestInterface5Accessors[] = {
-    { "testInterfaceAttribute", V8TestInterface5::testInterfaceAttributeAttributeGetterCallback, V8TestInterface5::testInterfaceAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "testInterfaceAttribute", V8TestInterface5::testInterfaceAttributeAttributeGetterCallback, V8TestInterface5::testInterfaceAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "doubleAttribute", V8TestInterface5::doubleAttributeAttributeGetterCallback, V8TestInterface5::doubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "doubleAttribute", V8TestInterface5::doubleAttributeAttributeGetterCallback, V8TestInterface5::doubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "floatAttribute", V8TestInterface5::floatAttributeAttributeGetterCallback, V8TestInterface5::floatAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "floatAttribute", V8TestInterface5::floatAttributeAttributeGetterCallback, V8TestInterface5::floatAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unrestrictedDoubleAttribute", V8TestInterface5::unrestrictedDoubleAttributeAttributeGetterCallback, V8TestInterface5::unrestrictedDoubleAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unrestrictedDoubleAttribute", V8TestInterface5::unrestrictedDoubleAttributeAttributeGetterCallback, V8TestInterface5::unrestrictedDoubleAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unrestrictedFloatAttribute", V8TestInterface5::unrestrictedFloatAttributeAttributeGetterCallback, V8TestInterface5::unrestrictedFloatAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unrestrictedFloatAttribute", V8TestInterface5::unrestrictedFloatAttributeAttributeGetterCallback, V8TestInterface5::unrestrictedFloatAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "staticStringAttribute", V8TestInterface5::staticStringAttributeAttributeGetterCallback, V8TestInterface5::staticStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "staticStringAttribute", V8TestInterface5::staticStringAttributeAttributeGetterCallback, V8TestInterface5::staticStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "length", V8TestInterface5::lengthAttributeGetterCallback, nullptr, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "length", V8TestInterface5::lengthAttributeGetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::ReadOnly), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "alwaysExposedAttribute", V8TestInterface5::alwaysExposedAttributeAttributeGetterCallback, V8TestInterface5::alwaysExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "alwaysExposedAttribute", V8TestInterface5::alwaysExposedAttributeAttributeGetterCallback, V8TestInterface5::alwaysExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static const V8DOMConfiguration::MethodConfiguration V8TestInterface5Methods[] = {
@@ -1073,13 +1079,13 @@
 
   if (executionContext && (executionContext->IsDocument())) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "windowExposedAttribute", V8TestInterface5::windowExposedAttributeAttributeGetterCallback, V8TestInterface5::windowExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "windowExposedAttribute", V8TestInterface5::windowExposedAttributeAttributeGetterCallback, V8TestInterface5::windowExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
   }
   if (executionContext && (executionContext->IsWorkerGlobalScope())) {
     static const V8DOMConfiguration::AccessorConfiguration accessor_configurations[] = {
-        { "workerExposedAttribute", V8TestInterface5::workerExposedAttributeAttributeGetterCallback, V8TestInterface5::workerExposedAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+        { "workerExposedAttribute", V8TestInterface5::workerExposedAttributeAttributeGetterCallback, V8TestInterface5::workerExposedAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
     };
     V8DOMConfiguration::InstallAccessors(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessor_configurations, WTF_ARRAY_LENGTH(accessor_configurations));
   }
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h
index d48d482d..cba881e0 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h
@@ -53,6 +53,7 @@
 
   MODULES_EXPORT static void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   MODULES_EXPORT static void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
+  MODULES_EXPORT static void testInterfaceConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&);
   MODULES_EXPORT static void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   MODULES_EXPORT static void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   MODULES_EXPORT static void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
index 4ec3673..592b0a4 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
@@ -504,12 +504,12 @@
   v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
   ALLOW_UNUSED_LOCAL(signature);
   static const V8DOMConfiguration::AccessorConfiguration accessorpartial4LongAttributeConfiguration[] = {
-  { "partial4LongAttribute", V8TestInterfacePartial::partial4LongAttributeAttributeGetterCallback, V8TestInterfacePartial::partial4LongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
+  { "partial4LongAttribute", V8TestInterfacePartial::partial4LongAttributeAttributeGetterCallback, V8TestInterfacePartial::partial4LongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnPrototype, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
   };
   for (const auto& accessorConfig : accessorpartial4LongAttributeConfiguration)
     V8DOMConfiguration::InstallAccessor(isolate, world, instance, prototype, interface, signature, accessorConfig);
   static const V8DOMConfiguration::AccessorConfiguration accessorpartial4StaticLongAttributeConfiguration[] = {
-  { "partial4StaticLongAttribute", V8TestInterfacePartial::partial4StaticLongAttributeAttributeGetterCallback, V8TestInterfacePartial::partial4StaticLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
+  { "partial4StaticLongAttribute", V8TestInterfacePartial::partial4StaticLongAttributeAttributeGetterCallback, V8TestInterfacePartial::partial4StaticLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::kOnInterface, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds }
   };
   for (const auto& accessorConfig : accessorpartial4StaticLongAttributeConfiguration)
     V8DOMConfiguration::InstallAccessor(isolate, world, instance, prototype, interface, signature, accessorConfig);
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestSubObject.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestSubObject.cpp
index d8820043..d896484 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestSubObject.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestSubObject.cpp
@@ -149,9 +149,9 @@
 }
 
 static const V8DOMConfiguration::AccessorConfiguration V8TestSubObjectAccessors[] = {
-    { "unforgeableStringAttribute", V8TestSubObject::unforgeableStringAttributeAttributeGetterCallback, V8TestSubObject::unforgeableStringAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unforgeableStringAttribute", V8TestSubObject::unforgeableStringAttributeAttributeGetterCallback, V8TestSubObject::unforgeableStringAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 
-    { "unforgeableLongAttribute", V8TestSubObject::unforgeableLongAttributeAttributeGetterCallback, V8TestSubObject::unforgeableLongAttributeAttributeSetterCallback, nullptr, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
+    { "unforgeableLongAttribute", V8TestSubObject::unforgeableLongAttributeAttributeGetterCallback, V8TestSubObject::unforgeableLongAttributeAttributeSetterCallback, V8PrivateProperty::kNoCachedAccessor, static_cast<v8::PropertyAttribute>(v8::DontDelete), V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kAllWorlds },
 };
 
 static void installV8TestSubObjectTemplate(
diff --git a/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeatures.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeatures.cpp.tmpl
index 2e9c784..766cfb5 100644
--- a/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeatures.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeatures.cpp.tmpl
@@ -40,12 +40,20 @@
 
 void RuntimeEnabledFeatures::SetFeatureEnabledFromString(
     const std::string& name, bool enable) {
+  static const struct {
+    const char* name;
+    bool* setting;
+  } kFeatures[] = {
   {% for feature in standard_features %}
-  if (name == "{{feature.name}}") {
-    Set{{feature.name}}Enabled(enable);
-    return;
-  }
+    {"{{feature.name}}", &is{{feature.name}}Enabled},
   {% endfor %}
+  };
+  for (const auto& feature : kFeatures) {
+    if (name == feature.name) {
+      *feature.setting = enable;
+      return;
+    }
+  }
   DLOG(ERROR) << "RuntimeEnabledFeature not recognized: " << name;
 }
 
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index a1d4abe..7aa7b9e 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -1310,6 +1310,7 @@
     "css/cssom/CSSResourceValueTest.cpp",
     "css/cssom/CSSStyleImageValueTest.cpp",
     "css/cssom/CSSURLImageValueTest.cpp",
+    "css/cssom/CSSUnitValueTest.cpp",
     "css/cssom/CSSUnparsedValueTest.cpp",
     "css/cssom/CSSVariableReferenceValueTest.cpp",
     "css/cssom/FilteredComputedStylePropertyMapTest.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSCalculationValue.cpp b/third_party/WebKit/Source/core/css/CSSCalculationValue.cpp
index 9f9d6cf..c066b36 100644
--- a/third_party/WebKit/Source/core/css/CSSCalculationValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSCalculationValue.cpp
@@ -53,6 +53,7 @@
     case CSSPrimitiveValue::UnitType::kPixels:
     case CSSPrimitiveValue::UnitType::kCentimeters:
     case CSSPrimitiveValue::UnitType::kMillimeters:
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
     case CSSPrimitiveValue::UnitType::kInches:
     case CSSPrimitiveValue::UnitType::kPoints:
     case CSSPrimitiveValue::UnitType::kPicas:
@@ -91,6 +92,7 @@
     case CSSPrimitiveValue::UnitType::kPixels:
     case CSSPrimitiveValue::UnitType::kCentimeters:
     case CSSPrimitiveValue::UnitType::kMillimeters:
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
     case CSSPrimitiveValue::UnitType::kInches:
     case CSSPrimitiveValue::UnitType::kPoints:
     case CSSPrimitiveValue::UnitType::kPicas:
diff --git a/third_party/WebKit/Source/core/css/CSSHelper.h b/third_party/WebKit/Source/core/css/CSSHelper.h
index 4cf135e..acc1168 100644
--- a/third_party/WebKit/Source/core/css/CSSHelper.h
+++ b/third_party/WebKit/Source/core/css/CSSHelper.h
@@ -27,8 +27,10 @@
 namespace blink {
 
 const double kMillimetersPerCentimeter = 10;
+const double kQuarterMillimetersPerCentimeter = 40;
 const double kCentimetersPerInch = 2.54;
 const double kMillimetersPerInch = 25.4;
+const double kQuarterMillimetersPerInch = 101.6;
 const double kPointsPerInch = 72;
 const double kPicasPerInch = 6;
 
@@ -37,6 +39,8 @@
 const double kCssPixelsPerCentimeter = kCssPixelsPerInch / kCentimetersPerInch;
 const double kCssPixelsPerMillimeter =
     kCssPixelsPerCentimeter / kMillimetersPerCentimeter;
+const double kCssPixelsPerQuarterMillimeter =
+    kCssPixelsPerCentimeter / kQuarterMillimetersPerCentimeter;
 const double kCssPixelsPerPoint = kCssPixelsPerInch / kPointsPerInch;
 const double kCssPixelsPerPica = kCssPixelsPerInch / kPicasPerInch;
 
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValue.cpp b/third_party/WebKit/Source/core/css/CSSPrimitiveValue.cpp
index 442e6fc..79982544 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValue.cpp
@@ -63,6 +63,7 @@
     case UnitType::kPixels:
     case UnitType::kCentimeters:
     case UnitType::kMillimeters:
+    case UnitType::kQuarterMillimeters:
     case UnitType::kInches:
     case UnitType::kPoints:
     case UnitType::kPicas:
@@ -363,6 +364,9 @@
     case UnitType::kMillimeters:
       factor = kCssPixelsPerMillimeter;
       break;
+    case UnitType::kQuarterMillimeters:
+      factor = kCssPixelsPerQuarterMillimeter;
+      break;
     case UnitType::kInches:
       factor = kCssPixelsPerInch;
       break;
@@ -440,6 +444,7 @@
     case CSSPrimitiveValue::UnitType::kPixels:
     case CSSPrimitiveValue::UnitType::kCentimeters:
     case CSSPrimitiveValue::UnitType::kMillimeters:
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
     case CSSPrimitiveValue::UnitType::kInches:
     case CSSPrimitiveValue::UnitType::kPoints:
     case CSSPrimitiveValue::UnitType::kPicas:
@@ -549,6 +554,8 @@
       return "dpcm";
     case UnitType::kMillimeters:
       return "mm";
+    case UnitType::kQuarterMillimeters:
+      return "q";
     case UnitType::kInches:
       return "in";
     case UnitType::kPoints:
@@ -615,6 +622,7 @@
     case UnitType::kDotsPerInch:
     case UnitType::kDotsPerCentimeter:
     case UnitType::kMillimeters:
+    case UnitType::kQuarterMillimeters:
     case UnitType::kInches:
     case UnitType::kPoints:
     case UnitType::kPicas:
@@ -667,6 +675,7 @@
     case UnitType::kDotsPerInch:
     case UnitType::kDotsPerCentimeter:
     case UnitType::kMillimeters:
+    case UnitType::kQuarterMillimeters:
     case UnitType::kInches:
     case UnitType::kPoints:
     case UnitType::kPicas:
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValue.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValue.h
index 47728892..9ee88a9 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValue.h
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValue.h
@@ -80,6 +80,7 @@
     kInches,
     kPoints,
     kPicas,
+    kQuarterMillimeters,
     kViewportWidth,
     kViewportHeight,
     kViewportMin,
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueUnits.json5 b/third_party/WebKit/Source/core/css/CSSPrimitiveValueUnits.json5
index 63babdd2..7239708 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueUnits.json5
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueUnits.json5
@@ -27,6 +27,10 @@
       unit_type: "kMillimeters",
     },
     {
+      name: "q",
+      unit_type: "kQuarterMillimeters",
+    },
+    {
       name: "in",
       unit_type: "kInches",
     },
diff --git a/third_party/WebKit/Source/core/css/CSSToLengthConversionData.cpp b/third_party/WebKit/Source/core/css/CSSToLengthConversionData.cpp
index c75d748..a05e315f 100644
--- a/third_party/WebKit/Source/core/css/CSSToLengthConversionData.cpp
+++ b/third_party/WebKit/Source/core/css/CSSToLengthConversionData.cpp
@@ -144,6 +144,9 @@
     case CSSPrimitiveValue::UnitType::kMillimeters:
       return value * kCssPixelsPerMillimeter * Zoom();
 
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+      return value * kCssPixelsPerQuarterMillimeter * Zoom();
+
     case CSSPrimitiveValue::UnitType::kInches:
       return value * kCssPixelsPerInch * Zoom();
 
diff --git a/third_party/WebKit/Source/core/css/MediaValues.cpp b/third_party/WebKit/Source/core/css/MediaValues.cpp
index 69c64731..6e032c9 100644
--- a/third_party/WebKit/Source/core/css/MediaValues.cpp
+++ b/third_party/WebKit/Source/core/css/MediaValues.cpp
@@ -219,6 +219,9 @@
     case CSSPrimitiveValue::UnitType::kMillimeters:
       result = value * kCssPixelsPerMillimeter;
       return true;
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+      result = value * kCssPixelsPerQuarterMillimeter;
+      return true;
     case CSSPrimitiveValue::UnitType::kInches:
       result = value * kCssPixelsPerInch;
       return true;
diff --git a/third_party/WebKit/Source/core/css/MediaValuesTest.cpp b/third_party/WebKit/Source/core/css/MediaValuesTest.cpp
index 4d1da777..9bb9b96 100644
--- a/third_party/WebKit/Source/core/css/MediaValuesTest.cpp
+++ b/third_party/WebKit/Source/core/css/MediaValuesTest.cpp
@@ -41,6 +41,8 @@
        49.133858},
       {1.3, CSSPrimitiveValue::UnitType::kMillimeters, 16, 300, 300, true,
        4.913386},
+      {1.3, CSSPrimitiveValue::UnitType::kQuarterMillimeters, 16, 300, 300,
+       true, 1.2283465},
       {1.3, CSSPrimitiveValue::UnitType::kInches, 16, 300, 300, true, 124.8},
       {13, CSSPrimitiveValue::UnitType::kPoints, 16, 300, 300, true, 17.333333},
       {1.3, CSSPrimitiveValue::UnitType::kPicas, 16, 300, 300, true, 20.8},
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
index 547c553..278c0bf 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
@@ -108,6 +108,8 @@
           return value_ / kCssPixelsPerCentimeter;
         case CSSPrimitiveValue::UnitType::kMillimeters:
           return value_ / kCssPixelsPerMillimeter;
+        case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+          return value_ / kCssPixelsPerQuarterMillimeter;
         case CSSPrimitiveValue::UnitType::kInches:
           return value_ / kCssPixelsPerInch;
         case CSSPrimitiveValue::UnitType::kPoints:
@@ -124,6 +126,8 @@
           return value_ * kCssPixelsPerCentimeter;
         case CSSPrimitiveValue::UnitType::kMillimeters:
           return value_ * kMillimetersPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+          return value_ * kQuarterMillimetersPerCentimeter;
         case CSSPrimitiveValue::UnitType::kInches:
           return value_ / kCentimetersPerInch;
         case CSSPrimitiveValue::UnitType::kPoints:
@@ -140,6 +144,9 @@
           return value_ * kCssPixelsPerMillimeter;
         case CSSPrimitiveValue::UnitType::kCentimeters:
           return value_ / kMillimetersPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+          return value_ *
+                 (kQuarterMillimetersPerCentimeter / kMillimetersPerCentimeter);
         case CSSPrimitiveValue::UnitType::kInches:
           return value_ / (kMillimetersPerCentimeter * kCentimetersPerInch);
         case CSSPrimitiveValue::UnitType::kPoints:
@@ -150,12 +157,35 @@
           NOTREACHED();
           return 0;
       }
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+      switch (unit) {
+        case CSSPrimitiveValue::UnitType::kPixels:
+          return value_ * kCssPixelsPerQuarterMillimeter;
+        case CSSPrimitiveValue::UnitType::kCentimeters:
+          return value_ / kQuarterMillimetersPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kMillimeters:
+          return value_ /
+                 (kQuarterMillimetersPerCentimeter / kMillimetersPerCentimeter);
+        case CSSPrimitiveValue::UnitType::kInches:
+          return value_ /
+                 (kQuarterMillimetersPerCentimeter * kCentimetersPerInch);
+        case CSSPrimitiveValue::UnitType::kPoints:
+          return value_ * (kPointsPerInch / kQuarterMillimetersPerInch);
+        case CSSPrimitiveValue::UnitType::kPicas:
+          return value_ * (kPicasPerInch / kQuarterMillimetersPerInch);
+        default:
+          NOTREACHED();
+          return 0;
+      }
     case CSSPrimitiveValue::UnitType::kInches:
       switch (unit) {
         case CSSPrimitiveValue::UnitType::kPixels:
           return value_ * kCssPixelsPerInch;
         case CSSPrimitiveValue::UnitType::kMillimeters:
           return value_ * kCentimetersPerInch * kMillimetersPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+          return value_ * kCentimetersPerInch *
+                 kQuarterMillimetersPerCentimeter;
         case CSSPrimitiveValue::UnitType::kCentimeters:
           return value_ * kCentimetersPerInch;
         case CSSPrimitiveValue::UnitType::kPoints:
@@ -172,6 +202,8 @@
           return value_ * kCssPixelsPerPoint;
         case CSSPrimitiveValue::UnitType::kMillimeters:
           return value_ * (kMillimetersPerInch / kPointsPerInch);
+        case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+          return value_ * (kQuarterMillimetersPerInch / kPointsPerInch);
         case CSSPrimitiveValue::UnitType::kCentimeters:
           return value_ * (kCentimetersPerInch / kPointsPerInch);
         case CSSPrimitiveValue::UnitType::kInches:
@@ -188,6 +220,8 @@
           return value_ * kCssPixelsPerPica;
         case CSSPrimitiveValue::UnitType::kMillimeters:
           return value_ * (kMillimetersPerInch / kPicasPerInch);
+        case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+          return value_ * (kQuarterMillimetersPerInch / kPicasPerInch);
         case CSSPrimitiveValue::UnitType::kCentimeters:
           return value_ * (kCentimetersPerInch / kPicasPerInch);
         case CSSPrimitiveValue::UnitType::kInches:
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValueTest.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnitValueTest.cpp
new file mode 100644
index 0000000..cda443d
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValueTest.cpp
@@ -0,0 +1,183 @@
+// 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 "core/css/cssom/CSSUnitValue.h"
+
+#include "core/css/CSSPrimitiveValue.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+namespace {
+const float kEpsilon = 0.001f;
+}
+
+TEST(CSSUnitValueTest, PixelToOtherUnit) {
+  CSSUnitValue* pxValue =
+      CSSUnitValue::Create(96, CSSPrimitiveValue::UnitType::kPixels);
+
+  EXPECT_NEAR(96, pxValue->to(CSSPrimitiveValue::UnitType::kPixels)->value(),
+              kEpsilon);
+  EXPECT_NEAR(2.54,
+              pxValue->to(CSSPrimitiveValue::UnitType::kCentimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(25.4,
+              pxValue->to(CSSPrimitiveValue::UnitType::kMillimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(1, pxValue->to(CSSPrimitiveValue::UnitType::kInches)->value(),
+              kEpsilon);
+  EXPECT_NEAR(72, pxValue->to(CSSPrimitiveValue::UnitType::kPoints)->value(),
+              kEpsilon);
+  EXPECT_NEAR(6, pxValue->to(CSSPrimitiveValue::UnitType::kPicas)->value(),
+              kEpsilon);
+  EXPECT_NEAR(
+      101.6,
+      pxValue->to(CSSPrimitiveValue::UnitType::kQuarterMillimeters)->value(),
+      kEpsilon);
+}
+
+TEST(CSSUnitValueTest, CentimeterToOtherUnit) {
+  CSSUnitValue* cmValue =
+      CSSUnitValue::Create(2.54, CSSPrimitiveValue::UnitType::kCentimeters);
+
+  EXPECT_NEAR(96, cmValue->to(CSSPrimitiveValue::UnitType::kPixels)->value(),
+              kEpsilon);
+  EXPECT_NEAR(2.54,
+              cmValue->to(CSSPrimitiveValue::UnitType::kCentimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(25.4,
+              cmValue->to(CSSPrimitiveValue::UnitType::kMillimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(1, cmValue->to(CSSPrimitiveValue::UnitType::kInches)->value(),
+              kEpsilon);
+  EXPECT_NEAR(72, cmValue->to(CSSPrimitiveValue::UnitType::kPoints)->value(),
+              kEpsilon);
+  EXPECT_NEAR(6, cmValue->to(CSSPrimitiveValue::UnitType::kPicas)->value(),
+              kEpsilon);
+  EXPECT_NEAR(
+      101.6,
+      cmValue->to(CSSPrimitiveValue::UnitType::kQuarterMillimeters)->value(),
+      kEpsilon);
+}
+
+TEST(CSSUnitValueTest, MillimeterToOtherUnit) {
+  CSSUnitValue* mmValue =
+      CSSUnitValue::Create(25.4, CSSPrimitiveValue::UnitType::kMillimeters);
+
+  EXPECT_NEAR(96, mmValue->to(CSSPrimitiveValue::UnitType::kPixels)->value(),
+              kEpsilon);
+  EXPECT_NEAR(2.54,
+              mmValue->to(CSSPrimitiveValue::UnitType::kCentimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(25.4,
+              mmValue->to(CSSPrimitiveValue::UnitType::kMillimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(1, mmValue->to(CSSPrimitiveValue::UnitType::kInches)->value(),
+              kEpsilon);
+  EXPECT_NEAR(72, mmValue->to(CSSPrimitiveValue::UnitType::kPoints)->value(),
+              kEpsilon);
+  EXPECT_NEAR(6, mmValue->to(CSSPrimitiveValue::UnitType::kPicas)->value(),
+              kEpsilon);
+  EXPECT_NEAR(
+      101.6,
+      mmValue->to(CSSPrimitiveValue::UnitType::kQuarterMillimeters)->value(),
+      kEpsilon);
+}
+
+TEST(CSSUnitValueTest, InchesToOtherUnit) {
+  CSSUnitValue* inValue =
+      CSSUnitValue::Create(1, CSSPrimitiveValue::UnitType::kInches);
+
+  EXPECT_NEAR(96, inValue->to(CSSPrimitiveValue::UnitType::kPixels)->value(),
+              kEpsilon);
+  EXPECT_NEAR(2.54,
+              inValue->to(CSSPrimitiveValue::UnitType::kCentimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(25.4,
+              inValue->to(CSSPrimitiveValue::UnitType::kMillimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(1, inValue->to(CSSPrimitiveValue::UnitType::kInches)->value(),
+              kEpsilon);
+  EXPECT_NEAR(72, inValue->to(CSSPrimitiveValue::UnitType::kPoints)->value(),
+              kEpsilon);
+  EXPECT_NEAR(6, inValue->to(CSSPrimitiveValue::UnitType::kPicas)->value(),
+              kEpsilon);
+  EXPECT_NEAR(
+      101.6,
+      inValue->to(CSSPrimitiveValue::UnitType::kQuarterMillimeters)->value(),
+      kEpsilon);
+}
+
+TEST(CSSUnitValueTest, PointToOtherUnit) {
+  CSSUnitValue* ptValue =
+      CSSUnitValue::Create(72, CSSPrimitiveValue::UnitType::kPoints);
+
+  EXPECT_NEAR(96, ptValue->to(CSSPrimitiveValue::UnitType::kPixels)->value(),
+              kEpsilon);
+  EXPECT_NEAR(2.54,
+              ptValue->to(CSSPrimitiveValue::UnitType::kCentimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(25.4,
+              ptValue->to(CSSPrimitiveValue::UnitType::kMillimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(1, ptValue->to(CSSPrimitiveValue::UnitType::kInches)->value(),
+              kEpsilon);
+  EXPECT_NEAR(72, ptValue->to(CSSPrimitiveValue::UnitType::kPoints)->value(),
+              kEpsilon);
+  EXPECT_NEAR(6, ptValue->to(CSSPrimitiveValue::UnitType::kPicas)->value(),
+              kEpsilon);
+  EXPECT_NEAR(
+      101.6,
+      ptValue->to(CSSPrimitiveValue::UnitType::kQuarterMillimeters)->value(),
+      kEpsilon);
+}
+
+TEST(CSSUnitValueTest, PicaToOtherUnit) {
+  CSSUnitValue* pcValue =
+      CSSUnitValue::Create(6, CSSPrimitiveValue::UnitType::kPicas);
+
+  EXPECT_NEAR(96, pcValue->to(CSSPrimitiveValue::UnitType::kPixels)->value(),
+              kEpsilon);
+  EXPECT_NEAR(2.54,
+              pcValue->to(CSSPrimitiveValue::UnitType::kCentimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(25.4,
+              pcValue->to(CSSPrimitiveValue::UnitType::kMillimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(1, pcValue->to(CSSPrimitiveValue::UnitType::kInches)->value(),
+              kEpsilon);
+  EXPECT_NEAR(72, pcValue->to(CSSPrimitiveValue::UnitType::kPoints)->value(),
+              kEpsilon);
+  EXPECT_NEAR(6, pcValue->to(CSSPrimitiveValue::UnitType::kPicas)->value(),
+              kEpsilon);
+  EXPECT_NEAR(
+      101.6,
+      pcValue->to(CSSPrimitiveValue::UnitType::kQuarterMillimeters)->value(),
+      kEpsilon);
+}
+
+TEST(CSSUnitValueTest, QuarterMillimeterToOtherUnit) {
+  CSSUnitValue* qValue = CSSUnitValue::Create(
+      101.6, CSSPrimitiveValue::UnitType::kQuarterMillimeters);
+
+  EXPECT_NEAR(96, qValue->to(CSSPrimitiveValue::UnitType::kPixels)->value(),
+              kEpsilon);
+  EXPECT_NEAR(2.54,
+              qValue->to(CSSPrimitiveValue::UnitType::kCentimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(25.4,
+              qValue->to(CSSPrimitiveValue::UnitType::kMillimeters)->value(),
+              kEpsilon);
+  EXPECT_NEAR(1, qValue->to(CSSPrimitiveValue::UnitType::kInches)->value(),
+              kEpsilon);
+  EXPECT_NEAR(72, qValue->to(CSSPrimitiveValue::UnitType::kPoints)->value(),
+              kEpsilon);
+  EXPECT_NEAR(6, qValue->to(CSSPrimitiveValue::UnitType::kPicas)->value(),
+              kEpsilon);
+  EXPECT_NEAR(
+      101.6,
+      qValue->to(CSSPrimitiveValue::UnitType::kQuarterMillimeters)->value(),
+      kEpsilon);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.h b/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.h
index a7dcf9a..735c9f7 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.h
+++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.h
@@ -69,6 +69,11 @@
                                 CSSPrimitiveValue::UnitType::kMillimeters);
   }
 
+  static CSSUnitValue* q(double value) {
+    return CSSUnitValue::Create(
+        value, CSSPrimitiveValue::UnitType::kQuarterMillimeters);
+  }
+
   static CSSUnitValue* in(double value) {
     return CSSUnitValue::Create(value, CSSPrimitiveValue::UnitType::kInches);
   }
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
index 4d62d24..8c5a4d2 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
@@ -494,7 +494,7 @@
   // TODO(shend): Use streams instead of ranges
   CSSParserTokenRange range = stream.MakeRangeToEOF();
   CSSParserTokenRange block = range.ConsumeBlock();
-  stream.UpdatePositionFromRange(range);
+  CSSParserTokenStream::BlockGuard guard(stream);
 
   if (allowed_rules == kKeyframeRules)
     return nullptr;  // Parse error, no at-rules supported inside @keyframes
@@ -512,7 +512,7 @@
     case kCSSAtRuleViewport:
       return ConsumeViewportRule(prelude, block);
     case kCSSAtRuleFontFace:
-      return ConsumeFontFaceRule(prelude, block);
+      return ConsumeFontFaceRule(prelude, stream);
     case kCSSAtRuleWebkitKeyframes:
       return ConsumeKeyframesRule(true, prelude, block);
     case kCSSAtRuleKeyframes:
@@ -752,6 +752,29 @@
 
 StyleRuleFontFace* CSSParserImpl::ConsumeFontFaceRule(
     CSSParserTokenRange prelude,
+    CSSParserTokenStream& stream) {
+  if (!prelude.AtEnd())
+    return nullptr;  // Parse error; @font-face prelude should be empty
+
+  if (observer_wrapper_) {
+    unsigned end_offset = observer_wrapper_->EndOffset(prelude);
+    observer_wrapper_->Observer().StartRuleHeader(
+        StyleRule::kFontFace, observer_wrapper_->StartOffset(prelude));
+    observer_wrapper_->Observer().EndRuleHeader(end_offset);
+    observer_wrapper_->Observer().StartRuleBody(end_offset);
+    observer_wrapper_->Observer().EndRuleBody(end_offset);
+  }
+
+  if (style_sheet_)
+    style_sheet_->SetHasFontFaceRule();
+
+  ConsumeDeclarationList(stream, StyleRule::kFontFace);
+  return StyleRuleFontFace::Create(
+      CreateStylePropertySet(parsed_properties_, kCSSFontFaceRuleMode));
+}
+
+StyleRuleFontFace* CSSParserImpl::ConsumeFontFaceRule(
+    CSSParserTokenRange prelude,
     CSSParserTokenRange block) {
   if (!prelude.AtEnd())
     return nullptr;  // Parse error; @font-face prelude should be empty
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h
index 99565d14..f7499de 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h
@@ -129,6 +129,9 @@
   StyleRuleViewport* ConsumeViewportRule(CSSParserTokenRange prelude,
                                          CSSParserTokenRange block);
   StyleRuleFontFace* ConsumeFontFaceRule(CSSParserTokenRange prelude,
+                                         CSSParserTokenStream& block);
+  // TODO(shend): Remove this overload once we switch over to streams.
+  StyleRuleFontFace* ConsumeFontFaceRule(CSSParserTokenRange prelude,
                                          CSSParserTokenRange block);
   StyleRuleKeyframes* ConsumeKeyframesRule(bool webkit_prefixed,
                                            CSSParserTokenRange prelude,
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp
index f061a40..9deff1e 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp
@@ -17,15 +17,19 @@
   return result;
 }
 
-void CSSParserTokenStream::UncheckedConsumeComponentValue() {
-  unsigned nesting_level = 0;
+void CSSParserTokenStream::UncheckedConsumeComponentValue(
+    unsigned nesting_level) {
+  DCHECK(HasLookAhead());
+
+  // Have to use internal consume/peek in here because they can read past
+  // start/end of blocks
   do {
-    const CSSParserToken& token = UncheckedConsume();
+    const CSSParserToken& token = UncheckedConsumeInternal();
     if (token.GetBlockType() == CSSParserToken::kBlockStart)
       nesting_level++;
     else if (token.GetBlockType() == CSSParserToken::kBlockEnd)
       nesting_level--;
-  } while (nesting_level && !AtEnd());
+  } while (nesting_level && !PeekInternal().IsEOF());
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h
index 4d80778..ed69ac5 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h
@@ -7,15 +7,21 @@
 
 #include "CSSTokenizer.h"
 #include "core/css/parser/CSSParserTokenRange.h"
+#include "platform/wtf/Noncopyable.h"
 
 namespace blink {
 
 // A streaming interface to CSSTokenizer that tokenizes on demand.
+// Abstractly, the stream ends at either EOF or the beginning/end of a block.
+// To consume a block, a BlockGuard must be created first to ensure that
+// we finish consuming a block even if there was an error.
+//
 // Methods prefixed with "Unchecked" can only be called after Peek()
 // returns a non-EOF token or after AtEnd() returns false, with no
 // subsequent modifications to the stream such as a consume.
 class CORE_EXPORT CSSParserTokenStream {
   DISALLOW_NEW();
+  WTF_MAKE_NONCOPYABLE(CSSParserTokenStream);
 
  public:
   class Iterator {
@@ -25,46 +31,73 @@
     friend class CSSParserTokenStream;
   };
 
+  // Instantiate this to start reading from a block. When the guard is out of
+  // scope, the rest of the block is consumed.
+  class BlockGuard {
+   public:
+    explicit BlockGuard(CSSParserTokenStream& stream) : stream_(stream) {
+      const CSSParserToken next = stream.ConsumeInternal();
+      DCHECK_EQ(next.GetBlockType(), CSSParserToken::kBlockStart);
+    }
+
+    ~BlockGuard() {
+      if (stream_.EnsureLookAhead() == LookAhead::kIsEOF)
+        return;
+
+      stream_.UncheckedSkipToEndOfBlock();
+    }
+
+   private:
+    CSSParserTokenStream& stream_;
+  };
+
   explicit CSSParserTokenStream(CSSTokenizer& tokenizer)
       : tokenizer_(tokenizer), next_index_(0) {
     // TODO(shend): Uncomment the code below once observers work properly with
     // streams. DCHECK_EQ(tokenizer.CurrentSize(), 0U);
   }
 
-  // TODO(shend): Remove this method. We should never convert from a range to a
-  // stream. We can remove this once all the functions in CSSParserImpl.h accept
-  // streams.
-  void UpdatePositionFromRange(const CSSParserTokenRange& range) {
-    next_index_ = range.begin() - tokenizer_.tokens_.begin();
-  }
+  CSSParserTokenStream(CSSParserTokenStream&&) = default;
 
-  const CSSParserToken& Peek() const {
+  // LookAhead::kIsEOF means the next token is EOF. Since we don't store EOF
+  // tokens, tokenizer_.tokens_[next_index_] is valid iff LookAhead::kIsValid.
+  enum class LookAhead { kIsValid, kIsEOF };
+  LookAhead EnsureLookAhead() const {
     if (next_index_ == tokenizer_.CurrentSize()) {
       // Reached end of token buffer, but might not be end of input.
       if (tokenizer_.TokenizeSingle().IsEOF())
-        return g_static_eof_token;
+        return LookAhead::kIsEOF;
     }
-    DCHECK_LT(next_index_, tokenizer_.CurrentSize());
-    return UncheckedPeek();
+    DCHECK(HasLookAhead());
+    return LookAhead::kIsValid;
+  }
+
+  bool HasLookAhead() const { return next_index_ < tokenizer_.CurrentSize(); }
+
+  const CSSParserToken& Peek() const {
+    const CSSParserToken& token = PeekInternal();
+    if (token.GetBlockType() == CSSParserToken::kBlockEnd)
+      return g_static_eof_token;
+    return token;
   }
 
   const CSSParserToken& UncheckedPeek() const {
-    DCHECK_LT(next_index_, tokenizer_.CurrentSize());
-    return tokenizer_.tokens_[next_index_];
+    const CSSParserToken& token = UncheckedPeekInternal();
+    if (token.GetBlockType() == CSSParserToken::kBlockEnd)
+      return g_static_eof_token;
+    return token;
   }
 
   const CSSParserToken& Consume() {
-    const CSSParserToken& token = Peek();
-    if (!token.IsEOF())
-      next_index_++;
-
-    DCHECK_LE(next_index_, tokenizer_.CurrentSize());
+    const CSSParserToken& token = ConsumeInternal();
+    DCHECK_NE(token.GetBlockType(), CSSParserToken::kBlockStart);
     return token;
   }
 
   const CSSParserToken& UncheckedConsume() {
-    DCHECK_LE(next_index_, tokenizer_.CurrentSize());
-    return tokenizer_.tokens_[next_index_++];
+    const CSSParserToken& token = UncheckedConsumeInternal();
+    DCHECK_NE(token.GetBlockType(), CSSParserToken::kBlockStart);
+    return token;
   }
 
   bool AtEnd() const { return Peek().IsEOF(); }
@@ -100,13 +133,42 @@
     return Iterator(next_index_);
   }
 
+  // Get the index of the character in the original string to be consumed next.
+  size_t Offset() const { return offset_; }
+
   void ConsumeWhitespace();
   CSSParserToken ConsumeIncludingWhitespace();
-  void UncheckedConsumeComponentValue();
+  void UncheckedConsumeComponentValue(unsigned nesting_level = 0);
 
  private:
+  const CSSParserToken& PeekInternal() const {
+    if (EnsureLookAhead() == LookAhead::kIsEOF)
+      return g_static_eof_token;
+    return UncheckedPeekInternal();
+  }
+
+  const CSSParserToken& UncheckedPeekInternal() const {
+    DCHECK(HasLookAhead());
+    return tokenizer_.tokens_[next_index_];
+  }
+
+  const CSSParserToken& ConsumeInternal() {
+    if (EnsureLookAhead() == LookAhead::kIsEOF)
+      return g_static_eof_token;
+    return UncheckedConsumeInternal();
+  }
+
+  const CSSParserToken& UncheckedConsumeInternal() {
+    DCHECK(HasLookAhead());
+    offset_ = tokenizer_.input_.Offset();
+    return tokenizer_.tokens_[next_index_++];
+  }
+
+  void UncheckedSkipToEndOfBlock() { UncheckedConsumeComponentValue(1); }
+
   CSSTokenizer& tokenizer_;
   size_t next_index_;  // Index of next token to be consumed.
+  size_t offset_ = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp
index 9d4d4950..2d4361ed 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp
@@ -200,6 +200,72 @@
   EXPECT_TRUE(range.AtEnd());
 }
 
+TEST_P(CSSParserTokenStreamTest, BlockErrorRecoveryConsumesRestOfBlock) {
+  CSSTokenizer tokenizer("{B }1");
+  auto stream = GetStream(tokenizer, GetParam());
+
+  {
+    CSSParserTokenStream::BlockGuard guard(stream);
+    EXPECT_EQ(kIdentToken, stream.Consume().GetType());
+    EXPECT_FALSE(stream.AtEnd());
+  }  // calls destructor
+
+  EXPECT_EQ(kNumberToken, stream.Consume().GetType());
+}
+
+TEST_P(CSSParserTokenStreamTest, BlockErrorRecoveryOnSuccess) {
+  CSSTokenizer tokenizer("{B }1");
+  auto stream = GetStream(tokenizer, GetParam());
+
+  {
+    CSSParserTokenStream::BlockGuard guard(stream);
+    EXPECT_EQ(kIdentToken, stream.Consume().GetType());
+    EXPECT_EQ(kWhitespaceToken, stream.Consume().GetType());
+    EXPECT_TRUE(stream.AtEnd());
+  }  // calls destructor
+
+  EXPECT_EQ(kNumberToken, stream.Consume().GetType());
+}
+
+TEST_P(CSSParserTokenStreamTest, BlockErrorRecoveryConsumeComponentValue) {
+  CSSTokenizer tokenizer("{{B} C}1");
+  auto stream = GetStream(tokenizer, GetParam());
+
+  {
+    CSSParserTokenStream::BlockGuard guard(stream);
+    EXPECT_EQ(CSSParserTokenStream::LookAhead::kIsValid,
+              stream.EnsureLookAhead());
+    stream.UncheckedConsumeComponentValue();
+  }  // calls destructor
+
+  EXPECT_EQ(kNumberToken, stream.Consume().GetType());
+}
+
+TEST_F(CSSParserTokenStreamTest, OffsetAfterPeek) {
+  CSSTokenizer tokenizer("ABC");
+  CSSParserTokenStream stream(tokenizer);
+
+  EXPECT_EQ(0U, stream.Offset());
+  EXPECT_EQ(kIdentToken, stream.Peek().GetType());
+  EXPECT_EQ(0U, stream.Offset());
+}
+
+TEST_F(CSSParserTokenStreamTest, OffsetAfterConsumes) {
+  CSSTokenizer tokenizer("ABC 1 {23 }");
+  CSSParserTokenStream stream(tokenizer);
+
+  EXPECT_EQ(0U, stream.Offset());
+  EXPECT_EQ(kIdentToken, stream.Consume().GetType());
+  EXPECT_EQ(3U, stream.Offset());
+  EXPECT_EQ(kWhitespaceToken, stream.Consume().GetType());
+  EXPECT_EQ(4U, stream.Offset());
+  EXPECT_EQ(kNumberToken, stream.ConsumeIncludingWhitespace().GetType());
+  EXPECT_EQ(6U, stream.Offset());
+  stream.EnsureLookAhead();
+  stream.UncheckedConsumeComponentValue();
+  EXPECT_EQ(11U, stream.Offset());
+}
+
 INSTANTIATE_TEST_CASE_P(ShouldTokenizeToEnd,
                         CSSParserTokenStreamTest,
                         ::testing::Bool());
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
index 89a35fc7..98ed26f 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -241,6 +241,7 @@
       case CSSPrimitiveValue::UnitType::kPixels:
       case CSSPrimitiveValue::UnitType::kCentimeters:
       case CSSPrimitiveValue::UnitType::kMillimeters:
+      case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
       case CSSPrimitiveValue::UnitType::kInches:
       case CSSPrimitiveValue::UnitType::kPoints:
       case CSSPrimitiveValue::UnitType::kPicas:
diff --git a/third_party/WebKit/Source/core/dom/AccessibleNode.h b/third_party/WebKit/Source/core/dom/AccessibleNode.h
index 5f95f8c..da4c05ac 100644
--- a/third_party/WebKit/Source/core/dom/AccessibleNode.h
+++ b/third_party/WebKit/Source/core/dom/AccessibleNode.h
@@ -332,6 +332,11 @@
   ExecutionContext* GetExecutionContext() const override;
 
   DEFINE_ATTRIBUTE_EVENT_LISTENER(accessibleclick);
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(accessiblecontextmenu);
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(accessibledecrement);
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(accessiblefocus);
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(accessibleincrement);
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(accessiblescrollintoview);
 
   DECLARE_VIRTUAL_TRACE();
 
diff --git a/third_party/WebKit/Source/core/dom/AccessibleNode.idl b/third_party/WebKit/Source/core/dom/AccessibleNode.idl
index 1de11290..a7a5523 100644
--- a/third_party/WebKit/Source/core/dom/AccessibleNode.idl
+++ b/third_party/WebKit/Source/core/dom/AccessibleNode.idl
@@ -57,4 +57,9 @@
     attribute DOMString? valueText;
 
     attribute EventHandler onaccessibleclick;
+    attribute EventHandler onaccessiblecontextmenu;
+    attribute EventHandler onaccessibledecrement;
+    attribute EventHandler onaccessiblefocus;
+    attribute EventHandler onaccessibleincrement;
+    attribute EventHandler onaccessiblescrollintoview;
 };
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 6717d6c..9b25b4b 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -117,7 +117,6 @@
 #include "core/editing/FrameSelection.h"
 #include "core/editing/markers/DocumentMarkerController.h"
 #include "core/editing/serializers/Serialization.h"
-#include "core/editing/spellcheck/SpellChecker.h"
 #include "core/events/BeforeUnloadEvent.h"
 #include "core/events/EventFactory.h"
 #include "core/events/HashChangeEvent.h"
@@ -4476,9 +4475,6 @@
         goto SetFocusedElementDone;
       }
     }
-
-    if (IsRootEditableElement(*focused_element_))
-      GetFrame()->GetSpellChecker().DidBeginEditing(focused_element_.Get());
   }
 
   if (!focus_change_blocked && focused_element_) {
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h
index f8c3af6..4ecd81e 100644
--- a/third_party/WebKit/Source/core/dom/Element.h
+++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -91,10 +91,9 @@
   kContainsFullScreenElement = 1 << 3,
   kIsInTopLayer = 1 << 4,
   kHasPendingResources = 1 << 5,
-  kAlreadySpellChecked = 1 << 6,
-  kContainsPersistentVideo = 1 << 7,
+  kContainsPersistentVideo = 1 << 6,
 
-  kNumberOfElementFlags = 8,  // Size of bitfield used to store the flags.
+  kNumberOfElementFlags = 7,  // Size of bitfield used to store the flags.
 };
 
 enum class ShadowRootType;
@@ -718,13 +717,6 @@
   void ClearHasPendingResources() { ClearElementFlag(kHasPendingResources); }
   virtual void BuildPendingResource() {}
 
-  bool IsAlreadySpellChecked() const {
-    return HasElementFlag(kAlreadySpellChecked);
-  }
-  void SetAlreadySpellChecked(bool value) {
-    SetElementFlag(kAlreadySpellChecked, value);
-  }
-
   void V0SetCustomElementDefinition(V0CustomElementDefinition*);
   V0CustomElementDefinition* GetV0CustomElementDefinition() const;
 
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp
index 2729cc4b..2b4ef18 100644
--- a/third_party/WebKit/Source/core/editing/Editor.cpp
+++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -924,9 +924,6 @@
   DCHECK(!cmd->IsCommandGroupWrapper());
   EventQueueScope scope;
 
-  // Request spell checking before any further DOM change.
-  GetSpellChecker().MarkMisspellingsAfterApplyingCommand(*cmd);
-
   UndoStep* undo_step = cmd->GetUndoStep();
   DCHECK(undo_step);
   DispatchEditableContentChangedEvents(undo_step->StartingRootEditableElement(),
@@ -1056,9 +1053,6 @@
   if (!selection.IsContentEditable())
     return false;
 
-  GetSpellChecker().UpdateMarkersForWordsAffectedByEditing(
-      !text.IsEmpty() && IsSpaceOrNewline(text[0]));
-
   // Insert the text
   TypingCommand::InsertText(
       *selection.Start().GetDocument(), text, selection.AsSelection(),
@@ -1137,7 +1131,6 @@
 
   // TODO(yosin) We should use early return style here.
   if (CanDeleteRange(SelectedRange())) {
-    GetSpellChecker().UpdateMarkersForWordsAffectedByEditing(true);
     if (EnclosingTextControl(GetFrame()
                                  .Selection()
                                  .ComputeVisibleSelectionInDOMTree()
@@ -1216,7 +1209,6 @@
       !GetFrame().Selection().SelectionHasFocus())
     return;
 
-  GetSpellChecker().UpdateMarkersForWordsAffectedByEditing(false);
   ResourceFetcher* loader = GetFrame().GetDocument()->Fetcher();
   ResourceCacheValidationSuppressor validation_suppressor(loader);
 
@@ -1259,7 +1251,6 @@
       !GetFrame().Selection().SelectionHasFocus())
     return;
 
-  GetSpellChecker().UpdateMarkersForWordsAffectedByEditing(false);
   PasteAsPlainTextWithPasteboard(Pasteboard::GeneralPasteboard());
 }
 
@@ -1754,10 +1745,8 @@
       DocumentMarker::kTextMatch);
 }
 
-void Editor::RespondToChangedSelection(const Position& old_selection_start,
-                                       TypingContinuation typing_continuation) {
-  GetSpellChecker().RespondToChangedSelection(old_selection_start,
-                                              typing_continuation);
+void Editor::RespondToChangedSelection() {
+  GetSpellChecker().RespondToChangedSelection();
   Client().RespondToChangedSelection(
       &GetFrame(), GetFrame().Selection().GetSelectionInDOMTree().Type());
   SetStartNewKillRingSequence(true);
diff --git a/third_party/WebKit/Source/core/editing/Editor.h b/third_party/WebKit/Source/core/editing/Editor.h
index ea1a158..9ab1495e 100644
--- a/third_party/WebKit/Source/core/editing/Editor.h
+++ b/third_party/WebKit/Source/core/editing/Editor.h
@@ -248,8 +248,7 @@
   // |firstRectForRange| requires up-to-date layout.
   IntRect FirstRectForRange(const EphemeralRange&) const;
 
-  void RespondToChangedSelection(const Position& old_selection_start,
-                                 TypingContinuation);
+  void RespondToChangedSelection();
 
   bool MarkedTextMatchesAreHighlighted() const;
   void SetMarkedTextMatchesAreHighlighted(bool);
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
index 0cd93f3d..4498776 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -53,7 +53,6 @@
 #include "core/editing/commands/TypingCommand.h"
 #include "core/editing/iterators/TextIterator.h"
 #include "core/editing/serializers/Serialization.h"
-#include "core/editing/spellcheck/SpellChecker.h"
 #include "core/frame/LocalDOMWindow.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/LocalFrameView.h"
@@ -228,14 +227,7 @@
   ScheduleVisualUpdateForPaintInvalidationIfNeeded();
 
   const Document& current_document = GetDocument();
-  // TODO(yosin): We should get rid of unsued |options| for
-  // |Editor::respondToChangedSelection()|.
-  // Note: Since, setting focus can modify DOM tree, we should use
-  // |oldSelection| before setting focus
-  frame_->GetEditor().RespondToChangedSelection(
-      old_selection_in_dom_tree.ComputeStartPosition(),
-      options.ShouldCloseTyping() ? TypingContinuation::kEnd
-                                  : TypingContinuation::kContinue);
+  frame_->GetEditor().RespondToChangedSelection();
   DCHECK_EQ(current_document, GetDocument());
   return true;
 }
@@ -756,8 +748,6 @@
   // Caret appears in the active frame.
   if (active_and_focused)
     SetSelectionFromNone();
-  else
-    frame_->GetSpellChecker().SpellCheckAfterBlur();
   frame_caret_->SetCaretVisibility(active_and_focused
                                        ? CaretVisibility::kVisible
                                        : CaretVisibility::kHidden);
diff --git a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
index 8d73864..40f88d5 100644
--- a/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/CompositeEditCommand.cpp
@@ -63,7 +63,6 @@
 #include "core/editing/iterators/TextIterator.h"
 #include "core/editing/markers/DocumentMarkerController.h"
 #include "core/editing/serializers/Serialization.h"
-#include "core/editing/spellcheck/SpellChecker.h"
 #include "core/frame/LocalFrame.h"
 #include "core/html/HTMLBRElement.h"
 #include "core/html/HTMLDivElement.h"
@@ -1554,11 +1553,6 @@
 
   GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
 
-  GetDocument()
-      .GetFrame()
-      ->GetSpellChecker()
-      .MarkMisspellingsForMovingParagraphs(EndingVisibleSelection());
-
   // If the selection is in an empty paragraph, restore styles from the old
   // empty paragraph to the new empty paragraph.
   bool selection_is_empty_paragraph =
diff --git a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
index 7df824d..ac20eb7 100644
--- a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
@@ -949,12 +949,12 @@
 
   // Merging forward will remove m_endOfInsertedContent from the document.
   if (merge_forward) {
+    const VisibleSelection& visible_selection = EndingVisibleSelection();
     if (start_of_inserted_content_.IsOrphan()) {
       start_of_inserted_content_ =
-          EndingVisibleSelection().VisibleStart().DeepEquivalent();
+          visible_selection.VisibleStart().DeepEquivalent();
     }
-    end_of_inserted_content_ =
-        EndingVisibleSelection().VisibleEnd().DeepEquivalent();
+    end_of_inserted_content_ = visible_selection.VisibleEnd().DeepEquivalent();
     // If we merged text nodes, m_endOfInsertedContent could be null. If
     // this is the case, we use m_startOfInsertedContent.
     if (end_of_inserted_content_.IsNull())
@@ -1072,10 +1072,10 @@
       if (IsEndOfParagraph(start_after_delete) &&
           !IsStartOfParagraph(start_after_delete) &&
           !IsEndOfEditableOrNonEditableContent(start_after_delete)) {
-        SetEndingSelection(
+        SetEndingSelection(SelectionForUndoStep::From(
             SelectionInDOMTree::Builder()
                 .Collapse(NextPositionOf(start_after_delete).DeepEquivalent())
-                .Build());
+                .Build()));
       } else {
         InsertParagraphSeparator(editing_state);
       }
@@ -1089,9 +1089,10 @@
           NextPositionOf(visible_start, kCannotCrossEditingBoundary);
       if (IsEndOfParagraph(visible_start) &&
           !IsStartOfParagraph(visible_start) && next.IsNotNull()) {
-        SetEndingSelection(SelectionInDOMTree::Builder()
-                               .Collapse(next.DeepEquivalent())
-                               .Build());
+        SetEndingSelection(
+            SelectionForUndoStep::From(SelectionInDOMTree::Builder()
+                                           .Collapse(next.DeepEquivalent())
+                                           .Build()));
       } else {
         InsertParagraphSeparator(editing_state);
         if (editing_state->IsAborted())
@@ -1113,30 +1114,32 @@
     // not
     //   <div>xbar<div>bar</div><div>bazx</div></div>
     // Don't do this if the selection started in a Mail blockquote.
+    const VisiblePosition visible_start_position =
+        EndingVisibleSelection().VisibleStart();
     if (prevent_nesting_ && !start_is_inside_mail_blockquote &&
-        !IsEndOfParagraph(EndingVisibleSelection().VisibleStart()) &&
-        !IsStartOfParagraph(EndingVisibleSelection().VisibleStart())) {
+        !IsEndOfParagraph(visible_start_position) &&
+        !IsStartOfParagraph(visible_start_position)) {
       InsertParagraphSeparator(editing_state);
       if (editing_state->IsAborted())
         return;
       GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
-      SetEndingSelection(
+      SetEndingSelection(SelectionForUndoStep::From(
           SelectionInDOMTree::Builder()
               .Collapse(
                   PreviousPositionOf(EndingVisibleSelection().VisibleStart())
                       .DeepEquivalent())
-              .Build());
+              .Build()));
     }
   }
 }
 
 void ReplaceSelectionCommand::DoApply(EditingState* editing_state) {
   TRACE_EVENT0("blink", "ReplaceSelectionCommand::doApply");
-  const VisibleSelection selection = EndingVisibleSelection();
-  DCHECK(!selection.IsNone());
-  DCHECK(selection.Start().AnchorNode());
-  if (!selection.IsNonOrphanedCaretOrRange() || !selection.Start().AnchorNode())
+  const VisibleSelection& selection = EndingVisibleSelection();
+  if (selection.IsNone() || !selection.IsValidFor(GetDocument())) {
+    NOTREACHED();
     return;
+  }
 
   if (!selection.RootEditableElement())
     return;
@@ -1524,11 +1527,13 @@
       return;
 
     GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
+    const VisibleSelection& visible_selection_of_insterted_content =
+        EndingVisibleSelection();
     start_of_inserted_content_ = MostForwardCaretPosition(
-        EndingVisibleSelection().VisibleStart().DeepEquivalent());
+        visible_selection_of_insterted_content.VisibleStart().DeepEquivalent());
     if (end_of_inserted_content_.IsOrphan()) {
       end_of_inserted_content_ = MostBackwardCaretPosition(
-          EndingVisibleSelection().VisibleEnd().DeepEquivalent());
+          visible_selection_of_insterted_content.VisibleEnd().DeepEquivalent());
     }
   }
 
@@ -1548,18 +1553,19 @@
           if (editing_state->IsAborted())
             return;
         }
-        SetEndingSelection(SelectionInDOMTree::Builder()
-                               .Collapse(Position::AfterNode(
-                                   *inserted_nodes.LastLeafInserted()))
-                               .Build());
+        SetEndingSelection(SelectionForUndoStep::From(
+            SelectionInDOMTree::Builder()
+                .Collapse(
+                    Position::AfterNode(*inserted_nodes.LastLeafInserted()))
+                .Build()));
         // Select up to the paragraph separator that was added.
         last_position_to_select =
             EndingVisibleSelection().VisibleStart().DeepEquivalent();
       } else if (!IsStartOfParagraph(end_of_inserted_content)) {
-        SetEndingSelection(
+        SetEndingSelection(SelectionForUndoStep::From(
             SelectionInDOMTree::Builder()
                 .Collapse(end_of_inserted_content.DeepEquivalent())
-                .Build());
+                .Build()));
         Element* enclosing_block_element = EnclosingBlock(
             end_of_inserted_content.DeepEquivalent().AnchorNode());
         if (IsListItem(enclosing_block_element)) {
@@ -1568,10 +1574,10 @@
                           editing_state);
           if (editing_state->IsAborted())
             return;
-          SetEndingSelection(
+          SetEndingSelection(SelectionForUndoStep::From(
               SelectionInDOMTree::Builder()
                   .Collapse(Position::FirstPositionInNode(*new_list_item))
-                  .Build());
+                  .Build()));
         } else {
           // Use a default paragraph element (a plain div) for the empty
           // paragraph, using the last paragraph block's style seems to annoy
@@ -1783,21 +1789,23 @@
   end_of_inserted_range_ = end;
 
   if (select_replacement_) {
-    SetEndingSelection(SelectionInDOMTree::Builder()
-                           .SetBaseAndExtentDeprecated(start, end)
-                           .SetIsDirectional(EndingSelection().IsDirectional())
-                           .Build());
+    SetEndingSelection(SelectionForUndoStep::From(
+        SelectionInDOMTree::Builder()
+            .SetBaseAndExtentDeprecated(start, end)
+            .SetIsDirectional(EndingSelection().IsDirectional())
+            .Build()));
     return;
   }
 
   if (end.IsNotNull()) {
-    SetEndingSelection(SelectionInDOMTree::Builder()
-                           .Collapse(end)
-                           .SetIsDirectional(EndingSelection().IsDirectional())
-                           .Build());
+    SetEndingSelection(SelectionForUndoStep::From(
+        SelectionInDOMTree::Builder()
+            .Collapse(end)
+            .SetIsDirectional(EndingSelection().IsDirectional())
+            .Build()));
     return;
   }
-  SetEndingSelection(SelectionInDOMTree());
+  SetEndingSelection(SelectionForUndoStep());
 }
 
 void ReplaceSelectionCommand::MergeTextNodesAroundPosition(
@@ -1991,7 +1999,7 @@
   GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
 
   Node* node_after_insertion_pos =
-      MostForwardCaretPosition(EndingVisibleSelection().End()).AnchorNode();
+      MostForwardCaretPosition(EndingSelection().End()).AnchorNode();
   Text* text_node = ToText(fragment.FirstChild());
   // Our fragment creation code handles tabs, spaces, and newlines, so we don't
   // have to worry about those here.
@@ -2016,10 +2024,10 @@
   start_of_inserted_range_ = start;
   end_of_inserted_range_ = end;
 
-  SetEndingSelection(
+  SetEndingSelection(SelectionForUndoStep::From(
       SelectionInDOMTree::Builder()
           .SetBaseAndExtentDeprecated(select_replacement_ ? start : end, end)
-          .Build());
+          .Build()));
 
   return true;
 }
diff --git a/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp b/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp
index bc32dd3..1d814dff 100644
--- a/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/TypingCommand.cpp
@@ -42,7 +42,6 @@
 #include "core/editing/commands/InsertLineBreakCommand.h"
 #include "core/editing/commands/InsertParagraphSeparatorCommand.h"
 #include "core/editing/commands/InsertTextCommand.h"
-#include "core/editing/spellcheck/SpellChecker.h"
 #include "core/events/BeforeTextInsertedEvent.h"
 #include "core/events/TextEvent.h"
 #include "core/frame/LocalFrame.h"
@@ -269,11 +268,6 @@
   LocalFrame* frame = document.GetFrame();
   DCHECK(frame);
 
-  if (!text.IsEmpty())
-    document.GetFrame()
-        ->GetSpellChecker()
-        .UpdateMarkersForWordsAffectedByEditing(IsSpaceOrNewline(text[0]));
-
   InsertText(document, text, frame->Selection().GetSelectionInDOMTree(),
              options, composition, is_incremental_insertion);
 }
@@ -722,8 +716,6 @@
   if (!frame)
     return;
 
-  frame->GetSpellChecker().UpdateMarkersForWordsAffectedByEditing(false);
-
   if (EndingSelection().IsRange()) {
     DeleteKeyPressedInternal(EndingVisibleSelection(), EndingSelection(),
                              kill_ring, editing_state);
@@ -904,8 +896,6 @@
   if (!frame)
     return;
 
-  frame->GetSpellChecker().UpdateMarkersForWordsAffectedByEditing(false);
-
   if (EndingSelection().IsRange()) {
     ForwardDeleteKeyPressedInternal(EndingVisibleSelection(), EndingSelection(),
                                     kill_ring, editing_state);
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallback.cpp b/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallback.cpp
index 6e78fe4c..8fe9a89 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallback.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallback.cpp
@@ -165,7 +165,6 @@
 }
 
 void IdleSpellCheckCallback::handleEvent(IdleDeadline* deadline) {
-  DCHECK(RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled());
   DCHECK(GetFrame().GetDocument());
   DCHECK(GetFrame().GetDocument()->IsActive());
   DCHECK_NE(idle_callback_handle_, kInvalidHandle);
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallbackTest.cpp b/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallbackTest.cpp
index 843440b..e85be81 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallbackTest.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/IdleSpellCheckCallbackTest.cpp
@@ -44,8 +44,6 @@
 // Test cases for lifecycle state transitions.
 
 TEST_F(IdleSpellCheckCallbackTest, InitializationWithColdMode) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -53,8 +51,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, InitializationWithoutColdMode) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -62,9 +58,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, RequestWhenInactive) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
   TransitTo(State::kInactive);
   IdleChecker().SetNeedsInvocation();
   EXPECT_EQ(State::kHotModeRequested, IdleChecker().GetState());
@@ -72,9 +65,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, RequestWhenHotModeRequested) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
   TransitTo(State::kHotModeRequested);
   int handle = IdleChecker().IdleCallbackHandle();
   IdleChecker().SetNeedsInvocation();
@@ -84,8 +74,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, RequestWhenColdModeTimerStarted) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -96,8 +84,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, RequestWhenColdModeRequested) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -110,8 +96,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, HotModeTransitToInactive) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -121,8 +105,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, HotModeTransitToColdMode) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -132,8 +114,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, ColdModeTimerStartedToRequested) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -144,8 +124,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, ColdModeStayAtColdMode) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -156,8 +134,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, ColdModeToInactive) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -167,26 +143,18 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, DetachWhenInactive) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
   TransitTo(State::kInactive);
   GetDocument().Shutdown();
   EXPECT_EQ(State::kInactive, IdleChecker().GetState());
 }
 
 TEST_F(IdleSpellCheckCallbackTest, DetachWhenHotModeRequested) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
   TransitTo(State::kHotModeRequested);
   GetDocument().Shutdown();
   EXPECT_EQ(State::kInactive, IdleChecker().GetState());
 }
 
 TEST_F(IdleSpellCheckCallbackTest, DetachWhenColdModeTimerStarted) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
@@ -196,8 +164,6 @@
 }
 
 TEST_F(IdleSpellCheckCallbackTest, DetachWhenColdModeRequested) {
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
   if (!RuntimeEnabledFeatures::IdleTimeColdModeSpellCheckingEnabled())
     return;
 
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
index ce2b31e8..53a4c820 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
@@ -55,7 +55,6 @@
 #include "core/layout/LayoutTextControl.h"
 #include "core/loader/EmptyClients.h"
 #include "core/page/Page.h"
-#include "platform/RuntimeEnabledFeatures.h"
 #include "platform/text/TextBreakIterator.h"
 #include "platform/text/TextCheckerClient.h"
 #include "platform/wtf/Assertions.h"
@@ -69,28 +68,6 @@
 
 namespace {
 
-bool IsPositionInTextField(const Position& selection_start) {
-  TextControlElement* text_control = EnclosingTextControl(selection_start);
-  return isHTMLInputElement(text_control) &&
-         toHTMLInputElement(text_control)->IsTextField();
-}
-
-bool IsPositionInTextArea(const Position& position) {
-  TextControlElement* text_control = EnclosingTextControl(position);
-  return isHTMLTextAreaElement(text_control);
-}
-
-SelectionInDOMTree SelectWord(const VisiblePosition& position) {
-  // TODO(yosin): We should fix |startOfWord()| and |endOfWord()| not to return
-  // null position.
-  const VisiblePosition& start = StartOfWord(position, kLeftWordIfOnBoundary);
-  const VisiblePosition& end = EndOfWord(position, kRightWordIfOnBoundary);
-  return SelectionInDOMTree::Builder()
-      .SetBaseAndExtentDeprecated(start.DeepEquivalent(), end.DeepEquivalent())
-      .SetAffinity(start.Affinity())
-      .Build();
-}
-
 static bool IsWhiteSpaceOrPunctuation(UChar c) {
   return IsSpaceOrNewline(c) || WTF::Unicode::IsPunct(c);
 }
@@ -142,64 +119,6 @@
   GetSpellCheckerClient().ToggleSpellCheckingEnabled();
   if (IsSpellCheckingEnabled())
     return;
-  for (Frame* frame = this->GetFrame().GetPage()->MainFrame(); frame;
-       frame = frame->Tree().TraverseNext()) {
-    if (!frame->IsLocalFrame())
-      continue;
-    for (Node& node : NodeTraversal::StartsAt(
-             ToLocalFrame(frame)->GetDocument()->RootNode())) {
-      if (node.IsElementNode())
-        ToElement(node).SetAlreadySpellChecked(false);
-    }
-  }
-}
-
-void SpellChecker::DidBeginEditing(Element* element) {
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
-  if (!IsSpellCheckingEnabled())
-    return;
-
-  // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
-  // needs to be audited.  See http://crbug.com/590369 for more details.
-  // In the long term we should use idle time spell checker to prevent
-  // synchronous layout caused by spell checking (see crbug.com/517298).
-  GetFrame().GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-
-  DocumentLifecycle::DisallowTransitionScope disallow_transition(
-      GetFrame().GetDocument()->Lifecycle());
-
-  bool is_text_field = false;
-  TextControlElement* enclosing_text_control_element = nullptr;
-  if (!IsTextControlElement(*element)) {
-    enclosing_text_control_element =
-        EnclosingTextControl(Position::FirstPositionInNode(*element));
-  }
-  element =
-      enclosing_text_control_element ? enclosing_text_control_element : element;
-  Element* parent = element;
-  if (IsTextControlElement(*element)) {
-    TextControlElement* text_control = ToTextControlElement(element);
-    parent = text_control;
-    element = text_control->InnerEditorElement();
-    if (!element)
-      return;
-    is_text_field = isHTMLInputElement(*text_control) &&
-                    toHTMLInputElement(*text_control).IsTextField();
-  }
-
-  if (is_text_field || !parent->IsAlreadySpellChecked()) {
-    if (EditingIgnoresContent(*element))
-      return;
-    // We always recheck textfields because markers are removed from them on
-    // blur.
-    const VisibleSelection selection = CreateVisibleSelection(
-        SelectionInDOMTree::Builder().SelectAllChildren(*element).Build());
-    MarkMisspellingsInternal(selection);
-    if (!is_text_field)
-      parent->SetAlreadySpellChecked(true);
-  }
 }
 
 void SpellChecker::IgnoreSpelling() {
@@ -337,134 +256,6 @@
   SpellCheckPanelHostClient().ShowSpellingUI(true);
 }
 
-void SpellChecker::MarkMisspellingsForMovingParagraphs(
-    const VisibleSelection& moving_selection) {
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
-  // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
-  // needs to be audited.  See http://crbug.com/590369 for more details.
-  // In the long term we should use idle time spell checker to prevent
-  // synchronous layout caused by spell checking (see crbug.com/517298).
-  GetFrame().GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-
-  DocumentLifecycle::DisallowTransitionScope disallow_transition(
-      GetFrame().GetDocument()->Lifecycle());
-
-  MarkMisspellingsInternal(moving_selection);
-}
-
-void SpellChecker::MarkMisspellingsInternal(const VisibleSelection& selection) {
-  if (!IsSpellCheckingEnabled() || !IsSpellCheckingEnabledAt(selection.Start()))
-    return;
-
-  const EphemeralRange& range = selection.ToNormalizedEphemeralRange();
-  if (range.IsNull())
-    return;
-
-  // If we're not in an editable node, bail.
-  Node* editable_node = range.StartPosition().ComputeContainerNode();
-  if (!editable_node || !HasEditableStyle(*editable_node))
-    return;
-
-  TextCheckingParagraph full_paragraph_to_check(
-      ExpandRangeToSentenceBoundary(range));
-  ChunkAndMarkAllMisspellings(full_paragraph_to_check);
-}
-
-void SpellChecker::MarkMisspellingsAfterApplyingCommand(
-    const CompositeEditCommand& cmd) {
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
-  if (!IsSpellCheckingEnabled())
-    return;
-
-  if (!IsSpellCheckingEnabledAt(cmd.EndingSelection().Base()))
-    return;
-
-  // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
-  // needs to be audited.  See http://crbug.com/590369 for more details.
-  // In the long term we should use idle time spell checker to prevent
-  // synchronous layout caused by spell checking (see crbug.com/517298).
-  GetFrame().GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-
-  // Use type-based conditioning instead of polymorphism so that all spell
-  // checking code can be encapsulated in SpellChecker.
-
-  if (cmd.IsTypingCommand()) {
-    MarkMisspellingsAfterTypingCommand(ToTypingCommand(cmd));
-    return;
-  }
-
-  if (!cmd.IsReplaceSelectionCommand())
-    return;
-
-  // Note: Request spell checking for and only for |ReplaceSelectionCommand|s
-  // created in |Editor::replaceSelectionWithFragment()|.
-  // TODO(xiaochengh): May also need to do this after dragging crbug.com/298046.
-  if (cmd.GetInputType() != InputEvent::InputType::kInsertFromPaste)
-    return;
-
-  MarkMisspellingsAfterReplaceSelectionCommand(ToReplaceSelectionCommand(cmd));
-}
-
-void SpellChecker::MarkMisspellingsAfterTypingCommand(
-    const TypingCommand& cmd) {
-  spell_check_requester_->CancelCheck();
-
-  // Take a look at the selection that results after typing and determine
-  // whether we need to spellcheck.  Since the word containing the current
-  // selection is never marked, this does a check to see if typing made a new
-  // word that is not in the current selection.  Basically, you get this by
-  // being at the end of a word and typing a space.
-  const VisiblePosition start = CreateVisiblePosition(
-      cmd.EndingSelection().Start(), cmd.EndingSelection().Affinity());
-  VisiblePosition previous = PreviousPositionOf(start);
-
-  VisiblePosition word_start_of_previous =
-      StartOfWord(previous, kLeftWordIfOnBoundary);
-
-  if (cmd.CommandTypeOfOpenCommand() ==
-      TypingCommand::kInsertParagraphSeparator) {
-    VisiblePosition next_word = NextWordPosition(start);
-    // TODO(yosin): We should make |endOfWord()| not to return null position.
-    VisibleSelection words = CreateVisibleSelection(
-        SelectionInDOMTree::Builder()
-            .SetBaseAndExtentDeprecated(word_start_of_previous.DeepEquivalent(),
-                                        EndOfWord(next_word).DeepEquivalent())
-            .SetAffinity(word_start_of_previous.Affinity())
-            .Build());
-    MarkMisspellingsAfterLineBreak(words);
-    return;
-  }
-
-  if (previous.IsNull())
-    return;
-  VisiblePosition current_word_start =
-      StartOfWord(start, kLeftWordIfOnBoundary);
-  if (word_start_of_previous.DeepEquivalent() ==
-      current_word_start.DeepEquivalent())
-    return;
-  MarkMisspellingsAfterTypingToWord(word_start_of_previous);
-}
-
-void SpellChecker::MarkMisspellingsAfterLineBreak(
-    const VisibleSelection& word_selection) {
-  TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterLineBreak");
-
-  MarkMisspellingsInternal(word_selection);
-}
-
-void SpellChecker::MarkMisspellingsAfterTypingToWord(
-    const VisiblePosition& word_start) {
-  TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterTypingToWord");
-
-  VisibleSelection adjacent_words =
-      CreateVisibleSelection(SelectWord(word_start));
-  MarkMisspellingsInternal(adjacent_words);
-}
-
 bool SpellChecker::IsSpellCheckingEnabledInFocusedNode() const {
   // To avoid regression on speedometer benchmark[1] test, we should not
   // update layout tree in this code block.
@@ -487,69 +278,6 @@
   return focused_element->IsSpellCheckingEnabled();
 }
 
-void SpellChecker::MarkMisspellingsAfterReplaceSelectionCommand(
-    const ReplaceSelectionCommand& cmd) {
-  TRACE_EVENT0("blink",
-               "SpellChecker::markMisspellingsAfterReplaceSelectionCommand");
-
-  const EphemeralRange& inserted_range = cmd.InsertedRange();
-  if (inserted_range.IsNull())
-    return;
-
-  Node* node = RootEditableElementOf(cmd.EndingSelection().Base());
-  if (!node)
-    return;
-
-  EphemeralRange paragraph_range(Position::FirstPositionInNode(*node),
-                                 Position::LastPositionInNode(*node));
-  TextCheckingParagraph text_to_check(inserted_range, paragraph_range);
-  ChunkAndMarkAllMisspellings(text_to_check);
-}
-
-void SpellChecker::ChunkAndMarkAllMisspellings(
-    const TextCheckingParagraph& full_paragraph_to_check) {
-  if (full_paragraph_to_check.IsEmpty())
-    return;
-  const EphemeralRange& paragraph_range =
-      full_paragraph_to_check.ParagraphRange();
-
-  // Since the text may be quite big chunk it up and adjust to the sentence
-  // boundary.
-  const int kChunkSize = 16 * 1024;
-
-  // Check the full paragraph instead if the paragraph is short, which saves
-  // the cost on sentence boundary finding.
-  if (full_paragraph_to_check.RangeLength() <= kChunkSize) {
-    spell_check_requester_->RequestCheckingFor(paragraph_range);
-    return;
-  }
-
-  CharacterIterator check_range_iterator(
-      full_paragraph_to_check.CheckingRange(),
-      TextIteratorBehavior::Builder()
-          .SetEmitsObjectReplacementCharacter(true)
-          .Build());
-  for (int request_num = 0; !check_range_iterator.AtEnd(); request_num++) {
-    EphemeralRange chunk_range =
-        check_range_iterator.CalculateCharacterSubrange(0, kChunkSize);
-    EphemeralRange check_range =
-        request_num ? ExpandEndToSentenceBoundary(chunk_range)
-                    : ExpandRangeToSentenceBoundary(chunk_range);
-
-    spell_check_requester_->RequestCheckingFor(check_range, request_num);
-
-    if (!check_range_iterator.AtEnd()) {
-      check_range_iterator.Advance(1);
-      // The layout should be already update due to the initialization of
-      // checkRangeIterator, so comparePositions can be directly called.
-      if (ComparePositions(chunk_range.EndPosition(),
-                           check_range.EndPosition()) < 0)
-        check_range_iterator.Advance(TextIterator::RangeLength(
-            chunk_range.EndPosition(), check_range.EndPosition()));
-    }
-  }
-}
-
 static void AddMarker(Document* document,
                       const EphemeralRange& checking_range,
                       DocumentMarker::MarkerType type,
@@ -693,123 +421,11 @@
   }
 }
 
-void SpellChecker::UpdateMarkersForWordsAffectedByEditing(
-    bool do_not_remove_if_selection_at_word_boundary) {
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
-  DCHECK(GetFrame().Selection().IsAvailable());
-  TRACE_EVENT0("blink", "SpellChecker::updateMarkersForWordsAffectedByEditing");
-  // TODO(editing-dev): We should hoist
-  // updateStyleAndLayoutIgnorePendingStylesheets to caller. See
-  // http://crbug.com/590369 for more details.
-  GetFrame().GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-  const VisibleSelection& visible_selection =
-      GetFrame().Selection().ComputeVisibleSelectionInDOMTree();
-  if (!IsSpellCheckingEnabledAt(visible_selection.Base()))
-    return;
-
-  Document* document = GetFrame().GetDocument();
-  DCHECK(document);
-
-  // We want to remove the markers from a word if an editing command will change
-  // the word. This can happen in one of several scenarios:
-  // 1. Insert in the middle of a word.
-  // 2. Appending non whitespace at the beginning of word.
-  // 3. Appending non whitespace at the end of word.
-  // Note that, appending only whitespaces at the beginning or end of word won't
-  // change the word, so we don't need to remove the markers on that word. Of
-  // course, if current selection is a range, we potentially will edit two words
-  // that fall on the boundaries of selection, and remove words between the
-  // selection boundaries.
-  VisiblePosition start_of_selection =
-      GetFrame().Selection().ComputeVisibleSelectionInDOMTree().VisibleStart();
-  VisiblePosition end_of_selection =
-      GetFrame().Selection().ComputeVisibleSelectionInDOMTree().VisibleEnd();
-  if (start_of_selection.IsNull())
-    return;
-  // First word is the word that ends after or on the start of selection.
-  VisiblePosition start_of_first_word =
-      StartOfWord(start_of_selection, kLeftWordIfOnBoundary);
-  VisiblePosition end_of_first_word =
-      EndOfWord(start_of_selection, kLeftWordIfOnBoundary);
-  // Last word is the word that begins before or on the end of selection
-  VisiblePosition start_of_last_word =
-      StartOfWord(end_of_selection, kRightWordIfOnBoundary);
-  VisiblePosition end_of_last_word =
-      EndOfWord(end_of_selection, kRightWordIfOnBoundary);
-
-  if (start_of_first_word.IsNull()) {
-    start_of_first_word =
-        StartOfWord(start_of_selection, kRightWordIfOnBoundary);
-    end_of_first_word = EndOfWord(start_of_selection, kRightWordIfOnBoundary);
-  }
-
-  if (end_of_last_word.IsNull()) {
-    start_of_last_word = StartOfWord(end_of_selection, kLeftWordIfOnBoundary);
-    end_of_last_word = EndOfWord(end_of_selection, kLeftWordIfOnBoundary);
-  }
-
-  // If doNotRemoveIfSelectionAtWordBoundary is true, and first word ends at the
-  // start of selection, we choose next word as the first word.
-  if (do_not_remove_if_selection_at_word_boundary &&
-      end_of_first_word.DeepEquivalent() ==
-          start_of_selection.DeepEquivalent()) {
-    start_of_first_word = NextWordPosition(start_of_first_word);
-    end_of_first_word = EndOfWord(start_of_first_word, kRightWordIfOnBoundary);
-    if (start_of_first_word.DeepEquivalent() ==
-        end_of_selection.DeepEquivalent())
-      return;
-  }
-
-  // If doNotRemoveIfSelectionAtWordBoundary is true, and last word begins at
-  // the end of selection, we choose previous word as the last word.
-  if (do_not_remove_if_selection_at_word_boundary &&
-      start_of_last_word.DeepEquivalent() ==
-          end_of_selection.DeepEquivalent()) {
-    start_of_last_word = PreviousWordPosition(start_of_last_word);
-    end_of_last_word = EndOfWord(start_of_last_word, kRightWordIfOnBoundary);
-    if (end_of_last_word.DeepEquivalent() ==
-        start_of_selection.DeepEquivalent())
-      return;
-  }
-
-  if (start_of_first_word.IsNull() || end_of_first_word.IsNull() ||
-      start_of_last_word.IsNull() || end_of_last_word.IsNull())
-    return;
-
-  const Position& remove_marker_start = start_of_first_word.DeepEquivalent();
-  const Position& remove_marker_end = end_of_last_word.DeepEquivalent();
-  if (remove_marker_start > remove_marker_end) {
-    // editing/inserting/insert-br-008.html and more reach here.
-    // TODO(yosin): To avoid |DCHECK(removeMarkerStart <= removeMarkerEnd)|
-    // in |EphemeralRange| constructor, we have this if-statement. Once we
-    // fix |startOfWord()| and |endOfWord()|, we should remove this
-    // if-statement.
-    return;
-  }
-
-  // Now we remove markers on everything between startOfFirstWord and
-  // endOfLastWord. However, if an autocorrection change a single word to
-  // multiple words, we want to remove correction mark from all the resulted
-  // words even we only edit one of them. For example, assuming autocorrection
-  // changes "avantgarde" to "avant garde", we will have CorrectionIndicator
-  // marker on both words and on the whitespace between them. If we then edit
-  // garde, we would like to remove the marker from word "avant" and whitespace
-  // as well. So we need to get the continous range of of marker that contains
-  // the word in question, and remove marker on that whole range.
-  const EphemeralRange word_range(remove_marker_start, remove_marker_end);
-  document->Markers().RemoveMarkersInRange(
-      word_range, DocumentMarker::MisspellingMarkers());
-}
-
 void SpellChecker::DidEndEditingOnTextField(Element* e) {
   TRACE_EVENT0("blink", "SpellChecker::didEndEditingOnTextField");
 
   // Remove markers when deactivating a selection in an <input type="text"/>.
   // Prevent new ones from appearing too.
-  if (!RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    spell_check_requester_->CancelCheck();
   TextControlElement* text_control_element = ToTextControlElement(e);
   HTMLElement* inner_editor = text_control_element->InnerEditorElement();
   RemoveSpellingAndGrammarMarkers(*inner_editor);
@@ -938,80 +554,12 @@
       text, false, false, InputEvent::InputType::kInsertReplacementText);
 }
 
-static bool ShouldCheckOldSelection(const Position& old_selection_start) {
-  if (!old_selection_start.IsConnected())
-    return false;
-  if (IsPositionInTextField(old_selection_start))
-    return false;
-  if (IsPositionInTextArea(old_selection_start))
-    return true;
-
-  // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
-  // needs to be audited.  See http://crbug.com/590369 for more details.
-  // In the long term we should use idle time spell checker to prevent
-  // synchronous layout caused by spell checking (see crbug.com/517298).
-  old_selection_start.GetDocument()
-      ->UpdateStyleAndLayoutIgnorePendingStylesheets();
-
-  return IsEditablePosition(old_selection_start);
-}
-
-void SpellChecker::RespondToChangedSelection(
-    const Position& old_selection_start,
-    TypingContinuation typing_continuation) {
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    idle_spell_check_callback_->SetNeedsInvocation();
-    return;
-  }
-
-  TRACE_EVENT0("blink", "SpellChecker::respondToChangedSelection");
-  if (!IsSpellCheckingEnabledAt(old_selection_start))
-    return;
-
-  // When spell checking is off, existing markers disappear after the selection
-  // changes.
-  if (!IsSpellCheckingEnabled()) {
-    GetFrame().GetDocument()->Markers().RemoveMarkersOfTypes(
-        DocumentMarker::kSpelling);
-    GetFrame().GetDocument()->Markers().RemoveMarkersOfTypes(
-        DocumentMarker::kGrammar);
-    return;
-  }
-
-  if (typing_continuation == TypingContinuation::kContinue)
-    return;
-  if (!ShouldCheckOldSelection(old_selection_start))
-    return;
-
-  // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
-  // needs to be audited.  See http://crbug.com/590369 for more details.
-  // In the long term we should use idle time spell checker to prevent
-  // synchronous layout caused by spell checking (see crbug.com/517298).
-  GetFrame().GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-
-  DocumentLifecycle::DisallowTransitionScope disallow_transition(
-      GetFrame().GetDocument()->Lifecycle());
-
-  VisibleSelection new_adjacent_words;
-  const VisibleSelection new_selection =
-      GetFrame().Selection().ComputeVisibleSelectionInDOMTree();
-  if (new_selection.IsContentEditable()) {
-    new_adjacent_words =
-        CreateVisibleSelection(SelectWord(new_selection.VisibleStart()));
-  }
-
-  // When typing we check spelling elsewhere, so don't redo it here.
-  // If this is a change in selection resulting from a delete operation,
-  // oldSelection may no longer be in the document.
-  // FIXME(http://crbug.com/382809): if oldSelection is on a textarea
-  // element, we cause synchronous layout.
-  SpellCheckOldSelection(old_selection_start, new_adjacent_words);
+void SpellChecker::RespondToChangedSelection() {
+  idle_spell_check_callback_->SetNeedsInvocation();
 }
 
 void SpellChecker::RespondToChangedContents() {
-  UpdateMarkersForWordsAffectedByEditing(true);
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    idle_spell_check_callback_->SetNeedsInvocation();
+  idle_spell_check_callback_->SetNeedsInvocation();
 }
 
 void SpellChecker::RemoveSpellingMarkers() {
@@ -1027,46 +575,6 @@
   marker_controller.RepaintMarkers();
 }
 
-void SpellChecker::SpellCheckAfterBlur() {
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
-  // TODO(editing-dev): Hoist updateStyleAndLayoutIgnorePendingStylesheets
-  // to caller. See http://crbug.com/590369 for more details.
-  // In the long term we should use idle time spell checker to
-  // prevent synchronous layout caused by spell checking (see crbug.com/517298).
-  GetFrame().GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-  DocumentLifecycle::DisallowTransitionScope disallow_transition(
-      GetFrame().GetDocument()->Lifecycle());
-  const VisibleSelection& selection =
-      GetFrame().Selection().ComputeVisibleSelectionInDOMTree();
-  if (!selection.IsContentEditable())
-    return;
-
-  if (IsPositionInTextField(selection.Start())) {
-    // textFieldDidEndEditing() and textFieldDidBeginEditing() handle this.
-    return;
-  }
-
-  SpellCheckOldSelection(selection.Start(), VisibleSelection());
-}
-
-void SpellChecker::SpellCheckOldSelection(
-    const Position& old_selection_start,
-    const VisibleSelection& new_adjacent_words) {
-  if (!IsSpellCheckingEnabled())
-    return;
-
-  TRACE_EVENT0("blink", "SpellChecker::spellCheckOldSelection");
-
-  VisiblePosition old_start = CreateVisiblePosition(old_selection_start);
-  VisibleSelection old_adjacent_words =
-      CreateVisibleSelection(SelectWord(old_start));
-  if (old_adjacent_words == new_adjacent_words)
-    return;
-  MarkMisspellingsInternal(old_adjacent_words);
-}
-
 static Node* FindFirstMarkable(Node* node) {
   while (node) {
     if (!node->GetLayoutObject())
@@ -1129,8 +637,7 @@
 }
 
 void SpellChecker::DocumentAttached(Document* document) {
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    idle_spell_check_callback_->DocumentAttached(document);
+  idle_spell_check_callback_->DocumentAttached(document);
 }
 
 DEFINE_TRACE(SpellChecker) {
@@ -1141,8 +648,7 @@
 
 void SpellChecker::PrepareForLeakDetection() {
   spell_check_requester_->PrepareForLeakDetection();
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    idle_spell_check_callback_->Deactivate();
+  idle_spell_check_callback_->Deactivate();
 }
 
 Vector<TextCheckingResult> SpellChecker::FindMisspellings(const String& text) {
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.h b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.h
index 2716cd5..485306d 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.h
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.h
@@ -27,26 +27,21 @@
 #define SpellChecker_h
 
 #include "core/CoreExport.h"
-#include "core/editing/VisibleSelection.h"
+#include "core/editing/EphemeralRange.h"
 #include "core/editing/markers/DocumentMarker.h"
 #include "platform/heap/Handle.h"
 #include "platform/text/TextChecking.h"
 
 namespace blink {
 
-class CompositeEditCommand;
 class IdleSpellCheckCallback;
 class LocalFrame;
-class ReplaceSelectionCommand;
 class SpellCheckerClient;
 class SpellCheckMarker;
 class SpellCheckRequest;
 class SpellCheckRequester;
 class TextCheckerClient;
-class TextCheckingParagraph;
 struct TextCheckingResult;
-class TypingCommand;
-enum class TypingContinuation;
 class WebSpellCheckPanelHostClient;
 
 class CORE_EXPORT SpellChecker final : public GarbageCollected<SpellChecker> {
@@ -66,15 +61,11 @@
   void ToggleSpellCheckingEnabled();
   void IgnoreSpelling();
   bool IsSpellCheckingEnabledInFocusedNode() const;
-  void MarkMisspellingsAfterApplyingCommand(const CompositeEditCommand&);
   void MarkAndReplaceFor(SpellCheckRequest*, const Vector<TextCheckingResult>&);
   void AdvanceToNextMisspelling(bool start_before_selection);
   void ShowSpellingGuessPanel();
-  void DidBeginEditing(Element*);
-  void MarkMisspellingsForMovingParagraphs(const VisibleSelection&);
   void RespondToChangedContents();
-  void RespondToChangedSelection(const Position& old_selection_start,
-                                 TypingContinuation);
+  void RespondToChangedSelection();
   std::pair<Node*, SpellCheckMarker*> GetSpellCheckMarkerUnderSelection() const;
   // The first String returned in the pair is the selected text.
   // The second String is the marker's description.
@@ -85,14 +76,11 @@
   enum class ElementsType { kAll, kOnlyNonEditable };
   void RemoveSpellingAndGrammarMarkers(const HTMLElement&,
                                        ElementsType = ElementsType::kAll);
-  void SpellCheckAfterBlur();
 
   void DidEndEditingOnTextField(Element*);
   bool SelectionStartHasMarkerFor(DocumentMarker::MarkerType,
                                   int from,
                                   int length) const;
-  void UpdateMarkersForWordsAffectedByEditing(
-      bool only_handle_words_containing_selection);
   void CancelCheck();
 
   // Exposed for testing and idle time spell checker
@@ -125,20 +113,8 @@
   Vector<TextCheckingResult> FindMisspellings(const String&);
   std::pair<String, int> FindFirstMisspelling(const Position&, const Position&);
 
-  void MarkMisspellingsAfterLineBreak(const VisibleSelection& word_selection);
-  void MarkMisspellingsAfterTypingToWord(const VisiblePosition& word_start);
-  void MarkMisspellingsAfterTypingCommand(const TypingCommand&);
-  void MarkMisspellingsAfterReplaceSelectionCommand(
-      const ReplaceSelectionCommand&);
-
   void RemoveMarkers(const EphemeralRange&, DocumentMarker::MarkerTypes);
 
-  void MarkMisspellingsInternal(const VisibleSelection&);
-  void ChunkAndMarkAllMisspellings(
-      const TextCheckingParagraph& full_paragraph_to_check);
-  void SpellCheckOldSelection(const Position& old_selection_start,
-                              const VisibleSelection& new_adjacent_words);
-
   Member<LocalFrame> frame_;
 
   const Member<SpellCheckRequester> spell_check_requester_;
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerClientImpl.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerClientImpl.cpp
index 3cbbecd2..267527c 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerClientImpl.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerClientImpl.cpp
@@ -95,24 +95,6 @@
     return;
   }
   spell_check_this_field_status_ = kSpellCheckForcedOn;
-  if (!web_view_->FocusedCoreFrame()->IsLocalFrame())
-    return;
-  LocalFrame* const frame = ToLocalFrame(web_view_->FocusedCoreFrame());
-  if (!frame)
-    return;
-
-  // TODO(editing-dev): The use of UpdateStyleAndLayoutIgnorePendingStylesheets
-  // needs to be audited.  See http://crbug.com/590369 for more details.
-  frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
-
-  const VisibleSelection& visible_selection =
-      frame->Selection().ComputeVisibleSelectionInDOMTree();
-  // If a selection is in an editable element spell check its content.
-  Element* const root_editable_element =
-      visible_selection.RootEditableElement();
-  if (!root_editable_element)
-    return;
-  frame->GetSpellChecker().DidBeginEditing(root_editable_element);
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
index ceaeb221..5551bc4 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
@@ -90,8 +90,7 @@
   EXPECT_TRUE(GetSpellChecker().IsSpellCheckingEnabled());
   ForceLayout();
   int start_count = LayoutCount();
-  GetSpellChecker().RespondToChangedSelection(old_selection.Start(),
-                                              TypingContinuation::kEnd);
+  GetSpellChecker().RespondToChangedSelection();
   EXPECT_EQ(start_count, LayoutCount());
 }
 
diff --git a/third_party/WebKit/Source/core/events/EventTypeNames.json5 b/third_party/WebKit/Source/core/events/EventTypeNames.json5
index e50d894..8f0c487 100644
--- a/third_party/WebKit/Source/core/events/EventTypeNames.json5
+++ b/third_party/WebKit/Source/core/events/EventTypeNames.json5
@@ -18,6 +18,11 @@
     "abort",
     "abortpayment",
     "accessibleclick",
+    "accessiblecontextmenu",
+    "accessibledecrement",
+    "accessiblefocus",
+    "accessibleincrement",
+    "accessiblescrollintoview",
     "activate",
     "active",
     "addsourcebuffer",
diff --git a/third_party/WebKit/Source/core/exported/WebFrameTest.cpp b/third_party/WebKit/Source/core/exported/WebFrameTest.cpp
index 2ff225fd..1dab7be 100644
--- a/third_party/WebKit/Source/core/exported/WebFrameTest.cpp
+++ b/third_party/WebKit/Source/core/exported/WebFrameTest.cpp
@@ -6644,12 +6644,10 @@
   document->execCommand("InsertText", false, "_wellcome_.", exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    document->GetFrame()
-        ->GetSpellChecker()
-        .GetIdleSpellCheckCallback()
-        .ForceInvocationForTesting();
-  }
+  document->GetFrame()
+      ->GetSpellChecker()
+      .GetIdleSpellCheckCallback()
+      .ForceInvocationForTesting();
 
   const int kAllTextBeginOffset = 0;
   const int kAllTextLength = 11;
@@ -6690,12 +6688,10 @@
   document->execCommand("InsertText", false, "_wellcome_.", exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    document->GetFrame()
-        ->GetSpellChecker()
-        .GetIdleSpellCheckCallback()
-        .ForceInvocationForTesting();
-  }
+  document->GetFrame()
+      ->GetSpellChecker()
+      .GetIdleSpellCheckCallback()
+      .ForceInvocationForTesting();
 
   frame->RemoveSpellingMarkers();
 
@@ -6741,11 +6737,10 @@
   document->execCommand("InsertText", false, " wellcome ", exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    frame->GetSpellChecker()
-        .GetIdleSpellCheckCallback()
-        .ForceInvocationForTesting();
-  }
+  frame->GetSpellChecker()
+      .GetIdleSpellCheckCallback()
+      .ForceInvocationForTesting();
+
   WebVector<unsigned> offsets1;
   GetSpellingMarkerOffsets(&offsets1, *frame->GetDocument());
   EXPECT_EQ(1U, offsets1.size());
@@ -6822,12 +6817,10 @@
   document->execCommand("InsertText", false, "he", exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    document->GetFrame()
-        ->GetSpellChecker()
-        .GetIdleSpellCheckCallback()
-        .ForceInvocationForTesting();
-  }
+  document->GetFrame()
+      ->GetSpellChecker()
+      .GetIdleSpellCheckCallback()
+      .ForceInvocationForTesting();
 
   textcheck.Kick();
 
@@ -6836,32 +6829,6 @@
   EXPECT_EQ(0U, offsets.size());
 }
 
-// This test verifies that cancelling spelling request does not cause a
-// write-after-free when there's no spellcheck client set.
-TEST_P(ParameterizedWebFrameTest, CancelSpellingRequestCrash) {
-  // The relevant code paths are obsolete with idle time spell checker.
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled())
-    return;
-
-  RegisterMockedHttpURLLoad("spell.html");
-  FrameTestHelpers::WebViewHelper web_view_helper;
-  web_view_helper.InitializeAndLoad(base_url_ + "spell.html");
-
-  WebLocalFrameImpl* frame = web_view_helper.LocalMainFrame();
-  frame->SetTextCheckClient(0);
-
-  Document* document = frame->GetFrame()->GetDocument();
-  Element* element = document->getElementById("data");
-
-  web_view_helper.WebView()->GetSettings()->SetEditingBehavior(
-      WebSettings::kEditingBehaviorWin);
-
-  element->focus();
-  frame->GetFrame()->GetEditor().ReplaceSelectionWithText(
-      "A", false, false, InputEvent::InputType::kInsertReplacementText);
-  frame->GetFrame()->GetSpellChecker().CancelCheck();
-}
-
 TEST_P(ParameterizedWebFrameTest, SpellcheckResultErasesMarkers) {
   RegisterMockedHttpURLLoad("spell.html");
   FrameTestHelpers::WebViewHelper web_view_helper;
@@ -6881,12 +6848,10 @@
   NonThrowableExceptionState exception_state;
   document->execCommand("InsertText", false, "welcome ", exception_state);
 
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    document->GetFrame()
-        ->GetSpellChecker()
-        .GetIdleSpellCheckCallback()
-        .ForceInvocationForTesting();
-  }
+  document->GetFrame()
+      ->GetSpellChecker()
+      .GetIdleSpellCheckCallback()
+      .ForceInvocationForTesting();
 
   document->UpdateStyleAndLayout();
 
@@ -6920,12 +6885,10 @@
   document->execCommand("InsertText", false, "wellcome ", exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    document->GetFrame()
-        ->GetSpellChecker()
-        .GetIdleSpellCheckCallback()
-        .ForceInvocationForTesting();
-  }
+  document->GetFrame()
+      ->GetSpellChecker()
+      .GetIdleSpellCheckCallback()
+      .ForceInvocationForTesting();
 
   textcheck.Kick();
   ASSERT_EQ(1U, document->Markers().Markers().size());
@@ -6936,12 +6899,10 @@
   document->execCommand("InsertText", false, "wellcome ", exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
-  if (RuntimeEnabledFeatures::IdleTimeSpellCheckingEnabled()) {
-    document->GetFrame()
-        ->GetSpellChecker()
-        .GetIdleSpellCheckCallback()
-        .ForceInvocationForTesting();
-  }
+  document->GetFrame()
+      ->GetSpellChecker()
+      .GetIdleSpellCheckCallback()
+      .ForceInvocationForTesting();
 
   textcheck.KickGrammar();
   ASSERT_EQ(1U, document->Markers().Markers().size());
@@ -11883,6 +11844,10 @@
 
   WebLocalFrame* LocalMainFrame() { return web_view_helper_->LocalMainFrame(); }
 
+  LocalFrameView* LocalFrameView() {
+    return web_view_helper_->LocalMainFrame()->GetFrameView();
+  }
+
   WebViewImpl* WebView() { return web_view_helper_->WebView(); }
 
   size_t ContentLayerCount() {
@@ -11911,8 +11876,7 @@
 
  private:
   PaintArtifactCompositor* paint_artifact_compositor() {
-    auto* frame_view = web_view_helper_->LocalMainFrame()->GetFrameView();
-    return frame_view->GetPaintArtifactCompositorForTesting();
+    return LocalFrameView()->GetPaintArtifactCompositorForTesting();
   }
   FrameTestHelpers::TestWebViewClient web_view_client_;
   std::unique_ptr<FrameTestHelpers::WebViewHelper> web_view_helper_;
@@ -11979,4 +11943,32 @@
   EXPECT_EQ(ScrollHitTestLayerCount(), 0u);
 }
 
+TEST_P(SlimmingPaintWebFrameTest, FrameViewScroll) {
+  DCHECK(RuntimeEnabledFeatures::SlimmingPaintV2Enabled());
+
+  InitializeWithHTML(*WebView()->MainFrameImpl()->GetFrame(),
+                     "<style>"
+                     "  #forceScroll {"
+                     "    height: 2000px;"
+                     "    width: 100px;"
+                     "  }"
+                     "</style>"
+                     "<div id='forceScroll'></div>");
+
+  WebView()->UpdateAllLifecyclePhases();
+
+  auto* scrollable_area = LocalFrameView()->LayoutViewportScrollableArea();
+  EXPECT_NE(nullptr, scrollable_area);
+
+  EXPECT_EQ(ScrollHitTestLayerCount(), 1u);
+
+  // Ensure a synthetic impl-side scroll offset propagates to the scrollable
+  // area using the DidScroll callback.
+  EXPECT_EQ(ScrollOffset(), scrollable_area->GetScrollOffset());
+  ScrollHitTestLayerAt(0)->SetScrollOffsetFromImplSideForTesting(
+      gfx::ScrollOffset(0, 1));
+  WebView()->UpdateAllLifecyclePhases();
+  EXPECT_EQ(ScrollOffset(0, 1), scrollable_area->GetScrollOffset());
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
index 261821d..e32039e2 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
@@ -2823,7 +2823,8 @@
 
 CompositorElementId LocalFrameView::GetCompositorElementId() const {
   if (!RuntimeEnabledFeatures::RootLayerScrollingEnabled()) {
-    return CompositorElementIdFromUniqueObjectId(unique_id_);
+    return CompositorElementIdFromUniqueObjectId(
+        unique_id_, CompositorElementIdNamespace::kScroll);
   } else {
     return PaintInvalidationCapableScrollableArea::GetCompositorElementId();
   }
@@ -4434,8 +4435,11 @@
 
 ScrollableArea* LocalFrameView::ScrollableAreaWithElementId(
     const CompositorElementId& id) {
-  if (id == GetCompositorElementId())
+  // With root layer scrolling the LocalFrameView does not scroll.
+  if (!RuntimeEnabledFeatures::RootLayerScrollingEnabled() &&
+      id == GetCompositorElementId()) {
     return this;
+  }
   if (scrollable_areas_) {
     // This requires iterating over all scrollable areas. We may want to store a
     // map of ElementId to ScrollableArea if this is an issue for performance.
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
index e9727ed..20dcf40 100644
--- a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
@@ -323,17 +323,6 @@
   }
 }
 
-void HTMLInputElement::BeginEditing() {
-  DCHECK(GetDocument().IsActive());
-  if (!GetDocument().IsActive())
-    return;
-
-  if (!IsTextField())
-    return;
-
-  GetDocument().GetFrame()->GetSpellChecker().DidBeginEditing(this);
-}
-
 void HTMLInputElement::EndEditing() {
   DCHECK(GetDocument().IsActive());
   if (!GetDocument().IsActive())
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.h b/third_party/WebKit/Source/core/html/HTMLInputElement.h
index 3382d2c..832a91ce 100644
--- a/third_party/WebKit/Source/core/html/HTMLInputElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLInputElement.h
@@ -258,7 +258,6 @@
 
   const AtomicString& GetName() const final;
 
-  void BeginEditing();
   void EndEditing();
 
   static Vector<FileChooserFileInfo> FilesFromFileInputFormControlState(
diff --git a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
index a3cab53a..4e495f2 100644
--- a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
@@ -37,7 +37,6 @@
 #include "core/dom/events/Event.h"
 #include "core/editing/FrameSelection.h"
 #include "core/editing/iterators/TextIterator.h"
-#include "core/editing/spellcheck/SpellChecker.h"
 #include "core/events/BeforeTextInsertedEvent.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/UseCounter.h"
@@ -269,11 +268,6 @@
   TextControlElement::DefaultEventHandler(event);
 }
 
-void HTMLTextAreaElement::HandleFocusEvent(Element*, WebFocusType) {
-  if (LocalFrame* frame = GetDocument().GetFrame())
-    frame->GetSpellChecker().DidBeginEditing(this);
-}
-
 void HTMLTextAreaElement::SubtreeHasChanged() {
 #if DCHECK_IS_ON()
   // The innerEditor should have either Text nodes or a placeholder break
diff --git a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.h b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.h
index 2953a74..505edca 100644
--- a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.h
@@ -101,7 +101,6 @@
   bool IsRequiredFormControl() const override { return IsRequired(); }
 
   void DefaultEventHandler(Event*) override;
-  void HandleFocusEvent(Element* old_focused_node, WebFocusType) override;
 
   void SubtreeHasChanged() override;
 
diff --git a/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp b/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp
index 5298f3e..dfca2b9 100644
--- a/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp
+++ b/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp
@@ -254,7 +254,6 @@
 void TextFieldInputType::HandleFocusEvent(Element* old_focused_node,
                                           WebFocusType focus_type) {
   InputTypeView::HandleFocusEvent(old_focused_node, focus_type);
-  GetElement().BeginEditing();
 }
 
 void TextFieldInputType::HandleBlurEvent() {
diff --git a/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.cpp
index 7c086eb..188b4916 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.cpp
@@ -13,6 +13,7 @@
 #include "core/page/Page.h"
 #include "platform/geometry/DoubleRect.h"
 #include "platform/graphics/Color.h"
+#include "platform/scheduler/renderer/web_view_scheduler.h"
 #include "platform/wtf/Time.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebFloatPoint.h"
@@ -42,9 +43,7 @@
 InspectorEmulationAgent::InspectorEmulationAgent(
     WebLocalFrameImpl* web_local_frame_impl,
     Client* client)
-    : web_local_frame_(web_local_frame_impl),
-      client_(client),
-      virtual_time_observer_registered_(false) {}
+    : web_local_frame_(web_local_frame_impl), client_(client) {}
 
 InspectorEmulationAgent::~InspectorEmulationAgent() {}
 
@@ -80,10 +79,6 @@
   setEmulatedMedia(String());
   setCPUThrottlingRate(1);
   setDefaultBackgroundColorOverride(Maybe<protocol::DOM::RGBA>());
-  if (virtual_time_observer_registered_) {
-    web_local_frame_->View()->Scheduler()->RemoveVirtualTimeObserver(this);
-    virtual_time_observer_registered_ = false;
-  }
   return Response::OK();
 }
 
@@ -144,10 +139,6 @@
         WebViewScheduler::VirtualTimePolicy::DETERMINISTIC_LOADING);
   }
   web_local_frame_->View()->Scheduler()->EnableVirtualTime();
-  if (!virtual_time_observer_registered_) {
-    web_local_frame_->View()->Scheduler()->AddVirtualTimeObserver(this);
-    virtual_time_observer_registered_ = true;
-  }
 
   if (budget.isJust()) {
     WTF::TimeDelta budget_amount =
@@ -166,11 +157,6 @@
   GetFrontend()->virtualTimeBudgetExpired();
 }
 
-void InspectorEmulationAgent::OnVirtualTimePaused(
-    WTF::TimeDelta virtual_time_offset) {
-  GetFrontend()->virtualTimePaused(virtual_time_offset.InMilliseconds());
-}
-
 Response InspectorEmulationAgent::setDefaultBackgroundColorOverride(
     Maybe<protocol::DOM::RGBA> color) {
   if (!color.isJust()) {
diff --git a/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.h b/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.h
index 830a7c7a..3504843 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorEmulationAgent.h
@@ -8,8 +8,6 @@
 #include "core/CoreExport.h"
 #include "core/inspector/InspectorBaseAgent.h"
 #include "core/inspector/protocol/Emulation.h"
-#include "platform/scheduler/renderer/web_view_scheduler.h"
-#include "platform/wtf/Time.h"
 
 namespace blink {
 
@@ -23,8 +21,7 @@
 }  // namespace protocol
 
 class CORE_EXPORT InspectorEmulationAgent final
-    : public InspectorBaseAgent<protocol::Emulation::Metainfo>,
-      public WebViewScheduler::VirtualTimeObserver {
+    : public InspectorBaseAgent<protocol::Emulation::Metainfo> {
   WTF_MAKE_NONCOPYABLE(InspectorEmulationAgent);
 
  public:
@@ -57,9 +54,6 @@
   protocol::Response disable() override;
   void Restore() override;
 
-  // scheduler::WebViewScheduler::VirtualTimeObserver implementation.
-  void OnVirtualTimePaused(WTF::TimeDelta virtual_time_offset) override;
-
   DECLARE_VIRTUAL_TRACE();
 
  private:
@@ -69,7 +63,6 @@
 
   Member<WebLocalFrameImpl> web_local_frame_;
   Client* client_;
-  bool virtual_time_observer_registered_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/browser_protocol.json b/third_party/WebKit/Source/core/inspector/browser_protocol.json
index 243ca2d..7550fa6 100644
--- a/third_party/WebKit/Source/core/inspector/browser_protocol.json
+++ b/third_party/WebKit/Source/core/inspector/browser_protocol.json
@@ -1094,15 +1094,7 @@
             {
                 "name": "virtualTimeBudgetExpired",
                 "experimental": true,
-                "description": "Notification sent after the virtual time budget for the current VirtualTimePolicy has run out."
-            },
-            {
-                "name": "virtualTimePaused",
-                "experimental": true,
-                "parameters": [
-                    { "name": "virtualTimeElapsed", "type": "integer", "description": "The amount of virtual time that has elapsed in milliseconds since virtual time was first enabled." }
-                ],
-                "description": "Notification sent after the virtual time has paused."
+                "description": "Notification sent after the virual time budget for the current VirtualTimePolicy has run out."
             }
         ]
     },
diff --git a/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json b/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json
index 73ffa93..cd0917e 100644
--- a/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json
+++ b/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json
@@ -91,7 +91,7 @@
                 "domain": "Emulation",
                 "include": ["forceViewport", "resetViewport", "resetPageScaleFactor", "setPageScaleFactor", "setScriptExecutionDisabled", "setTouchEmulationEnabled",
                             "setEmulatedMedia", "setCPUThrottlingRate", "setVirtualTimePolicy", "setDefaultBackgroundColorOverride"],
-                "include_events": ["virtualTimeBudgetExpired", "virtualTimePaused"]
+                "include_events": ["virtualTimeBudgetExpired"]
             },
             {
                 "domain": "Network",
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 73381a9..7022d5c 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -106,12 +106,18 @@
                               : AlignSelfForChild(child, style);
 }
 
-StyleSelfAlignmentData LayoutGrid::DefaultAlignmentForChild(
+StyleSelfAlignmentData LayoutGrid::DefaultAlignment(
     GridAxis axis,
     const ComputedStyle& style) const {
-  return axis == kGridRowAxis
-             ? style.ResolvedJustifyItems(SelfAlignmentNormalBehavior(this))
-             : style.ResolvedAlignItems(SelfAlignmentNormalBehavior(this));
+  return axis == kGridRowAxis ? style.ResolvedJustifyItems(kItemPositionNormal)
+                              : style.ResolvedAlignItems(kItemPositionNormal);
+}
+
+bool LayoutGrid::DefaultAlignmentIsStretchOrNormal(
+    GridAxis axis,
+    const ComputedStyle& style) const {
+  ItemPosition alignment = DefaultAlignment(axis, style).GetPosition();
+  return alignment == kItemPositionStretch || alignment == kItemPositionNormal;
 }
 
 bool LayoutGrid::SelfAlignmentChangedSize(GridAxis axis,
@@ -130,12 +136,10 @@
     GridAxis axis,
     const ComputedStyle& old_style,
     const ComputedStyle& new_style) const {
-  return DefaultAlignmentForChild(axis, old_style).GetPosition() ==
-                 kItemPositionStretch
-             ? DefaultAlignmentForChild(axis, new_style).GetPosition() !=
-                   kItemPositionStretch
-             : DefaultAlignmentForChild(axis, new_style).GetPosition() ==
-                   kItemPositionStretch;
+  return DefaultAlignmentIsStretchOrNormal(axis, old_style)
+             ? DefaultAlignment(axis, old_style).GetPosition() !=
+                   DefaultAlignment(axis, new_style).GetPosition()
+             : DefaultAlignmentIsStretchOrNormal(axis, new_style);
 }
 
 void LayoutGrid::StyleDidChange(StyleDifference diff,
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.h b/third_party/WebKit/Source/core/layout/LayoutGrid.h
index fe4303a..da21e8f79 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.h
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.h
@@ -228,8 +228,8 @@
       GridAxis,
       const LayoutBox& child,
       const ComputedStyle* = nullptr) const;
-  StyleSelfAlignmentData DefaultAlignmentForChild(GridAxis,
-                                                  const ComputedStyle&) const;
+  StyleSelfAlignmentData DefaultAlignment(GridAxis, const ComputedStyle&) const;
+  bool DefaultAlignmentIsStretchOrNormal(GridAxis, const ComputedStyle&) const;
   void ApplyStretchAlignmentToChildIfNeeded(LayoutBox&);
   bool HasAutoSizeInColumnAxis(const LayoutBox& child) const {
     return IsHorizontalWritingMode() ? child.StyleRef().Height().IsAuto()
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.cc
index 7c06eb5f..42324fe 100644
--- a/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.cc
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.cc
@@ -9,6 +9,10 @@
 namespace blink {
 
 LayoutUnit NGMarginStrut::Sum() const {
+  return std::max(quirky_positive_margin, positive_margin) + negative_margin;
+}
+
+LayoutUnit NGMarginStrut::QuirkyContainerSum() const {
   return positive_margin + negative_margin;
 }
 
@@ -19,13 +23,20 @@
   if (value < 0) {
     negative_margin = std::min(value, negative_margin);
   } else {
-    positive_margin = std::max(value, positive_margin);
+    if (is_quirky) {
+      DCHECK(value >= 0);
+
+      quirky_positive_margin = std::max(value, quirky_positive_margin);
+    } else {
+      positive_margin = std::max(value, positive_margin);
+    }
   }
 }
 
 bool NGMarginStrut::operator==(const NGMarginStrut& other) const {
   return positive_margin == other.positive_margin &&
          negative_margin == other.negative_margin &&
+         quirky_positive_margin == other.quirky_positive_margin &&
          is_quirky_container_start == other.is_quirky_container_start;
 }
 
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.h
index 8532288..16def25 100644
--- a/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.h
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_margin_strut.h
@@ -15,6 +15,11 @@
   LayoutUnit positive_margin;
   LayoutUnit negative_margin;
 
+  // Store quirky margins separately, quirky containers need to ignore
+  // quirky end margins.  Quirky margins are always default margins,
+  // which are always positive.
+  LayoutUnit quirky_positive_margin;
+
   // If this flag is set, we only Append non-quirky margins to this strut.
   // See comment inside NGBlockLayoutAlgorithm for when this occurs.
   bool is_quirky_container_start = false;
@@ -25,6 +30,10 @@
   // Sum up negative and positive margins of this strut.
   LayoutUnit Sum() const;
 
+  // Sum up non-quirky margins of this strut, used by quirky
+  // containers to sum up the last margin.
+  LayoutUnit QuirkyContainerSum() const;
+
   bool operator==(const NGMarginStrut& other) const;
   bool operator!=(const NGMarginStrut& other) const {
     return !(*this == other);
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_physical_text_fragment.h b/third_party/WebKit/Source/core/layout/ng/inline/ng_physical_text_fragment.h
index e34ccf5..496aa30 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_physical_text_fragment.h
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_physical_text_fragment.h
@@ -8,7 +8,9 @@
 #include "core/CoreExport.h"
 #include "core/layout/ng/inline/ng_text_end_effect.h"
 #include "core/layout/ng/ng_physical_fragment.h"
+#include "platform/fonts/NGTextFragmentPaintInfo.h"
 #include "platform/fonts/shaping/ShapeResult.h"
+#include "platform/wtf/text/StringView.h"
 
 namespace blink {
 
@@ -85,6 +87,11 @@
         size_, LineOrientation(), EndEffect(), shape_result_));
   }
 
+  NGTextFragmentPaintInfo PaintInfo() const {
+    return NGTextFragmentPaintInfo{Text(), StartOffset(), EndOffset(),
+                                   TextShapeResult()};
+  }
+
  private:
   // The text of NGInlineNode; i.e., of a parent block. The text for this
   // fragment is a substring(start_offset_, end_offset_) of this string.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
index 502dceb..6ec541db 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
@@ -246,19 +246,6 @@
 
   NGMarginStrut input_margin_strut = ConstraintSpace().MarginStrut();
 
-  // If this node is a quirky container, (we are in quirks mode and either a
-  // table cell or body), we set our margin strut to a mode where it only
-  // considers non-quirky margins. E.g.
-  // <body>
-  //   <p></p>
-  //   <div style="margin-top: 10px"></div>
-  //   <h1>Hello</h1>
-  // </body>
-  // In the above example <p>'s & <h1>'s margins are ignored as they are
-  // quirky, and we only consider <div>'s 10px margin.
-  if (node_.IsQuirkyContainer())
-    input_margin_strut.is_quirky_container_start = true;
-
   LayoutUnit input_bfc_block_offset =
       ConstraintSpace().BfcOffset().block_offset;
 
@@ -280,6 +267,19 @@
     input_margin_strut = NGMarginStrut();
   }
 
+  // If this node is a quirky container, (we are in quirks mode and either a
+  // table cell or body), we set our margin strut to a mode where it only
+  // considers non-quirky margins. E.g.
+  // <body>
+  //   <p></p>
+  //   <div style="margin-top: 10px"></div>
+  //   <h1>Hello</h1>
+  // </body>
+  // In the above example <p>'s & <h1>'s margins are ignored as they are
+  // quirky, and we only consider <div>'s 10px margin.
+  if (node_.IsQuirkyContainer())
+    input_margin_strut.is_quirky_container_start = true;
+
   // If a new formatting context hits the margin collapsing if-branch above
   // then the BFC offset is still {} as the margin strut from the constraint
   // space must also be empty.
@@ -335,12 +335,17 @@
   if (border_scrollbar_padding_.block_end ||
       previous_inflow_position.empty_block_affected_by_clearance ||
       ConstraintSpace().IsNewFormattingContext()) {
-    // TODO(ikilpatrick): If we are a quirky container and our last child had a
-    // quirky block end margin, we need to use the margin strut without the
-    // quirky margin appended. - http://jsbin.com/yizinagupo/edit?html,output
+    // If we are a quirky container, we ignore any quirky margins and
+    // just consider normal margins to extend our size.  Other UAs
+    // perform this calculation differently, e.g. by just ignoring the
+    // *last* quirky margin.
+    // TODO: revisit previous implementation to avoid changing behavior and
+    // https://html.spec.whatwg.org/multipage/rendering.html#margin-collapsing-quirks
     content_size_ =
         std::max(content_size_, previous_inflow_position.logical_block_offset +
-                                    end_margin_strut.Sum());
+                                    (node_.IsQuirkyContainer()
+                                         ? end_margin_strut.QuirkyContainerSum()
+                                         : end_margin_strut.Sum()));
     end_margin_strut = NGMarginStrut();
   }
 
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
index 61c21fe..4472ad5b 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -89,9 +89,7 @@
     bool user_scrollable_vertical,
     MainThreadScrollingReasons main_thread_scrolling_reasons) {
   DCHECK(!RuntimeEnabledFeatures::RootLayerScrollingEnabled());
-  auto element_id = CompositorElementIdFromUniqueObjectId(
-      frame_view.GetLayoutView()->UniqueId(),
-      CompositorElementIdNamespace::kScroll);
+  auto element_id = frame_view.GetCompositorElementId();
   if (auto* existing_scroll = frame_view.ScrollNode()) {
     auto existing_reasons = existing_scroll->GetMainThreadScrollingReasons();
     existing_scroll->Update(
@@ -263,11 +261,11 @@
   return false;
 }
 
-void PaintPropertyTreeBuilder::UpdatePaintOffsetTranslation(
-    const LayoutBoxModelObject& object,
+Optional<IntPoint> PaintPropertyTreeBuilder::UpdateForPaintOffsetTranslation(
+    const LayoutObject& object,
     PaintPropertyTreeBuilderFragmentContext& context,
-    ObjectPaintProperties& properties,
-    bool& force_subtree_update) {
+    ObjectPaintProperties& properties) {
+  Optional<IntPoint> paint_offset_translation;
   if (NeedsPaintOffsetTranslation(object) &&
       // As an optimization, skip these paint offset translation nodes when
       // the offset is an identity. An exception is the layout view because root
@@ -282,10 +280,9 @@
     // called "subpixel accumulation". For more information, see
     // PaintLayer::subpixelAccumulation() and
     // PaintLayerPainter::paintFragmentByApplyingTransform.
-    IntPoint rounded_paint_offset =
-        RoundedIntPoint(context.current.paint_offset);
+    paint_offset_translation = RoundedIntPoint(context.current.paint_offset);
     LayoutPoint fractional_paint_offset =
-        LayoutPoint(context.current.paint_offset - rounded_paint_offset);
+        LayoutPoint(context.current.paint_offset - *paint_offset_translation);
     if (fractional_paint_offset != LayoutPoint()) {
       // If the object has a non-translation transform, discard the fractional
       // paint offset which can't be transformed by the transform.
@@ -298,23 +295,37 @@
         fractional_paint_offset = LayoutPoint();
     }
 
+    context.current.paint_offset = fractional_paint_offset;
+    if (RuntimeEnabledFeatures::RootLayerScrollingEnabled() &&
+        object.IsLayoutView()) {
+      context.absolute_position.paint_offset = fractional_paint_offset;
+      context.fixed_position.paint_offset = fractional_paint_offset;
+    }
+  }
+  return paint_offset_translation;
+}
+
+void PaintPropertyTreeBuilder::UpdatePaintOffsetTranslation(
+    const LayoutObject& object,
+    const Optional<IntPoint>& paint_offset_translation,
+    PaintPropertyTreeBuilderFragmentContext& context,
+    ObjectPaintProperties& properties,
+    bool& force_subtree_update) {
+  if (paint_offset_translation) {
     auto result = properties.UpdatePaintOffsetTranslation(
         context.current.transform,
-        TransformationMatrix().Translate(rounded_paint_offset.X(),
-                                         rounded_paint_offset.Y()),
+        TransformationMatrix().Translate(paint_offset_translation->X(),
+                                         paint_offset_translation->Y()),
         FloatPoint3D(), context.current.should_flatten_inherited_transform,
         context.current.rendering_context_id);
-    force_subtree_update |= result.NewNodeCreated();
-
     context.current.transform = properties.PaintOffsetTranslation();
-    context.current.paint_offset = fractional_paint_offset;
     if (RuntimeEnabledFeatures::RootLayerScrollingEnabled() &&
         object.IsLayoutView()) {
       context.absolute_position.transform = properties.PaintOffsetTranslation();
       context.fixed_position.transform = properties.PaintOffsetTranslation();
-      context.absolute_position.paint_offset = fractional_paint_offset;
-      context.fixed_position.paint_offset = fractional_paint_offset;
     }
+
+    force_subtree_update |= result.NewNodeCreated();
   } else {
     force_subtree_update |= properties.ClearPaintOffsetTranslation();
   }
@@ -1186,7 +1197,8 @@
     ObjectPaintProperties* paint_properties,
     bool& is_actually_needed,
     PaintPropertyTreeBuilderFragmentContext& context,
-    bool& force_subtree_update) {
+    bool& force_subtree_update,
+    Optional<IntPoint>& paint_offset_translation) {
 #if DCHECK_IS_ON()
   FindPaintOffsetNeedingUpdateScope check_scope(object, is_actually_needed);
 #endif
@@ -1195,8 +1207,8 @@
     UpdatePaintOffset(ToLayoutBoxModelObject(object), context,
                       container_for_absolute_position);
     if (paint_properties) {
-      UpdatePaintOffsetTranslation(ToLayoutBoxModelObject(object), context,
-                                   *paint_properties, force_subtree_update);
+      paint_offset_translation =
+          UpdateForPaintOffsetTranslation(object, context, *paint_properties);
     }
   }
 
@@ -1290,11 +1302,21 @@
 #endif
   // This is not in FindObjectPropertiesNeedingUpdateScope because paint offset
   // can change without needsPaintPropertyUpdate.
+  Optional<IntPoint> paint_offset_translation;
   UpdateForObjectLocationAndSize(
       object, full_context.container_for_absolute_position,
       object.FirstFragment() ? object.FirstFragment()->PaintProperties()
                              : nullptr,
-      is_actually_needed, context, full_context.force_subtree_update);
+      is_actually_needed, context, full_context.force_subtree_update,
+      paint_offset_translation);
+
+  if (object.FirstFragment() && object.FirstFragment()->PaintProperties()) {
+    ObjectPaintProperties* properties =
+        object.GetMutableForPainting().FirstFragment()->PaintProperties();
+    UpdatePaintOffsetTranslation(object, paint_offset_translation, context,
+                                 *properties,
+                                 full_context.force_subtree_update);
+  }
 
 #if DCHECK_IS_ON()
   FindObjectPropertiesNeedingUpdateScope check_needs_update_scope(
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
index 0f68693..87b18d2 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
@@ -10,6 +10,7 @@
 #include "platform/graphics/paint/EffectPaintPropertyNode.h"
 #include "platform/graphics/paint/ScrollPaintPropertyNode.h"
 #include "platform/graphics/paint/TransformPaintPropertyNode.h"
+#include "platform/wtf/Optional.h"
 #include "platform/wtf/RefPtr.h"
 
 namespace blink {
@@ -144,8 +145,16 @@
       const LayoutBoxModelObject&,
       PaintPropertyTreeBuilderFragmentContext&,
       const LayoutObject* container_for_absolute_position);
+  // Decides whether there should be a paint offset translation transform,
+  // and if so updates paint offset as appropriate and returns the translation
+  // offset.
+  ALWAYS_INLINE static Optional<IntPoint> UpdateForPaintOffsetTranslation(
+      const LayoutObject&,
+      PaintPropertyTreeBuilderFragmentContext&,
+      ObjectPaintProperties&);
   ALWAYS_INLINE static void UpdatePaintOffsetTranslation(
-      const LayoutBoxModelObject&,
+      const LayoutObject&,
+      const Optional<IntPoint>& paint_offset_translation,
       PaintPropertyTreeBuilderFragmentContext&,
       ObjectPaintProperties&,
       bool& force_subtree_update);
@@ -155,7 +164,8 @@
       ObjectPaintProperties*,
       bool& is_actually_needed,
       PaintPropertyTreeBuilderFragmentContext&,
-      bool& force_subtree_update);
+      bool& force_subtree_update,
+      Optional<IntPoint>& paint_offset_translation);
   ALWAYS_INLINE static void UpdateTransform(
       const LayoutObject&,
       ObjectPaintProperties&,
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
index 578d00d..f7b487b37 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
@@ -23,11 +23,12 @@
 const TransformPaintPropertyNode*
 PaintPropertyTreeBuilderTest::FramePreTranslation() {
   LocalFrameView* frame_view = GetDocument().View();
-  if (RuntimeEnabledFeatures::RootLayerScrollingEnabled())
+  if (RuntimeEnabledFeatures::RootLayerScrollingEnabled()) {
     return frame_view->GetLayoutView()
         ->FirstFragment()
         ->PaintProperties()
         ->PaintOffsetTranslation();
+  }
   return frame_view->PreTranslation();
 }
 
@@ -273,7 +274,6 @@
   frame_view->UpdateAllLifecyclePhases();
   EXPECT_EQ(TransformationMatrix(), FramePreTranslation()->Matrix());
   EXPECT_TRUE(FramePreTranslation()->Parent()->IsRoot());
-
   EXPECT_EQ(TransformationMatrix().Translate(0, -100),
             FrameScrollTranslation()->Matrix());
   EXPECT_EQ(FramePreTranslation(), FrameScrollTranslation()->Parent());
@@ -705,7 +705,6 @@
       "    </text>"
       "  </g>"
       "</svg>");
-  LOG(ERROR) << "here";
   LayoutObject* group_with_opacity =
       GetLayoutObjectByElementId("groupWithOpacity");
   const ObjectPaintProperties* group_with_opacity_properties =
diff --git a/third_party/WebKit/Source/core/paint/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/paint/compositing/CompositedLayerMapping.cpp
index 57622a1e..0a2dc6f 100644
--- a/third_party/WebKit/Source/core/paint/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/paint/compositing/CompositedLayerMapping.cpp
@@ -2432,9 +2432,7 @@
           CreateGraphicsLayer(kCompositingReasonLayerForScrollingContents);
       scrolling_contents_layer_->SetShouldHitTest(true);
 
-      CompositorElementId element_id = CompositorElementIdFromUniqueObjectId(
-          owning_layer_.GetLayoutObject().UniqueId(),
-          CompositorElementIdNamespace::kScroll);
+      auto element_id = scrollable_area->GetCompositorElementId();
       scrolling_contents_layer_->SetElementId(element_id);
 
       scrolling_layer_->AddChild(scrolling_contents_layer_.get());
diff --git a/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.cpp
index 7e72c4e..8ae0b46 100644
--- a/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.cpp
+++ b/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.cpp
@@ -1211,7 +1211,7 @@
     }
 
     // In RLS mode, LayoutView scrolling contents layer gets this element ID (in
-    // CompositedLayerMapping::updateElementIdAndCompositorMutableProperties).
+    // CompositedLayerMapping::UpdateScrollingLayers).
     if (!RuntimeEnabledFeatures::RootLayerScrollingEnabled()) {
       scroll_layer_->SetElementId(
           layout_view_.GetFrameView()->GetCompositorElementId());
diff --git a/third_party/WebKit/Source/core/paint/ng/ng_text_painter.cc b/third_party/WebKit/Source/core/paint/ng/ng_text_painter.cc
index e5c191b8..68c18d8 100644
--- a/third_party/WebKit/Source/core/paint/ng/ng_text_painter.cc
+++ b/third_party/WebKit/Source/core/paint/ng/ng_text_painter.cc
@@ -13,6 +13,7 @@
 #include "core/style/ComputedStyle.h"
 #include "core/style/ShadowList.h"
 #include "platform/fonts/Font.h"
+#include "platform/fonts/NGTextFragmentPaintInfo.h"
 #include "platform/graphics/GraphicsContext.h"
 #include "platform/graphics/GraphicsContextStateSaver.h"
 #include "platform/wtf/Assertions.h"
@@ -34,7 +35,7 @@
 
 template <NGTextPainter::PaintInternalStep step>
 void NGTextPainter::PaintInternalFragment(
-    TextFragmentPaintInfo& fragment_paint_info,
+    NGTextFragmentPaintInfo& fragment_paint_info,
     unsigned from,
     unsigned to) {
   DCHECK(from <= fragment_paint_info.text.length());
@@ -62,10 +63,7 @@
   if (!fragment_.TextShapeResult())
     return;
 
-  unsigned offset = 0;
-  TextFragmentPaintInfo fragment_paint_info = {
-      fragment_.Text(), TextDirection::kLtr, offset, fragment_.Text().length(),
-      fragment_.TextShapeResult()};
+  NGTextFragmentPaintInfo fragment_paint_info = fragment_.PaintInfo();
 
   if (start_offset <= end_offset) {
     PaintInternalFragment<Step>(fragment_paint_info, start_offset, end_offset);
@@ -83,7 +81,19 @@
 
 void NGTextPainter::ClipDecorationsStripe(float upper,
                                           float stripe_width,
-                                          float dilation) {}
+                                          float dilation) {
+  if (!fragment_.Length())
+    return;
+
+  NGTextFragmentPaintInfo fragment_paint_info = fragment_.PaintInfo();
+  Vector<Font::TextIntercept> text_intercepts;
+  font_.GetTextIntercepts(
+      fragment_paint_info, graphics_context_.DeviceScaleFactor(),
+      graphics_context_.FillFlags(),
+      std::make_tuple(upper, upper + stripe_width), text_intercepts);
+
+  DecorationsStripeIntercepts(upper, stripe_width, dilation, text_intercepts);
+}
 
 void NGTextPainter::PaintEmphasisMarkForCombinedText() {}
 
diff --git a/third_party/WebKit/Source/core/paint/ng/ng_text_painter.h b/third_party/WebKit/Source/core/paint/ng/ng_text_painter.h
index 17efb4aa..8ed8e7f5 100644
--- a/third_party/WebKit/Source/core/paint/ng/ng_text_painter.h
+++ b/third_party/WebKit/Source/core/paint/ng/ng_text_painter.h
@@ -11,7 +11,7 @@
 namespace blink {
 
 class NGPhysicalTextFragment;
-struct TextFragmentPaintInfo;
+struct NGTextFragmentPaintInfo;
 
 // Text painter for LayoutNG, logic shared between legacy layout and LayoutNG
 // is implemented in the TextPainterBase base class.
@@ -50,7 +50,7 @@
 
  private:
   template <PaintInternalStep step>
-  void PaintInternalFragment(TextFragmentPaintInfo&,
+  void PaintInternalFragment(NGTextFragmentPaintInfo&,
                              unsigned from,
                              unsigned to);
 
diff --git a/third_party/WebKit/Source/core/resize_observer/OWNERS b/third_party/WebKit/Source/core/resize_observer/OWNERS
new file mode 100644
index 0000000..4dd1b292
--- /dev/null
+++ b/third_party/WebKit/Source/core/resize_observer/OWNERS
@@ -0,0 +1,4 @@
+atotic@chromium.org
+
+# TEAM: layout-dev@chromium.org
+# COMPONENT: Blink>Layout
diff --git a/third_party/WebKit/Source/core/svg/SVGLengthContext.cpp b/third_party/WebKit/Source/core/svg/SVGLengthContext.cpp
index 79b828d1..0bbde9eb 100644
--- a/third_party/WebKit/Source/core/svg/SVGLengthContext.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGLengthContext.cpp
@@ -285,6 +285,9 @@
     case CSSPrimitiveValue::UnitType::kMillimeters:
       user_units = value * kCssPixelsPerMillimeter;
       break;
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+      user_units = value * kCssPixelsPerQuarterMillimeter;
+      break;
     case CSSPrimitiveValue::UnitType::kInches:
       user_units = value * kCssPixelsPerInch;
       break;
@@ -352,6 +355,8 @@
       return value / kCssPixelsPerCentimeter;
     case CSSPrimitiveValue::UnitType::kMillimeters:
       return value / kCssPixelsPerMillimeter;
+    case CSSPrimitiveValue::UnitType::kQuarterMillimeters:
+      return value / kCssPixelsPerQuarterMillimeter;
     case CSSPrimitiveValue::UnitType::kInches:
       return value / kCssPixelsPerInch;
     case CSSPrimitiveValue::UnitType::kPoints:
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
index f1058e4e..551b23da 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
@@ -1969,9 +1969,9 @@
   return blink::VisiblePositionForIndex(node_index + offset, parent);
 }
 
-void AXLayoutObject::SetSelection(const AXRange& selection) {
+bool AXLayoutObject::OnNativeSetSelectionAction(const AXRange& selection) {
   if (!GetLayoutObject() || !selection.IsValid())
-    return;
+    return false;
 
   AXObject* anchor_object =
       selection.anchor_object ? selection.anchor_object.Get() : this;
@@ -1980,7 +1980,7 @@
 
   if (!IsValidSelectionBound(anchor_object) ||
       !IsValidSelectionBound(focus_object)) {
-    return;
+    return false;
   }
 
   // The selection offsets are offsets into the accessible value.
@@ -1998,12 +1998,12 @@
                                       selection.anchor_offset,
                                       kSelectionHasBackwardDirection);
     }
-    return;
+    return true;
   }
 
   LocalFrame* frame = GetLayoutObject()->GetFrame();
   if (!frame || !frame->Selection().IsAvailable())
-    return;
+    return false;
 
   // TODO(editing-dev): Use of updateStyleAndLayoutIgnorePendingStylesheets
   // needs to be audited.  see http://crbug.com/590369 for more details.
@@ -2018,13 +2018,14 @@
   VisiblePosition focus_visible_position =
       ToVisiblePosition(focus_object, selection.focus_offset);
   if (anchor_visible_position.IsNull() || focus_visible_position.IsNull())
-    return;
+    return false;
 
   frame->Selection().SetSelection(
       SelectionInDOMTree::Builder()
           .Collapse(anchor_visible_position.ToPositionWithAffinity())
           .Extend(focus_visible_position.DeepEquivalent())
           .Build());
+  return true;
 }
 
 bool AXLayoutObject::IsValidSelectionBound(const AXObject* bound_object) const {
@@ -2035,19 +2036,26 @@
          &bound_object->AxObjectCache() == &AxObjectCache();
 }
 
-void AXLayoutObject::SetValue(const String& string) {
+bool AXLayoutObject::OnNativeSetValueAction(const String& string) {
   if (!GetNode() || !GetNode()->IsElementNode())
-    return;
+    return false;
   if (!layout_object_ || !layout_object_->IsBoxModelObject())
-    return;
+    return false;
 
   LayoutBoxModelObject* layout_object = ToLayoutBoxModelObject(layout_object_);
-  if (layout_object->IsTextField() && isHTMLInputElement(*GetNode()))
+  if (layout_object->IsTextField() && isHTMLInputElement(*GetNode())) {
     toHTMLInputElement(*GetNode())
         .setValue(string, kDispatchInputAndChangeEvent);
-  else if (layout_object->IsTextArea() && isHTMLTextAreaElement(*GetNode()))
+    return true;
+  }
+
+  if (layout_object->IsTextArea() && isHTMLTextAreaElement(*GetNode())) {
     toHTMLTextAreaElement(*GetNode())
         .setValue(string, kDispatchInputAndChangeEvent);
+    return true;
+  }
+
+  return false;
 }
 
 //
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h
index 171672e..85e2dfc 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h
@@ -140,11 +140,13 @@
                          AXRelatedObjectVector*,
                          NameSources*) const override;
 
-  // Methods that retrieve or manipulate the current selection.
+  // Modify or take an action on an object.
+  bool OnNativeSetSelectionAction(const AXRange&) override;
+  bool OnNativeSetValueAction(const String&) override;
 
+  // Methods that retrieve or manipulate the current selection.
   AXRange Selection() const override;
   AXRange SelectionUnderObject() const override;
-  void SetSelection(const AXRange&) override;
 
   // Hit testing.
   AXObject* AccessibilityHitTest(const IntPoint&) const override;
@@ -175,8 +177,6 @@
   LocalFrameView* DocumentFrameView() const override;
   Element* AnchorElement() const override;
 
-  void SetValue(const String&) override;
-
   // Notifications that this object may have changed.
   void HandleActiveDescendantChanged() override;
   void HandleAriaExpandedChanged() override;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp
index bd0ae00..bb2e373 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp
@@ -136,19 +136,20 @@
   return text_alternative;
 }
 
-void AXListBoxOption::SetSelected(bool selected) {
+bool AXListBoxOption::OnNativeSetSelectedAction(bool selected) {
   HTMLSelectElement* select_element = ListBoxOptionParentNode();
   if (!select_element)
-    return;
+    return false;
 
   if (!CanSetSelectedAttribute())
-    return;
+    return false;
 
   bool is_option_selected = IsSelected();
   if ((is_option_selected && selected) || (!is_option_selected && !selected))
-    return;
+    return false;
 
   select_element->SelectOptionByAccessKey(toHTMLOptionElement(GetNode()));
+  return true;
 }
 
 HTMLSelectElement* AXListBoxOption::ListBoxOptionParentNode() const {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h
index fe29685..77ddc4d2 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.h
@@ -52,7 +52,7 @@
   AccessibilityRole DetermineAccessibilityRole() final;
   bool IsSelected() const override;
   bool IsSelectedOptionActive() const override;
-  void SetSelected(bool) override;
+  bool OnNativeSetSelectedAction(bool) override;
 
   String TextAlternative(bool recursive,
                          bool in_aria_labelled_by_traversal,
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp b/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp
index af728ec..240a30f 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp
@@ -48,7 +48,7 @@
   return kPopUpButtonRole;
 }
 
-bool AXMenuList::Press() {
+bool AXMenuList::OnNativeClickAction() {
   if (!layout_object_)
     return false;
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuList.h b/third_party/WebKit/Source/modules/accessibility/AXMenuList.h
index e9285d3..3d23c4843 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuList.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuList.h
@@ -41,7 +41,7 @@
 
   bool IsCollapsed() const override;
   AccessibilityExpanded IsExpanded() const final;
-  bool Press() override;
+  bool OnNativeClickAction() override;
   void ClearChildren() override;
 
   void DidUpdateActiveOption(int option_index);
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp
index 44b23cb1..7378afab 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp
@@ -119,11 +119,12 @@
   return element_ && element_->Selected();
 }
 
-void AXMenuListOption::SetSelected(bool b) {
+bool AXMenuListOption::OnNativeSetSelectedAction(bool b) {
   if (!element_ || !CanSetSelectedAttribute())
-    return;
+    return false;
 
   element_->SetSelected(b);
+  return true;
 }
 
 bool AXMenuListOption::ComputeAccessibilityIsIgnored(
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h
index 07512b2b..c5135fd 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h
@@ -61,7 +61,7 @@
   bool IsVisible() const override;
   bool IsOffScreen() const override;
   bool IsSelected() const override;
-  void SetSelected(bool) override;
+  bool OnNativeSetSelectedAction(bool) override;
 
   void GetRelativeBounds(AXObject** out_container,
                          FloatRect& out_bounds_in_container,
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp b/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp
index 41effbaf..bca7bbf 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp
@@ -81,12 +81,11 @@
   return html_select_element->selectedIndex();
 }
 
-bool AXMenuListPopup::Press() {
+bool AXMenuListPopup::OnNativeClickAction() {
   if (!parent_)
     return false;
 
-  parent_->Press();
-  return true;
+  return parent_->OnNativeClickAction();
 }
 
 void AXMenuListPopup::AddChildren() {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.h b/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.h
index d57e5870..6252ef7 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.h
@@ -59,7 +59,7 @@
   AccessibilityRole RoleValue() const override { return kMenuListPopupRole; }
 
   bool IsVisible() const override;
-  bool Press() override;
+  bool OnNativeClickAction() override;
   void AddChildren() override;
   bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
index 8648838..4f745aa 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -341,7 +341,7 @@
 
   value += increase ? step : -step;
 
-  SetValue(String::Number(value));
+  OnNativeSetValueAction(String::Number(value));
   AxObjectCache().PostNotification(GetNode(),
                                    AXObjectCacheImpl::kAXValueChanged);
 }
@@ -2545,50 +2545,57 @@
   return Traversal<HTMLLabelElement>::FirstAncestorOrSelf(*GetNode());
 }
 
-void AXNodeObject::SetFocused(bool on) {
+bool AXNodeObject::OnNativeFocusAction() {
   if (!CanSetFocusAttribute())
-    return;
+    return false;
 
-  Document* document = this->GetDocument();
-  if (!on) {
+  Document* document = GetDocument();
+  if (IsWebArea()) {
     document->ClearFocusedElement();
-  } else {
-    Node* node = this->GetNode();
-    if (node && node->IsElementNode()) {
-      // If this node is already the currently focused node, then calling
-      // focus() won't do anything.  That is a problem when focus is removed
-      // from the webpage to chrome, and then returns.  In these cases, we need
-      // to do what keyboard and mouse focus do, which is reset focus first.
-      if (document->FocusedElement() == node)
-        document->ClearFocusedElement();
-
-      ToElement(node)->focus();
-    } else {
-      document->ClearFocusedElement();
-    }
+    return true;
   }
+
+  Element* element = GetElement();
+  if (!element) {
+    document->ClearFocusedElement();
+    return true;
+  }
+
+  // If this node is already the currently focused node, then calling
+  // focus() won't do anything.  That is a problem when focus is removed
+  // from the webpage to chrome, and then returns.  In these cases, we need
+  // to do what keyboard and mouse focus do, which is reset focus first.
+  if (document->FocusedElement() == element)
+    document->ClearFocusedElement();
+
+  element->focus();
+  return true;
 }
 
-void AXNodeObject::Increment() {
+bool AXNodeObject::OnNativeIncrementAction() {
   LocalFrame* frame = GetDocument() ? GetDocument()->GetFrame() : nullptr;
   std::unique_ptr<UserGestureIndicator> gesture_indicator =
       LocalFrame::CreateUserGesture(frame, UserGestureToken::kNewGesture);
   AlterSliderValue(true);
+  return true;
 }
 
-void AXNodeObject::Decrement() {
+bool AXNodeObject::OnNativeDecrementAction() {
   LocalFrame* frame = GetDocument() ? GetDocument()->GetFrame() : nullptr;
   std::unique_ptr<UserGestureIndicator> gesture_indicator =
       LocalFrame::CreateUserGesture(frame, UserGestureToken::kNewGesture);
   AlterSliderValue(false);
+  return true;
 }
 
-void AXNodeObject::SetSequentialFocusNavigationStartingPoint() {
+bool AXNodeObject::OnNativeSetSequentialFocusNavigationStartingPointAction() {
   if (!GetNode())
-    return;
+    return false;
 
-  GetNode()->GetDocument().ClearFocusedElement();
-  GetNode()->GetDocument().SetSequentialFocusNavigationStartingPoint(GetNode());
+  Document* document = GetDocument();
+  document->ClearFocusedElement();
+  document->SetSequentialFocusNavigationStartingPoint(GetNode());
+  return true;
 }
 
 void AXNodeObject::ChildrenChanged() {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h
index 5e3d831..c8c8110 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h
@@ -204,10 +204,10 @@
   Node* GetNode() const override { return node_; }
 
   // Modify or take an action on an object.
-  void SetFocused(bool) final;
-  void Increment() final;
-  void Decrement() final;
-  void SetSequentialFocusNavigationStartingPoint() final;
+  bool OnNativeFocusAction() final;
+  bool OnNativeIncrementAction() final;
+  bool OnNativeDecrementAction() final;
+  bool OnNativeSetSequentialFocusNavigationStartingPointAction() final;
 
   // Notifications that this object may have changed.
   void ChildrenChanged() override;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
index a525d30..70e5931 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
@@ -42,6 +42,8 @@
 #include "core/html/HTMLFrameOwnerElement.h"
 #include "core/html/HTMLInputElement.h"
 #include "core/html/parser/HTMLParserIdioms.h"
+#include "core/input/ContextMenuAllowedScope.h"
+#include "core/input/EventHandler.h"
 #include "core/layout/LayoutBoxModelObject.h"
 #include "core/layout/LayoutView.h"
 #include "core/page/Page.h"
@@ -1796,11 +1798,30 @@
 // Modify or take an action on an object.
 //
 
-bool AXObject::PerformDefaultAction() {
-  return Press();
+bool AXObject::RequestDecrementAction() {
+  Element* element = GetElement();
+  if (element) {
+    Event* event = Event::CreateCancelable(EventTypeNames::accessibledecrement);
+    if (DispatchEventToAOMEventListeners(*event, element)) {
+      return true;
+    }
+  }
+
+  return OnNativeDecrementAction();
 }
 
-bool AXObject::Press() {
+bool AXObject::RequestClickAction() {
+  Element* element = GetElement();
+  if (element) {
+    Event* event = Event::CreateCancelable(EventTypeNames::accessibleclick);
+    if (DispatchEventToAOMEventListeners(*event, element))
+      return true;
+  }
+
+  return OnNativeClickAction();
+}
+
+bool AXObject::OnNativeClickAction() {
   Document* document = GetDocument();
   if (!document)
     return false;
@@ -1809,29 +1830,93 @@
       LocalFrame::CreateUserGesture(document->GetFrame(),
                                     UserGestureToken::kNewGesture);
   Element* action_elem = ActionElement();
-  Event* event = Event::CreateCancelable(EventTypeNames::accessibleclick);
-  if (DispatchEventToAOMEventListeners(*event, action_elem)) {
-    return true;
-  }
-
   if (action_elem) {
     action_elem->AccessKeyAction(true);
     return true;
   }
 
-  if (CanSetFocusAttribute()) {
-    SetFocused(true);
-    return true;
-  }
+  if (CanSetFocusAttribute())
+    return OnNativeFocusAction();
 
   return false;
 }
 
-void AXObject::ScrollToMakeVisible() const {
+bool AXObject::RequestFocusAction() {
+  Element* element = GetElement();
+  if (element) {
+    Event* event = Event::CreateCancelable(EventTypeNames::accessiblefocus);
+    if (DispatchEventToAOMEventListeners(*event, element))
+      return true;
+  }
+
+  return OnNativeFocusAction();
+}
+
+bool AXObject::RequestIncrementAction() {
+  Element* element = GetElement();
+  if (element) {
+    Event* event = Event::CreateCancelable(EventTypeNames::accessibleincrement);
+    if (DispatchEventToAOMEventListeners(*event, element))
+      return true;
+  }
+
+  return OnNativeIncrementAction();
+}
+
+bool AXObject::RequestScrollToGlobalPointAction(const IntPoint& point) {
+  return OnNativeScrollToGlobalPointAction(point);
+}
+
+bool AXObject::RequestScrollToMakeVisibleAction() {
+  Element* element = GetElement();
+  if (element) {
+    Event* event =
+        Event::CreateCancelable(EventTypeNames::accessiblescrollintoview);
+    if (DispatchEventToAOMEventListeners(*event, element))
+      return true;
+  }
+
+  return OnNativeScrollToMakeVisibleAction();
+}
+
+bool AXObject::RequestScrollToMakeVisibleWithSubFocusAction(
+    const IntRect& subfocus) {
+  return OnNativeScrollToMakeVisibleWithSubFocusAction(subfocus);
+}
+
+bool AXObject::RequestSetSelectedAction(bool selected) {
+  return OnNativeSetSelectedAction(selected);
+}
+
+bool AXObject::RequestSetSelectionAction(const AXRange& range) {
+  return OnNativeSetSelectionAction(range);
+}
+
+bool AXObject::RequestSetSequentialFocusNavigationStartingPointAction() {
+  return OnNativeSetSequentialFocusNavigationStartingPointAction();
+}
+
+bool AXObject::RequestSetValueAction(const String& value) {
+  return OnNativeSetValueAction(value);
+}
+
+bool AXObject::RequestShowContextMenuAction() {
+  Element* element = GetElement();
+  if (element) {
+    Event* event =
+        Event::CreateCancelable(EventTypeNames::accessiblecontextmenu);
+    if (DispatchEventToAOMEventListeners(*event, element))
+      return true;
+  }
+
+  return OnNativeShowContextMenuAction();
+}
+
+bool AXObject::OnNativeScrollToMakeVisibleAction() const {
   Node* node = GetNode();
   LayoutObject* layout_object = node ? node->GetLayoutObject() : nullptr;
   if (!layout_object || !node->isConnected())
-    return;
+    return false;
   LayoutRect target_rect(layout_object->AbsoluteBoundingBoxRect());
   layout_object->ScrollRectToVisible(
       target_rect, ScrollAlignment::kAlignCenterIfNeeded,
@@ -1841,13 +1926,15 @@
   AxObjectCache().PostNotification(
       AxObjectCache().GetOrCreate(GetDocument()->GetLayoutView()),
       AXObjectCacheImpl::kAXLocationChanged);
+  return true;
 }
 
-void AXObject::ScrollToMakeVisibleWithSubFocus(const IntRect& rect) const {
+bool AXObject::OnNativeScrollToMakeVisibleWithSubFocusAction(
+    const IntRect& rect) const {
   Node* node = GetNode();
   LayoutObject* layout_object = node ? node->GetLayoutObject() : nullptr;
   if (!layout_object || !node->isConnected())
-    return;
+    return false;
   LayoutRect target_rect(
       layout_object->LocalToAbsoluteQuad(FloatQuad(FloatRect(rect)))
           .BoundingBox());
@@ -1865,13 +1952,15 @@
   AxObjectCache().PostNotification(
       AxObjectCache().GetOrCreate(GetDocument()->GetLayoutView()),
       AXObjectCacheImpl::kAXLocationChanged);
+  return true;
 }
 
-void AXObject::ScrollToGlobalPoint(const IntPoint& global_point) const {
+bool AXObject::OnNativeScrollToGlobalPointAction(
+    const IntPoint& global_point) const {
   Node* node = GetNode();
   LayoutObject* layout_object = node ? node->GetLayoutObject() : nullptr;
   if (!layout_object || !node->isConnected())
-    return;
+    return false;
   LayoutRect target_rect(layout_object->AbsoluteBoundingBoxRect());
   target_rect.MoveBy(-global_point);
   layout_object->ScrollRectToVisible(
@@ -1882,13 +1971,57 @@
   AxObjectCache().PostNotification(
       AxObjectCache().GetOrCreate(GetDocument()->GetLayoutView()),
       AXObjectCacheImpl::kAXLocationChanged);
+  return true;
 }
 
-void AXObject::SetSequentialFocusNavigationStartingPoint() {
+bool AXObject::OnNativeSetSequentialFocusNavigationStartingPointAction() {
   // Call it on the nearest ancestor that overrides this with a specific
   // implementation.
-  if (ParentObject())
-    ParentObject()->SetSequentialFocusNavigationStartingPoint();
+  if (ParentObject()) {
+    return ParentObject()
+        ->OnNativeSetSequentialFocusNavigationStartingPointAction();
+  }
+  return false;
+}
+
+bool AXObject::OnNativeDecrementAction() {
+  return false;
+}
+
+bool AXObject::OnNativeFocusAction() {
+  return false;
+}
+
+bool AXObject::OnNativeIncrementAction() {
+  return false;
+}
+
+bool AXObject::OnNativeSetValueAction(const String&) {
+  return false;
+}
+
+bool AXObject::OnNativeSetSelectedAction(bool) {
+  return false;
+}
+
+bool AXObject::OnNativeSetSelectionAction(const AXRange& range) {
+  return false;
+}
+
+bool AXObject::OnNativeShowContextMenuAction() {
+  Element* element = GetElement();
+  if (!element)
+    element = ParentObject() ? ParentObject()->GetElement() : nullptr;
+  if (!element)
+    return false;
+
+  Document* document = GetDocument();
+  if (!document || !document->GetFrame())
+    return false;
+
+  ContextMenuAllowedScope scope;
+  document->GetFrame()->GetEventHandler().ShowNonLocatedContextMenu(element);
+  return true;
 }
 
 void AXObject::NotifyIfIgnoredValueChanged() {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.h b/third_party/WebKit/Source/modules/accessibility/AXObject.h
index c67fd869..11fb399 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXObject.h
@@ -752,7 +752,6 @@
   // current object as the starting point. Returns a null selection if there is
   // no selection in the subtree rooted at this object.
   virtual AXRange SelectionUnderObject() const { return AXRange(); }
-  virtual void SetSelection(const AXRange&) {}
 
   // Scrollable containers.
   bool IsScrollableContainer() const;
@@ -765,24 +764,44 @@
   virtual ScrollableArea* GetScrollableAreaIfScrollable() const { return 0; }
 
   // Modify or take an action on an object.
-  virtual void Increment() {}
-  virtual void Decrement() {}
-  bool PerformDefaultAction();
-  virtual bool Press();
-  // Make this object visible by scrolling as many nested scrollable views as
-  // needed.
-  void ScrollToMakeVisible() const;
-  // Same, but if the whole object can't be made visible, try for this subrect,
-  // in local coordinates.
-  void ScrollToMakeVisibleWithSubFocus(const IntRect&) const;
-  // Scroll this object to a given point in global coordinates of the top-level
-  // window.
-  void ScrollToGlobalPoint(const IntPoint&) const;
-  virtual void SetFocused(bool) {}
-  virtual void SetSelected(bool) {}
-  virtual void SetSequentialFocusNavigationStartingPoint();
-  virtual void SetValue(const String&) {}
-  virtual void SetValue(float) {}
+  //
+  // These are the public interfaces, called from outside of Blink.
+  // Each one first tries to fire an Accessibility Object Model event,
+  // if applicable, and if that isn't handled, falls back on the
+  // native implementation via a virtual member function, below.
+  //
+  // For example, |RequestIncrementAction| fires the AOM event and if
+  // that isn't handled it calls |DoNativeIncrement|.
+  //
+  // These all return true if handled.
+  bool RequestDecrementAction();
+  bool RequestClickAction();
+  bool RequestFocusAction();
+  bool RequestIncrementAction();
+  bool RequestScrollToGlobalPointAction(const IntPoint&);
+  bool RequestScrollToMakeVisibleAction();
+  bool RequestScrollToMakeVisibleWithSubFocusAction(const IntRect&);
+  bool RequestSetSelectedAction(bool);
+  bool RequestSetSelectionAction(const AXRange&);
+  bool RequestSetSequentialFocusNavigationStartingPointAction();
+  bool RequestSetValueAction(const String&);
+  bool RequestShowContextMenuAction();
+
+  // Native implementations of actions that aren't handled by AOM
+  // event listeners. These all return true if handled.
+  virtual bool OnNativeDecrementAction();
+  virtual bool OnNativeClickAction();
+  virtual bool OnNativeFocusAction();
+  virtual bool OnNativeIncrementAction();
+  virtual bool OnNativeScrollToGlobalPointAction(const IntPoint&) const;
+  virtual bool OnNativeScrollToMakeVisibleAction() const;
+  virtual bool OnNativeScrollToMakeVisibleWithSubFocusAction(
+      const IntRect&) const;
+  virtual bool OnNativeSetSelectedAction(bool);
+  virtual bool OnNativeSetSelectionAction(const AXRange&);
+  virtual bool OnNativeSetSequentialFocusNavigationStartingPointAction();
+  virtual bool OnNativeSetValueAction(const String&);
+  virtual bool OnNativeShowContextMenuAction();
 
   // Notifications that this object may have changed.
   virtual void ChildrenChanged() {}
diff --git a/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp b/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp
index 3ce35cba..6c4e6a3a 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp
@@ -110,16 +110,17 @@
   return AxObjectCache().GetOrCreate(layout_object_);
 }
 
-void AXSlider::SetValue(const String& value) {
+bool AXSlider::OnNativeSetValueAction(const String& value) {
   HTMLInputElement* input = GetInputElement();
 
   if (input->value() == value)
-    return;
+    return false;
 
   input->setValue(value, kDispatchInputAndChangeEvent);
 
   // Fire change event manually, as LayoutSlider::setValueForPosition does.
   input->DispatchFormControlChangeEvent();
+  return true;
 }
 
 HTMLInputElement* AXSlider::GetInputElement() const {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXSlider.h b/third_party/WebKit/Source/modules/accessibility/AXSlider.h
index 3068f60..f5cd98a1 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXSlider.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXSlider.h
@@ -57,7 +57,7 @@
 
   void AddChildren() final;
 
-  void SetValue(const String&) final;
+  bool OnNativeSetValueAction(const String&) final;
   AccessibilityOrientation Orientation() const final;
 };
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXSpinButton.cpp b/third_party/WebKit/Source/modules/accessibility/AXSpinButton.cpp
index 1e8e30c..6a24333 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXSpinButton.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXSpinButton.cpp
@@ -128,7 +128,7 @@
   *out_container = ParentObject();
 }
 
-bool AXSpinButtonPart::Press() {
+bool AXSpinButtonPart::OnNativeClickAction() {
   if (!parent_ || !parent_->IsSpinButton())
     return false;
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXSpinButton.h b/third_party/WebKit/Source/modules/accessibility/AXSpinButton.h
index 85fcad8..a440bd9 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXSpinButton.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXSpinButton.h
@@ -70,7 +70,7 @@
   explicit AXSpinButtonPart(AXObjectCacheImpl&);
   bool is_incrementor_ : 1;
 
-  bool Press() override;
+  bool OnNativeClickAction() override;
   AccessibilityRole RoleValue() const override { return kButtonRole; }
   bool IsSpinButtonPart() const override { return true; }
   void GetRelativeBounds(AXObject** out_container,
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp b/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp
index eb55689..63699e6 100644
--- a/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp
+++ b/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp
@@ -250,11 +250,14 @@
   }
 
   if (has_empty_robustness) {
+    // TODO(xhwang): Write a best practice doc explaining details about risks of
+    // using an empty robustness here, and provide the link to the doc in this
+    // message. See http://crbug.com/720013
     resolver_->GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create(
         kJSMessageSource, kWarningMessageLevel,
         "It is recommended that a robustness level be specified. Not "
-        "specifying the robustness level could result in unexpected behavior, "
-        "potentially including failure to play."));
+        "specifying the robustness level could result in unexpected "
+        "behavior."));
   }
 }
 
diff --git a/third_party/WebKit/Source/modules/exported/WebAXObject.cpp b/third_party/WebKit/Source/modules/exported/WebAXObject.cpp
index 89ef94e..01a1dfd 100644
--- a/third_party/WebKit/Source/modules/exported/WebAXObject.cpp
+++ b/third_party/WebKit/Source/modules/exported/WebAXObject.cpp
@@ -179,20 +179,6 @@
   return static_cast<WebAXDefaultActionVerb>(private_->Action());
 }
 
-bool WebAXObject::CanDecrement() const {
-  if (IsDetached())
-    return false;
-
-  return private_->IsSlider();
-}
-
-bool WebAXObject::CanIncrement() const {
-  if (IsDetached())
-    return false;
-
-  return private_->IsSlider();
-}
-
 bool WebAXObject::CanPress() const {
   if (IsDetached())
     return false;
@@ -705,33 +691,25 @@
   return private_->Language();
 }
 
-bool WebAXObject::PerformDefaultAction() const {
+bool WebAXObject::Click() const {
   if (IsDetached())
     return false;
 
-  return private_->PerformDefaultAction();
+  return private_->RequestClickAction();
 }
 
 bool WebAXObject::Increment() const {
   if (IsDetached())
     return false;
 
-  if (CanIncrement()) {
-    private_->Increment();
-    return true;
-  }
-  return false;
+  return private_->RequestIncrementAction();
 }
 
 bool WebAXObject::Decrement() const {
   if (IsDetached())
     return false;
 
-  if (CanDecrement()) {
-    private_->Decrement();
-    return true;
-  }
-  return false;
+  return private_->RequestDecrementAction();
 }
 
 WebAXObject WebAXObject::InPageLinkTarget() const {
@@ -750,13 +728,6 @@
   return static_cast<WebAXOrientation>(private_->Orientation());
 }
 
-bool WebAXObject::Press() const {
-  if (IsDetached())
-    return false;
-
-  return private_->Press();
-}
-
 WebVector<WebAXObject> WebAXObject::RadioButtonsInGroup() const {
   if (IsDetached())
     return WebVector<WebAXObject>();
@@ -802,18 +773,24 @@
   return;
 }
 
-void WebAXObject::SetSelection(const WebAXObject& anchor_object,
+bool WebAXObject::SetSelected(bool selected) const {
+  if (IsDetached())
+    return false;
+
+  return private_->RequestSetSelectedAction(selected);
+}
+
+bool WebAXObject::SetSelection(const WebAXObject& anchor_object,
                                int anchor_offset,
                                const WebAXObject& focus_object,
                                int focus_offset) const {
   if (IsDetached())
-    return;
+    return false;
 
   AXObject::AXRange ax_selection(anchor_object, anchor_offset,
                                  TextAffinity::kUpstream, focus_object,
                                  focus_offset, TextAffinity::kDownstream);
-  private_->SetSelection(ax_selection);
-  return;
+  return private_->RequestSetSelectionAction(ax_selection);
 }
 
 unsigned WebAXObject::SelectionEnd() const {
@@ -863,67 +840,32 @@
   return line_number;
 }
 
-void WebAXObject::SetFocused(bool on) const {
-  if (!IsDetached())
-    private_->SetFocused(on);
+bool WebAXObject::Focus() const {
+  if (IsDetached())
+    return false;
+
+  return private_->RequestFocusAction();
 }
 
-void WebAXObject::SetSelectedTextRange(int selection_start,
-                                       int selection_end) const {
+bool WebAXObject::SetSequentialFocusNavigationStartingPoint() const {
   if (IsDetached())
-    return;
+    return false;
 
-  private_->SetSelection(AXObject::AXRange(selection_start, selection_end));
+  return private_->RequestSetSequentialFocusNavigationStartingPointAction();
 }
 
-void WebAXObject::SetSequentialFocusNavigationStartingPoint() const {
+bool WebAXObject::SetValue(WebString value) const {
   if (IsDetached())
-    return;
+    return false;
 
-  private_->SetSequentialFocusNavigationStartingPoint();
+  return private_->RequestSetValueAction(value);
 }
 
-void WebAXObject::SetValue(WebString value) const {
+bool WebAXObject::ShowContextMenu() const {
   if (IsDetached())
-    return;
+    return false;
 
-  private_->SetValue(value);
-}
-
-void WebAXObject::ShowContextMenu() const {
-  if (IsDetached())
-    return;
-
-  Node* node = private_->GetNode();
-  if (!node)
-    return;
-
-  Element* element = nullptr;
-  if (node->IsElementNode()) {
-    element = ToElement(node);
-  } else if (node->IsDocumentNode()) {
-    element = node->GetDocument().documentElement();
-  } else {
-    node->UpdateDistribution();
-    ContainerNode* parent = FlatTreeTraversal::Parent(*node);
-    if (!parent)
-      return;
-    SECURITY_DCHECK(parent->IsElementNode());
-    element = ToElement(parent);
-  }
-
-  if (!element)
-    return;
-
-  LocalFrame* frame = element->GetDocument().GetFrame();
-  if (!frame)
-    return;
-
-  WebViewImpl* view = WebLocalFrameImpl::FromFrame(frame)->ViewImpl();
-  if (!view)
-    return;
-
-  view->ShowContextMenuForElement(WebElement(element));
+  return private_->RequestShowContextMenuAction();
 }
 
 WebString WebAXObject::StringValue() const {
@@ -1507,20 +1449,26 @@
   bounds_in_container = WebFloatRect(bounds);
 }
 
-void WebAXObject::ScrollToMakeVisible() const {
-  if (!IsDetached())
-    private_->ScrollToMakeVisible();
+bool WebAXObject::ScrollToMakeVisible() const {
+  if (IsDetached())
+    return false;
+
+  return private_->RequestScrollToMakeVisibleAction();
 }
 
-void WebAXObject::ScrollToMakeVisibleWithSubFocus(
+bool WebAXObject::ScrollToMakeVisibleWithSubFocus(
     const WebRect& subfocus) const {
-  if (!IsDetached())
-    private_->ScrollToMakeVisibleWithSubFocus(subfocus);
+  if (IsDetached())
+    return false;
+
+  return private_->RequestScrollToMakeVisibleWithSubFocusAction(subfocus);
 }
 
-void WebAXObject::ScrollToGlobalPoint(const WebPoint& point) const {
-  if (!IsDetached())
-    private_->ScrollToGlobalPoint(point);
+bool WebAXObject::ScrollToGlobalPoint(const WebPoint& point) const {
+  if (IsDetached())
+    return false;
+
+  return private_->RequestScrollToGlobalPointAction(point);
 }
 
 WebAXObject::WebAXObject(AXObject* object) : private_(object) {}
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index 3e1d1a02..0f55f19 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -732,6 +732,7 @@
     "fonts/GenericFontFamilySettings.cpp",
     "fonts/GenericFontFamilySettings.h",
     "fonts/GlyphMetricsMap.h",
+    "fonts/NGTextFragmentPaintInfo.h",
     "fonts/OrientationIterator.cpp",
     "fonts/OrientationIterator.h",
     "fonts/ScriptRunIterator.cpp",
diff --git a/third_party/WebKit/Source/platform/fonts/Font.cpp b/third_party/WebKit/Source/platform/fonts/Font.cpp
index 7f2e899..ed7ea02a 100644
--- a/third_party/WebKit/Source/platform/fonts/Font.cpp
+++ b/third_party/WebKit/Source/platform/fonts/Font.cpp
@@ -31,6 +31,7 @@
 #include "platform/fonts/FontCache.h"
 #include "platform/fonts/FontFallbackIterator.h"
 #include "platform/fonts/FontFallbackList.h"
+#include "platform/fonts/NGTextFragmentPaintInfo.h"
 #include "platform/fonts/SimpleFontData.h"
 #include "platform/fonts/shaping/CachingWordShaper.h"
 #include "platform/fonts/shaping/ShapeResultBloberizer.h"
@@ -148,7 +149,7 @@
 }
 
 bool Font::DrawText(PaintCanvas* canvas,
-                    const TextFragmentPaintInfo& text_info,
+                    const NGTextFragmentPaintInfo& text_info,
                     const FloatPoint& point,
                     float device_scale_factor,
                     const PaintFlags& flags) const {
@@ -244,7 +245,7 @@
 }
 
 void Font::DrawEmphasisMarks(PaintCanvas* canvas,
-                             const TextFragmentPaintInfo& text_info,
+                             const NGTextFragmentPaintInfo& text_info,
                              const AtomicString& mark,
                              const FloatPoint& point,
                              float device_scale_factor,
@@ -258,8 +259,10 @@
     return;
 
   ShapeResultBloberizer bloberizer(*this, device_scale_factor);
+  // TODO(layout-dev): This should either not take a direction argument or we
+  // need to plumb the proper one through. I don't think we need it.
   bloberizer.FillTextEmphasisGlyphs(
-      text_info.text, text_info.direction, text_info.from, text_info.to,
+      text_info.text, TextDirection::kLtr, text_info.from, text_info.to,
       emphasis_glyph_data, text_info.shape_result);
   DrawBlobs(canvas, flags, bloberizer.Blobs(), point);
 }
@@ -338,7 +341,7 @@
   GetTextInterceptsInternal(bloberizer.Blobs(), flags, bounds, intercepts);
 }
 
-void Font::GetTextIntercepts(const TextFragmentPaintInfo& text_info,
+void Font::GetTextIntercepts(const NGTextFragmentPaintInfo& text_info,
                              float device_scale_factor,
                              const PaintFlags& flags,
                              const std::tuple<float, float>& bounds,
diff --git a/third_party/WebKit/Source/platform/fonts/Font.h b/third_party/WebKit/Source/platform/fonts/Font.h
index 3956a59..e155e95 100644
--- a/third_party/WebKit/Source/platform/fonts/Font.h
+++ b/third_party/WebKit/Source/platform/fonts/Font.h
@@ -55,16 +55,7 @@
 class ShapeCache;
 class TextRun;
 struct TextRunPaintInfo;
-
-// Represents text content of a NGPhysicalTextFragment for painting.
-// TODO(eae): Move to a separate file?
-struct PLATFORM_EXPORT TextFragmentPaintInfo {
-  const StringView text;
-  TextDirection direction;
-  unsigned from;
-  unsigned to;
-  const ShapeResult* shape_result;
-};
+struct NGTextFragmentPaintInfo;
 
 class PLATFORM_EXPORT Font {
   DISALLOW_NEW();
@@ -96,7 +87,7 @@
                 float device_scale_factor,
                 const PaintFlags&) const;
   bool DrawText(PaintCanvas*,
-                const TextFragmentPaintInfo&,
+                const NGTextFragmentPaintInfo&,
                 const FloatPoint&,
                 float device_scale_factor,
                 const PaintFlags&) const;
@@ -113,7 +104,7 @@
                          float device_scale_factor,
                          const PaintFlags&) const;
   void DrawEmphasisMarks(PaintCanvas*,
-                         const TextFragmentPaintInfo&,
+                         const NGTextFragmentPaintInfo&,
                          const AtomicString& mark,
                          const FloatPoint&,
                          float device_scale_factor,
@@ -135,7 +126,7 @@
                          const PaintFlags&,
                          const std::tuple<float, float>& bounds,
                          Vector<TextIntercept>&) const;
-  void GetTextIntercepts(const TextFragmentPaintInfo&,
+  void GetTextIntercepts(const NGTextFragmentPaintInfo&,
                          float device_scale_factor,
                          const PaintFlags&,
                          const std::tuple<float, float>& bounds,
diff --git a/third_party/WebKit/Source/platform/fonts/NGTextFragmentPaintInfo.h b/third_party/WebKit/Source/platform/fonts/NGTextFragmentPaintInfo.h
new file mode 100644
index 0000000..0346f487
--- /dev/null
+++ b/third_party/WebKit/Source/platform/fonts/NGTextFragmentPaintInfo.h
@@ -0,0 +1,25 @@
+// 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 NGTextFragmentPaintInfo_h
+#define NGTextFragmentPaintInfo_h
+
+#include "platform/PlatformExport.h"
+#include "platform/wtf/text/StringView.h"
+
+namespace blink {
+
+class ShapeResult;
+
+// Bridge struct for painting text. Encapsulates info needed by the paint code.
+struct PLATFORM_EXPORT NGTextFragmentPaintInfo {
+  const StringView text;
+  unsigned from;
+  unsigned to;
+  const ShapeResult* shape_result;
+};
+
+}  // namespace blink
+
+#endif  // NGTextFragmentPaintInfo_h
diff --git a/third_party/WebKit/Source/platform/geometry/FloatPolygon.cpp b/third_party/WebKit/Source/platform/geometry/FloatPolygon.cpp
index 8e8f2136..bf9387c 100644
--- a/third_party/WebKit/Source/platform/geometry/FloatPolygon.cpp
+++ b/third_party/WebKit/Source/platform/geometry/FloatPolygon.cpp
@@ -28,16 +28,13 @@
  */
 
 #include "platform/geometry/FloatPolygon.h"
+#include "platform/geometry/FloatShapeHelpers.h"
 
 #include <memory>
 #include "platform/wtf/MathExtras.h"
 
 namespace blink {
 
-static inline float Determinant(const FloatSize& a, const FloatSize& b) {
-  return a.Width() * b.Height() - a.Height() * b.Width();
-}
-
 static inline bool AreCollinearPoints(const FloatPoint& p0,
                                       const FloatPoint& p1,
                                       const FloatPoint& p2) {
diff --git a/third_party/WebKit/Source/platform/geometry/FloatQuad.cpp b/third_party/WebKit/Source/platform/geometry/FloatQuad.cpp
index 90197b1..ce2743d 100644
--- a/third_party/WebKit/Source/platform/geometry/FloatQuad.cpp
+++ b/third_party/WebKit/Source/platform/geometry/FloatQuad.cpp
@@ -33,6 +33,7 @@
 #include <algorithm>
 #include <cmath>
 #include <limits>
+#include "platform/geometry/FloatShapeHelpers.h"
 #include "platform/wtf/text/WTFString.h"
 #include "third_party/skia/include/core/SkPoint.h"
 
@@ -50,10 +51,6 @@
   return a.Width() * b.Width() + a.Height() * b.Height();
 }
 
-inline float Determinant(const FloatSize& a, const FloatSize& b) {
-  return a.Width() * b.Height() - a.Height() * b.Width();
-}
-
 inline bool IsPointInTriangle(const FloatPoint& p,
                               const FloatPoint& t1,
                               const FloatPoint& t2,
diff --git a/third_party/WebKit/Source/platform/geometry/FloatShapeHelpers.h b/third_party/WebKit/Source/platform/geometry/FloatShapeHelpers.h
new file mode 100644
index 0000000..1a38983
--- /dev/null
+++ b/third_party/WebKit/Source/platform/geometry/FloatShapeHelpers.h
@@ -0,0 +1,18 @@
+// 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 FloatShapeHelpers_h
+#define FloatShapeHelpers_h
+
+// Code that is useful for both FloatPolygon and FloatQuad.
+
+#include "platform/geometry/FloatSize.h"
+
+namespace blink {
+inline float Determinant(const FloatSize& a, const FloatSize& b) {
+  return a.Width() * b.Height() - a.Height() * b.Width();
+}
+}  // namespace blink
+
+#endif  // FloatShapeHelpers_h
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
index e7e7397..55e6d410 100644
--- a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
+++ b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
@@ -365,12 +365,12 @@
   return decoder_ && decoder_->FrameIsReceivedAtIndex(index);
 }
 
-float BitmapImage::FrameDurationAtIndex(size_t index) const {
+TimeDelta BitmapImage::FrameDurationAtIndex(size_t index) const {
   if (index < frames_.size() && frames_[index].have_metadata_)
     return frames_[index].duration_;
 
   if (!decoder_)
-    return 0.f;
+    return TimeDelta();
   return decoder_->FrameDurationAtIndex(index);
 }
 
@@ -488,7 +488,10 @@
   // Determine time for next frame to start.  By ignoring paint and timer lag
   // in this calculation, we make the animation appear to run at its desired
   // rate regardless of how fast it's being repainted.
-  const double current_duration = FrameDurationAtIndex(current_frame_index_);
+  // TODO(vmpstr): This function can probably deal in TimeTicks/TimeDelta
+  // instead.
+  const double current_duration =
+      FrameDurationAtIndex(current_frame_index_).InSecondsF();
   desired_frame_start_time_ += current_duration;
 
   // When an animated image is more than five minutes out of date, the
@@ -528,8 +531,11 @@
          FrameIsReceivedAtIndex(frame_after_next);
          frame_after_next = (next_frame + 1) % FrameCount()) {
       // Should we skip the next frame?
+      // TODO(vmpstr): This function can probably deal in TimeTicks/TimeDelta
+      // instead.
       double frame_after_next_start_time =
-          desired_frame_start_time_ + FrameDurationAtIndex(next_frame);
+          desired_frame_start_time_ +
+          FrameDurationAtIndex(next_frame).InSecondsF();
       if (time < frame_after_next_start_time)
         break;
 
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImage.h b/third_party/WebKit/Source/platform/graphics/BitmapImage.h
index e7bbe39..a6060aaf 100644
--- a/third_party/WebKit/Source/platform/graphics/BitmapImage.h
+++ b/third_party/WebKit/Source/platform/graphics/BitmapImage.h
@@ -39,6 +39,7 @@
 #include "platform/graphics/ImageOrientation.h"
 #include "platform/image-decoders/ImageAnimation.h"
 #include "platform/wtf/Forward.h"
+#include "platform/wtf/Time.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
 namespace blink {
@@ -119,7 +120,7 @@
   PaintImage FrameAtIndex(size_t);
 
   bool FrameIsReceivedAtIndex(size_t) const;
-  float FrameDurationAtIndex(size_t) const;
+  TimeDelta FrameDurationAtIndex(size_t) const;
   bool FrameHasAlphaAtIndex(size_t);
   ImageOrientation FrameOrientationAtIndex(size_t);
 
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
index 54133682..b73d44e 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
@@ -45,11 +45,10 @@
  public:
   DeferredFrameData()
       : orientation_(kDefaultImageOrientation),
-        duration_(0),
         is_received_(false) {}
 
   ImageOrientation orientation_;
-  float duration_;
+  TimeDelta duration_;
   bool is_received_;
 };
 
@@ -126,8 +125,7 @@
   std::vector<FrameMetadata> frames(frame_data_.size());
   for (size_t i = 0; i < frame_data_.size(); ++i) {
     frames[i].complete = frame_data_[i].is_received_;
-    frames[i].duration =
-        base::TimeDelta::FromMillisecondsD(frame_data_[i].duration_);
+    frames[i].duration = frame_data_[i].duration_;
   }
 
   auto generator = DecodingImageGenerator::Create(
@@ -231,21 +229,21 @@
   return false;
 }
 
-float DeferredImageDecoder::FrameDurationAtIndex(size_t index) const {
-  float duration_ms = 0.f;
+TimeDelta DeferredImageDecoder::FrameDurationAtIndex(size_t index) const {
+  TimeDelta duration;
   if (metadata_decoder_)
-    duration_ms = metadata_decoder_->FrameDurationAtIndex(index);
+    duration = metadata_decoder_->FrameDurationAtIndex(index);
   if (index < frame_data_.size())
-    duration_ms = frame_data_[index].duration_;
+    duration = frame_data_[index].duration_;
 
   // Many annoying ads specify a 0 duration to make an image flash as quickly as
   // possible. We follow Firefox's behavior and use a duration of 100 ms for any
   // frames that specify a duration of <= 10 ms. See <rdar://problem/7689300>
   // and <http://webkit.org/b/36082> for more information.
-  const float duration_sec = duration_ms / 1000.f;
-  if (duration_sec < 0.011f)
-    return 0.100f;
-  return duration_sec;
+  if (duration <= TimeDelta::FromMilliseconds(10))
+    duration = TimeDelta::FromMilliseconds(100);
+
+  return duration;
 }
 
 ImageOrientation DeferredImageDecoder::OrientationAtIndex(size_t index) const {
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
index a513e59..4f2914d 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
@@ -33,6 +33,7 @@
 #include "platform/image-decoders/ImageDecoder.h"
 #include "platform/wtf/Allocator.h"
 #include "platform/wtf/Forward.h"
+#include "platform/wtf/Time.h"
 #include "platform/wtf/Vector.h"
 #include "third_party/skia/include/core/SkRWBuffer.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
@@ -74,9 +75,7 @@
   void ClearCacheExceptFrame(size_t index);
   bool FrameHasAlphaAtIndex(size_t index) const;
   bool FrameIsReceivedAtIndex(size_t index) const;
-  // Duration is reported in seconds.
-  // TODO(vmpstr): Use something like TimeDelta here.
-  float FrameDurationAtIndex(size_t index) const;
+  TimeDelta FrameDurationAtIndex(size_t index) const;
   ImageOrientation OrientationAtIndex(size_t index) const;
   bool HotSpot(IntPoint&) const;
 
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp
index a1c1af9e1..a0550a0 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp
@@ -96,7 +96,7 @@
     decode_request_count_ = 0;
     repetition_count_ = kAnimationNone;
     status_ = ImageFrame::kFrameComplete;
-    frame_duration_ = 0;
+    frame_duration_ = TimeDelta();
     decoded_size_ = actual_decoder_->Size();
   }
 
@@ -112,7 +112,7 @@
 
   ImageFrame::Status GetStatus(size_t index) override { return status_; }
 
-  float FrameDuration() const override { return frame_duration_; }
+  TimeDelta FrameDuration() const override { return frame_duration_; }
 
   IntSize DecodedSize() const override { return decoded_size_; }
 
@@ -156,7 +156,7 @@
   size_t frame_count_;
   int repetition_count_;
   ImageFrame::Status status_;
-  float frame_duration_;
+  TimeDelta frame_duration_;
   IntSize decoded_size_;
 };
 
@@ -253,19 +253,19 @@
 TEST_F(DeferredImageDecoderTest, multiFrameImageLoading) {
   repetition_count_ = 10;
   frame_count_ = 1;
-  frame_duration_ = 10;
+  frame_duration_ = TimeDelta::FromMilliseconds(10);
   status_ = ImageFrame::kFramePartial;
   lazy_decoder_->SetData(data_, false);
 
   PaintImage image = CreatePaintImageAtIndex(0);
   ASSERT_TRUE(image);
   EXPECT_FALSE(lazy_decoder_->FrameIsReceivedAtIndex(0));
-  // Anything below .011f seconds is rounded to 0.1f seconds.
-  // See the implementaiton for details.
-  EXPECT_FLOAT_EQ(0.1f, lazy_decoder_->FrameDurationAtIndex(0));
+  // Anything <= 10ms is clamped to 100ms. See the implementaiton for details.
+  EXPECT_EQ(TimeDelta::FromMilliseconds(100),
+            lazy_decoder_->FrameDurationAtIndex(0));
 
   frame_count_ = 2;
-  frame_duration_ = 20;
+  frame_duration_ = TimeDelta::FromMilliseconds(20);
   status_ = ImageFrame::kFrameComplete;
   data_->Append(" ", 1u);
   lazy_decoder_->SetData(data_, false);
@@ -274,20 +274,24 @@
   ASSERT_TRUE(image);
   EXPECT_TRUE(lazy_decoder_->FrameIsReceivedAtIndex(0));
   EXPECT_TRUE(lazy_decoder_->FrameIsReceivedAtIndex(1));
-  EXPECT_FLOAT_EQ(0.02f, lazy_decoder_->FrameDurationAtIndex(1));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(20),
+            lazy_decoder_->FrameDurationAtIndex(1));
   EXPECT_TRUE(actual_decoder_);
 
   frame_count_ = 3;
-  frame_duration_ = 30;
+  frame_duration_ = TimeDelta::FromMilliseconds(30);
   status_ = ImageFrame::kFrameComplete;
   lazy_decoder_->SetData(data_, true);
   EXPECT_FALSE(actual_decoder_);
   EXPECT_TRUE(lazy_decoder_->FrameIsReceivedAtIndex(0));
   EXPECT_TRUE(lazy_decoder_->FrameIsReceivedAtIndex(1));
   EXPECT_TRUE(lazy_decoder_->FrameIsReceivedAtIndex(2));
-  EXPECT_FLOAT_EQ(0.1f, lazy_decoder_->FrameDurationAtIndex(0));
-  EXPECT_FLOAT_EQ(0.02f, lazy_decoder_->FrameDurationAtIndex(1));
-  EXPECT_FLOAT_EQ(0.03f, lazy_decoder_->FrameDurationAtIndex(2));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(100),
+            lazy_decoder_->FrameDurationAtIndex(0));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(20),
+            lazy_decoder_->FrameDurationAtIndex(1));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(30),
+            lazy_decoder_->FrameDurationAtIndex(2));
   EXPECT_EQ(10, lazy_decoder_->RepetitionCount());
 }
 
@@ -387,7 +391,7 @@
 
 TEST_F(MultiFrameDeferredImageDecoderTest, PaintImage) {
   frame_count_ = 2;
-  frame_duration_ = 10;
+  frame_duration_ = TimeDelta::FromMilliseconds(10);
   last_complete_frame_ = 0u;
   lazy_decoder_->SetData(data_, false);
 
@@ -397,10 +401,8 @@
   EXPECT_EQ(image.GetFrameMetadata().size(), 2u);
   EXPECT_TRUE(image.GetFrameMetadata()[0].complete);
   EXPECT_FALSE(image.GetFrameMetadata()[1].complete);
-  EXPECT_EQ(image.GetFrameMetadata()[0].duration,
-            base::TimeDelta::FromMillisecondsD(frame_duration_));
-  EXPECT_EQ(image.GetFrameMetadata()[1].duration,
-            base::TimeDelta::FromMillisecondsD(frame_duration_));
+  EXPECT_EQ(image.GetFrameMetadata()[0].duration, frame_duration_);
+  EXPECT_EQ(image.GetFrameMetadata()[1].duration, frame_duration_);
 
   auto frame0_key = image.GetKeyForFrame(0);
   auto frame1_key = image.GetKeyForFrame(1);
diff --git a/third_party/WebKit/Source/platform/graphics/FrameData.cpp b/third_party/WebKit/Source/platform/graphics/FrameData.cpp
index 4defa2e..be5b6b0 100644
--- a/third_party/WebKit/Source/platform/graphics/FrameData.cpp
+++ b/third_party/WebKit/Source/platform/graphics/FrameData.cpp
@@ -31,7 +31,6 @@
 
 FrameData::FrameData()
     : orientation_(kDefaultImageOrientation),
-      duration_(0),
       have_metadata_(false),
       is_complete_(false),
       has_alpha_(true),
diff --git a/third_party/WebKit/Source/platform/graphics/FrameData.h b/third_party/WebKit/Source/platform/graphics/FrameData.h
index 1fafe718..f1be7fd 100644
--- a/third_party/WebKit/Source/platform/graphics/FrameData.h
+++ b/third_party/WebKit/Source/platform/graphics/FrameData.h
@@ -33,6 +33,7 @@
 #include "platform/wtf/Allocator.h"
 #include "platform/wtf/Noncopyable.h"
 #include "platform/wtf/RefPtr.h"
+#include "platform/wtf/Time.h"
 #include "platform/wtf/VectorTraits.h"
 
 namespace blink {
@@ -50,7 +51,7 @@
   void Clear(bool clear_metadata);
 
   ImageOrientation orientation_;
-  float duration_;
+  TimeDelta duration_;
   bool have_metadata_ : 1;
   bool is_complete_ : 1;
   bool has_alpha_ : 1;
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
index 3e0958e..f495dfb 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
@@ -669,7 +669,7 @@
 }
 
 void GraphicsContext::DrawText(const Font& font,
-                               const TextFragmentPaintInfo& text_info,
+                               const NGTextFragmentPaintInfo& text_info,
                                const FloatPoint& point,
                                const PaintFlags& flags) {
   DrawTextInternal(font, text_info, point, flags);
@@ -715,7 +715,7 @@
 }
 
 void GraphicsContext::DrawText(const Font& font,
-                               const TextFragmentPaintInfo& text_info,
+                               const NGTextFragmentPaintInfo& text_info,
                                const FloatPoint& point) {
   DrawTextInternal(font, text_info, point);
 }
@@ -743,10 +743,11 @@
   DrawEmphasisMarksInternal(font, text_info, mark, point);
 }
 
-void GraphicsContext::DrawEmphasisMarks(const Font& font,
-                                        const TextFragmentPaintInfo& text_info,
-                                        const AtomicString& mark,
-                                        const FloatPoint& point) {
+void GraphicsContext::DrawEmphasisMarks(
+    const Font& font,
+    const NGTextFragmentPaintInfo& text_info,
+    const AtomicString& mark,
+    const FloatPoint& point) {
   DrawEmphasisMarksInternal(font, text_info, mark, point);
 }
 
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.h b/third_party/WebKit/Source/platform/graphics/GraphicsContext.h
index 6cd467b..d8a8bd9 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.h
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.h
@@ -253,14 +253,14 @@
                 SkClipOp = SkClipOp::kIntersect);
 
   void DrawText(const Font&, const TextRunPaintInfo&, const FloatPoint&);
-  void DrawText(const Font&, const TextFragmentPaintInfo&, const FloatPoint&);
+  void DrawText(const Font&, const NGTextFragmentPaintInfo&, const FloatPoint&);
 
   void DrawText(const Font&,
                 const TextRunPaintInfo&,
                 const FloatPoint&,
                 const PaintFlags&);
   void DrawText(const Font&,
-                const TextFragmentPaintInfo&,
+                const NGTextFragmentPaintInfo&,
                 const FloatPoint&,
                 const PaintFlags&);
 
@@ -269,7 +269,7 @@
                          const AtomicString& mark,
                          const FloatPoint&);
   void DrawEmphasisMarks(const Font&,
-                         const TextFragmentPaintInfo&,
+                         const NGTextFragmentPaintInfo&,
                          const AtomicString& mark,
                          const FloatPoint&);
 
diff --git a/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp
index dfd8a54..c501c18 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp
@@ -57,7 +57,7 @@
 
   size_t FrameCount() override { return 1; }
   int RepetitionCount() const override { return kAnimationNone; }
-  float FrameDuration() const override { return 0; }
+  TimeDelta FrameDuration() const override { return TimeDelta(); }
 
  protected:
   void EvictOneCache() {
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
index 034e8e8..54c571b 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
@@ -95,7 +95,7 @@
   int RepetitionCount() const override {
     return frame_count_ == 1 ? kAnimationNone : kAnimationLoopOnce;
   }
-  float FrameDuration() const override { return 0; }
+  TimeDelta FrameDuration() const override { return TimeDelta(); }
 
  protected:
   void UseMockImageDecoderFactory() {
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp
index 6e7b6d0..7747bc64 100644
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp
@@ -835,7 +835,9 @@
 
   auto* scroll_layer = ScrollHitTestLayerAt(0);
   EXPECT_TRUE(scroll_layer->scrollable());
-  // The scroll layer should be sized to the container bounds beca
+  // The scroll layer should be sized to the container bounds.
+  // TODO(pdr): The container bounds will not include scrollbars but the scroll
+  // layer should extend below scrollbars.
   EXPECT_EQ(gfx::Size(11, 13), scroll_layer->bounds());
   EXPECT_EQ(gfx::Vector2dF(3, 5), scroll_layer->offset_to_transform_parent());
   EXPECT_EQ(scroll_layer->scroll_tree_index(), scroll_node.id);
diff --git a/third_party/WebKit/Source/platform/graphics/test/MockImageDecoder.h b/third_party/WebKit/Source/platform/graphics/test/MockImageDecoder.h
index 9d52953..71776391 100644
--- a/third_party/WebKit/Source/platform/graphics/test/MockImageDecoder.h
+++ b/third_party/WebKit/Source/platform/graphics/test/MockImageDecoder.h
@@ -40,7 +40,7 @@
   virtual ImageFrame::Status GetStatus(size_t index) = 0;
   virtual size_t FrameCount() = 0;
   virtual int RepetitionCount() const = 0;
-  virtual float FrameDuration() const = 0;
+  virtual TimeDelta FrameDuration() const = 0;
   virtual void ClearCacheExceptFrameRequested(size_t){};
   virtual void MemoryAllocatorSet() {}
 
@@ -88,7 +88,7 @@
     return client_->GetStatus(index) == ImageFrame::kFrameComplete;
   }
 
-  float FrameDurationAtIndex(size_t) const override {
+  TimeDelta FrameDurationAtIndex(size_t) const override {
     return client_->FrameDuration();
   }
 
diff --git a/third_party/WebKit/Source/platform/heap/CallbackStack.cpp b/third_party/WebKit/Source/platform/heap/CallbackStack.cpp
index f609ae6..55c0f9a 100644
--- a/third_party/WebKit/Source/platform/heap/CallbackStack.cpp
+++ b/third_party/WebKit/Source/platform/heap/CallbackStack.cpp
@@ -22,7 +22,7 @@
   free_list_next_[kPooledBlockCount - 1] = -1;
   pooled_memory_ = static_cast<CallbackStack::Item*>(
       WTF::AllocPages(nullptr, kBlockBytes * kPooledBlockCount,
-                      WTF::kPageAllocationGranularity, WTF::PageAccessible));
+                      WTF::kPageAllocationGranularity, WTF::PageReadWrite));
   CHECK(pooled_memory_);
 }
 
diff --git a/third_party/WebKit/Source/platform/heap/PageMemory.cpp b/third_party/WebKit/Source/platform/heap/PageMemory.cpp
index a01f32d..8bacf490 100644
--- a/third_party/WebKit/Source/platform/heap/PageMemory.cpp
+++ b/third_party/WebKit/Source/platform/heap/PageMemory.cpp
@@ -17,14 +17,14 @@
 }
 
 bool MemoryRegion::Commit() {
-  WTF::RecommitSystemPages(base_, size_);
-  return WTF::SetSystemPagesAccessible(base_, size_);
+  CHECK(WTF::RecommitSystemPages(base_, size_, WTF::PageReadWrite));
+  return WTF::SetSystemPagesAccess(base_, size_, WTF::PageReadWrite);
 }
 
 void MemoryRegion::Decommit() {
   ASAN_UNPOISON_MEMORY_REGION(base_, size_);
   WTF::DecommitSystemPages(base_, size_);
-  WTF::SetSystemPagesInaccessible(base_, size_);
+  CHECK(WTF::SetSystemPagesAccess(base_, size_, WTF::PageInaccessible));
 }
 
 PageMemoryRegion::PageMemoryRegion(Address base,
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h
index 11ec9c4..d713a2a 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h
@@ -37,6 +37,7 @@
 #include "platform/image-decoders/SegmentReader.h"
 #include "platform/wtf/Assertions.h"
 #include "platform/wtf/RefPtr.h"
+#include "platform/wtf/Time.h"
 #include "platform/wtf/Vector.h"
 #include "platform/wtf/text/WTFString.h"
 #include "public/platform/Platform.h"
@@ -197,9 +198,9 @@
   // Returns true if a cached complete decode is available.
   bool FrameIsDecodedAtIndex(size_t) const;
 
-  // Duration for displaying a frame in milliseconds. This method is only used
-  // by animated images.
-  virtual float FrameDurationAtIndex(size_t) const { return 0; }
+  // Duration for displaying a frame. This method is only used by animated
+  // images.
+  virtual TimeDelta FrameDurationAtIndex(size_t) const { return TimeDelta(); }
 
   // Number of bytes in the decoded frame. Returns 0 if the decoder doesn't
   // have this frame cached (either because it hasn't been decoded, or because
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageFrame.cpp b/third_party/WebKit/Source/platform/image-decoders/ImageFrame.cpp
index d5cb62b..f7330361 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageFrame.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageFrame.cpp
@@ -36,7 +36,6 @@
     : allocator_(0),
       has_alpha_(true),
       status_(kFrameEmpty),
-      duration_(0),
       disposal_method_(kDisposeNotSpecified),
       alpha_blend_source_(kBlendAtopPreviousFrame),
       premultiply_alpha_(true),
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h b/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h
index 286b7dcb..2af8752 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h
@@ -31,6 +31,7 @@
 #include "platform/geometry/IntRect.h"
 #include "platform/wtf/Allocator.h"
 #include "platform/wtf/Assertions.h"
+#include "platform/wtf/Time.h"
 #include "public/platform/WebVector.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColorPriv.h"
@@ -127,7 +128,7 @@
   bool HasAlpha() const;
   const IntRect& OriginalFrameRect() const { return original_frame_rect_; }
   Status GetStatus() const { return status_; }
-  unsigned Duration() const { return duration_; }
+  TimeDelta Duration() const { return duration_; }
   DisposalMethod GetDisposalMethod() const { return disposal_method_; }
   AlphaBlendSource GetAlphaBlendSource() const { return alpha_blend_source_; }
   bool PremultiplyAlpha() const { return premultiply_alpha_; }
@@ -150,7 +151,7 @@
   void SetHasAlpha(bool alpha);
   void SetOriginalFrameRect(const IntRect& r) { original_frame_rect_ = r; }
   void SetStatus(Status);
-  void SetDuration(unsigned duration) { duration_ = duration; }
+  void SetDuration(TimeDelta duration) { duration_ = duration; }
   void SetDisposalMethod(DisposalMethod disposal_method) {
     disposal_method_ = disposal_method;
   }
@@ -284,7 +285,7 @@
   // frames whose original rect was smaller than the overall image size.
   IntRect original_frame_rect_;
   Status status_;
-  unsigned duration_;
+  TimeDelta duration_;
   DisposalMethod disposal_method_;
   AlphaBlendSource alpha_blend_source_;
   bool premultiply_alpha_;
diff --git a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp
index 0523153..55a427b 100644
--- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp
@@ -128,10 +128,10 @@
   return frame_info.fFullyReceived;
 }
 
-float GIFImageDecoder::FrameDurationAtIndex(size_t index) const {
+TimeDelta GIFImageDecoder::FrameDurationAtIndex(size_t index) const {
   if (index < frame_buffer_cache_.size())
     return frame_buffer_cache_[index].Duration();
-  return 0;
+  return TimeDelta();
 }
 
 bool GIFImageDecoder::SetFailed() {
@@ -182,7 +182,7 @@
   SkCodec::FrameInfo frame_info;
   bool frame_info_received = codec_->getFrameInfo(index, &frame_info);
   DCHECK(frame_info_received);
-  frame.SetDuration(frame_info.fDuration);
+  frame.SetDuration(TimeDelta::FromMilliseconds(frame_info.fDuration));
   size_t required_previous_frame_index;
   if (frame_info.fRequiredFrame == SkCodec::kNone) {
     required_previous_frame_index = kNotFound;
diff --git a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h
index 8a7e129e..195cb28 100644
--- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h
+++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h
@@ -30,6 +30,7 @@
 #include "platform/image-decoders/ImageDecoder.h"
 #include "platform/wtf/Noncopyable.h"
 #include "platform/wtf/RefPtr.h"
+#include "platform/wtf/Time.h"
 #include "third_party/skia/include/codec/SkCodec.h"
 
 namespace blink {
@@ -49,7 +50,7 @@
   void OnSetData(SegmentReader* data) override;
   int RepetitionCount() const override;
   bool FrameIsReceivedAtIndex(size_t) const override;
-  float FrameDurationAtIndex(size_t) const override;
+  TimeDelta FrameDurationAtIndex(size_t) const override;
   // CAUTION: SetFailed() deletes |codec_|. Be careful to avoid
   // accessing deleted memory.
   bool SetFailed() override;
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
index 44ee333..34c10d6 100644
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -132,7 +132,7 @@
   DCHECK(IntRect(IntPoint(), Size()).Contains(frame_info.frame_rect));
   buffer.SetOriginalFrameRect(frame_info.frame_rect);
 
-  buffer.SetDuration(frame_info.duration);
+  buffer.SetDuration(TimeDelta::FromMilliseconds(frame_info.duration));
   buffer.SetDisposalMethod(frame_info.disposal_method);
   buffer.SetAlphaBlendSource(frame_info.alpha_blend);
 
@@ -482,10 +482,10 @@
   return reader_->FrameIsReceivedAtIndex(index);
 }
 
-float PNGImageDecoder::FrameDurationAtIndex(size_t index) const {
+TimeDelta PNGImageDecoder::FrameDurationAtIndex(size_t index) const {
   if (index < frame_buffer_cache_.size())
     return frame_buffer_cache_[index].Duration();
-  return 0;
+  return TimeDelta();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h
index 3075bfa1..a94a070 100644
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h
@@ -29,6 +29,7 @@
 #include <memory>
 #include "platform/image-decoders/ImageDecoder.h"
 #include "platform/image-decoders/png/PNGImageReader.h"
+#include "platform/wtf/Time.h"
 
 namespace blink {
 
@@ -47,7 +48,7 @@
   bool SetSize(unsigned, unsigned) override;
   int RepetitionCount() const override;
   bool FrameIsReceivedAtIndex(size_t) const override;
-  float FrameDurationAtIndex(size_t) const override;
+  TimeDelta FrameDurationAtIndex(size_t) const override;
   bool SetFailed() override;
 
   // Callbacks from libpng
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp
index 25082d3..2b827b2e 100644
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp
@@ -6,6 +6,7 @@
 
 #include <memory>
 #include "platform/image-decoders/ImageDecoderTestHelpers.h"
+#include "platform/wtf/Time.h"
 #include "png.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -101,7 +102,7 @@
 }
 
 struct PublicFrameInfo {
-  size_t duration;
+  TimeDelta duration;
   IntRect frame_rect;
   ImageFrame::AlphaBlendSource alpha_blend;
   ImageFrame::DisposalMethod disposal_method;
@@ -110,19 +111,19 @@
 // This is the frame data for the following PNG image:
 // /LayoutTests/images/resources/png-animated-idat-part-of-animation.png
 static PublicFrameInfo g_png_animated_frame_info[] = {
-    {500,
+    {TimeDelta::FromMilliseconds(500),
      {IntPoint(0, 0), IntSize(5, 5)},
      ImageFrame::kBlendAtopBgcolor,
      ImageFrame::kDisposeKeep},
-    {900,
+    {TimeDelta::FromMilliseconds(900),
      {IntPoint(1, 1), IntSize(3, 1)},
      ImageFrame::kBlendAtopBgcolor,
      ImageFrame::kDisposeOverwriteBgcolor},
-    {2000,
+    {TimeDelta::FromMilliseconds(2000),
      {IntPoint(1, 2), IntSize(3, 2)},
      ImageFrame::kBlendAtopPreviousFrame,
      ImageFrame::kDisposeKeep},
-    {1500,
+    {TimeDelta::FromMilliseconds(1500),
      {IntPoint(1, 2), IntSize(3, 1)},
      ImageFrame::kBlendAtopBgcolor,
      ImageFrame::kDisposeKeep},
@@ -953,7 +954,7 @@
 
 TEST(StaticPNGTests, MetaDataTest) {
   const size_t kExpectedFrameCount = 1;
-  const size_t kExpectedDuration = 0;
+  const TimeDelta kExpectedDuration;
   auto decoder = CreatePNGDecoderWithPngData(
       "/LayoutTests/images/resources/png-simple.png");
   EXPECT_EQ(kExpectedFrameCount, decoder->FrameCount());
diff --git a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
index 1d4fad0..84b8af75 100644
--- a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
@@ -171,10 +171,10 @@
   return frame_is_received_at_index;
 }
 
-float WEBPImageDecoder::FrameDurationAtIndex(size_t index) const {
+TimeDelta WEBPImageDecoder::FrameDurationAtIndex(size_t index) const {
   return index < frame_buffer_cache_.size()
              ? frame_buffer_cache_[index].Duration()
-             : 0;
+             : TimeDelta();
 }
 
 bool WEBPImageDecoder::UpdateDemuxer() {
@@ -401,7 +401,7 @@
                      animated_frame.width, animated_frame.height);
   buffer->SetOriginalFrameRect(
       Intersection(frame_rect, IntRect(IntPoint(), Size())));
-  buffer->SetDuration(animated_frame.duration);
+  buffer->SetDuration(TimeDelta::FromMilliseconds(animated_frame.duration));
   buffer->SetDisposalMethod(animated_frame.dispose_method ==
                                     WEBP_MUX_DISPOSE_BACKGROUND
                                 ? ImageFrame::kDisposeOverwriteBgcolor
diff --git a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h
index 68d6bc5..3964ec4f7 100644
--- a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h
+++ b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h
@@ -30,6 +30,7 @@
 #define WEBPImageDecoder_h
 
 #include "platform/image-decoders/ImageDecoder.h"
+#include "platform/wtf/Time.h"
 #include "webp/decode.h"
 #include "webp/demux.h"
 
@@ -49,7 +50,7 @@
   void OnSetData(SegmentReader* data) override;
   int RepetitionCount() const override;
   bool FrameIsReceivedAtIndex(size_t) const override;
-  float FrameDurationAtIndex(size_t) const override;
+  TimeDelta FrameDurationAtIndex(size_t) const override;
 
  private:
   // ImageDecoder:
diff --git a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoderTest.cpp b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoderTest.cpp
index f87e335..4b9e404 100644
--- a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoderTest.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoderTest.cpp
@@ -35,6 +35,7 @@
 #include "platform/SharedBuffer.h"
 #include "platform/image-decoders/ImageDecoderTestHelpers.h"
 #include "platform/wtf/PtrUtil.h"
+#include "platform/wtf/Time.h"
 #include "platform/wtf/Vector.h"
 #include "platform/wtf/dtoa/utils.h"
 #include "public/platform/WebData.h"
@@ -45,6 +46,14 @@
 
 namespace {
 
+struct AnimParam {
+  int x_offset, y_offset, width, height;
+  ImageFrame::DisposalMethod disposal_method;
+  ImageFrame::AlphaBlendSource alpha_blend_source;
+  TimeDelta duration;
+  bool has_alpha;
+};
+
 std::unique_ptr<ImageDecoder> CreateWEBPDecoder(
     ImageDecoder::AlphaOption alpha_option) {
   return WTF::WrapUnique(new WEBPImageDecoder(
@@ -108,19 +117,16 @@
 
   const int kCanvasWidth = 11;
   const int kCanvasHeight = 29;
-  const struct AnimParam {
-    int x_offset, y_offset, width, height;
-    ImageFrame::DisposalMethod disposal_method;
-    ImageFrame::AlphaBlendSource alpha_blend_source;
-    unsigned duration;
-    bool has_alpha;
-  } kFrameParameters[] = {
+  const AnimParam kFrameParameters[] = {
       {0, 0, 11, 29, ImageFrame::kDisposeKeep,
-       ImageFrame::kBlendAtopPreviousFrame, 1000u, true},
+       ImageFrame::kBlendAtopPreviousFrame, TimeDelta::FromMilliseconds(1000),
+       true},
       {2, 10, 7, 17, ImageFrame::kDisposeKeep,
-       ImageFrame::kBlendAtopPreviousFrame, 500u, true},
+       ImageFrame::kBlendAtopPreviousFrame, TimeDelta::FromMilliseconds(500),
+       true},
       {2, 2, 7, 16, ImageFrame::kDisposeKeep,
-       ImageFrame::kBlendAtopPreviousFrame, 1000u, true},
+       ImageFrame::kBlendAtopPreviousFrame, TimeDelta::FromMilliseconds(1000),
+       true},
   };
 
   for (size_t i = 0; i < WTF_ARRAY_LENGTH(kFrameParameters); ++i) {
@@ -155,21 +161,19 @@
 
   const int kCanvasWidth = 94;
   const int kCanvasHeight = 87;
-  const struct AnimParam {
-    int x_offset, y_offset, width, height;
-    ImageFrame::DisposalMethod disposal_method;
-    ImageFrame::AlphaBlendSource alpha_blend_source;
-    unsigned duration;
-    bool has_alpha;
-  } kFrameParameters[] = {
+  const AnimParam kFrameParameters[] = {
       {4, 10, 33, 32, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopPreviousFrame, 1000u, true},
+       ImageFrame::kBlendAtopPreviousFrame, TimeDelta::FromMilliseconds(1000),
+       true},
       {34, 30, 33, 32, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopPreviousFrame, 1000u, true},
+       ImageFrame::kBlendAtopPreviousFrame, TimeDelta::FromMilliseconds(1000),
+       true},
       {62, 50, 32, 32, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopPreviousFrame, 1000u, true},
+       ImageFrame::kBlendAtopPreviousFrame, TimeDelta::FromMilliseconds(1000),
+       true},
       {10, 54, 32, 33, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopPreviousFrame, 1000u, true},
+       ImageFrame::kBlendAtopPreviousFrame, TimeDelta::FromMilliseconds(1000),
+       true},
   };
 
   for (size_t i = 0; i < WTF_ARRAY_LENGTH(kFrameParameters); ++i) {
@@ -203,21 +207,15 @@
 
   const int kCanvasWidth = 94;
   const int kCanvasHeight = 87;
-  const struct AnimParam {
-    int x_offset, y_offset, width, height;
-    ImageFrame::DisposalMethod disposal_method;
-    ImageFrame::AlphaBlendSource alpha_blend_source;
-    unsigned duration;
-    bool has_alpha;
-  } kFrameParameters[] = {
+  const AnimParam kFrameParameters[] = {
       {4, 10, 33, 32, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopBgcolor, 1000u, true},
+       ImageFrame::kBlendAtopBgcolor, TimeDelta::FromMilliseconds(1000), true},
       {34, 30, 33, 32, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopBgcolor, 1000u, true},
+       ImageFrame::kBlendAtopBgcolor, TimeDelta::FromMilliseconds(1000), true},
       {62, 50, 32, 32, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopBgcolor, 1000u, true},
+       ImageFrame::kBlendAtopBgcolor, TimeDelta::FromMilliseconds(1000), true},
       {10, 54, 32, 33, ImageFrame::kDisposeOverwriteBgcolor,
-       ImageFrame::kBlendAtopBgcolor, 1000u, true},
+       ImageFrame::kBlendAtopBgcolor, TimeDelta::FromMilliseconds(1000), true},
   };
 
   for (size_t i = 0; i < WTF_ARRAY_LENGTH(kFrameParameters); ++i) {
@@ -353,18 +351,21 @@
   EXPECT_EQ(2u, decoder->FrameCount());
   EXPECT_FALSE(decoder->Failed());
   EXPECT_TRUE(decoder->FrameIsReceivedAtIndex(0));
-  EXPECT_EQ(1000, decoder->FrameDurationAtIndex(0));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(1000),
+            decoder->FrameDurationAtIndex(0));
   EXPECT_TRUE(decoder->FrameIsReceivedAtIndex(1));
-  EXPECT_EQ(500, decoder->FrameDurationAtIndex(1));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(500), decoder->FrameDurationAtIndex(1));
 
   decoder->SetData(data_buffer.Get(), true);
   EXPECT_EQ(3u, decoder->FrameCount());
   EXPECT_TRUE(decoder->FrameIsReceivedAtIndex(0));
-  EXPECT_EQ(1000, decoder->FrameDurationAtIndex(0));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(1000),
+            decoder->FrameDurationAtIndex(0));
   EXPECT_TRUE(decoder->FrameIsReceivedAtIndex(1));
-  EXPECT_EQ(500, decoder->FrameDurationAtIndex(1));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(500), decoder->FrameDurationAtIndex(1));
   EXPECT_TRUE(decoder->FrameIsReceivedAtIndex(2));
-  EXPECT_EQ(1000.0, decoder->FrameDurationAtIndex(2));
+  EXPECT_EQ(TimeDelta::FromMilliseconds(1000),
+            decoder->FrameDurationAtIndex(2));
 }
 
 TEST(AnimatedWebPTests, updateRequiredPreviousFrameAfterFirstDecode) {
diff --git a/third_party/WebKit/Source/platform/scheduler/DEPS b/third_party/WebKit/Source/platform/scheduler/DEPS
index 6017b541..e4af261 100644
--- a/third_party/WebKit/Source/platform/scheduler/DEPS
+++ b/third_party/WebKit/Source/platform/scheduler/DEPS
@@ -16,7 +16,6 @@
   "+base/metrics/field_trial.h",
   "+base/metrics/field_trial_params.h",
   "+base/metrics/histogram_macros.h",
-  "+base/observer_list.h",
   "+base/optional.h",
   "+base/pending_task.h",
   "+base/run_loop.h",
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc
index 25737a4..3aba6d6ec 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc
@@ -46,18 +46,6 @@
   return control_task_queue_;
 }
 
-scoped_refptr<MainThreadTaskQueue>
-MainThreadSchedulerHelper::BestEffortMainThreadTaskQueue() {
-  if (!best_effort_task_queue_) {
-    best_effort_task_queue_ =
-        NewTaskQueue(MainThreadTaskQueue::QueueCreationParams(
-                         MainThreadTaskQueue::QueueType::BEST_EFFORT)
-                         .SetShouldMonitorQuiescence(true));
-    best_effort_task_queue_->SetQueuePriority(TaskQueue::BEST_EFFORT_PRIORITY);
-  }
-  return best_effort_task_queue_;
-}
-
 scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerHelper::NewTaskQueue(
     const MainThreadTaskQueue::QueueCreationParams& params) {
   return task_queue_manager_->CreateTaskQueue<MainThreadTaskQueue>(
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h
index ab64d68d..6df96e72 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h
@@ -26,7 +26,6 @@
 
   scoped_refptr<MainThreadTaskQueue> DefaultMainThreadTaskQueue();
   scoped_refptr<MainThreadTaskQueue> ControlMainThreadTaskQueue();
-  scoped_refptr<MainThreadTaskQueue> BestEffortMainThreadTaskQueue();
 
  protected:
   scoped_refptr<TaskQueue> DefaultTaskQueue() override;
@@ -37,7 +36,6 @@
 
   const scoped_refptr<MainThreadTaskQueue> default_task_queue_;
   const scoped_refptr<MainThreadTaskQueue> control_task_queue_;
-  scoped_refptr<MainThreadTaskQueue> best_effort_task_queue_;
 
   DISALLOW_COPY_AND_ASSIGN(MainThreadSchedulerHelper);
 };
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 37d2833..e3a7de42 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
@@ -42,8 +42,6 @@
       return "test_tq";
     case MainThreadTaskQueue::QueueType::FRAME_LOADING_CONTROL:
       return "frame_loading_control_tq";
-    case MainThreadTaskQueue::QueueType::BEST_EFFORT:
-      return "best_effort";
     case MainThreadTaskQueue::QueueType::COUNT:
       NOTREACHED();
       return nullptr;
@@ -59,7 +57,6 @@
     case QueueType::DEFAULT:
     case QueueType::IDLE:
     case QueueType::TEST:
-    case QueueType::BEST_EFFORT:
       return QueueClass::NONE;
     case QueueType::DEFAULT_LOADING:
     case QueueType::FRAME_LOADING:
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 0c8b547..21d90ae8 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
@@ -40,9 +40,8 @@
     FRAME_DEFERRABLE = 13,
     FRAME_PAUSABLE = 14,
     FRAME_UNPAUSABLE = 15,
-    BEST_EFFORT = 16,
 
-    COUNT = 17
+    COUNT = 16
   };
 
   // Returns name of the given queue type. Returned string has application
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 30fc2f5..d2143bc 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
@@ -299,12 +299,6 @@
 }
 
 scoped_refptr<MainThreadTaskQueue>
-RendererSchedulerImpl::BestEffortTaskQueue() {
-  helper_.CheckOnValidThread();
-  return helper_.BestEffortMainThreadTaskQueue();
-}
-
-scoped_refptr<MainThreadTaskQueue>
 RendererSchedulerImpl::VirtualTimeControlTaskQueue() {
   helper_.CheckOnValidThread();
   return virtual_time_control_task_queue_;
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 48a04442..65436d230 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
@@ -164,9 +164,6 @@
   // Returns a task queue where tasks run at the highest possible priority.
   scoped_refptr<MainThreadTaskQueue> ControlTaskQueue();
 
-  // Returns a task queue where tasks run at the lowest priority.
-  scoped_refptr<MainThreadTaskQueue> BestEffortTaskQueue();
-
   // A control task queue which also respects virtual time. Only available if
   // virtual time has been enabled.
   scoped_refptr<MainThreadTaskQueue> VirtualTimeControlTaskQueue();
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler.h b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler.h
index 549bd89..03a6cda 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler.h
@@ -78,22 +78,6 @@
   // WebFrameSchedulers.
   virtual void SetVirtualTimePolicy(VirtualTimePolicy) = 0;
 
-  class VirtualTimeObserver {
-   public:
-    virtual ~VirtualTimeObserver() {}
-
-    // Called the next microtask after virtual time pauses for any reason.
-    // |virtual_time_offset| is the offset between the current virtual time and
-    // the initial virtual time when EnableVirtualTime() was called.
-    virtual void OnVirtualTimePaused(base::TimeDelta virtual_time_offset) = 0;
-  };
-
-  // Adds a VirtualTimeObserver instance to be notified when virtual time has
-  // been paused. Note the observer will fire in the microtask after the policy
-  // decision was made.
-  virtual void AddVirtualTimeObserver(VirtualTimeObserver*) = 0;
-  virtual void RemoveVirtualTimeObserver(VirtualTimeObserver*) = 0;
-
   // Set the remaining virtual time budget to |budget|. Once the budget runs
   // out, |budget_exhausted_callback| is called. Note that the virtual time
   // policy is not affected when the budget expires.
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
index 02a6743..cbf4f738 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
@@ -115,8 +115,6 @@
       background_time_budget_pool_(nullptr),
       delegate_(delegate) {
   renderer_scheduler->AddWebViewScheduler(this);
-  virtual_time_paused_notification_.Reset(base::Bind(
-      &WebViewSchedulerImpl::NotifyVirtualTimePaused, base::Unretained(this)));
 }
 
 WebViewSchedulerImpl::~WebViewSchedulerImpl() {
@@ -129,8 +127,6 @@
 
   if (background_time_budget_pool_)
     background_time_budget_pool_->Close();
-
-  virtual_time_paused_notification_.Cancel();
 }
 
 void WebViewSchedulerImpl::SetPageVisible(bool page_visible) {
@@ -185,8 +181,6 @@
   virtual_time_control_task_queue_ = WebTaskRunnerImpl::Create(
       renderer_scheduler_->VirtualTimeControlTaskQueue());
   ApplyVirtualTimePolicyToTimers();
-
-  initial_virtual_time_ = renderer_scheduler_->GetVirtualTimeDomain()->Now();
 }
 
 void WebViewSchedulerImpl::DisableVirtualTimeForTesting() {
@@ -214,16 +208,6 @@
 
 void WebViewSchedulerImpl::SetAllowVirtualTimeToAdvance(
     bool allow_virtual_time_to_advance) {
-  // Notify observers if we've paused in a subsequent microtask. Important
-  // because observers may wish to use this signal as a trigger to batch process
-  // any pending network fetches, we always send this notification, even if
-  // we where previously paused.
-  virtual_time_paused_notification_.Cancel();
-  if (!allow_virtual_time_to_advance && have_seen_loading_task_) {
-    renderer_scheduler_->BestEffortTaskQueue()->PostTask(
-        FROM_HERE, virtual_time_paused_notification_.GetCallback());
-  }
-
   if (allow_virtual_time_to_advance_ == allow_virtual_time_to_advance)
     return;
   allow_virtual_time_to_advance_ = allow_virtual_time_to_advance;
@@ -313,26 +297,6 @@
           BLINK_FROM_HERE, std::move(budget_exhausted_callback), budget);
 }
 
-void WebViewSchedulerImpl::AddVirtualTimeObserver(
-    VirtualTimeObserver* observer) {
-  virtual_time_observers_.AddObserver(observer);
-}
-
-void WebViewSchedulerImpl::RemoveVirtualTimeObserver(
-    VirtualTimeObserver* observer) {
-  virtual_time_observers_.RemoveObserver(observer);
-}
-
-void WebViewSchedulerImpl::NotifyVirtualTimePaused() {
-  DCHECK(!allow_virtual_time_to_advance_);
-
-  for (auto& observer : virtual_time_observers_) {
-    observer.OnVirtualTimePaused(
-        renderer_scheduler_->GetVirtualTimeDomain()->Now() -
-        initial_virtual_time_);
-  }
-}
-
 void WebViewSchedulerImpl::AudioStateChanged(bool is_audio_playing) {
   is_audio_playing_ = is_audio_playing;
   renderer_scheduler_->OnAudioStateChanged();
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h
index f38aa6d..edc7eef 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h
@@ -10,9 +10,7 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/observer_list.h"
 #include "platform/PlatformExport.h"
-#include "platform/scheduler/base/cancelable_closure_holder.h"
 #include "platform/scheduler/base/task_queue.h"
 #include "platform/scheduler/child/web_scheduler.h"
 #include "platform/scheduler/child/web_task_runner_impl.h"
@@ -56,8 +54,6 @@
   void AudioStateChanged(bool is_audio_playing) override;
   bool HasActiveConnectionForTest() const override;
   void RequestBeginMainFrameNotExpected(bool new_state) override;
-  void AddVirtualTimeObserver(VirtualTimeObserver*) override;
-  void RemoveVirtualTimeObserver(VirtualTimeObserver*) override;
 
   // Virtual for testing.
   virtual void ReportIntervention(const std::string& message);
@@ -105,8 +101,6 @@
   // number of active connections.
   void UpdateBackgroundBudgetPoolThrottlingState();
 
-  void NotifyVirtualTimePaused();
-
   std::set<WebFrameSchedulerImpl*> frame_schedulers_;
   std::set<unsigned long> pending_loads_;
   std::set<WebFrameSchedulerImpl*> provisional_loads_;
@@ -128,9 +122,6 @@
   bool has_active_connection_;
   CPUTimeBudgetPool* background_time_budget_pool_;  // Not owned.
   WebViewScheduler::WebViewSchedulerDelegate* delegate_;  // Not owned.
-  base::ObserverList<VirtualTimeObserver> virtual_time_observers_;
-  CancelableClosureHolder virtual_time_paused_notification_;
-  base::TimeTicks initial_virtual_time_;
 
   DISALLOW_COPY_AND_ASSIGN(WebViewSchedulerImpl);
 };
diff --git a/third_party/WebKit/Source/platform/text/LocaleICU.cpp b/third_party/WebKit/Source/platform/text/LocaleICU.cpp
index af7cc0f..e0c1f94 100644
--- a/third_party/WebKit/Source/platform/text/LocaleICU.cpp
+++ b/third_party/WebKit/Source/platform/text/LocaleICU.cpp
@@ -40,8 +40,6 @@
 #include "platform/wtf/text/StringBuffer.h"
 #include "platform/wtf/text/StringBuilder.h"
 
-using namespace icu;
-
 namespace blink {
 
 std::unique_ptr<Locale> Locale::Create(const String& locale) {
diff --git a/third_party/WebKit/Source/platform/wtf/allocator/Partitions.h b/third_party/WebKit/Source/platform/wtf/allocator/Partitions.h
index 11713aa9b..82be653b 100644
--- a/third_party/WebKit/Source/platform/wtf/allocator/Partitions.h
+++ b/third_party/WebKit/Source/platform/wtf/allocator/Partitions.h
@@ -163,11 +163,10 @@
 using base::RecommitSystemPages;
 using base::RoundDownToSystemPage;
 using base::RoundUpToSystemPage;
-using base::SetSystemPagesAccessible;
-using base::SetSystemPagesInaccessible;
+using base::SetSystemPagesAccess;
 
-using base::PageAccessible;
 using base::PageInaccessible;
+using base::PageReadWrite;
 using base::PartitionStatsDumper;
 using base::PartitionMemoryStats;
 using base::PartitionBucketMemoryStats;
diff --git a/third_party/WebKit/public/web/WebAXObject.h b/third_party/WebKit/public/web/WebAXObject.h
index b139f443..b796e87 100644
--- a/third_party/WebKit/public/web/WebAXObject.h
+++ b/third_party/WebKit/public/web/WebAXObject.h
@@ -153,6 +153,10 @@
 
   BLINK_EXPORT WebString AccessKey() const;
   BLINK_EXPORT unsigned BackgroundColor() const;
+  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;
@@ -218,10 +222,6 @@
                               WebAXObject& focus_object,
                               int& focus_offset,
                               WebAXTextAffinity& focus_affinity) const;
-  BLINK_EXPORT void SetSelection(const WebAXObject& anchor_object,
-                                 int anchor_offset,
-                                 const WebAXObject& focus_object,
-                                 int focus_offset) const;
 
   // The following selection functions return text offsets calculated starting
   // the current object. They only report on a selection that is placed on
@@ -262,24 +262,29 @@
                             WebVector<int>& starts,
                             WebVector<int>& ends) const;
 
-  // Actions
+  // Actions. Return true if handled.
   BLINK_EXPORT WebAXDefaultActionVerb Action() const;
-  BLINK_EXPORT bool CanDecrement() const;
-  BLINK_EXPORT bool CanIncrement() const;
-  BLINK_EXPORT bool CanPress() const;
-  BLINK_EXPORT bool CanSetValueAttribute() const;
-  BLINK_EXPORT bool CanSetFocusAttribute() const;
-  BLINK_EXPORT bool CanSetSelectedAttribute() const;
-  BLINK_EXPORT bool PerformDefaultAction() const;
-  BLINK_EXPORT bool Press() const;
-  BLINK_EXPORT bool Increment() const;
+  BLINK_EXPORT bool Click() const;
   BLINK_EXPORT bool Decrement() const;
-  BLINK_EXPORT void SetFocused(bool) const;
-  BLINK_EXPORT void SetSelectedTextRange(int selection_start,
-                                         int selection_end) const;
-  BLINK_EXPORT void SetSequentialFocusNavigationStartingPoint() const;
-  BLINK_EXPORT void SetValue(WebString) const;
-  BLINK_EXPORT void ShowContextMenu() const;
+  BLINK_EXPORT bool Increment() const;
+  BLINK_EXPORT bool Focus() const;
+  BLINK_EXPORT bool SetSelected(bool) const;
+  BLINK_EXPORT bool SetSelection(const WebAXObject& anchor_object,
+                                 int anchor_offset,
+                                 const WebAXObject& focus_object,
+                                 int focus_offset) const;
+  BLINK_EXPORT bool SetSequentialFocusNavigationStartingPoint() const;
+  BLINK_EXPORT bool SetValue(WebString) const;
+  BLINK_EXPORT bool ShowContextMenu() const;
+  // Make this object visible by scrolling as many nested scrollable views as
+  // needed.
+  BLINK_EXPORT bool ScrollToMakeVisible() const;
+  // Same, but if the whole object can't be made visible, try for this subrect,
+  // in local coordinates.
+  BLINK_EXPORT bool ScrollToMakeVisibleWithSubFocus(const WebRect&) const;
+  // Scroll this object to a given point in global coordinates of the top-level
+  // window.
+  BLINK_EXPORT bool ScrollToGlobalPoint(const WebPoint&) const;
 
   // For a table
   BLINK_EXPORT int AriaColumnCount() const;
@@ -344,16 +349,6 @@
                                       WebFloatRect& bounds_in_container,
                                       SkMatrix44& container_transform) const;
 
-  // Make this object visible by scrolling as many nested scrollable views as
-  // needed.
-  BLINK_EXPORT void ScrollToMakeVisible() const;
-  // Same, but if the whole object can't be made visible, try for this subrect,
-  // in local coordinates.
-  BLINK_EXPORT void ScrollToMakeVisibleWithSubFocus(const WebRect&) const;
-  // Scroll this object to a given point in global coordinates of the top-level
-  // window.
-  BLINK_EXPORT void ScrollToGlobalPoint(const WebPoint&) const;
-
 #if INSIDE_BLINK
   BLINK_EXPORT WebAXObject(AXObject*);
   WebAXObject& operator=(AXObject*);
diff --git a/third_party/blink/tools/blinkpy/common/camel_to_snake.py b/third_party/blink/tools/blinkpy/common/camel_to_snake.py
deleted file mode 100644
index 5f8cc4d..0000000
--- a/third_party/blink/tools/blinkpy/common/camel_to_snake.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import re
-
-
-def convert(name):
-    special_cases = [
-        ('CSS', 'Css'),
-        ('Context2D', 'Context_2d'),
-        ('DList', 'Dlist'),
-        ('ETC1', 'Etc1'),
-        ('IFrame', 'Iframe'),
-        ('OList', 'Olist'),
-        ('OnLine', 'Online'),
-        ('Path2D', 'Path_2d'),
-        ('Point2D', 'Point_2d'),
-        ('RTCDTMF', 'Rtc_dtmf'),
-        ('S3TC', 'S3tc'),
-        ('UList', 'Ulist'),
-        ('XPath', 'Xpath'),
-        ('sRGB', 'Srgb'),
-
-        ('SVGFE', 'Svg_fe'),
-        ('SVGMPath', 'Svg_mpath'),
-        ('SVGTSpan', 'Svg_tspan'),
-        ('SVG', 'Svg'),
-
-        ('XHTML', 'Xhtml'),
-        ('HTML', 'Html'),
-
-        ('WebGL2', 'Webgl2'),
-        ('WebGL', 'Webgl'),
-    ]
-    for old, new in special_cases:
-        name = re.sub(old, new, name)
-
-    name = re.sub(r'([A-Z][A-Z0-9]*)([A-Z][a-z0-9])', r'\1_\2', name)
-    name = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', name)
-    return name.lower()
diff --git a/third_party/blink/tools/blinkpy/common/camel_to_snake_unittest.py b/third_party/blink/tools/blinkpy/common/camel_to_snake_unittest.py
deleted file mode 100644
index ae66430..0000000
--- a/third_party/blink/tools/blinkpy/common/camel_to_snake_unittest.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from blinkpy.common.camel_to_snake import convert
-
-
-class TestCamelToSnake(unittest.TestCase):
-
-    def test_convert(self):
-        self.assertEqual(convert('Animation.idl'), 'animation.idl')
-        self.assertEqual(convert('CSS.idl'), 'css.idl')
-        self.assertEqual(convert('CSSURLImageValue'), 'css_url_image_value')
-        self.assertEqual(convert('CDATASection'), 'cdata_section')
-        self.assertEqual(convert('NavigatorOnLine'), 'navigator_online')
-        self.assertEqual(convert('HTMLDListElement'), 'html_dlist_element')
-        self.assertEqual(convert('HTMLIFrameElement'), 'html_iframe_element')
-        self.assertEqual(convert('HTMLOptGroupElement'), 'html_opt_group_element')
-        self.assertEqual(convert('HTMLFieldSetElement'), 'html_field_set_element')
-        self.assertEqual(convert('HTMLTextAreaElement'), 'html_text_area_element')
-        self.assertEqual(convert('SVGFEBlendElement'), 'svg_fe_blend_element')
-        self.assertEqual(convert('SVGURIReference'), 'svg_uri_reference')
-        self.assertEqual(convert('XPathEvaluator'), 'xpath_evaluator')
-        self.assertEqual(convert('UTF16TextIterator'), 'utf16_text_iterator')
-        self.assertEqual(convert('WebGLCompressedTextureETC1.idl'), 'webgl_compressed_texture_etc1.idl')
diff --git a/third_party/WebKit/Source/bindings/scripts/name_style_converter.py b/third_party/blink/tools/blinkpy/common/name_style_converter.py
similarity index 64%
rename from third_party/WebKit/Source/bindings/scripts/name_style_converter.py
rename to third_party/blink/tools/blinkpy/common/name_style_converter.py
index 8e82ff5e..5a17ba4 100644
--- a/third_party/WebKit/Source/bindings/scripts/name_style_converter.py
+++ b/third_party/blink/tools/blinkpy/common/name_style_converter.py
@@ -6,9 +6,34 @@
 
 import re
 
-SPECIAL_PREFIXES = [
+SPECIAL_TOKENS = [
+    # This list should be sorted by length.
+    'Float32',
+    'Float64',
+    'IFrame',
+    'Uint16',
+    'Uint32',
+    'WebGL2',
+    'DList',
+    'Int16',
+    'Int32',
+    'MPath',
+    'TSpan',
+    'UList',
+    'UTF16',
+    'Uint8',
     'WebGL',
+    'XPath',
+    'ETC1',
+    'HTML',
+    'Int8',
+    'S3TC',
+    'UTF8',
+    'CSS',
+    'EXT',
+    'RTC',
     'SVG',
+    'V8',
 ]
 
 MATCHING_EXPRESSION = '((?:[A-Z][a-z]+)|[0-9]D?$)'
@@ -22,22 +47,30 @@
     def __init__(self, name):
         self.remaining = name
 
-    def detect_special_prefix(self):
-        for prefix in SPECIAL_PREFIXES:
-            if self.remaining.startswith(prefix):
-                result = self.remaining[:len(prefix)]
-                self.remaining = self.remaining[len(prefix):]
-                return result
-        return None
-
     def tokenize(self):
-        prefix = self.detect_special_prefix()
-        return filter(None,
-                      [prefix] + re.split(MATCHING_EXPRESSION, self.remaining))
+        name = self.remaining
+        tokens = []
+        while len(name) > 0:
+            matched_token = None
+            for token in SPECIAL_TOKENS:
+                if name.startswith(token):
+                    matched_token = token
+                    break
+            if not matched_token:
+                match = re.search(MATCHING_EXPRESSION, name)
+                if not match:
+                    matched_token = name
+                elif match.start(0) != 0:
+                    matched_token = name[:match.start(0)]
+                else:
+                    matched_token = match.group(0)
+            tokens.append(name[:len(matched_token)])
+            name = name[len(matched_token):]
+        return tokens
 
 
 class NameStyleConverter(object):
-    """Converts names from camelCase and other styles to various other styles.
+    """Converts names from camelCase to various other styles.
     """
 
     def __init__(self, name):
diff --git a/third_party/blink/tools/blinkpy/common/name_style_converter_test.py b/third_party/blink/tools/blinkpy/common/name_style_converter_test.py
new file mode 100644
index 0000000..9c1f2e2
--- /dev/null
+++ b/third_party/blink/tools/blinkpy/common/name_style_converter_test.py
@@ -0,0 +1,148 @@
+# 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.
+
+# pylint: disable=import-error,print-statement,relative-import,protected-access
+
+"""Unit tests for name_style_converter.py."""
+
+import unittest
+
+from name_style_converter import NameStyleConverter
+from name_style_converter import SmartTokenizer
+
+
+class SmartTokenizerTest(unittest.TestCase):
+    def test_simple_cases(self):
+        tokenizer = SmartTokenizer('foo')
+        self.assertEqual(tokenizer.tokenize(), ['foo'])
+
+        tokenizer = SmartTokenizer('fooBar')
+        self.assertEqual(tokenizer.tokenize(), ['foo', 'Bar'])
+
+        tokenizer = SmartTokenizer('fooBarBaz')
+        self.assertEqual(tokenizer.tokenize(), ['foo', 'Bar', 'Baz'])
+
+        tokenizer = SmartTokenizer('Baz')
+        self.assertEqual(tokenizer.tokenize(), ['Baz'])
+
+        tokenizer = SmartTokenizer('')
+        self.assertEqual(tokenizer.tokenize(), [])
+
+        tokenizer = SmartTokenizer('FOO')
+        self.assertEqual(tokenizer.tokenize(), ['FOO'])
+
+        tokenizer = SmartTokenizer('foo2')
+        self.assertEqual(tokenizer.tokenize(), ['foo', '2'])
+
+    def test_tricky_cases(self):
+        tokenizer = SmartTokenizer('XMLHttpRequest')
+        self.assertEqual(tokenizer.tokenize(), ['XML', 'Http', 'Request'])
+
+        tokenizer = SmartTokenizer('HTMLElement')
+        self.assertEqual(tokenizer.tokenize(), ['HTML', 'Element'])
+
+        tokenizer = SmartTokenizer('WebGLRenderingContext')
+        self.assertEqual(tokenizer.tokenize(),
+                         ['WebGL', 'Rendering', 'Context'])
+
+        tokenizer = SmartTokenizer('CanvasRenderingContext2D')
+        self.assertEqual(tokenizer.tokenize(),
+                         ['Canvas', 'Rendering', 'Context', '2D'])
+
+        tokenizer = SmartTokenizer('SVGSVGElement')
+        self.assertEqual(tokenizer.tokenize(), ['SVG', 'SVG', 'Element'])
+
+        tokenizer = SmartTokenizer('CanvasRenderingContext2D')
+        self.assertEqual(tokenizer.tokenize(), ['Canvas', 'Rendering', 'Context', '2D'])
+
+        tokenizer = SmartTokenizer('CSSURLImageValue')
+        self.assertEqual(tokenizer.tokenize(), ['CSS', 'URL', 'Image', 'Value'])
+
+        tokenizer = SmartTokenizer('CDATASection')
+        self.assertEqual(tokenizer.tokenize(), ['CDATA', 'Section'])
+
+        tokenizer = SmartTokenizer('HTMLDListElement')
+        self.assertEqual(tokenizer.tokenize(), ['HTML', 'DList', 'Element'])
+
+        tokenizer = SmartTokenizer('HTMLIFrameElement')
+        self.assertEqual(tokenizer.tokenize(), ['HTML', 'IFrame', 'Element'])
+
+        # No special handling for OptGroup, FieldSet, and TextArea.
+        tokenizer = SmartTokenizer('HTMLOptGroupElement')
+        self.assertEqual(tokenizer.tokenize(), ['HTML', 'Opt', 'Group', 'Element'])
+        tokenizer = SmartTokenizer('HTMLFieldSetElement')
+        self.assertEqual(tokenizer.tokenize(), ['HTML', 'Field', 'Set', 'Element'])
+        tokenizer = SmartTokenizer('HTMLTextAreaElement')
+        self.assertEqual(tokenizer.tokenize(), ['HTML', 'Text', 'Area', 'Element'])
+
+        tokenizer = SmartTokenizer('Path2D')
+        self.assertEqual(tokenizer.tokenize(), ['Path', '2D'])
+        tokenizer = SmartTokenizer('Point2D')
+        self.assertEqual(tokenizer.tokenize(), ['Point', '2D'])
+        tokenizer = SmartTokenizer('CanvasRenderingContext2DState')
+        self.assertEqual(tokenizer.tokenize(), ['Canvas', 'Rendering', 'Context', '2D', 'State'])
+
+        tokenizer = SmartTokenizer('RTCDTMFSender')
+        self.assertEqual(tokenizer.tokenize(), ['RTC', 'DTMF', 'Sender'])
+
+        tokenizer = SmartTokenizer('WebGLCompressedTextureS3TCsRGB')
+        self.assertEqual(tokenizer.tokenize(), ['WebGL', 'Compressed', 'Texture', 'S3TC', 'sRGB'])
+        tokenizer = SmartTokenizer('WebGL2CompressedTextureETC1')
+        self.assertEqual(tokenizer.tokenize(), ['WebGL2', 'Compressed', 'Texture', 'ETC1'])
+        tokenizer = SmartTokenizer('EXTsRGB')
+        self.assertEqual(tokenizer.tokenize(), ['EXT', 'sRGB'])
+
+        tokenizer = SmartTokenizer('SVGFEBlendElement')
+        self.assertEqual(tokenizer.tokenize(), ['SVG', 'FE', 'Blend', 'Element'])
+        tokenizer = SmartTokenizer('SVGMPathElement')
+        self.assertEqual(tokenizer.tokenize(), ['SVG', 'MPath', 'Element'])
+        tokenizer = SmartTokenizer('SVGTSpanElement')
+        self.assertEqual(tokenizer.tokenize(), ['SVG', 'TSpan', 'Element'])
+        tokenizer = SmartTokenizer('SVGURIReference')
+        self.assertEqual(tokenizer.tokenize(), ['SVG', 'URI', 'Reference'])
+
+        tokenizer = SmartTokenizer('UTF16TextIterator')
+        self.assertEqual(tokenizer.tokenize(), ['UTF16', 'Text', 'Iterator'])
+        tokenizer = SmartTokenizer('UTF8Decoder')
+        self.assertEqual(tokenizer.tokenize(), ['UTF8', 'Decoder'])
+        tokenizer = SmartTokenizer('Uint8Array')
+        self.assertEqual(tokenizer.tokenize(), ['Uint8', 'Array'])
+        tokenizer = SmartTokenizer('V8BindingForCore')
+        self.assertEqual(tokenizer.tokenize(), ['V8', 'Binding', 'For', 'Core'])
+        tokenizer = SmartTokenizer('V8DOMRect')
+        self.assertEqual(tokenizer.tokenize(), ['V8', 'DOM', 'Rect'])
+
+        tokenizer = SmartTokenizer('XPathEvaluator')
+        self.assertEqual(tokenizer.tokenize(), ['XPath', 'Evaluator'])
+
+        tokenizer = SmartTokenizer('IsXHTMLDocument')
+        self.assertEqual(tokenizer.tokenize(), ['Is', 'XHTML', 'Document'])
+
+        tokenizer = SmartTokenizer('Animation.idl')
+        self.assertEqual(tokenizer.tokenize(), ['Animation', '.idl'])
+
+
+class NameStyleConverterTest(unittest.TestCase):
+    def test_snake_case(self):
+        converter = NameStyleConverter('HTMLElement')
+        self.assertEqual(converter.to_snake_case(), 'html_element')
+
+    def test_upper_camel_case(self):
+        converter = NameStyleConverter('someSuperThing')
+        self.assertEqual(converter.to_upper_camel_case(), 'SomeSuperThing')
+
+        converter = NameStyleConverter('SVGElement')
+        self.assertEqual(converter.to_upper_camel_case(), 'SVGElement')
+
+    def test_macro_case(self):
+        converter = NameStyleConverter('WebGLBaz2D')
+        self.assertEqual(converter.to_macro_case(), 'WEBGL_BAZ_2D')
+
+    def test_all_cases(self):
+        converter = NameStyleConverter('SVGScriptElement')
+        self.assertEqual(converter.to_all_cases(), {
+            'snake_case': 'svg_script_element',
+            'upper_camel_case': 'SVGScriptElement',
+            'macro_case': 'SVG_SCRIPT_ELEMENT',
+        })
diff --git a/third_party/closure_compiler/externs/metrics_private.js b/third_party/closure_compiler/externs/metrics_private.js
index bd8c516..49d2bf71 100644
--- a/third_party/closure_compiler/externs/metrics_private.js
+++ b/third_party/closure_compiler/externs/metrics_private.js
@@ -1,4 +1,4 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// 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.
 
@@ -58,7 +58,7 @@
  * Returns variation parameters for the named trial if available, or undefined
  * otherwise.
  * @param {string} name
- * @param {function(Object):void} callback
+ * @param {function((Object|undefined)):void} callback
  * @see https://developer.chrome.com/extensions/metricsPrivate#method-getVariationParams
  */
 chrome.metricsPrivate.getVariationParams = function(name, callback) {};
@@ -130,6 +130,15 @@
 chrome.metricsPrivate.recordLongTime = function(metricName, value) {};
 
 /**
+ * Increments the count associated with the hash of |value| in the sparse
+ * histogram defined by the |metricName|.
+ * @param {string} metricName
+ * @param {string} value
+ * @see https://developer.chrome.com/extensions/metricsPrivate#method-recordSparseHashable
+ */
+chrome.metricsPrivate.recordSparseHashable = function(metricName, value) {};
+
+/**
  * Increments the count associated with |value| in the sparse histogram defined
  * by the |metricName|.
  * @param {string} metricName
diff --git a/third_party/leveldatabase/env_chromium.cc b/third_party/leveldatabase/env_chromium.cc
index 7d4a6ca..074d13e 100644
--- a/third_party/leveldatabase/env_chromium.cc
+++ b/third_party/leveldatabase/env_chromium.cc
@@ -486,8 +486,8 @@
                    const std::string& message,
                    MethodID method) {
   char buf[512];
-  base::snprintf(buf, sizeof(buf), "%s (ChromeMethodOnly: %d::%s)", message.c_str(),
-           method, MethodIDToString(method));
+  base::snprintf(buf, sizeof(buf), "%s (ChromeMethodOnly: %d::%s)",
+                 message.c_str(), method, MethodIDToString(method));
   return Status::IOError(filename, buf);
 }
 
diff --git a/third_party/win_build_output/README.chromium b/third_party/win_build_output/README.chromium
index 8621089d..6e27eb0 100644
--- a/third_party/win_build_output/README.chromium
+++ b/third_party/win_build_output/README.chromium
@@ -17,12 +17,18 @@
 this directory.
 
 For mc.exe:
-* mc.exe generates foo.h and foo.rc in out\gn\gen\path\to\file.mc. Copy over
-  these two files to third_party\win_build_output\mc\path\to\file. Then open
-  foo.rc and copy all the .bin files referenced from the .rc file (and delete
-  all checked-in files no tin this list).
+* mc.exe generates foo.h and foo.rc for input path\to\file.mc in
+  out\gn\gen\path\to. Copy over these two files to
+  third_party\win_build_output\mc\path\to. Then open foo.rc and copy all the
+  .bin files referenced from the .rc file (and delete all checked-in files not
+  in this list).
 
 For midl.exe:
 * midl.exe generates foo.h, foo.dlldata.c, foo_i.c, foo_p.i, foo_p.c, and
   sometimes foo.tlb. Copy these 5 (or 6, if the .tlb file is present) to
-  third_party\win_build_output\midl\path\to\file.
+  third_party\win_build_output\midl\path\to\file.  If there are multiple idl
+  files producing output in the same output directory, create directories called
+  "foo1.idl", "foo2.idl" etc in that directory and put the output for each idl
+  file into the directory named after the input file.  Because midl.exe produces
+  different outputs in 32-bit and 64-bit builds, do one each and put the
+  32-bit outputs in subfolder 'x86' and 64-bit outputs in subfolder 'x64'.
diff --git a/third_party/win_build_output/midl/google_update/google_update_idl.dlldata.c b/third_party/win_build_output/midl/google_update/x64/google_update_idl.dlldata.c
similarity index 100%
rename from third_party/win_build_output/midl/google_update/google_update_idl.dlldata.c
rename to third_party/win_build_output/midl/google_update/x64/google_update_idl.dlldata.c
diff --git a/third_party/win_build_output/midl/google_update/google_update_idl.h b/third_party/win_build_output/midl/google_update/x64/google_update_idl.h
similarity index 99%
rename from third_party/win_build_output/midl/google_update/google_update_idl.h
rename to third_party/win_build_output/midl/google_update/x64/google_update_idl.h
index 5b5691aa..aff56ae8a 100644
--- a/third_party/win_build_output/midl/google_update/google_update_idl.h
+++ b/third_party/win_build_output/midl/google_update/x64/google_update_idl.h
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../google_update/google_update_idl.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/google_update/google_update_idl.tlb b/third_party/win_build_output/midl/google_update/x64/google_update_idl.tlb
similarity index 99%
rename from third_party/win_build_output/midl/google_update/google_update_idl.tlb
rename to third_party/win_build_output/midl/google_update/x64/google_update_idl.tlb
index 2ac4a0d..da8590c1 100644
--- a/third_party/win_build_output/midl/google_update/google_update_idl.tlb
+++ b/third_party/win_build_output/midl/google_update/x64/google_update_idl.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/google_update/google_update_idl_i.c b/third_party/win_build_output/midl/google_update/x64/google_update_idl_i.c
similarity index 99%
rename from third_party/win_build_output/midl/google_update/google_update_idl_i.c
rename to third_party/win_build_output/midl/google_update/x64/google_update_idl_i.c
index 995ff61..2d5c757 100644
--- a/third_party/win_build_output/midl/google_update/google_update_idl_i.c
+++ b/third_party/win_build_output/midl/google_update/x64/google_update_idl_i.c
@@ -6,7 +6,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../google_update/google_update_idl.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/google_update/google_update_idl_p.c b/third_party/win_build_output/midl/google_update/x64/google_update_idl_p.c
similarity index 99%
rename from third_party/win_build_output/midl/google_update/google_update_idl_p.c
rename to third_party/win_build_output/midl/google_update/x64/google_update_idl_p.c
index c4980af..2fba451 100644
--- a/third_party/win_build_output/midl/google_update/google_update_idl_p.c
+++ b/third_party/win_build_output/midl/google_update/x64/google_update_idl_p.c
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../google_update/google_update_idl.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/google_update/google_update_idl.dlldata.c b/third_party/win_build_output/midl/google_update/x86/google_update_idl.dlldata.c
similarity index 100%
copy from third_party/win_build_output/midl/google_update/google_update_idl.dlldata.c
copy to third_party/win_build_output/midl/google_update/x86/google_update_idl.dlldata.c
diff --git a/third_party/win_build_output/midl/google_update/google_update_idl.h b/third_party/win_build_output/midl/google_update/x86/google_update_idl.h
similarity index 99%
copy from third_party/win_build_output/midl/google_update/google_update_idl.h
copy to third_party/win_build_output/midl/google_update/x86/google_update_idl.h
index 5b5691aa..931f4bb 100644
--- a/third_party/win_build_output/midl/google_update/google_update_idl.h
+++ b/third_party/win_build_output/midl/google_update/x86/google_update_idl.h
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../google_update/google_update_idl.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/google_update/google_update_idl.tlb b/third_party/win_build_output/midl/google_update/x86/google_update_idl.tlb
similarity index 60%
copy from third_party/win_build_output/midl/google_update/google_update_idl.tlb
copy to third_party/win_build_output/midl/google_update/x86/google_update_idl.tlb
index 2ac4a0d..5deb697 100644
--- a/third_party/win_build_output/midl/google_update/google_update_idl.tlb
+++ b/third_party/win_build_output/midl/google_update/x86/google_update_idl.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/google_update/google_update_idl_i.c b/third_party/win_build_output/midl/google_update/x86/google_update_idl_i.c
similarity index 98%
copy from third_party/win_build_output/midl/google_update/google_update_idl_i.c
copy to third_party/win_build_output/midl/google_update/x86/google_update_idl_i.c
index 995ff61..3ed313a 100644
--- a/third_party/win_build_output/midl/google_update/google_update_idl_i.c
+++ b/third_party/win_build_output/midl/google_update/x86/google_update_idl_i.c
@@ -6,10 +6,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../google_update/google_update_idl.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/google_update/x86/google_update_idl_p.c b/third_party/win_build_output/midl/google_update/x86/google_update_idl_p.c
new file mode 100644
index 0000000..3c7da91a
--- /dev/null
+++ b/third_party/win_build_output/midl/google_update/x86/google_update_idl_p.c
@@ -0,0 +1,7546 @@
+

+

+/* this ALWAYS GENERATED file contains the proxy stub code */

+

+

+ /* File created by MIDL compiler version 8.01.0622 */

+/* at a redacted point in time

+ */

+/* Compiler settings for ../../google_update/google_update_idl.idl:

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

+    protocol : dce , ms_ext, c_ext, robust

+    error checks: allocation ref bounds_check enum stub_data 

+    VC __declspec() decoration level: 

+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)

+         DECLSPEC_UUID(), MIDL_INTERFACE()

+*/

+/* @@MIDL_FILE_HEADING(  ) */

+

+#if !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_)

+

+

+#pragma warning( disable: 4049 )  /* more than 64k source lines */

+#if _MSC_VER >= 1200

+#pragma warning(push)

+#endif

+

+#pragma warning( disable: 4211 )  /* redefine extern to static */

+#pragma warning( disable: 4232 )  /* dllimport identity*/

+#pragma warning( disable: 4024 )  /* array to pointer mapping*/

+#pragma warning( disable: 4152 )  /* function/data pointer conversion in expression */

+#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */

+

+#pragma optimize("", off ) 

+

+#define USE_STUBLESS_PROXY

+

+

+/* verify that the <rpcproxy.h> version is high enough to compile this file*/

+#ifndef __REDQ_RPCPROXY_H_VERSION__

+#define __REQUIRED_RPCPROXY_H_VERSION__ 475

+#endif

+

+

+#include "rpcproxy.h"

+#ifndef __RPCPROXY_H_VERSION__

+#error this stub requires an updated version of <rpcproxy.h>

+#endif /* __RPCPROXY_H_VERSION__ */

+

+

+#include "google_update_idl.h"

+

+#define TYPE_FORMAT_STRING_SIZE   1159                              

+#define PROC_FORMAT_STRING_SIZE   4885                              

+#define EXPR_FORMAT_STRING_SIZE   1                                 

+#define TRANSMIT_AS_TABLE_SIZE    0            

+#define WIRE_MARSHAL_TABLE_SIZE   2            

+

+typedef struct _google_update_idl_MIDL_TYPE_FORMAT_STRING

+    {

+    short          Pad;

+    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

+    } google_update_idl_MIDL_TYPE_FORMAT_STRING;

+

+typedef struct _google_update_idl_MIDL_PROC_FORMAT_STRING

+    {

+    short          Pad;

+    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

+    } google_update_idl_MIDL_PROC_FORMAT_STRING;

+

+typedef struct _google_update_idl_MIDL_EXPR_FORMAT_STRING

+    {

+    long          Pad;

+    unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

+    } google_update_idl_MIDL_EXPR_FORMAT_STRING;

+

+

+static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};

+

+

+extern const google_update_idl_MIDL_TYPE_FORMAT_STRING google_update_idl__MIDL_TypeFormatString;

+extern const google_update_idl_MIDL_PROC_FORMAT_STRING google_update_idl__MIDL_ProcFormatString;

+extern const google_update_idl_MIDL_EXPR_FORMAT_STRING google_update_idl__MIDL_ExprFormatString;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IGoogleUpdate3_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAppBundle_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAppBundle_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IApp_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IApp_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAppCommand_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAppCommand_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAppVersion_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAppVersion_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IPackage_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IPackage_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO ICurrentState_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IRegistrationUpdateHook_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IRegistrationUpdateHook_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO ICredentialDialog_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO ICredentialDialog_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IGoogleUpdate3Web_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IGoogleUpdate3WebSecurity_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3WebSecurity_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAppBundleWeb_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAppWeb_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAppCommandWeb_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAppVersionWeb_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAppVersionWeb_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO ICoCreateAsyncStatus_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO ICoCreateAsyncStatus_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO ICoCreateAsync_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO ICoCreateAsync_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IBrowserHttpRequest2_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IBrowserHttpRequest2_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IProcessLauncher_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IOneClickProcessLauncher_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IOneClickProcessLauncher_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IProgressWndEvents_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IProgressWndEvents_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IJobObserver_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IJobObserver_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IGoogleUpdate_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IGoogleUpdateCore_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IGoogleUpdateCore_ProxyInfo;

+

+

+extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];

+

+#if !defined(__RPC_WIN32__)

+#error  Invalid build platform for this stub.

+#endif

+

+#if !(TARGET_IS_NT50_OR_LATER)

+#error You need Windows 2000 or later to run this stub because it uses these features:

+#error   /robust command line switch.

+#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.

+#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.

+#endif

+

+

+static const google_update_idl_MIDL_PROC_FORMAT_STRING google_update_idl__MIDL_ProcFormatString =

+    {

+        0,

+        {

+

+	/* Procedure get_status */

+

+

+	/* Procedure get_stateValue */

+

+

+	/* Procedure get_Count */

+

+			0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/*  2 */	NdrFcLong( 0x0 ),	/* 0 */

+/*  6 */	NdrFcShort( 0x7 ),	/* 7 */

+/*  8 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 10 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 12 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 14 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 16 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 18 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 20 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 22 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppCommandWeb0000 */

+

+

+	/* Parameter __MIDL__ICurrentState0000 */

+

+

+	/* Parameter count */

+

+/* 24 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 26 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 28 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 30 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 32 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 34 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_Item */

+

+/* 36 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 38 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 42 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 44 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 46 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 48 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 50 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 52 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 54 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 56 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 58 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+/* 60 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 62 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 64 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter bundle */

+

+/* 66 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 68 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 70 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+/* 72 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 74 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 76 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_createdInstance */

+

+

+	/* Procedure get_nextVersionWeb */

+

+

+	/* Procedure createAppBundle */

+

+/* 78 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 80 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 84 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 86 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 88 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 90 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 92 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 94 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 96 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 98 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 100 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter instance */

+

+

+	/* Parameter next */

+

+

+	/* Parameter app_bundle */

+

+/* 102 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 104 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 106 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 108 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 110 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 112 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_version */

+

+

+	/* Procedure get_appId */

+

+

+	/* Procedure get_version */

+

+

+	/* Procedure get_displayName */

+

+/* 114 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 116 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 120 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 122 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 124 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 126 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 128 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 130 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 132 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 134 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 136 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppVersionWeb0000 */

+

+

+	/* Parameter __MIDL__IAppWeb0000 */

+

+

+	/* Parameter __MIDL__IAppVersion0000 */

+

+

+	/* Parameter __MIDL__IAppBundle0000 */

+

+/* 138 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 140 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 142 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 144 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 146 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 148 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure createInstalledApp */

+

+

+	/* Procedure put_displayName */

+

+/* 150 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 152 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 156 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 158 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 160 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 162 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 164 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 166 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 168 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 170 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 172 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_id */

+

+

+	/* Parameter __MIDL__IAppBundle0001 */

+

+/* 174 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 176 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 178 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 180 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 182 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 184 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_filename */

+

+

+	/* Procedure get_appId */

+

+

+	/* Procedure get_displayLanguage */

+

+/* 186 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 188 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 192 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 194 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 196 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 198 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 200 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 202 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 204 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 206 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 208 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IPackage0001 */

+

+

+	/* Parameter __MIDL__IApp0000 */

+

+

+	/* Parameter __MIDL__IAppBundle0002 */

+

+/* 210 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 212 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 214 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 216 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 218 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 220 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_displayLanguage */

+

+/* 222 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 224 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 228 */	NdrFcShort( 0xa ),	/* 10 */

+/* 230 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 232 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 234 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 236 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 238 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 240 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 242 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 244 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppBundle0003 */

+

+/* 246 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 248 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 250 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 252 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 254 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 256 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_installSource */

+

+/* 258 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 260 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 264 */	NdrFcShort( 0xb ),	/* 11 */

+/* 266 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 268 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 270 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 272 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 274 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 276 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 278 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 280 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppBundle0004 */

+

+/* 282 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 284 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 286 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 288 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 290 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 292 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_installSource */

+

+/* 294 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 296 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 300 */	NdrFcShort( 0xc ),	/* 12 */

+/* 302 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 304 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 306 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 308 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 310 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 312 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 314 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 316 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppBundle0005 */

+

+/* 318 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 320 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 322 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 324 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 326 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 328 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_originURL */

+

+/* 330 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 332 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 336 */	NdrFcShort( 0xd ),	/* 13 */

+/* 338 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 340 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 342 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 344 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 346 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 348 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 350 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 352 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppBundle0006 */

+

+/* 354 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 356 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 358 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 360 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 362 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 364 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_originURL */

+

+/* 366 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 368 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 372 */	NdrFcShort( 0xe ),	/* 14 */

+/* 374 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 376 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 378 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 380 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 382 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 384 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 386 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 388 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppBundle0007 */

+

+/* 390 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 392 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 394 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 396 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 398 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 400 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_offlineDirectory */

+

+/* 402 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 404 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 408 */	NdrFcShort( 0xf ),	/* 15 */

+/* 410 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 412 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 414 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 416 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 418 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 420 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 422 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 424 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offline_dir */

+

+/* 426 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 428 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 430 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 432 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 434 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 436 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_offlineDirectory */

+

+/* 438 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 440 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 444 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 446 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 448 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 450 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 452 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 454 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 456 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 458 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 460 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offline_dir */

+

+/* 462 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 464 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 466 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 468 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 470 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 472 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_sessionId */

+

+/* 474 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 476 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 480 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 482 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 484 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 486 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 488 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 490 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 492 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 494 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 496 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter session_id */

+

+/* 498 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 500 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 502 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 504 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 506 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 508 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_sessionId */

+

+/* 510 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 512 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 516 */	NdrFcShort( 0x12 ),	/* 18 */

+/* 518 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 520 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 522 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 524 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 526 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 528 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 530 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 532 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter session_id */

+

+/* 534 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 536 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 538 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 540 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 542 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 544 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_sendPings */

+

+/* 546 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 548 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 552 */	NdrFcShort( 0x13 ),	/* 19 */

+/* 554 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 556 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 558 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 560 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 562 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 564 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 566 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 568 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter send_pings */

+

+/* 570 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 572 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 574 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 576 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 578 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 580 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_sendPings */

+

+/* 582 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 584 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 588 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 590 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 592 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 594 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 596 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 598 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 600 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 602 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 604 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter send_pings */

+

+/* 606 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 608 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 610 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 612 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 614 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 616 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_priority */

+

+/* 618 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 620 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 624 */	NdrFcShort( 0x15 ),	/* 21 */

+/* 626 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 628 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 630 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 632 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 634 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 636 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 638 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 640 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter priority */

+

+/* 642 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 644 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 646 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 648 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 650 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 652 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_priority */

+

+/* 654 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 656 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 660 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 662 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 664 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 666 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 668 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 670 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 672 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 674 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 676 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter priority */

+

+/* 678 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 680 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 682 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 684 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 686 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 688 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_postInstallAction */

+

+

+	/* Procedure get_Count */

+

+/* 690 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 692 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 696 */	NdrFcShort( 0x17 ),	/* 23 */

+/* 698 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 700 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 702 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 704 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 706 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 708 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 710 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 712 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0015 */

+

+

+	/* Parameter count */

+

+/* 714 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 716 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 718 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 720 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 722 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 724 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_Item */

+

+/* 726 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 728 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 732 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 734 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 736 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 738 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 740 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 742 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 744 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 746 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 748 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+/* 750 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 752 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 754 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter app */

+

+/* 756 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 758 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 760 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+/* 762 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 764 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 766 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_altTokens */

+

+/* 768 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 770 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 774 */	NdrFcShort( 0x19 ),	/* 25 */

+/* 776 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 778 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 780 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 782 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 784 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 786 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 788 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 790 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter impersonation_token */

+

+/* 792 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 794 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 796 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter primary_token */

+

+/* 798 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 800 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 802 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter caller_proc_id */

+

+/* 804 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 806 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 808 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 810 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 812 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 814 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_parentHWND */

+

+/* 816 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 818 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 822 */	NdrFcShort( 0x1a ),	/* 26 */

+/* 824 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 826 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 828 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 830 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 832 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 834 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 836 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 838 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter hwnd */

+

+/* 840 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 842 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 844 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 846 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 848 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 850 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure initialize */

+

+/* 852 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 854 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 858 */	NdrFcShort( 0x1b ),	/* 27 */

+/* 860 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 862 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 864 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 866 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 868 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 870 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 872 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 874 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 876 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 878 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 880 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_command */

+

+

+	/* Procedure createApp */

+

+/* 882 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 884 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 888 */	NdrFcShort( 0x1c ),	/* 28 */

+/* 890 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 892 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 894 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 896 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 898 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 900 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 902 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 904 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter command_id */

+

+

+	/* Parameter app_id */

+

+/* 906 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 908 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 910 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter command */

+

+

+	/* Parameter app */

+

+/* 912 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 914 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 916 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 918 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 920 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 922 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure createInstalledApp */

+

+/* 924 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 926 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 930 */	NdrFcShort( 0x1d ),	/* 29 */

+/* 932 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 934 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 936 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 938 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 940 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 942 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 944 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 946 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_id */

+

+/* 948 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 950 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 952 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter app */

+

+/* 954 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 956 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 958 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+/* 960 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 962 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 964 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure createAllInstalledApps */

+

+/* 966 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 968 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 972 */	NdrFcShort( 0x1e ),	/* 30 */

+/* 974 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 976 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 978 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 980 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 982 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 984 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 986 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 988 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 990 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 992 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 994 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure checkForUpdate */

+

+/* 996 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 998 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1002 */	NdrFcShort( 0x1f ),	/* 31 */

+/* 1004 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1006 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1008 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1010 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 1012 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1014 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1016 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1018 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 1020 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1022 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1024 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure download */

+

+/* 1026 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1028 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1032 */	NdrFcShort( 0x20 ),	/* 32 */

+/* 1034 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1036 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1038 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1040 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 1042 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1044 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1046 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1048 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 1050 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1052 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1054 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure install */

+

+/* 1056 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1058 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1062 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 1064 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1066 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1068 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1070 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 1072 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1074 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1076 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1078 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 1080 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1082 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1084 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure updateAllApps */

+

+/* 1086 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1088 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1092 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 1094 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1096 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1098 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1100 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 1102 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1104 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1106 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1108 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 1110 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1112 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1114 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure stop */

+

+/* 1116 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1118 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1122 */	NdrFcShort( 0x23 ),	/* 35 */

+/* 1124 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1126 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1128 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1130 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 1132 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1134 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1136 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1138 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 1140 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1142 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1144 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure pause */

+

+/* 1146 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1148 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1152 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 1154 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1156 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1158 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1160 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 1162 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1164 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1166 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1168 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 1170 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1172 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1174 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure resume */

+

+/* 1176 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1178 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1182 */	NdrFcShort( 0x25 ),	/* 37 */

+/* 1184 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1186 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1188 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1190 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 1192 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1194 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1196 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1198 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 1200 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1202 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1204 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure isBusy */

+

+/* 1206 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1208 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1212 */	NdrFcShort( 0x26 ),	/* 38 */

+/* 1214 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1216 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1218 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 1220 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 1222 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1224 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1226 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1228 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter is_busy */

+

+/* 1230 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1232 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1234 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1236 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1238 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1240 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure downloadPackage */

+

+/* 1242 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1244 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1248 */	NdrFcShort( 0x27 ),	/* 39 */

+/* 1250 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1252 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1254 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1256 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 1258 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1260 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1262 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1264 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_id */

+

+/* 1266 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1268 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1270 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter package_name */

+

+/* 1272 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1274 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1276 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1278 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1280 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1282 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_currentState */

+

+/* 1284 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1286 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1290 */	NdrFcShort( 0x28 ),	/* 40 */

+/* 1292 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1294 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1296 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1298 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1300 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1302 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1304 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1306 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter current_state */

+

+/* 1308 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 1310 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1312 */	NdrFcShort( 0x42c ),	/* Type Offset=1068 */

+

+	/* Return value */

+

+/* 1314 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1316 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1318 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure createAppBundleWeb */

+

+

+	/* Procedure get_currentVersion */

+

+/* 1320 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1322 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1326 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 1328 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1330 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1332 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1334 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1336 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1338 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1340 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1342 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_bundle_web */

+

+

+	/* Parameter current */

+

+/* 1344 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 1346 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1348 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1350 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1352 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1354 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_currentVersionWeb */

+

+

+	/* Procedure get_nextVersion */

+

+/* 1356 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1358 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1362 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1364 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1366 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1368 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1370 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1372 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1374 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1376 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1378 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter current */

+

+

+	/* Parameter next */

+

+/* 1380 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 1382 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1384 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1386 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1388 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1390 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_displayLanguage */

+

+

+	/* Procedure get_displayName */

+

+/* 1392 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1394 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1398 */	NdrFcShort( 0xa ),	/* 10 */

+/* 1400 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1402 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1404 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1406 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1408 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1410 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1412 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1414 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppBundleWeb0000 */

+

+

+	/* Parameter __MIDL__IApp0001 */

+

+/* 1416 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1418 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1420 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1422 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1424 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1426 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_displayLanguage */

+

+

+	/* Procedure put_displayName */

+

+/* 1428 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1430 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1434 */	NdrFcShort( 0xb ),	/* 11 */

+/* 1436 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1438 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1440 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1442 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1444 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1446 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1448 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1450 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IAppBundleWeb0001 */

+

+

+	/* Parameter __MIDL__IApp0002 */

+

+/* 1452 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1454 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1456 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1458 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1460 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1462 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_language */

+

+/* 1464 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1466 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1470 */	NdrFcShort( 0xc ),	/* 12 */

+/* 1472 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1474 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1476 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1478 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1480 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1482 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1484 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1486 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0003 */

+

+/* 1488 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1490 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1492 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 1494 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1496 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1498 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_language */

+

+/* 1500 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1502 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1506 */	NdrFcShort( 0xd ),	/* 13 */

+/* 1508 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1510 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1512 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1514 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1516 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1518 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1520 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1522 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0004 */

+

+/* 1524 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1526 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1528 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1530 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1532 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1534 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_ap */

+

+/* 1536 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1538 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1542 */	NdrFcShort( 0xe ),	/* 14 */

+/* 1544 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1546 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1548 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1550 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1552 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1554 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1556 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1558 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0005 */

+

+/* 1560 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1562 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1564 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 1566 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1568 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1570 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_ap */

+

+/* 1572 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1574 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1578 */	NdrFcShort( 0xf ),	/* 15 */

+/* 1580 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1582 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1584 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1586 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1588 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1590 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1592 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1594 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0006 */

+

+/* 1596 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1598 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1600 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1602 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1604 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1606 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_ttToken */

+

+/* 1608 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1610 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1614 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1616 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1618 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1620 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1622 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1624 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1626 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1628 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1630 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0007 */

+

+/* 1632 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1634 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1636 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 1638 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1640 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1642 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_ttToken */

+

+/* 1644 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1646 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1650 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 1652 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1654 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1656 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1658 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1660 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1662 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1664 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1666 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0008 */

+

+/* 1668 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1670 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1672 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1674 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1676 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1678 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_completionMessage */

+

+

+	/* Procedure get_iid */

+

+/* 1680 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1682 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1686 */	NdrFcShort( 0x12 ),	/* 18 */

+/* 1688 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1690 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1692 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1694 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1696 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1698 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1700 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1702 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0010 */

+

+

+	/* Parameter __MIDL__IApp0009 */

+

+/* 1704 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1706 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1708 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1710 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1712 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1714 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_iid */

+

+/* 1716 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1718 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1722 */	NdrFcShort( 0x13 ),	/* 19 */

+/* 1724 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1726 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1728 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1730 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1732 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1734 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1736 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1738 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0010 */

+

+/* 1740 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1742 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1744 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1746 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1748 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1750 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_brandCode */

+

+/* 1752 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1754 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1758 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 1760 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1762 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1764 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1766 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1768 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1770 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1772 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1774 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0011 */

+

+/* 1776 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1778 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1780 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 1782 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1784 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1786 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_brandCode */

+

+/* 1788 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1790 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1794 */	NdrFcShort( 0x15 ),	/* 21 */

+/* 1796 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1798 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1800 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1802 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1804 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1806 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1808 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1810 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0012 */

+

+/* 1812 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1814 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1816 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1818 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1820 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1822 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_postInstallUrl */

+

+

+	/* Procedure get_clientId */

+

+/* 1824 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1826 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1830 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 1832 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1834 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1836 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1838 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1840 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1842 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1844 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1846 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0014 */

+

+

+	/* Parameter __MIDL__IApp0013 */

+

+/* 1848 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1850 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1852 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1854 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1856 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1858 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_clientId */

+

+/* 1860 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1862 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1866 */	NdrFcShort( 0x17 ),	/* 23 */

+/* 1868 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1870 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1872 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1874 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1876 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1878 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1880 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1882 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0014 */

+

+/* 1884 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1886 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1888 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1890 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1892 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1894 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_labels */

+

+/* 1896 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1898 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1902 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 1904 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1906 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1908 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1910 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1912 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1914 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1916 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1918 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0015 */

+

+/* 1920 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1922 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1924 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 1926 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1928 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1930 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_labels */

+

+/* 1932 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1934 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1938 */	NdrFcShort( 0x19 ),	/* 25 */

+/* 1940 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1942 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1944 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1946 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1948 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1950 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1952 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1954 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0016 */

+

+/* 1956 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1958 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1960 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 1962 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1964 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1966 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_referralId */

+

+/* 1968 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1970 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1974 */	NdrFcShort( 0x1a ),	/* 26 */

+/* 1976 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1978 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1980 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1982 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1984 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1986 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1988 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1990 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0017 */

+

+/* 1992 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1994 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1996 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 1998 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2000 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2002 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_referralId */

+

+/* 2004 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2006 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2010 */	NdrFcShort( 0x1b ),	/* 27 */

+/* 2012 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2014 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2016 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2018 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2020 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2022 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2024 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2026 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0018 */

+

+/* 2028 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2030 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2032 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 2034 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2036 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2038 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_browserType */

+

+/* 2040 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2042 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2046 */	NdrFcShort( 0x1d ),	/* 29 */

+/* 2048 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2050 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2052 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2054 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2056 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2058 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2060 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2062 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0019 */

+

+/* 2064 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2066 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2068 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2070 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2072 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2074 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_browserType */

+

+/* 2076 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2078 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2082 */	NdrFcShort( 0x1e ),	/* 30 */

+/* 2084 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2086 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2088 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2090 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2092 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2094 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2096 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2098 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0020 */

+

+/* 2100 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2102 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2104 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2106 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2108 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2110 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_clientInstallData */

+

+/* 2112 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2114 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2118 */	NdrFcShort( 0x1f ),	/* 31 */

+/* 2120 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2122 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2124 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2126 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2128 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2130 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2132 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2134 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0021 */

+

+/* 2136 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 2138 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2140 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 2142 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2144 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2146 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_clientInstallData */

+

+/* 2148 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2150 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2154 */	NdrFcShort( 0x20 ),	/* 32 */

+/* 2156 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2158 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2160 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2162 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2164 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2166 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2168 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2170 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0022 */

+

+/* 2172 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2174 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2176 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 2178 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2180 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2182 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_serverInstallDataIndex */

+

+/* 2184 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2186 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2190 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 2192 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2194 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2196 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2198 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2200 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2202 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2204 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2206 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0023 */

+

+/* 2208 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 2210 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2212 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 2214 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2216 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2218 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_serverInstallDataIndex */

+

+/* 2220 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2222 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2226 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 2228 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2230 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2232 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2234 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2236 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2238 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2240 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2242 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0024 */

+

+/* 2244 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2246 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2248 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 2250 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2252 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2254 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isEulaAccepted */

+

+/* 2256 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2258 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2262 */	NdrFcShort( 0x23 ),	/* 35 */

+/* 2264 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2266 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2268 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 2270 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2272 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2274 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2276 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2278 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0025 */

+

+/* 2280 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2282 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2284 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2286 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2288 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2290 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_isEulaAccepted */

+

+/* 2292 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2294 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2298 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2300 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2302 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 2304 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2306 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2308 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2310 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2312 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2314 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0026 */

+

+/* 2316 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2318 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2320 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2322 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2324 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2326 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_usageStatsEnable */

+

+/* 2328 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2330 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2334 */	NdrFcShort( 0x25 ),	/* 37 */

+/* 2336 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2338 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2340 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2342 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2344 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2346 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2348 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2350 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0027 */

+

+/* 2352 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2354 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2356 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2358 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2360 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2362 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_usageStatsEnable */

+

+/* 2364 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2366 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2370 */	NdrFcShort( 0x26 ),	/* 38 */

+/* 2372 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2374 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2376 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2378 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2380 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2382 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2384 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2386 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0028 */

+

+/* 2388 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2390 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2392 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2394 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2396 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2398 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_installTimeDiffSec */

+

+/* 2400 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2402 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2406 */	NdrFcShort( 0x27 ),	/* 39 */

+/* 2408 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2410 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2412 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2414 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2416 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2418 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2420 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2422 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0029 */

+

+/* 2424 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2426 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2428 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2430 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2432 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2434 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_currentState */

+

+/* 2436 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2438 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2442 */	NdrFcShort( 0x28 ),	/* 40 */

+/* 2444 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2446 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2448 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2450 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2452 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2454 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2456 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2458 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IApp0030 */

+

+/* 2460 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 2462 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2464 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+/* 2466 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2468 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2470 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isDone */

+

+

+	/* Procedure get_isWebAccessible */

+

+/* 2472 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2474 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2478 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 2480 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2482 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2484 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 2486 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2488 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2490 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2492 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2494 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter is_done */

+

+

+	/* Parameter __MIDL__IAppCommand0000 */

+

+/* 2496 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2498 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2500 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 2502 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2504 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2506 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_completionHResult */

+

+

+	/* Procedure get_packageCount */

+

+

+	/* Procedure get_exitCode */

+

+

+	/* Procedure get_packageCount */

+

+

+	/* Procedure get_status */

+

+/* 2508 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2510 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2514 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2516 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2518 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2520 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2522 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2524 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2526 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2528 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2530 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter hr */

+

+

+	/* Parameter count */

+

+

+	/* Parameter __MIDL__IAppCommandWeb0001 */

+

+

+	/* Parameter count */

+

+

+	/* Parameter __MIDL__IAppCommand0001 */

+

+/* 2532 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2534 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2536 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 2538 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2540 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2542 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_bytesDownloaded */

+

+

+	/* Procedure get_exitCode */

+

+/* 2544 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2546 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2550 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 2552 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2554 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2556 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2558 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2560 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2562 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2564 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2566 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0002 */

+

+

+	/* Parameter __MIDL__IAppCommand0002 */

+

+/* 2568 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2570 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2572 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 2574 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2576 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2578 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure execute */

+

+/* 2580 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2582 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2586 */	NdrFcShort( 0xa ),	/* 10 */

+/* 2588 */	NdrFcShort( 0x98 ),	/* x86 Stack size/offset = 152 */

+/* 2590 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2592 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2594 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0xa,		/* 10 */

+/* 2596 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2598 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2600 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2602 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter arg1 */

+

+/* 2604 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2606 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2608 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg2 */

+

+/* 2610 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2612 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2614 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg3 */

+

+/* 2616 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2618 */	NdrFcShort( 0x24 ),	/* x86 Stack size/offset = 36 */

+/* 2620 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg4 */

+

+/* 2622 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2624 */	NdrFcShort( 0x34 ),	/* x86 Stack size/offset = 52 */

+/* 2626 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg5 */

+

+/* 2628 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2630 */	NdrFcShort( 0x44 ),	/* x86 Stack size/offset = 68 */

+/* 2632 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg6 */

+

+/* 2634 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2636 */	NdrFcShort( 0x54 ),	/* x86 Stack size/offset = 84 */

+/* 2638 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg7 */

+

+/* 2640 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2642 */	NdrFcShort( 0x64 ),	/* x86 Stack size/offset = 100 */

+/* 2644 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg8 */

+

+/* 2646 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2648 */	NdrFcShort( 0x74 ),	/* x86 Stack size/offset = 116 */

+/* 2650 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg9 */

+

+/* 2652 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2654 */	NdrFcShort( 0x84 ),	/* x86 Stack size/offset = 132 */

+/* 2656 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Return value */

+

+/* 2658 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2660 */	NdrFcShort( 0x94 ),	/* x86 Stack size/offset = 148 */

+/* 2662 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_packageWeb */

+

+

+	/* Procedure get_package */

+

+/* 2664 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2666 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2670 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 2672 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2674 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2676 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2678 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 2680 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2682 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2684 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2686 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+

+	/* Parameter index */

+

+/* 2688 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2690 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2692 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter package */

+

+

+	/* Parameter package */

+

+/* 2694 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 2696 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2698 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 2700 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2702 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2704 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get */

+

+/* 2706 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2708 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2712 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 2714 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2716 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2718 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2720 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2722 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2724 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2726 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2728 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter dir */

+

+/* 2730 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2732 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2734 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 2736 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2738 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2740 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isAvailable */

+

+/* 2742 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2744 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2748 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2750 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2752 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2754 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 2756 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2758 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2760 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2762 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2764 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__IPackage0000 */

+

+/* 2766 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2768 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2770 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2772 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2774 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2776 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_availableVersion */

+

+/* 2778 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2780 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2784 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2786 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2788 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2790 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2792 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2794 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2796 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2798 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2800 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0001 */

+

+/* 2802 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 2804 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2806 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 2808 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2810 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2812 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_totalBytesToDownload */

+

+/* 2814 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2816 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2820 */	NdrFcShort( 0xa ),	/* 10 */

+/* 2822 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2824 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2826 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2828 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2830 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2832 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2834 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2836 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0003 */

+

+/* 2838 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2840 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2842 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2844 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2846 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2848 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_downloadTimeRemainingMs */

+

+/* 2850 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2852 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2856 */	NdrFcShort( 0xb ),	/* 11 */

+/* 2858 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2860 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2862 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2864 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2866 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2868 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2870 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2872 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0004 */

+

+/* 2874 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2876 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2878 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2880 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2882 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2884 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nextRetryTime */

+

+/* 2886 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2888 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2892 */	NdrFcShort( 0xc ),	/* 12 */

+/* 2894 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2896 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2898 */	NdrFcShort( 0x2c ),	/* 44 */

+/* 2900 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2902 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2904 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2906 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2908 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0005 */

+

+/* 2910 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2912 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2914 */	0xb,		/* FC_HYPER */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2916 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2918 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2920 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_length */

+

+

+	/* Procedure get_installProgress */

+

+/* 2922 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2924 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2928 */	NdrFcShort( 0xd ),	/* 13 */

+/* 2930 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2932 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2934 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2936 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2938 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2940 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2942 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2944 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+

+	/* Parameter __MIDL__ICurrentState0006 */

+

+/* 2946 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2948 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2950 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 2952 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2954 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2956 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_installTimeRemainingMs */

+

+/* 2958 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2960 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2964 */	NdrFcShort( 0xe ),	/* 14 */

+/* 2966 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2968 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2970 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2972 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2974 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2976 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2978 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2980 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0007 */

+

+/* 2982 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2984 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2986 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2988 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2990 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2992 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isCanceled */

+

+/* 2994 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2996 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3000 */	NdrFcShort( 0xf ),	/* 15 */

+/* 3002 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3004 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3006 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 3008 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3010 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3012 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3014 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3016 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter is_canceled */

+

+/* 3018 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3020 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3022 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3024 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3026 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3028 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_errorCode */

+

+/* 3030 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3032 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3036 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3038 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3040 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3042 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3044 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3046 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3048 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3050 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3052 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0008 */

+

+/* 3054 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3056 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3058 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3060 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3062 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3064 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_extraCode1 */

+

+/* 3066 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3068 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3072 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 3074 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3076 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3078 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3080 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3082 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3084 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3086 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3088 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0009 */

+

+/* 3090 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3092 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3094 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3096 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3098 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3100 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_installerResultCode */

+

+/* 3102 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3104 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3108 */	NdrFcShort( 0x13 ),	/* 19 */

+/* 3110 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3112 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3114 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3116 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3118 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3120 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3122 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3124 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0011 */

+

+/* 3126 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3128 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3130 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3132 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3134 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3136 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_installerResultExtraCode1 */

+

+/* 3138 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3140 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3144 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 3146 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3148 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3150 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3152 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3154 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3156 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3158 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3160 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0012 */

+

+/* 3162 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3164 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3166 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3168 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3170 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3172 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_postInstallLaunchCommandLine */

+

+/* 3174 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3176 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3180 */	NdrFcShort( 0x15 ),	/* 21 */

+/* 3182 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3184 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3186 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3188 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 3190 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3192 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3194 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3196 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter __MIDL__ICurrentState0013 */

+

+/* 3198 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 3200 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3202 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 3204 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3206 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3208 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure UpdateRegistry */

+

+/* 3210 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3212 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3216 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 3218 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3220 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 3222 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3224 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3226 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 3228 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3230 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3232 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_id */

+

+/* 3234 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3236 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3238 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter is_machine */

+

+/* 3240 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3242 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3244 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3246 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3248 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3250 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure QueryUserForCredentials */

+

+/* 3252 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3254 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3258 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 3260 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 3262 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3264 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3266 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x6,		/* 6 */

+/* 3268 */	0x8,		/* 8 */

+			0x7,		/* Ext Flags:  new corr desc, clt corr check, srv corr check, */

+/* 3270 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3272 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3274 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter owner_hwnd */

+

+/* 3276 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3278 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3280 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter server */

+

+/* 3282 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3284 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3286 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter message */

+

+/* 3288 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3290 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3292 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter username */

+

+/* 3294 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 3296 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3298 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Parameter password */

+

+/* 3300 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 3302 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3304 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 3306 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3308 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 3310 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure setOriginURL */

+

+/* 3312 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3314 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3318 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 3320 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3322 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3324 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3326 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 3328 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 3330 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3332 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3334 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter origin_url */

+

+/* 3336 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3338 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3340 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 3342 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3344 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3346 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure createApp */

+

+/* 3348 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3350 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3354 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 3356 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 3358 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3360 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3362 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 3364 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 3366 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3368 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3370 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_guid */

+

+/* 3372 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3374 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3376 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter brand_code */

+

+/* 3378 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3380 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3382 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter language */

+

+/* 3384 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3386 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3388 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter ap */

+

+/* 3390 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3392 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3394 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 3396 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3398 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3400 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnInstalling */

+

+

+	/* Procedure createAllInstalledApps */

+

+/* 3402 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3404 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3408 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 3410 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3412 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3414 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3416 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3418 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3420 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3422 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3424 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 3426 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3428 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3430 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure put_parentHWND */

+

+/* 3432 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3434 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3438 */	NdrFcShort( 0xc ),	/* 12 */

+/* 3440 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3442 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3444 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3446 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3448 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3450 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3452 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3454 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter hwnd */

+

+/* 3456 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3458 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3460 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3462 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3464 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3466 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_appWeb */

+

+/* 3468 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3470 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3474 */	NdrFcShort( 0xe ),	/* 14 */

+/* 3476 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3478 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3480 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3482 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3484 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3486 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3488 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3490 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+/* 3492 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3494 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3496 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter app_web */

+

+/* 3498 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3500 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3502 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+/* 3504 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3506 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3508 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure initialize */

+

+/* 3510 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3512 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3516 */	NdrFcShort( 0xf ),	/* 15 */

+/* 3518 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3520 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3522 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3524 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3526 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3528 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3530 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3532 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3534 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3536 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3538 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure checkForUpdate */

+

+/* 3540 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3542 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3546 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3548 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3550 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3552 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3554 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3556 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3558 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3560 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3562 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3564 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3566 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3568 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure download */

+

+/* 3570 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3572 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3576 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 3578 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3580 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3582 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3584 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3586 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3588 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3590 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3592 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3594 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3596 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3598 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure install */

+

+/* 3600 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3602 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3606 */	NdrFcShort( 0x12 ),	/* 18 */

+/* 3608 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3610 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3612 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3614 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3616 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3618 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3620 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3622 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3624 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3626 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3628 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure pause */

+

+/* 3630 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3632 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3636 */	NdrFcShort( 0x13 ),	/* 19 */

+/* 3638 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3640 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3642 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3644 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3646 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3648 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3650 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3652 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3654 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3656 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3658 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure resume */

+

+/* 3660 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3662 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3666 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 3668 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3670 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3672 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3674 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3676 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3678 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3680 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3682 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3684 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3686 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3688 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure cancel */

+

+/* 3690 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3692 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3696 */	NdrFcShort( 0x15 ),	/* 21 */

+/* 3698 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3700 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3702 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3704 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3706 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3708 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3710 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3712 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3714 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3716 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3718 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure downloadPackage */

+

+/* 3720 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3722 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3726 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 3728 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3730 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3732 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3734 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3736 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 3738 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3740 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3742 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_id */

+

+/* 3744 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3746 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3748 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter package_name */

+

+/* 3750 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3752 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3754 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Return value */

+

+/* 3756 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3758 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3760 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_currentState */

+

+/* 3762 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3764 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3768 */	NdrFcShort( 0x17 ),	/* 23 */

+/* 3770 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3772 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3774 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3776 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 3778 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3780 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3782 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3784 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter current_state */

+

+/* 3786 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 3788 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3790 */	NdrFcShort( 0x42c ),	/* Type Offset=1068 */

+

+	/* Return value */

+

+/* 3792 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3794 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3796 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_command */

+

+/* 3798 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3800 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3804 */	NdrFcShort( 0xa ),	/* 10 */

+/* 3806 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3808 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3810 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3812 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3814 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 3816 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3818 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3820 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter command_id */

+

+/* 3822 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3824 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3826 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter command */

+

+/* 3828 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3830 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3832 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+/* 3834 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3836 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3838 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure cancel */

+

+/* 3840 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3842 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3846 */	NdrFcShort( 0xb ),	/* 11 */

+/* 3848 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3850 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3852 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3854 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3856 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3858 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3860 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3862 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3864 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3866 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3868 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_currentState */

+

+/* 3870 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3872 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3876 */	NdrFcShort( 0xc ),	/* 12 */

+/* 3878 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3880 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3882 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3884 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 3886 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3888 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3890 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3892 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter current_state */

+

+/* 3894 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3896 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3898 */	NdrFcShort( 0x6 ),	/* Type Offset=6 */

+

+	/* Return value */

+

+/* 3900 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3902 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3904 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure launch */

+

+/* 3906 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3908 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3912 */	NdrFcShort( 0xd ),	/* 13 */

+/* 3914 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3916 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3918 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3920 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3922 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3924 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3926 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3928 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3930 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3932 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3934 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure uninstall */

+

+/* 3936 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3938 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3942 */	NdrFcShort( 0xe ),	/* 14 */

+/* 3944 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3946 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3948 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3950 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 3952 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3954 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3956 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3958 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 3960 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3962 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3964 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure execute */

+

+/* 3966 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3968 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3972 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 3974 */	NdrFcShort( 0x98 ),	/* x86 Stack size/offset = 152 */

+/* 3976 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3978 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3980 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0xa,		/* 10 */

+/* 3982 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 3984 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3986 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3988 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter arg1 */

+

+/* 3990 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3992 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3994 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg2 */

+

+/* 3996 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 3998 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 4000 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg3 */

+

+/* 4002 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4004 */	NdrFcShort( 0x24 ),	/* x86 Stack size/offset = 36 */

+/* 4006 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg4 */

+

+/* 4008 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4010 */	NdrFcShort( 0x34 ),	/* x86 Stack size/offset = 52 */

+/* 4012 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg5 */

+

+/* 4014 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4016 */	NdrFcShort( 0x44 ),	/* x86 Stack size/offset = 68 */

+/* 4018 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg6 */

+

+/* 4020 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4022 */	NdrFcShort( 0x54 ),	/* x86 Stack size/offset = 84 */

+/* 4024 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg7 */

+

+/* 4026 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4028 */	NdrFcShort( 0x64 ),	/* x86 Stack size/offset = 100 */

+/* 4030 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg8 */

+

+/* 4032 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4034 */	NdrFcShort( 0x74 ),	/* x86 Stack size/offset = 116 */

+/* 4036 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter arg9 */

+

+/* 4038 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4040 */	NdrFcShort( 0x84 ),	/* x86 Stack size/offset = 132 */

+/* 4042 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Return value */

+

+/* 4044 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4046 */	NdrFcShort( 0x94 ),	/* x86 Stack size/offset = 148 */

+/* 4048 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure createOmahaMachineServerAsync */

+

+/* 4050 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4052 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4056 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 4058 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 4060 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4062 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4064 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 4066 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 4068 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4070 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4072 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter origin_url */

+

+/* 4074 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4076 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4078 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter create_elevated */

+

+/* 4080 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4082 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4084 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter status */

+

+/* 4086 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 4088 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4090 */	NdrFcShort( 0x448 ),	/* Type Offset=1096 */

+

+	/* Return value */

+

+/* 4092 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4094 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4096 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure Send */

+

+/* 4098 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4100 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4104 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 4106 */	NdrFcShort( 0x30 ),	/* x86 Stack size/offset = 48 */

+/* 4108 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4110 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4112 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x8,		/* 8 */

+/* 4114 */	0x8,		/* 8 */

+			0x7,		/* Ext Flags:  new corr desc, clt corr check, srv corr check, */

+/* 4116 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4118 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4120 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter url */

+

+/* 4122 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4124 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4126 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter post_data */

+

+/* 4128 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4130 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4132 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter request_headers */

+

+/* 4134 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4136 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4138 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter response_headers_needed */

+

+/* 4140 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 4142 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4144 */	NdrFcShort( 0x43a ),	/* Type Offset=1082 */

+

+	/* Parameter response_headers */

+

+/* 4146 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 4148 */	NdrFcShort( 0x20 ),	/* x86 Stack size/offset = 32 */

+/* 4150 */	NdrFcShort( 0x42c ),	/* Type Offset=1068 */

+

+	/* Parameter response_code */

+

+/* 4152 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4154 */	NdrFcShort( 0x24 ),	/* x86 Stack size/offset = 36 */

+/* 4156 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter cache_filename */

+

+/* 4158 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 4160 */	NdrFcShort( 0x28 ),	/* x86 Stack size/offset = 40 */

+/* 4162 */	NdrFcShort( 0x3a ),	/* Type Offset=58 */

+

+	/* Return value */

+

+/* 4164 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4166 */	NdrFcShort( 0x2c ),	/* x86 Stack size/offset = 44 */

+/* 4168 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure LaunchCmdLine */

+

+/* 4170 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4172 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4176 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 4178 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4180 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4182 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4184 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4186 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4188 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4190 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4192 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter cmd_line */

+

+/* 4194 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4196 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4198 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Return value */

+

+/* 4200 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4202 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4204 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure LaunchBrowser */

+

+/* 4206 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4208 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4212 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 4214 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4216 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4218 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4220 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4222 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4224 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4226 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4228 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter browser_type */

+

+/* 4230 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4232 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4234 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter url */

+

+/* 4236 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4238 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4240 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Return value */

+

+/* 4242 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4244 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4246 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure LaunchCmdElevated */

+

+/* 4248 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4250 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4254 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 4256 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 4258 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4260 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4262 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 4264 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4266 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4268 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4270 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_guid */

+

+/* 4272 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4274 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4276 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Parameter cmd_id */

+

+/* 4278 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4280 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4282 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Parameter caller_proc_id */

+

+/* 4284 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4286 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4288 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter proc_handle */

+

+/* 4290 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4292 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4294 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4296 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4298 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 4300 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure LaunchAppCommand */

+

+/* 4302 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4304 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4308 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 4310 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4312 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4314 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4316 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4318 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4320 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4322 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4324 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_guid */

+

+/* 4326 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4328 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4330 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Parameter cmd_id */

+

+/* 4332 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4334 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4336 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Return value */

+

+/* 4338 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4340 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4342 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnShow */

+

+

+	/* Procedure DoClose */

+

+/* 4344 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4346 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4350 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 4352 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4354 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4356 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4358 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 4360 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4362 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4364 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4366 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 4368 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4370 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4372 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnCheckingForUpdate */

+

+

+	/* Procedure DoPause */

+

+/* 4374 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4376 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4380 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 4382 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4384 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4386 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4388 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 4390 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4392 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4394 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4396 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 4398 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4400 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4402 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure DoResume */

+

+/* 4404 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4406 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4410 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 4412 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4414 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4416 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4418 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 4420 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4422 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4424 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4426 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 4428 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4430 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4432 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnWaitingToDownload */

+

+

+	/* Procedure DoRestartBrowsers */

+

+/* 4434 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4436 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4440 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 4442 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4444 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4446 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4448 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 4450 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4452 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4454 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4456 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 4458 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4460 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4462 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure DoReboot */

+

+/* 4464 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4466 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4470 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 4472 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4474 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4476 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4478 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 4480 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4482 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4484 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4486 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 4488 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4490 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4492 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure DoLaunchBrowser */

+

+/* 4494 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4496 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4500 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4502 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4504 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4506 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4508 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4510 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4512 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4514 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4516 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter url */

+

+/* 4518 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4520 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4522 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Return value */

+

+/* 4524 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4526 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4528 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnUpdateAvailable */

+

+/* 4530 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4532 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4536 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 4538 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4540 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4542 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4544 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4546 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4548 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4550 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4552 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter version_string */

+

+/* 4554 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4556 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4558 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Return value */

+

+/* 4560 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4562 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4564 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnDownloading */

+

+/* 4566 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4568 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4572 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 4574 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4576 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 4578 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4580 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 4582 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4584 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4586 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4588 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter time_remaining_ms */

+

+/* 4590 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4592 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4594 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter pos */

+

+/* 4596 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4598 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4600 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4602 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4604 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4606 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnWaitingToInstall */

+

+/* 4608 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4610 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4614 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4616 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4618 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4620 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4622 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 4624 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4626 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4628 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4630 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 4632 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4634 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4636 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnPause */

+

+/* 4638 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4640 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4644 */	NdrFcShort( 0xa ),	/* 10 */

+/* 4646 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4648 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4650 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4652 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x1,		/* 1 */

+/* 4654 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4656 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4658 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4660 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Return value */

+

+/* 4662 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4664 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4666 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure OnComplete */

+

+/* 4668 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4670 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4674 */	NdrFcShort( 0xb ),	/* 11 */

+/* 4676 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4678 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 4680 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4682 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4684 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4686 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4688 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4690 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter code */

+

+/* 4692 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4694 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4696 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter completion_text */

+

+/* 4698 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4700 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4702 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Return value */

+

+/* 4704 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4706 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4708 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure SetEventSink */

+

+/* 4710 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4712 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4716 */	NdrFcShort( 0xc ),	/* 12 */

+/* 4718 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4720 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4722 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4724 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4726 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4728 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4730 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4732 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter ui_sink */

+

+/* 4734 */	NdrFcShort( 0xb ),	/* Flags:  must size, must free, in, */

+/* 4736 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4738 */	NdrFcShort( 0x462 ),	/* Type Offset=1122 */

+

+	/* Return value */

+

+/* 4740 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4742 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4744 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure CheckForUpdate */

+

+/* 4746 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4748 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4752 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 4754 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4756 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4758 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4760 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4762 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4764 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4766 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4768 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter guid */

+

+/* 4770 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4772 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4774 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Parameter observer */

+

+/* 4776 */	NdrFcShort( 0xb ),	/* Flags:  must size, must free, in, */

+/* 4778 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4780 */	NdrFcShort( 0x474 ),	/* Type Offset=1140 */

+

+	/* Return value */

+

+/* 4782 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4784 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4786 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure Update */

+

+/* 4788 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4790 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4794 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 4796 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4798 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4800 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4802 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4804 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4806 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4808 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4810 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter guid */

+

+/* 4812 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4814 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4816 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Parameter observer */

+

+/* 4818 */	NdrFcShort( 0xb ),	/* Flags:  must size, must free, in, */

+/* 4820 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4822 */	NdrFcShort( 0x474 ),	/* Type Offset=1140 */

+

+	/* Return value */

+

+/* 4824 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4826 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4828 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure LaunchCmdElevated */

+

+/* 4830 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4832 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4836 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 4838 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 4840 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4842 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4844 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 4846 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4848 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4850 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4852 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter app_guid */

+

+/* 4854 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4856 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4858 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Parameter cmd_id */

+

+/* 4860 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 4862 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4864 */	NdrFcShort( 0x460 ),	/* Type Offset=1120 */

+

+	/* Parameter caller_proc_id */

+

+/* 4866 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4868 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4870 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter proc_handle */

+

+/* 4872 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4874 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4876 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4878 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4880 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 4882 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+			0x0

+        }

+    };

+

+static const google_update_idl_MIDL_TYPE_FORMAT_STRING google_update_idl__MIDL_TypeFormatString =

+    {

+        0,

+        {

+			NdrFcShort( 0x0 ),	/* 0 */

+/*  2 */	

+			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */

+/*  4 */	0x8,		/* FC_LONG */

+			0x5c,		/* FC_PAD */

+/*  6 */	

+			0x11, 0x10,	/* FC_RP [pointer_deref] */

+/*  8 */	NdrFcShort( 0x2 ),	/* Offset= 2 (10) */

+/* 10 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 12 */	NdrFcLong( 0x20400 ),	/* 132096 */

+/* 16 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 18 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 20 */	0xc0,		/* 192 */

+			0x0,		/* 0 */

+/* 22 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 24 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 26 */	0x0,		/* 0 */

+			0x46,		/* 70 */

+/* 28 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/* 30 */	NdrFcShort( 0x1c ),	/* Offset= 28 (58) */

+/* 32 */	

+			0x13, 0x0,	/* FC_OP */

+/* 34 */	NdrFcShort( 0xe ),	/* Offset= 14 (48) */

+/* 36 */	

+			0x1b,		/* FC_CARRAY */

+			0x1,		/* 1 */

+/* 38 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 40 */	0x9,		/* Corr desc: FC_ULONG */

+			0x0,		/*  */

+/* 42 */	NdrFcShort( 0xfffc ),	/* -4 */

+/* 44 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 46 */	0x6,		/* FC_SHORT */

+			0x5b,		/* FC_END */

+/* 48 */	

+			0x17,		/* FC_CSTRUCT */

+			0x3,		/* 3 */

+/* 50 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 52 */	NdrFcShort( 0xfff0 ),	/* Offset= -16 (36) */

+/* 54 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 56 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 58 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 60 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 62 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 64 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 66 */	NdrFcShort( 0xffde ),	/* Offset= -34 (32) */

+/* 68 */	

+			0x12, 0x0,	/* FC_UP */

+/* 70 */	NdrFcShort( 0xffea ),	/* Offset= -22 (48) */

+/* 72 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 74 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 76 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 78 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 80 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (68) */

+/* 82 */	

+			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */

+/* 84 */	0x6,		/* FC_SHORT */

+			0x5c,		/* FC_PAD */

+/* 86 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/* 88 */	NdrFcShort( 0x3d4 ),	/* Offset= 980 (1068) */

+/* 90 */	

+			0x13, 0x0,	/* FC_OP */

+/* 92 */	NdrFcShort( 0x3bc ),	/* Offset= 956 (1048) */

+/* 94 */	

+			0x2b,		/* FC_NON_ENCAPSULATED_UNION */

+			0x9,		/* FC_ULONG */

+/* 96 */	0x7,		/* Corr desc: FC_USHORT */

+			0x0,		/*  */

+/* 98 */	NdrFcShort( 0xfff8 ),	/* -8 */

+/* 100 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 102 */	NdrFcShort( 0x2 ),	/* Offset= 2 (104) */

+/* 104 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 106 */	NdrFcShort( 0x2f ),	/* 47 */

+/* 108 */	NdrFcLong( 0x14 ),	/* 20 */

+/* 112 */	NdrFcShort( 0x800b ),	/* Simple arm type: FC_HYPER */

+/* 114 */	NdrFcLong( 0x3 ),	/* 3 */

+/* 118 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 120 */	NdrFcLong( 0x11 ),	/* 17 */

+/* 124 */	NdrFcShort( 0x8001 ),	/* Simple arm type: FC_BYTE */

+/* 126 */	NdrFcLong( 0x2 ),	/* 2 */

+/* 130 */	NdrFcShort( 0x8006 ),	/* Simple arm type: FC_SHORT */

+/* 132 */	NdrFcLong( 0x4 ),	/* 4 */

+/* 136 */	NdrFcShort( 0x800a ),	/* Simple arm type: FC_FLOAT */

+/* 138 */	NdrFcLong( 0x5 ),	/* 5 */

+/* 142 */	NdrFcShort( 0x800c ),	/* Simple arm type: FC_DOUBLE */

+/* 144 */	NdrFcLong( 0xb ),	/* 11 */

+/* 148 */	NdrFcShort( 0x8006 ),	/* Simple arm type: FC_SHORT */

+/* 150 */	NdrFcLong( 0xa ),	/* 10 */

+/* 154 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 156 */	NdrFcLong( 0x6 ),	/* 6 */

+/* 160 */	NdrFcShort( 0xe8 ),	/* Offset= 232 (392) */

+/* 162 */	NdrFcLong( 0x7 ),	/* 7 */

+/* 166 */	NdrFcShort( 0x800c ),	/* Simple arm type: FC_DOUBLE */

+/* 168 */	NdrFcLong( 0x8 ),	/* 8 */

+/* 172 */	NdrFcShort( 0xff74 ),	/* Offset= -140 (32) */

+/* 174 */	NdrFcLong( 0xd ),	/* 13 */

+/* 178 */	NdrFcShort( 0xdc ),	/* Offset= 220 (398) */

+/* 180 */	NdrFcLong( 0x9 ),	/* 9 */

+/* 184 */	NdrFcShort( 0xff52 ),	/* Offset= -174 (10) */

+/* 186 */	NdrFcLong( 0x2000 ),	/* 8192 */

+/* 190 */	NdrFcShort( 0xe2 ),	/* Offset= 226 (416) */

+/* 192 */	NdrFcLong( 0x24 ),	/* 36 */

+/* 196 */	NdrFcShort( 0x30a ),	/* Offset= 778 (974) */

+/* 198 */	NdrFcLong( 0x4024 ),	/* 16420 */

+/* 202 */	NdrFcShort( 0x304 ),	/* Offset= 772 (974) */

+/* 204 */	NdrFcLong( 0x4011 ),	/* 16401 */

+/* 208 */	NdrFcShort( 0x302 ),	/* Offset= 770 (978) */

+/* 210 */	NdrFcLong( 0x4002 ),	/* 16386 */

+/* 214 */	NdrFcShort( 0x300 ),	/* Offset= 768 (982) */

+/* 216 */	NdrFcLong( 0x4003 ),	/* 16387 */

+/* 220 */	NdrFcShort( 0x2fe ),	/* Offset= 766 (986) */

+/* 222 */	NdrFcLong( 0x4014 ),	/* 16404 */

+/* 226 */	NdrFcShort( 0x2fc ),	/* Offset= 764 (990) */

+/* 228 */	NdrFcLong( 0x4004 ),	/* 16388 */

+/* 232 */	NdrFcShort( 0x2fa ),	/* Offset= 762 (994) */

+/* 234 */	NdrFcLong( 0x4005 ),	/* 16389 */

+/* 238 */	NdrFcShort( 0x2f8 ),	/* Offset= 760 (998) */

+/* 240 */	NdrFcLong( 0x400b ),	/* 16395 */

+/* 244 */	NdrFcShort( 0x2e2 ),	/* Offset= 738 (982) */

+/* 246 */	NdrFcLong( 0x400a ),	/* 16394 */

+/* 250 */	NdrFcShort( 0x2e0 ),	/* Offset= 736 (986) */

+/* 252 */	NdrFcLong( 0x4006 ),	/* 16390 */

+/* 256 */	NdrFcShort( 0x2ea ),	/* Offset= 746 (1002) */

+/* 258 */	NdrFcLong( 0x4007 ),	/* 16391 */

+/* 262 */	NdrFcShort( 0x2e0 ),	/* Offset= 736 (998) */

+/* 264 */	NdrFcLong( 0x4008 ),	/* 16392 */

+/* 268 */	NdrFcShort( 0x2e2 ),	/* Offset= 738 (1006) */

+/* 270 */	NdrFcLong( 0x400d ),	/* 16397 */

+/* 274 */	NdrFcShort( 0x2e0 ),	/* Offset= 736 (1010) */

+/* 276 */	NdrFcLong( 0x4009 ),	/* 16393 */

+/* 280 */	NdrFcShort( 0x2de ),	/* Offset= 734 (1014) */

+/* 282 */	NdrFcLong( 0x6000 ),	/* 24576 */

+/* 286 */	NdrFcShort( 0x2dc ),	/* Offset= 732 (1018) */

+/* 288 */	NdrFcLong( 0x400c ),	/* 16396 */

+/* 292 */	NdrFcShort( 0x2da ),	/* Offset= 730 (1022) */

+/* 294 */	NdrFcLong( 0x10 ),	/* 16 */

+/* 298 */	NdrFcShort( 0x8002 ),	/* Simple arm type: FC_CHAR */

+/* 300 */	NdrFcLong( 0x12 ),	/* 18 */

+/* 304 */	NdrFcShort( 0x8006 ),	/* Simple arm type: FC_SHORT */

+/* 306 */	NdrFcLong( 0x13 ),	/* 19 */

+/* 310 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 312 */	NdrFcLong( 0x15 ),	/* 21 */

+/* 316 */	NdrFcShort( 0x800b ),	/* Simple arm type: FC_HYPER */

+/* 318 */	NdrFcLong( 0x16 ),	/* 22 */

+/* 322 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 324 */	NdrFcLong( 0x17 ),	/* 23 */

+/* 328 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 330 */	NdrFcLong( 0xe ),	/* 14 */

+/* 334 */	NdrFcShort( 0x2b8 ),	/* Offset= 696 (1030) */

+/* 336 */	NdrFcLong( 0x400e ),	/* 16398 */

+/* 340 */	NdrFcShort( 0x2bc ),	/* Offset= 700 (1040) */

+/* 342 */	NdrFcLong( 0x4010 ),	/* 16400 */

+/* 346 */	NdrFcShort( 0x2ba ),	/* Offset= 698 (1044) */

+/* 348 */	NdrFcLong( 0x4012 ),	/* 16402 */

+/* 352 */	NdrFcShort( 0x276 ),	/* Offset= 630 (982) */

+/* 354 */	NdrFcLong( 0x4013 ),	/* 16403 */

+/* 358 */	NdrFcShort( 0x274 ),	/* Offset= 628 (986) */

+/* 360 */	NdrFcLong( 0x4015 ),	/* 16405 */

+/* 364 */	NdrFcShort( 0x272 ),	/* Offset= 626 (990) */

+/* 366 */	NdrFcLong( 0x4016 ),	/* 16406 */

+/* 370 */	NdrFcShort( 0x268 ),	/* Offset= 616 (986) */

+/* 372 */	NdrFcLong( 0x4017 ),	/* 16407 */

+/* 376 */	NdrFcShort( 0x262 ),	/* Offset= 610 (986) */

+/* 378 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 382 */	NdrFcShort( 0x0 ),	/* Offset= 0 (382) */

+/* 384 */	NdrFcLong( 0x1 ),	/* 1 */

+/* 388 */	NdrFcShort( 0x0 ),	/* Offset= 0 (388) */

+/* 390 */	NdrFcShort( 0xffff ),	/* Offset= -1 (389) */

+/* 392 */	

+			0x15,		/* FC_STRUCT */

+			0x7,		/* 7 */

+/* 394 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 396 */	0xb,		/* FC_HYPER */

+			0x5b,		/* FC_END */

+/* 398 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 400 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 404 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 406 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 408 */	0xc0,		/* 192 */

+			0x0,		/* 0 */

+/* 410 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 412 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 414 */	0x0,		/* 0 */

+			0x46,		/* 70 */

+/* 416 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 418 */	NdrFcShort( 0x2 ),	/* Offset= 2 (420) */

+/* 420 */	

+			0x13, 0x0,	/* FC_OP */

+/* 422 */	NdrFcShort( 0x216 ),	/* Offset= 534 (956) */

+/* 424 */	

+			0x2a,		/* FC_ENCAPSULATED_UNION */

+			0x49,		/* 73 */

+/* 426 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 428 */	NdrFcShort( 0xa ),	/* 10 */

+/* 430 */	NdrFcLong( 0x8 ),	/* 8 */

+/* 434 */	NdrFcShort( 0x5a ),	/* Offset= 90 (524) */

+/* 436 */	NdrFcLong( 0xd ),	/* 13 */

+/* 440 */	NdrFcShort( 0x7e ),	/* Offset= 126 (566) */

+/* 442 */	NdrFcLong( 0x9 ),	/* 9 */

+/* 446 */	NdrFcShort( 0x9e ),	/* Offset= 158 (604) */

+/* 448 */	NdrFcLong( 0xc ),	/* 12 */

+/* 452 */	NdrFcShort( 0xc8 ),	/* Offset= 200 (652) */

+/* 454 */	NdrFcLong( 0x24 ),	/* 36 */

+/* 458 */	NdrFcShort( 0x124 ),	/* Offset= 292 (750) */

+/* 460 */	NdrFcLong( 0x800d ),	/* 32781 */

+/* 464 */	NdrFcShort( 0x140 ),	/* Offset= 320 (784) */

+/* 466 */	NdrFcLong( 0x10 ),	/* 16 */

+/* 470 */	NdrFcShort( 0x15a ),	/* Offset= 346 (816) */

+/* 472 */	NdrFcLong( 0x2 ),	/* 2 */

+/* 476 */	NdrFcShort( 0x174 ),	/* Offset= 372 (848) */

+/* 478 */	NdrFcLong( 0x3 ),	/* 3 */

+/* 482 */	NdrFcShort( 0x18e ),	/* Offset= 398 (880) */

+/* 484 */	NdrFcLong( 0x14 ),	/* 20 */

+/* 488 */	NdrFcShort( 0x1a8 ),	/* Offset= 424 (912) */

+/* 490 */	NdrFcShort( 0xffff ),	/* Offset= -1 (489) */

+/* 492 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 494 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 496 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 498 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 500 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 502 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 504 */	

+			0x48,		/* FC_VARIABLE_REPEAT */

+			0x49,		/* FC_FIXED_OFFSET */

+/* 506 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 508 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 510 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 512 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 514 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 516 */	0x13, 0x0,	/* FC_OP */

+/* 518 */	NdrFcShort( 0xfe2a ),	/* Offset= -470 (48) */

+/* 520 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 522 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 524 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 526 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 528 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 530 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 532 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 534 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 536 */	0x11, 0x0,	/* FC_RP */

+/* 538 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (492) */

+/* 540 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 542 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 544 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 546 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 548 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 550 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 552 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 554 */	NdrFcLong( 0xffffffff ),	/* -1 */

+/* 558 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 560 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 562 */	NdrFcShort( 0xff5c ),	/* Offset= -164 (398) */

+/* 564 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 566 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 568 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 570 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 572 */	NdrFcShort( 0x6 ),	/* Offset= 6 (578) */

+/* 574 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 576 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 578 */	

+			0x11, 0x0,	/* FC_RP */

+/* 580 */	NdrFcShort( 0xffdc ),	/* Offset= -36 (544) */

+/* 582 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 584 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 586 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 588 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 590 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 592 */	NdrFcLong( 0xffffffff ),	/* -1 */

+/* 596 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 598 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 600 */	NdrFcShort( 0xfdb2 ),	/* Offset= -590 (10) */

+/* 602 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 604 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 606 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 608 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 610 */	NdrFcShort( 0x6 ),	/* Offset= 6 (616) */

+/* 612 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 614 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 616 */	

+			0x11, 0x0,	/* FC_RP */

+/* 618 */	NdrFcShort( 0xffdc ),	/* Offset= -36 (582) */

+/* 620 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 622 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 624 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 626 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 628 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 630 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 632 */	

+			0x48,		/* FC_VARIABLE_REPEAT */

+			0x49,		/* FC_FIXED_OFFSET */

+/* 634 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 636 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 638 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 640 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 642 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 644 */	0x13, 0x0,	/* FC_OP */

+/* 646 */	NdrFcShort( 0x192 ),	/* Offset= 402 (1048) */

+/* 648 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 650 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 652 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 654 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 656 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 658 */	NdrFcShort( 0x6 ),	/* Offset= 6 (664) */

+/* 660 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 662 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 664 */	

+			0x11, 0x0,	/* FC_RP */

+/* 666 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (620) */

+/* 668 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 670 */	NdrFcLong( 0x2f ),	/* 47 */

+/* 674 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 676 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 678 */	0xc0,		/* 192 */

+			0x0,		/* 0 */

+/* 680 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 682 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 684 */	0x0,		/* 0 */

+			0x46,		/* 70 */

+/* 686 */	

+			0x1b,		/* FC_CARRAY */

+			0x0,		/* 0 */

+/* 688 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 690 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 692 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 694 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 696 */	0x1,		/* FC_BYTE */

+			0x5b,		/* FC_END */

+/* 698 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 700 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 702 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 704 */	NdrFcShort( 0xa ),	/* Offset= 10 (714) */

+/* 706 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 708 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 710 */	NdrFcShort( 0xffd6 ),	/* Offset= -42 (668) */

+/* 712 */	0x36,		/* FC_POINTER */

+			0x5b,		/* FC_END */

+/* 714 */	

+			0x13, 0x0,	/* FC_OP */

+/* 716 */	NdrFcShort( 0xffe2 ),	/* Offset= -30 (686) */

+/* 718 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 720 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 722 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 724 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 726 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 728 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 730 */	

+			0x48,		/* FC_VARIABLE_REPEAT */

+			0x49,		/* FC_FIXED_OFFSET */

+/* 732 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 734 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 736 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 738 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 740 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 742 */	0x13, 0x0,	/* FC_OP */

+/* 744 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (698) */

+/* 746 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 748 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 750 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 752 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 754 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 756 */	NdrFcShort( 0x6 ),	/* Offset= 6 (762) */

+/* 758 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 760 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 762 */	

+			0x11, 0x0,	/* FC_RP */

+/* 764 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (718) */

+/* 766 */	

+			0x1d,		/* FC_SMFARRAY */

+			0x0,		/* 0 */

+/* 768 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 770 */	0x1,		/* FC_BYTE */

+			0x5b,		/* FC_END */

+/* 772 */	

+			0x15,		/* FC_STRUCT */

+			0x3,		/* 3 */

+/* 774 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 776 */	0x8,		/* FC_LONG */

+			0x6,		/* FC_SHORT */

+/* 778 */	0x6,		/* FC_SHORT */

+			0x4c,		/* FC_EMBEDDED_COMPLEX */

+/* 780 */	0x0,		/* 0 */

+			NdrFcShort( 0xfff1 ),	/* Offset= -15 (766) */

+			0x5b,		/* FC_END */

+/* 784 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 786 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 788 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 790 */	NdrFcShort( 0xa ),	/* Offset= 10 (800) */

+/* 792 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 794 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 796 */	NdrFcShort( 0xffe8 ),	/* Offset= -24 (772) */

+/* 798 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 800 */	

+			0x11, 0x0,	/* FC_RP */

+/* 802 */	NdrFcShort( 0xfefe ),	/* Offset= -258 (544) */

+/* 804 */	

+			0x1b,		/* FC_CARRAY */

+			0x0,		/* 0 */

+/* 806 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 808 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 810 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 812 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 814 */	0x1,		/* FC_BYTE */

+			0x5b,		/* FC_END */

+/* 816 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 818 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 820 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 822 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 824 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 826 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 828 */	0x13, 0x0,	/* FC_OP */

+/* 830 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (804) */

+/* 832 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 834 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 836 */	

+			0x1b,		/* FC_CARRAY */

+			0x1,		/* 1 */

+/* 838 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 840 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 842 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 844 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 846 */	0x6,		/* FC_SHORT */

+			0x5b,		/* FC_END */

+/* 848 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 850 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 852 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 854 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 856 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 858 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 860 */	0x13, 0x0,	/* FC_OP */

+/* 862 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (836) */

+/* 864 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 866 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 868 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 870 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 872 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 874 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 876 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 878 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 880 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 882 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 884 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 886 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 888 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 890 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 892 */	0x13, 0x0,	/* FC_OP */

+/* 894 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (868) */

+/* 896 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 898 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 900 */	

+			0x1b,		/* FC_CARRAY */

+			0x7,		/* 7 */

+/* 902 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 904 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 906 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 908 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 910 */	0xb,		/* FC_HYPER */

+			0x5b,		/* FC_END */

+/* 912 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 914 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 916 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 918 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 920 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 922 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 924 */	0x13, 0x0,	/* FC_OP */

+/* 926 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (900) */

+/* 928 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 930 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 932 */	

+			0x15,		/* FC_STRUCT */

+			0x3,		/* 3 */

+/* 934 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 936 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 938 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 940 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 942 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 944 */	0x7,		/* Corr desc: FC_USHORT */

+			0x0,		/*  */

+/* 946 */	NdrFcShort( 0xffd8 ),	/* -40 */

+/* 948 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 950 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 952 */	NdrFcShort( 0xffec ),	/* Offset= -20 (932) */

+/* 954 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 956 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 958 */	NdrFcShort( 0x28 ),	/* 40 */

+/* 960 */	NdrFcShort( 0xffec ),	/* Offset= -20 (940) */

+/* 962 */	NdrFcShort( 0x0 ),	/* Offset= 0 (962) */

+/* 964 */	0x6,		/* FC_SHORT */

+			0x6,		/* FC_SHORT */

+/* 966 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 968 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 970 */	NdrFcShort( 0xfdde ),	/* Offset= -546 (424) */

+/* 972 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 974 */	

+			0x13, 0x0,	/* FC_OP */

+/* 976 */	NdrFcShort( 0xfeea ),	/* Offset= -278 (698) */

+/* 978 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 980 */	0x1,		/* FC_BYTE */

+			0x5c,		/* FC_PAD */

+/* 982 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 984 */	0x6,		/* FC_SHORT */

+			0x5c,		/* FC_PAD */

+/* 986 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 988 */	0x8,		/* FC_LONG */

+			0x5c,		/* FC_PAD */

+/* 990 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 992 */	0xb,		/* FC_HYPER */

+			0x5c,		/* FC_PAD */

+/* 994 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 996 */	0xa,		/* FC_FLOAT */

+			0x5c,		/* FC_PAD */

+/* 998 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1000 */	0xc,		/* FC_DOUBLE */

+			0x5c,		/* FC_PAD */

+/* 1002 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1004 */	NdrFcShort( 0xfd9c ),	/* Offset= -612 (392) */

+/* 1006 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1008 */	NdrFcShort( 0xfc30 ),	/* Offset= -976 (32) */

+/* 1010 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1012 */	NdrFcShort( 0xfd9a ),	/* Offset= -614 (398) */

+/* 1014 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1016 */	NdrFcShort( 0xfc12 ),	/* Offset= -1006 (10) */

+/* 1018 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1020 */	NdrFcShort( 0xfda4 ),	/* Offset= -604 (416) */

+/* 1022 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1024 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1026) */

+/* 1026 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1028 */	NdrFcShort( 0x14 ),	/* Offset= 20 (1048) */

+/* 1030 */	

+			0x15,		/* FC_STRUCT */

+			0x7,		/* 7 */

+/* 1032 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1034 */	0x6,		/* FC_SHORT */

+			0x1,		/* FC_BYTE */

+/* 1036 */	0x1,		/* FC_BYTE */

+			0x8,		/* FC_LONG */

+/* 1038 */	0xb,		/* FC_HYPER */

+			0x5b,		/* FC_END */

+/* 1040 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1042 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (1030) */

+/* 1044 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1046 */	0x2,		/* FC_CHAR */

+			0x5c,		/* FC_PAD */

+/* 1048 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x7,		/* 7 */

+/* 1050 */	NdrFcShort( 0x20 ),	/* 32 */

+/* 1052 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1054 */	NdrFcShort( 0x0 ),	/* Offset= 0 (1054) */

+/* 1056 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 1058 */	0x6,		/* FC_SHORT */

+			0x6,		/* FC_SHORT */

+/* 1060 */	0x6,		/* FC_SHORT */

+			0x6,		/* FC_SHORT */

+/* 1062 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1064 */	NdrFcShort( 0xfc36 ),	/* Offset= -970 (94) */

+/* 1066 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1068 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 1070 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1072 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1074 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1076 */	NdrFcShort( 0xfc26 ),	/* Offset= -986 (90) */

+/* 1078 */	

+			0x12, 0x0,	/* FC_UP */

+/* 1080 */	NdrFcShort( 0xffe0 ),	/* Offset= -32 (1048) */

+/* 1082 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 1084 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1086 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1088 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1090 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (1078) */

+/* 1092 */	

+			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */

+/* 1094 */	0xb,		/* FC_HYPER */

+			0x5c,		/* FC_PAD */

+/* 1096 */	

+			0x11, 0x10,	/* FC_RP [pointer_deref] */

+/* 1098 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1100) */

+/* 1100 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 1102 */	NdrFcLong( 0x2e629606 ),	/* 778212870 */

+/* 1106 */	NdrFcShort( 0x312a ),	/* 12586 */

+/* 1108 */	NdrFcShort( 0x482f ),	/* 18479 */

+/* 1110 */	0x9b,		/* 155 */

+			0x12,		/* 18 */

+/* 1112 */	0x2c,		/* 44 */

+			0x4a,		/* 74 */

+/* 1114 */	0xbf,		/* 191 */

+			0x6f,		/* 111 */

+/* 1116 */	0xb,		/* 11 */

+			0x6d,		/* 109 */

+/* 1118 */	

+			0x11, 0x8,	/* FC_RP [simple_pointer] */

+/* 1120 */	

+			0x25,		/* FC_C_WSTRING */

+			0x5c,		/* FC_PAD */

+/* 1122 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 1124 */	NdrFcLong( 0x1c642ced ),	/* 476327149 */

+/* 1128 */	NdrFcShort( 0xca3b ),	/* -13765 */

+/* 1130 */	NdrFcShort( 0x4013 ),	/* 16403 */

+/* 1132 */	0xa9,		/* 169 */

+			0xdf,		/* 223 */

+/* 1134 */	0xca,		/* 202 */

+			0x6c,		/* 108 */

+/* 1136 */	0xe5,		/* 229 */

+			0xff,		/* 255 */

+/* 1138 */	0x65,		/* 101 */

+			0x3,		/* 3 */

+/* 1140 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 1142 */	NdrFcLong( 0x49d7563b ),	/* 1238849083 */

+/* 1146 */	NdrFcShort( 0x2ddb ),	/* 11739 */

+/* 1148 */	NdrFcShort( 0x4831 ),	/* 18481 */

+/* 1150 */	0x88,		/* 136 */

+			0xc8,		/* 200 */

+/* 1152 */	0x76,		/* 118 */

+			0x8a,		/* 138 */

+/* 1154 */	0x53,		/* 83 */

+			0x83,		/* 131 */

+/* 1156 */	0x38,		/* 56 */

+			0x37,		/* 55 */

+

+			0x0

+        }

+    };

+

+static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] = 

+        {

+            

+            {

+            BSTR_UserSize

+            ,BSTR_UserMarshal

+            ,BSTR_UserUnmarshal

+            ,BSTR_UserFree

+            },

+            {

+            VARIANT_UserSize

+            ,VARIANT_UserMarshal

+            ,VARIANT_UserUnmarshal

+            ,VARIANT_UserFree

+            }

+

+        };

+

+

+

+/* Standard interface: __MIDL_itf_google_update_idl_0000_0000, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IUnknown, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */

+

+

+/* Object interface: IDispatch, ver. 0.0,

+   GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */

+

+

+/* Object interface: IGoogleUpdate3, ver. 0.0,

+   GUID={0x6DB17455,0x4E85,0x46e7,{0x9D,0x23,0xE5,0x55,0xE4,0xB0,0x05,0xAF}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IGoogleUpdate3_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    0,

+    36,

+    78

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate3_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IGoogleUpdate3_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate3_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(10) _IGoogleUpdate3ProxyVtbl = 

+{

+    &IGoogleUpdate3_ProxyInfo,

+    &IID_IGoogleUpdate3,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdate3::get_Count */ ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdate3::get_Item */ ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdate3::createAppBundle */

+};

+

+

+static const PRPC_STUB_FUNCTION IGoogleUpdate3_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IGoogleUpdate3StubVtbl =

+{

+    &IID_IGoogleUpdate3,

+    &IGoogleUpdate3_ServerInfo,

+    10,

+    &IGoogleUpdate3_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IAppBundle, ver. 0.0,

+   GUID={0xfe908cdd,0x22bb,0x472a,{0x98,0x70,0x1a,0x03,0x90,0xe4,0x2f,0x36}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAppBundle_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    114,

+    150,

+    186,

+    222,

+    258,

+    294,

+    330,

+    366,

+    402,

+    438,

+    474,

+    510,

+    546,

+    582,

+    618,

+    654,

+    690,

+    726,

+    768,

+    816,

+    852,

+    882,

+    924,

+    966,

+    996,

+    1026,

+    1056,

+    1086,

+    1116,

+    1146,

+    1176,

+    1206,

+    1242,

+    1284

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAppBundle_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppBundle_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAppBundle_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppBundle_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(41) _IAppBundleProxyVtbl = 

+{

+    &IAppBundle_ProxyInfo,

+    &IID_IAppBundle,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_displayName */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_displayName */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_displayLanguage */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_displayLanguage */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_installSource */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_installSource */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_originURL */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_originURL */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_offlineDirectory */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_offlineDirectory */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_sessionId */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_sessionId */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_sendPings */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_sendPings */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_priority */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_priority */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_Count */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_Item */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_altTokens */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::put_parentHWND */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::initialize */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::createApp */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::createInstalledApp */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::createAllInstalledApps */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::checkForUpdate */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::download */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::install */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::updateAllApps */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::stop */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::pause */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::resume */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::isBusy */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::downloadPackage */ ,

+    (void *) (INT_PTR) -1 /* IAppBundle::get_currentState */

+};

+

+

+static const PRPC_STUB_FUNCTION IAppBundle_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppBundleStubVtbl =

+{

+    &IID_IAppBundle,

+    &IAppBundle_ServerInfo,

+    41,

+    &IAppBundle_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IApp, ver. 0.0,

+   GUID={0x76F7B787,0xA67C,0x4c73,{0x82,0xC7,0x31,0xF5,0xE3,0xAA,0xBC,0x5C}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IApp_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    1320,

+    1356,

+    186,

+    1392,

+    1428,

+    1464,

+    1500,

+    1536,

+    1572,

+    1608,

+    1644,

+    1680,

+    1716,

+    1752,

+    1788,

+    1824,

+    1860,

+    1896,

+    1932,

+    1968,

+    2004,

+    882,

+    2040,

+    2076,

+    2112,

+    2148,

+    2184,

+    2220,

+    2256,

+    2292,

+    2328,

+    2364,

+    2400,

+    2436

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IApp_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IApp_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IApp_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IApp_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(41) _IAppProxyVtbl = 

+{

+    &IApp_ProxyInfo,

+    &IID_IApp,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_currentVersion */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_nextVersion */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_appId */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_displayName */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_displayName */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_language */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_language */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_ap */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_ap */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_ttToken */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_ttToken */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_iid */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_iid */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_brandCode */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_brandCode */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_clientId */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_clientId */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_labels */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_labels */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_referralId */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_referralId */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_command */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_browserType */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_browserType */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_clientInstallData */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_clientInstallData */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_serverInstallDataIndex */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_serverInstallDataIndex */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_isEulaAccepted */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_isEulaAccepted */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_usageStatsEnable */ ,

+    (void *) (INT_PTR) -1 /* IApp::put_usageStatsEnable */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_installTimeDiffSec */ ,

+    (void *) (INT_PTR) -1 /* IApp::get_currentState */

+};

+

+

+static const PRPC_STUB_FUNCTION IApp_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppStubVtbl =

+{

+    &IID_IApp,

+    &IApp_ServerInfo,

+    41,

+    &IApp_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IAppCommand, ver. 0.0,

+   GUID={0x4DE778FE,0xF195,0x4ee3,{0x9D,0xAB,0xFE,0x44,0x6C,0x23,0x92,0x21}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAppCommand_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    2472,

+    2508,

+    2544,

+    2580

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAppCommand_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppCommand_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAppCommand_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppCommand_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(11) _IAppCommandProxyVtbl = 

+{

+    &IAppCommand_ProxyInfo,

+    &IID_IAppCommand,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IAppCommand::get_isWebAccessible */ ,

+    (void *) (INT_PTR) -1 /* IAppCommand::get_status */ ,

+    (void *) (INT_PTR) -1 /* IAppCommand::get_exitCode */ ,

+    (void *) (INT_PTR) -1 /* IAppCommand::execute */

+};

+

+

+static const PRPC_STUB_FUNCTION IAppCommand_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppCommandStubVtbl =

+{

+    &IID_IAppCommand,

+    &IAppCommand_ServerInfo,

+    11,

+    &IAppCommand_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IAppVersion, ver. 0.0,

+   GUID={0xBCDCB538,0x01C0,0x46d1,{0xA6,0xA7,0x52,0xF4,0xD0,0x21,0xC2,0x72}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAppVersion_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    114,

+    2508,

+    2664

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAppVersion_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppVersion_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAppVersion_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppVersion_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(10) _IAppVersionProxyVtbl = 

+{

+    &IAppVersion_ProxyInfo,

+    &IID_IAppVersion,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IAppVersion::get_version */ ,

+    (void *) (INT_PTR) -1 /* IAppVersion::get_packageCount */ ,

+    (void *) (INT_PTR) -1 /* IAppVersion::get_package */

+};

+

+

+static const PRPC_STUB_FUNCTION IAppVersion_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppVersionStubVtbl =

+{

+    &IID_IAppVersion,

+    &IAppVersion_ServerInfo,

+    10,

+    &IAppVersion_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IPackage, ver. 0.0,

+   GUID={0xDCAB8386,0x4F03,0x4dbd,{0xA3,0x66,0xD9,0x0B,0xC9,0xF6,0x8D,0xE6}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IPackage_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    2706,

+    2742,

+    186

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IPackage_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IPackage_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IPackage_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IPackage_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(10) _IPackageProxyVtbl = 

+{

+    &IPackage_ProxyInfo,

+    &IID_IPackage,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IPackage::get */ ,

+    (void *) (INT_PTR) -1 /* IPackage::get_isAvailable */ ,

+    (void *) (INT_PTR) -1 /* IPackage::get_filename */

+};

+

+

+static const PRPC_STUB_FUNCTION IPackage_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IPackageStubVtbl =

+{

+    &IID_IPackage,

+    &IPackage_ServerInfo,

+    10,

+    &IPackage_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: ICurrentState, ver. 0.0,

+   GUID={0x247954F9,0x9EDC,0x4E68,{0x8C,0xC3,0x15,0x0C,0x2B,0x89,0xEA,0xDF}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short ICurrentState_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    0,

+    2778,

+    2544,

+    2814,

+    2850,

+    2886,

+    2922,

+    2958,

+    2994,

+    3030,

+    3066,

+    1680,

+    3102,

+    3138,

+    3174,

+    1824,

+    690

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICurrentState_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO ICurrentState_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICurrentState_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(24) _ICurrentStateProxyVtbl = 

+{

+    &ICurrentState_ProxyInfo,

+    &IID_ICurrentState,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_stateValue */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_availableVersion */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_bytesDownloaded */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_totalBytesToDownload */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_downloadTimeRemainingMs */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_nextRetryTime */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_installProgress */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_installTimeRemainingMs */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_isCanceled */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_errorCode */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_extraCode1 */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_completionMessage */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_installerResultCode */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_installerResultExtraCode1 */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_postInstallLaunchCommandLine */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_postInstallUrl */ ,

+    (void *) (INT_PTR) -1 /* ICurrentState::get_postInstallAction */

+};

+

+

+static const PRPC_STUB_FUNCTION ICurrentState_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _ICurrentStateStubVtbl =

+{

+    &IID_ICurrentState,

+    &ICurrentState_ServerInfo,

+    24,

+    &ICurrentState_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IRegistrationUpdateHook, ver. 0.0,

+   GUID={0x4E223325,0xC16B,0x4eeb,{0xAE,0xDC,0x19,0xAA,0x99,0xA2,0x37,0xFA}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IRegistrationUpdateHook_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    3210

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IRegistrationUpdateHook_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IRegistrationUpdateHook_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IRegistrationUpdateHook_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IRegistrationUpdateHook_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(8) _IRegistrationUpdateHookProxyVtbl = 

+{

+    &IRegistrationUpdateHook_ProxyInfo,

+    &IID_IRegistrationUpdateHook,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IRegistrationUpdateHook::UpdateRegistry */

+};

+

+

+static const PRPC_STUB_FUNCTION IRegistrationUpdateHook_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IRegistrationUpdateHookStubVtbl =

+{

+    &IID_IRegistrationUpdateHook,

+    &IRegistrationUpdateHook_ServerInfo,

+    8,

+    &IRegistrationUpdateHook_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: ICredentialDialog, ver. 0.0,

+   GUID={0xb3a47570,0x0a85,0x4aea,{0x82,0x70,0x52,0x9d,0x47,0x89,0x96,0x03}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short ICredentialDialog_FormatStringOffsetTable[] =

+    {

+    3252

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO ICredentialDialog_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICredentialDialog_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO ICredentialDialog_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICredentialDialog_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(4) _ICredentialDialogProxyVtbl = 

+{

+    &ICredentialDialog_ProxyInfo,

+    &IID_ICredentialDialog,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* ICredentialDialog::QueryUserForCredentials */

+};

+

+const CInterfaceStubVtbl _ICredentialDialogStubVtbl =

+{

+    &IID_ICredentialDialog,

+    &ICredentialDialog_ServerInfo,

+    4,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IGoogleUpdate3Web, ver. 0.0,

+   GUID={0x494B20CF,0x282E,0x4BDD,{0x9F,0x5D,0xB7,0x0C,0xB0,0x9D,0x35,0x1E}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IGoogleUpdate3Web_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    1320

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IGoogleUpdate3Web_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(8) _IGoogleUpdate3WebProxyVtbl = 

+{

+    &IGoogleUpdate3Web_ProxyInfo,

+    &IID_IGoogleUpdate3Web,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdate3Web::createAppBundleWeb */

+};

+

+

+static const PRPC_STUB_FUNCTION IGoogleUpdate3Web_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IGoogleUpdate3WebStubVtbl =

+{

+    &IID_IGoogleUpdate3Web,

+    &IGoogleUpdate3Web_ServerInfo,

+    8,

+    &IGoogleUpdate3Web_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IGoogleUpdate3WebSecurity, ver. 0.0,

+   GUID={0x2D363682,0x561D,0x4c3a,{0x81,0xC6,0xF2,0xF8,0x21,0x07,0x56,0x2A}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IGoogleUpdate3WebSecurity_FormatStringOffsetTable[] =

+    {

+    3312

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3WebSecurity_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate3WebSecurity_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IGoogleUpdate3WebSecurity_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate3WebSecurity_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(4) _IGoogleUpdate3WebSecurityProxyVtbl = 

+{

+    &IGoogleUpdate3WebSecurity_ProxyInfo,

+    &IID_IGoogleUpdate3WebSecurity,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdate3WebSecurity::setOriginURL */

+};

+

+const CInterfaceStubVtbl _IGoogleUpdate3WebSecurityStubVtbl =

+{

+    &IID_IGoogleUpdate3WebSecurity,

+    &IGoogleUpdate3WebSecurity_ServerInfo,

+    4,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAppBundleWeb, ver. 0.0,

+   GUID={0xDD42475D,0x6D46,0x496a,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAppBundleWeb_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    3348,

+    150,

+    3402,

+    1392,

+    1428,

+    3432,

+    2922,

+    3468,

+    3510,

+    3540,

+    3570,

+    3600,

+    3630,

+    3660,

+    3690,

+    3720,

+    3762

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppBundleWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAppBundleWeb_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppBundleWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(24) _IAppBundleWebProxyVtbl = 

+{

+    &IAppBundleWeb_ProxyInfo,

+    &IID_IAppBundleWeb,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::createApp */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::createInstalledApp */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::createAllInstalledApps */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::get_displayLanguage */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::put_displayLanguage */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::put_parentHWND */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::get_length */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::get_appWeb */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::initialize */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::checkForUpdate */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::download */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::install */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::pause */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::resume */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::cancel */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::downloadPackage */ ,

+    (void *) (INT_PTR) -1 /* IAppBundleWeb::get_currentState */

+};

+

+

+static const PRPC_STUB_FUNCTION IAppBundleWeb_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppBundleWebStubVtbl =

+{

+    &IID_IAppBundleWeb,

+    &IAppBundleWeb_ServerInfo,

+    24,

+    &IAppBundleWeb_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IAppWeb, ver. 0.0,

+   GUID={0x18D0F672,0x18B4,0x48e6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAppWeb_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    114,

+    1356,

+    78,

+    3798,

+    3840,

+    3870,

+    3906,

+    3936

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAppWeb_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(15) _IAppWebProxyVtbl = 

+{

+    &IAppWeb_ProxyInfo,

+    &IID_IAppWeb,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::get_appId */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::get_currentVersionWeb */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::get_nextVersionWeb */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::get_command */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::cancel */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::get_currentState */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::launch */ ,

+    (void *) (INT_PTR) -1 /* IAppWeb::uninstall */

+};

+

+

+static const PRPC_STUB_FUNCTION IAppWeb_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppWebStubVtbl =

+{

+    &IID_IAppWeb,

+    &IAppWeb_ServerInfo,

+    15,

+    &IAppWeb_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IAppCommandWeb, ver. 0.0,

+   GUID={0x68D6C2BD,0x712E,0x4c96,{0x93,0xE8,0x49,0xCB,0x8A,0x9A,0xAE,0xED}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAppCommandWeb_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    0,

+    2508,

+    3966

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppCommandWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAppCommandWeb_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppCommandWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(10) _IAppCommandWebProxyVtbl = 

+{

+    &IAppCommandWeb_ProxyInfo,

+    &IID_IAppCommandWeb,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IAppCommandWeb::get_status */ ,

+    (void *) (INT_PTR) -1 /* IAppCommandWeb::get_exitCode */ ,

+    (void *) (INT_PTR) -1 /* IAppCommandWeb::execute */

+};

+

+

+static const PRPC_STUB_FUNCTION IAppCommandWeb_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppCommandWebStubVtbl =

+{

+    &IID_IAppCommandWeb,

+    &IAppCommandWeb_ServerInfo,

+    10,

+    &IAppCommandWeb_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IAppVersionWeb, ver. 0.0,

+   GUID={0x0CD01D1E,0x4A1C,0x489d,{0x93,0xB9,0x9B,0x66,0x72,0x87,0x7C,0x57}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAppVersionWeb_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    114,

+    2508,

+    2664

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAppVersionWeb_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppVersionWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAppVersionWeb_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IAppVersionWeb_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(10) _IAppVersionWebProxyVtbl = 

+{

+    &IAppVersionWeb_ProxyInfo,

+    &IID_IAppVersionWeb,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* IAppVersionWeb::get_version */ ,

+    (void *) (INT_PTR) -1 /* IAppVersionWeb::get_packageCount */ ,

+    (void *) (INT_PTR) -1 /* IAppVersionWeb::get_packageWeb */

+};

+

+

+static const PRPC_STUB_FUNCTION IAppVersionWeb_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAppVersionWebStubVtbl =

+{

+    &IID_IAppVersionWeb,

+    &IAppVersionWeb_ServerInfo,

+    10,

+    &IAppVersionWeb_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: ICoCreateAsyncStatus, ver. 0.0,

+   GUID={0x2E629606,0x312A,0x482f,{0x9B,0x12,0x2C,0x4A,0xBF,0x6F,0x0B,0x6D}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short ICoCreateAsyncStatus_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    2472,

+    2508,

+    78

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO ICoCreateAsyncStatus_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICoCreateAsyncStatus_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO ICoCreateAsyncStatus_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICoCreateAsyncStatus_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(10) _ICoCreateAsyncStatusProxyVtbl = 

+{

+    &ICoCreateAsyncStatus_ProxyInfo,

+    &IID_ICoCreateAsyncStatus,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    (void *) (INT_PTR) -1 /* ICoCreateAsyncStatus::get_isDone */ ,

+    (void *) (INT_PTR) -1 /* ICoCreateAsyncStatus::get_completionHResult */ ,

+    (void *) (INT_PTR) -1 /* ICoCreateAsyncStatus::get_createdInstance */

+};

+

+

+static const PRPC_STUB_FUNCTION ICoCreateAsyncStatus_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _ICoCreateAsyncStatusStubVtbl =

+{

+    &IID_ICoCreateAsyncStatus,

+    &ICoCreateAsyncStatus_ServerInfo,

+    10,

+    &ICoCreateAsyncStatus_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: ICoCreateAsync, ver. 0.0,

+   GUID={0xDAB1D343,0x1B2A,0x47f9,{0xB4,0x45,0x93,0xDC,0x50,0x70,0x4B,0xFE}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short ICoCreateAsync_FormatStringOffsetTable[] =

+    {

+    4050

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO ICoCreateAsync_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICoCreateAsync_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO ICoCreateAsync_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &ICoCreateAsync_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(4) _ICoCreateAsyncProxyVtbl = 

+{

+    &ICoCreateAsync_ProxyInfo,

+    &IID_ICoCreateAsync,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* ICoCreateAsync::createOmahaMachineServerAsync */

+};

+

+const CInterfaceStubVtbl _ICoCreateAsyncStubVtbl =

+{

+    &IID_ICoCreateAsync,

+    &ICoCreateAsync_ServerInfo,

+    4,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IBrowserHttpRequest2, ver. 0.0,

+   GUID={0x5B25A8DC,0x1780,0x4178,{0xA6,0x29,0x6B,0xE8,0xB8,0xDE,0xFA,0xA2}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IBrowserHttpRequest2_FormatStringOffsetTable[] =

+    {

+    4098

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IBrowserHttpRequest2_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IBrowserHttpRequest2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IBrowserHttpRequest2_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IBrowserHttpRequest2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(4) _IBrowserHttpRequest2ProxyVtbl = 

+{

+    &IBrowserHttpRequest2_ProxyInfo,

+    &IID_IBrowserHttpRequest2,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IBrowserHttpRequest2::Send */

+};

+

+const CInterfaceStubVtbl _IBrowserHttpRequest2StubVtbl =

+{

+    &IID_IBrowserHttpRequest2,

+    &IBrowserHttpRequest2_ServerInfo,

+    4,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IProcessLauncher, ver. 0.0,

+   GUID={0x128C2DA6,0x2BC0,0x44c0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IProcessLauncher_FormatStringOffsetTable[] =

+    {

+    4170,

+    4206,

+    4248

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IProcessLauncher_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IProcessLauncher_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IProcessLauncher_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(6) _IProcessLauncherProxyVtbl = 

+{

+    &IProcessLauncher_ProxyInfo,

+    &IID_IProcessLauncher,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IProcessLauncher::LaunchCmdLine */ ,

+    (void *) (INT_PTR) -1 /* IProcessLauncher::LaunchBrowser */ ,

+    (void *) (INT_PTR) -1 /* IProcessLauncher::LaunchCmdElevated */

+};

+

+const CInterfaceStubVtbl _IProcessLauncherStubVtbl =

+{

+    &IID_IProcessLauncher,

+    &IProcessLauncher_ServerInfo,

+    6,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IOneClickProcessLauncher, ver. 0.0,

+   GUID={0x5CCCB0EF,0x7073,0x4516,{0x80,0x28,0x4C,0x62,0x8D,0x0C,0x8A,0xAB}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IOneClickProcessLauncher_FormatStringOffsetTable[] =

+    {

+    4302

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IOneClickProcessLauncher_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IOneClickProcessLauncher_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IOneClickProcessLauncher_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IOneClickProcessLauncher_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(4) _IOneClickProcessLauncherProxyVtbl = 

+{

+    &IOneClickProcessLauncher_ProxyInfo,

+    &IID_IOneClickProcessLauncher,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IOneClickProcessLauncher::LaunchAppCommand */

+};

+

+const CInterfaceStubVtbl _IOneClickProcessLauncherStubVtbl =

+{

+    &IID_IOneClickProcessLauncher,

+    &IOneClickProcessLauncher_ServerInfo,

+    4,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Standard interface: __MIDL_itf_google_update_idl_0000_0020, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IProgressWndEvents, ver. 0.0,

+   GUID={0x1C642CED,0xCA3B,0x4013,{0xA9,0xDF,0xCA,0x6C,0xE5,0xFF,0x65,0x03}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IProgressWndEvents_FormatStringOffsetTable[] =

+    {

+    4344,

+    4374,

+    4404,

+    4434,

+    4464,

+    4494

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IProgressWndEvents_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IProgressWndEvents_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IProgressWndEvents_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IProgressWndEvents_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(9) _IProgressWndEventsProxyVtbl = 

+{

+    &IProgressWndEvents_ProxyInfo,

+    &IID_IProgressWndEvents,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IProgressWndEvents::DoClose */ ,

+    (void *) (INT_PTR) -1 /* IProgressWndEvents::DoPause */ ,

+    (void *) (INT_PTR) -1 /* IProgressWndEvents::DoResume */ ,

+    (void *) (INT_PTR) -1 /* IProgressWndEvents::DoRestartBrowsers */ ,

+    (void *) (INT_PTR) -1 /* IProgressWndEvents::DoReboot */ ,

+    (void *) (INT_PTR) -1 /* IProgressWndEvents::DoLaunchBrowser */

+};

+

+const CInterfaceStubVtbl _IProgressWndEventsStubVtbl =

+{

+    &IID_IProgressWndEvents,

+    &IProgressWndEvents_ServerInfo,

+    9,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IJobObserver, ver. 0.0,

+   GUID={0x49D7563B,0x2DDB,0x4831,{0x88,0xC8,0x76,0x8A,0x53,0x83,0x38,0x37}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IJobObserver_FormatStringOffsetTable[] =

+    {

+    4344,

+    4374,

+    4530,

+    4434,

+    4566,

+    4608,

+    3402,

+    4638,

+    4668,

+    4710

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IJobObserver_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IJobObserver_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IJobObserver_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IJobObserver_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(13) _IJobObserverProxyVtbl = 

+{

+    &IJobObserver_ProxyInfo,

+    &IID_IJobObserver,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnShow */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnCheckingForUpdate */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnUpdateAvailable */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnWaitingToDownload */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnDownloading */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnWaitingToInstall */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnInstalling */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnPause */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::OnComplete */ ,

+    (void *) (INT_PTR) -1 /* IJobObserver::SetEventSink */

+};

+

+const CInterfaceStubVtbl _IJobObserverStubVtbl =

+{

+    &IID_IJobObserver,

+    &IJobObserver_ServerInfo,

+    13,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IGoogleUpdate, ver. 0.0,

+   GUID={0x31AC3F11,0xE5EA,0x4a85,{0x8A,0x3D,0x8E,0x09,0x5A,0x39,0xC2,0x7B}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IGoogleUpdate_FormatStringOffsetTable[] =

+    {

+    4746,

+    4788

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IGoogleUpdate_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdate_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(5) _IGoogleUpdateProxyVtbl = 

+{

+    &IGoogleUpdate_ProxyInfo,

+    &IID_IGoogleUpdate,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdate::CheckForUpdate */ ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdate::Update */

+};

+

+const CInterfaceStubVtbl _IGoogleUpdateStubVtbl =

+{

+    &IID_IGoogleUpdate,

+    &IGoogleUpdate_ServerInfo,

+    5,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IGoogleUpdateCore, ver. 0.0,

+   GUID={0x909489C2,0x85A6,0x4322,{0xAA,0x56,0xD2,0x52,0x78,0x64,0x9D,0x67}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IGoogleUpdateCore_FormatStringOffsetTable[] =

+    {

+    4830

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdateCore_ProxyInfo =

+    {

+    &Object_StubDesc,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdateCore_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IGoogleUpdateCore_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    google_update_idl__MIDL_ProcFormatString.Format,

+    &IGoogleUpdateCore_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(4) _IGoogleUpdateCoreProxyVtbl = 

+{

+    &IGoogleUpdateCore_ProxyInfo,

+    &IID_IGoogleUpdateCore,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IGoogleUpdateCore::LaunchCmdElevated */

+};

+

+const CInterfaceStubVtbl _IGoogleUpdateCoreStubVtbl =

+{

+    &IID_IGoogleUpdateCore,

+    &IGoogleUpdateCore_ServerInfo,

+    4,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+static const MIDL_STUB_DESC Object_StubDesc = 

+    {

+    0,

+    NdrOleAllocate,

+    NdrOleFree,

+    0,

+    0,

+    0,

+    0,

+    0,

+    google_update_idl__MIDL_TypeFormatString.Format,

+    1, /* -error bounds_check flag */

+    0x50002, /* Ndr library version */

+    0,

+    0x801026e, /* MIDL Version 8.1.622 */

+    0,

+    UserMarshalRoutines,

+    0,  /* notify & notify_flag routine table */

+    0x1, /* MIDL flag */

+    0, /* cs routines */

+    0,   /* proxy/server info */

+    0

+    };

+

+const CInterfaceProxyVtbl * const _google_update_idl_ProxyVtblList[] = 

+{

+    ( CInterfaceProxyVtbl *) &_ICoCreateAsyncStatusProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdateProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppVersionWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IRegistrationUpdateHookProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppVersionProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IJobObserverProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_ICoCreateAsyncProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppBundleWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_ICredentialDialogProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebSecurityProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPackageProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IProcessLauncherProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdateCoreProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IBrowserHttpRequest2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppBundleProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IProgressWndEventsProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IOneClickProcessLauncherProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_ICurrentStateProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppCommandProxyVtbl,

+    0

+};

+

+const CInterfaceStubVtbl * const _google_update_idl_StubVtblList[] = 

+{

+    ( CInterfaceStubVtbl *) &_ICoCreateAsyncStatusStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdateStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppVersionWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IRegistrationUpdateHookStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppVersionStubVtbl,

+    ( CInterfaceStubVtbl *) &_IJobObserverStubVtbl,

+    ( CInterfaceStubVtbl *) &_ICoCreateAsyncStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdate3StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppBundleWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_ICredentialDialogStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebSecurityStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPackageStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppStubVtbl,

+    ( CInterfaceStubVtbl *) &_IProcessLauncherStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdateCoreStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IBrowserHttpRequest2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppBundleStubVtbl,

+    ( CInterfaceStubVtbl *) &_IProgressWndEventsStubVtbl,

+    ( CInterfaceStubVtbl *) &_IOneClickProcessLauncherStubVtbl,

+    ( CInterfaceStubVtbl *) &_ICurrentStateStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppCommandStubVtbl,

+    0

+};

+

+PCInterfaceName const _google_update_idl_InterfaceNamesList[] = 

+{

+    "ICoCreateAsyncStatus",

+    "IGoogleUpdate",

+    "IAppVersionWeb",

+    "IRegistrationUpdateHook",

+    "IAppVersion",

+    "IJobObserver",

+    "ICoCreateAsync",

+    "IGoogleUpdate3",

+    "IAppBundleWeb",

+    "ICredentialDialog",

+    "IAppWeb",

+    "IGoogleUpdate3WebSecurity",

+    "IPackage",

+    "IApp",

+    "IProcessLauncher",

+    "IAppCommandWeb",

+    "IGoogleUpdateCore",

+    "IGoogleUpdate3Web",

+    "IBrowserHttpRequest2",

+    "IAppBundle",

+    "IProgressWndEvents",

+    "IOneClickProcessLauncher",

+    "ICurrentState",

+    "IAppCommand",

+    0

+};

+

+const IID *  const _google_update_idl_BaseIIDList[] = 

+{

+    &IID_IDispatch,

+    0,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    0,

+    0,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    0,

+    &IID_IDispatch,

+    0,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    0,

+    &IID_IDispatch,

+    0,

+    &IID_IDispatch,

+    0,

+    &IID_IDispatch,

+    0,

+    0,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    0

+};

+

+

+#define _google_update_idl_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _google_update_idl, pIID, n)

+

+int __stdcall _google_update_idl_IID_Lookup( const IID * pIID, int * pIndex )

+{

+    IID_BS_LOOKUP_SETUP

+

+    IID_BS_LOOKUP_INITIAL_TEST( _google_update_idl, 24, 16 )

+    IID_BS_LOOKUP_NEXT_TEST( _google_update_idl, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _google_update_idl, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _google_update_idl, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _google_update_idl, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _google_update_idl, 24, *pIndex )

+    

+}

+

+const ExtendedProxyFileInfo google_update_idl_ProxyFileInfo = 

+{

+    (PCInterfaceProxyVtblList *) & _google_update_idl_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _google_update_idl_StubVtblList,

+    (const PCInterfaceName * ) & _google_update_idl_InterfaceNamesList,

+    (const IID ** ) & _google_update_idl_BaseIIDList,

+    & _google_update_idl_IID_Lookup, 

+    24,

+    2,

+    0, /* table of [async_uuid] interfaces */

+    0, /* Filler1 */

+    0, /* Filler2 */

+    0  /* Filler3 */

+};

+#if _MSC_VER >= 1200

+#pragma warning(pop)

+#endif

+

+

+#endif /* !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_) */

+

diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.dlldata.c b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.dlldata.c
similarity index 100%
rename from third_party/win_build_output/midl/remoting/host/win/chromoting_lib.dlldata.c
rename to third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.dlldata.c
diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.h b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.h
similarity index 99%
rename from third_party/win_build_output/midl/remoting/host/win/chromoting_lib.h
rename to third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.h
index 67ab8aca..ca2b507 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.h
+++ b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.h
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for gen/remoting/host/win/chromoting_lib.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.tlb b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.tlb
similarity index 98%
rename from third_party/win_build_output/midl/remoting/host/win/chromoting_lib.tlb
rename to third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.tlb
index 3dd2490..33de87e 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.tlb
+++ b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_i.c b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib_i.c
similarity index 98%
rename from third_party/win_build_output/midl/remoting/host/win/chromoting_lib_i.c
rename to third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib_i.c
index 7e57611..6422392 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_i.c
+++ b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib_i.c
@@ -6,7 +6,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for gen/remoting/host/win/chromoting_lib.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_p.c b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib_p.c
similarity index 99%
rename from third_party/win_build_output/midl/remoting/host/win/chromoting_lib_p.c
rename to third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib_p.c
index 61ce41c..d2bde94 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_p.c
+++ b/third_party/win_build_output/midl/remoting/host/win/x64/chromoting_lib_p.c
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for gen/remoting/host/win/chromoting_lib.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.dlldata.c b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.dlldata.c
similarity index 100%
copy from third_party/win_build_output/midl/remoting/host/win/chromoting_lib.dlldata.c
copy to third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.dlldata.c
diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.h b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.h
similarity index 98%
copy from third_party/win_build_output/midl/remoting/host/win/chromoting_lib.h
copy to third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.h
index 67ab8aca..02931fb 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.h
+++ b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.h
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for gen/remoting/host/win/chromoting_lib.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

@@ -304,7 +304,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("d2265286-2cc6-53cb-b6ef-909034b95730")

+class DECLSPEC_UUID("406f7429-b57f-535a-9c79-6ae803e3aeaa")

 RdpDesktopSession;

 #endif

 #endif /* __ChromotingLib_LIBRARY_DEFINED__ */

diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.tlb b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.tlb
similarity index 69%
copy from third_party/win_build_output/midl/remoting/host/win/chromoting_lib.tlb
copy to third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.tlb
index 3dd2490..63a3a8d9 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib.tlb
+++ b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_i.c b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib_i.c
similarity index 89%
copy from third_party/win_build_output/midl/remoting/host/win/chromoting_lib_i.c
copy to third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib_i.c
index 7e57611..7188a8f 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_i.c
+++ b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib_i.c
@@ -6,10 +6,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for gen/remoting/host/win/chromoting_lib.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

@@ -76,7 +76,7 @@
 MIDL_DEFINE_GUID(IID, LIBID_ChromotingLib,0xb6396c45,0xb0cc,0x456b,0x9f,0x49,0xf1,0x29,0x64,0xee,0x6d,0xf4);

 

 

-MIDL_DEFINE_GUID(CLSID, CLSID_RdpDesktopSession,0xd2265286,0x2cc6,0x53cb,0xb6,0xef,0x90,0x90,0x34,0xb9,0x57,0x30);

+MIDL_DEFINE_GUID(CLSID, CLSID_RdpDesktopSession,0x406f7429,0xb57f,0x535a,0x9c,0x79,0x6a,0xe8,0x03,0xe3,0xae,0xaa);

 

 #undef MIDL_DEFINE_GUID

 

diff --git a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_p.c b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib_p.c
similarity index 71%
copy from third_party/win_build_output/midl/remoting/host/win/chromoting_lib_p.c
copy to third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib_p.c
index 61ce41c..0ff8df5 100644
--- a/third_party/win_build_output/midl/remoting/host/win/chromoting_lib_p.c
+++ b/third_party/win_build_output/midl/remoting/host/win/x86/chromoting_lib_p.c
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for gen/remoting/host/win/chromoting_lib.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

@@ -16,7 +16,7 @@
 */

 /* @@MIDL_FILE_HEADING(  ) */

 

-#if defined(_M_AMD64)

+#if !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_)

 

 

 #pragma warning( disable: 4049 )  /* more than 64k source lines */

@@ -28,6 +28,9 @@
 #pragma warning( disable: 4232 )  /* dllimport identity*/

 #pragma warning( disable: 4024 )  /* array to pointer mapping*/

 #pragma warning( disable: 4152 )  /* function/data pointer conversion in expression */

+#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */

+

+#pragma optimize("", off ) 

 

 #define USE_STUBLESS_PROXY

 

@@ -47,7 +50,7 @@
 #include "chromoting_lib.h"

 

 #define TYPE_FORMAT_STRING_SIZE   57                                

-#define PROC_FORMAT_STRING_SIZE   227                               

+#define PROC_FORMAT_STRING_SIZE   217                               

 #define EXPR_FORMAT_STRING_SIZE   1                                 

 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   1            

@@ -96,10 +99,18 @@
 

 extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];

 

-#if !defined(__RPC_WIN64__)

+#if !defined(__RPC_WIN32__)

 #error  Invalid build platform for this stub.

 #endif

 

+#if !(TARGET_IS_NT50_OR_LATER)

+#error You need Windows 2000 or later to run this stub because it uses these features:

+#error   /robust command line switch.

+#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.

+#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.

+#endif

+

+

 static const chromoting_lib_MIDL_PROC_FORMAT_STRING chromoting_lib__MIDL_ProcFormatString =

     {

         0,

@@ -111,23 +122,22 @@
 			0x6c,		/* Old Flags:  object, Oi2 */

 /*  2 */	NdrFcLong( 0x0 ),	/* 0 */

 /*  6 */	NdrFcShort( 0x3 ),	/* 3 */

-/*  8 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/*  8 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

 /* 10 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 12 */	NdrFcShort( 0x8 ),	/* 8 */

 /* 14 */	0x44,		/* Oi2 Flags:  has return, has ext, */

 			0x1,		/* 1 */

-/* 16 */	0xa,		/* 10 */

+/* 16 */	0x8,		/* 8 */

 			0x1,		/* Ext Flags:  new corr desc, */

 /* 18 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 20 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 22 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 24 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Return value */

 

-/* 26 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 28 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 30 */	0x8,		/* FC_LONG */

+/* 24 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 26 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 28 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure Disconnect */

@@ -135,180 +145,176 @@
 

 	/* Procedure OnRdpClosed */

 

-/* 32 */	0x33,		/* FC_AUTO_HANDLE */

+/* 30 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 34 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 38 */	NdrFcShort( 0x4 ),	/* 4 */

-/* 40 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 42 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 44 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 46 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+/* 32 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 36 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 38 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 40 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 42 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 44 */	0x44,		/* Oi2 Flags:  has return, has ext, */

 			0x1,		/* 1 */

-/* 48 */	0xa,		/* 10 */

+/* 46 */	0x8,		/* 8 */

 			0x1,		/* Ext Flags:  new corr desc, */

+/* 48 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 50 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 52 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 54 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 56 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Return value */

 

 

 	/* Return value */

 

-/* 58 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 60 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 62 */	0x8,		/* FC_LONG */

+/* 54 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 56 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 58 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure Connect */

 

-/* 64 */	0x33,		/* FC_AUTO_HANDLE */

+/* 60 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 66 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 70 */	NdrFcShort( 0x3 ),	/* 3 */

-/* 72 */	NdrFcShort( 0x48 ),	/* X64 Stack size/offset = 72 */

-/* 74 */	NdrFcShort( 0x28 ),	/* 40 */

-/* 76 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 78 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+/* 62 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 66 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 68 */	NdrFcShort( 0x24 ),	/* x86 Stack size/offset = 36 */

+/* 70 */	NdrFcShort( 0x28 ),	/* 40 */

+/* 72 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 74 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

 			0x8,		/* 8 */

-/* 80 */	0xa,		/* 10 */

+/* 76 */	0x8,		/* 8 */

 			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 78 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 80 */	NdrFcShort( 0x1 ),	/* 1 */

 /* 82 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 84 */	NdrFcShort( 0x1 ),	/* 1 */

-/* 86 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 88 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter width */

 

-/* 90 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 92 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 94 */	0x8,		/* FC_LONG */

+/* 84 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 86 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 88 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter height */

 

-/* 96 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 98 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 100 */	0x8,		/* FC_LONG */

+/* 90 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 92 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 94 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter dpi_x */

 

-/* 102 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 104 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

-/* 106 */	0x8,		/* FC_LONG */

+/* 96 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 98 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 100 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter dpi_y */

 

-/* 108 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 110 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

-/* 112 */	0x8,		/* FC_LONG */

+/* 102 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 104 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 106 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter terminal_id */

 

-/* 114 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

-/* 116 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

-/* 118 */	NdrFcShort( 0x1c ),	/* Type Offset=28 */

+/* 108 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 110 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 112 */	NdrFcShort( 0x1c ),	/* Type Offset=28 */

 

 	/* Parameter port_number */

 

-/* 120 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 122 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

-/* 124 */	0x8,		/* FC_LONG */

+/* 114 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 116 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 118 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter event_handler */

 

-/* 126 */	NdrFcShort( 0xb ),	/* Flags:  must size, must free, in, */

-/* 128 */	NdrFcShort( 0x38 ),	/* X64 Stack size/offset = 56 */

-/* 130 */	NdrFcShort( 0x26 ),	/* Type Offset=38 */

+/* 120 */	NdrFcShort( 0xb ),	/* Flags:  must size, must free, in, */

+/* 122 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 124 */	NdrFcShort( 0x26 ),	/* Type Offset=38 */

 

 	/* Return value */

 

-/* 132 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 134 */	NdrFcShort( 0x40 ),	/* X64 Stack size/offset = 64 */

-/* 136 */	0x8,		/* FC_LONG */

+/* 126 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 128 */	NdrFcShort( 0x20 ),	/* x86 Stack size/offset = 32 */

+/* 130 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure ChangeResolution */

 

-/* 138 */	0x33,		/* FC_AUTO_HANDLE */

+/* 132 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 140 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 144 */	NdrFcShort( 0x5 ),	/* 5 */

-/* 146 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

-/* 148 */	NdrFcShort( 0x20 ),	/* 32 */

-/* 150 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 152 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+/* 134 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 138 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 140 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 142 */	NdrFcShort( 0x20 ),	/* 32 */

+/* 144 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 146 */	0x44,		/* Oi2 Flags:  has return, has ext, */

 			0x5,		/* 5 */

-/* 154 */	0xa,		/* 10 */

+/* 148 */	0x8,		/* 8 */

 			0x1,		/* Ext Flags:  new corr desc, */

-/* 156 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 158 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 160 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 162 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 150 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 152 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 154 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter width */

 

-/* 164 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 166 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 168 */	0x8,		/* FC_LONG */

+/* 156 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 158 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 160 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter height */

 

-/* 170 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 172 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 174 */	0x8,		/* FC_LONG */

+/* 162 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 164 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 166 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter dpi_x */

 

-/* 176 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 178 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

-/* 180 */	0x8,		/* FC_LONG */

+/* 168 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 170 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 172 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter dpi_y */

 

-/* 182 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 184 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

-/* 186 */	0x8,		/* FC_LONG */

+/* 174 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 176 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 178 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Return value */

 

-/* 188 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 190 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

-/* 192 */	0x8,		/* FC_LONG */

+/* 180 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 182 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 184 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure InjectSas */

 

-/* 194 */	0x33,		/* FC_AUTO_HANDLE */

+/* 186 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 196 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 200 */	NdrFcShort( 0x6 ),	/* 6 */

-/* 202 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 204 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 206 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 208 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+/* 188 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 192 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 194 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 196 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 198 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 200 */	0x44,		/* Oi2 Flags:  has return, has ext, */

 			0x1,		/* 1 */

-/* 210 */	0xa,		/* 10 */

+/* 202 */	0x8,		/* 8 */

 			0x1,		/* Ext Flags:  new corr desc, */

-/* 212 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 214 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 216 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 218 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 204 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 206 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 208 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Return value */

 

-/* 220 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 222 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 224 */	0x8,		/* FC_LONG */

+/* 210 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 212 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 214 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 			0x0

@@ -345,7 +351,7 @@
 /* 28 */	0xb4,		/* FC_USER_MARSHAL */

 			0x83,		/* 131 */

 /* 30 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 32 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 32 */	NdrFcShort( 0x4 ),	/* 4 */

 /* 34 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 36 */	NdrFcShort( 0xffde ),	/* Offset= -34 (2) */

 /* 38 */	

@@ -392,7 +398,7 @@
 static const unsigned short IRdpDesktopSessionEventHandler_FormatStringOffsetTable[] =

     {

     0,

-    32

+    30

     };

 

 static const MIDL_STUBLESS_PROXY_INFO IRdpDesktopSessionEventHandler_ProxyInfo =

@@ -443,10 +449,10 @@
 #pragma code_seg(".orpc")

 static const unsigned short IRdpDesktopSession_FormatStringOffsetTable[] =

     {

-    64,

-    32,

-    138,

-    194

+    60,

+    30,

+    132,

+    186

     };

 

 static const MIDL_STUBLESS_PROXY_INFO IRdpDesktopSession_ProxyInfo =

@@ -568,5 +574,5 @@
 #endif

 

 

-#endif /* defined(_M_AMD64)*/

+#endif /* !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_) */

 

diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.dlldata.c b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.dlldata.c
similarity index 100%
rename from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.dlldata.c
rename to third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.h b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.h
similarity index 99%
copy from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.h
copy to third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.h
index 7c8aaa2..34715e2 100644
--- a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.h
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.h
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/iaccessible2/ia2_api_all.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.tlb b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.tlb
similarity index 99%
rename from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.tlb
rename to third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.tlb
index ed6f95c9..a839f361 100644
--- a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.tlb
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_i.c b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all_i.c
similarity index 98%
rename from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_i.c
rename to third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all_i.c
index 4b94cdb..3b407b4 100644
--- a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_i.c
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all_i.c
@@ -6,7 +6,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/iaccessible2/ia2_api_all.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_p.c b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all_p.c
similarity index 99%
rename from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_p.c
rename to third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all_p.c
index 15a8b96..9173b8e 100644
--- a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_p.c
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all_p.c
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/iaccessible2/ia2_api_all.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.dlldata.c b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.dlldata.c
similarity index 100%
copy from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.dlldata.c
copy to third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.h b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.h
similarity index 99%
rename from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.h
rename to third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.h
index 7c8aaa2..a4863a8 100644
--- a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.h
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.h
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/iaccessible2/ia2_api_all.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.tlb b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.tlb
similarity index 70%
copy from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.tlb
copy to third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.tlb
index ed6f95c9..e7ad0c68 100644
--- a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all.tlb
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_i.c b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all_i.c
similarity index 97%
copy from third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_i.c
copy to third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all_i.c
index 4b94cdb..36ffefded 100644
--- a/third_party/win_build_output/midl/third_party/iaccessible2/ia2_api_all_i.c
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all_i.c
@@ -6,10 +6,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/iaccessible2/ia2_api_all.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all_p.c b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all_p.c
new file mode 100644
index 0000000..1a0d4d5
--- /dev/null
+++ b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all_p.c
@@ -0,0 +1,7822 @@
+

+

+/* this ALWAYS GENERATED file contains the proxy stub code */

+

+

+ /* File created by MIDL compiler version 8.01.0622 */

+/* at a redacted point in time

+ */

+/* Compiler settings for ../../third_party/iaccessible2/ia2_api_all.idl:

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

+    protocol : dce , ms_ext, c_ext, robust

+    error checks: allocation ref bounds_check enum stub_data 

+    VC __declspec() decoration level: 

+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)

+         DECLSPEC_UUID(), MIDL_INTERFACE()

+*/

+/* @@MIDL_FILE_HEADING(  ) */

+

+#if !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_)

+

+

+#pragma warning( disable: 4049 )  /* more than 64k source lines */

+#if _MSC_VER >= 1200

+#pragma warning(push)

+#endif

+

+#pragma warning( disable: 4211 )  /* redefine extern to static */

+#pragma warning( disable: 4232 )  /* dllimport identity*/

+#pragma warning( disable: 4024 )  /* array to pointer mapping*/

+#pragma warning( disable: 4152 )  /* function/data pointer conversion in expression */

+#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */

+

+#pragma optimize("", off ) 

+

+#define USE_STUBLESS_PROXY

+

+

+/* verify that the <rpcproxy.h> version is high enough to compile this file*/

+#ifndef __REDQ_RPCPROXY_H_VERSION__

+#define __REQUIRED_RPCPROXY_H_VERSION__ 475

+#endif

+

+

+#include "rpcproxy.h"

+#ifndef __RPCPROXY_H_VERSION__

+#error this stub requires an updated version of <rpcproxy.h>

+#endif /* __RPCPROXY_H_VERSION__ */

+

+

+#include "ia2_api_all.h"

+

+#define TYPE_FORMAT_STRING_SIZE   1513                              

+#define PROC_FORMAT_STRING_SIZE   5197                              

+#define EXPR_FORMAT_STRING_SIZE   1                                 

+#define TRANSMIT_AS_TABLE_SIZE    0            

+#define WIRE_MARSHAL_TABLE_SIZE   3            

+

+typedef struct _ia2_api_all_MIDL_TYPE_FORMAT_STRING

+    {

+    short          Pad;

+    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

+    } ia2_api_all_MIDL_TYPE_FORMAT_STRING;

+

+typedef struct _ia2_api_all_MIDL_PROC_FORMAT_STRING

+    {

+    short          Pad;

+    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

+    } ia2_api_all_MIDL_PROC_FORMAT_STRING;

+

+typedef struct _ia2_api_all_MIDL_EXPR_FORMAT_STRING

+    {

+    long          Pad;

+    unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

+    } ia2_api_all_MIDL_EXPR_FORMAT_STRING;

+

+

+static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};

+

+

+extern const ia2_api_all_MIDL_TYPE_FORMAT_STRING ia2_api_all__MIDL_TypeFormatString;

+extern const ia2_api_all_MIDL_PROC_FORMAT_STRING ia2_api_all__MIDL_ProcFormatString;

+extern const ia2_api_all_MIDL_EXPR_FORMAT_STRING ia2_api_all__MIDL_ExprFormatString;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleRelation_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleRelation_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleAction_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleAction_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessible2_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessible2_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessible2_2_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessible2_2_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleComponent_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleComponent_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleValue_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleValue_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleText_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleText_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleText2_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleText2_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleEditableText_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleEditableText_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleHyperlink_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleHyperlink_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleHypertext_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleHypertext_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleHypertext2_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleHypertext2_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleTable_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleTable_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleTable2_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleTable2_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleTableCell_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleTableCell_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleImage_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleImage_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleApplication_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleApplication_ProxyInfo;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO IAccessibleDocument_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO IAccessibleDocument_ProxyInfo;

+

+

+extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];

+

+#if !defined(__RPC_WIN32__)

+#error  Invalid build platform for this stub.

+#endif

+

+#if !(TARGET_IS_NT50_OR_LATER)

+#error You need Windows 2000 or later to run this stub because it uses these features:

+#error   /robust command line switch.

+#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.

+#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.

+#endif

+

+

+static const ia2_api_all_MIDL_PROC_FORMAT_STRING ia2_api_all__MIDL_ProcFormatString =

+    {

+        0,

+        {

+

+	/* Procedure get_appName */

+

+

+	/* Procedure get_description */

+

+

+	/* Procedure get_relationType */

+

+			0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/*  2 */	NdrFcLong( 0x0 ),	/* 0 */

+/*  6 */	NdrFcShort( 0x3 ),	/* 3 */

+/*  8 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 10 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 12 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 14 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 16 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 18 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 20 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 22 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter name */

+

+

+	/* Parameter description */

+

+

+	/* Parameter relationType */

+

+/* 24 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 26 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 28 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 30 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 32 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 34 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_appVersion */

+

+

+	/* Procedure get_localizedRelationType */

+

+/* 36 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 38 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 42 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 44 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 46 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 48 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 50 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 52 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 54 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 56 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 58 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter version */

+

+

+	/* Parameter localizedRelationType */

+

+/* 60 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 62 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 64 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 66 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 68 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 70 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnIndex */

+

+

+	/* Procedure get_caretOffset */

+

+

+	/* Procedure get_background */

+

+

+	/* Procedure get_nTargets */

+

+/* 72 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 74 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 78 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 80 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 82 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 84 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 86 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 88 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 90 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 92 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 94 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter columnIndex */

+

+

+	/* Parameter offset */

+

+

+	/* Parameter background */

+

+

+	/* Parameter nTargets */

+

+/* 96 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 98 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 100 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 102 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 104 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 106 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_target */

+

+/* 108 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 110 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 114 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 116 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 118 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 120 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 122 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 124 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 126 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 128 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 130 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter targetIndex */

+

+/* 132 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 134 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 136 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter target */

+

+/* 138 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 140 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 142 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Return value */

+

+/* 144 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 146 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 148 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_targets */

+

+/* 150 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 152 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 156 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 158 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 160 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 162 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 164 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 166 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 168 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 170 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 172 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxTargets */

+

+/* 174 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 176 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 178 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter targets */

+

+/* 180 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 182 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 184 */	NdrFcShort( 0x48 ),	/* Type Offset=72 */

+

+	/* Parameter nTargets */

+

+/* 186 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 188 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 190 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 192 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 194 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 196 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnExtent */

+

+

+	/* Procedure nActions */

+

+/* 198 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 200 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 204 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 206 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 208 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 210 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 212 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 214 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 216 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 218 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 220 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter nColumnsSpanned */

+

+

+	/* Parameter nActions */

+

+/* 222 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 224 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 226 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 228 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 230 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 232 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure doAction */

+

+/* 234 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 236 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 240 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 242 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 244 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 246 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 248 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 250 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 252 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 254 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 256 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter actionIndex */

+

+/* 258 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 260 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 262 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 264 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 266 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 268 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnDescription */

+

+

+	/* Procedure get_description */

+

+/* 270 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 272 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 276 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 278 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 280 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 282 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 284 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 286 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 288 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 290 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 292 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+

+	/* Parameter actionIndex */

+

+/* 294 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 296 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 298 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter description */

+

+

+	/* Parameter description */

+

+/* 300 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 302 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 304 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 306 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 308 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 310 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_keyBinding */

+

+/* 312 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 314 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 318 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 320 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 322 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 324 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 326 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 328 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 330 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 332 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 334 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter actionIndex */

+

+/* 336 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 338 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 340 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter nMaxBindings */

+

+/* 342 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 344 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 346 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter keyBindings */

+

+/* 348 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 350 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 352 */	NdrFcShort( 0x5e ),	/* Type Offset=94 */

+

+	/* Parameter nBindings */

+

+/* 354 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 356 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 358 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 360 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 362 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 364 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_name */

+

+/* 366 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 368 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 372 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 374 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 376 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 378 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 380 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 382 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 384 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 386 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 388 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter actionIndex */

+

+/* 390 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 392 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 394 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter name */

+

+/* 396 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 398 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 400 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 402 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 404 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 406 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_localizedName */

+

+/* 408 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 410 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 414 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 416 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 418 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 420 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 422 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 424 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 426 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 428 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 430 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter actionIndex */

+

+/* 432 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 434 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 436 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter localizedName */

+

+/* 438 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 440 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 442 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 444 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 446 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 448 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nRelations */

+

+/* 450 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 452 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 456 */	NdrFcShort( 0x1c ),	/* 28 */

+/* 458 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 460 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 462 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 464 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 466 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 468 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 470 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 472 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter nRelations */

+

+/* 474 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 476 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 478 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 480 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 482 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 484 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_relation */

+

+/* 486 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 488 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 492 */	NdrFcShort( 0x1d ),	/* 29 */

+/* 494 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 496 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 498 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 500 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 502 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 504 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 506 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 508 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter relationIndex */

+

+/* 510 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 512 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 514 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter relation */

+

+/* 516 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 518 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 520 */	NdrFcShort( 0x7c ),	/* Type Offset=124 */

+

+	/* Return value */

+

+/* 522 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 524 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 526 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_relations */

+

+/* 528 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 530 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 534 */	NdrFcShort( 0x1e ),	/* 30 */

+/* 536 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 538 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 540 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 542 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 544 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 546 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 548 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 550 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxRelations */

+

+/* 552 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 554 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 556 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter relations */

+

+/* 558 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 560 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 562 */	NdrFcShort( 0x96 ),	/* Type Offset=150 */

+

+	/* Parameter nRelations */

+

+/* 564 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 566 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 568 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 570 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 572 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 574 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure role */

+

+/* 576 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 578 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 582 */	NdrFcShort( 0x1f ),	/* 31 */

+/* 584 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 586 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 588 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 590 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 592 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 594 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 596 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 598 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter role */

+

+/* 600 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 602 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 604 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 606 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 608 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 610 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure scrollTo */

+

+/* 612 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 614 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 618 */	NdrFcShort( 0x20 ),	/* 32 */

+/* 620 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 622 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 624 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 626 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 628 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 630 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 632 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 634 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter scrollType */

+

+/* 636 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 638 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 640 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 642 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 644 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 646 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure scrollToPoint */

+

+/* 648 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 650 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 654 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 656 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 658 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 660 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 662 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 664 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 666 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 668 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 670 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter coordinateType */

+

+/* 672 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 674 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 676 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter x */

+

+/* 678 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 680 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 682 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter y */

+

+/* 684 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 686 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 688 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 690 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 692 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 694 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_groupPosition */

+

+/* 696 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 698 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 702 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 704 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 706 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 708 */	NdrFcShort( 0x5c ),	/* 92 */

+/* 710 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 712 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 714 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 716 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 718 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter groupLevel */

+

+/* 720 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 722 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 724 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter similarItemsInGroup */

+

+/* 726 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 728 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 730 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter positionInGroup */

+

+/* 732 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 734 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 736 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 738 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 740 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 742 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_states */

+

+/* 744 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 746 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 750 */	NdrFcShort( 0x23 ),	/* 35 */

+/* 752 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 754 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 756 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 758 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 760 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 762 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 764 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 766 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter states */

+

+/* 768 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 770 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 772 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 774 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 776 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 778 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_extendedRole */

+

+/* 780 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 782 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 786 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 788 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 790 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 792 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 794 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 796 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 798 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 800 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 802 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter extendedRole */

+

+/* 804 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 806 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 808 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 810 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 812 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 814 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_localizedExtendedRole */

+

+/* 816 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 818 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 822 */	NdrFcShort( 0x25 ),	/* 37 */

+/* 824 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 826 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 828 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 830 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 832 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 834 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 836 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 838 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter localizedExtendedRole */

+

+/* 840 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 842 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 844 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 846 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 848 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 850 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nExtendedStates */

+

+/* 852 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 854 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 858 */	NdrFcShort( 0x26 ),	/* 38 */

+/* 860 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 862 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 864 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 866 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 868 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 870 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 872 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 874 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter nExtendedStates */

+

+/* 876 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 878 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 880 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 882 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 884 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 886 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_extendedStates */

+

+/* 888 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 890 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 894 */	NdrFcShort( 0x27 ),	/* 39 */

+/* 896 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 898 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 900 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 902 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 904 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 906 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 908 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 910 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxExtendedStates */

+

+/* 912 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 914 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 916 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter extendedStates */

+

+/* 918 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 920 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 922 */	NdrFcShort( 0xac ),	/* Type Offset=172 */

+

+	/* Parameter nExtendedStates */

+

+/* 924 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 926 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 928 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 930 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 932 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 934 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_localizedExtendedStates */

+

+/* 936 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 938 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 942 */	NdrFcShort( 0x28 ),	/* 40 */

+/* 944 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 946 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 948 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 950 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 952 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 954 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 956 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 958 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxLocalizedExtendedStates */

+

+/* 960 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 962 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 964 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter localizedExtendedStates */

+

+/* 966 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 968 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 970 */	NdrFcShort( 0xac ),	/* Type Offset=172 */

+

+	/* Parameter nLocalizedExtendedStates */

+

+/* 972 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 974 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 976 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 978 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 980 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 982 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_uniqueID */

+

+/* 984 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 986 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 990 */	NdrFcShort( 0x29 ),	/* 41 */

+/* 992 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 994 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 996 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 998 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 1000 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1002 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1004 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1006 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter uniqueID */

+

+/* 1008 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1010 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1012 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1014 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1016 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1018 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_windowHandle */

+

+/* 1020 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1022 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1026 */	NdrFcShort( 0x2a ),	/* 42 */

+/* 1028 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1030 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1032 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1034 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1036 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1038 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1040 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1042 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter windowHandle */

+

+/* 1044 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1046 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1048 */	NdrFcShort( 0xe6 ),	/* Type Offset=230 */

+

+	/* Return value */

+

+/* 1050 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1052 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1054 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_indexInParent */

+

+/* 1056 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1058 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1062 */	NdrFcShort( 0x2b ),	/* 43 */

+/* 1064 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1066 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1068 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 1070 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 1072 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1074 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1076 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1078 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter indexInParent */

+

+/* 1080 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1082 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1084 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1086 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1088 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1090 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_locale */

+

+/* 1092 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1094 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1098 */	NdrFcShort( 0x2c ),	/* 44 */

+/* 1100 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1102 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1104 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1106 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1108 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1110 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1112 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1114 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter locale */

+

+/* 1116 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 1118 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1120 */	NdrFcShort( 0xf4 ),	/* Type Offset=244 */

+

+	/* Return value */

+

+/* 1122 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1124 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1126 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_attributes */

+

+/* 1128 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1130 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1134 */	NdrFcShort( 0x2d ),	/* 45 */

+/* 1136 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1138 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1140 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1142 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1144 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1146 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1148 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1150 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter attributes */

+

+/* 1152 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1154 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1156 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 1158 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1160 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1162 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_attribute */

+

+/* 1164 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1166 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1170 */	NdrFcShort( 0x2e ),	/* 46 */

+/* 1172 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1174 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1176 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1178 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 1180 */	0x8,		/* 8 */

+			0x7,		/* Ext Flags:  new corr desc, clt corr check, srv corr check, */

+/* 1182 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1184 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1186 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter name */

+

+/* 1188 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1190 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1192 */	NdrFcShort( 0x10e ),	/* Type Offset=270 */

+

+	/* Parameter attribute */

+

+/* 1194 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 1196 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1198 */	NdrFcShort( 0x4ee ),	/* Type Offset=1262 */

+

+	/* Return value */

+

+/* 1200 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1202 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1204 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_accessibleWithCaret */

+

+/* 1206 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1208 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1212 */	NdrFcShort( 0x2f ),	/* 47 */

+/* 1214 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1216 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1218 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 1220 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 1222 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1224 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1226 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1228 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter accessible */

+

+/* 1230 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 1232 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1234 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Parameter caretOffset */

+

+/* 1236 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1238 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1240 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1242 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1244 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1246 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_relationTargetsOfType */

+

+/* 1248 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1250 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1254 */	NdrFcShort( 0x30 ),	/* 48 */

+/* 1256 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 1258 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1260 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 1262 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 1264 */	0x8,		/* 8 */

+			0x7,		/* Ext Flags:  new corr desc, clt corr check, srv corr check, */

+/* 1266 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1268 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1270 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter type */

+

+/* 1272 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1274 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1276 */	NdrFcShort( 0x10e ),	/* Type Offset=270 */

+

+	/* Parameter maxTargets */

+

+/* 1278 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1280 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1282 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter targets */

+

+/* 1284 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 1286 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1288 */	NdrFcShort( 0x4f8 ),	/* Type Offset=1272 */

+

+	/* Parameter nTargets */

+

+/* 1290 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1292 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1294 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1296 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1298 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1300 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_locationInParent */

+

+/* 1302 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1304 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1308 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 1310 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1312 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1314 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 1316 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 1318 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1320 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1322 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1324 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter x */

+

+/* 1326 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1328 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1330 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter y */

+

+/* 1332 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1334 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1336 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1338 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1340 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1342 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_foreground */

+

+/* 1344 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1346 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1350 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1352 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1354 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1356 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 1358 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 1360 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1362 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1364 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1366 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter foreground */

+

+/* 1368 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1370 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1372 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1374 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1376 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1378 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_currentValue */

+

+/* 1380 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1382 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1386 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 1388 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1390 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1392 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1394 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1396 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1398 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1400 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1402 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter currentValue */

+

+/* 1404 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 1406 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1408 */	NdrFcShort( 0x4ee ),	/* Type Offset=1262 */

+

+	/* Return value */

+

+/* 1410 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1412 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1414 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure setCurrentValue */

+

+/* 1416 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1418 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1422 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1424 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 1426 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1428 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1430 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1432 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 1434 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1436 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1438 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter value */

+

+/* 1440 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 1442 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1444 */	NdrFcShort( 0x51a ),	/* Type Offset=1306 */

+

+	/* Return value */

+

+/* 1446 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1448 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1450 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_maximumValue */

+

+/* 1452 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1454 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1458 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 1460 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1462 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1464 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1466 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1468 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1470 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1472 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1474 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maximumValue */

+

+/* 1476 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 1478 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1480 */	NdrFcShort( 0x4ee ),	/* Type Offset=1262 */

+

+	/* Return value */

+

+/* 1482 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1484 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1486 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_minimumValue */

+

+/* 1488 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1490 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1494 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 1496 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1498 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1500 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1502 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 1504 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1506 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1508 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1510 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter minimumValue */

+

+/* 1512 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 1514 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1516 */	NdrFcShort( 0x4ee ),	/* Type Offset=1262 */

+

+	/* Return value */

+

+/* 1518 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1520 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1522 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure copyText */

+

+

+	/* Procedure addSelection */

+

+/* 1524 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1526 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1530 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 1532 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1534 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1536 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1538 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 1540 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1542 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1544 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1546 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startOffset */

+

+

+	/* Parameter startOffset */

+

+/* 1548 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1550 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1552 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+

+	/* Parameter endOffset */

+

+/* 1554 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1556 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1558 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1560 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1562 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1564 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_attributes */

+

+/* 1566 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1568 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1572 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1574 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 1576 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1578 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 1580 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 1582 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1584 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1586 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1588 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 1590 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1592 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1594 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter startOffset */

+

+/* 1596 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1598 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1600 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 1602 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1604 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1606 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter textAttributes */

+

+/* 1608 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1610 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1612 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 1614 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1616 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1618 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_characterExtents */

+

+/* 1620 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1622 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1626 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 1628 */	NdrFcShort( 0x20 ),	/* x86 Stack size/offset = 32 */

+/* 1630 */	NdrFcShort( 0xe ),	/* 14 */

+/* 1632 */	NdrFcShort( 0x78 ),	/* 120 */

+/* 1634 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x7,		/* 7 */

+/* 1636 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1638 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1640 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1642 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 1644 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1646 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1648 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter coordType */

+

+/* 1650 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1652 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1654 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter x */

+

+/* 1656 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1658 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1660 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter y */

+

+/* 1662 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1664 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1666 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter width */

+

+/* 1668 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1670 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1672 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter height */

+

+/* 1674 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1676 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 1678 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1680 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1682 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 1684 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nRows */

+

+

+	/* Procedure get_nSelections */

+

+/* 1686 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1688 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1692 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 1694 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1696 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1698 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 1700 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 1702 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1704 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1706 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1708 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter rowCount */

+

+

+	/* Parameter nSelections */

+

+/* 1710 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1712 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1714 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 1716 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1718 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1720 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_offsetAtPoint */

+

+/* 1722 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1724 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1728 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1730 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 1732 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 1734 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 1736 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x5,		/* 5 */

+/* 1738 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1740 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1742 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1744 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter x */

+

+/* 1746 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1748 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1750 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter y */

+

+/* 1752 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1754 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1756 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter coordType */

+

+/* 1758 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1760 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1762 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter offset */

+

+/* 1764 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1766 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1768 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1770 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1772 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1774 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_selection */

+

+/* 1776 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1778 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1782 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 1784 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1786 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1788 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 1790 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 1792 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 1794 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1796 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1798 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter selectionIndex */

+

+/* 1800 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1802 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1804 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter startOffset */

+

+/* 1806 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1808 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1810 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 1812 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1814 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1816 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 1818 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1820 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1822 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_text */

+

+/* 1824 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1826 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1830 */	NdrFcShort( 0xa ),	/* 10 */

+/* 1832 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1834 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1836 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1838 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 1840 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1842 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1844 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1846 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startOffset */

+

+/* 1848 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1850 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1852 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 1854 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1856 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1858 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter text */

+

+/* 1860 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1862 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1864 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 1866 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1868 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1870 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_textBeforeOffset */

+

+/* 1872 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1874 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1878 */	NdrFcShort( 0xb ),	/* 11 */

+/* 1880 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 1882 */	NdrFcShort( 0xe ),	/* 14 */

+/* 1884 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 1886 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x6,		/* 6 */

+/* 1888 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1890 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1892 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1894 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 1896 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1898 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1900 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter boundaryType */

+

+/* 1902 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1904 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1906 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter startOffset */

+

+/* 1908 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1910 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1912 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 1914 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1916 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1918 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter text */

+

+/* 1920 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1922 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1924 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 1926 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1928 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 1930 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_textAfterOffset */

+

+/* 1932 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1934 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1938 */	NdrFcShort( 0xc ),	/* 12 */

+/* 1940 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 1942 */	NdrFcShort( 0xe ),	/* 14 */

+/* 1944 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 1946 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x6,		/* 6 */

+/* 1948 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 1950 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1952 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1954 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 1956 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1958 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1960 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter boundaryType */

+

+/* 1962 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 1964 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1966 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter startOffset */

+

+/* 1968 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1970 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1972 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 1974 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 1976 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1978 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter text */

+

+/* 1980 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 1982 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 1984 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 1986 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 1988 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 1990 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_textAtOffset */

+

+/* 1992 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 1994 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 1998 */	NdrFcShort( 0xd ),	/* 13 */

+/* 2000 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 2002 */	NdrFcShort( 0xe ),	/* 14 */

+/* 2004 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 2006 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x6,		/* 6 */

+/* 2008 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2010 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2012 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2014 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 2016 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2018 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2020 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter boundaryType */

+

+/* 2022 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2024 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2026 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter startOffset */

+

+/* 2028 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2030 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2032 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 2034 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2036 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2038 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter text */

+

+/* 2040 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 2042 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2044 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 2046 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2048 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 2050 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure removeSelection */

+

+/* 2052 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2054 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2058 */	NdrFcShort( 0xe ),	/* 14 */

+/* 2060 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2062 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2064 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2066 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2068 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2070 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2072 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2074 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter selectionIndex */

+

+/* 2076 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2078 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2080 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2082 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2084 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2086 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure setCaretOffset */

+

+/* 2088 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2090 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2094 */	NdrFcShort( 0xf ),	/* 15 */

+/* 2096 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2098 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2100 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2102 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2104 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2106 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2108 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2110 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 2112 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2114 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2116 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2118 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2120 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2122 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure setSelection */

+

+/* 2124 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2126 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2130 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 2132 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2134 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 2136 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2138 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 2140 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2142 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2144 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2146 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter selectionIndex */

+

+/* 2148 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2150 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2152 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter startOffset */

+

+/* 2154 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2156 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2158 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 2160 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2162 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2164 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2166 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2168 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2170 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nCharacters */

+

+/* 2172 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2174 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2178 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 2180 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2182 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2184 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2186 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2188 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2190 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2192 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2194 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter nCharacters */

+

+/* 2196 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2198 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2200 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2202 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2204 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2206 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure scrollSubstringTo */

+

+/* 2208 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2210 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2214 */	NdrFcShort( 0x12 ),	/* 18 */

+/* 2216 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2218 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 2220 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2222 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 2224 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2226 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2228 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2230 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startIndex */

+

+/* 2232 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2234 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2236 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endIndex */

+

+/* 2238 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2240 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2242 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter scrollType */

+

+/* 2244 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2246 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2248 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2250 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2252 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2254 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure scrollSubstringToPoint */

+

+/* 2256 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2258 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2262 */	NdrFcShort( 0x13 ),	/* 19 */

+/* 2264 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 2266 */	NdrFcShort( 0x26 ),	/* 38 */

+/* 2268 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2270 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x6,		/* 6 */

+/* 2272 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2274 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2276 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2278 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startIndex */

+

+/* 2280 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2282 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2284 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endIndex */

+

+/* 2286 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2288 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2290 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter coordinateType */

+

+/* 2292 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2294 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2296 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter x */

+

+/* 2298 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2300 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2302 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter y */

+

+/* 2304 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2306 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2308 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2310 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2312 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 2314 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_newText */

+

+/* 2316 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2318 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2322 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 2324 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2326 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2328 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2330 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2332 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2334 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2336 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2338 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter newText */

+

+/* 2340 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 2342 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2344 */	NdrFcShort( 0x528 ),	/* Type Offset=1320 */

+

+	/* Return value */

+

+/* 2346 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2348 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2350 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_oldText */

+

+/* 2352 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2354 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2358 */	NdrFcShort( 0x15 ),	/* 21 */

+/* 2360 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2362 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2364 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2366 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 2368 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2370 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2372 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2374 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter oldText */

+

+/* 2376 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 2378 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2380 */	NdrFcShort( 0x528 ),	/* Type Offset=1320 */

+

+	/* Return value */

+

+/* 2382 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2384 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2386 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_attributeRange */

+

+/* 2388 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2390 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2394 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 2396 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 2398 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2400 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 2402 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x6,		/* 6 */

+/* 2404 */	0x8,		/* 8 */

+			0x7,		/* Ext Flags:  new corr desc, clt corr check, srv corr check, */

+/* 2406 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2408 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2410 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 2412 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2414 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2416 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter filter */

+

+/* 2418 */	NdrFcShort( 0x8b ),	/* Flags:  must size, must free, in, by val, */

+/* 2420 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2422 */	NdrFcShort( 0x10e ),	/* Type Offset=270 */

+

+	/* Parameter startOffset */

+

+/* 2424 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2426 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2428 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 2430 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2432 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2434 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter attributeValues */

+

+/* 2436 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 2438 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2440 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 2442 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2444 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 2446 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure deleteText */

+

+/* 2448 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2450 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2454 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 2456 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2458 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 2460 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2462 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 2464 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2466 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2468 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2470 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startOffset */

+

+/* 2472 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2474 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2476 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 2478 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2480 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2482 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2484 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2486 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2488 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure insertText */

+

+/* 2490 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2492 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2496 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 2498 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2500 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2502 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2504 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 2506 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2508 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2510 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2512 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 2514 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2516 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2518 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter text */

+

+/* 2520 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 2522 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2524 */	NdrFcShort( 0x10e ),	/* Type Offset=270 */

+

+	/* Return value */

+

+/* 2526 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2528 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2530 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure cutText */

+

+/* 2532 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2534 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2538 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 2540 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2542 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 2544 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2546 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 2548 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2550 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2552 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2554 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startOffset */

+

+/* 2556 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2558 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2560 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 2562 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2564 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2566 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2568 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2570 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2572 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure pasteText */

+

+/* 2574 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2576 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2580 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 2582 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2584 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2586 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2588 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2590 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2592 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2594 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2596 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter offset */

+

+/* 2598 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2600 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2602 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2604 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2606 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2608 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure replaceText */

+

+/* 2610 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2612 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2616 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2618 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2620 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 2622 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2624 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 2626 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2628 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2630 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2632 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startOffset */

+

+/* 2634 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2636 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2638 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 2640 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2642 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2644 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter text */

+

+/* 2646 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 2648 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2650 */	NdrFcShort( 0x10e ),	/* Type Offset=270 */

+

+	/* Return value */

+

+/* 2652 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2654 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2656 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure setAttributes */

+

+/* 2658 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2660 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2664 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 2666 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 2668 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 2670 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2672 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 2674 */	0x8,		/* 8 */

+			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

+/* 2676 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2678 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2680 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter startOffset */

+

+/* 2682 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2684 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2686 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter endOffset */

+

+/* 2688 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2690 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2692 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter attributes */

+

+/* 2694 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 2696 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2698 */	NdrFcShort( 0x10e ),	/* Type Offset=270 */

+

+	/* Return value */

+

+/* 2700 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2702 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2704 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_anchor */

+

+/* 2706 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2708 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2712 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 2714 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2716 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2718 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2720 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 2722 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2724 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2726 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2728 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+/* 2730 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2732 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2734 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter anchor */

+

+/* 2736 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 2738 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2740 */	NdrFcShort( 0x4ee ),	/* Type Offset=1262 */

+

+	/* Return value */

+

+/* 2742 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2744 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2746 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_anchorTarget */

+

+/* 2748 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2750 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2754 */	NdrFcShort( 0xa ),	/* 10 */

+/* 2756 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2758 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2760 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2762 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 2764 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 2766 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 2768 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2770 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+/* 2772 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2774 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2776 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter anchorTarget */

+

+/* 2778 */	NdrFcShort( 0x4113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */

+/* 2780 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2782 */	NdrFcShort( 0x4ee ),	/* Type Offset=1262 */

+

+	/* Return value */

+

+/* 2784 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2786 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2788 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nRows */

+

+

+	/* Procedure get_startIndex */

+

+/* 2790 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2792 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2796 */	NdrFcShort( 0xb ),	/* 11 */

+/* 2798 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2800 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2802 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2804 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2806 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2808 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2810 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2812 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter rowCount */

+

+

+	/* Parameter index */

+

+/* 2814 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2816 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2818 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 2820 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2822 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2824 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nSelectedChildren */

+

+

+	/* Procedure get_endIndex */

+

+/* 2826 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2828 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2832 */	NdrFcShort( 0xc ),	/* 12 */

+/* 2834 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2836 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2838 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2840 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2842 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2844 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2846 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2848 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter cellCount */

+

+

+	/* Parameter index */

+

+/* 2850 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2852 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2854 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 2856 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2858 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2860 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_valid */

+

+/* 2862 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2864 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2868 */	NdrFcShort( 0xd ),	/* 13 */

+/* 2870 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2872 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2874 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 2876 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2878 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2880 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2882 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2884 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter valid */

+

+/* 2886 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2888 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2890 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2892 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2894 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2896 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nHyperlinks */

+

+/* 2898 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2900 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2904 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 2906 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2908 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2910 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2912 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 2914 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2916 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2918 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2920 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter hyperlinkCount */

+

+/* 2922 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 2924 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2926 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 2928 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2930 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2932 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_hyperlink */

+

+/* 2934 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2936 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2940 */	NdrFcShort( 0x17 ),	/* 23 */

+/* 2942 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2944 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2946 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2948 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 2950 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2952 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2954 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2956 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+/* 2958 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 2960 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 2962 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter hyperlink */

+

+/* 2964 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 2966 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 2968 */	NdrFcShort( 0x540 ),	/* Type Offset=1344 */

+

+	/* Return value */

+

+/* 2970 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 2972 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 2974 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_hyperlinkIndex */

+

+/* 2976 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 2978 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 2982 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 2984 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 2986 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 2988 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 2990 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 2992 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 2994 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2996 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 2998 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter charIndex */

+

+/* 3000 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3002 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3004 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter hyperlinkIndex */

+

+/* 3006 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3008 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3010 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3012 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3014 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3016 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_hyperlinks */

+

+/* 3018 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3020 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3024 */	NdrFcShort( 0x19 ),	/* 25 */

+/* 3026 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3028 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3030 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3032 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3034 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3036 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3038 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3040 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter hyperlinks */

+

+/* 3042 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 3044 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3046 */	NdrFcShort( 0x556 ),	/* Type Offset=1366 */

+

+	/* Parameter nHyperlinks */

+

+/* 3048 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3050 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3052 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3054 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3056 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3058 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_cellAt */

+

+

+	/* Procedure get_accessibleAt */

+

+/* 3060 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3062 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3066 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 3068 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3070 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3072 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3074 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 3076 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3078 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3080 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3082 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+

+	/* Parameter row */

+

+/* 3084 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3086 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3088 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter column */

+

+

+	/* Parameter column */

+

+/* 3090 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3092 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3094 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter cell */

+

+

+	/* Parameter accessible */

+

+/* 3096 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3098 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3100 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 3102 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3104 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3106 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_caption */

+

+

+	/* Procedure get_caption */

+

+/* 3108 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3110 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3114 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 3116 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3118 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3120 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3122 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 3124 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3126 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3128 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3130 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter accessible */

+

+

+	/* Parameter accessible */

+

+/* 3132 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3134 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3136 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 3138 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3140 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3142 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_childIndex */

+

+/* 3144 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3146 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3150 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 3152 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3154 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3156 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3158 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 3160 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3162 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3164 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3166 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter rowIndex */

+

+/* 3168 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3170 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3172 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter columnIndex */

+

+/* 3174 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3176 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3178 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter cellIndex */

+

+/* 3180 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3182 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3184 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3186 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3188 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3190 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnDescription */

+

+/* 3192 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3194 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3198 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 3200 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3202 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3204 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3206 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3208 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3210 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3212 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3214 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+/* 3216 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3218 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3220 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter description */

+

+/* 3222 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 3224 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3226 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 3228 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3230 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3232 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnExtentAt */

+

+/* 3234 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3236 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3240 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 3242 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3244 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3246 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3248 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 3250 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3252 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3254 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3256 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 3258 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3260 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3262 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter column */

+

+/* 3264 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3266 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3268 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter nColumnsSpanned */

+

+/* 3270 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3272 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3274 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3276 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3278 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3280 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnHeader */

+

+/* 3282 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3284 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3288 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3290 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3292 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3294 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3296 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3298 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3300 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3302 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3304 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter accessibleTable */

+

+/* 3306 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3308 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3310 */	NdrFcShort( 0x574 ),	/* Type Offset=1396 */

+

+	/* Parameter startingRowIndex */

+

+/* 3312 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3314 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3316 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3318 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3320 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3322 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnIndex */

+

+/* 3324 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3326 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3330 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 3332 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3334 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3336 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3338 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 3340 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3342 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3344 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3346 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter cellIndex */

+

+/* 3348 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3350 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3352 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter columnIndex */

+

+/* 3354 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3356 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3358 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3360 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3362 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3364 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nSelectedRows */

+

+

+	/* Procedure get_nColumns */

+

+/* 3366 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3368 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3372 */	NdrFcShort( 0xa ),	/* 10 */

+/* 3374 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3376 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3378 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3380 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3382 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3384 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3386 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3388 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter rowCount */

+

+

+	/* Parameter columnCount */

+

+/* 3390 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3392 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3394 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 3396 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3398 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3400 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nSelectedColumns */

+

+/* 3402 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3404 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3408 */	NdrFcShort( 0xd ),	/* 13 */

+/* 3410 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3412 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3414 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3416 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3418 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3420 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3422 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3424 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter columnCount */

+

+/* 3426 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3428 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3430 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3432 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3434 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3436 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nSelectedRows */

+

+/* 3438 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3440 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3444 */	NdrFcShort( 0xe ),	/* 14 */

+/* 3446 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3448 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3450 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3452 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3454 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3456 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3458 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3460 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter rowCount */

+

+/* 3462 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3464 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3466 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3468 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3470 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3472 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowDescription */

+

+/* 3474 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3476 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3480 */	NdrFcShort( 0xf ),	/* 15 */

+/* 3482 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3484 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3486 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3488 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3490 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3492 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3494 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3496 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 3498 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3500 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3502 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter description */

+

+/* 3504 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 3506 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3508 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 3510 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3512 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3514 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowExtentAt */

+

+/* 3516 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3518 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3522 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3524 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3526 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3528 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3530 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 3532 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3534 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3536 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3538 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 3540 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3542 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3544 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter column */

+

+/* 3546 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3548 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3550 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter nRowsSpanned */

+

+/* 3552 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3554 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3556 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3558 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3560 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3562 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowHeader */

+

+/* 3564 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3566 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3570 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 3572 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3574 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3576 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3578 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 3580 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3582 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3584 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3586 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter accessibleTable */

+

+/* 3588 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3590 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3592 */	NdrFcShort( 0x574 ),	/* Type Offset=1396 */

+

+	/* Parameter startingColumnIndex */

+

+/* 3594 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3596 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3598 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3600 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3602 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3604 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowIndex */

+

+/* 3606 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3608 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3612 */	NdrFcShort( 0x12 ),	/* 18 */

+/* 3614 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3616 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3618 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3620 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 3622 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3624 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3626 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3628 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter cellIndex */

+

+/* 3630 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3632 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3634 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter rowIndex */

+

+/* 3636 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3638 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3640 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3642 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3644 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3646 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_selectedChildren */

+

+/* 3648 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3650 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3654 */	NdrFcShort( 0x13 ),	/* 19 */

+/* 3656 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3658 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3660 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3662 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 3664 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3666 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3668 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3670 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxChildren */

+

+/* 3672 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3674 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3676 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter children */

+

+/* 3678 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 3680 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3682 */	NdrFcShort( 0x58a ),	/* Type Offset=1418 */

+

+	/* Parameter nChildren */

+

+/* 3684 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3686 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3688 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3690 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3692 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3694 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_selectedColumns */

+

+/* 3696 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3698 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3702 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 3704 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3706 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3708 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3710 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 3712 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3714 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3716 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3718 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxColumns */

+

+/* 3720 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3722 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3724 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter columns */

+

+/* 3726 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 3728 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3730 */	NdrFcShort( 0x58a ),	/* Type Offset=1418 */

+

+	/* Parameter nColumns */

+

+/* 3732 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3734 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3736 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3738 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3740 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3742 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_selectedRows */

+

+/* 3744 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3746 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3750 */	NdrFcShort( 0x15 ),	/* 21 */

+/* 3752 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3754 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3756 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 3758 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x4,		/* 4 */

+/* 3760 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 3762 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 3764 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3766 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxRows */

+

+/* 3768 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3770 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3772 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter rows */

+

+/* 3774 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 3776 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3778 */	NdrFcShort( 0x58a ),	/* Type Offset=1418 */

+

+	/* Parameter nRows */

+

+/* 3780 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3782 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3784 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3786 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3788 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3790 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_summary */

+

+/* 3792 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3794 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3798 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 3800 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3802 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3804 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3806 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 3808 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3810 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3812 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3814 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter accessible */

+

+/* 3816 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 3818 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3820 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Return value */

+

+/* 3822 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3824 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3826 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isColumnSelected */

+

+/* 3828 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3830 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3834 */	NdrFcShort( 0x17 ),	/* 23 */

+/* 3836 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3838 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3840 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 3842 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 3844 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3846 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3848 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3850 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+/* 3852 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3854 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3856 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter isSelected */

+

+/* 3858 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3860 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3862 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3864 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3866 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3868 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isRowSelected */

+

+/* 3870 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3872 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3876 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 3878 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3880 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3882 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 3884 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 3886 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3888 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3890 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3892 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 3894 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3896 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3898 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter isSelected */

+

+/* 3900 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3902 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3904 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3906 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3908 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3910 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isSelected */

+

+/* 3912 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3914 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3918 */	NdrFcShort( 0x19 ),	/* 25 */

+/* 3920 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 3922 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 3924 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 3926 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 3928 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3930 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3932 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3934 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 3936 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3938 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3940 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter column */

+

+/* 3942 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3944 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3946 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter isSelected */

+

+/* 3948 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 3950 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3952 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3954 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3956 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 3958 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure selectRow */

+

+/* 3960 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3962 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 3966 */	NdrFcShort( 0x1a ),	/* 26 */

+/* 3968 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 3970 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3972 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 3974 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 3976 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 3978 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3980 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 3982 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 3984 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 3986 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 3988 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 3990 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 3992 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 3994 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure selectColumn */

+

+/* 3996 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 3998 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4002 */	NdrFcShort( 0x1b ),	/* 27 */

+/* 4004 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4006 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4008 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4010 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4012 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4014 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4016 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4018 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+/* 4020 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4022 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4024 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4026 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4028 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4030 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure unselectRow */

+

+/* 4032 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4034 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4038 */	NdrFcShort( 0x1c ),	/* 28 */

+/* 4040 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4042 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4044 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4046 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4048 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4050 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4052 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4054 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 4056 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4058 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4060 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4062 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4064 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4066 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure unselectColumn */

+

+/* 4068 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4070 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4074 */	NdrFcShort( 0x1d ),	/* 29 */

+/* 4076 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4078 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4080 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4082 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4084 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4086 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4088 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4090 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+/* 4092 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4094 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4096 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4098 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4100 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4102 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowColumnExtentsAtIndex */

+

+/* 4104 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4106 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4110 */	NdrFcShort( 0x1e ),	/* 30 */

+/* 4112 */	NdrFcShort( 0x20 ),	/* x86 Stack size/offset = 32 */

+/* 4114 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4116 */	NdrFcShort( 0x91 ),	/* 145 */

+/* 4118 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x7,		/* 7 */

+/* 4120 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4122 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4124 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4126 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter index */

+

+/* 4128 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4130 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4132 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter row */

+

+/* 4134 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4136 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4138 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter column */

+

+/* 4140 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4142 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4144 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter rowExtents */

+

+/* 4146 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4148 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4150 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter columnExtents */

+

+/* 4152 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4154 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 4156 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter isSelected */

+

+/* 4158 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4160 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 4162 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4164 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4166 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 4168 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_modelChange */

+

+/* 4170 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4172 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4176 */	NdrFcShort( 0x1f ),	/* 31 */

+/* 4178 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4180 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4182 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4184 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4186 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4188 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4190 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4192 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter modelChange */

+

+/* 4194 */	NdrFcShort( 0x6113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=24 */

+/* 4196 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4198 */	NdrFcShort( 0x5a8 ),	/* Type Offset=1448 */

+

+	/* Return value */

+

+/* 4200 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4202 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4204 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowExtent */

+

+

+	/* Procedure get_nColumns */

+

+/* 4206 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4208 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4212 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 4214 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4216 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4218 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4220 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4222 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4224 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4226 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4228 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter nRowsSpanned */

+

+

+	/* Parameter columnCount */

+

+/* 4230 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4232 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4234 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 4236 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4238 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4240 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowIndex */

+

+

+	/* Procedure get_nSelectedCells */

+

+/* 4242 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4244 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4248 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4250 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4252 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4254 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4256 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4258 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4260 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4262 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4264 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter rowIndex */

+

+

+	/* Parameter cellCount */

+

+/* 4266 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4268 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4270 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+

+	/* Return value */

+

+/* 4272 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4274 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4276 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nSelectedColumns */

+

+/* 4278 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4280 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4284 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 4286 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4288 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4290 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4292 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4294 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4296 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4298 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4300 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter columnCount */

+

+/* 4302 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4304 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4306 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4308 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4310 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4312 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowDescription */

+

+/* 4314 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4316 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4320 */	NdrFcShort( 0xb ),	/* 11 */

+/* 4322 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4324 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4326 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4328 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4330 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 4332 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4334 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4336 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 4338 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4340 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4342 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter description */

+

+/* 4344 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 4346 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4348 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 4350 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4352 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4354 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_selectedCells */

+

+/* 4356 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4358 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4362 */	NdrFcShort( 0xc ),	/* 12 */

+/* 4364 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4366 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4368 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4370 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4372 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 4374 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4376 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4378 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter cells */

+

+/* 4380 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 4382 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4384 */	NdrFcShort( 0x5b6 ),	/* Type Offset=1462 */

+

+	/* Parameter nSelectedCells */

+

+/* 4386 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4388 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4390 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4392 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4394 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4396 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_selectedColumns */

+

+/* 4398 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4400 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4404 */	NdrFcShort( 0xd ),	/* 13 */

+/* 4406 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4408 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4410 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4412 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4414 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 4416 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4418 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4420 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter selectedColumns */

+

+/* 4422 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 4424 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4426 */	NdrFcShort( 0x5d4 ),	/* Type Offset=1492 */

+

+	/* Parameter nColumns */

+

+/* 4428 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4430 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4432 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4434 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4436 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4438 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_selectedRows */

+

+/* 4440 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4442 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4446 */	NdrFcShort( 0xe ),	/* 14 */

+/* 4448 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4450 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4452 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4454 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4456 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 4458 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4460 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4462 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter selectedRows */

+

+/* 4464 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 4466 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4468 */	NdrFcShort( 0x5d4 ),	/* Type Offset=1492 */

+

+	/* Parameter nRows */

+

+/* 4470 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4472 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4474 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4476 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4478 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4480 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_summary */

+

+/* 4482 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4484 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4488 */	NdrFcShort( 0xf ),	/* 15 */

+/* 4490 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4492 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4494 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4496 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4498 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4500 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4502 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4504 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter accessible */

+

+/* 4506 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 4508 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4510 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Return value */

+

+/* 4512 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4514 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4516 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isColumnSelected */

+

+/* 4518 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4520 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4524 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 4526 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4528 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4530 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 4532 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 4534 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4536 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4538 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4540 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+/* 4542 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4544 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4546 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter isSelected */

+

+/* 4548 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4550 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4552 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4554 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4556 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4558 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isRowSelected */

+

+/* 4560 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4562 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4566 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 4568 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4570 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4572 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 4574 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 4576 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4578 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4580 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4582 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 4584 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4586 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4588 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter isSelected */

+

+/* 4590 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4592 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4594 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4596 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4598 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4600 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure selectRow */

+

+/* 4602 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4604 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4608 */	NdrFcShort( 0x12 ),	/* 18 */

+/* 4610 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4612 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4614 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4616 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4618 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4620 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4622 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4624 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 4626 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4628 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4630 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4632 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4634 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4636 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure selectColumn */

+

+/* 4638 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4640 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4644 */	NdrFcShort( 0x13 ),	/* 19 */

+/* 4646 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4648 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4650 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4652 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4654 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4656 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4658 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4660 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+/* 4662 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4664 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4666 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4668 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4670 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4672 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure unselectRow */

+

+/* 4674 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4676 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4680 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 4682 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4684 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4686 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4688 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4690 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4692 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4694 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4696 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 4698 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4700 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4702 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4704 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4706 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4708 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure unselectColumn */

+

+/* 4710 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4712 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4716 */	NdrFcShort( 0x15 ),	/* 21 */

+/* 4718 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4720 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4722 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4724 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4726 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4728 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4730 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4732 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter column */

+

+/* 4734 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 4736 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4738 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4740 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4742 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4744 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_modelChange */

+

+/* 4746 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4748 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4752 */	NdrFcShort( 0x16 ),	/* 22 */

+/* 4754 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4756 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4758 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4760 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4762 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4764 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4766 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4768 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter modelChange */

+

+/* 4770 */	NdrFcShort( 0x6113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=24 */

+/* 4772 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4774 */	NdrFcShort( 0x5a8 ),	/* Type Offset=1448 */

+

+	/* Return value */

+

+/* 4776 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4778 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4780 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_columnHeaderCells */

+

+/* 4782 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4784 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4788 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 4790 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4792 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4794 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4796 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4798 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 4800 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4802 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4804 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter cellAccessibles */

+

+/* 4806 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 4808 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4810 */	NdrFcShort( 0x5b6 ),	/* Type Offset=1462 */

+

+	/* Parameter nColumnHeaderCells */

+

+/* 4812 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4814 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4816 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4818 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4820 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4822 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowHeaderCells */

+

+/* 4824 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4826 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4830 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 4832 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4834 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4836 */	NdrFcShort( 0x24 ),	/* 36 */

+/* 4838 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 4840 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 4842 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 4844 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4846 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter cellAccessibles */

+

+/* 4848 */	NdrFcShort( 0x2013 ),	/* Flags:  must size, must free, out, srv alloc size=8 */

+/* 4850 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4852 */	NdrFcShort( 0x5b6 ),	/* Type Offset=1462 */

+

+	/* Parameter nRowHeaderCells */

+

+/* 4854 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4856 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4858 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4860 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4862 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4864 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_isSelected */

+

+/* 4866 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4868 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4872 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 4874 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4876 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4878 */	NdrFcShort( 0x21 ),	/* 33 */

+/* 4880 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 4882 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4884 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4886 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4888 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter isSelected */

+

+/* 4890 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4892 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4894 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4896 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4898 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4900 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_rowColumnExtents */

+

+/* 4902 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4904 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4908 */	NdrFcShort( 0xa ),	/* 10 */

+/* 4910 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

+/* 4912 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4914 */	NdrFcShort( 0x91 ),	/* 145 */

+/* 4916 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x6,		/* 6 */

+/* 4918 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4920 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4922 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4924 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter row */

+

+/* 4926 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4928 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4930 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter column */

+

+/* 4932 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4934 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4936 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter rowExtents */

+

+/* 4938 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4940 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4942 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter columnExtents */

+

+/* 4944 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4946 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 4948 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter isSelected */

+

+/* 4950 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 4952 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 4954 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 4956 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4958 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

+/* 4960 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_table */

+

+/* 4962 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 4964 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 4968 */	NdrFcShort( 0xb ),	/* 11 */

+/* 4970 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 4972 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4974 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 4976 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 4978 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 4980 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4982 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 4984 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter table */

+

+/* 4986 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 4988 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 4990 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Return value */

+

+/* 4992 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 4994 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 4996 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_imagePosition */

+

+/* 4998 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 5000 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 5004 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 5006 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

+/* 5008 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 5010 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 5012 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x4,		/* 4 */

+/* 5014 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 5016 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5018 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5020 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter coordinateType */

+

+/* 5022 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 5024 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 5026 */	0xd,		/* FC_ENUM16 */

+			0x0,		/* 0 */

+

+	/* Parameter x */

+

+/* 5028 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 5030 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 5032 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter y */

+

+/* 5034 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 5036 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 5038 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 5040 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 5042 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 5044 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_imageSize */

+

+/* 5046 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 5048 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 5052 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 5054 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 5056 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5058 */	NdrFcShort( 0x40 ),	/* 64 */

+/* 5060 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x3,		/* 3 */

+/* 5062 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 5064 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5066 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5068 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter height */

+

+/* 5070 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 5072 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 5074 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter width */

+

+/* 5076 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 5078 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 5080 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 5082 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 5084 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 5086 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_toolkitName */

+

+/* 5088 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 5090 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 5094 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 5096 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 5098 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5100 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 5102 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 5104 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 5106 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 5108 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5110 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter name */

+

+/* 5112 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 5114 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 5116 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 5118 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 5120 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 5122 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_toolkitVersion */

+

+/* 5124 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 5126 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 5130 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 5132 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 5134 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5136 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 5138 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 5140 */	0x8,		/* 8 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 5142 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 5144 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5146 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter version */

+

+/* 5148 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 5150 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 5152 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 5154 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 5156 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 5158 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_anchorTarget */

+

+/* 5160 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 5162 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 5166 */	NdrFcShort( 0x3 ),	/* 3 */

+/* 5168 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 5170 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5172 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 5174 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 5176 */	0x8,		/* 8 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 5178 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5180 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 5182 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter accessible */

+

+/* 5184 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 5186 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 5188 */	NdrFcShort( 0x2e ),	/* Type Offset=46 */

+

+	/* Return value */

+

+/* 5190 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 5192 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 5194 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+			0x0

+        }

+    };

+

+static const ia2_api_all_MIDL_TYPE_FORMAT_STRING ia2_api_all__MIDL_TypeFormatString =

+    {

+        0,

+        {

+			NdrFcShort( 0x0 ),	/* 0 */

+/*  2 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/*  4 */	NdrFcShort( 0x1c ),	/* Offset= 28 (32) */

+/*  6 */	

+			0x13, 0x0,	/* FC_OP */

+/*  8 */	NdrFcShort( 0xe ),	/* Offset= 14 (22) */

+/* 10 */	

+			0x1b,		/* FC_CARRAY */

+			0x1,		/* 1 */

+/* 12 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 14 */	0x9,		/* Corr desc: FC_ULONG */

+			0x0,		/*  */

+/* 16 */	NdrFcShort( 0xfffc ),	/* -4 */

+/* 18 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 20 */	0x6,		/* FC_SHORT */

+			0x5b,		/* FC_END */

+/* 22 */	

+			0x17,		/* FC_CSTRUCT */

+			0x3,		/* 3 */

+/* 24 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 26 */	NdrFcShort( 0xfff0 ),	/* Offset= -16 (10) */

+/* 28 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 30 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 32 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 34 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 36 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 38 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 40 */	NdrFcShort( 0xffde ),	/* Offset= -34 (6) */

+/* 42 */	

+			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */

+/* 44 */	0x8,		/* FC_LONG */

+			0x5c,		/* FC_PAD */

+/* 46 */	

+			0x11, 0x10,	/* FC_RP [pointer_deref] */

+/* 48 */	NdrFcShort( 0x2 ),	/* Offset= 2 (50) */

+/* 50 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 52 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 56 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 58 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 60 */	0xc0,		/* 192 */

+			0x0,		/* 0 */

+/* 62 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 64 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 66 */	0x0,		/* 0 */

+			0x46,		/* 70 */

+/* 68 */	

+			0x11, 0x0,	/* FC_RP */

+/* 70 */	NdrFcShort( 0x2 ),	/* Offset= 2 (72) */

+/* 72 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 74 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 76 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x0,		/*  */

+/* 78 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 80 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 82 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 84 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 86 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 88 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 90 */	NdrFcShort( 0xffd8 ),	/* Offset= -40 (50) */

+/* 92 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 94 */	

+			0x11, 0x14,	/* FC_RP [alloced_on_stack] [pointer_deref] */

+/* 96 */	NdrFcShort( 0x2 ),	/* Offset= 2 (98) */

+/* 98 */	

+			0x13, 0x0,	/* FC_OP */

+/* 100 */	NdrFcShort( 0x2 ),	/* Offset= 2 (102) */

+/* 102 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 104 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 106 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x0,		/*  */

+/* 108 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 110 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 112 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 114 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 116 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 118 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 120 */	NdrFcShort( 0xffa8 ),	/* Offset= -88 (32) */

+/* 122 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 124 */	

+			0x11, 0x10,	/* FC_RP [pointer_deref] */

+/* 126 */	NdrFcShort( 0x2 ),	/* Offset= 2 (128) */

+/* 128 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 130 */	NdrFcLong( 0x7cdf86ee ),	/* 2095023854 */

+/* 134 */	NdrFcShort( 0xc3da ),	/* -15398 */

+/* 136 */	NdrFcShort( 0x496a ),	/* 18794 */

+/* 138 */	0xbd,		/* 189 */

+			0xa4,		/* 164 */

+/* 140 */	0x28,		/* 40 */

+			0x1b,		/* 27 */

+/* 142 */	0x33,		/* 51 */

+			0x6e,		/* 110 */

+/* 144 */	0x1f,		/* 31 */

+			0xdc,		/* 220 */

+/* 146 */	

+			0x11, 0x0,	/* FC_RP */

+/* 148 */	NdrFcShort( 0x2 ),	/* Offset= 2 (150) */

+/* 150 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 152 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 154 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x0,		/*  */

+/* 156 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 158 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 160 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 162 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 164 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 166 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 168 */	NdrFcShort( 0xffd8 ),	/* Offset= -40 (128) */

+/* 170 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 172 */	

+			0x11, 0x14,	/* FC_RP [alloced_on_stack] [pointer_deref] */

+/* 174 */	NdrFcShort( 0x2 ),	/* Offset= 2 (176) */

+/* 176 */	

+			0x13, 0x0,	/* FC_OP */

+/* 178 */	NdrFcShort( 0x2 ),	/* Offset= 2 (180) */

+/* 180 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 182 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 184 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x0,		/*  */

+/* 186 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 188 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 190 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 192 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 194 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 196 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 198 */	NdrFcShort( 0xff5a ),	/* Offset= -166 (32) */

+/* 200 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 202 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/* 204 */	NdrFcShort( 0x1a ),	/* Offset= 26 (230) */

+/* 206 */	

+			0x13, 0x0,	/* FC_OP */

+/* 208 */	NdrFcShort( 0x2 ),	/* Offset= 2 (210) */

+/* 210 */	

+			0x2a,		/* FC_ENCAPSULATED_UNION */

+			0x48,		/* 72 */

+/* 212 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 214 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 216 */	NdrFcLong( 0x48746457 ),	/* 1215587415 */

+/* 220 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 222 */	NdrFcLong( 0x52746457 ),	/* 1383359575 */

+/* 226 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 228 */	NdrFcShort( 0xffff ),	/* Offset= -1 (227) */

+/* 230 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 232 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 234 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 236 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 238 */	NdrFcShort( 0xffe0 ),	/* Offset= -32 (206) */

+/* 240 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/* 242 */	NdrFcShort( 0x2 ),	/* Offset= 2 (244) */

+/* 244 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 246 */	NdrFcShort( 0xc ),	/* 12 */

+/* 248 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 250 */	NdrFcShort( 0x0 ),	/* Offset= 0 (250) */

+/* 252 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 254 */	NdrFcShort( 0xff22 ),	/* Offset= -222 (32) */

+/* 256 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 258 */	NdrFcShort( 0xff1e ),	/* Offset= -226 (32) */

+/* 260 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 262 */	NdrFcShort( 0xff1a ),	/* Offset= -230 (32) */

+/* 264 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 266 */	

+			0x12, 0x0,	/* FC_UP */

+/* 268 */	NdrFcShort( 0xff0a ),	/* Offset= -246 (22) */

+/* 270 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 272 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 274 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 276 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 278 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (266) */

+/* 280 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/* 282 */	NdrFcShort( 0x3d4 ),	/* Offset= 980 (1262) */

+/* 284 */	

+			0x13, 0x0,	/* FC_OP */

+/* 286 */	NdrFcShort( 0x3bc ),	/* Offset= 956 (1242) */

+/* 288 */	

+			0x2b,		/* FC_NON_ENCAPSULATED_UNION */

+			0x9,		/* FC_ULONG */

+/* 290 */	0x7,		/* Corr desc: FC_USHORT */

+			0x0,		/*  */

+/* 292 */	NdrFcShort( 0xfff8 ),	/* -8 */

+/* 294 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 296 */	NdrFcShort( 0x2 ),	/* Offset= 2 (298) */

+/* 298 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 300 */	NdrFcShort( 0x2f ),	/* 47 */

+/* 302 */	NdrFcLong( 0x14 ),	/* 20 */

+/* 306 */	NdrFcShort( 0x800b ),	/* Simple arm type: FC_HYPER */

+/* 308 */	NdrFcLong( 0x3 ),	/* 3 */

+/* 312 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 314 */	NdrFcLong( 0x11 ),	/* 17 */

+/* 318 */	NdrFcShort( 0x8001 ),	/* Simple arm type: FC_BYTE */

+/* 320 */	NdrFcLong( 0x2 ),	/* 2 */

+/* 324 */	NdrFcShort( 0x8006 ),	/* Simple arm type: FC_SHORT */

+/* 326 */	NdrFcLong( 0x4 ),	/* 4 */

+/* 330 */	NdrFcShort( 0x800a ),	/* Simple arm type: FC_FLOAT */

+/* 332 */	NdrFcLong( 0x5 ),	/* 5 */

+/* 336 */	NdrFcShort( 0x800c ),	/* Simple arm type: FC_DOUBLE */

+/* 338 */	NdrFcLong( 0xb ),	/* 11 */

+/* 342 */	NdrFcShort( 0x8006 ),	/* Simple arm type: FC_SHORT */

+/* 344 */	NdrFcLong( 0xa ),	/* 10 */

+/* 348 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 350 */	NdrFcLong( 0x6 ),	/* 6 */

+/* 354 */	NdrFcShort( 0xe8 ),	/* Offset= 232 (586) */

+/* 356 */	NdrFcLong( 0x7 ),	/* 7 */

+/* 360 */	NdrFcShort( 0x800c ),	/* Simple arm type: FC_DOUBLE */

+/* 362 */	NdrFcLong( 0x8 ),	/* 8 */

+/* 366 */	NdrFcShort( 0xfe98 ),	/* Offset= -360 (6) */

+/* 368 */	NdrFcLong( 0xd ),	/* 13 */

+/* 372 */	NdrFcShort( 0xfebe ),	/* Offset= -322 (50) */

+/* 374 */	NdrFcLong( 0x9 ),	/* 9 */

+/* 378 */	NdrFcShort( 0xd6 ),	/* Offset= 214 (592) */

+/* 380 */	NdrFcLong( 0x2000 ),	/* 8192 */

+/* 384 */	NdrFcShort( 0xe2 ),	/* Offset= 226 (610) */

+/* 386 */	NdrFcLong( 0x24 ),	/* 36 */

+/* 390 */	NdrFcShort( 0x30a ),	/* Offset= 778 (1168) */

+/* 392 */	NdrFcLong( 0x4024 ),	/* 16420 */

+/* 396 */	NdrFcShort( 0x304 ),	/* Offset= 772 (1168) */

+/* 398 */	NdrFcLong( 0x4011 ),	/* 16401 */

+/* 402 */	NdrFcShort( 0x302 ),	/* Offset= 770 (1172) */

+/* 404 */	NdrFcLong( 0x4002 ),	/* 16386 */

+/* 408 */	NdrFcShort( 0x300 ),	/* Offset= 768 (1176) */

+/* 410 */	NdrFcLong( 0x4003 ),	/* 16387 */

+/* 414 */	NdrFcShort( 0x2fe ),	/* Offset= 766 (1180) */

+/* 416 */	NdrFcLong( 0x4014 ),	/* 16404 */

+/* 420 */	NdrFcShort( 0x2fc ),	/* Offset= 764 (1184) */

+/* 422 */	NdrFcLong( 0x4004 ),	/* 16388 */

+/* 426 */	NdrFcShort( 0x2fa ),	/* Offset= 762 (1188) */

+/* 428 */	NdrFcLong( 0x4005 ),	/* 16389 */

+/* 432 */	NdrFcShort( 0x2f8 ),	/* Offset= 760 (1192) */

+/* 434 */	NdrFcLong( 0x400b ),	/* 16395 */

+/* 438 */	NdrFcShort( 0x2e2 ),	/* Offset= 738 (1176) */

+/* 440 */	NdrFcLong( 0x400a ),	/* 16394 */

+/* 444 */	NdrFcShort( 0x2e0 ),	/* Offset= 736 (1180) */

+/* 446 */	NdrFcLong( 0x4006 ),	/* 16390 */

+/* 450 */	NdrFcShort( 0x2ea ),	/* Offset= 746 (1196) */

+/* 452 */	NdrFcLong( 0x4007 ),	/* 16391 */

+/* 456 */	NdrFcShort( 0x2e0 ),	/* Offset= 736 (1192) */

+/* 458 */	NdrFcLong( 0x4008 ),	/* 16392 */

+/* 462 */	NdrFcShort( 0x2e2 ),	/* Offset= 738 (1200) */

+/* 464 */	NdrFcLong( 0x400d ),	/* 16397 */

+/* 468 */	NdrFcShort( 0x2e0 ),	/* Offset= 736 (1204) */

+/* 470 */	NdrFcLong( 0x4009 ),	/* 16393 */

+/* 474 */	NdrFcShort( 0x2de ),	/* Offset= 734 (1208) */

+/* 476 */	NdrFcLong( 0x6000 ),	/* 24576 */

+/* 480 */	NdrFcShort( 0x2dc ),	/* Offset= 732 (1212) */

+/* 482 */	NdrFcLong( 0x400c ),	/* 16396 */

+/* 486 */	NdrFcShort( 0x2da ),	/* Offset= 730 (1216) */

+/* 488 */	NdrFcLong( 0x10 ),	/* 16 */

+/* 492 */	NdrFcShort( 0x8002 ),	/* Simple arm type: FC_CHAR */

+/* 494 */	NdrFcLong( 0x12 ),	/* 18 */

+/* 498 */	NdrFcShort( 0x8006 ),	/* Simple arm type: FC_SHORT */

+/* 500 */	NdrFcLong( 0x13 ),	/* 19 */

+/* 504 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 506 */	NdrFcLong( 0x15 ),	/* 21 */

+/* 510 */	NdrFcShort( 0x800b ),	/* Simple arm type: FC_HYPER */

+/* 512 */	NdrFcLong( 0x16 ),	/* 22 */

+/* 516 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 518 */	NdrFcLong( 0x17 ),	/* 23 */

+/* 522 */	NdrFcShort( 0x8008 ),	/* Simple arm type: FC_LONG */

+/* 524 */	NdrFcLong( 0xe ),	/* 14 */

+/* 528 */	NdrFcShort( 0x2b8 ),	/* Offset= 696 (1224) */

+/* 530 */	NdrFcLong( 0x400e ),	/* 16398 */

+/* 534 */	NdrFcShort( 0x2bc ),	/* Offset= 700 (1234) */

+/* 536 */	NdrFcLong( 0x4010 ),	/* 16400 */

+/* 540 */	NdrFcShort( 0x2ba ),	/* Offset= 698 (1238) */

+/* 542 */	NdrFcLong( 0x4012 ),	/* 16402 */

+/* 546 */	NdrFcShort( 0x276 ),	/* Offset= 630 (1176) */

+/* 548 */	NdrFcLong( 0x4013 ),	/* 16403 */

+/* 552 */	NdrFcShort( 0x274 ),	/* Offset= 628 (1180) */

+/* 554 */	NdrFcLong( 0x4015 ),	/* 16405 */

+/* 558 */	NdrFcShort( 0x272 ),	/* Offset= 626 (1184) */

+/* 560 */	NdrFcLong( 0x4016 ),	/* 16406 */

+/* 564 */	NdrFcShort( 0x268 ),	/* Offset= 616 (1180) */

+/* 566 */	NdrFcLong( 0x4017 ),	/* 16407 */

+/* 570 */	NdrFcShort( 0x262 ),	/* Offset= 610 (1180) */

+/* 572 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 576 */	NdrFcShort( 0x0 ),	/* Offset= 0 (576) */

+/* 578 */	NdrFcLong( 0x1 ),	/* 1 */

+/* 582 */	NdrFcShort( 0x0 ),	/* Offset= 0 (582) */

+/* 584 */	NdrFcShort( 0xffff ),	/* Offset= -1 (583) */

+/* 586 */	

+			0x15,		/* FC_STRUCT */

+			0x7,		/* 7 */

+/* 588 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 590 */	0xb,		/* FC_HYPER */

+			0x5b,		/* FC_END */

+/* 592 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 594 */	NdrFcLong( 0x20400 ),	/* 132096 */

+/* 598 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 600 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 602 */	0xc0,		/* 192 */

+			0x0,		/* 0 */

+/* 604 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 606 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 608 */	0x0,		/* 0 */

+			0x46,		/* 70 */

+/* 610 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 612 */	NdrFcShort( 0x2 ),	/* Offset= 2 (614) */

+/* 614 */	

+			0x13, 0x0,	/* FC_OP */

+/* 616 */	NdrFcShort( 0x216 ),	/* Offset= 534 (1150) */

+/* 618 */	

+			0x2a,		/* FC_ENCAPSULATED_UNION */

+			0x49,		/* 73 */

+/* 620 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 622 */	NdrFcShort( 0xa ),	/* 10 */

+/* 624 */	NdrFcLong( 0x8 ),	/* 8 */

+/* 628 */	NdrFcShort( 0x5a ),	/* Offset= 90 (718) */

+/* 630 */	NdrFcLong( 0xd ),	/* 13 */

+/* 634 */	NdrFcShort( 0x7e ),	/* Offset= 126 (760) */

+/* 636 */	NdrFcLong( 0x9 ),	/* 9 */

+/* 640 */	NdrFcShort( 0x9e ),	/* Offset= 158 (798) */

+/* 642 */	NdrFcLong( 0xc ),	/* 12 */

+/* 646 */	NdrFcShort( 0xc8 ),	/* Offset= 200 (846) */

+/* 648 */	NdrFcLong( 0x24 ),	/* 36 */

+/* 652 */	NdrFcShort( 0x124 ),	/* Offset= 292 (944) */

+/* 654 */	NdrFcLong( 0x800d ),	/* 32781 */

+/* 658 */	NdrFcShort( 0x140 ),	/* Offset= 320 (978) */

+/* 660 */	NdrFcLong( 0x10 ),	/* 16 */

+/* 664 */	NdrFcShort( 0x15a ),	/* Offset= 346 (1010) */

+/* 666 */	NdrFcLong( 0x2 ),	/* 2 */

+/* 670 */	NdrFcShort( 0x174 ),	/* Offset= 372 (1042) */

+/* 672 */	NdrFcLong( 0x3 ),	/* 3 */

+/* 676 */	NdrFcShort( 0x18e ),	/* Offset= 398 (1074) */

+/* 678 */	NdrFcLong( 0x14 ),	/* 20 */

+/* 682 */	NdrFcShort( 0x1a8 ),	/* Offset= 424 (1106) */

+/* 684 */	NdrFcShort( 0xffff ),	/* Offset= -1 (683) */

+/* 686 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 688 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 690 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 692 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 694 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 696 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 698 */	

+			0x48,		/* FC_VARIABLE_REPEAT */

+			0x49,		/* FC_FIXED_OFFSET */

+/* 700 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 702 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 704 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 706 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 708 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 710 */	0x13, 0x0,	/* FC_OP */

+/* 712 */	NdrFcShort( 0xfd4e ),	/* Offset= -690 (22) */

+/* 714 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 716 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 718 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 720 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 722 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 724 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 726 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 728 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 730 */	0x11, 0x0,	/* FC_RP */

+/* 732 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (686) */

+/* 734 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 736 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 738 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 740 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 742 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 744 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 746 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 748 */	NdrFcLong( 0xffffffff ),	/* -1 */

+/* 752 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 754 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 756 */	NdrFcShort( 0xfd3e ),	/* Offset= -706 (50) */

+/* 758 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 760 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 762 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 764 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 766 */	NdrFcShort( 0x6 ),	/* Offset= 6 (772) */

+/* 768 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 770 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 772 */	

+			0x11, 0x0,	/* FC_RP */

+/* 774 */	NdrFcShort( 0xffdc ),	/* Offset= -36 (738) */

+/* 776 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 778 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 780 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 782 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 784 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 786 */	NdrFcLong( 0xffffffff ),	/* -1 */

+/* 790 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 792 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 794 */	NdrFcShort( 0xff36 ),	/* Offset= -202 (592) */

+/* 796 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 798 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 800 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 802 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 804 */	NdrFcShort( 0x6 ),	/* Offset= 6 (810) */

+/* 806 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 808 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 810 */	

+			0x11, 0x0,	/* FC_RP */

+/* 812 */	NdrFcShort( 0xffdc ),	/* Offset= -36 (776) */

+/* 814 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 816 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 818 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 820 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 822 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 824 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 826 */	

+			0x48,		/* FC_VARIABLE_REPEAT */

+			0x49,		/* FC_FIXED_OFFSET */

+/* 828 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 830 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 832 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 834 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 836 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 838 */	0x13, 0x0,	/* FC_OP */

+/* 840 */	NdrFcShort( 0x192 ),	/* Offset= 402 (1242) */

+/* 842 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 844 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 846 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 848 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 850 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 852 */	NdrFcShort( 0x6 ),	/* Offset= 6 (858) */

+/* 854 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 856 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 858 */	

+			0x11, 0x0,	/* FC_RP */

+/* 860 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (814) */

+/* 862 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 864 */	NdrFcLong( 0x2f ),	/* 47 */

+/* 868 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 870 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 872 */	0xc0,		/* 192 */

+			0x0,		/* 0 */

+/* 874 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 876 */	0x0,		/* 0 */

+			0x0,		/* 0 */

+/* 878 */	0x0,		/* 0 */

+			0x46,		/* 70 */

+/* 880 */	

+			0x1b,		/* FC_CARRAY */

+			0x0,		/* 0 */

+/* 882 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 884 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 886 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 888 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 890 */	0x1,		/* FC_BYTE */

+			0x5b,		/* FC_END */

+/* 892 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 894 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 896 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 898 */	NdrFcShort( 0xa ),	/* Offset= 10 (908) */

+/* 900 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 902 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 904 */	NdrFcShort( 0xffd6 ),	/* Offset= -42 (862) */

+/* 906 */	0x36,		/* FC_POINTER */

+			0x5b,		/* FC_END */

+/* 908 */	

+			0x13, 0x0,	/* FC_OP */

+/* 910 */	NdrFcShort( 0xffe2 ),	/* Offset= -30 (880) */

+/* 912 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 914 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 916 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 918 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 920 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 922 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 924 */	

+			0x48,		/* FC_VARIABLE_REPEAT */

+			0x49,		/* FC_FIXED_OFFSET */

+/* 926 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 928 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 930 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 932 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 934 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 936 */	0x13, 0x0,	/* FC_OP */

+/* 938 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (892) */

+/* 940 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 942 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 944 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 946 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 948 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 950 */	NdrFcShort( 0x6 ),	/* Offset= 6 (956) */

+/* 952 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 954 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 956 */	

+			0x11, 0x0,	/* FC_RP */

+/* 958 */	NdrFcShort( 0xffd2 ),	/* Offset= -46 (912) */

+/* 960 */	

+			0x1d,		/* FC_SMFARRAY */

+			0x0,		/* 0 */

+/* 962 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 964 */	0x1,		/* FC_BYTE */

+			0x5b,		/* FC_END */

+/* 966 */	

+			0x15,		/* FC_STRUCT */

+			0x3,		/* 3 */

+/* 968 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 970 */	0x8,		/* FC_LONG */

+			0x6,		/* FC_SHORT */

+/* 972 */	0x6,		/* FC_SHORT */

+			0x4c,		/* FC_EMBEDDED_COMPLEX */

+/* 974 */	0x0,		/* 0 */

+			NdrFcShort( 0xfff1 ),	/* Offset= -15 (960) */

+			0x5b,		/* FC_END */

+/* 978 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 980 */	NdrFcShort( 0x18 ),	/* 24 */

+/* 982 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 984 */	NdrFcShort( 0xa ),	/* Offset= 10 (994) */

+/* 986 */	0x8,		/* FC_LONG */

+			0x36,		/* FC_POINTER */

+/* 988 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 990 */	NdrFcShort( 0xffe8 ),	/* Offset= -24 (966) */

+/* 992 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 994 */	

+			0x11, 0x0,	/* FC_RP */

+/* 996 */	NdrFcShort( 0xfefe ),	/* Offset= -258 (738) */

+/* 998 */	

+			0x1b,		/* FC_CARRAY */

+			0x0,		/* 0 */

+/* 1000 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 1002 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 1004 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1006 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 1008 */	0x1,		/* FC_BYTE */

+			0x5b,		/* FC_END */

+/* 1010 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 1012 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1014 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 1016 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 1018 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1020 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1022 */	0x13, 0x0,	/* FC_OP */

+/* 1024 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (998) */

+/* 1026 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 1028 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 1030 */	

+			0x1b,		/* FC_CARRAY */

+			0x1,		/* 1 */

+/* 1032 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 1034 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 1036 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1038 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 1040 */	0x6,		/* FC_SHORT */

+			0x5b,		/* FC_END */

+/* 1042 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 1044 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1046 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 1048 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 1050 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1052 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1054 */	0x13, 0x0,	/* FC_OP */

+/* 1056 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (1030) */

+/* 1058 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 1060 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 1062 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 1064 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1066 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 1068 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1070 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 1072 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 1074 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 1076 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1078 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 1080 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 1082 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1084 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1086 */	0x13, 0x0,	/* FC_OP */

+/* 1088 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (1062) */

+/* 1090 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 1092 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 1094 */	

+			0x1b,		/* FC_CARRAY */

+			0x7,		/* 7 */

+/* 1096 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1098 */	0x19,		/* Corr desc:  field pointer, FC_ULONG */

+			0x0,		/*  */

+/* 1100 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1102 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 1104 */	0xb,		/* FC_HYPER */

+			0x5b,		/* FC_END */

+/* 1106 */	

+			0x16,		/* FC_PSTRUCT */

+			0x3,		/* 3 */

+/* 1108 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1110 */	

+			0x4b,		/* FC_PP */

+			0x5c,		/* FC_PAD */

+/* 1112 */	

+			0x46,		/* FC_NO_REPEAT */

+			0x5c,		/* FC_PAD */

+/* 1114 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1116 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1118 */	0x13, 0x0,	/* FC_OP */

+/* 1120 */	NdrFcShort( 0xffe6 ),	/* Offset= -26 (1094) */

+/* 1122 */	

+			0x5b,		/* FC_END */

+

+			0x8,		/* FC_LONG */

+/* 1124 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 1126 */	

+			0x15,		/* FC_STRUCT */

+			0x3,		/* 3 */

+/* 1128 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1130 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 1132 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1134 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 1136 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 1138 */	0x7,		/* Corr desc: FC_USHORT */

+			0x0,		/*  */

+/* 1140 */	NdrFcShort( 0xffd8 ),	/* -40 */

+/* 1142 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 1144 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1146 */	NdrFcShort( 0xffec ),	/* Offset= -20 (1126) */

+/* 1148 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1150 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 1152 */	NdrFcShort( 0x28 ),	/* 40 */

+/* 1154 */	NdrFcShort( 0xffec ),	/* Offset= -20 (1134) */

+/* 1156 */	NdrFcShort( 0x0 ),	/* Offset= 0 (1156) */

+/* 1158 */	0x6,		/* FC_SHORT */

+			0x6,		/* FC_SHORT */

+/* 1160 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 1162 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1164 */	NdrFcShort( 0xfdde ),	/* Offset= -546 (618) */

+/* 1166 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1168 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1170 */	NdrFcShort( 0xfeea ),	/* Offset= -278 (892) */

+/* 1172 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1174 */	0x1,		/* FC_BYTE */

+			0x5c,		/* FC_PAD */

+/* 1176 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1178 */	0x6,		/* FC_SHORT */

+			0x5c,		/* FC_PAD */

+/* 1180 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1182 */	0x8,		/* FC_LONG */

+			0x5c,		/* FC_PAD */

+/* 1184 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1186 */	0xb,		/* FC_HYPER */

+			0x5c,		/* FC_PAD */

+/* 1188 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1190 */	0xa,		/* FC_FLOAT */

+			0x5c,		/* FC_PAD */

+/* 1192 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1194 */	0xc,		/* FC_DOUBLE */

+			0x5c,		/* FC_PAD */

+/* 1196 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1198 */	NdrFcShort( 0xfd9c ),	/* Offset= -612 (586) */

+/* 1200 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1202 */	NdrFcShort( 0xfb54 ),	/* Offset= -1196 (6) */

+/* 1204 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1206 */	NdrFcShort( 0xfb7c ),	/* Offset= -1156 (50) */

+/* 1208 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1210 */	NdrFcShort( 0xfd96 ),	/* Offset= -618 (592) */

+/* 1212 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1214 */	NdrFcShort( 0xfda4 ),	/* Offset= -604 (610) */

+/* 1216 */	

+			0x13, 0x10,	/* FC_OP [pointer_deref] */

+/* 1218 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1220) */

+/* 1220 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1222 */	NdrFcShort( 0x14 ),	/* Offset= 20 (1242) */

+/* 1224 */	

+			0x15,		/* FC_STRUCT */

+			0x7,		/* 7 */

+/* 1226 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1228 */	0x6,		/* FC_SHORT */

+			0x1,		/* FC_BYTE */

+/* 1230 */	0x1,		/* FC_BYTE */

+			0x8,		/* FC_LONG */

+/* 1232 */	0xb,		/* FC_HYPER */

+			0x5b,		/* FC_END */

+/* 1234 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1236 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (1224) */

+/* 1238 */	

+			0x13, 0x8,	/* FC_OP [simple_pointer] */

+/* 1240 */	0x2,		/* FC_CHAR */

+			0x5c,		/* FC_PAD */

+/* 1242 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x7,		/* 7 */

+/* 1244 */	NdrFcShort( 0x20 ),	/* 32 */

+/* 1246 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1248 */	NdrFcShort( 0x0 ),	/* Offset= 0 (1248) */

+/* 1250 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 1252 */	0x6,		/* FC_SHORT */

+			0x6,		/* FC_SHORT */

+/* 1254 */	0x6,		/* FC_SHORT */

+			0x6,		/* FC_SHORT */

+/* 1256 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1258 */	NdrFcShort( 0xfc36 ),	/* Offset= -970 (288) */

+/* 1260 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1262 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 1264 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 1266 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1268 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1270 */	NdrFcShort( 0xfc26 ),	/* Offset= -986 (284) */

+/* 1272 */	

+			0x11, 0x14,	/* FC_RP [alloced_on_stack] [pointer_deref] */

+/* 1274 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1276) */

+/* 1276 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1278 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1280) */

+/* 1280 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 1282 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1284 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 1286 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 1288 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1290 */	NdrFcLong( 0xffffffff ),	/* -1 */

+/* 1294 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1296 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1298 */	NdrFcShort( 0xfb20 ),	/* Offset= -1248 (50) */

+/* 1300 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1302 */	

+			0x12, 0x0,	/* FC_UP */

+/* 1304 */	NdrFcShort( 0xffc2 ),	/* Offset= -62 (1242) */

+/* 1306 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 1308 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 1310 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 1312 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1314 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (1302) */

+/* 1316 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/* 1318 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1320) */

+/* 1320 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 1322 */	NdrFcShort( 0xc ),	/* 12 */

+/* 1324 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1326 */	NdrFcShort( 0x0 ),	/* Offset= 0 (1326) */

+/* 1328 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1330 */	NdrFcShort( 0xfaee ),	/* Offset= -1298 (32) */

+/* 1332 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 1334 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1336 */	

+			0x11, 0x0,	/* FC_RP */

+/* 1338 */	NdrFcShort( 0xfbd4 ),	/* Offset= -1068 (270) */

+/* 1340 */	

+			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */

+/* 1342 */	0x3,		/* FC_SMALL */

+			0x5c,		/* FC_PAD */

+/* 1344 */	

+			0x11, 0x10,	/* FC_RP [pointer_deref] */

+/* 1346 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1348) */

+/* 1348 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 1350 */	NdrFcLong( 0x1c20f2b ),	/* 29495083 */

+/* 1354 */	NdrFcShort( 0x3dd2 ),	/* 15826 */

+/* 1356 */	NdrFcShort( 0x400f ),	/* 16399 */

+/* 1358 */	0x94,		/* 148 */

+			0x9f,		/* 159 */

+/* 1360 */	0xad,		/* 173 */

+			0x0,		/* 0 */

+/* 1362 */	0xbd,		/* 189 */

+			0xab,		/* 171 */

+/* 1364 */	0x1d,		/* 29 */

+			0x41,		/* 65 */

+/* 1366 */	

+			0x11, 0x14,	/* FC_RP [alloced_on_stack] [pointer_deref] */

+/* 1368 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1370) */

+/* 1370 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1372 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1374) */

+/* 1374 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 1376 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1378 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 1380 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1382 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1384 */	NdrFcLong( 0xffffffff ),	/* -1 */

+/* 1388 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1390 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1392 */	NdrFcShort( 0xffd4 ),	/* Offset= -44 (1348) */

+/* 1394 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1396 */	

+			0x11, 0x10,	/* FC_RP [pointer_deref] */

+/* 1398 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1400) */

+/* 1400 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 1402 */	NdrFcLong( 0x35ad8070 ),	/* 900563056 */

+/* 1406 */	NdrFcShort( 0xc20c ),	/* -15860 */

+/* 1408 */	NdrFcShort( 0x4fb4 ),	/* 20404 */

+/* 1410 */	0xb0,		/* 176 */

+			0x94,		/* 148 */

+/* 1412 */	0xf4,		/* 244 */

+			0xf7,		/* 247 */

+/* 1414 */	0x27,		/* 39 */

+			0x5d,		/* 93 */

+/* 1416 */	0xd4,		/* 212 */

+			0x69,		/* 105 */

+/* 1418 */	

+			0x11, 0x14,	/* FC_RP [alloced_on_stack] [pointer_deref] */

+/* 1420 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1422) */

+/* 1422 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1424 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1426) */

+/* 1426 */	

+			0x1c,		/* FC_CVARRAY */

+			0x3,		/* 3 */

+/* 1428 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1430 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x0,		/*  */

+/* 1432 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 1434 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 1436 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 1438 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 1440 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1442 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 1444 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/* 1446 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1448) */

+/* 1448 */	

+			0x1a,		/* FC_BOGUS_STRUCT */

+			0x3,		/* 3 */

+/* 1450 */	NdrFcShort( 0x14 ),	/* 20 */

+/* 1452 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1454 */	NdrFcShort( 0x0 ),	/* Offset= 0 (1454) */

+/* 1456 */	0xd,		/* FC_ENUM16 */

+			0x8,		/* FC_LONG */

+/* 1458 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 1460 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+/* 1462 */	

+			0x11, 0x14,	/* FC_RP [alloced_on_stack] [pointer_deref] */

+/* 1464 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1466) */

+/* 1466 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1468 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1470) */

+/* 1470 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 1472 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 1474 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 1476 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1478 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1480 */	NdrFcLong( 0xffffffff ),	/* -1 */

+/* 1484 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1486 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 1488 */	NdrFcShort( 0xfa62 ),	/* Offset= -1438 (50) */

+/* 1490 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 1492 */	

+			0x11, 0x14,	/* FC_RP [alloced_on_stack] [pointer_deref] */

+/* 1494 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1496) */

+/* 1496 */	

+			0x13, 0x0,	/* FC_OP */

+/* 1498 */	NdrFcShort( 0x2 ),	/* Offset= 2 (1500) */

+/* 1500 */	

+			0x1b,		/* FC_CARRAY */

+			0x3,		/* 3 */

+/* 1502 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 1504 */	0x28,		/* Corr desc:  parameter, FC_LONG */

+			0x54,		/* FC_DEREFERENCE */

+/* 1506 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 1508 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 1510 */	0x8,		/* FC_LONG */

+			0x5b,		/* FC_END */

+

+			0x0

+        }

+    };

+

+static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] = 

+        {

+            

+            {

+            BSTR_UserSize

+            ,BSTR_UserMarshal

+            ,BSTR_UserUnmarshal

+            ,BSTR_UserFree

+            },

+            {

+            HWND_UserSize

+            ,HWND_UserMarshal

+            ,HWND_UserUnmarshal

+            ,HWND_UserFree

+            },

+            {

+            VARIANT_UserSize

+            ,VARIANT_UserMarshal

+            ,VARIANT_UserUnmarshal

+            ,VARIANT_UserFree

+            }

+

+        };

+

+

+

+/* Standard interface: __MIDL_itf_ia2_api_all_0000_0000, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IUnknown, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */

+

+

+/* Object interface: IAccessibleRelation, ver. 0.0,

+   GUID={0x7CDF86EE,0xC3DA,0x496a,{0xBD,0xA4,0x28,0x1B,0x33,0x6E,0x1F,0xDC}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleRelation_FormatStringOffsetTable[] =

+    {

+    0,

+    36,

+    72,

+    108,

+    150

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleRelation_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleRelation_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleRelation_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleRelation_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(8) _IAccessibleRelationProxyVtbl = 

+{

+    &IAccessibleRelation_ProxyInfo,

+    &IID_IAccessibleRelation,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleRelation::get_relationType */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleRelation::get_localizedRelationType */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleRelation::get_nTargets */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleRelation::get_target */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleRelation::get_targets */

+};

+

+const CInterfaceStubVtbl _IAccessibleRelationStubVtbl =

+{

+    &IID_IAccessibleRelation,

+    &IAccessibleRelation_ServerInfo,

+    8,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Standard interface: __MIDL_itf_ia2_api_all_0000_0001, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IAccessibleAction, ver. 0.0,

+   GUID={0xB70D9F59,0x3B5A,0x4dba,{0xAB,0x9E,0x22,0x01,0x2F,0x60,0x7D,0xF5}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleAction_FormatStringOffsetTable[] =

+    {

+    198,

+    234,

+    270,

+    312,

+    366,

+    408

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleAction_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleAction_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleAction_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleAction_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(9) _IAccessibleActionProxyVtbl = 

+{

+    &IAccessibleAction_ProxyInfo,

+    &IID_IAccessibleAction,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::nActions */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::doAction */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_description */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_keyBinding */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_name */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_localizedName */

+};

+

+const CInterfaceStubVtbl _IAccessibleActionStubVtbl =

+{

+    &IID_IAccessibleAction,

+    &IAccessibleAction_ServerInfo,

+    9,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Standard interface: __MIDL_itf_ia2_api_all_0000_0002, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IDispatch, ver. 0.0,

+   GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */

+

+

+/* Object interface: IAccessible, ver. 0.0,

+   GUID={0x618736e0,0x3c3d,0x11cf,{0x81,0x0c,0x00,0xaa,0x00,0x38,0x9b,0x71}} */

+

+

+/* Object interface: IAccessible2, ver. 0.0,

+   GUID={0xE89F726E,0xC4F4,0x4c19,{0xBB,0x19,0xB6,0x47,0xD7,0xFA,0x84,0x78}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessible2_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    450,

+    486,

+    528,

+    576,

+    612,

+    648,

+    696,

+    744,

+    780,

+    816,

+    852,

+    888,

+    936,

+    984,

+    1020,

+    1056,

+    1092,

+    1128

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessible2_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessible2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessible2_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessible2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(46) _IAccessible2ProxyVtbl = 

+{

+    &IAccessible2_ProxyInfo,

+    &IID_IAccessible2,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    0 /* IAccessible::get_accParent */ ,

+    0 /* IAccessible::get_accChildCount */ ,

+    0 /* IAccessible::get_accChild */ ,

+    0 /* IAccessible::get_accName */ ,

+    0 /* IAccessible::get_accValue */ ,

+    0 /* IAccessible::get_accDescription */ ,

+    0 /* IAccessible::get_accRole */ ,

+    0 /* IAccessible::get_accState */ ,

+    0 /* IAccessible::get_accHelp */ ,

+    0 /* IAccessible::get_accHelpTopic */ ,

+    0 /* IAccessible::get_accKeyboardShortcut */ ,

+    0 /* IAccessible::get_accFocus */ ,

+    0 /* IAccessible::get_accSelection */ ,

+    0 /* IAccessible::get_accDefaultAction */ ,

+    0 /* IAccessible::accSelect */ ,

+    0 /* IAccessible::accLocation */ ,

+    0 /* IAccessible::accNavigate */ ,

+    0 /* IAccessible::accHitTest */ ,

+    0 /* IAccessible::accDoDefaultAction */ ,

+    0 /* IAccessible::put_accName */ ,

+    0 /* IAccessible::put_accValue */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_nRelations */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_relation */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_relations */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::role */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::scrollTo */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::scrollToPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_groupPosition */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_states */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_extendedRole */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_localizedExtendedRole */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_nExtendedStates */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_extendedStates */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_localizedExtendedStates */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_uniqueID */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_windowHandle */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_indexInParent */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_locale */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_attributes */

+};

+

+

+static const PRPC_STUB_FUNCTION IAccessible2_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAccessible2StubVtbl =

+{

+    &IID_IAccessible2,

+    &IAccessible2_ServerInfo,

+    46,

+    &IAccessible2_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Object interface: IAccessible2_2, ver. 0.0,

+   GUID={0x6C9430E9,0x299D,0x4E6F,{0xBD,0x01,0xA8,0x2A,0x1E,0x88,0xD3,0xFF}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessible2_2_FormatStringOffsetTable[] =

+    {

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    (unsigned short) -1,

+    450,

+    486,

+    528,

+    576,

+    612,

+    648,

+    696,

+    744,

+    780,

+    816,

+    852,

+    888,

+    936,

+    984,

+    1020,

+    1056,

+    1092,

+    1128,

+    1164,

+    1206,

+    1248

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessible2_2_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessible2_2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessible2_2_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessible2_2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(49) _IAccessible2_2ProxyVtbl = 

+{

+    &IAccessible2_2_ProxyInfo,

+    &IID_IAccessible2_2,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    0 /* IDispatch::GetTypeInfoCount */ ,

+    0 /* IDispatch::GetTypeInfo */ ,

+    0 /* IDispatch::GetIDsOfNames */ ,

+    0 /* IDispatch_Invoke_Proxy */ ,

+    0 /* IAccessible::get_accParent */ ,

+    0 /* IAccessible::get_accChildCount */ ,

+    0 /* IAccessible::get_accChild */ ,

+    0 /* IAccessible::get_accName */ ,

+    0 /* IAccessible::get_accValue */ ,

+    0 /* IAccessible::get_accDescription */ ,

+    0 /* IAccessible::get_accRole */ ,

+    0 /* IAccessible::get_accState */ ,

+    0 /* IAccessible::get_accHelp */ ,

+    0 /* IAccessible::get_accHelpTopic */ ,

+    0 /* IAccessible::get_accKeyboardShortcut */ ,

+    0 /* IAccessible::get_accFocus */ ,

+    0 /* IAccessible::get_accSelection */ ,

+    0 /* IAccessible::get_accDefaultAction */ ,

+    0 /* IAccessible::accSelect */ ,

+    0 /* IAccessible::accLocation */ ,

+    0 /* IAccessible::accNavigate */ ,

+    0 /* IAccessible::accHitTest */ ,

+    0 /* IAccessible::accDoDefaultAction */ ,

+    0 /* IAccessible::put_accName */ ,

+    0 /* IAccessible::put_accValue */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_nRelations */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_relation */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_relations */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::role */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::scrollTo */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::scrollToPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_groupPosition */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_states */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_extendedRole */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_localizedExtendedRole */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_nExtendedStates */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_extendedStates */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_localizedExtendedStates */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_uniqueID */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_windowHandle */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_indexInParent */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_locale */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2::get_attributes */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2_2::get_attribute */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2_2::get_accessibleWithCaret */ ,

+    (void *) (INT_PTR) -1 /* IAccessible2_2::get_relationTargetsOfType */

+};

+

+

+static const PRPC_STUB_FUNCTION IAccessible2_2_table[] =

+{

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    STUB_FORWARDING_FUNCTION,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2,

+    NdrStubCall2

+};

+

+CInterfaceStubVtbl _IAccessible2_2StubVtbl =

+{

+    &IID_IAccessible2_2,

+    &IAccessible2_2_ServerInfo,

+    49,

+    &IAccessible2_2_table[-3],

+    CStdStubBuffer_DELEGATING_METHODS

+};

+

+

+/* Standard interface: __MIDL_itf_ia2_api_all_0000_0004, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IAccessibleComponent, ver. 0.0,

+   GUID={0x1546D4B0,0x4C98,0x4bda,{0x89,0xAE,0x9A,0x64,0x74,0x8B,0xDD,0xE4}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleComponent_FormatStringOffsetTable[] =

+    {

+    1302,

+    1344,

+    72

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleComponent_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleComponent_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleComponent_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleComponent_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(6) _IAccessibleComponentProxyVtbl = 

+{

+    &IAccessibleComponent_ProxyInfo,

+    &IID_IAccessibleComponent,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleComponent::get_locationInParent */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleComponent::get_foreground */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleComponent::get_background */

+};

+

+const CInterfaceStubVtbl _IAccessibleComponentStubVtbl =

+{

+    &IID_IAccessibleComponent,

+    &IAccessibleComponent_ServerInfo,

+    6,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleValue, ver. 0.0,

+   GUID={0x35855B5B,0xC566,0x4fd0,{0xA7,0xB1,0xE6,0x54,0x65,0x60,0x03,0x94}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleValue_FormatStringOffsetTable[] =

+    {

+    1380,

+    1416,

+    1452,

+    1488

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleValue_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleValue_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleValue_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleValue_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(7) _IAccessibleValueProxyVtbl = 

+{

+    &IAccessibleValue_ProxyInfo,

+    &IID_IAccessibleValue,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleValue::get_currentValue */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleValue::setCurrentValue */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleValue::get_maximumValue */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleValue::get_minimumValue */

+};

+

+const CInterfaceStubVtbl _IAccessibleValueStubVtbl =

+{

+    &IID_IAccessibleValue,

+    &IAccessibleValue_ServerInfo,

+    7,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Standard interface: __MIDL_itf_ia2_api_all_0000_0006, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IAccessibleText, ver. 0.0,

+   GUID={0x24FD2FFB,0x3AAD,0x4a08,{0x83,0x35,0xA3,0xAD,0x89,0xC0,0xFB,0x4B}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleText_FormatStringOffsetTable[] =

+    {

+    1524,

+    1566,

+    72,

+    1620,

+    1686,

+    1722,

+    1776,

+    1824,

+    1872,

+    1932,

+    1992,

+    2052,

+    2088,

+    2124,

+    2172,

+    2208,

+    2256,

+    2316,

+    2352

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleText_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleText_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleText_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleText_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(22) _IAccessibleTextProxyVtbl = 

+{

+    &IAccessibleText_ProxyInfo,

+    &IID_IAccessibleText,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::addSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_attributes */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_caretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_characterExtents */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nSelections */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_offsetAtPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_selection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_text */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textBeforeOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAfterOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAtOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::removeSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setCaretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nCharacters */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringTo */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringToPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_newText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_oldText */

+};

+

+const CInterfaceStubVtbl _IAccessibleTextStubVtbl =

+{

+    &IID_IAccessibleText,

+    &IAccessibleText_ServerInfo,

+    22,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleText2, ver. 0.0,

+   GUID={0x9690A9CC,0x5C80,0x4DF5,{0x85,0x2E,0x2D,0x5A,0xE4,0x18,0x9A,0x54}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleText2_FormatStringOffsetTable[] =

+    {

+    1524,

+    1566,

+    72,

+    1620,

+    1686,

+    1722,

+    1776,

+    1824,

+    1872,

+    1932,

+    1992,

+    2052,

+    2088,

+    2124,

+    2172,

+    2208,

+    2256,

+    2316,

+    2352,

+    2388

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleText2_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleText2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleText2_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleText2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(23) _IAccessibleText2ProxyVtbl = 

+{

+    &IAccessibleText2_ProxyInfo,

+    &IID_IAccessibleText2,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::addSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_attributes */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_caretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_characterExtents */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nSelections */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_offsetAtPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_selection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_text */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textBeforeOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAfterOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAtOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::removeSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setCaretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nCharacters */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringTo */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringToPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_newText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_oldText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText2::get_attributeRange */

+};

+

+const CInterfaceStubVtbl _IAccessibleText2StubVtbl =

+{

+    &IID_IAccessibleText2,

+    &IAccessibleText2_ServerInfo,

+    23,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleEditableText, ver. 0.0,

+   GUID={0xA59AA09A,0x7011,0x4b65,{0x93,0x9D,0x32,0xB1,0xFB,0x55,0x47,0xE3}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleEditableText_FormatStringOffsetTable[] =

+    {

+    1524,

+    2448,

+    2490,

+    2532,

+    2574,

+    2610,

+    2658

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleEditableText_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleEditableText_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleEditableText_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleEditableText_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(10) _IAccessibleEditableTextProxyVtbl = 

+{

+    &IAccessibleEditableText_ProxyInfo,

+    &IID_IAccessibleEditableText,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleEditableText::copyText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleEditableText::deleteText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleEditableText::insertText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleEditableText::cutText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleEditableText::pasteText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleEditableText::replaceText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleEditableText::setAttributes */

+};

+

+const CInterfaceStubVtbl _IAccessibleEditableTextStubVtbl =

+{

+    &IID_IAccessibleEditableText,

+    &IAccessibleEditableText_ServerInfo,

+    10,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleHyperlink, ver. 0.0,

+   GUID={0x01C20F2B,0x3DD2,0x400f,{0x94,0x9F,0xAD,0x00,0xBD,0xAB,0x1D,0x41}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleHyperlink_FormatStringOffsetTable[] =

+    {

+    198,

+    234,

+    270,

+    312,

+    366,

+    408,

+    2706,

+    2748,

+    2790,

+    2826,

+    2862

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleHyperlink_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleHyperlink_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleHyperlink_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleHyperlink_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(14) _IAccessibleHyperlinkProxyVtbl = 

+{

+    &IAccessibleHyperlink_ProxyInfo,

+    &IID_IAccessibleHyperlink,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::nActions */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::doAction */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_description */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_keyBinding */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_name */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleAction::get_localizedName */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHyperlink::get_anchor */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHyperlink::get_anchorTarget */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHyperlink::get_startIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHyperlink::get_endIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHyperlink::get_valid */

+};

+

+const CInterfaceStubVtbl _IAccessibleHyperlinkStubVtbl =

+{

+    &IID_IAccessibleHyperlink,

+    &IAccessibleHyperlink_ServerInfo,

+    14,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleHypertext, ver. 0.0,

+   GUID={0x6B4F8BBF,0xF1F2,0x418a,{0xB3,0x5E,0xA1,0x95,0xBC,0x41,0x03,0xB9}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleHypertext_FormatStringOffsetTable[] =

+    {

+    1524,

+    1566,

+    72,

+    1620,

+    1686,

+    1722,

+    1776,

+    1824,

+    1872,

+    1932,

+    1992,

+    2052,

+    2088,

+    2124,

+    2172,

+    2208,

+    2256,

+    2316,

+    2352,

+    2898,

+    2934,

+    2976

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleHypertext_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleHypertext_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleHypertext_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleHypertext_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(25) _IAccessibleHypertextProxyVtbl = 

+{

+    &IAccessibleHypertext_ProxyInfo,

+    &IID_IAccessibleHypertext,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::addSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_attributes */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_caretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_characterExtents */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nSelections */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_offsetAtPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_selection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_text */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textBeforeOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAfterOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAtOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::removeSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setCaretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nCharacters */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringTo */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringToPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_newText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_oldText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHypertext::get_nHyperlinks */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHypertext::get_hyperlink */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHypertext::get_hyperlinkIndex */

+};

+

+const CInterfaceStubVtbl _IAccessibleHypertextStubVtbl =

+{

+    &IID_IAccessibleHypertext,

+    &IAccessibleHypertext_ServerInfo,

+    25,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleHypertext2, ver. 0.0,

+   GUID={0xCF64D89F,0x8287,0x4B44,{0x85,0x01,0xA8,0x27,0x45,0x3A,0x60,0x77}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleHypertext2_FormatStringOffsetTable[] =

+    {

+    1524,

+    1566,

+    72,

+    1620,

+    1686,

+    1722,

+    1776,

+    1824,

+    1872,

+    1932,

+    1992,

+    2052,

+    2088,

+    2124,

+    2172,

+    2208,

+    2256,

+    2316,

+    2352,

+    2898,

+    2934,

+    2976,

+    3018

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleHypertext2_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleHypertext2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleHypertext2_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleHypertext2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(26) _IAccessibleHypertext2ProxyVtbl = 

+{

+    &IAccessibleHypertext2_ProxyInfo,

+    &IID_IAccessibleHypertext2,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::addSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_attributes */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_caretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_characterExtents */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nSelections */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_offsetAtPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_selection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_text */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textBeforeOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAfterOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_textAtOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::removeSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setCaretOffset */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::setSelection */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_nCharacters */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringTo */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::scrollSubstringToPoint */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_newText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleText::get_oldText */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHypertext::get_nHyperlinks */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHypertext::get_hyperlink */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHypertext::get_hyperlinkIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleHypertext2::get_hyperlinks */

+};

+

+const CInterfaceStubVtbl _IAccessibleHypertext2StubVtbl =

+{

+    &IID_IAccessibleHypertext2,

+    &IAccessibleHypertext2_ServerInfo,

+    26,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleTable, ver. 0.0,

+   GUID={0x35AD8070,0xC20C,0x4fb4,{0xB0,0x94,0xF4,0xF7,0x27,0x5D,0xD4,0x69}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleTable_FormatStringOffsetTable[] =

+    {

+    3060,

+    3108,

+    3144,

+    3192,

+    3234,

+    3282,

+    3324,

+    3366,

+    2790,

+    2826,

+    3402,

+    3438,

+    3474,

+    3516,

+    3564,

+    3606,

+    3648,

+    3696,

+    3744,

+    3792,

+    3828,

+    3870,

+    3912,

+    3960,

+    3996,

+    4032,

+    4068,

+    4104,

+    4170

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleTable_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleTable_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleTable_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleTable_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(32) _IAccessibleTableProxyVtbl = 

+{

+    &IAccessibleTable_ProxyInfo,

+    &IID_IAccessibleTable,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_accessibleAt */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_caption */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_childIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_columnDescription */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_columnExtentAt */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_columnHeader */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_columnIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_nColumns */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_nRows */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_nSelectedChildren */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_nSelectedColumns */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_nSelectedRows */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_rowDescription */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_rowExtentAt */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_rowHeader */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_rowIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_selectedChildren */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_selectedColumns */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_selectedRows */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_summary */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_isColumnSelected */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_isRowSelected */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_isSelected */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::selectRow */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::selectColumn */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::unselectRow */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::unselectColumn */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_rowColumnExtentsAtIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable::get_modelChange */

+};

+

+const CInterfaceStubVtbl _IAccessibleTableStubVtbl =

+{

+    &IID_IAccessibleTable,

+    &IAccessibleTable_ServerInfo,

+    32,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleTable2, ver. 0.0,

+   GUID={0x6167f295,0x06f0,0x4cdd,{0xa1,0xfa,0x02,0xe2,0x51,0x53,0xd8,0x69}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleTable2_FormatStringOffsetTable[] =

+    {

+    3060,

+    3108,

+    270,

+    4206,

+    1686,

+    4242,

+    4278,

+    3366,

+    4314,

+    4356,

+    4398,

+    4440,

+    4482,

+    4518,

+    4560,

+    4602,

+    4638,

+    4674,

+    4710,

+    4746

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleTable2_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleTable2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleTable2_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleTable2_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(23) _IAccessibleTable2ProxyVtbl = 

+{

+    &IAccessibleTable2_ProxyInfo,

+    &IID_IAccessibleTable2,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_cellAt */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_caption */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_columnDescription */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_nColumns */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_nRows */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_nSelectedCells */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_nSelectedColumns */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_nSelectedRows */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_rowDescription */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_selectedCells */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_selectedColumns */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_selectedRows */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_summary */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_isColumnSelected */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_isRowSelected */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::selectRow */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::selectColumn */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::unselectRow */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::unselectColumn */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTable2::get_modelChange */

+};

+

+const CInterfaceStubVtbl _IAccessibleTable2StubVtbl =

+{

+    &IID_IAccessibleTable2,

+    &IAccessibleTable2_ServerInfo,

+    23,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleTableCell, ver. 0.0,

+   GUID={0x594116B1,0xC99F,0x4847,{0xAD,0x06,0x0A,0x7A,0x86,0xEC,0xE6,0x45}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleTableCell_FormatStringOffsetTable[] =

+    {

+    198,

+    4782,

+    72,

+    4206,

+    4824,

+    4242,

+    4866,

+    4902,

+    4962

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleTableCell_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleTableCell_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleTableCell_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleTableCell_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(12) _IAccessibleTableCellProxyVtbl = 

+{

+    &IAccessibleTableCell_ProxyInfo,

+    &IID_IAccessibleTableCell,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_columnExtent */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_columnHeaderCells */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_columnIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_rowExtent */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_rowHeaderCells */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_rowIndex */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_isSelected */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_rowColumnExtents */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleTableCell::get_table */

+};

+

+const CInterfaceStubVtbl _IAccessibleTableCellStubVtbl =

+{

+    &IID_IAccessibleTableCell,

+    &IAccessibleTableCell_ServerInfo,

+    12,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleImage, ver. 0.0,

+   GUID={0xFE5ABB3D,0x615E,0x4f7b,{0x90,0x9F,0x5F,0x0E,0xDA,0x9E,0x8D,0xDE}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleImage_FormatStringOffsetTable[] =

+    {

+    0,

+    4998,

+    5046

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleImage_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleImage_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleImage_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleImage_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(6) _IAccessibleImageProxyVtbl = 

+{

+    &IAccessibleImage_ProxyInfo,

+    &IID_IAccessibleImage,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleImage::get_description */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleImage::get_imagePosition */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleImage::get_imageSize */

+};

+

+const CInterfaceStubVtbl _IAccessibleImageStubVtbl =

+{

+    &IID_IAccessibleImage,

+    &IAccessibleImage_ServerInfo,

+    6,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Standard interface: __MIDL_itf_ia2_api_all_0000_0016, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IAccessibleApplication, ver. 0.0,

+   GUID={0xD49DED83,0x5B25,0x43F4,{0x9B,0x95,0x93,0xB4,0x45,0x95,0x97,0x9E}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleApplication_FormatStringOffsetTable[] =

+    {

+    0,

+    36,

+    5088,

+    5124

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleApplication_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleApplication_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleApplication_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleApplication_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(7) _IAccessibleApplicationProxyVtbl = 

+{

+    &IAccessibleApplication_ProxyInfo,

+    &IID_IAccessibleApplication,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleApplication::get_appName */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleApplication::get_appVersion */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleApplication::get_toolkitName */ ,

+    (void *) (INT_PTR) -1 /* IAccessibleApplication::get_toolkitVersion */

+};

+

+const CInterfaceStubVtbl _IAccessibleApplicationStubVtbl =

+{

+    &IID_IAccessibleApplication,

+    &IAccessibleApplication_ServerInfo,

+    7,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Object interface: IAccessibleDocument, ver. 0.0,

+   GUID={0xC48C7FCF,0x4AB5,0x4056,{0xAF,0xA6,0x90,0x2D,0x6E,0x1D,0x11,0x49}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short IAccessibleDocument_FormatStringOffsetTable[] =

+    {

+    5160

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO IAccessibleDocument_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleDocument_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO IAccessibleDocument_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ia2_api_all__MIDL_ProcFormatString.Format,

+    &IAccessibleDocument_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(4) _IAccessibleDocumentProxyVtbl = 

+{

+    &IAccessibleDocument_ProxyInfo,

+    &IID_IAccessibleDocument,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* IAccessibleDocument::get_anchorTarget */

+};

+

+const CInterfaceStubVtbl _IAccessibleDocumentStubVtbl =

+{

+    &IID_IAccessibleDocument,

+    &IAccessibleDocument_ServerInfo,

+    4,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+

+/* Standard interface: __MIDL_itf_ia2_api_all_0000_0018, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+static const MIDL_STUB_DESC Object_StubDesc = 

+    {

+    0,

+    NdrOleAllocate,

+    NdrOleFree,

+    0,

+    0,

+    0,

+    0,

+    0,

+    ia2_api_all__MIDL_TypeFormatString.Format,

+    1, /* -error bounds_check flag */

+    0x50002, /* Ndr library version */

+    0,

+    0x801026e, /* MIDL Version 8.1.622 */

+    0,

+    UserMarshalRoutines,

+    0,  /* notify & notify_flag routine table */

+    0x1, /* MIDL flag */

+    0, /* cs routines */

+    0,   /* proxy/server info */

+    0

+    };

+

+const CInterfaceProxyVtbl * const _ia2_api_all_ProxyVtblList[] = 

+{

+    ( CInterfaceProxyVtbl *) &_IAccessibleHyperlinkProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleImageProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleActionProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleValueProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessible2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleTableProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleApplicationProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleTable2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleEditableTextProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleHypertext2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleComponentProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleTableCellProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleHypertextProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleText2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleDocumentProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessible2_2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleRelationProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAccessibleTextProxyVtbl,

+    0

+};

+

+const CInterfaceStubVtbl * const _ia2_api_all_StubVtblList[] = 

+{

+    ( CInterfaceStubVtbl *) &_IAccessibleHyperlinkStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleImageStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleActionStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleValueStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessible2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleTableStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleApplicationStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleTable2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleEditableTextStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleHypertext2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleComponentStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleTableCellStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleHypertextStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleText2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleDocumentStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessible2_2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleRelationStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAccessibleTextStubVtbl,

+    0

+};

+

+PCInterfaceName const _ia2_api_all_InterfaceNamesList[] = 

+{

+    "IAccessibleHyperlink",

+    "IAccessibleImage",

+    "IAccessibleAction",

+    "IAccessibleValue",

+    "IAccessible2",

+    "IAccessibleTable",

+    "IAccessibleApplication",

+    "IAccessibleTable2",

+    "IAccessibleEditableText",

+    "IAccessibleHypertext2",

+    "IAccessibleComponent",

+    "IAccessibleTableCell",

+    "IAccessibleHypertext",

+    "IAccessibleText2",

+    "IAccessibleDocument",

+    "IAccessible2_2",

+    "IAccessibleRelation",

+    "IAccessibleText",

+    0

+};

+

+const IID *  const _ia2_api_all_BaseIIDList[] = 

+{

+    0,

+    0,

+    0,

+    0,

+    &IID_IAccessible,

+    0,

+    0,

+    0,

+    0,

+    0,

+    0,

+    0,

+    0,

+    0,

+    0,

+    &IID_IAccessible,

+    0,

+    0,

+    0

+};

+

+

+#define _ia2_api_all_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _ia2_api_all, pIID, n)

+

+int __stdcall _ia2_api_all_IID_Lookup( const IID * pIID, int * pIndex )

+{

+    IID_BS_LOOKUP_SETUP

+

+    IID_BS_LOOKUP_INITIAL_TEST( _ia2_api_all, 18, 16 )

+    IID_BS_LOOKUP_NEXT_TEST( _ia2_api_all, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _ia2_api_all, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _ia2_api_all, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _ia2_api_all, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _ia2_api_all, 18, *pIndex )

+    

+}

+

+const ExtendedProxyFileInfo ia2_api_all_ProxyFileInfo = 

+{

+    (PCInterfaceProxyVtblList *) & _ia2_api_all_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _ia2_api_all_StubVtblList,

+    (const PCInterfaceName * ) & _ia2_api_all_InterfaceNamesList,

+    (const IID ** ) & _ia2_api_all_BaseIIDList,

+    & _ia2_api_all_IID_Lookup, 

+    18,

+    2,

+    0, /* table of [async_uuid] interfaces */

+    0, /* Filler1 */

+    0, /* Filler2 */

+    0  /* Filler3 */

+};

+#if _MSC_VER >= 1200

+#pragma warning(pop)

+#endif

+

+

+#endif /* !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_) */

+

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.dlldata.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument.dlldata.c
similarity index 100%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.dlldata.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.h b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument.h
similarity index 99%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.h
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument.h
index 07d948e..c562450 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.h
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument.h
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMDocument.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_i.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument_i.c
similarity index 97%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_i.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument_i.c
index 11f8d78..d868c60c 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_i.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument_i.c
@@ -6,7 +6,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMDocument.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_p.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument_p.c
similarity index 99%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_p.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument_p.c
index 1c8d91f7..393a99d 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_p.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x64/ISimpleDOMDocument_p.c
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMDocument.idl:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.dlldata.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument.dlldata.c
similarity index 100%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.dlldata.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.h b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument.h
similarity index 98%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.h
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument.h
index 07d948e..f9ecc2d 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.h
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument.h
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMDocument.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_i.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument_i.c
similarity index 93%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_i.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument_i.c
index 11f8d78..202c77ed 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_i.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument_i.c
@@ -6,10 +6,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMDocument.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_p.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument_p.c
similarity index 65%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_p.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument_p.c
index 1c8d91f7..d563a190 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument_p.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMDocument.idl/x86/ISimpleDOMDocument_p.c
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMDocument.idl:

-    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

@@ -16,7 +16,7 @@
 */

 /* @@MIDL_FILE_HEADING(  ) */

 

-#if defined(_M_AMD64)

+#if !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_)

 

 

 #pragma warning( disable: 4049 )  /* more than 64k source lines */

@@ -28,6 +28,9 @@
 #pragma warning( disable: 4232 )  /* dllimport identity*/

 #pragma warning( disable: 4024 )  /* array to pointer mapping*/

 #pragma warning( disable: 4152 )  /* function/data pointer conversion in expression */

+#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */

+

+#pragma optimize("", off ) 

 

 #define USE_STUBLESS_PROXY

 

@@ -47,7 +50,7 @@
 #include "ISimpleDOMDocument.h"

 

 #define TYPE_FORMAT_STRING_SIZE   61                                

-#define PROC_FORMAT_STRING_SIZE   235                               

+#define PROC_FORMAT_STRING_SIZE   223                               

 #define EXPR_FORMAT_STRING_SIZE   1                                 

 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   1            

@@ -89,10 +92,18 @@
 

 extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];

 

-#if !defined(__RPC_WIN64__)

+#if !defined(__RPC_WIN32__)

 #error  Invalid build platform for this stub.

 #endif

 

+#if !(TARGET_IS_NT50_OR_LATER)

+#error You need Windows 2000 or later to run this stub because it uses these features:

+#error   /robust command line switch.

+#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.

+#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.

+#endif

+

+

 static const ISimpleDOMDocument_MIDL_PROC_FORMAT_STRING ISimpleDOMDocument__MIDL_ProcFormatString =

     {

         0,

@@ -104,191 +115,185 @@
 			0x6c,		/* Old Flags:  object, Oi2 */

 /*  2 */	NdrFcLong( 0x0 ),	/* 0 */

 /*  6 */	NdrFcShort( 0x3 ),	/* 3 */

-/*  8 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/*  8 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

 /* 10 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 12 */	NdrFcShort( 0x8 ),	/* 8 */

 /* 14 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

 			0x2,		/* 2 */

-/* 16 */	0xa,		/* 10 */

+/* 16 */	0x8,		/* 8 */

 			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

 /* 18 */	NdrFcShort( 0x1 ),	/* 1 */

 /* 20 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 22 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 24 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter url */

 

-/* 26 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

-/* 28 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 30 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+/* 24 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 26 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 28 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

 

 	/* Return value */

 

-/* 32 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 34 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 36 */	0x8,		/* FC_LONG */

+/* 30 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 32 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 34 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure get_title */

 

-/* 38 */	0x33,		/* FC_AUTO_HANDLE */

+/* 36 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 40 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 44 */	NdrFcShort( 0x4 ),	/* 4 */

-/* 46 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

-/* 48 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 50 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 52 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+/* 38 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 42 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 44 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 46 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 48 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 50 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

 			0x2,		/* 2 */

-/* 54 */	0xa,		/* 10 */

+/* 52 */	0x8,		/* 8 */

 			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

-/* 56 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 54 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 56 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 58 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 60 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 62 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter title */

 

-/* 64 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

-/* 66 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 68 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+/* 60 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 62 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 64 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

 

 	/* Return value */

 

-/* 70 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 72 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 74 */	0x8,		/* FC_LONG */

+/* 66 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 68 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 70 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure get_mimeType */

 

-/* 76 */	0x33,		/* FC_AUTO_HANDLE */

+/* 72 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 78 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 82 */	NdrFcShort( 0x5 ),	/* 5 */

-/* 84 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

-/* 86 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 88 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 90 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+/* 74 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 78 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 80 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 82 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 84 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 86 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

 			0x2,		/* 2 */

-/* 92 */	0xa,		/* 10 */

+/* 88 */	0x8,		/* 8 */

 			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

-/* 94 */	NdrFcShort( 0x1 ),	/* 1 */

-/* 96 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 98 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 100 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 90 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 92 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 94 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter mimeType */

 

-/* 102 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

-/* 104 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 106 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+/* 96 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 98 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 100 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

 

 	/* Return value */

 

-/* 108 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 110 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 112 */	0x8,		/* FC_LONG */

+/* 102 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 104 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 106 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure get_docType */

 

-/* 114 */	0x33,		/* FC_AUTO_HANDLE */

+/* 108 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 116 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 120 */	NdrFcShort( 0x6 ),	/* 6 */

-/* 122 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

-/* 124 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 126 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 128 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+/* 110 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 114 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 116 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 118 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 120 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 122 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

 			0x2,		/* 2 */

-/* 130 */	0xa,		/* 10 */

+/* 124 */	0x8,		/* 8 */

 			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

-/* 132 */	NdrFcShort( 0x1 ),	/* 1 */

-/* 134 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 136 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 138 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 126 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 128 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 130 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter docType */

 

-/* 140 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

-/* 142 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 144 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+/* 132 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 134 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 136 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

 

 	/* Return value */

 

-/* 146 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 148 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 150 */	0x8,		/* FC_LONG */

+/* 138 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 140 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 142 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure get_nameSpaceURIForID */

 

-/* 152 */	0x33,		/* FC_AUTO_HANDLE */

+/* 144 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 154 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 158 */	NdrFcShort( 0x7 ),	/* 7 */

-/* 160 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

-/* 162 */	NdrFcShort( 0x6 ),	/* 6 */

-/* 164 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 166 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+/* 146 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 150 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 152 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

+/* 154 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 156 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 158 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

 			0x3,		/* 3 */

-/* 168 */	0xa,		/* 10 */

+/* 160 */	0x8,		/* 8 */

 			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

-/* 170 */	NdrFcShort( 0x1 ),	/* 1 */

-/* 172 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 174 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 176 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 162 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 164 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 166 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter nameSpaceID */

 

-/* 178 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 180 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 182 */	0x6,		/* FC_SHORT */

+/* 168 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 170 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 172 */	0x6,		/* FC_SHORT */

 			0x0,		/* 0 */

 

 	/* Parameter nameSpaceURI */

 

-/* 184 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

-/* 186 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 188 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+/* 174 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 176 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 178 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

 

 	/* Return value */

 

-/* 190 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 192 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

-/* 194 */	0x8,		/* FC_LONG */

+/* 180 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 182 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 184 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure put_alternateViewMediaTypes */

 

-/* 196 */	0x33,		/* FC_AUTO_HANDLE */

+/* 186 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 198 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 202 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 204 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

-/* 206 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 208 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 210 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

+/* 188 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 192 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 194 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/* 196 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 198 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 200 */	0x46,		/* Oi2 Flags:  clt must size, has return, has ext, */

 			0x2,		/* 2 */

-/* 212 */	0xa,		/* 10 */

+/* 202 */	0x8,		/* 8 */

 			0x5,		/* Ext Flags:  new corr desc, srv corr check, */

-/* 214 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 216 */	NdrFcShort( 0x1 ),	/* 1 */

-/* 218 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 220 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 204 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 206 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 208 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter commaSeparatedMediaTypes */

 

-/* 222 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

-/* 224 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

-/* 226 */	NdrFcShort( 0x32 ),	/* Type Offset=50 */

+/* 210 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 212 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

+/* 214 */	NdrFcShort( 0x32 ),	/* Type Offset=50 */

 

 	/* Return value */

 

-/* 228 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 230 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

-/* 232 */	0x8,		/* FC_LONG */

+/* 216 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 218 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

+/* 220 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 			0x0

@@ -328,7 +333,7 @@
 /* 32 */	0xb4,		/* FC_USER_MARSHAL */

 			0x83,		/* 131 */

 /* 34 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 36 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 36 */	NdrFcShort( 0x4 ),	/* 4 */

 /* 38 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 40 */	NdrFcShort( 0xffde ),	/* Offset= -34 (6) */

 /* 42 */	

@@ -340,7 +345,7 @@
 /* 50 */	0xb4,		/* FC_USER_MARSHAL */

 			0x83,		/* 131 */

 /* 52 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 54 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 54 */	NdrFcShort( 0x4 ),	/* 4 */

 /* 56 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 58 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (46) */

 

@@ -377,11 +382,11 @@
 static const unsigned short ISimpleDOMDocument_FormatStringOffsetTable[] =

     {

     0,

-    38,

-    76,

-    114,

-    152,

-    196

+    36,

+    72,

+    108,

+    144,

+    186

     };

 

 static const MIDL_STUBLESS_PROXY_INFO ISimpleDOMDocument_ProxyInfo =

@@ -505,5 +510,5 @@
 #endif

 

 

-#endif /* defined(_M_AMD64)*/

+#endif /* !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_) */

 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.dlldata.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode.dlldata.c
similarity index 100%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.dlldata.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.h b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode.h
similarity index 99%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.h
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode.h
index eef4e9e7..807accf 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.h
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode.h
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMNode.idl:

-    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_i.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode_i.c
similarity index 93%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_i.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode_i.c
index 9fc7af9..44551bd 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_i.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode_i.c
@@ -6,10 +6,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMNode.idl:

-    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode_p.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode_p.c
new file mode 100644
index 0000000..0800d741
--- /dev/null
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x64/ISimpleDOMNode_p.c
@@ -0,0 +1,1018 @@
+

+

+/* this ALWAYS GENERATED file contains the proxy stub code */

+

+

+ /* File created by MIDL compiler version 8.01.0622 */

+/* at a redacted point in time

+ */

+/* Compiler settings for ../../third_party/isimpledom/ISimpleDOMNode.idl:

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

+    protocol : dce , ms_ext, c_ext, robust

+    error checks: allocation ref bounds_check enum stub_data 

+    VC __declspec() decoration level: 

+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)

+         DECLSPEC_UUID(), MIDL_INTERFACE()

+*/

+/* @@MIDL_FILE_HEADING(  ) */

+

+#if defined(_M_AMD64)

+

+

+#pragma warning( disable: 4049 )  /* more than 64k source lines */

+#if _MSC_VER >= 1200

+#pragma warning(push)

+#endif

+

+#pragma warning( disable: 4211 )  /* redefine extern to static */

+#pragma warning( disable: 4232 )  /* dllimport identity*/

+#pragma warning( disable: 4024 )  /* array to pointer mapping*/

+#pragma warning( disable: 4152 )  /* function/data pointer conversion in expression */

+

+#define USE_STUBLESS_PROXY

+

+

+/* verify that the <rpcproxy.h> version is high enough to compile this file*/

+#ifndef __REDQ_RPCPROXY_H_VERSION__

+#define __REQUIRED_RPCPROXY_H_VERSION__ 475

+#endif

+

+

+#include "rpcproxy.h"

+#ifndef __RPCPROXY_H_VERSION__

+#error this stub requires an updated version of <rpcproxy.h>

+#endif /* __RPCPROXY_H_VERSION__ */

+

+

+#include "ISimpleDOMNode.h"

+

+#define TYPE_FORMAT_STRING_SIZE   209                               

+#define PROC_FORMAT_STRING_SIZE   653                               

+#define EXPR_FORMAT_STRING_SIZE   1                                 

+#define TRANSMIT_AS_TABLE_SIZE    0            

+#define WIRE_MARSHAL_TABLE_SIZE   1            

+

+typedef struct _ISimpleDOMNode_MIDL_TYPE_FORMAT_STRING

+    {

+    short          Pad;

+    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

+    } ISimpleDOMNode_MIDL_TYPE_FORMAT_STRING;

+

+typedef struct _ISimpleDOMNode_MIDL_PROC_FORMAT_STRING

+    {

+    short          Pad;

+    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

+    } ISimpleDOMNode_MIDL_PROC_FORMAT_STRING;

+

+typedef struct _ISimpleDOMNode_MIDL_EXPR_FORMAT_STRING

+    {

+    long          Pad;

+    unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

+    } ISimpleDOMNode_MIDL_EXPR_FORMAT_STRING;

+

+

+static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};

+

+

+extern const ISimpleDOMNode_MIDL_TYPE_FORMAT_STRING ISimpleDOMNode__MIDL_TypeFormatString;

+extern const ISimpleDOMNode_MIDL_PROC_FORMAT_STRING ISimpleDOMNode__MIDL_ProcFormatString;

+extern const ISimpleDOMNode_MIDL_EXPR_FORMAT_STRING ISimpleDOMNode__MIDL_ExprFormatString;

+

+

+extern const MIDL_STUB_DESC Object_StubDesc;

+

+

+extern const MIDL_SERVER_INFO ISimpleDOMNode_ServerInfo;

+extern const MIDL_STUBLESS_PROXY_INFO ISimpleDOMNode_ProxyInfo;

+

+

+extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];

+

+#if !defined(__RPC_WIN64__)

+#error  Invalid build platform for this stub.

+#endif

+

+static const ISimpleDOMNode_MIDL_PROC_FORMAT_STRING ISimpleDOMNode__MIDL_ProcFormatString =

+    {

+        0,

+        {

+

+	/* Procedure get_nodeInfo */

+

+			0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/*  2 */	NdrFcLong( 0x0 ),	/* 0 */

+/*  6 */	NdrFcShort( 0x3 ),	/* 3 */

+/*  8 */	NdrFcShort( 0x40 ),	/* X64 Stack size/offset = 64 */

+/* 10 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 12 */	NdrFcShort( 0x74 ),	/* 116 */

+/* 14 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x7,		/* 7 */

+/* 16 */	0xa,		/* 10 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 18 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 20 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 22 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 24 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter nodeName */

+

+/* 26 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 28 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 30 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Parameter nameSpaceID */

+

+/* 32 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 34 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 36 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Parameter nodeValue */

+

+/* 38 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 40 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 42 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Parameter numChildren */

+

+/* 44 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 46 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 48 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter uniqueID */

+

+/* 50 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 52 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 54 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter nodeType */

+

+/* 56 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 58 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

+/* 60 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 62 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 64 */	NdrFcShort( 0x38 ),	/* X64 Stack size/offset = 56 */

+/* 66 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_attributes */

+

+/* 68 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 70 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 74 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 76 */	NdrFcShort( 0x38 ),	/* X64 Stack size/offset = 56 */

+/* 78 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 80 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 82 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x6,		/* 6 */

+/* 84 */	0xa,		/* 10 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 86 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 88 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 90 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 92 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxAttribs */

+

+/* 94 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 96 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 98 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Parameter attribNames */

+

+/* 100 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 102 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 104 */	NdrFcShort( 0x36 ),	/* Type Offset=54 */

+

+	/* Parameter nameSpaceID */

+

+/* 106 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 108 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 110 */	NdrFcShort( 0x50 ),	/* Type Offset=80 */

+

+	/* Parameter attribValues */

+

+/* 112 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 114 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 116 */	NdrFcShort( 0x36 ),	/* Type Offset=54 */

+

+	/* Parameter numAttribs */

+

+/* 118 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 120 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 122 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 124 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 126 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

+/* 128 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_attributesForNames */

+

+/* 130 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 132 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 136 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 138 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

+/* 140 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 142 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 144 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 146 */	0xa,		/* 10 */

+			0x7,		/* Ext Flags:  new corr desc, clt corr check, srv corr check, */

+/* 148 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 150 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 152 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 154 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter numAttribs */

+

+/* 156 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 158 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 160 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Parameter attribNames */

+

+/* 162 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 164 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 166 */	NdrFcShort( 0x74 ),	/* Type Offset=116 */

+

+	/* Parameter nameSpaceID */

+

+/* 168 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 170 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 172 */	NdrFcShort( 0x8e ),	/* Type Offset=142 */

+

+	/* Parameter attribValues */

+

+/* 174 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 176 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 178 */	NdrFcShort( 0xa4 ),	/* Type Offset=164 */

+

+	/* Return value */

+

+/* 180 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 182 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 184 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_computedStyle */

+

+/* 186 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 188 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 192 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 194 */	NdrFcShort( 0x38 ),	/* X64 Stack size/offset = 56 */

+/* 196 */	NdrFcShort( 0xb ),	/* 11 */

+/* 198 */	NdrFcShort( 0x22 ),	/* 34 */

+/* 200 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x6,		/* 6 */

+/* 202 */	0xa,		/* 10 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 204 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 206 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 208 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 210 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter maxStyleProperties */

+

+/* 212 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 214 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 216 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Parameter useAlternateView */

+

+/* 218 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 220 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 222 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Parameter styleProperties */

+

+/* 224 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 226 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 228 */	NdrFcShort( 0x36 ),	/* Type Offset=54 */

+

+	/* Parameter styleValues */

+

+/* 230 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 232 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 234 */	NdrFcShort( 0x36 ),	/* Type Offset=54 */

+

+	/* Parameter numStyleProperties */

+

+/* 236 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 238 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 240 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 242 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 244 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

+/* 246 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_computedStyleForProperties */

+

+/* 248 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 250 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 254 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 256 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

+/* 258 */	NdrFcShort( 0xb ),	/* 11 */

+/* 260 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 262 */	0x47,		/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */

+			0x5,		/* 5 */

+/* 264 */	0xa,		/* 10 */

+			0x7,		/* Ext Flags:  new corr desc, clt corr check, srv corr check, */

+/* 266 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 268 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 270 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 272 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter numStyleProperties */

+

+/* 274 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 276 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 278 */	0x6,		/* FC_SHORT */

+			0x0,		/* 0 */

+

+	/* Parameter useAlternateView */

+

+/* 280 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 282 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 284 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Parameter styleProperties */

+

+/* 286 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */

+/* 288 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 290 */	NdrFcShort( 0x74 ),	/* Type Offset=116 */

+

+	/* Parameter styleValues */

+

+/* 292 */	NdrFcShort( 0x113 ),	/* Flags:  must size, must free, out, simple ref, */

+/* 294 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 296 */	NdrFcShort( 0xa4 ),	/* Type Offset=164 */

+

+	/* Return value */

+

+/* 298 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 300 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 302 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure scrollTo */

+

+/* 304 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 306 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 310 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 312 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 314 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 316 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 318 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+			0x2,		/* 2 */

+/* 320 */	0xa,		/* 10 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 322 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 324 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 326 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 328 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter placeTopLeft */

+

+/* 330 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 332 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 334 */	0x3,		/* FC_SMALL */

+			0x0,		/* 0 */

+

+	/* Return value */

+

+/* 336 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 338 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 340 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_parentNode */

+

+/* 342 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 344 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 348 */	NdrFcShort( 0x9 ),	/* 9 */

+/* 350 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 352 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 354 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 356 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 358 */	0xa,		/* 10 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 360 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 362 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 364 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 366 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter node */

+

+/* 368 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 370 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 372 */	NdrFcShort( 0xba ),	/* Type Offset=186 */

+

+	/* Return value */

+

+/* 374 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 376 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 378 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_firstChild */

+

+/* 380 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 382 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 386 */	NdrFcShort( 0xa ),	/* 10 */

+/* 388 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 390 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 392 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 394 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 396 */	0xa,		/* 10 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 398 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 400 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 402 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 404 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter node */

+

+/* 406 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 408 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 410 */	NdrFcShort( 0xba ),	/* Type Offset=186 */

+

+	/* Return value */

+

+/* 412 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 414 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 416 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_lastChild */

+

+/* 418 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 420 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 424 */	NdrFcShort( 0xb ),	/* 11 */

+/* 426 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 428 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 430 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 432 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 434 */	0xa,		/* 10 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 436 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 438 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 440 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 442 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter node */

+

+/* 444 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 446 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 448 */	NdrFcShort( 0xba ),	/* Type Offset=186 */

+

+	/* Return value */

+

+/* 450 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 452 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 454 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_previousSibling */

+

+/* 456 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 458 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 462 */	NdrFcShort( 0xc ),	/* 12 */

+/* 464 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 466 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 468 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 470 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 472 */	0xa,		/* 10 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 474 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 476 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 478 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 480 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter node */

+

+/* 482 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 484 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 486 */	NdrFcShort( 0xba ),	/* Type Offset=186 */

+

+	/* Return value */

+

+/* 488 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 490 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 492 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_nextSibling */

+

+/* 494 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 496 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 500 */	NdrFcShort( 0xd ),	/* 13 */

+/* 502 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 504 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 506 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 508 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 510 */	0xa,		/* 10 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 512 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 514 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 516 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 518 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter node */

+

+/* 520 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 522 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 524 */	NdrFcShort( 0xba ),	/* Type Offset=186 */

+

+	/* Return value */

+

+/* 526 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 528 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 530 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_childAt */

+

+/* 532 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 534 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 538 */	NdrFcShort( 0xe ),	/* 14 */

+/* 540 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 542 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 544 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 546 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x3,		/* 3 */

+/* 548 */	0xa,		/* 10 */

+			0x1,		/* Ext Flags:  new corr desc, */

+/* 550 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 552 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 554 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 556 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter childIndex */

+

+/* 558 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 560 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 562 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Parameter node */

+

+/* 564 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */

+/* 566 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 568 */	NdrFcShort( 0xba ),	/* Type Offset=186 */

+

+	/* Return value */

+

+/* 570 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 572 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 574 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_innerHTML */

+

+/* 576 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 578 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 582 */	NdrFcShort( 0xf ),	/* 15 */

+/* 584 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 586 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 588 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 590 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 592 */	0xa,		/* 10 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 594 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 596 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 598 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 600 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter innerHTML */

+

+/* 602 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 604 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 606 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 608 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 610 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 612 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+	/* Procedure get_language */

+

+/* 614 */	0x33,		/* FC_AUTO_HANDLE */

+			0x6c,		/* Old Flags:  object, Oi2 */

+/* 616 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 620 */	NdrFcShort( 0x11 ),	/* 17 */

+/* 622 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 624 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 626 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 628 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+			0x2,		/* 2 */

+/* 630 */	0xa,		/* 10 */

+			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

+/* 632 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 634 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 636 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 638 */	NdrFcShort( 0x0 ),	/* 0 */

+

+	/* Parameter language */

+

+/* 640 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 642 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 644 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+

+	/* Return value */

+

+/* 646 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 648 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 650 */	0x8,		/* FC_LONG */

+			0x0,		/* 0 */

+

+			0x0

+        }

+    };

+

+static const ISimpleDOMNode_MIDL_TYPE_FORMAT_STRING ISimpleDOMNode__MIDL_TypeFormatString =

+    {

+        0,

+        {

+			NdrFcShort( 0x0 ),	/* 0 */

+/*  2 */	

+			0x11, 0x4,	/* FC_RP [alloced_on_stack] */

+/*  4 */	NdrFcShort( 0x1c ),	/* Offset= 28 (32) */

+/*  6 */	

+			0x13, 0x0,	/* FC_OP */

+/*  8 */	NdrFcShort( 0xe ),	/* Offset= 14 (22) */

+/* 10 */	

+			0x1b,		/* FC_CARRAY */

+			0x1,		/* 1 */

+/* 12 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 14 */	0x9,		/* Corr desc: FC_ULONG */

+			0x0,		/*  */

+/* 16 */	NdrFcShort( 0xfffc ),	/* -4 */

+/* 18 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 20 */	0x6,		/* FC_SHORT */

+			0x5b,		/* FC_END */

+/* 22 */	

+			0x17,		/* FC_CSTRUCT */

+			0x3,		/* 3 */

+/* 24 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 26 */	NdrFcShort( 0xfff0 ),	/* Offset= -16 (10) */

+/* 28 */	0x8,		/* FC_LONG */

+			0x8,		/* FC_LONG */

+/* 30 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 32 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 34 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 36 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 38 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 40 */	NdrFcShort( 0xffde ),	/* Offset= -34 (6) */

+/* 42 */	

+			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */

+/* 44 */	0x6,		/* FC_SHORT */

+			0x5c,		/* FC_PAD */

+/* 46 */	

+			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */

+/* 48 */	0x8,		/* FC_LONG */

+			0x5c,		/* FC_PAD */

+/* 50 */	

+			0x11, 0x0,	/* FC_RP */

+/* 52 */	NdrFcShort( 0x2 ),	/* Offset= 2 (54) */

+/* 54 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 56 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 58 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 60 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 62 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 64 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x54,		/* FC_DEREFERENCE */

+/* 66 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 68 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 70 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 72 */	NdrFcShort( 0xffd8 ),	/* Offset= -40 (32) */

+/* 74 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 76 */	

+			0x11, 0x0,	/* FC_RP */

+/* 78 */	NdrFcShort( 0x2 ),	/* Offset= 2 (80) */

+/* 80 */	

+			0x1c,		/* FC_CVARRAY */

+			0x1,		/* 1 */

+/* 82 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 84 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 86 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 88 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 90 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x54,		/* FC_DEREFERENCE */

+/* 92 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 94 */	NdrFcShort( 0x0 ),	/* Corr flags:  */

+/* 96 */	0x6,		/* FC_SHORT */

+			0x5b,		/* FC_END */

+/* 98 */	

+			0x11, 0x0,	/* FC_RP */

+/* 100 */	NdrFcShort( 0x10 ),	/* Offset= 16 (116) */

+/* 102 */	

+			0x12, 0x0,	/* FC_UP */

+/* 104 */	NdrFcShort( 0xffae ),	/* Offset= -82 (22) */

+/* 106 */	0xb4,		/* FC_USER_MARSHAL */

+			0x83,		/* 131 */

+/* 108 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 110 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 112 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 114 */	NdrFcShort( 0xfff4 ),	/* Offset= -12 (102) */

+/* 116 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 118 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 120 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 122 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 124 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 126 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 128 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 130 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 132 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 134 */	NdrFcShort( 0xffe4 ),	/* Offset= -28 (106) */

+/* 136 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 138 */	

+			0x11, 0x0,	/* FC_RP */

+/* 140 */	NdrFcShort( 0x2 ),	/* Offset= 2 (142) */

+/* 142 */	

+			0x1c,		/* FC_CVARRAY */

+			0x1,		/* 1 */

+/* 144 */	NdrFcShort( 0x2 ),	/* 2 */

+/* 146 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 148 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 150 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 152 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 154 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 156 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 158 */	0x6,		/* FC_SHORT */

+			0x5b,		/* FC_END */

+/* 160 */	

+			0x11, 0x0,	/* FC_RP */

+/* 162 */	NdrFcShort( 0x2 ),	/* Offset= 2 (164) */

+/* 164 */	

+			0x21,		/* FC_BOGUS_ARRAY */

+			0x3,		/* 3 */

+/* 166 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 168 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 170 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 172 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 174 */	0x27,		/* Corr desc:  parameter, FC_USHORT */

+			0x0,		/*  */

+/* 176 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 178 */	NdrFcShort( 0x1 ),	/* Corr flags:  early, */

+/* 180 */	0x4c,		/* FC_EMBEDDED_COMPLEX */

+			0x0,		/* 0 */

+/* 182 */	NdrFcShort( 0xff6a ),	/* Offset= -150 (32) */

+/* 184 */	0x5c,		/* FC_PAD */

+			0x5b,		/* FC_END */

+/* 186 */	

+			0x11, 0x10,	/* FC_RP [pointer_deref] */

+/* 188 */	NdrFcShort( 0x2 ),	/* Offset= 2 (190) */

+/* 190 */	

+			0x2f,		/* FC_IP */

+			0x5a,		/* FC_CONSTANT_IID */

+/* 192 */	NdrFcLong( 0x1814ceeb ),	/* 404016875 */

+/* 196 */	NdrFcShort( 0x49e2 ),	/* 18914 */

+/* 198 */	NdrFcShort( 0x407f ),	/* 16511 */

+/* 200 */	0xaf,		/* 175 */

+			0x99,		/* 153 */

+/* 202 */	0xfa,		/* 250 */

+			0x75,		/* 117 */

+/* 204 */	0x5a,		/* 90 */

+			0x7d,		/* 125 */

+/* 206 */	0x26,		/* 38 */

+			0x7,		/* 7 */

+

+			0x0

+        }

+    };

+

+static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] = 

+        {

+            

+            {

+            BSTR_UserSize

+            ,BSTR_UserMarshal

+            ,BSTR_UserUnmarshal

+            ,BSTR_UserFree

+            }

+

+        };

+

+

+

+/* Standard interface: __MIDL_itf_ISimpleDOMNode_0000_0000, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

+

+

+/* Object interface: IUnknown, ver. 0.0,

+   GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */

+

+

+/* Object interface: ISimpleDOMNode, ver. 0.0,

+   GUID={0x1814ceeb,0x49e2,0x407f,{0xaf,0x99,0xfa,0x75,0x5a,0x7d,0x26,0x07}} */

+

+#pragma code_seg(".orpc")

+static const unsigned short ISimpleDOMNode_FormatStringOffsetTable[] =

+    {

+    0,

+    68,

+    130,

+    186,

+    248,

+    304,

+    342,

+    380,

+    418,

+    456,

+    494,

+    532,

+    576,

+    (unsigned short) -1,

+    614

+    };

+

+static const MIDL_STUBLESS_PROXY_INFO ISimpleDOMNode_ProxyInfo =

+    {

+    &Object_StubDesc,

+    ISimpleDOMNode__MIDL_ProcFormatString.Format,

+    &ISimpleDOMNode_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0

+    };

+

+

+static const MIDL_SERVER_INFO ISimpleDOMNode_ServerInfo = 

+    {

+    &Object_StubDesc,

+    0,

+    ISimpleDOMNode__MIDL_ProcFormatString.Format,

+    &ISimpleDOMNode_FormatStringOffsetTable[-3],

+    0,

+    0,

+    0,

+    0};

+CINTERFACE_PROXY_VTABLE(18) _ISimpleDOMNodeProxyVtbl = 

+{

+    &ISimpleDOMNode_ProxyInfo,

+    &IID_ISimpleDOMNode,

+    IUnknown_QueryInterface_Proxy,

+    IUnknown_AddRef_Proxy,

+    IUnknown_Release_Proxy ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_nodeInfo */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_attributes */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_attributesForNames */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_computedStyle */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_computedStyleForProperties */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::scrollTo */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_parentNode */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_firstChild */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_lastChild */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_previousSibling */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_nextSibling */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_childAt */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_innerHTML */ ,

+    0 /* ISimpleDOMNode::get_localInterface */ ,

+    (void *) (INT_PTR) -1 /* ISimpleDOMNode::get_language */

+};

+

+const CInterfaceStubVtbl _ISimpleDOMNodeStubVtbl =

+{

+    &IID_ISimpleDOMNode,

+    &ISimpleDOMNode_ServerInfo,

+    18,

+    0, /* pure interpreted */

+    CStdStubBuffer_METHODS

+};

+

+static const MIDL_STUB_DESC Object_StubDesc = 

+    {

+    0,

+    NdrOleAllocate,

+    NdrOleFree,

+    0,

+    0,

+    0,

+    0,

+    0,

+    ISimpleDOMNode__MIDL_TypeFormatString.Format,

+    1, /* -error bounds_check flag */

+    0x50002, /* Ndr library version */

+    0,

+    0x801026e, /* MIDL Version 8.1.622 */

+    0,

+    UserMarshalRoutines,

+    0,  /* notify & notify_flag routine table */

+    0x1, /* MIDL flag */

+    0, /* cs routines */

+    0,   /* proxy/server info */

+    0

+    };

+

+const CInterfaceProxyVtbl * const _ISimpleDOMNode_ProxyVtblList[] = 

+{

+    ( CInterfaceProxyVtbl *) &_ISimpleDOMNodeProxyVtbl,

+    0

+};

+

+const CInterfaceStubVtbl * const _ISimpleDOMNode_StubVtblList[] = 

+{

+    ( CInterfaceStubVtbl *) &_ISimpleDOMNodeStubVtbl,

+    0

+};

+

+PCInterfaceName const _ISimpleDOMNode_InterfaceNamesList[] = 

+{

+    "ISimpleDOMNode",

+    0

+};

+

+

+#define _ISimpleDOMNode_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _ISimpleDOMNode, pIID, n)

+

+int __stdcall _ISimpleDOMNode_IID_Lookup( const IID * pIID, int * pIndex )

+{

+    

+    if(!_ISimpleDOMNode_CHECK_IID(0))

+        {

+        *pIndex = 0;

+        return 1;

+        }

+

+    return 0;

+}

+

+const ExtendedProxyFileInfo ISimpleDOMNode_ProxyFileInfo = 

+{

+    (PCInterfaceProxyVtblList *) & _ISimpleDOMNode_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _ISimpleDOMNode_StubVtblList,

+    (const PCInterfaceName * ) & _ISimpleDOMNode_InterfaceNamesList,

+    0, /* no delegation */

+    & _ISimpleDOMNode_IID_Lookup, 

+    1,

+    2,

+    0, /* table of [async_uuid] interfaces */

+    0, /* Filler1 */

+    0, /* Filler2 */

+    0  /* Filler3 */

+};

+#if _MSC_VER >= 1200

+#pragma warning(pop)

+#endif

+

+

+#endif /* defined(_M_AMD64)*/

+

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.dlldata.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode.dlldata.c
similarity index 100%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.dlldata.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.h b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode.h
similarity index 99%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.h
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode.h
index eef4e9e7..8e078f0 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.h
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode.h
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMNode.idl:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_i.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode_i.c
similarity index 97%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_i.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode_i.c
index 9fc7af9..9497bb2 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_i.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode_i.c
@@ -6,7 +6,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMNode.idl:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_p.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode_p.c
similarity index 99%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_p.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode_p.c
index 44125d9..d90f708 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode_p.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMNode.idl/x86/ISimpleDOMNode_p.c
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMNode.idl:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.dlldata.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText.dlldata.c
similarity index 100%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.dlldata.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.h b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText.h
similarity index 98%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.h
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText.h
index 97281ba..dd1de6fc 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.h
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText.h
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMText.idl:

-    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_i.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText_i.c
similarity index 93%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_i.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText_i.c
index 8f46be9..f73288e 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_i.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText_i.c
@@ -6,10 +6,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMText.idl:

-    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_p.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText_p.c
similarity index 66%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_p.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText_p.c
index a7ebee7..a6799fc 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_p.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x64/ISimpleDOMText_p.c
@@ -4,10 +4,10 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMText.idl:

-    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

     VC __declspec() decoration level: 

@@ -16,7 +16,7 @@
 */

 /* @@MIDL_FILE_HEADING(  ) */

 

-#if !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_)

+#if defined(_M_AMD64)

 

 

 #pragma warning( disable: 4049 )  /* more than 64k source lines */

@@ -28,9 +28,6 @@
 #pragma warning( disable: 4232 )  /* dllimport identity*/

 #pragma warning( disable: 4024 )  /* array to pointer mapping*/

 #pragma warning( disable: 4152 )  /* function/data pointer conversion in expression */

-#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */

-

-#pragma optimize("", off ) 

 

 #define USE_STUBLESS_PROXY

 

@@ -50,7 +47,7 @@
 #include "ISimpleDOMText.h"

 

 #define TYPE_FORMAT_STRING_SIZE   47                                

-#define PROC_FORMAT_STRING_SIZE   247                               

+#define PROC_FORMAT_STRING_SIZE   257                               

 #define EXPR_FORMAT_STRING_SIZE   1                                 

 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   1            

@@ -92,18 +89,10 @@
 

 extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];

 

-#if !defined(__RPC_WIN32__)

+#if !defined(__RPC_WIN64__)

 #error  Invalid build platform for this stub.

 #endif

 

-#if !(TARGET_IS_NT50_OR_LATER)

-#error You need Windows 2000 or later to run this stub because it uses these features:

-#error   /robust command line switch.

-#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.

-#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.

-#endif

-

-

 static const ISimpleDOMText_MIDL_PROC_FORMAT_STRING ISimpleDOMText__MIDL_ProcFormatString =

     {

         0,

@@ -115,228 +104,233 @@
 			0x6c,		/* Old Flags:  object, Oi2 */

 /*  2 */	NdrFcLong( 0x0 ),	/* 0 */

 /*  6 */	NdrFcShort( 0x3 ),	/* 3 */

-/*  8 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

+/*  8 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

 /* 10 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 12 */	NdrFcShort( 0x8 ),	/* 8 */

 /* 14 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

 			0x2,		/* 2 */

-/* 16 */	0x8,		/* 8 */

+/* 16 */	0xa,		/* 10 */

 			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

 /* 18 */	NdrFcShort( 0x1 ),	/* 1 */

 /* 20 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 22 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 24 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter domText */

 

-/* 24 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

-/* 26 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

-/* 28 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+/* 26 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 28 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 30 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

 

 	/* Return value */

 

-/* 30 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 32 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

-/* 34 */	0x8,		/* FC_LONG */

+/* 32 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 34 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 36 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure get_clippedSubstringBounds */

 

-/* 36 */	0x33,		/* FC_AUTO_HANDLE */

+/* 38 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 38 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 42 */	NdrFcShort( 0x4 ),	/* 4 */

-/* 44 */	NdrFcShort( 0x20 ),	/* x86 Stack size/offset = 32 */

-/* 46 */	NdrFcShort( 0x10 ),	/* 16 */

-/* 48 */	NdrFcShort( 0x78 ),	/* 120 */

-/* 50 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+/* 40 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 44 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 46 */	NdrFcShort( 0x40 ),	/* X64 Stack size/offset = 64 */

+/* 48 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 50 */	NdrFcShort( 0x78 ),	/* 120 */

+/* 52 */	0x44,		/* Oi2 Flags:  has return, has ext, */

 			0x7,		/* 7 */

-/* 52 */	0x8,		/* 8 */

+/* 54 */	0xa,		/* 10 */

 			0x1,		/* Ext Flags:  new corr desc, */

-/* 54 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 56 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 58 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 60 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 62 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter startIndex */

 

-/* 60 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 62 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

-/* 64 */	0x8,		/* FC_LONG */

+/* 64 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 66 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 68 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter endIndex */

 

-/* 66 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 68 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

-/* 70 */	0x8,		/* FC_LONG */

+/* 70 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 72 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 74 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter x */

 

-/* 72 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 74 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

-/* 76 */	0x8,		/* FC_LONG */

+/* 76 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 78 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 80 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter y */

 

-/* 78 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 80 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

-/* 82 */	0x8,		/* FC_LONG */

+/* 82 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 84 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 86 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter width */

 

-/* 84 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 86 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

-/* 88 */	0x8,		/* FC_LONG */

+/* 88 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 90 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 92 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter height */

 

-/* 90 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 92 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

-/* 94 */	0x8,		/* FC_LONG */

+/* 94 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 96 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

+/* 98 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Return value */

 

-/* 96 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 98 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

-/* 100 */	0x8,		/* FC_LONG */

+/* 100 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 102 */	NdrFcShort( 0x38 ),	/* X64 Stack size/offset = 56 */

+/* 104 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure get_unclippedSubstringBounds */

 

-/* 102 */	0x33,		/* FC_AUTO_HANDLE */

+/* 106 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 104 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 108 */	NdrFcShort( 0x5 ),	/* 5 */

-/* 110 */	NdrFcShort( 0x20 ),	/* x86 Stack size/offset = 32 */

-/* 112 */	NdrFcShort( 0x10 ),	/* 16 */

-/* 114 */	NdrFcShort( 0x78 ),	/* 120 */

-/* 116 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+/* 108 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 112 */	NdrFcShort( 0x5 ),	/* 5 */

+/* 114 */	NdrFcShort( 0x40 ),	/* X64 Stack size/offset = 64 */

+/* 116 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 118 */	NdrFcShort( 0x78 ),	/* 120 */

+/* 120 */	0x44,		/* Oi2 Flags:  has return, has ext, */

 			0x7,		/* 7 */

-/* 118 */	0x8,		/* 8 */

+/* 122 */	0xa,		/* 10 */

 			0x1,		/* Ext Flags:  new corr desc, */

-/* 120 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 122 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 124 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 126 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 128 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 130 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter startIndex */

 

-/* 126 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 128 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

-/* 130 */	0x8,		/* FC_LONG */

+/* 132 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 134 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 136 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter endIndex */

 

-/* 132 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 134 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

-/* 136 */	0x8,		/* FC_LONG */

+/* 138 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 140 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 142 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter x */

 

-/* 138 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 140 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

-/* 142 */	0x8,		/* FC_LONG */

+/* 144 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 146 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 148 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter y */

 

-/* 144 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 146 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

-/* 148 */	0x8,		/* FC_LONG */

+/* 150 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 152 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 154 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter width */

 

-/* 150 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 152 */	NdrFcShort( 0x14 ),	/* x86 Stack size/offset = 20 */

-/* 154 */	0x8,		/* FC_LONG */

+/* 156 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 158 */	NdrFcShort( 0x28 ),	/* X64 Stack size/offset = 40 */

+/* 160 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter height */

 

-/* 156 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

-/* 158 */	NdrFcShort( 0x18 ),	/* x86 Stack size/offset = 24 */

-/* 160 */	0x8,		/* FC_LONG */

+/* 162 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */

+/* 164 */	NdrFcShort( 0x30 ),	/* X64 Stack size/offset = 48 */

+/* 166 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Return value */

 

-/* 162 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 164 */	NdrFcShort( 0x1c ),	/* x86 Stack size/offset = 28 */

-/* 166 */	0x8,		/* FC_LONG */

+/* 168 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 170 */	NdrFcShort( 0x38 ),	/* X64 Stack size/offset = 56 */

+/* 172 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure scrollToSubstring */

 

-/* 168 */	0x33,		/* FC_AUTO_HANDLE */

+/* 174 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 170 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 174 */	NdrFcShort( 0x6 ),	/* 6 */

-/* 176 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */

-/* 178 */	NdrFcShort( 0x10 ),	/* 16 */

-/* 180 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 182 */	0x44,		/* Oi2 Flags:  has return, has ext, */

+/* 176 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 180 */	NdrFcShort( 0x6 ),	/* 6 */

+/* 182 */	NdrFcShort( 0x20 ),	/* X64 Stack size/offset = 32 */

+/* 184 */	NdrFcShort( 0x10 ),	/* 16 */

+/* 186 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 188 */	0x44,		/* Oi2 Flags:  has return, has ext, */

 			0x3,		/* 3 */

-/* 184 */	0x8,		/* 8 */

+/* 190 */	0xa,		/* 10 */

 			0x1,		/* Ext Flags:  new corr desc, */

-/* 186 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 188 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 190 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 192 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 194 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 196 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 198 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter startIndex */

 

-/* 192 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 194 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

-/* 196 */	0x8,		/* FC_LONG */

+/* 200 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 202 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 204 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Parameter endIndex */

 

-/* 198 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

-/* 200 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

-/* 202 */	0x8,		/* FC_LONG */

+/* 206 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */

+/* 208 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 210 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Return value */

 

-/* 204 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 206 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

-/* 208 */	0x8,		/* FC_LONG */

+/* 212 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 214 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 216 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 	/* Procedure get_fontFamily */

 

-/* 210 */	0x33,		/* FC_AUTO_HANDLE */

+/* 218 */	0x33,		/* FC_AUTO_HANDLE */

 			0x6c,		/* Old Flags:  object, Oi2 */

-/* 212 */	NdrFcLong( 0x0 ),	/* 0 */

-/* 216 */	NdrFcShort( 0x7 ),	/* 7 */

-/* 218 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */

-/* 220 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 222 */	NdrFcShort( 0x8 ),	/* 8 */

-/* 224 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

+/* 220 */	NdrFcLong( 0x0 ),	/* 0 */

+/* 224 */	NdrFcShort( 0x7 ),	/* 7 */

+/* 226 */	NdrFcShort( 0x18 ),	/* X64 Stack size/offset = 24 */

+/* 228 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 230 */	NdrFcShort( 0x8 ),	/* 8 */

+/* 232 */	0x45,		/* Oi2 Flags:  srv must size, has return, has ext, */

 			0x2,		/* 2 */

-/* 226 */	0x8,		/* 8 */

+/* 234 */	0xa,		/* 10 */

 			0x3,		/* Ext Flags:  new corr desc, clt corr check, */

-/* 228 */	NdrFcShort( 0x1 ),	/* 1 */

-/* 230 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 232 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 236 */	NdrFcShort( 0x1 ),	/* 1 */

+/* 238 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 240 */	NdrFcShort( 0x0 ),	/* 0 */

+/* 242 */	NdrFcShort( 0x0 ),	/* 0 */

 

 	/* Parameter fontFamily */

 

-/* 234 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

-/* 236 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */

-/* 238 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

+/* 244 */	NdrFcShort( 0x2113 ),	/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */

+/* 246 */	NdrFcShort( 0x8 ),	/* X64 Stack size/offset = 8 */

+/* 248 */	NdrFcShort( 0x20 ),	/* Type Offset=32 */

 

 	/* Return value */

 

-/* 240 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

-/* 242 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */

-/* 244 */	0x8,		/* FC_LONG */

+/* 250 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */

+/* 252 */	NdrFcShort( 0x10 ),	/* X64 Stack size/offset = 16 */

+/* 254 */	0x8,		/* FC_LONG */

 			0x0,		/* 0 */

 

 			0x0

@@ -376,7 +370,7 @@
 /* 32 */	0xb4,		/* FC_USER_MARSHAL */

 			0x83,		/* 131 */

 /* 34 */	NdrFcShort( 0x0 ),	/* 0 */

-/* 36 */	NdrFcShort( 0x4 ),	/* 4 */

+/* 36 */	NdrFcShort( 0x8 ),	/* 8 */

 /* 38 */	NdrFcShort( 0x0 ),	/* 0 */

 /* 40 */	NdrFcShort( 0xffde ),	/* Offset= -34 (6) */

 /* 42 */	

@@ -417,10 +411,10 @@
 static const unsigned short ISimpleDOMText_FormatStringOffsetTable[] =

     {

     0,

-    36,

-    102,

-    168,

-    210

+    38,

+    106,

+    174,

+    218

     };

 

 static const MIDL_STUBLESS_PROXY_INFO ISimpleDOMText_ProxyInfo =

@@ -543,5 +537,5 @@
 #endif

 

 

-#endif /* !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_) */

+#endif /* defined(_M_AMD64)*/

 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.dlldata.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText.dlldata.c
similarity index 100%
copy from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.dlldata.c
copy to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText.dlldata.c
diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.h b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText.h
similarity index 99%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.h
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText.h
index 97281ba..7922549a 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.h
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText.h
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMText.idl:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_i.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText_i.c
similarity index 97%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_i.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText_i.c
index 8f46be9..38d66b37 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_i.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText_i.c
@@ -6,7 +6,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMText.idl:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

diff --git a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_p.c b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText_p.c
similarity index 99%
rename from third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_p.c
rename to third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText_p.c
index a7ebee7..dbd877c7 100644
--- a/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText_p.c
+++ b/third_party/win_build_output/midl/third_party/isimpledom/ISimpleDOMText.idl/x86/ISimpleDOMText_p.c
@@ -4,7 +4,7 @@
 

 

  /* File created by MIDL compiler version 8.01.0622 */

-/* at Mon Jan 18 22:14:07 2038

+/* at a redacted point in time

  */

 /* Compiler settings for ../../third_party/isimpledom/ISimpleDOMText.idl:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 

diff --git a/tools/battor_agent/BUILD.gn b/tools/battor_agent/BUILD.gn
index 1a7dc67..5339b67f 100644
--- a/tools/battor_agent/BUILD.gn
+++ b/tools/battor_agent/BUILD.gn
@@ -16,7 +16,6 @@
     "//base",
     "//build/config:exe_and_shlib_deps",
     "//build/win:default_exe_manifest",
-    "//device/serial",
   ]
 }
 
@@ -58,7 +57,6 @@
     "//base",
     "//base/test:run_all_unittests",
     "//base/test:test_support",
-    "//device/serial",
     "//device/serial:test_support",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/tools/chrome_proxy/webdriver/client_config.py b/tools/chrome_proxy/webdriver/client_config.py
index 5a5ffdd2..c2d88b2 100644
--- a/tools/chrome_proxy/webdriver/client_config.py
+++ b/tools/chrome_proxy/webdriver/client_config.py
@@ -6,6 +6,7 @@
 from common import TestDriver
 from common import IntegrationTest
 from decorators import ChromeVersionEqualOrAfterM
+from decorators import NotAndroid
 import json
 
 
@@ -33,7 +34,9 @@
 
   # Ensure client config is fetched at the start of the Chrome session, and the
   # variations ID is set in the request.
+  # Disabled on android because the net log is not copied yet. crbug.com/761507
   @ChromeVersionEqualOrAfterM(62)
+  @NotAndroid
   def testClientConfigVariationsHeader(self):
     with TestDriver() as t:
       t.AddChromeArg('--log-net-log=chrome.netlog.json')
@@ -64,7 +67,9 @@
 
   # Ensure client config is fetched at the start of the Chrome session, and the
   # variations ID is not set in the request.
+  # Disabled on android because the net log is not copied yet. crbug.com/761507
   @ChromeVersionEqualOrAfterM(62)
+  @NotAndroid
   def testClientConfigNoVariationsHeader(self):
     with TestDriver() as t:
       t.AddChromeArg('--log-net-log=chrome.netlog.json')
diff --git a/tools/chrome_proxy/webdriver/cross_origin_push.py b/tools/chrome_proxy/webdriver/cross_origin_push.py
index 395c9434..3f41aa0d 100644
--- a/tools/chrome_proxy/webdriver/cross_origin_push.py
+++ b/tools/chrome_proxy/webdriver/cross_origin_push.py
@@ -6,12 +6,15 @@
 from common import TestDriver
 from common import IntegrationTest
 from decorators import ChromeVersionEqualOrAfterM
+from decorators import NotAndroid
 import json
 
 
 class CrossOriginPush(IntegrationTest):
   # Ensure cross origin push from trusted proxy server is adopted by Chromium.
+  # Disabled on android because the net log is not copied yet. crbug.com/761507
   @ChromeVersionEqualOrAfterM(62)
+  @NotAndroid
   def testClientConfigVariationsHeader(self):
     with TestDriver() as t:
       t.AddChromeArg('--log-net-log=chrome.netlog.json')
@@ -38,16 +41,16 @@
     self.assertLess(0, mapped_const)
 
     for i in data["events"]:
-     dumped_event = json.dumps(i)
-     if dumped_event.find("chrome-proxy") != -1 and\
-      dumped_event.find("check.googlezip.net/test.html") != -1 and\
-      dumped_event.find("promised_stream_id") !=-1:
-        promised_stream_count = promised_stream_count + 1
+      dumped_event = json.dumps(i)
+      if dumped_event.find("chrome-proxy") != -1 and\
+        dumped_event.find("check.googlezip.net/test.html") != -1 and\
+        dumped_event.find("promised_stream_id") !=-1:
+          promised_stream_count = promised_stream_count + 1
 
-     if dumped_event.find(str(mapped_const)) != -1 and\
-      dumped_event.find("check.googlezip.net/test.html") != -1 and\
-      dumped_event.find("stream_id") !=-1:
-        adopted_stream_count = adopted_stream_count + 1
+      if dumped_event.find(str(mapped_const)) != -1 and\
+        dumped_event.find("check.googlezip.net/test.html") != -1 and\
+        dumped_event.find("stream_id") !=-1:
+          adopted_stream_count = adopted_stream_count + 1
 
     # Verify that the stream was pushed and adopted.
     self.assertEqual(1, promised_stream_count)
diff --git a/tools/chrome_proxy/webdriver/smoke.py b/tools/chrome_proxy/webdriver/smoke.py
index 50d5526..c809b69 100644
--- a/tools/chrome_proxy/webdriver/smoke.py
+++ b/tools/chrome_proxy/webdriver/smoke.py
@@ -8,6 +8,7 @@
 from common import IntegrationTest
 from decorators import NotAndroid
 from decorators import ChromeVersionEqualOrAfterM
+from decorators import NotAndroid
 import json
 
 class Smoke(IntegrationTest):
@@ -73,10 +74,6 @@
     with TestDriver() as t:
       t.AddChromeArg('--enable-spdy-proxy-auth')
       t.AddChromeArg('--enable-data-reduction-proxy-force-pingback')
-      t.AddChromeArg('--log-net-log=chrome.netlog.json')
-      # Force set the variations ID, so they are send along with the pingback
-      # request.
-      t.AddChromeArg('--force-variation-ids=42')
       t.LoadURL('http://check.googlezip.net/test.html')
       t.LoadURL('http://check.googlezip.net/test.html')
       t.SleepUntilHistogramHasEntry("DataReductionProxy.Pingback.Succeeded")
@@ -86,6 +83,21 @@
       succeeded = t.GetHistogram('DataReductionProxy.Pingback.Succeeded')
       self.assertEqual(1, succeeded['count'])
 
+  # Ensure pageload metric pingback with DataSaver has the variations header.
+  # Disabled on android because the net log is not copied yet. crbug.com/761507
+  @NotAndroid
+  def testPingbackHasVariations(self):
+    with TestDriver() as t:
+      t.AddChromeArg('--enable-spdy-proxy-auth')
+      t.AddChromeArg('--enable-data-reduction-proxy-force-pingback')
+      t.AddChromeArg('--log-net-log=chrome.netlog.json')
+      # Force set the variations ID, so they are send along with the pingback
+      # request.
+      t.AddChromeArg('--force-variation-ids=42')
+      t.LoadURL('http://check.googlezip.net/test.html')
+      t.LoadURL('http://check.googlezip.net/test.html')
+      t.SleepUntilHistogramHasEntry("DataReductionProxy.Pingback.Succeeded")
+
     # Look for the request made to data saver pingback server.
     with open('chrome.netlog.json') as data_file:
       data = json.load(data_file)
diff --git a/tools/idl_parser/idl_parser.py b/tools/idl_parser/idl_parser.py
index fff00a6..fbc89ee 100755
--- a/tools/idl_parser/idl_parser.py
+++ b/tools/idl_parser/idl_parser.py
@@ -220,9 +220,14 @@
 # the Web IDL spec, such as allowing string list in extended attributes.
 class IDLParser(object):
   def p_Definitions(self, p):
-    """Definitions : ExtendedAttributeList Definition Definitions
+    """Definitions : SpecialComments ExtendedAttributeList Definition Definitions
+                   | ExtendedAttributeList Definition Definitions
                    | """
-    if len(p) > 1:
+    if len(p) > 4:
+      special_comments_and_attribs = ListFromConcat(p[1], p[2])
+      p[3].AddChildren(special_comments_and_attribs)
+      p[0] = ListFromConcat(p[3], p[4])
+    elif len(p) > 1:
       p[2].AddChildren(p[1])
       p[0] = ListFromConcat(p[2], p[3])
 
@@ -716,19 +721,11 @@
 
   # This rule has custom additions (i.e. SpecialComments).
   def p_ExtendedAttributeList(self, p):
-    """ExtendedAttributeList : SpecialComments '[' ExtendedAttribute ExtendedAttributes ']'
-                             | '[' ExtendedAttribute ExtendedAttributes ']'
-                             | SpecialComments
+    """ExtendedAttributeList : '[' ExtendedAttribute ExtendedAttributes ']'
                              | """
-    if len(p) > 5:
-      items = ListFromConcat(p[3], p[4])
-      attribs = self.BuildProduction('ExtAttributes', p, 2, items)
-      p[0] = ListFromConcat(p[1], attribs)
-    elif len(p) > 4:
+    if len(p) > 4:
       items = ListFromConcat(p[2], p[3])
       p[0] = self.BuildProduction('ExtAttributes', p, 1, items)
-    elif len(p) > 1:
-      p[0] = p[1]
 
   # Error recovery for ExtendedAttributeList
   def p_ExtendedAttributeListError(self, p):
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 2c09040..1cafa04 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -235,6 +235,8 @@
       'CrWinGomaStaging': 'release_bot_x86_minimal_symbols',
       'Chromium Linux Goma GCE Staging': 'release_bot',
       'Chromium Mac Goma GCE Staging': 'release_bot',
+      'CrWinGomaGCEStaging': 'release_bot_x86_minimal_symbols',
+      'CrWinClangGomaGCEStaging': 'win_clang_release_bot',
     },
 
     'chromium.gpu': {
@@ -376,7 +378,7 @@
       'Android N5X Swarm': 'android_release_bot_minimal_symbols_arm64',
       'Linux Swarm': 'release_bot',
       'Mac Swarm': 'release_bot_mac_strip',
-      'Windows Swarm': 'release_bot_x86_minimal_symbols',
+      'Windows Swarm': 'release_bot_minimal_symbols',
     },
 
     'client.nacl.sdk': {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 8abebb9..2c871de 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -11337,6 +11337,10 @@
   <int value="383" label="NativePrintersBulkAccessMode"/>
   <int value="384" label="NativePrintersBulkBlacklist"/>
   <int value="385" label="NativePrintersBulkWhitelist"/>
+  <int value="386" label="DeviceNativePrinters"/>
+  <int value="387" label="DeviceNativePrintersAccessMode"/>
+  <int value="388" label="DeviceNativePrintersBlacklist"/>
+  <int value="389" label="DeviceNativePrintersWhitelist"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -13420,6 +13424,7 @@
   <int value="1189" label="FILEMANAGERPRIVATE_GETRECENTFILES"/>
   <int value="1190" label="FILEMANAGERPRIVATE_RENAMEVOLUME"/>
   <int value="1191" label="AUTOTESTPRIVATE_SETMOUSEREVERSESCROLL"/>
+  <int value="1192" label="METRICSPRIVATE_RECORDSPARSEHASHABLE"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -36772,6 +36777,11 @@
   <int value="2" label="Load failed"/>
 </enum>
 
+<enum name="SuggestedAppListAppLaunched">
+  <int value="0" label="Not a suggested app"/>
+  <int value="1" label="Suggested app"/>
+</enum>
+
 <!--
 These values are based on the server-side type AnswerTriggererKey. Note that not
 all of the types are launched in Chrome but if they're sent erroneously, it
@@ -40144,6 +40154,92 @@
   <int value="3" label="Blob"/>
 </enum>
 
+<enum name="WebUISettingsPathHashes">
+  <int value="-2088016711" label="/startupPages"/>
+  <int value="-2082028555" label="/androidApps/details"/>
+  <int value="-2081867874" label="/usbDevices"/>
+  <int value="-2019732586" label="/printing"/>
+  <int value="-1930329480" label="/signOut"/>
+  <int value="-1915654604" label="/sound"/>
+  <int value="-1836863301" label="/ads"/>
+  <int value="-1820397898" label="/manageAccessibility"/>
+  <int value="-1737559358" label="/flash"/>
+  <int value="-1688600161" label="/manageProfile"/>
+  <int value="-1351149930" label="/backgroundSync"/>
+  <int value="-1312744606" label="/knownNetworks"/>
+  <int value="-1297176639" label="/fonts"/>
+  <int value="-1279337432" label="/power"/>
+  <int value="-1227595649" label="/all"/>
+  <int value="-1167413307" label="/inputMethods"/>
+  <int value="-1165810228" label="/searchEngines"/>
+  <int value="-1119639824" label="/display"/>
+  <int value="-1058065329" label="/languages"/>
+  <int value="-1048015830" label="/"/>
+  <int value="-1024208058" label="/midiDevices"/>
+  <int value="-1021686484" label="/javascript"/>
+  <int value="-1006445425" label="/importData"/>
+  <int value="-988053194" label="/lockScreen"/>
+  <int value="-972517930" label="/googleAssistant"/>
+  <int value="-916174295" label="/internet"/>
+  <int value="-907780721" label="/certificates"/>
+  <int value="-843556233" label="/location"/>
+  <int value="-732448620" label="/pdfDocuments"/>
+  <int value="-710357049" label="/bluetooth"/>
+  <int value="-686834549" label="/downloads"/>
+  <int value="-536183569" label="/protectedContent"/>
+  <int value="-512116630" label="/search"/>
+  <int value="-482801316" label="/appearance"/>
+  <int value="-469021167" label="/resetProfileSettings"/>
+  <int value="-442978022" label="/networks"/>
+  <int value="-378866134" label="/networkDetail"/>
+  <int value="-319293467" label="/multidevice"/>
+  <int value="-300300075" label="/system"/>
+  <int value="-230959653" label="/syncSetup"/>
+  <int value="-210069062" label="/content"/>
+  <int value="-44267040" label="/bluetoothDevices"/>
+  <int value="-14666765" label="/accounts"/>
+  <int value="16194264" label="/popups"/>
+  <int value="48697687" label="/zoomLevels"/>
+  <int value="223791833" label="/help/about"/>
+  <int value="273561147" label="/autofill"/>
+  <int value="297583680" label="/device"/>
+  <int value="306239043" label="/camera"/>
+  <int value="334469894" label="/people"/>
+  <int value="338873252" label="/passwords"/>
+  <int value="350639838" label="/cookies"/>
+  <int value="408074355" label="/onStartup"/>
+  <int value="511430105" label="/automaticDownloads"/>
+  <int value="537677705" label="/cookies/detail"/>
+  <int value="618530678" label="/advanced"/>
+  <int value="683177973" label="/cupsPrinters"/>
+  <int value="754547746" label="/help/details"/>
+  <int value="856943564" label="/content/siteDetails"/>
+  <int value="868952532" label="/pointer-overlay"/>
+  <int value="912274271" label="/siteData"/>
+  <int value="943458628" label="/triggeredResetProfileSettings"/>
+  <int value="1114615837" label="/accessibility"/>
+  <int value="1147116633" label="/networkConfig"/>
+  <int value="1220946500" label="/notifications"/>
+  <int value="1300569861" label="/keyboard-overlay"/>
+  <int value="1364454971" label="/androidApps"/>
+  <int value="1383875055" label="/microphone"/>
+  <int value="1384165448" label="/stylus"/>
+  <int value="1462185522" label="/dateTime"/>
+  <int value="1497571989" label="/images"/>
+  <int value="1513138656" label="/passwordsAndForms"/>
+  <int value="1602314362" label="/storage"/>
+  <int value="1641570017" label="/defaultBrowser"/>
+  <int value="1661964813" label="/reset"/>
+  <int value="1742260422" label="/cloudPrinters"/>
+  <int value="1798082697" label="/handlers"/>
+  <int value="1853516270" label="/lockScreen/fingerprint"/>
+  <int value="1935584577" label="/clearBrowserData"/>
+  <int value="1956464558" label="/changePicture"/>
+  <int value="2083843665" label="/unsandboxedPlugins"/>
+  <int value="2127311241" label="/editDictionary"/>
+  <int value="2136345292" label="/privacy"/>
+</enum>
+
 <enum name="WebUIUrlHashes">
   <int value="-2103246641" label="chrome://signin-internals/"/>
   <int value="-2034706497" label="chrome://net-internals/"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index ae4992d4..f098c6c 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -1642,15 +1642,16 @@
   <summary>Interactions with the App Launcher promo dialog.</summary>
 </histogram>
 
-<histogram name="Apps.AppListAppLaunched" enum="BooleanEnabled">
+<histogram name="Apps.AppListAppLaunched" enum="SuggestedAppListAppLaunched">
   <owner>newcomer@chromium.org</owner>
   <summary>
     The number of apps launched from the launcher. This is logged each time an
-    app is launched. The bucket denotes whether the app is suggested.
+    app is launched.
   </summary>
 </histogram>
 
-<histogram name="Apps.AppListAppLaunchedFullscreen" enum="BooleanEnabled">
+<histogram name="Apps.AppListAppLaunchedFullscreen"
+    enum="SuggestedAppListAppLaunched">
   <owner>newcomer@chromium.org</owner>
   <summary>
     The number of apps launched from the fullscreen launcher. This is logged
@@ -1710,6 +1711,14 @@
   </summary>
 </histogram>
 
+<histogram name="Apps.AppListPeekingToFullscreen"
+    enum="AppListPeekingToFullscreenSource">
+  <owner/>
+  <summary>
+    Replaced with Apps.AppListPeekingToFullscreenSource on 9/2017.
+  </summary>
+</histogram>
+
 <histogram name="Apps.AppListPeekingToFullscreenSource"
     enum="AppListPeekingToFullscreenSource">
   <owner>newcomer@chromium.org</owner>
@@ -92040,6 +92049,16 @@
   <summary>URLs for which Chrome creates WebUIControllers.</summary>
 </histogram>
 
+<histogram name="WebUI.Settings.PathVisited" enum="WebUISettingsPathHashes">
+  <owner>dschuyler@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <owner>bettes@chromium.org</owner>
+  <summary>
+    Paths within chrome://settings visited. For evaluating popularity and
+    priorities for chrome://settings GUI.
+  </summary>
+</histogram>
+
 <histogram name="WebUsb.ChooserClosed" enum="WebUsbChooserClosed">
   <owner>reillyg@chromium.org</owner>
   <owner>juncai@chromium.org</owner>
@@ -99797,9 +99816,17 @@
   <suffix name="PasswordFieldOnFocus"
       label="Password protection triggered by password field on focus event."/>
   <suffix name="ProtectedPasswordEntry"
-      label="Password protection triggered by saved password reuse event."/>
+      label="Password protection triggered by entering a saved password that
+             does NOT match the sync password. (TODO(nparker): Rename this to
+             NonSyncPasswordEntry)"/>
   <suffix name="SyncPasswordEntry"
-      label="Password protectiontriggered by sync password reuse event."/>
+      label="Password protection triggered by entering the sync password,
+             which may or may not also match a saved password."/>
+  <suffix name="AnyPasswordEntry"
+      label="Password protection triggered by entering a password that
+             matches either/both the sync password or a saved password This
+             is a superset (and should be equal to or larger than)
+             SyncPasswordEntry and ProtectedPasswordEntry"/>
   <affected-histogram name="PasswordProtection.ModalWarningDialogAction"/>
   <affected-histogram
       name="PasswordProtection.NumberOfCachedVerdictBeforeShutdown"/>
@@ -100385,6 +100412,7 @@
   <suffix name="Offline" label="Offline previews"/>
   <suffix name="LitePage" label="Lite page previews"/>
   <suffix name="LoFi" label="Server LoFi previews"/>
+  <suffix name="AMPRedirection" label="AMP Redirection previews"/>
   <affected-histogram name="Previews.EligibilityReason"/>
   <affected-histogram name="Previews.InfoBarAction"/>
   <affected-histogram name="Previews.OptOut.UserOptedOut"/>
diff --git a/tools/perf/page_sets/data/top_25.json b/tools/perf/page_sets/data/top_25.json
index b39619a..352fd37 100644
--- a/tools/perf/page_sets/data/top_25.json
+++ b/tools/perf/page_sets/data/top_25.json
@@ -1,16 +1,34 @@
 {
     "archives": {
+        "Docs  (1 open document tab)": {
+            "DEFAULT": "top_25_009.wprgo"
+        },
+        "ESPN": {
+            "DEFAULT": "top_25_009.wprgo"
+        },
         "Facebook": {
-            "DEFAULT": "top_25_003.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
+        },
+        "LinkedIn": {
+            "DEFAULT": "top_25_009.wprgo"
+        },
+        "Pinterest": {
+            "DEFAULT": "top_25_009.wprgo"
+        },
+        "Twitter": {
+            "DEFAULT": "top_25_009.wprgo"
+        },
+        "Weather.com": {
+            "DEFAULT": "top_25_009.wprgo"
         },
         "Wikipedia (1 tab)": {
-            "DEFAULT": "top_25_004.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://answers.yahoo.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://booking.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://en.blog.wordpress.com/2012/09/04/freshly-pressed-editors-picks-for-august-2012/": {
             "DEFAULT": "top_25_000.wprgo"
@@ -22,13 +40,13 @@
             "DEFAULT": "top_25_000.wprgo"
         },
         "http://games.yahoo.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://googlewebmastercentral.blogspot.com/": {
             "DEFAULT": "top_25_000.wprgo"
         },
         "http://news.yahoo.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://pinterest.com": {
             "DEFAULT": "top_25_000.wprgo"
@@ -37,16 +55,16 @@
             "DEFAULT": "top_25_000.wprgo"
         },
         "http://techcrunch.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://www.amazon.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://www.cnn.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://www.ebay.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "http://www.facebook.com/barackobama": {
             "DEFAULT": "top_25_000.wprgo"
@@ -58,7 +76,7 @@
             "DEFAULT": "top_25_000.wprgo"
         },
         "http://www.youtube.com": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "https://docs.google.com/document/d/1X-IKNjtEnx-WW5JIKRLsyhz5sbsat3mfTpAPUSX3_s4/view": {
             "DEFAULT": "top_25_000.wprgo"
@@ -67,24 +85,24 @@
             "DEFAULT": "top_25_000.wprgo"
         },
         "https://mail.google.com/mail/": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "https://plus.google.com/110031535020051778989/posts": {
-            "DEFAULT": "top_25_001.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "https://twitter.com/katyperry": {
             "DEFAULT": "top_25_000.wprgo"
         },
         "https://www.google.com/#hl=en&q=barack+obama": {
-            "DEFAULT": "top_25_000.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         },
         "https://www.google.com/calendar/": {
             "DEFAULT": "top_25_000.wprgo"
         },
         "https://www.google.com/search?q=cats&tbm=isch": {
-            "DEFAULT": "top_25_002.wprgo"
+            "DEFAULT": "top_25_009.wprgo"
         }
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
     "platform_specific": true
-}
\ No newline at end of file
+}
diff --git a/tools/perf/page_sets/data/top_25_009.wprgo.sha1 b/tools/perf/page_sets/data/top_25_009.wprgo.sha1
new file mode 100644
index 0000000..a64c98f
--- /dev/null
+++ b/tools/perf/page_sets/data/top_25_009.wprgo.sha1
@@ -0,0 +1 @@
+3830b520b5bd595ac5780dca488ceebb0e0deb49
\ No newline at end of file
diff --git a/tools/perf/page_sets/system_health/expectations.py b/tools/perf/page_sets/system_health/expectations.py
index d5c7cf5..f7e2edd 100644
--- a/tools/perf/page_sets/system_health/expectations.py
+++ b/tools/perf/page_sets/system_health/expectations.py
@@ -22,6 +22,8 @@
                       'crbug.com/649392')
     self.DisableStory('play:media:pandora', [expectations.ALL],
                       'crbug.com/64939')
+    self.DisableStory('browse:media:tumblr',
+                      [expectations.MAC_10_11], 'crbug.com/760966')
     self.DisableStory('browse:news:cnn',
                       [expectations.ALL_MAC], 'crbug.com/728576')
     self.DisableStory('browse:social:facebook_infinite_scroll',
@@ -47,6 +49,8 @@
                       'crbug.com/649392')
     self.DisableStory('play:media:pandora', [expectations.ALL],
                       'crbug.com/64939')
+    self.DisableStory('browse:media:tumblr',
+                      [expectations.MAC_10_11], 'crbug.com/760966')
     self.DisableStory('browse:news:cnn',
                       [expectations.ALL_MAC], 'crbug.com/728576')
     self.DisableStory('browse:social:twitter_infinite_scroll',
diff --git a/tools/perf/page_sets/top_pages.py b/tools/perf/page_sets/top_pages.py
index 505806d..bf15991 100644
--- a/tools/perf/page_sets/top_pages.py
+++ b/tools/perf/page_sets/top_pages.py
@@ -44,9 +44,14 @@
                shared_page_state_class=shared_page_state.SharedPageState):
     super(GoogleImageSearchPage, self).__init__(
         'https://www.google.com/search?q=cats&tbm=isch',
-        page_set=page_set, credentials='google',
+        page_set=page_set,
         shared_page_state_class=shared_page_state_class)
 
+  def RunNavigateSteps(self, action_runner):
+    google_login.LoginGoogleAccount(action_runner, 'googletest',
+                                    self.credentials_path)
+    super(GoogleImageSearchPage, self).RunNavigateSteps(action_runner)
+
 
 class GmailPage(TopPages):
 
@@ -77,10 +82,11 @@
     super(GoogleCalendarPage, self).__init__(
         url='https://www.google.com/calendar/',
         page_set=page_set,
-        credentials='google',
         shared_page_state_class=shared_page_state_class)
 
   def RunNavigateSteps(self, action_runner):
+    google_login.LoginGoogleAccount(action_runner, 'googletest',
+                                    self.credentials_path)
     super(GoogleCalendarPage, self).RunNavigateSteps(action_runner)
     action_runner.Wait(2)
     action_runner.WaitForElement('div[class~="navForward"]')
@@ -105,10 +111,11 @@
         url='https://docs.google.com/document/d/1X-IKNjtEnx-WW5JIKRLsyhz5sbsat3mfTpAPUSX3_s4/view',
         page_set=page_set,
         name='Docs  (1 open document tab)',
-        credentials='google',
         shared_page_state_class=shared_page_state_class)
 
   def RunNavigateSteps(self, action_runner):
+    google_login.LoginGoogleAccount(action_runner, 'googletest',
+                                    self.credentials_path)
     super(GoogleDocPage, self).RunNavigateSteps(action_runner)
     action_runner.Wait(2)
     action_runner.WaitForJavaScriptCondition(
@@ -124,10 +131,11 @@
     super(GooglePlusPage, self).__init__(
         url='https://plus.google.com/110031535020051778989/posts',
         page_set=page_set,
-        credentials='google',
         shared_page_state_class=shared_page_state_class)
 
   def RunNavigateSteps(self, action_runner):
+    google_login.LoginGoogleAccount(action_runner, 'googletest',
+                                    self.credentials_path)
     super(GooglePlusPage, self).RunNavigateSteps(action_runner)
     action_runner.WaitForElement(text='Home')
 
@@ -140,10 +148,12 @@
                shared_page_state_class=shared_page_state.SharedPageState):
     super(YoutubePage, self).__init__(
         url='http://www.youtube.com',
-        page_set=page_set, credentials='google',
+        page_set=page_set,
         shared_page_state_class=shared_page_state_class)
 
   def RunNavigateSteps(self, action_runner):
+    google_login.LoginGoogleAccount(action_runner, 'googletest',
+                                    self.credentials_path)
     super(YoutubePage, self).RunNavigateSteps(action_runner)
     action_runner.Wait(2)
 
@@ -195,12 +205,12 @@
     super(FacebookPage, self).__init__(
         url='https://www.facebook.com/barackobama',
         page_set=page_set,
-        name='Facebook', credentials='facebook2',
+        name='Facebook',
         shared_page_state_class=shared_page_state_class)
 
   def RunNavigateSteps(self, action_runner):
     super(FacebookPage, self).RunNavigateSteps(action_runner)
-    action_runner.WaitForElement(text='Chat')
+    action_runner.WaitForElement(text='Videos')
 
 
 class LinkedinPage(TopPages):
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc
index dfe82d7..a3fcd73 100644
--- a/ui/accessibility/ax_event_generator.cc
+++ b/ui/accessibility/ax_event_generator.cc
@@ -23,6 +23,8 @@
 AXEventGenerator::Iterator::Iterator(const AXEventGenerator::Iterator& other) =
     default;
 
+AXEventGenerator::Iterator::~Iterator() = default;
+
 bool AXEventGenerator::Iterator::operator!=(
     const AXEventGenerator::Iterator& rhs) const {
   return map_iter_ != rhs.map_iter_ ||
diff --git a/ui/accessibility/ax_event_generator.h b/ui/accessibility/ax_event_generator.h
index ee49968..db5d3e4 100644
--- a/ui/accessibility/ax_event_generator.h
+++ b/ui/accessibility/ax_event_generator.h
@@ -58,6 +58,7 @@
     Iterator(const std::map<AXNode*, std::set<Event>>& map,
              const std::map<AXNode*, std::set<Event>>::const_iterator& head);
     Iterator(const Iterator& other);
+    ~Iterator();
 
     bool operator!=(const Iterator& rhs) const;
     Iterator& operator++();
diff --git a/ui/app_list/app_list_constants.cc b/ui/app_list/app_list_constants.cc
index 76fc334..c39cd453 100644
--- a/ui/app_list/app_list_constants.cc
+++ b/ui/app_list/app_list_constants.cc
@@ -208,7 +208,7 @@
 // The UMA histogram that logs how the app list transitions from peeking to
 // fullscreen.
 const char kAppListPeekingToFullscreenHistogram[] =
-    "Apps.AppListPeekingToFullscreen";
+    "Apps.AppListPeekingToFullscreenSource";
 
 // The UMA histogram that logs how the app list is shown.
 const char kAppListToggleMethodHistogram[] = "Apps.AppListShowSource";
diff --git a/ui/app_list/views/app_list_view.cc b/ui/app_list/views/app_list_view.cc
index 3a1313a..035e20d 100644
--- a/ui/app_list/views/app_list_view.cc
+++ b/ui/app_list/views/app_list_view.cc
@@ -714,7 +714,13 @@
         break;
       case PEEKING:
         if (std::abs(drag_delta) > app_list_threshold) {
-          SetState(drag_delta > 0 ? FULLSCREEN_ALL_APPS : CLOSED);
+          if (drag_delta > 0) {
+            SetState(FULLSCREEN_ALL_APPS);
+            UMA_HISTOGRAM_ENUMERATION(kAppListPeekingToFullscreenHistogram,
+                                      kSwipe, kMaxPeekingToFullscreen);
+          } else {
+            SetState(CLOSED);
+          }
         } else {
           SetState(app_list_state_);
         }
diff --git a/ui/display/manager/chromeos/touchscreen_util.cc b/ui/display/manager/chromeos/touchscreen_util.cc
index aaa0996..34c070f30 100644
--- a/ui/display/manager/chromeos/touchscreen_util.cc
+++ b/ui/display/manager/chromeos/touchscreen_util.cc
@@ -119,6 +119,23 @@
   return device->type == ui::InputDeviceType::INPUT_DEVICE_INTERNAL;
 }
 
+void AssociateSingleDisplayAndSingleDevice(DisplayInfoList* displays,
+                                           DeviceList* devices) {
+  if (displays->size() != 1 || devices->size() != 1)
+    return;
+  // If there is only one display and only one touch device, just associate
+  // them. This fixes the issue that usb tablet input device doesn't work
+  // with chromebook.
+  DisplayInfoList::iterator display_it = displays->begin();
+  DeviceList::iterator device_it = devices->begin();
+  Associate(*display_it, *device_it);
+  VLOG(2) << "=> Matched single device " << (*device_it)->name
+          << " to single display " << (*display_it)->name();
+  displays->erase(display_it);
+  devices->erase(device_it);
+  return;
+}
+
 void AssociateInternalDevices(DisplayInfoList* displays, DeviceList* devices) {
   VLOG(2) << "Trying to match internal devices (" << displays->size()
           << " displays and " << devices->size() << " devices to match)";
@@ -270,6 +287,7 @@
             << ", sys_path: " << device->sys_path.LossyDisplayName() << ")";
   }
 
+  AssociateSingleDisplayAndSingleDevice(&displays, &devices);
   AssociateInternalDevices(&displays, &devices);
   AssociateUdlDevices(&displays, &devices);
   AssociateSameSizeDevices(&displays, &devices);
diff --git a/ui/gfx/ipc/color/gfx_param_traits.cc b/ui/gfx/ipc/color/gfx_param_traits.cc
index 7a1f8a01..093f6c9 100644
--- a/ui/gfx/ipc/color/gfx_param_traits.cc
+++ b/ui/gfx/ipc/color/gfx_param_traits.cc
@@ -9,19 +9,6 @@
 
 namespace IPC {
 
-void ParamTraits<gfx::ColorSpace>::GetSize(base::PickleSizer* s,
-                                           const gfx::ColorSpace& p) {
-  GetParamSize(s, p.primaries_);
-  GetParamSize(s, p.transfer_);
-  GetParamSize(s, p.matrix_);
-  GetParamSize(s, p.range_);
-  GetParamSize(s, p.icc_profile_id_);
-  if (p.primaries_ == gfx::ColorSpace::PrimaryID::CUSTOM)
-    s->AddBytes(sizeof(p.custom_primary_matrix_));
-  if (p.transfer_ == gfx::ColorSpace::TransferID::CUSTOM)
-    s->AddBytes(sizeof(p.custom_transfer_params_));
-}
-
 void ParamTraits<gfx::ColorSpace>::Write(base::Pickle* m,
                                          const gfx::ColorSpace& p) {
   WriteParam(m, p.primaries_);
@@ -73,12 +60,6 @@
   l->append("<gfx::ColorSpace>");
 }
 
-void ParamTraits<gfx::ICCProfile>::GetSize(base::PickleSizer* s,
-                                           const gfx::ICCProfile& p) {
-  GetParamSize(s, p.id_);
-  GetParamSize(s, p.data_);
-}
-
 void ParamTraits<gfx::ICCProfile>::Write(base::Pickle* m,
                                          const gfx::ICCProfile& p) {
   WriteParam(m, p.id_);
@@ -105,13 +86,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef UI_GFX_IPC_COLOR_GFX_PARAM_TRAITS_MACROS_H_
-#include "ui/gfx/ipc/color/gfx_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/ui/gfx/ipc/color/gfx_param_traits.h b/ui/gfx/ipc/color/gfx_param_traits.h
index 8021258..10491ea 100644
--- a/ui/gfx/ipc/color/gfx_param_traits.h
+++ b/ui/gfx/ipc/color/gfx_param_traits.h
@@ -21,7 +21,6 @@
 template <>
 struct GFX_IPC_COLOR_EXPORT ParamTraits<gfx::ColorSpace> {
   typedef gfx::ColorSpace param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -32,7 +31,6 @@
 template <>
 struct GFX_IPC_COLOR_EXPORT ParamTraits<gfx::ICCProfile> {
   typedef gfx::ICCProfile param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ui/gfx/ipc/geometry/gfx_param_traits.cc b/ui/gfx/ipc/geometry/gfx_param_traits.cc
index a4f1758..27cef90 100644
--- a/ui/gfx/ipc/geometry/gfx_param_traits.cc
+++ b/ui/gfx/ipc/geometry/gfx_param_traits.cc
@@ -16,12 +16,6 @@
 
 namespace IPC {
 
-void ParamTraits<gfx::Point>::GetSize(base::PickleSizer* s,
-                                      const gfx::Point& p) {
-  GetParamSize(s, p.x());
-  GetParamSize(s, p.y());
-}
-
 void ParamTraits<gfx::Point>::Write(base::Pickle* m, const gfx::Point& p) {
   WriteParam(m, p.x());
   WriteParam(m, p.y());
@@ -42,12 +36,6 @@
   l->append(base::StringPrintf("(%d, %d)", p.x(), p.y()));
 }
 
-void ParamTraits<gfx::PointF>::GetSize(base::PickleSizer* s,
-                                       const gfx::PointF& p) {
-  GetParamSize(s, p.x());
-  GetParamSize(s, p.y());
-}
-
 void ParamTraits<gfx::PointF>::Write(base::Pickle* m, const gfx::PointF& p) {
   WriteParam(m, p.x());
   WriteParam(m, p.y());
@@ -68,13 +56,6 @@
   l->append(base::StringPrintf("(%f, %f)", p.x(), p.y()));
 }
 
-void ParamTraits<gfx::Point3F>::GetSize(base::PickleSizer* s,
-                                        const gfx::Point3F& p) {
-  GetParamSize(s, p.x());
-  GetParamSize(s, p.y());
-  GetParamSize(s, p.z());
-}
-
 void ParamTraits<gfx::Point3F>::Write(base::Pickle* m, const gfx::Point3F& p) {
   WriteParam(m, p.x());
   WriteParam(m, p.y());
@@ -98,11 +79,6 @@
   l->append(base::StringPrintf("(%f, %f, %f)", p.x(), p.y(), p.z()));
 }
 
-void ParamTraits<gfx::Size>::GetSize(base::PickleSizer* s,
-                                     const gfx::Size& p) {
-  s->AddBytes(sizeof(int) * 2);
-}
-
 void ParamTraits<gfx::Size>::Write(base::Pickle* m, const gfx::Size& p) {
   DCHECK_GE(p.width(), 0);
   DCHECK_GE(p.height(), 0);
@@ -128,11 +104,6 @@
   l->append(base::StringPrintf("(%d, %d)", p.width(), p.height()));
 }
 
-void ParamTraits<gfx::SizeF>::GetSize(base::PickleSizer* s,
-                                      const gfx::SizeF& p) {
-  s->AddBytes(sizeof(float) * 2);
-}
-
 void ParamTraits<gfx::SizeF>::Write(base::Pickle* m, const gfx::SizeF& p) {
   float values[2] = {p.width(), p.height()};
   m->WriteBytes(&values, sizeof(float) * 2);
@@ -154,11 +125,6 @@
   l->append(base::StringPrintf("(%f, %f)", p.width(), p.height()));
 }
 
-void ParamTraits<gfx::Vector2d>::GetSize(base::PickleSizer* s,
-                                         const gfx::Vector2d& p) {
-  s->AddBytes(sizeof(int) * 2);
-}
-
 void ParamTraits<gfx::Vector2d>::Write(base::Pickle* m,
                                        const gfx::Vector2d& p) {
   int values[2] = {p.x(), p.y()};
@@ -181,11 +147,6 @@
   l->append(base::StringPrintf("(%d, %d)", v.x(), v.y()));
 }
 
-void ParamTraits<gfx::Vector2dF>::GetSize(base::PickleSizer* s,
-                                          const gfx::Vector2dF& p) {
-  s->AddBytes(sizeof(float) * 2);
-}
-
 void ParamTraits<gfx::Vector2dF>::Write(base::Pickle* m,
                                         const gfx::Vector2dF& p) {
   float values[2] = {p.x(), p.y()};
@@ -208,11 +169,6 @@
   l->append(base::StringPrintf("(%f, %f)", v.x(), v.y()));
 }
 
-void ParamTraits<gfx::Rect>::GetSize(base::PickleSizer* s,
-                                     const gfx::Rect& p) {
-  s->AddBytes(sizeof(int) * 4);
-}
-
 void ParamTraits<gfx::Rect>::Write(base::Pickle* m, const gfx::Rect& p) {
   int values[4] = {p.x(), p.y(), p.width(), p.height()};
   m->WriteBytes(&values, sizeof(int) * 4);
@@ -236,11 +192,6 @@
                                p.height()));
 }
 
-void ParamTraits<gfx::RectF>::GetSize(base::PickleSizer* s,
-                                      const gfx::RectF& p) {
-  s->AddBytes(sizeof(float) * 4);
-}
-
 void ParamTraits<gfx::RectF>::Write(base::Pickle* m, const gfx::RectF& p) {
   float values[4] = {p.x(), p.y(), p.width(), p.height()};
   m->WriteBytes(&values, sizeof(float) * 4);
@@ -262,12 +213,6 @@
                                p.height()));
 }
 
-void ParamTraits<gfx::ScrollOffset>::GetSize(base::PickleSizer* s,
-                                             const gfx::ScrollOffset& p) {
-  GetParamSize(s, p.x());
-  GetParamSize(s, p.y());
-}
-
 void ParamTraits<gfx::ScrollOffset>::Write(base::Pickle* m,
                                            const param_type& p) {
   m->WriteDouble(p.x());
diff --git a/ui/gfx/ipc/geometry/gfx_param_traits.h b/ui/gfx/ipc/geometry/gfx_param_traits.h
index eda8790..b29aed5 100644
--- a/ui/gfx/ipc/geometry/gfx_param_traits.h
+++ b/ui/gfx/ipc/geometry/gfx_param_traits.h
@@ -29,7 +29,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::Point> {
   typedef gfx::Point param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -40,7 +39,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::PointF> {
   typedef gfx::PointF param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -51,7 +49,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::Point3F> {
   typedef gfx::Point3F param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -62,7 +59,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::Size> {
   typedef gfx::Size param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -73,7 +69,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::SizeF> {
   typedef gfx::SizeF param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -84,7 +79,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::Vector2d> {
   typedef gfx::Vector2d param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -95,7 +89,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::Vector2dF> {
   typedef gfx::Vector2dF param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -106,7 +99,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::Rect> {
   typedef gfx::Rect param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -117,7 +109,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::RectF> {
   typedef gfx::RectF param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -128,7 +119,6 @@
 template <>
 struct GFX_IPC_GEOMETRY_EXPORT ParamTraits<gfx::ScrollOffset> {
   typedef gfx::ScrollOffset param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ui/gfx/ipc/gfx_param_traits.cc b/ui/gfx/ipc/gfx_param_traits.cc
index f912fef..08e1a0a 100644
--- a/ui/gfx/ipc/gfx_param_traits.cc
+++ b/ui/gfx/ipc/gfx_param_traits.cc
@@ -18,12 +18,6 @@
 
 namespace IPC {
 
-void ParamTraits<gfx::Range>::GetSize(base::PickleSizer* s,
-                                      const gfx::Range& r) {
-  GetParamSize(s, r.start());
-  GetParamSize(s, r.end());
-}
-
 void ParamTraits<gfx::Range>::Write(base::Pickle* m, const gfx::Range& r) {
   m->WriteUInt32(r.start());
   m->WriteUInt32(r.end());
@@ -45,12 +39,6 @@
 }
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
-void ParamTraits<gfx::ScopedRefCountedIOSurfaceMachPort>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
-  MachPortMac mach_port_mac(p.get());
-  GetParamSize(s, mach_port_mac);
-}
-
 void ParamTraits<gfx::ScopedRefCountedIOSurfaceMachPort>::Write(
     base::Pickle* m,
     const param_type p) {
@@ -77,14 +65,6 @@
 }
 #endif  // defined(OS_MACOSX) && !defined(OS_IOS)
 
-void ParamTraits<gfx::SelectionBound>::GetSize(base::PickleSizer* s,
-                                               const param_type& p) {
-  GetParamSize(s, static_cast<uint32_t>(p.type()));
-  GetParamSize(s, p.edge_top());
-  GetParamSize(s, p.edge_bottom());
-  GetParamSize(s, p.visible());
-}
-
 void ParamTraits<gfx::SelectionBound>::Write(base::Pickle* m,
                                              const param_type& p) {
   WriteParam(m, static_cast<uint32_t>(p.type()));
@@ -128,13 +108,6 @@
 
 }  // namespace IPC
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef UI_GFX_IPC_GFX_PARAM_TRAITS_MACROS_H_
-#include "ui/gfx/ipc/gfx_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
diff --git a/ui/gfx/ipc/gfx_param_traits.h b/ui/gfx/ipc/gfx_param_traits.h
index 5681626..4f3a17c 100644
--- a/ui/gfx/ipc/gfx_param_traits.h
+++ b/ui/gfx/ipc/gfx_param_traits.h
@@ -27,7 +27,6 @@
 template <>
 struct GFX_IPC_EXPORT ParamTraits<gfx::Range> {
   typedef gfx::Range param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -39,7 +38,6 @@
 template <>
 struct GFX_IPC_EXPORT ParamTraits<gfx::ScopedRefCountedIOSurfaceMachPort> {
   typedef gfx::ScopedRefCountedIOSurfaceMachPort param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type p);
   // Note: Read() passes ownership of the Mach send right from the IPC message
   // to the ScopedRefCountedIOSurfaceMachPort. Therefore, Read() may only be
@@ -55,7 +53,6 @@
 template <>
 struct GFX_IPC_EXPORT ParamTraits<gfx::SelectionBound> {
   typedef gfx::SelectionBound param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ui/gfx/ipc/skia/gfx_skia_param_traits.cc b/ui/gfx/ipc/skia/gfx_skia_param_traits.cc
index 4a36137..1294c229 100644
--- a/ui/gfx/ipc/skia/gfx_skia_param_traits.cc
+++ b/ui/gfx/ipc/skia/gfx_skia_param_traits.cc
@@ -52,11 +52,6 @@
 
 namespace IPC {
 
-void ParamTraits<SkBitmap>::GetSize(base::PickleSizer* s, const param_type& p) {
-  s->AddData(sizeof(SkBitmap_Data));
-  s->AddData(static_cast<int>(p.getSize()));
-}
-
 void ParamTraits<SkBitmap>::Write(base::Pickle* m, const SkBitmap& p) {
   size_t fixed_size = sizeof(SkBitmap_Data);
   SkBitmap_Data bmp_data;
@@ -95,11 +90,6 @@
   l->append("<SkBitmap>");
 }
 
-void ParamTraits<gfx::Transform>::GetSize(base::PickleSizer* s,
-                                          const param_type& p) {
-  s->AddBytes(sizeof(SkMScalar) * 16);
-}
-
 void ParamTraits<gfx::Transform>::Write(base::Pickle* m, const param_type& p) {
 #ifdef SK_MSCALAR_IS_FLOAT
   float column_major_data[16];
diff --git a/ui/gfx/ipc/skia/gfx_skia_param_traits.h b/ui/gfx/ipc/skia/gfx_skia_param_traits.h
index 977470b..d3acc93 100644
--- a/ui/gfx/ipc/skia/gfx_skia_param_traits.h
+++ b/ui/gfx/ipc/skia/gfx_skia_param_traits.h
@@ -27,7 +27,6 @@
 template <>
 struct GFX_SKIA_IPC_EXPORT ParamTraits<SkBitmap> {
   using param_type = SkBitmap;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
@@ -38,7 +37,6 @@
 template <>
 struct GFX_SKIA_IPC_EXPORT ParamTraits<gfx::Transform> {
   using param_type = gfx::Transform;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/ui/gl/init/gl_factory_android.cc b/ui/gl/init/gl_factory_android.cc
index 29643e23..001b4a6 100644
--- a/ui/gl/init/gl_factory_android.cc
+++ b/ui/gl/init/gl_factory_android.cc
@@ -109,7 +109,8 @@
       return InitializeGLContext(new GLContextOSMesa(share_group),
                                  compatible_surface, attribs);
     default:
-      if (compatible_surface->GetHandle()) {
+      if (compatible_surface->GetHandle() ||
+          compatible_surface->IsSurfaceless()) {
         return InitializeGLContext(new GLContextEGL(share_group),
                                    compatible_surface, attribs);
       } else {
diff --git a/ui/latency/ipc/latency_info_param_traits.cc b/ui/latency/ipc/latency_info_param_traits.cc
index 87b9a89..9cd7403 100644
--- a/ui/latency/ipc/latency_info_param_traits.cc
+++ b/ui/latency/ipc/latency_info_param_traits.cc
@@ -5,13 +5,6 @@
 #include "ui/gfx/ipc/geometry/gfx_param_traits.h"
 #include "ui/latency/ipc/latency_info_param_traits_macros.h"
 
-// Generate param traits size methods.
-#include "ipc/param_traits_size_macros.h"
-namespace IPC {
-#undef UI_LATENCY_IPC_LATENCY_INFO_PARAM_TRAITS_MACROS_H_
-#include "ui/latency/ipc/latency_info_param_traits_macros.h"
-}
-
 // Generate param traits write methods.
 #include "ipc/param_traits_write_macros.h"
 namespace IPC {
@@ -38,17 +31,6 @@
 
 namespace IPC {
 
-void ParamTraits<ui::LatencyInfo>::GetSize(base::PickleSizer* s,
-                                           const param_type& p) {
-  GetParamSize(s, p.trace_name_);
-  GetParamSize(s, p.latency_components_);
-  GetParamSize(s, p.trace_id_);
-  GetParamSize(s, p.began_);
-  GetParamSize(s, p.terminated_);
-  GetParamSize(s, p.source_event_type_);
-  GetParamSize(s, p.expected_queueing_time_on_dispatch_);
-}
-
 void ParamTraits<ui::LatencyInfo>::Write(base::Pickle* m, const param_type& p) {
   WriteParam(m, p.trace_name_);
   WriteParam(m, p.latency_components_);
diff --git a/ui/latency/ipc/latency_info_param_traits.h b/ui/latency/ipc/latency_info_param_traits.h
index 0350057..9549ce17 100644
--- a/ui/latency/ipc/latency_info_param_traits.h
+++ b/ui/latency/ipc/latency_info_param_traits.h
@@ -12,7 +12,6 @@
 template <>
 struct ParamTraits<ui::LatencyInfo> {
   typedef ui::LatencyInfo param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/url/ipc/OWNERS b/url/ipc/OWNERS
new file mode 100644
index 0000000..2bf6612
--- /dev/null
+++ b/url/ipc/OWNERS
@@ -0,0 +1,2 @@
+per-file *_param_traits*.*=set noparent

+per-file *_param_traits*.*=file://ipc/SECURITY_OWNERS

diff --git a/url/ipc/url_param_traits.cc b/url/ipc/url_param_traits.cc
index b41e4716..e40ae8f 100644
--- a/url/ipc/url_param_traits.cc
+++ b/url/ipc/url_param_traits.cc
@@ -8,15 +8,6 @@
 
 namespace IPC {
 
-void ParamTraits<GURL>::GetSize(base::PickleSizer* s, const GURL& p) {
-  if (p.possibly_invalid_spec().length() > url::kMaxURLChars || !p.is_valid()) {
-    GetParamSize(s, std::string());
-    return;
-  }
-
-  GetParamSize(s, p.possibly_invalid_spec());
-}
-
 void ParamTraits<GURL>::Write(base::Pickle* m, const GURL& p) {
   if (p.possibly_invalid_spec().length() > url::kMaxURLChars) {
     m->WriteString(std::string());
diff --git a/url/ipc/url_param_traits.h b/url/ipc/url_param_traits.h
index 8db4029..f40150f1 100644
--- a/url/ipc/url_param_traits.h
+++ b/url/ipc/url_param_traits.h
@@ -14,7 +14,6 @@
 template <>
 struct URL_IPC_EXPORT ParamTraits<GURL> {
   typedef GURL param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,